file-tree-folder-list.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import PropTypes from 'prop-types'
  2. import classNames from 'classnames'
  3. import FileTreeDoc from './file-tree-doc'
  4. import FileTreeFolder from './file-tree-folder'
  5. import { fileCollator } from '../util/file-collator'
  6. function FileTreeFolderList({
  7. folders,
  8. docs,
  9. files,
  10. classes = {},
  11. dropRef = null,
  12. children,
  13. dataTestId,
  14. }) {
  15. files = files.map(file => ({ ...file, isFile: true }))
  16. const docsAndFiles = [...docs, ...files]
  17. return (
  18. <ul
  19. className={classNames('list-unstyled', classes.root)}
  20. role="tree"
  21. ref={dropRef}
  22. dnd-container="true"
  23. data-testid={dataTestId}
  24. >
  25. {folders.sort(compareFunction).map(folder => {
  26. return (
  27. <FileTreeFolder
  28. key={folder._id}
  29. name={folder.name}
  30. id={folder._id}
  31. folders={folder.folders}
  32. docs={folder.docs}
  33. files={folder.fileRefs}
  34. />
  35. )
  36. })}
  37. {docsAndFiles.sort(compareFunction).map(doc => {
  38. return (
  39. <FileTreeDoc
  40. key={doc._id}
  41. name={doc.name}
  42. id={doc._id}
  43. isFile={doc.isFile}
  44. isLinkedFile={doc.linkedFileData && !!doc.linkedFileData.provider}
  45. />
  46. )
  47. })}
  48. {children}
  49. </ul>
  50. )
  51. }
  52. FileTreeFolderList.propTypes = {
  53. folders: PropTypes.array.isRequired,
  54. docs: PropTypes.array.isRequired,
  55. files: PropTypes.array.isRequired,
  56. classes: PropTypes.exact({
  57. root: PropTypes.string,
  58. }),
  59. dropRef: PropTypes.func,
  60. children: PropTypes.node,
  61. dataTestId: PropTypes.string,
  62. }
  63. function compareFunction(one, two) {
  64. return fileCollator.compare(one.name, two.name)
  65. }
  66. export default FileTreeFolderList