Modal.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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.container = document.body
  19. }
  20. prepareTarget (callerPlugin) {
  21. console.log(callerPlugin.type)
  22. if (callerPlugin.type !== 'selecter' && callerPlugin.type !== 'progress') {
  23. this.core.log('Error: Modal can only be used by plugins of type `selecter` or `progress`')
  24. return
  25. }
  26. const callerPluginName = callerPlugin.constructor.name
  27. // add tab panel
  28. const modalContent = document.querySelector('.UppyModal-content')
  29. const nodeForPlugin = document.createElement('div')
  30. modalContent.appendChild(nodeForPlugin)
  31. nodeForPlugin.outerHTML = `
  32. <div role="tabpanel"
  33. class="UppyModal-panel"
  34. id="${callerPluginName}">
  35. </div>
  36. `
  37. // add tab
  38. const modalTabs = document.querySelector('.UppyModal-tabList')
  39. const modalTab = document.createElement('div')
  40. modalTabs.appendChild(modalTab)
  41. modalTab.outerHTML = `
  42. <li><a role="tab"
  43. aria-controls="${callerPluginName}"
  44. class="UppyModal-tab"
  45. href="#${callerPluginName}">
  46. ${callerPluginName}
  47. </a></li>
  48. `
  49. this.initEvents()
  50. return document.querySelector(`#${callerPluginName}`)
  51. }
  52. render () {
  53. // http://dev.edenspiekermann.com/2016/02/11/introducing-accessible-modal-dialog
  54. return `
  55. <div class="UppyModal"
  56. aria-hidden="true"
  57. aria-labelledby="modalTitle"
  58. aria-describedby="modalDescription"
  59. role="dialog">
  60. <button data-modal-hide class="UppyModal-close" title="Close uploader modal">×</button>
  61. <ul role="tablist" class="UppyModal-tabList">
  62. <li><a role="tab" aria-controls="dragdrop" class="UppyModal-tab" href="#dragdrop">Dizzy</a></li>
  63. <li><a role="tab" aria-controls="dropbox" class="UppyModal-tab" href="#dropbox">Ninja</a></li>
  64. <li><a role="tab" aria-controls="instagram" class="UppyModal-tab" href="#instagram">Missy</a></li>
  65. </ul>
  66. <div class="UppyModal-content">
  67. <div role="tabpanel" class="UppyModal-panel" id="dragdrop">
  68. 123
  69. </div>
  70. <div role="tabpanel" class="UppyModal-panel" id="dropbox">
  71. 456
  72. </div>
  73. <div role="tabpanel" class="UppyModal-panel" id="instagram">
  74. 789
  75. </div>
  76. </div>
  77. </div>
  78. `
  79. }
  80. hideAllTabPanels () {
  81. this.tabPanels.forEach(tabPanel => {
  82. tabPanel.style.display = 'none'
  83. })
  84. }
  85. showTabPanel (id) {
  86. const tabPanel = document.querySelector(id)
  87. tabPanel.style.display = 'block'
  88. }
  89. initEvents () {
  90. const tabs = $$('.UppyModal-tab')
  91. this.tabPanels = []
  92. tabs.forEach(tab => {
  93. const tabId = tab.getAttribute('href')
  94. const tabPanel = document.querySelector(tabId)
  95. this.tabPanels.push(tabPanel)
  96. tab.addEventListener('click', event => {
  97. event.preventDefault()
  98. console.log(tabId)
  99. this.hideAllTabPanels()
  100. this.showTabPanel(tabId)
  101. })
  102. })
  103. this.hideAllTabPanels()
  104. }
  105. install () {
  106. const node = document.createElement('div')
  107. node.innerHTML = this.render()
  108. this.container.appendChild(node)
  109. this.initEvents()
  110. }
  111. }