file-tree-folder-list.tsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import classNames from 'classnames'
  2. import FileTreeDoc from './file-tree-doc'
  3. import FileTreeFolder from './file-tree-folder'
  4. import { fileCollator } from '../util/file-collator'
  5. import { Folder } from '../../../../../types/folder'
  6. import { Doc } from '../../../../../types/doc'
  7. import { FileRef } from '../../../../../types/file-ref'
  8. import { ConnectDropTarget } from 'react-dnd'
  9. type ExtendedFileRef = FileRef & { isFile: true }
  10. function FileTreeFolderList({
  11. folders,
  12. docs,
  13. files,
  14. classes = {},
  15. dropRef = null,
  16. children,
  17. dataTestId,
  18. }: {
  19. folders: Folder[]
  20. docs: Doc[]
  21. files: FileRef[]
  22. classes?: { root?: string }
  23. dropRef?: ConnectDropTarget | null
  24. children?: React.ReactNode
  25. dataTestId?: string
  26. }) {
  27. files = files.map(file => ({ ...file, isFile: true }))
  28. const docsAndFiles: (Doc | ExtendedFileRef)[] = [...docs, ...files]
  29. return (
  30. <ul
  31. className={classNames(
  32. 'list-unstyled',
  33. 'file-tree-folder-list',
  34. classes.root
  35. )}
  36. role="tree"
  37. ref={dropRef}
  38. data-testid={dataTestId}
  39. >
  40. <div className="file-tree-folder-list-inner">
  41. {folders.sort(compareFunction).map(folder => {
  42. return (
  43. <FileTreeFolder
  44. key={folder._id}
  45. name={folder.name}
  46. id={folder._id}
  47. folders={folder.folders}
  48. docs={folder.docs}
  49. files={folder.fileRefs}
  50. />
  51. )
  52. })}
  53. {docsAndFiles.sort(compareFunction).map(doc => {
  54. if ('isFile' in doc) {
  55. return (
  56. <FileTreeDoc
  57. key={doc._id}
  58. name={doc.name}
  59. id={doc._id}
  60. isFile={doc.isFile}
  61. isLinkedFile={
  62. doc.linkedFileData && !!doc.linkedFileData.provider
  63. }
  64. />
  65. )
  66. }
  67. return <FileTreeDoc key={doc._id} name={doc.name} id={doc._id} />
  68. })}
  69. {children}
  70. </div>
  71. </ul>
  72. )
  73. }
  74. function compareFunction(one: { name: string }, two: { name: string }) {
  75. return fileCollator.compare(one.name, two.name)
  76. }
  77. export default FileTreeFolderList