file-tree-folder-list.js 1.8 KB

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