From fb5ed358bdb49e320e76aac0d2192b7aab69e596 Mon Sep 17 00:00:00 2001 From: claude-dev Date: Sun, 8 Mar 2026 16:38:26 +0100 Subject: [PATCH] Fix: Tab-Navigation + Umlaute in app.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit sourceSubTabs vom Haupt-Navigation-Handler ausgeschlossen - verhindert dass Source-Sub-Tabs die Hauptnavigation stören und Inhalte unterhalb anderer Tabs angezeigt werden. Co-Authored-By: Claude Opus 4.6 --- src/static/js/app.js | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/static/js/app.js b/src/static/js/app.js index b0ec1fa..644b1af 100644 --- a/src/static/js/app.js +++ b/src/static/js/app.js @@ -54,10 +54,10 @@ function logout() { // --- Navigation --- function setupNavTabs() { - document.querySelectorAll(".nav-tabs:not(#orgDetailTabs) .nav-tab").forEach(tab => { + document.querySelectorAll(".nav-tabs:not(#orgDetailTabs):not(#sourceSubTabs) .nav-tab").forEach(tab => { tab.addEventListener("click", () => { const section = tab.dataset.section; - document.querySelectorAll(".nav-tabs:not(#orgDetailTabs) .nav-tab").forEach(t => t.classList.remove("active")); + document.querySelectorAll(".nav-tabs:not(#orgDetailTabs):not(#sourceSubTabs) .nav-tab").forEach(t => t.classList.remove("active")); tab.classList.add("active"); document.querySelectorAll(".app-content > .section").forEach(s => s.classList.remove("active")); document.getElementById(`sec-${section}`).classList.add("active"); @@ -106,7 +106,7 @@ async function loadDashboard() {
${stats.licenses.active}
-
Vorfaelle
+
Vorfälle
${stats.incidents.total}
${stats.incidents.active} aktiv
@@ -128,7 +128,7 @@ async function loadDashboard() { // Recent activity const actEl = document.getElementById("recentActivity"); if (stats.recent_activity.length === 0) { - actEl.innerHTML = '
Keine Aktivitaet
'; + actEl.innerHTML = '
Keine Aktivität
'; } else { actEl.innerHTML = stats.recent_activity.map(a => `
@@ -250,7 +250,7 @@ async function loadOrgUsers(orgId) { ? `` : `` } - + `).join(""); @@ -279,8 +279,8 @@ async function toggleUser(userId, activate) { function confirmDeleteUser(userId, email) { showConfirm( - "Nutzer loeschen", - `Soll der Nutzer "${email}" endgueltig geloescht werden?`, + "Nutzer löschen", + `Soll der Nutzer "${email}" endgültig gelöscht werden?`, async () => { try { await API.del(`/api/users/${userId}`); @@ -310,7 +310,7 @@ async function loadOrgLicenses(orgId) { ${l.status} ${l.status === "active" ? ` - + ` : ""} @@ -322,7 +322,7 @@ async function loadOrgLicenses(orgId) { } async function extendLicense(licId) { - const days = prompt("Um wie viele Tage verlaengern?", "365"); + const days = prompt("Um wie viele Tage verlängern?", "365"); if (!days) return; try { await API.put(`/api/licenses/${licId}/extend?days=${parseInt(days)}`); @@ -335,7 +335,7 @@ async function extendLicense(licId) { function confirmRevokeLicense(licId) { showConfirm( "Lizenz widerrufen", - "Soll die Lizenz wirklich widerrufen werden? Nutzer koennen dann nur noch lesen.", + "Soll die Lizenz wirklich widerrufen werden? Nutzer können dann nur noch lesen.", async () => { try { await API.put(`/api/licenses/${licId}/revoke`); @@ -354,7 +354,7 @@ async function loadExpiringLicenses() { const licenses = await API.get(`/api/licenses/expiring?days=${days}`); const tbody = document.getElementById("expiringTable"); if (licenses.length === 0) { - tbody.innerHTML = `Keine ablaufenden Lizenzen in den naechsten ${days} Tagen`; + tbody.innerHTML = `Keine ablaufenden Lizenzen in den nächsten ${days} Tagen`; return; } tbody.innerHTML = licenses.map(l => ` @@ -364,7 +364,7 @@ async function loadExpiringLicenses() { ${l.max_users} ${formatDate(l.valid_until)} - + `).join(""); @@ -380,7 +380,7 @@ document.addEventListener("DOMContentLoaded", () => { function switchToOrg(orgId) { // Switch to orgs tab and open detail - document.querySelectorAll(".nav-tabs:not(#orgDetailTabs) .nav-tab").forEach(t => t.classList.remove("active")); + document.querySelectorAll(".nav-tabs:not(#orgDetailTabs):not(#sourceSubTabs) .nav-tab").forEach(t => t.classList.remove("active")); document.querySelector('.nav-tab[data-section="orgs"]').classList.add("active"); document.querySelectorAll(".app-content > .section").forEach(s => s.classList.remove("active")); document.getElementById("sec-orgs").classList.add("active"); @@ -495,8 +495,8 @@ function setupForms() { // Delete Org document.getElementById("deleteOrgBtn").addEventListener("click", () => { showConfirm( - "Organisation loeschen", - "Soll die Organisation mit allen Nutzern und Lizenzen endgueltig geloescht werden? Diese Aktion kann nicht rueckgaengig gemacht werden.", + "Organisation löschen", + "Soll die Organisation mit allen Nutzern und Lizenzen endgültig gelöscht werden? Diese Aktion kann nicht rückgängig gemacht werden.", async () => { try { await API.del(`/api/orgs/${currentOrgId}`);