"use client";
import { useActionState, useState } from "react";
import { Archive, CheckCircle2, Link2, PlayCircle, Undo2 } from "lucide-react";
import {
abschnittNichtZutreffendAktion,
kommentarHinzufuegenAktion,
laufAbschliessenAktion,
laufArchivierenAktion,
laufMitAdKontoVerknuepfenAktion,
laufOeffnenAktion,
laufZurueckholenAktion,
type AktionsErgebnis,
} from "@/server/actions/laeufe";
import { FELD } from "@/lib/formular";
const KNOPF =
"flex min-h-11 w-fit 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";
function Meldung({ ergebnis }: { ergebnis: AktionsErgebnis }) {
if (ergebnis.fehler) {
return (
{ergebnis.fehler}
);
}
if (ergebnis.erfolg) {
return (
{ergebnis.erfolg}
);
}
return null;
}
/**
* „Lauf beginnen“ – der Übergang von `OFFEN` zu `IN_ARBEIT`.
*
* Erst hier entsteht `gestartetAm`. Ein zugewiesener Lauf, den jemand nur
* aufschlaegt, hat noch nicht begonnen — sonst saehe die Liste nach Arbeit aus,
* die niemand tut.
*/
export function LaufBeginnen({ laufId }: { laufId: string }) {
const [ergebnis, aktion, laeuft] = useActionState(laufOeffnenAktion, {});
return (
Noch {offen} {offen === 1 ? "Pflichtschritt ist" : "Pflichtschritte sind"} offen. Erledigt oder
„nicht zutreffend“ zählen beide — fehlgeschlagen nicht.
) : null}
);
}
/**
* Archivieren – die zweite, ausdrueckliche Handlung.
*
* Mit Rueckfrage, weil danach nichts mehr geht: kein Kommentar, keine
* nachgetragene Notiz, keine Korrektur. Nur ein Administrator holt den Lauf
* zurueck.
*/
export function LaufArchivieren({ laufId }: { laufId: string }) {
const [ergebnis, aktion, laeuft] = useActionState(laufArchivierenAktion, {});
const [sicher, setzeSicher] = useState(false);
if (!sicher) {
return (
);
}
return (
Nach dem Archivieren ändert sich an diesem Lauf nichts mehr — kein Kommentar, keine Notiz, kein
Schritt. Nur ein Administrator holt ihn zurück.
);
}
/** Zurueckholen – nur fuer Administratoren, mit Protokolleintrag. */
export function LaufZurueckholen({ laufId }: { laufId: string }) {
const [ergebnis, aktion, laeuft] = useActionState(laufZurueckholenAktion, {});
return (
);
}
/**
* Einen ganzen Abschnitt als nicht zutreffend vermerken.
*
* Der Fall aus dem Auftrag: im Onboarding gibt es zwei Konto-Abschnitte, und je
* nach Kunde trifft einer gar nicht zu. Achtzehn Haken einzeln mit derselben
* Begruendung zu versehen, macht niemand — und wer es nicht macht, laesst sie weg.
*/
export function AbschnittNichtZutreffend({
laufId,
abschnittId,
abschnitt,
}: {
laufId: string;
abschnittId: string;
abschnitt: string;
}) {
const [ergebnis, aktion, laeuft] = useActionState(
abschnittNichtZutreffendAktion,
{},
);
const [offen, setzeOffen] = useState(false);
if (!offen) {
return (
);
}
return (
);
}
/** Ein Kommentar am Lauf oder an einem Schritt. */
export function KommentarSchreiben({
laufId,
schrittergebnisId,
}: {
laufId: string;
schrittergebnisId?: string | null;
}) {
const [ergebnis, aktion, laeuft] = useActionState(
kommentarHinzufuegenAktion,
{},
);
return (
);
}
/**
* Einen Lauf nachtraeglich an ein Konto aus dem Verzeichnis haengen (#013).
*
* Sichtbar nur im Onboarding-Fall: der Lauf traegt einen Freitextnamen, weil es
* die Person beim Start noch nicht gab. Danach gehoert die Arbeit an die Person
* — sonst findet sie in ihrer Historie nichts wieder.
*
* Zwei Wege, weil es zwei Lagen gibt: die Person steht schon in der Liste (dann
* waehlt man sie), oder sie ist gerade erst im Verzeichnis entstanden und noch
* nicht abgeglichen (dann traegt man den UPN ein, so wie er dort steht).
*/
export function LaufMitAdKontoVerknuepfen({
laufId,
name,
personen,
}: {
laufId: string;
name: string;
personen: readonly { id: string; anzeigename: string }[];
}) {
const [ergebnis, aktion, laeuft] = useActionState(
laufMitAdKontoVerknuepfenAktion,
{},
);
return (
„{name}“ mit einem AD-Konto
verknüpfen
);
}