file-tree-folder-list.js 1.8 KB

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