"use client";
import type {
BetroffenheitStatus,
MangelPrioritaet,
MangelStatus,
PruefErgebnis,
PruefungStatus,
RueckrufStatus,
WartungsterminStatus,
} from "@prisma/client";
import { Badge } from "@/components/ui/badge";
import type { Fristfenster } from "@/lib/wartung/fristen";
import {
BETROFFENHEIT_TEXT,
ERGEBNIS_TEXT,
FENSTER_TEXT,
MANGEL_STATUS_TEXT,
PRIORITAET_TEXT,
PRUEFUNG_STATUS_TEXT,
RUECKRUF_STATUS_TEXT,
TERMIN_STATUS_TEXT,
} from "@/lib/wartung/texte";
/**
* Anzeigebausteine für Wartung und Prüfung.
*
* Dieselbe Farblehre wie bei den Stammdaten: grün in Ordnung, gelb es eilt,
* rot es steht still, grau erledigt. Und wie dort trägt jede Farbe zusätzlich
* Klartext — im Gerätehaus steht kein kalibrierter Bildschirm, und
* Rot-Grün-Sehschwäche ist häufig.
*
* Die Beschriftungen selbst stehen in lib/wartung/texte.ts, damit auch
* Server-Komponenten sie verwenden können.
*/
export function ErgebnisAbzeichen({ ergebnis }: { ergebnis: PruefErgebnis | null }) {
if (!ergebnis) return offen;
const variante =
ergebnis === "BESTANDEN"
? "einsatzbereit"
: ergebnis === "BESTANDEN_MIT_MAENGELN"
? "pruefungFaellig"
: "gesperrt";
return {ERGEBNIS_TEXT[ergebnis]};
}
export function PruefungStatusAbzeichen({ status }: { status: PruefungStatus }) {
const variante =
status === "ABGESCHLOSSEN" ? "outline" : status === "ENTWURF" ? "pruefungFaellig" : "ausgesondert";
return {PRUEFUNG_STATUS_TEXT[status]};
}
export function TerminStatusAbzeichen({ status }: { status: WartungsterminStatus }) {
const variante =
status === "OFFEN" ? "outline" : status === "ERLEDIGT" ? "einsatzbereit" : "ausgesondert";
return {TERMIN_STATUS_TEXT[status]};
}
export function FensterAbzeichen({ fenster }: { fenster: Fristfenster }) {
const variante =
fenster === "ueberfaellig"
? "gesperrt"
: fenster === "diese_woche"
? "pruefungFaellig"
: "outline";
return {FENSTER_TEXT[fenster]};
}
export function MangelStatusAbzeichen({ status }: { status: MangelStatus }) {
const variante =
status === "BEHOBEN"
? "einsatzbereit"
: status === "VERWORFEN"
? "ausgesondert"
: status === "IN_ARBEIT"
? "pruefungFaellig"
: "outline";
return {MANGEL_STATUS_TEXT[status]};
}
export function PrioritaetAbzeichen({ prioritaet }: { prioritaet: MangelPrioritaet }) {
const variante =
prioritaet === "KRITISCH"
? "gesperrt"
: prioritaet === "HOCH"
? "pruefungFaellig"
: prioritaet === "NIEDRIG"
? "ausgesondert"
: "secondary";
return {PRIORITAET_TEXT[prioritaet]};
}
export function RueckrufStatusAbzeichen({ status }: { status: RueckrufStatus }) {
const variante =
status === "OFFEN" ? "gesperrt" : status === "IN_BEARBEITUNG" ? "pruefungFaellig" : "einsatzbereit";
return {RUECKRUF_STATUS_TEXT[status]};
}
export function BetroffenheitAbzeichen({ status }: { status: BetroffenheitStatus }) {
const variante =
status === "ERLEDIGT"
? "einsatzbereit"
: status === "NICHT_BETROFFEN"
? "ausgesondert"
: status === "MASSNAHME_LAEUFT"
? "pruefungFaellig"
: "gesperrt";
return {BETROFFENHEIT_TEXT[status]};
}
/**
* Kennzahl mit Klartext darunter. Die Zahl ist groß, weil sie aus zwei Metern
* Abstand lesbar sein soll — das Tablet liegt beim Prüfen auf der Werkbank.
*/
export function Kennzahl({
wert,
bezeichnung,
hinweis,
dringend,
aktiv,
onClick,
}: {
wert: number;
bezeichnung: string;
hinweis?: string;
dringend?: boolean;
aktiv?: boolean;
onClick?: () => void;
}) {
const inhalt = (
<>
0 ? "text-[var(--gesperrt)]" : ""
}`}
>
{wert}
{bezeichnung}
{hinweis && {hinweis}}
>
);
const klassen = `flex flex-col gap-0.5 rounded-lg border p-4 text-left transition-colors ${
aktiv
? "border-[var(--primary)] bg-[var(--accent)]"
: "border-[var(--border)] bg-[var(--card)]"
} ${onClick ? "hover:border-[var(--primary)]" : ""}`;
if (!onClick) return
{inhalt}
;
return (
);
}