import { ArrowRight, Plus, RefreshCw, Route } from "lucide-react"; import type { Metadata } from "next"; import Link from "next/link"; import { abweichungen, BEISPIEL_JETZT, baldAblaufend, kennzahlen, letzteAktionen, letzterAbgleich, type AktionsArt, } from "@/beispiel/uebersicht"; import { Badge } from "@/components/ui/Badge"; import { Button } from "@/components/ui/Button"; import { Karte } from "@/components/ui/Karte"; import { Kennzahl } from "@/components/ui/Kennzahl"; import { Seitenkopf } from "@/components/ui/Seitenkopf"; import { Statuspunkt } from "@/components/ui/Statuspunkt"; import { Tabelle, TabellenZeile, TabellenZelle } from "@/components/ui/Tabelle"; import { datum, datumZeit, relativ, tageBis, uhrzeit } from "@/lib/format"; import { sitzungErforderlich } from "@/server/auth/sitzungspflicht"; export const metadata: Metadata = { title: "Übersicht" }; const AKTION: Record = { ausgerollt: { text: "Ausgerollt", farbe: "text-ok" }, widerrufen: { text: "Widerrufen", farbe: "text-danger" }, erstellt: { text: "Erstellt", farbe: "text-text" }, abgleich: { text: "Abgleich", farbe: "text-info" }, rotiert: { text: "Rotiert", farbe: "text-accent" }, }; /** * Prototyp der Übersicht mit Beispieldaten (#002). Die echte Übersicht mit Lesemodellen * folgt in #026; Aufbau und Komponenten bleiben. */ export default async function Uebersicht() { // Jede Seite prueft selbst; die Huelle ist nur das zweite Netz (CLAUDE.md). await sitzungErforderlich(); return (
Prototyp · Beispieldaten} untertitel={ <> Letzter Abgleich {relativ(letzterAbgleich, BEISPIEL_JETZT)} ·{" "} } aktionen={ <> } />
{abweichungen.map((a) => ( {a.host} {a.benutzer} Prüfen – {a.host} ))}
    {baldAblaufend.map((s) => { const tage = tageBis(s.ablauf, BEISPIEL_JETZT); return (
  • {s.zweck} {s.person} · {s.typ}
  • ); })}
Zum Audit-Log } >
    {letzteAktionen.map((a) => (
  1. {AKTION[a.art].text} {a.beschreibung} {a.benutzer}
  2. ))}
); }