88 lines
2.7 KiB
TypeScript
88 lines
2.7 KiB
TypeScript
import { AlertCircle, CheckCircle2, CircleDashed, ShieldAlert } from "lucide-react";
|
|
|
|
export const validationResultValues = [
|
|
"OFFEN",
|
|
"BESTANDEN",
|
|
"BESTANDEN_MIT_AUFLAGEN",
|
|
"NICHT_BESTANDEN"
|
|
] as const;
|
|
|
|
export type ValidationResultValue = (typeof validationResultValues)[number];
|
|
|
|
export type ValidationResultPresentation = {
|
|
value: ValidationResultValue;
|
|
label: string;
|
|
badgeClass: string;
|
|
previewClass: string;
|
|
color: string;
|
|
icon: typeof CircleDashed;
|
|
};
|
|
|
|
const presentations: Record<ValidationResultValue, ValidationResultPresentation> = {
|
|
OFFEN: {
|
|
value: "OFFEN",
|
|
label: "Noch nicht bewertet",
|
|
badgeClass: "border-slate-300 bg-slate-100 text-slate-700",
|
|
previewClass: "border-slate-300 bg-slate-50 text-slate-700",
|
|
color: "#2E3B40",
|
|
icon: CircleDashed
|
|
},
|
|
BESTANDEN: {
|
|
value: "BESTANDEN",
|
|
label: "Bestanden",
|
|
badgeClass: "border-success/35 bg-success/15 text-success",
|
|
previewClass: "border-success/40 bg-success/10 text-success",
|
|
color: "#245C36",
|
|
icon: CheckCircle2
|
|
},
|
|
BESTANDEN_MIT_AUFLAGEN: {
|
|
value: "BESTANDEN_MIT_AUFLAGEN",
|
|
label: "Bestanden mit Auflagen",
|
|
badgeClass: "border-warning/40 bg-warning/15 text-[#7A5A00]",
|
|
previewClass: "border-warning/45 bg-warning/10 text-[#7A5A00]",
|
|
color: "#7A5A00",
|
|
icon: ShieldAlert
|
|
},
|
|
NICHT_BESTANDEN: {
|
|
value: "NICHT_BESTANDEN",
|
|
label: "Nicht bestanden",
|
|
badgeClass: "border-danger/35 bg-danger/15 text-danger",
|
|
previewClass: "border-danger/40 bg-danger/10 text-danger",
|
|
color: "#7A1F26",
|
|
icon: AlertCircle
|
|
}
|
|
};
|
|
|
|
const aliases: Record<string, ValidationResultValue> = {
|
|
"": "OFFEN",
|
|
offen: "OFFEN",
|
|
OFFEN: "OFFEN",
|
|
bestanden: "BESTANDEN",
|
|
BESTANDEN: "BESTANDEN",
|
|
mit_auflagen: "BESTANDEN_MIT_AUFLAGEN",
|
|
bestanden_mit_auflagen: "BESTANDEN_MIT_AUFLAGEN",
|
|
"bestanden mit auflagen": "BESTANDEN_MIT_AUFLAGEN",
|
|
BESTANDEN_MIT_AUFLAGEN: "BESTANDEN_MIT_AUFLAGEN",
|
|
nicht_bestanden: "NICHT_BESTANDEN",
|
|
"nicht bestanden": "NICHT_BESTANDEN",
|
|
NICHT_BESTANDEN: "NICHT_BESTANDEN"
|
|
};
|
|
|
|
export function normalizeValidationResult(value?: string | null): ValidationResultValue {
|
|
return aliases[String(value ?? "").trim()] ?? "OFFEN";
|
|
}
|
|
|
|
export function getValidationResultPresentation(value?: string | null) {
|
|
return presentations[normalizeValidationResult(value)];
|
|
}
|
|
|
|
export function ValidationResultBadge({ value, className = "" }: { value?: string | null; className?: string }) {
|
|
const presentation = getValidationResultPresentation(value);
|
|
const Icon = presentation.icon;
|
|
return (
|
|
<span className={`inline-flex items-center gap-1.5 rounded-full border px-3 py-1 text-xs font-semibold ${presentation.badgeClass} ${className}`}>
|
|
<Icon className="h-3.5 w-3.5" />
|
|
{presentation.label}
|
|
</span>
|
|
);
|
|
}
|