Modal.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import Plugin from './Plugin'
  2. // import Utils from '../core/Utils'
  3. function $$ (selector, context) {
  4. return Array.prototype.slice.call((context || document).querySelectorAll(selector) || [])
  5. }
  6. /**
  7. * Modal
  8. *
  9. */
  10. export default class Modal extends Plugin {
  11. constructor (core, opts) {
  12. super(core, opts)
  13. this.type = 'view'
  14. // set default options
  15. const defaultOptions = {}
  16. // merge default options with the ones set by user
  17. this.opts = Object.assign({}, defaultOptions, opts)
  18. this.targets = {}
  19. this.targets.spinner = '.UppyDragDrop-One-Spinner'
  20. this.container = document.body
  21. }
  22. prepareTarget (callerPlugin) {
  23. console.log(callerPlugin.type)
  24. if (callerPlugin.type !== 'selecter' || callerPlugin.type !== 'progress') {
  25. this.core.log('Error: Modal can only be used by plugins of type `selecter` or `progress`')
  26. return
  27. }
  28. const callerPluginName = callerPlugin.constructor.name
  29. // add tab panel
  30. const modalContent = document.querySelector('.UppyModal-content')
  31. const nodeForPlugin = document.createElement('div')
  32. modalContent.appendChild(nodeForPlugin)
  33. nodeForPlugin.outerHTML = `
  34. <div role="tabpanel"
  35. class="UppyModal-panel"
  36. id="${callerPluginName}">
  37. </div>
  38. `
  39. // add tab
  40. const modalTabs = document.querySelector('.UppyModal-tabList')
  41. const modalTab = document.createElement('div')
  42. modalTabs.appendChild(modalTab)
  43. modalTab.outerHTML = `
  44. <li><a role="tab"
  45. aria-controls="${callerPluginName}"
  46. class="UppyModal-tab"
  47. href="#${callerPluginName}">
  48. ${callerPluginName}
  49. </a></li>
  50. `
  51. this.initEvents()
  52. return document.querySelector(`#${callerPluginName}`)
  53. }
  54. render () {
  55. // http://dev.edenspiekermann.com/2016/02/11/introducing-accessible-modal-dialog
  56. return `
  57. <div class="UppyModal"
  58. aria-hidden="true"
  59. aria-labelledby="modalTitle"
  60. aria-describedby="modalDescription"
  61. role="dialog">
  62. <button data-modal-hide class="UppyModal-close" title="Close uploader modal">×</button>
  63. <ul role="tablist" class="UppyModal-tabList">
  64. <li><a role="tab" aria-controls="dragdrop" class="UppyModal-tab" href="#dragdrop">Dizzy</a></li>
  65. <li><a role="tab" aria-controls="dropbox" class="UppyModal-tab" href="#dropbox">Ninja</a></li>
  66. <li><a role="tab" aria-controls="instagram" class="UppyModal-tab" href="#instagram">Missy</a></li>
  67. </ul>
  68. <div class="UppyModal-content">
  69. <div role="tabpanel" class="UppyModal-panel" id="dragdrop">
  70. 123
  71. </div>
  72. <div role="tabpanel" class="UppyModal-panel" id="dropbox">
  73. 456
  74. </div>
  75. <div role="tabpanel" class="UppyModal-panel" id="instagram">
  76. 789
  77. </div>
  78. </div>
  79. </div>
  80. `
  81. }
  82. hideAllTabPanels () {
  83. this.tabPanels.forEach(tabPanel => {
  84. tabPanel.style.display = 'none'
  85. })
  86. }
  87. showTabPanel (id) {
  88. const tabPanel = document.querySelector(id)
  89. tabPanel.style.display = 'block'
  90. }
  91. initEvents () {
  92. const tabs = $$('.UppyModal-tab')
  93. this.tabPanels = []
  94. tabs.forEach(tab => {
  95. const tabId = tab.getAttribute('href')
  96. const tabPanel = document.querySelector(tabId)
  97. this.tabPanels.push(tabPanel)
  98. tab.addEventListener('click', event => {
  99. event.preventDefault()
  100. console.log(tabId)
  101. this.hideAllTabPanels()
  102. this.showTabPanel(tabId)
  103. })
  104. })
  105. this.hideAllTabPanels()
  106. }
  107. install () {
  108. const node = document.createElement('div')
  109. node.innerHTML = this.render()
  110. this.container.appendChild(node)
  111. this.initEvents()
  112. }
  113. }