diff --git a/js/src/dropdown.js b/js/src/dropdown.js index 96094a3e6577..7cf406c58d21 100644 --- a/js/src/dropdown.js +++ b/js/src/dropdown.js @@ -10,6 +10,8 @@ import BaseComponent from './base-component.js' import EventHandler from './dom/event-handler.js' import Manipulator from './dom/manipulator.js' import SelectorEngine from './dom/selector-engine.js' +import Modal from "./modal.js" + import { defineJQueryPlugin, execute, @@ -442,8 +444,10 @@ EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataAp EventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus) EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus) EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) { + Modal.disableToggleEvent() event.preventDefault() Dropdown.getOrCreateInstance(this).toggle() + Modal.enableToggleEvent() }) /** diff --git a/js/src/modal.js b/js/src/modal.js index dd61649ecce0..0093f647b51f 100644 --- a/js/src/modal.js +++ b/js/src/modal.js @@ -330,6 +330,43 @@ class Modal extends BaseComponent { data[config](relatedTarget) }) } + + static disableToggleEvent() { + EventHandler.off(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE) + } + + static enableToggleEvent() { + EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) { + const target = SelectorEngine.getElementFromSelector(this) + + if (['A', 'AREA'].includes(this.tagName)) { + event.preventDefault() + } + + EventHandler.one(target, EVENT_SHOW, showEvent => { + if (showEvent.defaultPrevented) { + // only register focus restorer if modal will actually get shown + return + } + + EventHandler.one(target, EVENT_HIDDEN, () => { + if (isVisible(this)) { + this.focus() + } + }) + }) + + // avoid conflict when clicking modal toggler while another one is open + const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR) + if (alreadyOpen) { + Modal.getInstance(alreadyOpen).hide() + } + + const data = Modal.getOrCreateInstance(target) + + data.toggle(this) + }) + } } /**