feat(kunden): Kundenverwaltung, Hostzuweisung und Token-Verwaltung (#006)

Kunden und Standorte pflegen, nicht zugeordnete Hosts in einem Schritt zuweisen,
Enrollment- und Host-Tokens verwalten, Audit-Log. Dashboard, Kundenseiten und
globale Suche laufen jetzt auf der Datenbank. 45 Tests.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-17 21:02:44 +02:00
co-authored by Claude Opus 5
parent f591b45aac
commit f9a5ad2daa
40 changed files with 2060 additions and 415 deletions
+14 -8
View File
@@ -2,14 +2,20 @@
import Link from "next/link";
import { useCallback, useEffect, useState, useSyncExternalStore } from "react";
import type { SuchEintrag } from "@/mock/suchindex";
import type { Alert } from "@/mock/types";
import { SearchDialog } from "./SearchDialog";
import { SearchDialog, type SuchEintrag } from "./SearchDialog";
const SCHWERE_ICON: Record<Alert["schwere"], string> = {
gefahr: "bi-exclamation-octagon-fill pl-text-danger",
warnung: "bi-exclamation-triangle-fill pl-text-warning",
info: "bi-info-circle-fill text-body-secondary",
export interface KopfleistenAlert {
id: string;
titel: string;
beschreibung: string;
schwere: "INFO" | "WARNUNG" | "GEFAHR";
hostId: string | null;
}
const SCHWERE_ICON: Record<KopfleistenAlert["schwere"], string> = {
GEFAHR: "bi-exclamation-octagon-fill pl-text-danger",
WARNUNG: "bi-exclamation-triangle-fill pl-text-warning",
INFO: "bi-info-circle-fill text-body-secondary",
};
/** Farbschema aus dem <html>-Attribut lesen, damit Server und Client übereinstimmen. */
@@ -28,7 +34,7 @@ export function Header({
suchEintraege,
benutzer,
}: {
alerts: Alert[];
alerts: KopfleistenAlert[];
suchEintraege: SuchEintrag[];
benutzer: string;
}) {