feat(dashboard): Kacheln und Karten verlinken auf ihre Bereiche

Die Statistik-Kacheln springen jetzt zu ihren Zielen. Organisationen und
Nutzer zur Organisations-Verwaltung, Aktive Lizenzen zum Lizenzen-Tab,
Vorfälle öffnen den Monitor in einem neuen Tab (im Portal gibt es keine
Vorfalls-Seite). Die Karte "Bald ablaufende Lizenzen" führt zum
Lizenzen-Tab, "Letzte Aktivität" zum Audit-Log. Hover-Optik mit
Gold-Rahmen und Chevron, bedienbar auch per Tastatur (Enter/Leertaste).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Dieser Commit ist enthalten in:
claude-dev
2026-07-25 14:07:55 +00:00
Ursprung 8fd087ea0c
Commit 7751657444
3 geänderte Dateien mit 44 neuen und 8 gelöschten Zeilen

Datei anzeigen

@@ -75,6 +75,26 @@ function openRechnerTab() {
if (tab) tab.click();
}
// Tab-Wechsel per Name, nutzt die vorhandene Nav-Logik
function gotoSection(name) {
const tab = document.querySelector(`.nav-tab[data-section="${name}"]`);
if (tab) tab.click();
}
// Dashboard-Kacheln als Sprungziele verdrahten (Klick + Enter/Leertaste)
function wireStatCardLinks() {
document.querySelectorAll("#statsGrid .stat-card-link").forEach((card) => {
const go = () => {
if (card.dataset.href) window.open(card.dataset.href, "_blank", "noopener");
else if (card.dataset.goto) gotoSection(card.dataset.goto);
};
card.addEventListener("click", go);
card.addEventListener("keydown", (e) => {
if (e.key === "Enter" || e.key === " ") { e.preventDefault(); go(); }
});
});
}
// --- State ---
let currentOrgId = null;
let orgsCache = [];
@@ -147,27 +167,30 @@ async function loadDashboard() {
try {
const stats = await API.get("/api/dashboard/stats");
// Kacheln sind Sprungziele. data-goto wechselt den Tab, data-href oeffnet
// extern (Vorfaelle leben im Monitor, nicht im Portal).
document.getElementById("statsGrid").innerHTML = `
<div class="stat-card">
<div class="stat-card stat-card-link" data-goto="orgs" role="link" tabindex="0" title="Zu den Organisationen">
<div class="stat-label">Organisationen</div>
<div class="stat-value">${stats.organizations.total}</div>
<div class="stat-sub">${stats.organizations.active} aktiv</div>
</div>
<div class="stat-card">
<div class="stat-card stat-card-link" data-goto="orgs" role="link" tabindex="0" title="Nutzer werden je Organisation verwaltet">
<div class="stat-label">Nutzer</div>
<div class="stat-value">${stats.users.total}</div>
<div class="stat-sub">${stats.users.active} aktiv</div>
</div>
<div class="stat-card">
<div class="stat-card stat-card-link" data-goto="licenses" role="link" tabindex="0" title="Zu den Lizenzen">
<div class="stat-label">Aktive Lizenzen</div>
<div class="stat-value">${stats.licenses.active}</div>
</div>
<div class="stat-card">
<div class="stat-card stat-card-link" data-href="https://monitor.aegis-sight.de" role="link" tabindex="0" title="Vorfälle liegen im Monitor (öffnet neuen Tab)">
<div class="stat-label">Vorfälle</div>
<div class="stat-value">${stats.incidents.total}</div>
<div class="stat-sub">${stats.incidents.active} aktiv</div>
</div>
`;
wireStatCardLinks();
// Expiring licenses
const expList = document.getElementById("expiringList");