file-tree-folder-list.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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. }) {
  14. files = files.map(file => ({ ...file, isFile: true }))
  15. const docsAndFiles = [...docs, ...files]
  16. return (
  17. <ul
  18. className={classNames('list-unstyled', classes.root)}
  19. role="tree"
  20. ref={dropRef}
  21. dnd-container="true"
  22. >
  23. {folders.sort(compareFunction).map(folder => {
  24. return (
  25. <FileTreeFolder
  26. key={folder._id}
  27. name={folder.name}
  28. id={folder._id}
  29. folders={folder.folders}
  30. docs={folder.docs}
  31. files={folder.fileRefs}
  32. />
  33. )
  34. })}
  35. {docsAndFiles.sort(compareFunction).map(doc => {
  36. return (
  37. <FileTreeDoc
  38. key={doc._id}
  39. name={doc.name}
  40. id={doc._id}
  41. isFile={doc.isFile}
  42. isLinkedFile={doc.linkedFileData && !!doc.linkedFileData.provider}
  43. />
  44. )
  45. })}
  46. {children}
  47. </ul>
  48. )
  49. }
  50. FileTreeFolderList.propTypes = {
  51. folders: PropTypes.array.isRequired,
  52. docs: PropTypes.array.isRequired,
  53. files: PropTypes.array.isRequired,
  54. classes: PropTypes.exact({
  55. root: PropTypes.string,
  56. }),
  57. dropRef: PropTypes.func,
  58. children: PropTypes.node,
  59. }
  60. function compareFunction(one, two) {
  61. return fileCollator.compare(one.name, two.name)
  62. }
  63. export default FileTreeFolderList