я косяк, поправил веб. Капитан, работайте!

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
влад
2026-07-16 11:06:47 +03:00
co-authored by Cursor
parent 148d645760
commit 2c294424ef
85 changed files with 17410 additions and 110 deletions
+147
View File
@@ -0,0 +1,147 @@
/**
* Модальное окно «Проверка БД» в стиле киоска (как привязка терминала):
* тёмная рамка, 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 };
})();