"use client"; import { useEffect, useState, type ChangeEvent, type FormEvent } from "react"; import { Table, TextField, useToast, type TableColumn } from "@nexarch/shl"; import { ApiError, ClassRule, ForbiddenError, configureClassRule, deactivateClassRule, fetchClassRules, } from "../../lib/api"; export default function ClassesPage() { const { push } = useToast(); const [rules, setRules] = useState(null); const [forbidden, setForbidden] = useState(false); const [loadError, setLoadError] = useState(null); const [newClass, setNewClass] = useState(""); const [newDuration, setNewDuration] = useState(""); const [saving, setSaving] = useState(false); function load() { fetchClassRules() .then((r) => { setRules(r); setForbidden(false); }) .catch((err) => { if (err instanceof ForbiddenError) { setForbidden(true); } else { setLoadError(err instanceof Error ? err.message : "Aufbewahrungsklassen konnten nicht geladen werden."); } }); } useEffect(load, []); // Akzeptanzkriterium 3: nicht berechtigte Rolle sieht explizit den // Zugriff-verweigert-Zustand, keine leere Tabelle ohne Erklaerung. if (forbidden) { return (

Zugriff verweigert: Ihre Rolle ist nicht zur Fristenverwaltung berechtigt.

); } if (loadError) { return (

{loadError}

); } async function onCreateOrChange(e: FormEvent) { e.preventDefault(); setSaving(true); try { // Akzeptanzkriterium 1: gleicher Endpunkt legt an ODER aendert // (UPSERT im Backend, retentionengine.ConfigureClassRule). await configureClassRule(newClass, newDuration); push(`Aufbewahrungsklasse "${newClass}" gespeichert.`, "success"); setNewClass(""); setNewDuration(""); load(); } catch (err) { if (err instanceof ForbiddenError) { setForbidden(true); } else { push(err instanceof ApiError ? err.message : "Speichern fehlgeschlagen.", "danger"); } } finally { setSaving(false); } } async function onDeactivate(retentionClass: string) { try { await deactivateClassRule(retentionClass); push(`Aufbewahrungsklasse "${retentionClass}" deaktiviert.`, "success"); load(); } catch (err) { if (err instanceof ForbiddenError) { setForbidden(true); } else { push(err instanceof ApiError ? err.message : "Deaktivieren fehlgeschlagen.", "danger"); } } } const columns: TableColumn[] = [ { key: "class", header: "Aufbewahrungsklasse", render: (r) => r.RetentionClass }, { key: "duration", header: "Frist", render: (r) => r.Duration }, { key: "active", header: "Status", render: (r) => (r.Active ? "aktiv" : "deaktiviert") }, { key: "actions", header: "Aktion", render: (r) => r.Active ? ( ) : null, }, ]; return (

Aufbewahrungsfristen-Konfiguration

) => setNewClass(e.target.value)} required /> ) => setNewDuration(e.target.value)} required /> {rules && ( r.RetentionClass} caption="Konfigurierte Aufbewahrungsklassen" /> )} ); }