import { useEffect, useState } from "react"; import { Link, useNavigate, useSearchParams } from "react-router-dom"; import { apiRequest, ApiError } from "../api/client"; import type { Objekt } from "../api/types"; import { BarcodeScanner } from "../components/BarcodeScanner"; // Prompt 11 Screen 1: Standort/Objekt wählen. Objekt-Code (MOBILE-002) → // Direktsprung zur Akte (Zielseite laut Kachel 15), sonst füllt der Scan // dasselbe Textfeld wie die manuelle Suche (Kamera fällt bei Etikettschaden // auf Tippen zurück). export function ObjektListPage() { const navigate = useNavigate(); const [objekte, setObjekte] = useState([]); const [suche, setSuche] = useState(""); const [ladefehler, setLadefehler] = useState(null); const [laedt, setLaedt] = useState(true); const [scannerOffen, setScannerOffen] = useState(false); const [suchparameter, setSuchparameter] = useSearchParams(); // UI-002 (Epic 20): Quick Action "QR scannen" aus der Command Palette springt // hierher mit ?scan=1 und öffnet den Scanner direkt, statt nur die Liste zu zeigen. useEffect(() => { if (suchparameter.get("scan") === "1") { setScannerOffen(true); setSuchparameter({}, { replace: true }); } // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { apiRequest("/objekte") .then(setObjekte) .catch(() => setLadefehler("Objektliste konnte nicht geladen werden.")) .finally(() => setLaedt(false)); }, []); async function scanVerarbeiten(code: string) { setScannerOffen(false); try { const objekt = await apiRequest(`/objekte/code/${encodeURIComponent(code)}`); navigate(`/akte/objekt/${objekt.id}`); } catch (err) { if (err instanceof ApiError && err.status === 404) { setSuche(code); } else { setLadefehler("Scan konnte nicht verarbeitet werden."); } } } const gefiltert = objekte.filter( (o) => o.name.toLowerCase().includes(suche.toLowerCase()) || o.code.toLowerCase().includes(suche.toLowerCase()) ); return (

Objekte

setSuche(e.target.value)} />
{scannerOffen && ( setScannerOffen(false)} /> )} {ladefehler &&
{ladefehler}
} {laedt &&

Lade…

} {!laedt && !ladefehler && gefiltert.length === 0 && (

{objekte.length === 0 ? "Noch keine Objekte angelegt." : "Keine Treffer."}

)}
    {gefiltert.map((objekt) => (
  • {objekt.name} {objekt.status}
    {objekt.code}
    {objekt.letzte_kontrolle_am ? `Letzte Kontrolle: ${new Date(objekt.letzte_kontrolle_am).toLocaleDateString("de-DE")}` : "Noch nie kontrolliert"}
    e.stopPropagation()} > Akte ansehen
  • ))}
); }