Files
2026-07-17 12:57:18 +03:00

148 lines
4.4 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Модальное окно «Проверка БД» в стиле киоска (как привязка терминала):
* тёмная рамка, iframe с /db_check?embed=1.
*/
(function () {
const LOG = "[WespKioskDbCheck]";
const MENU_OVERLAY_ID = "wespKioskMenuOverlay";
function createModal() {
const modal = document.createElement("div");
modal.id = "kioskDbCheckModal";
modal.setAttribute("aria-hidden", "true");
modal.style.cssText =
"display:none;position:fixed;inset:0;background:rgba(0,0,0,.55);z-index:5000;" +
"align-items:center;justify-content:center;padding:12px;box-sizing:border-box;";
modal.innerHTML = `
<div class="kiosk-db-check-panel" style="
background:#1f1f1f;
color:#fff;
border-radius:14px;
border:1px solid #2f2f2f;
box-shadow:0 0 20px rgba(0,0,0,.45);
width:min(920px,100%);
max-height:min(92vh,900px);
display:flex;
flex-direction:column;
overflow:hidden;
">
<div style="
display:flex;
align-items:center;
justify-content:space-between;
gap:12px;
padding:14px 16px;
border-bottom:1px solid #2f2f2f;
flex-shrink:0;
">
<h2 style="margin:0;font-size:1.125rem;font-weight:600;line-height:1.3">Проверка баз данных</h2>
<button type="button" id="kioskDbCheckClose" style="
padding:10px 16px;
border-radius:8px;
border:1px solid #7a7a7a;
background:#3a3a3a;
color:#fff;
cursor:pointer;
font-size:15px;
flex-shrink:0;
">Закрыть</button>
</div>
<iframe
id="kioskDbCheckFrame"
title="Проверка баз данных"
style="border:0;width:100%;flex:1;min-height:min(70vh,560px);background:#f9fafb;"
></iframe>
</div>
`;
document.body.appendChild(modal);
const iframe = modal.querySelector("#kioskDbCheckFrame");
const closeBtn = modal.querySelector("#kioskDbCheckClose");
const panel = modal.querySelector(".kiosk-db-check-panel");
function closeModal() {
modal.style.display = "none";
modal.setAttribute("aria-hidden", "true");
try {
iframe.src = "about:blank";
} catch (e) {
console.warn(LOG, "iframe reset", e);
}
document.removeEventListener("keydown", onKey);
}
function onKey(e) {
if (e.key === "Escape") {
e.preventDefault();
closeModal();
}
}
function openModal() {
const menu = document.getElementById(MENU_OVERLAY_ID);
if (menu) menu.style.display = "none";
iframe.src = "/db_check?embed=1";
modal.style.display = "flex";
modal.setAttribute("aria-hidden", "false");
document.addEventListener("keydown", onKey);
}
closeBtn.addEventListener("click", closeModal);
modal.addEventListener("click", function (e) {
if (e.target === modal) closeModal();
});
if (panel) {
panel.addEventListener("click", function (e) {
e.stopPropagation();
});
}
return { modal, openModal, closeModal };
}
function setup(opts) {
const options = opts || {};
const linkSel = options.menuLinkSelector || "#dbCheckLink";
if (typeof window.WespKioskMenu !== "undefined" && typeof window.WespKioskMenu.ensureOverlay === "function") {
window.WespKioskMenu.ensureOverlay();
}
const link = document.querySelector(linkSel);
if (!link) {
console.warn(LOG, "ссылка меню не найдена после ensureOverlay:", linkSel);
return {};
}
let api;
if (!window.__wespKioskDbCheckApi) {
api = createModal();
window.__wespKioskDbCheckApi = api;
} else {
api = window.__wespKioskDbCheckApi;
}
if (link.dataset.wespDbCheckBound === "1") {
return { openModal: api.openModal, closeModal: api.closeModal };
}
link.dataset.wespDbCheckBound = "1";
link.addEventListener(
"click",
function (e) {
if (e.ctrlKey || e.metaKey || e.shiftKey || e.button !== 0) return;
if (window.frameElement) return;
e.preventDefault();
e.stopPropagation();
api.openModal();
},
true
);
return { openModal: api.openModal, closeModal: api.closeModal };
}
window.WespKioskDbCheck = { setup };
})();