Sha256: dc7fad1cb164fdb3b327405cdda849078470b6bb2a167462fdcb37139f22cef5
Contents?: true
Size: 1.83 KB
Versions: 2
Compression:
Stored size: 1.83 KB
Contents
/* global HTMLInputElement */ import { Controller } from '@hotwired/stimulus' import { createPopper } from '@popperjs/core' export default class extends Controller { static get targets () { return ['popup', 'button'] } static get values () { return { id: String } } connect () { // Clicked outside popup document.addEventListener('click', (event) => { this.handleOutsideClick(event) }) } handleOutsideClick (event) { const inPopup = event.target.closest('[data-popup-target="popup"]') !== null const inButton = event.target.closest('[data-popup-target="button"]') !== null const openPopup = document.querySelector('[data-popup-target="popup"]:not(.closed)') if (!inButton && !inPopup && openPopup) { this.closePopup(openPopup) } } open (event) { const button = event.target.closest('[data-popup-target="button"]') const popup = this.popupById(button.dataset.popupId) const passThru = button.dataset.popupPassThru // Open the popup createPopper(button, popup) this.openPopup(popup) if (passThru) { // Pass click event to an element inside the popup const passThruElement = popup.querySelector(passThru) passThruElement.click() // Focus and select value if it's an input element if (passThruElement instanceof HTMLInputElement) { passThruElement.focus() passThruElement.select() } } } close (event) { const button = event.target.closest('[data-popup-target="button"]') const popup = this.popupById(button.dataset.popupId) this.closePopup(popup) } popupById (id) { return this.popupTargets.find((popup) => { return popup.dataset.popupId === id }) } openPopup (popup) { popup.classList.remove('closed') } closePopup (popup) { popup.classList.add('closed') } }
Version data entries
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
headmin-0.4.2 | app/assets/javascripts/headmin/controllers/popup_controller.js |
headmin-0.4.1 | app/assets/javascripts/headmin/controllers/popup_controller.js |