file-tree-folder-list.jsx 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. data-testid={dataTestId}
  23. >
  24. {folders.sort(compareFunction).map(folder => {
  25. return (
  26. <FileTreeFolder
  27. key={folder._id}
  28. name={folder.name}
  29. id={folder._id}
  30. folders={folder.folders}
  31. docs={folder.docs}
  32. files={folder.fileRefs}
  33. />
  34. )
  35. })}
  36. {docsAndFiles.sort(compareFunction).map(doc => {
  37. return (
  38. <FileTreeDoc
  39. key={doc._id}
  40. name={doc.name}
  41. id={doc._id}
  42. isFile={doc.isFile}
  43. isLinkedFile={doc.linkedFileData && !!doc.linkedFileData.provider}
  44. />
  45. )
  46. })}
  47. {children}
  48. </ul>
  49. )
  50. }
  51. FileTreeFolderList.propTypes = {
  52. folders: PropTypes.array.isRequired,
  53. docs: PropTypes.array.isRequired,
  54. files: PropTypes.array.isRequired,
  55. classes: PropTypes.exact({
  56. root: PropTypes.string,
  57. }),
  58. dropRef: PropTypes.func,
  59. children: PropTypes.node,
  60. dataTestId: PropTypes.string,
  61. }
  62. function compareFunction(one, two) {
  63. return fileCollator.compare(one.name, two.name)
  64. }
  65. export default FileTreeFolderList