import { Download, Network, Search } from "lucide-react"; import type { Metadata } from "next"; import { Zuweisungsmatrix } from "@/components/zuweisungen/Zuweisungsmatrix"; import { Button, buttonKlassen } from "@/components/ui/Button"; import { Ankreuzfeld, Auswahlliste, Feld } from "@/components/ui/Feld"; import { Kennzahl } from "@/components/ui/Kennzahl"; import { Leerzustand } from "@/components/ui/Leerzustand"; import { Seitenkopf } from "@/components/ui/Seitenkopf"; import { KATEGORIE_TEXT } from "@/lib/schluessel"; import { matrixFilterAus, matrixFilterQuery } from "@/lib/zuweisungsmatrix"; import { darf } from "@/server/auth/rechte"; import { sitzungErforderlich } from "@/server/auth/sitzungspflicht"; import { zielAuswahl } from "@/server/queries/ziele"; import { zuweisungsMatrix } from "@/server/queries/zuweisungen"; export const metadata: Metadata = { title: "Zuweisungen" }; type Suchparameter = Promise>; /** * Zuweisungsmatrix Schluessel × Host (#025). Filter per GET, damit Links und der CSV-Export * denselben Ausschnitt zeigen. Die Matrix plant nur – ausgerollt wird ueber den Dry-Run. */ export default async function Zuweisungen({ searchParams }: { searchParams: Suchparameter }) { // Jede Seite prueft selbst; die Huelle ist nur das zweite Netz (CLAUDE.md). const { benutzer } = await sitzungErforderlich("lesen", "/zuweisungen"); const filter = matrixFilterAus(await searchParams); const darfZuweisen = darf(benutzer.rolle, "publicKeyAusrollen"); const [{ matrix, gruppen, personen }, auswahl] = await Promise.all([ zuweisungsMatrix(filter), darfZuweisen ? zielAuswahl() : Promise.resolve(undefined), ]); const gefiltert = Boolean( filter.gruppeId || filter.kategorie || filter.personId || filter.q || filter.nurBelegt, ); const { zaehler } = matrix; const leer = matrix.zeilen.length === 0 || matrix.spalten.length === 0; return (
CSV exportieren } />
0 ? "messing" : "neutral"} hinweis="geplant, Drift, entfernen, Fehler" />
{gruppen.map((g) => ( ))} {Object.entries(KATEGORIE_TEXT).map(([wert, text]) => ( ))} {personen.map((p) => ( ))}
{gefiltert && ( )}
{leer ? ( gefiltert ? ( } titel="Keine Treffer" text="Kein Schlüssel und kein Host passen zu Suche und Filter." aktion={} /> ) : ( } titel="Noch nichts zuzuordnen" text="Die Matrix braucht mindestens einen aktiven Schlüssel und einen Host." /> ) ) : (

P Public Key direkt ·{" "} P·G über Hostgruppe ·{" "} K Private Key · ●{" "} synchron · ○ geplant oder wird entfernt ·{" "} ● Drift oder Fehler

)}
); }