file-tree-folder-list.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import React from 'react'
  2. import PropTypes from 'prop-types'
  3. import classNames from 'classnames'
  4. import FileTreeDoc from './file-tree-doc'
  5. import FileTreeFolder from './file-tree-folder'
  6. function FileTreeFolderList({
  7. folders,
  8. docs,
  9. files,
  10. classes = {},
  11. dropRef = null,
  12. children
  13. }) {
  14. const docsAndFiles = [...docs, ...files]
  15. return (
  16. <ul
  17. className={classNames('list-unstyled', classes.root)}
  18. role="tree"
  19. ref={dropRef}
  20. dnd-container="true"
  21. >
  22. {folders.sort(compareFunction).map(folder => {
  23. return (
  24. <FileTreeFolder
  25. key={folder._id}
  26. name={folder.name}
  27. id={folder._id}
  28. folders={folder.folders}
  29. docs={folder.docs}
  30. files={folder.fileRefs}
  31. />
  32. )
  33. })}
  34. {docsAndFiles.sort(compareFunction).map(doc => {
  35. return (
  36. <FileTreeDoc
  37. key={doc._id}
  38. name={doc.name}
  39. id={doc._id}
  40. isLinkedFile={doc.linkedFileData && !!doc.linkedFileData.provider}
  41. />
  42. )
  43. })}
  44. {children}
  45. </ul>
  46. )
  47. }
  48. FileTreeFolderList.propTypes = {
  49. folders: PropTypes.array.isRequired,
  50. docs: PropTypes.array.isRequired,
  51. files: PropTypes.array.isRequired,
  52. classes: PropTypes.exact({
  53. root: PropTypes.string
  54. }),
  55. dropRef: PropTypes.func,
  56. children: PropTypes.node
  57. }
  58. // the collator used to sort files docs and folders in the tree. Use english as
  59. // base language for consistency. Options used:
  60. // numeric: true so 10 comes after 2
  61. // sensitivity: 'variant' so case and accent are not equal
  62. // caseFirst: 'upper' so upper-case letters come first
  63. const collator = new Intl.Collator('en', {
  64. numeric: true,
  65. sensitivity: 'variant',
  66. caseFirst: 'upper'
  67. })
  68. function compareFunction(one, two) {
  69. return collator.compare(one.name, two.name)
  70. }
  71. export default FileTreeFolderList