Dashboard.js 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. const FileList = require('./FileList')
  2. const AddFiles = require('./AddFiles')
  3. const AddFilesPanel = require('./AddFilesPanel')
  4. const PanelContent = require('./PanelContent')
  5. const PanelTopBar = require('./PanelTopBar')
  6. const FileCard = require('./FileCard')
  7. const classNames = require('classnames')
  8. const isTouchDevice = require('@uppy/utils/lib/isTouchDevice')
  9. const { h } = require('preact')
  10. const PreactCSSTransitionGroup = require('preact-css-transition-group')
  11. // http://dev.edenspiekermann.com/2016/02/11/introducing-accessible-modal-dialog
  12. // https://github.com/ghosh/micromodal
  13. function TransitionWrapper (props) {
  14. return (
  15. <PreactCSSTransitionGroup
  16. transitionName="uppy-transition-slideDownUp"
  17. transitionEnterTimeout={250}
  18. transitionLeaveTimeout={250}>
  19. {props.children}
  20. </PreactCSSTransitionGroup>
  21. )
  22. }
  23. module.exports = function Dashboard (props) {
  24. const noFiles = props.totalFileCount === 0
  25. const dashboardClassName = classNames(
  26. { 'uppy-Root': props.isTargetDOMEl },
  27. 'uppy-Dashboard',
  28. { 'Uppy--isTouchDevice': isTouchDevice() },
  29. { 'uppy-Dashboard--animateOpenClose': props.animateOpenClose },
  30. { 'uppy-Dashboard--isClosing': props.isClosing },
  31. { 'uppy-Dashboard--modal': !props.inline },
  32. { 'uppy-size--md': props.containerWidth > 576 },
  33. { 'uppy-size--lg': props.containerWidth > 700 },
  34. { 'uppy-Dashboard--isAddFilesPanelVisible': props.showAddFilesPanel }
  35. )
  36. return (
  37. <div class={dashboardClassName}
  38. aria-hidden={props.inline ? 'false' : props.isHidden}
  39. aria-label={!props.inline ? props.i18n('dashboardWindowTitle') : props.i18n('dashboardTitle')}
  40. onpaste={props.handlePaste}>
  41. <div class="uppy-Dashboard-overlay" tabindex={-1} onclick={props.handleClickOutside} />
  42. <div class="uppy-Dashboard-inner"
  43. aria-modal={!props.inline && 'true'}
  44. role={!props.inline && 'dialog'}
  45. style={{
  46. width: props.inline && props.width ? props.width : '',
  47. height: props.inline && props.height ? props.height : ''
  48. }}>
  49. <button class="uppy-Dashboard-close"
  50. type="button"
  51. aria-label={props.i18n('closeModal')}
  52. title={props.i18n('closeModal')}
  53. onclick={props.closeModal}>
  54. <span aria-hidden="true">&times;</span>
  55. </button>
  56. <div class="uppy-Dashboard-innerWrap">
  57. { (!noFiles && props.showSelectedFiles) && <PanelTopBar {...props} /> }
  58. { props.showSelectedFiles ? (
  59. noFiles ? <AddFiles {...props} /> : <FileList {...props} />
  60. ) : (
  61. <AddFiles {...props} />
  62. )}
  63. <TransitionWrapper>
  64. { props.showAddFilesPanel ? <AddFilesPanel key="AddFilesPanel" {...props} /> : null }
  65. </TransitionWrapper>
  66. <TransitionWrapper>
  67. { props.fileCardFor ? <FileCard key="FileCard" {...props} /> : null }
  68. </TransitionWrapper>
  69. <TransitionWrapper>
  70. { props.activePickerPanel ? <PanelContent key="PanelContent" {...props} /> : null }
  71. </TransitionWrapper>
  72. <div class="uppy-Dashboard-progressindicators">
  73. {props.progressindicators.map((target) => {
  74. return props.getPlugin(target.id).render(props.state)
  75. })}
  76. </div>
  77. </div>
  78. </div>
  79. </div>
  80. )
  81. }