"use client"; import { useActionState, useState } from "react"; import { SchrittTyp, SchrittZustand } from "@/generated/prisma/enums"; import { FELD } from "@/lib/formular"; import { schrittergebnisSetzenAktion, type AktionsErgebnis } from "@/server/actions/laeufe"; /** * Das Eingabefeld eines Schritts, passend zu seinem Typ (#013). * * Gespeichert wird mit einem eigenen Knopf und nicht bei jedem Tastendruck: ein * halb getippter Wert soll nicht in die Datenbank, und ein Lauf wird oft am * Handy mit wackligem Netz abgearbeitet. * * Ein `ZAHL`-Wert ausserhalb von Min/Max wird **markiert, nicht blockiert**. Die * Grenzen sind eine Erwartung, kein Gesetz — ein Rechner mit 4 GB statt der * erwarteten 8 ist ein Befund, den der Lauf festhalten soll, kein Eingabefehler. */ export function SchrittWert({ laufId, vorlagenSchrittId, typ, konfig, wert, zustand, lesend, }: { laufId: string; vorlagenSchrittId: string; typ: SchrittTyp; konfig: Record; wert: unknown; zustand: SchrittZustand; lesend: boolean; }) { const [ergebnis, aktion, laeuft] = useActionState( schrittergebnisSetzenAktion, {}, ); const [eingabe, setzeEingabe] = useState(wert === null || wert === undefined ? "" : String(wert)); if (typ === SchrittTyp.HAKEN || typ === SchrittTyp.BEFEHL) return null; if (lesend) { return eingabe ? (

{eingabe}

) : (

kein Wert erfasst

); } const zahl = typ === SchrittTyp.ZAHL ? Number(eingabe) : Number.NaN; const min = typeof konfig["min"] === "number" ? konfig["min"] : undefined; const max = typeof konfig["max"] === "number" ? konfig["max"] : undefined; const ausserhalb = !Number.isNaN(zahl) && ((min !== undefined && zahl < min) || (max !== undefined && zahl > max)); return (
{/* Der Zustand bleibt, wie er ist – hier wird ein Wert erfasst, kein Haken gesetzt. */}