import { FormEvent, useEffect, useState } from "react"; import { useNavigate, useParams } from "react-router-dom"; import { apiGet, apiPost, apiPut } from "../lib/api"; import { useSession } from "../lib/session"; import type { ActiveCatalogSummary, DashboardOverview, QuarterKey, SampleDetail, SampleKind, SamplingMode, } from "../lib/types"; const QUARTERS: { key: QuarterKey; label: string }[] = [ { key: "LEFT_FRONT", label: "Vorne links" }, { key: "RIGHT_FRONT", label: "Vorne rechts" }, { key: "LEFT_REAR", label: "Hinten links" }, { key: "RIGHT_REAR", label: "Hinten rechts" }, ]; export default function SampleRegistrationPage() { const { sampleId } = useParams(); const navigate = useNavigate(); const { user } = useSession(); const [catalogs, setCatalogs] = useState(null); const [sampleNumber, setSampleNumber] = useState(null); const [editable, setEditable] = useState(true); const [farmerBusinessKey, setFarmerBusinessKey] = useState(""); const [cowNumber, setCowNumber] = useState(""); const [cowName, setCowName] = useState(""); const [sampleKind, setSampleKind] = useState("LACTATION"); const [samplingMode, setSamplingMode] = useState("SINGLE_SITE"); const [flaggedQuarters, setFlaggedQuarters] = useState([]); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [message, setMessage] = useState(null); const [showValidation, setShowValidation] = useState(false); useEffect(() => { async function load() { try { const catalogResponse = await apiGet("/catalogs/summary"); setCatalogs(catalogResponse); if (sampleId) { const sample = await apiGet(`/samples/${sampleId}`); setSampleNumber(sample.sampleNumber); setEditable(sample.registrationEditable); setFarmerBusinessKey(sample.farmerBusinessKey); setCowNumber(sample.cowNumber); setCowName(sample.cowName ?? ""); setSampleKind(sample.sampleKind); setSamplingMode(sample.samplingMode); setFlaggedQuarters( sample.quarters.filter((quarter) => quarter.flagged).map((quarter) => quarter.quarterKey), ); } else { const dashboard = await apiGet("/dashboard"); setSampleNumber(dashboard.nextSampleNumber); setFarmerBusinessKey(catalogResponse.farmers[0]?.businessKey ?? ""); } } catch (loadError) { setMessage((loadError as Error).message); } finally { setLoading(false); } } void load(); }, [sampleId]); function toggleFlaggedQuarter(quarterKey: QuarterKey) { setFlaggedQuarters((current) => current.includes(quarterKey) ? current.filter((entry) => entry !== quarterKey) : [...current, quarterKey], ); } async function handleSubmit(event: FormEvent) { event.preventDefault(); setShowValidation(true); if (!user) { return; } if (!farmerBusinessKey || !cowNumber.trim()) { setMessage("Landwirt und Kuh-Nummer sind erforderlich."); return; } setSaving(true); setMessage(null); const payload = { farmerBusinessKey, cowNumber, cowName, sampleKind, samplingMode, flaggedQuarters, userCode: user.displayName, userDisplayName: user.displayName, }; try { const response = sampleId ? await apiPut(`/samples/${sampleId}/registration`, payload) : await apiPost("/samples", payload); navigate(`/samples/${response.id}/${response.routeSegment}`); } catch (saveError) { setMessage((saveError as Error).message); } finally { setSaving(false); } } if (loading) { return
Probe wird vorbereitet ...
; } return (

Neuanlage

Probe {sampleNumber ?? "..."}

Die Probenummer wird fortlaufend vergeben. Trockensteller lassen sich ueber den Schalter Trockenstellerprobe markieren.

{!editable ? (
Diese Probe ist bereits weiter im Ablauf. Stammdaten sind nicht mehr editierbar.
) : null} {message ?
{message}
: null}

Stammdaten

Probentyp

Entnahmestelle

{samplingMode === "FOUR_QUARTER" ? (

Auffaellige Viertel

Viertel markieren

{QUARTERS.map((quarter) => ( ))}
) : null}
); }