document.head.insertAdjacentHTML('beforeend','')
module.exports =
name: 'ModalWindow'
render: (new Function '_ctx', '_cache', renderFns['app/shared/ModalWindow/index.pug'])()
props:
isVisible:
type: Boolean
default: false
title:
type: String
default: ''
content:
type: String
default: ''
closeOnOverlay:
type: Boolean
default: true
closeOnEsc:
type: Boolean
default: true
showFooter:
type: Boolean
default: true
contentClass:
type: String
default: ''
data: ->
titleId: "modal-title-#{Math.random().toString(36).substr(2, 9)}"
watch:
isVisible: (newVal) ->
if newVal
@showModal()
else
@hideModal()
mounted: ->
@setupEventListeners()
beforeUnmount: ->
@removeEventListeners()
methods:
showModal: ->
document.body.style.overflow = 'hidden'
document.addEventListener 'keydown', @handleKeydown
hideModal: ->
document.body.style.overflow = ''
document.removeEventListener 'keydown', @handleKeydown
setupEventListeners: ->
@$watch 'isVisible', (newVal) ->
if newVal then @showModal() else @hideModal()
removeEventListeners: ->
document.removeEventListener 'keydown', @handleKeydown
closeModal: ->
@$emit 'update:isVisible', false
@$emit 'modal-closed'
handleConfirm: ->
@$emit 'modal-confirmed'
@closeModal()
handleKeydown: (event) ->
if event.key == 'Escape' and @closeOnEsc
@closeModal()
if event.key == 'Tab'
@trapFocus(event)
trapFocus: (event) ->
modal = @$el.querySelector('.modal-content')
focusableElements = modal.querySelectorAll(
'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
)
firstElement = focusableElements[0]
lastElement = focusableElements[focusableElements.length - 1]
if event.shiftKey
if document.activeElement == firstElement
event.preventDefault()
lastElement.focus()
else
if document.activeElement == lastElement
event.preventDefault()
firstElement.focus()
emits: ['update:isVisible', 'modal-closed', 'modal-confirmed']