import { Download, ScrollText, Search } from "lucide-react"; import type { Metadata } from "next"; import { KettenPruefung } from "@/components/protokoll/KettenPruefung"; import { ProtokollListe } from "@/components/protokoll/ProtokollListe"; import { Button, buttonKlassen } from "@/components/ui/Button"; import { Auswahlliste, Feld } from "@/components/ui/Feld"; import { Karte } from "@/components/ui/Karte"; import { Leerzustand } from "@/components/ui/Leerzustand"; import { Seitenkopf } from "@/components/ui/Seitenkopf"; import { AKTIONSGRUPPEN } from "@/lib/protokoll-aktionen"; import { cursorAus, ERGEBNIS_TEXT, protokollFilterAktiv, protokollFilterAus, protokollFilterQuery, } from "@/lib/protokoll-filter"; import { syslogZielText } from "@/lib/syslog"; import { sitzungErforderlich } from "@/server/auth/sitzungspflicht"; import { protokollAkteure, protokollSeite, protokollZaehlen } from "@/server/queries/protokoll"; import { ketteZwischengespeichert, syslogKonfig } from "@/server/services/protokoll"; export const metadata: Metadata = { title: "Audit-Log" }; type Suchparameter = Promise>; /** * Audit-Log (#027): jede Rolle darf lesen. Filter per GET, damit Links, „ältere laden“ und * der CSV-Export denselben Ausschnitt meinen. Es gibt hier bewusst keinen Knopf, der einen * Eintrag aendert oder loescht. */ export default async function Protokoll({ searchParams }: { searchParams: Suchparameter }) { // Jede Seite prueft selbst; die Huelle ist nur das zweite Netz (CLAUDE.md). await sitzungErforderlich("lesen", "/protokoll"); const parameter = await searchParams; const filter = protokollFilterAus(parameter); const vor = cursorAus(parameter["vor"]); const [seite, zaehler, akteure] = await Promise.all([ protokollSeite(filter, vor), protokollZaehlen(filter), protokollAkteure(), ]); const gefiltert = protokollFilterAktiv(filter); const query = protokollFilterQuery(filter); const kette = ketteZwischengespeichert(); const syslog = syslogKonfig(); return (
CSV exportieren } />

{zaehler.gesamt.toLocaleString("de-DE")} {" "} Einträge insgesamt

{gefiltert && (

{zaehler.treffer.toLocaleString("de-DE")} {" "} passen zum Filter

)}

Syslog:{" "} {syslog ? ( {syslogZielText(syslog)} ) : ( nicht eingerichtet )}

{/* Ein gefilterter Name, der nicht mehr unter den haeufigsten ist, bleibt waehlbar. */} {[...new Set([...akteure, ...(filter.akteur ? [filter.akteur] : [])])].map((name) => ( ))} {Object.entries(AKTIONSGRUPPEN).map(([wert, text]) => ( ))} {Object.entries(ERGEBNIS_TEXT).map(([wert, text]) => ( ))}
{gefiltert && ( )}
{vor !== undefined && (

Einträge älter als #{String(vor)}.{" "} Zu den neuesten

)} {seite.zeilen.length === 0 ? ( gefiltert ? ( } titel="Keine Treffer" text="Kein Eintrag passt zu Suche und Filter." aktion={} /> ) : ( } titel="Noch keine Einträge" text="Sobald jemand sich anmeldet oder etwas ändert, steht es hier." /> ) ) : ( {/* key: neue Filter oder ein neuer Cursor beginnen eine frische Liste. */} )}
); }