(function(window) { window.ls.container.get("view").add({ selector: "data-ui-modal", controller: function(document, element, expression) { let name = element.dataset["name"] || null; let buttonText = expression.parse(element.dataset["buttonText"] || ""); let buttonClass = element.dataset["buttonClass"] || "button-class"; let buttonIcon = element.dataset["buttonIcon"] || null; let buttonEvent = element.dataset["buttonEvent"] || ""; let buttonAlias = element.dataset["buttonAlias"] || ""; let buttonElements = !buttonAlias ? [document.createElement("button")] : document.querySelectorAll(buttonAlias); let openEvent = element.dataset["openEvent"] || null; // When event triggers modal will open let background = document.getElementById("modal-bg"); if (!background) { background = document.createElement("div"); background.id = "modal-bg"; background.className = "modal-bg"; document.body.appendChild(background); background.addEventListener("click", function() { document.dispatchEvent( new CustomEvent("modal-close", { bubbles: false, cancelable: true }) ); }); } if (!buttonAlias) { buttonElements.forEach(button => { button.innerText = buttonText; button.className = buttonClass; button.type = "button"; if (buttonIcon) { let iconElement = document.createElement("i"); iconElement.className = buttonIcon; button.insertBefore(iconElement, button.firstChild); } }); } if (buttonEvent) { buttonElements.forEach(button => { button.addEventListener("click", function() { document.dispatchEvent( new CustomEvent(buttonEvent, { bubbles: false, cancelable: true }) ); }); }); } element.classList.add("modal"); if (!buttonAlias) { // Add to DOM when not alias buttonElements.forEach(button => { element.parentNode.insertBefore(button, element); }); } let open = function() { document.documentElement.classList.add("modal-open"); document.dispatchEvent( new CustomEvent("modal-open", { bubbles: false, cancelable: true }) ); element.classList.add("open"); element.classList.remove("close"); }; let close = function() { document.documentElement.classList.remove("modal-open"); element.classList.add("close"); element.classList.remove("open"); }; if (name) { document .querySelectorAll("[data-ui-modal-ref='" + name + "']") .forEach(function(elem) { elem.addEventListener("click", open); }); } if (openEvent) { document.addEventListener(openEvent, open); } buttonElements.forEach(button => { button.addEventListener("click", open); }); document.addEventListener("keydown", function(event) { if (event.which === 27) { close(); } }); element.addEventListener("blur", close); let closeButtons = element.querySelectorAll("[data-ui-modal-close]"); for (let i = 0; i < closeButtons.length; i++) { closeButtons[i].addEventListener("click", close); } document.addEventListener("modal-close", close); element.addEventListener("submit", close); } }); })(window);