diff --git a/frontend/src/pages/kontrolle/PositionCard.tsx b/frontend/src/pages/kontrolle/PositionCard.tsx index 227cef5..5e271b3 100644 --- a/frontend/src/pages/kontrolle/PositionCard.tsx +++ b/frontend/src/pages/kontrolle/PositionCard.tsx @@ -1,3 +1,5 @@ +import { useState } from "react"; + import { StatusBadge } from "./StatusBadge"; import type { PositionZustand } from "./types"; @@ -8,6 +10,11 @@ interface Props { onErneutVersuchen: (materialId: number, zustand: PositionZustand) => void; } +function letzterTagDesMonats(monatswert: string): string { + const [jahr, monat] = monatswert.split("-").map(Number); + return new Date(jahr, monat, 0).toISOString().slice(0, 10); +} + /** * Nutzer-Vorgabe: Ablauf/Charge/SN gehören zur Kontroll-Erfassung dazu, wie * die Menge - kein separater Admin-Schritt. Felder erscheinen nur, wenn der @@ -34,6 +41,7 @@ function rahmenFarbe(status: PositionZustand["status"], passt: boolean): string export function PositionCard({ zustand, onEingabeAendern, onSenden, onErneutVersuchen }: Props) { const materialtyp = zustand.material?.materialtyp; const passt = zustand.eingabe === zustand.position.sollmenge_effektiv; + const [nurMonat, setNurMonat] = useState(false); return (
@@ -61,20 +69,32 @@ export function PositionCard({ zustand, onEingabeAendern, onSenden, onErneutVers
{materialtyp === "ablauf_charge" && ( -
- onEingabeAendern(zustand.position.material_id, "ablaufdatum", e.target.value)} - style={{ borderColor: ablaufFarbe(zustand.ablaufdatum), color: ablaufFarbe(zustand.ablaufdatum) }} - /> - onEingabeAendern(zustand.position.material_id, "chargennummer", e.target.value)} - /> +
+
+ + onEingabeAendern( + zustand.position.material_id, + "ablaufdatum", + nurMonat && e.target.value ? letzterTagDesMonats(e.target.value) : e.target.value + ) + } + style={{ borderColor: ablaufFarbe(zustand.ablaufdatum), color: ablaufFarbe(zustand.ablaufdatum) }} + /> + onEingabeAendern(zustand.position.material_id, "chargennummer", e.target.value)} + /> +
+
)} {materialtyp === "geraet_sn" && (