Dashboard.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. import html from '../../core/html'
  2. import FileList from './FileList'
  3. import Tabs from './Tabs'
  4. import FileCard from './FileCard'
  5. import UploadBtn from './UploadBtn'
  6. import ProgressCircle from './ProgressCircle'
  7. import StatusBar from './StatusBar'
  8. import { isTouchDevice, toArray } from '../../core/Utils'
  9. import { closeIcon } from './icons'
  10. export default function Dashboard (props) {
  11. // http://dev.edenspiekermann.com/2016/02/11/introducing-accessible-modal-dialog
  12. // const uploadStartedFilesCount = uploadStartedFiles.length
  13. // const completeFilesCount = completeFiles.length
  14. // const inProgressFilesCount = inProgressFiles.length
  15. // const totalFileCount = Object.keys(files).length
  16. // const newFileCount = newFiles.length
  17. const handleInputChange = (ev) => {
  18. ev.preventDefault()
  19. const files = toArray(ev.target.files)
  20. files.forEach((file) => {
  21. props.addFile({
  22. source: props.id,
  23. name: file.name,
  24. type: file.type,
  25. data: file
  26. })
  27. })
  28. }
  29. // @TODO Exprimental, work in progress
  30. // no names, weird API, Chrome-only http://stackoverflow.com/a/22940020
  31. const handlePaste = (ev) => {
  32. ev.preventDefault()
  33. const files = toArray(ev.clipboardData.items)
  34. files.forEach((file) => {
  35. if (file.kind !== 'file') return
  36. const blob = file.getAsFile()
  37. // console.log(blob)
  38. // console.log(blob.size)
  39. props.log('File pasted')
  40. props.addFile({
  41. source: props.id,
  42. name: file.name,
  43. type: file.type,
  44. data: blob
  45. })
  46. })
  47. }
  48. return html`<div class="Uppy UppyTheme--default UppyDashboard
  49. ${isTouchDevice() ? 'Uppy--isTouchDevice' : ''}
  50. ${props.semiTransparent ? 'UppyDashboard--semiTransparent' : ''}
  51. ${!props.inline ? 'UppyDashboard--modal' : ''}"
  52. aria-hidden="${props.inline ? 'false' : props.modal.isHidden}"
  53. aria-label="${!props.inline
  54. ? props.i18n('dashboardWindowTitle')
  55. : props.i18n('dashboardTitle')}"
  56. role="dialog"
  57. onpaste=${handlePaste}>
  58. <div class="UppyDashboard-overlay"
  59. onclick=${props.hideModal}>
  60. <button class="UppyDashboard-close"
  61. aria-label="${props.i18n('closeModal')}"
  62. title="${props.i18n('closeModal')}"
  63. onclick=${props.hideModal}>${closeIcon()}</button>
  64. </div>
  65. <div class="UppyDashboard-inner" tabindex="0">
  66. <div class="UppyDashboard-innerWrap">
  67. ${Tabs({
  68. handleInputChange: handleInputChange,
  69. acquirers: props.acquirers,
  70. container: props.container,
  71. panelSelectorPrefix: props.panelSelectorPrefix,
  72. showPanel: props.showPanel,
  73. i18n: props.i18n
  74. })}
  75. ${FileCard({
  76. files: props.files,
  77. fileCardFor: props.fileCardFor,
  78. done: props.fileCardDone,
  79. metaFields: props.metaFields,
  80. log: props.log,
  81. i18n: props.i18n
  82. })}
  83. ${FileList({
  84. files: props.files,
  85. showFileCard: props.showFileCard,
  86. showProgressDetails: props.showProgressDetails,
  87. totalProgress: props.totalProgress,
  88. totalFileCount: props.totalFileCount,
  89. info: props.info,
  90. i18n: props.i18n,
  91. log: props.log,
  92. removeFile: props.removeFile,
  93. pauseAll: props.pauseAll,
  94. resumeAll: props.resumeAll,
  95. pauseUpload: props.pauseUpload,
  96. startUpload: props.startUpload
  97. })}
  98. <div class="UppyDashboard-actions">
  99. ${!props.autoProceed && props.newFiles.length > 0
  100. ? UploadBtn({
  101. i18n: props.i18n,
  102. startUpload: props.startUpload,
  103. newFileCount: props.newFiles.length
  104. })
  105. : null
  106. }
  107. ${false && props.uploadStartedFiles.length > 0
  108. ? ProgressCircle({
  109. totalProgress: props.totalProgress,
  110. isAllPaused: props.isAllPaused,
  111. isAllComplete: props.isAllComplete,
  112. pauseAll: props.pauseAll,
  113. resumeAll: props.resumeAll
  114. })
  115. : null
  116. }
  117. </div>
  118. ${props.uploadStartedFiles.length > 0 && !props.isAllComplete
  119. ? StatusBar({
  120. totalProgress: props.totalProgress,
  121. isAllComplete: props.isAllComplete,
  122. isAllPaused: props.isAllPaused,
  123. pauseAll: props.pauseAll,
  124. resumeAll: props.resumeAll,
  125. complete: props.completeFiles.length,
  126. inProgress: props.uploadStartedFiles.length,
  127. totalSpeed: props.totalSpeed,
  128. totalETA: props.totalETA
  129. })
  130. : null
  131. }
  132. <div class="UppyDashboardContent-panel"
  133. role="tabpanel"
  134. aria-hidden="${props.activeAcquirer ? props.activeAcquirer.isHidden : 'true'}">
  135. <div class="UppyDashboardContent-bar">
  136. <h2 class="UppyDashboardContent-title">
  137. ${props.i18n('importFrom')} ${props.activeAcquirer ? props.activeAcquirer.name : null}
  138. </h2>
  139. <button class="UppyDashboardContent-back"
  140. onclick=${props.hideAllPanels}>${props.i18n('done')}</button>
  141. </div>
  142. ${props.activeAcquirer ? props.activeAcquirer.render(props.state) : null}
  143. </div>
  144. </div>
  145. <div class="UppyDashboard-progressindicators">
  146. ${props.progressindicators.map((target) => {
  147. return target.render(props.state)
  148. })}
  149. </div>
  150. </div>
  151. </div>
  152. </div>`
  153. }