"use client"; import { useActionState, useState } from "react"; import { Copy, Download, Trash2 } from "lucide-react"; import { entwurfVerwerfenAktion, vorlageArchivierenAktion, vorlageDuplizierenAktion, vorlageExportierenAktion, type AktionsErgebnis, } from "@/server/actions/vorlagen"; // `w-fit`, damit ein Knopf in einem Block-Element nicht auf volle Breite geht – // drei verschieden breite Balken untereinander sehen aus wie ein Fehler. const KNOPF = "flex w-fit min-h-11 items-center gap-2 rounded-pille border border-linie px-4 text-sm text-nebentext hover:bg-flaeche-hoch hover:text-text md:min-h-10"; const FELD = "min-h-11 rounded-karte border border-linie bg-grund px-3 text-sm text-text outline-none focus-visible:border-akzent"; function Meldung({ ergebnis }: { ergebnis: AktionsErgebnis }) { if (ergebnis.fehler) { return (

{ergebnis.fehler}

); } if (ergebnis.erfolg) { return (

{ergebnis.erfolg}

); } return null; } /** * Entwurf verwerfen. * * Mit Rueckfrage, weil ein Entwurf nicht protokolliert wird: was hier * verschwindet, ist wirklich weg. Die veroeffentlichte Version bleibt * unberuehrt — genau das ist der Sinn des Entwurfs. */ export function EntwurfVerwerfen({ versionId }: { versionId: string }) { const [ergebnis, aktion, laeuft] = useActionState(entwurfVerwerfenAktion, {}); const [sicher, setSicher] = useState(false); if (!sicher) { return ( ); } return (

Der Entwurf wird gelöscht und ist nicht wiederherstellbar. Die veröffentlichte Version bleibt.

); } /** Duplizieren: neue Vorlage, Inhalt der neuesten Version als Entwurf. */ export function VorlageDuplizieren({ vorlageId, name }: { vorlageId: string; name: string }) { const [ergebnis, aktion, laeuft] = useActionState(vorlageDuplizierenAktion, {}); return (
); } /** Archivieren statt loeschen – sonst verloere das Archiv seine Bezuege. */ export function VorlageArchivieren({ vorlageId, archiviert }: { vorlageId: string; archiviert: boolean }) { const [ergebnis, aktion, laeuft] = useActionState(vorlageArchivierenAktion, {}); return (
); } /** * Export einer Version als Datei. * * Die Server Action gibt den Text zurueck, und der Browser legt daraus die * Datei an. Ein Route Handler dafuer waere ein zweiter Weg zu denselben Daten, * mit eigener Rechtepruefung — und damit eine zweite Stelle, die falsch sein kann. */ export function VersionExportieren({ versionId }: { versionId: string }) { const [laeuft, setLaeuft] = useState(false); const [fehler, setFehler] = useState(null); async function exportieren() { setLaeuft(true); setFehler(null); try { const ergebnis = await vorlageExportierenAktion(versionId); if (!("inhalt" in ergebnis)) { setFehler(ergebnis.fehler ?? "Der Export ist fehlgeschlagen."); return; } const adresse = URL.createObjectURL(new Blob([ergebnis.inhalt], { type: "application/json" })); const verweis = document.createElement("a"); verweis.href = adresse; verweis.download = ergebnis.dateiname; verweis.click(); URL.revokeObjectURL(adresse); } finally { setLaeuft(false); } } return (
{fehler ? (

{fehler}

) : null}
); }