"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 ( ); }