/** * BSDialog4 * @version v0.1.1.024 (2023/08/03 0013) */ var BSDialog = { Create: async function (id, title, url, size) { var a = this; a.id = id; a.pfx = "bsdia4_"; a.body = document.getElementsByTagName("body")[0]; a.addBackdrop(); a.addModal(id, title, size); if (a.isNullOrWhitespace(url)) { a.UpdateBody(id, ""); } else if (url.startsWith("http://") || url.startsWith("https://") || url.startsWith("/")) { a.UpdateBodyRemote(id, url); } else { await a.UpdateBody(id, url); } }, Clear: function () { this.body.querySelectorAll(".modal").forEach(function(e) { e.parentNode.removeChild(e); }); this.removeBackdrop(); }, Close: function (id) { let modal = this.Find(id); if (modal === null) { return; } modal.Modal.forEach(function(e) { e.parentNode.removeChild(e); }); modal = this.Find(id); if (modal !== null) { return; } this.removeBackdrop(); }, UpdateTitle: function (id, title) { let modal = this.Find(id); if (modal === null) { return; } modal.Title.forEach(function(e) { e.innerHTML = title; }); }, UpdateSize: function (id, size) { let modal = this.Find(id); if (modal === null) { return; } modal.Modal.forEach(function(e) { e.classList.remove("modal-sm"); e.classList.remove("modal-md"); e.classList.remove("modal-lg"); e.classList.remove("modal-xl"); e.classList.add("modal-" + size); }); }, UpdateBody: function (id, content) { var a = this; let modal = a.Find(id); if (modal === null) { return; } modal.Body.forEach(function(e) { a.html(e, content); }); }, UpdateBodyRemote: async function (id, url) { var a = this; if (!a.Exists(id)) { return; } await fetch(url, { cache: 'no-cache', credentials: 'same-origin' }).then(data => data.text()).then(data => { a.UpdateBody(id, data); }).catch((error) => { a.UpdateBody(id, "Error: " + error); }); }, UpdateFooter: function (id, content) { var a = this; let modal = a.Find(id); if (modal === null) { return; } modal.Footer.forEach(function(e) { a.html(e, content); }); }, Exists: function (id) { return (this.Find(id) !== null); }, Find: function (id) { let modal = this.body.querySelectorAll("#" + this.pfx + id + ".modal"); if (!modal) { return null; } if (modal.length <= 0) { return null; } return { Title: modal[0].querySelectorAll(".modal-title"), Body: modal[0].querySelectorAll(".modal-body"), Footer: modal[0].querySelectorAll(".modal-footer"), Close: modal[0].querySelectorAll("[data-dismiss='modal']"), Modal: modal }; }, ShowToast: function (id, title, message, size) { this.Create(id, title, null, size); this.UpdateBody(id, message); }, addBackdrop: function () { let a = this; // don't allow duplicates if (a.body.querySelectorAll(".modal-backdrop").length > 0) { return; } a.appendHtml(a.body, ''); // lock background a.body.classList.add("modal-open"); a.body.style.overflow = "hidden"; // close let backdrop = a.body.querySelectorAll(".modal-backdrop")[0]; backdrop.addEventListener("click", function(e){ e.stopPropagation(); e.preventDefault(); a.Clear(); }); }, addModal: function (id, title, size) { var a = this; // don't allow duplicates let modal = a.Find(id); if (modal !== null) { return; } let html = ""; html += ''; a.appendHtml(a.body, html); modal = a.Find(id); if (modal === null) { return; } modal.Close.forEach(function(e){ e.addEventListener("click", function(e){ e.stopPropagation(); e.preventDefault(); a.Close(id); }); e.addEventListener("auxclick", function(e){ e.stopPropagation(); e.preventDefault(); if (e.button === 1) { a.toggleSize(); } }); }); }, appendHtml: function (el, html) { let node = document.createElement('template'); node.innerHTML = html; node = node.content.firstChild; el.appendChild(node); }, html: function (el, newHtml) { /// todo: replace with pure JS if (jQuery) { jQuery(el).html(newHtml); } else { el.innerHTML = newHtml; } }, isNullOrWhitespace: function(e) { if (typeof (e) == "undefined") { return true; } if (e == null) { return true; } if (e == false) { return true; } return (e.trim().length <= 0); }, removeBackdrop: function () { if (this.body.querySelectorAll(".modal-backdrop").length <= 0) { return; } let backdrop = this.body.querySelectorAll(".modal-backdrop")[0]; backdrop.parentNode.removeChild(backdrop); // unlock background this.body.classList.remove("modal-open"); this.body.style.overflow = null; }, toggleSize: function () { var a = this; let modal = a.Find(a.id); if (modal === null) { return; } let modalDialog = modal.Modal[0].querySelectorAll(".modal-dialog")[0]; if (modalDialog.classList.contains('modal-sm')) { modalDialog.classList.remove("modal-sm"); modalDialog.classList.add("modal-md"); } else if (modalDialog.classList.contains('modal-md')) { modalDialog.classList.remove("modal-md"); modalDialog.classList.add("modal-lg"); } else if (modalDialog.classList.contains('modal-lg')) { modalDialog.classList.remove("modal-lg"); modalDialog.classList.add("modal-xl"); } else if (modalDialog.classList.contains('modal-xl')) { modalDialog.classList.remove("modal-xl"); modalDialog.classList.add("modal-sm"); } else { modalDialog.classList.remove("modal-sm"); modalDialog.classList.remove("modal-md"); modalDialog.classList.remove("modal-lg"); modalDialog.classList.remove("modal-xl"); modalDialog.classList.add("modal-md"); } } };