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:
@@ -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");
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren