// Generisches Modal fuer Board-/Monitor-Detailansichten (Visualization.md 4.5: "Modals sind // reines HTML/CSS/JS ohne fremde UI-Bibliothek, per -Element ... umgesetzt"). Dieses // Modul kuemmert sich nur um Erzeugen/Oeffnen/Schliessen des -Elements; welchen Inhalt // es zeigt, entscheidet der Aufrufer (office-render.js) per renderBody-Callback. let dialogEl = null; // Erhoeht sich bei jedem openModal()-Aufruf (fuer JEDEN Modal-Typ) - alle Modals teilen sich // dasselbe -Element (ensureDialog() erzeugt es nur einmal). Ein interaktives Modal mit // eigenem Server-Rundtrip (z.B. das Projekte-Modal, Issue #27) kann per isCurrentModal() vor // einem verspaeteten Repaint pruefen, ob der Nutzer inzwischen ein anderes Modal geoeffnet hat - // sonst wuerde eine spaet aufloesende Promise dessen Inhalt ueberschreiben. let openToken = 0; function ensureDialog() { if (dialogEl) { return dialogEl; } dialogEl = document.createElement("dialog"); dialogEl.className = "office-modal"; dialogEl.innerHTML = `

`; document.body.appendChild(dialogEl); return dialogEl; } /** * Oeffnet das Modal mit einem Titel und laesst den Aufrufer den Body fuellen. * * @param {{title: string}} content * @param {(body: HTMLElement, content: object) => void} renderBody * @returns {number} Token fuer isCurrentModal() - siehe openToken oben. */ export function openModal(content, renderBody) { openToken += 1; const token = openToken; const dialog = ensureDialog(); dialog.querySelector(".office-modal-title").textContent = content.title; const body = dialog.querySelector(".office-modal-body"); body.replaceChildren(); renderBody(body, content); if (typeof dialog.showModal === "function") { dialog.showModal(); } else { // Fallback fuer Umgebungen ohne -Unterstuetzung (z.B. sehr alte Browser). dialog.setAttribute("open", ""); } return token; } /** Siehe openToken/openModal() - true, solange kein anderer openModal()-Aufruf dazwischenkam. */ export function isCurrentModal(token) { return token === openToken; } export function closeModal() { if (dialogEl === null) { return; } if (typeof dialogEl.close === "function") { dialogEl.close(); } else { dialogEl.removeAttribute("open"); } }