From 6f047e3033242861411f13905e8ee970006cd009 Mon Sep 17 00:00:00 2001 From: patrick Date: Fri, 4 Sep 2026 23:00:01 +0200 Subject: [PATCH] Materialliste: zweispaltiges Layout mit Suche Formular (Anlegen/Bearbeiten) links fix, Liste rechts mit Suchfeld oben (Name/Artikelnummer) - bei 153 Materialien war die reine Scroll-Liste ohne Suche kaum nutzbar. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV --- frontend/src/pages/admin/MaterialSection.tsx | 137 +++++++++++-------- 1 file changed, 82 insertions(+), 55 deletions(-) diff --git a/frontend/src/pages/admin/MaterialSection.tsx b/frontend/src/pages/admin/MaterialSection.tsx index 8d9b360..9f9568f 100644 --- a/frontend/src/pages/admin/MaterialSection.tsx +++ b/frontend/src/pages/admin/MaterialSection.tsx @@ -26,6 +26,7 @@ export function MaterialSection({ materialien, onGeaendert, onFehler }: Props) { const [formular, setFormular] = useState(LEERES_FORMULAR); const [bearbeiteteId, setBearbeiteteId] = useState(null); const [wirdGespeichert, setWirdGespeichert] = useState(false); + const [suche, setSuche] = useState(""); function bearbeiten(material: Material) { setBearbeiteteId(material.id); @@ -65,21 +66,31 @@ export function MaterialSection({ materialien, onGeaendert, onFehler }: Props) { } } + const sucheNormalisiert = suche.trim().toLowerCase(); + const gefiltert = sucheNormalisiert + ? materialien.filter( + (m) => + m.name.toLowerCase().includes(sucheNormalisiert) || + (m.artikelnummer ?? "").toLowerCase().includes(sucheNormalisiert) + ) + : materialien; + return (
-

Material {bearbeiteteId !== null ? "bearbeiten" : "anlegen"}

-
-
-
- - setFormular({ ...formular, name: e.target.value })} - /> -
-
-
+

Material

+
+
+

{bearbeiteteId !== null ? "Material bearbeiten" : "Material anlegen"}

+
+
+ + setFormular({ ...formular, name: e.target.value })} + /> +
+
setFormular({ ...formular, artikelnummer: e.target.value })} />
-
+
setFormular({ ...formular, einheit: e.target.value })} />
-
-
- - -
-
- - {bearbeiteteId !== null && ( - - )} + {bearbeiteteId !== null && ( + + )} +
- {materialien.length > 0 && ( -
    - {materialien.map((m) => ( -
  • - - {m.name} ({m.einheit}) - - -
  • - ))} -
- )} +
+ setSuche(e.target.value)} + /> + {gefiltert.length === 0 &&

Keine Treffer.

} + {gefiltert.length > 0 && ( +
    + {gefiltert.map((m) => ( +
  • + + {m.name} ({m.einheit}) + {m.artikelnummer && · {m.artikelnummer}} + {m.materialtyp !== "standard" && ( + + {m.materialtyp} + + )} + + +
  • + ))} +
+ )} +
);