Dashboard.js 5.8 KB

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