Dashboard.js 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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. module.exports = function Dashboard (props) {
  14. // if (!props.inline && props.modal.isHidden) {
  15. // return <span />
  16. // }
  17. const noFiles = props.totalFileCount === 0
  18. const dashboardClassName = classNames(
  19. { 'uppy-Root': props.isTargetDOMEl },
  20. 'uppy-Dashboard',
  21. { 'Uppy--isTouchDevice': isTouchDevice() },
  22. { 'uppy-Dashboard--animateOpenClose': props.animateOpenClose },
  23. { 'uppy-Dashboard--isClosing': props.isClosing },
  24. { 'uppy-Dashboard--modal': !props.inline },
  25. // { 'uppy-Dashboard--wide': props.isWide },
  26. { 'uppy-size--md': props.containerWidth > 576 },
  27. { 'uppy-size--lg': props.containerWidth > 700 },
  28. { 'uppy-Dashboard--isAddFilesPanelVisible': props.showAddFilesPanel }
  29. )
  30. return (
  31. <div class={dashboardClassName}
  32. aria-hidden={props.inline ? 'false' : props.modal.isHidden}
  33. aria-label={!props.inline ? props.i18n('dashboardWindowTitle') : props.i18n('dashboardTitle')}
  34. onpaste={props.handlePaste}>
  35. <div class="uppy-Dashboard-overlay" tabindex={-1} onclick={props.handleClickOutside} />
  36. <div class="uppy-Dashboard-inner"
  37. aria-modal={!props.inline && 'true'}
  38. role={!props.inline && 'dialog'}
  39. style={{
  40. width: props.inline && props.width ? props.width : '',
  41. height: props.inline && props.height ? props.height : ''
  42. }}>
  43. <button class="uppy-Dashboard-close"
  44. type="button"
  45. aria-label={props.i18n('closeModal')}
  46. title={props.i18n('closeModal')}
  47. onclick={props.closeModal}>
  48. <span aria-hidden="true">&times;</span>
  49. </button>
  50. <div class="uppy-Dashboard-innerWrap">
  51. { !noFiles && <PanelTopBar {...props} /> }
  52. { noFiles ? <AddFiles {...props} /> : <FileList {...props} /> }
  53. <PreactCSSTransitionGroup
  54. transitionName="uppy-transition-slideDownUp"
  55. transitionEnterTimeout={250}
  56. transitionLeaveTimeout={250}>
  57. { props.showAddFilesPanel ? <AddFilesPanel key="AddFilesPanel" {...props} /> : null }
  58. </PreactCSSTransitionGroup>
  59. <PreactCSSTransitionGroup
  60. transitionName="uppy-transition-slideDownUp"
  61. transitionEnterTimeout={250}
  62. transitionLeaveTimeout={250}>
  63. { props.fileCardFor ? <FileCard key="FileCard" {...props} /> : null }
  64. </PreactCSSTransitionGroup>
  65. <PreactCSSTransitionGroup
  66. transitionName="uppy-transition-slideDownUp"
  67. transitionEnterTimeout={250}
  68. transitionLeaveTimeout={250}>
  69. { props.activePanel ? <PanelContent key="PanelContent" {...props} /> : null }
  70. </PreactCSSTransitionGroup>
  71. <div class="uppy-Dashboard-progressindicators">
  72. {props.progressindicators.map((target) => {
  73. return props.getPlugin(target.id).render(props.state)
  74. })}
  75. </div>
  76. </div>
  77. </div>
  78. </div>
  79. )
  80. }