diff --git a/src/static/dashboard.html b/src/static/dashboard.html index eda15ca..0d9c672 100644 --- a/src/static/dashboard.html +++ b/src/static/dashboard.html @@ -393,9 +393,17 @@ - +
-
+ +
+ +
@@ -715,7 +723,7 @@ - +
diff --git a/src/static/js/source-health.js b/src/static/js/source-health.js index 4c2c219..f851804 100644 --- a/src/static/js/source-health.js +++ b/src/static/js/source-health.js @@ -39,6 +39,15 @@ const PRIORITY_LABELS = { low: "Niedrig", }; +// Lucide-Icons als Inline-SVG-Konstanten (statt CDN-Abhängigkeit oder Emojis). +// 14x14, currentColor erbt vom Button-Style. +const LUCIDE_ICONS = { + check: '', + x: '', + search:'', + refresh:'', +}; + // --- Init --- function setupHealthTab() { const tab = document.querySelector('#sourceSubTabs .nav-tab[data-subtab="source-health"]'); @@ -47,7 +56,25 @@ function setupHealthTab() { } } -document.addEventListener("DOMContentLoaded", setupHealthTab); +// Sub-Sub-Tabs innerhalb von Quellen-Health: Vorschläge / Health-Status / Verlauf. +function setupHealthSubTabs() { + document.querySelectorAll("#healthSubTabs .nav-tab").forEach((tab) => { + tab.addEventListener("click", () => { + const which = tab.dataset.healthtab; + document.querySelectorAll("#healthSubTabs .nav-tab").forEach(t => t.classList.remove("active")); + tab.classList.add("active"); + ["suggestions", "checks", "verlauf"].forEach(name => { + const pane = document.getElementById("ht-" + name); + if (pane) pane.style.display = name === which ? "block" : "none"; + }); + }); + }); +} + +document.addEventListener("DOMContentLoaded", () => { + setupHealthTab(); + setupHealthSubTabs(); +}); // --- Health-Daten laden --- async function loadHealthData(force = false) { @@ -110,8 +137,11 @@ function setHealthFilter(field, value) { } function renderHealthDashboard() { - const container = document.getElementById("healthContent"); - if (!container) return; + // Drei Sub-Panes (statt einer monolithischen Health-Section). + const paneSuggestions = document.getElementById("ht-suggestions"); + const paneChecks = document.getElementById("ht-checks"); + const paneVerlauf = document.getElementById("ht-verlauf"); + if (!paneSuggestions || !paneChecks || !paneVerlauf) return; // Vorschläge rendern const pendingSuggestions = suggestionsCache.filter((s) => s.status === "pending"); @@ -147,9 +177,9 @@ function renderHealthDashboard() { ${PRIORITY_LABELS[s.priority] || s.priority} ${formatDateTime(s.created_at)} - ${s.suggestion_type === "deactivate_source" && s.source_id ? ` ` : ""} - - + ${s.suggestion_type === "deactivate_source" && s.source_id ? ` ` : ""} + + `, ) @@ -289,7 +319,7 @@ function renderHealthDashboard() { ${c.tenant_id == null ? 'global' : esc(c.org_name || ("Org " + c.tenant_id))} ${c.status === "error" ? "Fehler" : (c.status === "warning" ? "Warnung" : "OK")} ${esc(c.message || "")} - ${c.status === "error" && c.check_type === "reachability" ? `` : ""} + ${c.status === "error" && c.check_type === "reachability" ? `` : ""} `; } ) @@ -356,7 +386,17 @@ function renderHealthDashboard() { `; } - container.innerHTML = suggestionsHtml + historyHtml + healthHtml + runsHtml; + // Statt einer monolithischen Render: drei Sub-Panes, einer pro Sub-Tab. + paneSuggestions.innerHTML = suggestionsHtml; + paneChecks.innerHTML = healthHtml; + paneVerlauf.innerHTML = historyHtml + runsHtml; + + // Tab-Label "Vorschläge" mit Counter der offenen Vorschläge anreichern. + const tabBtnSugg = document.querySelector('#healthSubTabs .nav-tab[data-healthtab="suggestions"]'); + if (tabBtnSugg) { + const open = pendingSuggestions.length; + tabBtnSugg.textContent = open > 0 ? `Vorschläge (${open} offen)` : "Vorschläge"; + } } // --- Vorschlag annehmen/ablehnen ---