index.coffee 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. document.head.insertAdjacentHTML('beforeend','<style type="text/tailwindcss" component="ModalWindow">'+stylFns['app/shared/ModalWindow/index.styl']+'</style>')
  2. module.exports =
  3. name: 'ModalWindow'
  4. render: (new Function '_ctx', '_cache', renderFns['app/shared/ModalWindow/index.pug'])()
  5. props:
  6. isVisible:
  7. type: Boolean
  8. default: false
  9. title:
  10. type: String
  11. default: ''
  12. content:
  13. type: String
  14. default: ''
  15. closeOnOverlay:
  16. type: Boolean
  17. default: true
  18. closeOnEsc:
  19. type: Boolean
  20. default: true
  21. showFooter:
  22. type: Boolean
  23. default: true
  24. contentClass:
  25. type: String
  26. default: ''
  27. data: ->
  28. titleId: "modal-title-#{Math.random().toString(36).substr(2, 9)}"
  29. watch:
  30. isVisible: (newVal) ->
  31. if newVal
  32. @showModal()
  33. else
  34. @hideModal()
  35. mounted: ->
  36. @setupEventListeners()
  37. beforeUnmount: ->
  38. @removeEventListeners()
  39. methods:
  40. showModal: ->
  41. document.body.style.overflow = 'hidden'
  42. document.addEventListener 'keydown', @handleKeydown
  43. hideModal: ->
  44. document.body.style.overflow = ''
  45. document.removeEventListener 'keydown', @handleKeydown
  46. setupEventListeners: ->
  47. @$watch 'isVisible', (newVal) ->
  48. if newVal then @showModal() else @hideModal()
  49. removeEventListeners: ->
  50. document.removeEventListener 'keydown', @handleKeydown
  51. closeModal: ->
  52. @$emit 'update:isVisible', false
  53. @$emit 'modal-closed'
  54. handleConfirm: ->
  55. @$emit 'modal-confirmed'
  56. @closeModal()
  57. handleKeydown: (event) ->
  58. if event.key == 'Escape' and @closeOnEsc
  59. @closeModal()
  60. if event.key == 'Tab'
  61. @trapFocus(event)
  62. trapFocus: (event) ->
  63. modal = @$el.querySelector('.modal-content')
  64. focusableElements = modal.querySelectorAll(
  65. 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
  66. )
  67. firstElement = focusableElements[0]
  68. lastElement = focusableElements[focusableElements.length - 1]
  69. if event.shiftKey
  70. if document.activeElement == firstElement
  71. event.preventDefault()
  72. lastElement.focus()
  73. else
  74. if document.activeElement == lastElement
  75. event.preventDefault()
  76. firstElement.focus()
  77. emits: ['update:isVisible', 'modal-closed', 'modal-confirmed']