parent
577613132b
commit
d7b201c7f7
8 changed files with 73 additions and 68 deletions
@ -1,65 +1,69 @@ |
|||||||
export class Modal { |
export class Popup { |
||||||
constructor() { |
constructor() { |
||||||
this.triggerModal = this.triggerModal.bind(this); |
this.triggerPopup = this.triggerPopup.bind(this); |
||||||
this.onDOMLoaded = this.onDOMLoaded.bind(this); |
this.onDOMLoaded = this.onDOMLoaded.bind(this); |
||||||
this.handleCloseModal = this.handleCloseModal.bind(this); |
this.handleClosePopup = this.handleClosePopup.bind(this); |
||||||
this.handleKeydown = this.handleKeydown.bind(this); |
this.handleKeydown = this.handleKeydown.bind(this); |
||||||
} |
} |
||||||
|
|
||||||
/** |
|
||||||
* Triggers the modal on target elements |
|
||||||
* @param {Event} e |
|
||||||
*/ |
|
||||||
triggerModal(e) { |
|
||||||
const modalToShow = e?.target?.closest('[data-modal]')?.dataset?.modal || 'unknown-modal'; |
|
||||||
const modalEl = document.querySelector(`#${modalToShow}`); |
|
||||||
|
|
||||||
if (!modalEl) { |
/** |
||||||
return; |
* Triggers the popup on target elements |
||||||
} |
* @param {Event} e |
||||||
|
*/ |
||||||
|
triggerPopup(e) { |
||||||
|
const popupToShow = |
||||||
|
e?.target?.closest('[data-popup]')?.dataset?.popup || 'unknown-popup'; |
||||||
|
const popupEl = document.querySelector(`#${popupToShow}`); |
||||||
|
|
||||||
modalEl.classList.remove('hidden'); |
if (!popupEl) { |
||||||
const focusEl = modalEl.querySelector('[autofocus]'); |
return; |
||||||
if (focusEl) { |
|
||||||
focusEl.focus(); |
|
||||||
} |
|
||||||
} |
} |
||||||
|
|
||||||
handleCloseModal(e) { |
popupEl.classList.remove('hidden'); |
||||||
const target = e.target; |
popupEl.classList.add('flex'); |
||||||
const modalBody = target.closest('.modal-body'); |
const focusEl = popupEl.querySelector('[autofocus]'); |
||||||
const closestModal = target.closest('.modal'); |
if (focusEl) { |
||||||
|
focusEl.focus(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
if (modalBody) { |
handleClosePopup(e) { |
||||||
return; |
const target = e.target; |
||||||
} |
const popupBody = target.closest('.popup-body'); |
||||||
|
const closestPopup = target.closest('.popup'); |
||||||
|
|
||||||
if (closestModal) { |
if (popupBody) { |
||||||
closestModal.classList.add('hidden'); |
return; |
||||||
} |
|
||||||
} |
} |
||||||
|
|
||||||
handleKeydown(e) { |
if (closestPopup) { |
||||||
if (e.key !== 'Escape') { |
closestPopup.classList.add('hidden'); |
||||||
return; |
closestPopup.classList.remove('flex'); |
||||||
} |
|
||||||
|
|
||||||
const modal = document.querySelector('.modal:not(.hidden)'); |
|
||||||
if (modal) { |
|
||||||
modal.classList.add('hidden'); |
|
||||||
} |
|
||||||
} |
} |
||||||
|
} |
||||||
|
|
||||||
onDOMLoaded() { |
handleKeydown(e) { |
||||||
document.addEventListener('click', this.triggerModal); |
if (e.key !== 'Escape') { |
||||||
document.addEventListener('click', this.handleCloseModal); |
return; |
||||||
document.addEventListener('keydown', this.handleKeydown); |
|
||||||
} |
} |
||||||
|
|
||||||
init() { |
const popup = document.querySelector('.popup:not(.hidden)'); |
||||||
window.addEventListener('DOMContentLoaded', this.onDOMLoaded); |
if (popup) { |
||||||
|
popup.classList.add('hidden'); |
||||||
|
popup.classList.remove('flex'); |
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
const modalRef = new Modal(); |
onDOMLoaded() { |
||||||
modalRef.init();
|
document.addEventListener('click', this.triggerPopup); |
||||||
|
document.addEventListener('click', this.handleClosePopup); |
||||||
|
document.addEventListener('keydown', this.handleKeydown); |
||||||
|
} |
||||||
|
|
||||||
|
init() { |
||||||
|
window.addEventListener('DOMContentLoaded', this.onDOMLoaded); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
const popupRef = new Popup(); |
||||||
|
popupRef.init(); |
||||||
|
Loading…
Reference in new issue