"use client"; import { useEffect, useState } from "react"; import { Table, type TableColumn } from "@nexarch/shl"; import { ExpiringObject, ForbiddenError, fetchExpiringPreview } from "../../lib/api"; // Akzeptanzkriterium 2: Vorschauliste bald ablaufender Objekte (naechste 30 // Tage) - ruft dieselbe RET-06-API /retention-classes/preview auf, die // intern dieselbe Funktion wie der periodische Job nutzt (RET-02), keine // eigene Berechnung im Frontend. export default function PreviewPage() { const [objects, setObjects] = useState(null); const [forbidden, setForbidden] = useState(false); const [loadError, setLoadError] = useState(null); useEffect(() => { fetchExpiringPreview() .then(setObjects) .catch((err) => { if (err instanceof ForbiddenError) { setForbidden(true); } else { setLoadError(err instanceof Error ? err.message : "Vorschauliste konnte nicht geladen werden."); } }); }, []); if (forbidden) { return (

Zugriff verweigert: Ihre Rolle ist nicht zur Fristenverwaltung berechtigt.

); } if (loadError) { return (

{loadError}

); } const columns: TableColumn[] = [ { key: "type", header: "Objekttyp", render: (o) => o.ObjectType }, { key: "ref", header: "Referenz", render: (o) => o.ObjectReference }, { key: "class", header: "Aufbewahrungsklasse", render: (o) => o.RetentionClass }, { key: "due", header: "Fällig am", render: (o) => o.DueDate }, ]; return (

In den nächsten 30 Tagen ablaufende Objekte

{objects && ( o.RetentionObjectID} caption="Bald ablaufende Objekte" /> )} ); }