From 5edb830afd0dc27be12ed064b54ec758e66a7869 Mon Sep 17 00:00:00 2001 From: Scarriffle Date: Sat, 25 Jul 2026 23:55:27 +0200 Subject: [PATCH] Web: Produkte und Kategorien nach Typ filtern (Lebensmittel/Gegenstand) Zum leichteren Unterscheiden gibt es in der Produkte-Liste und in der Kategorien-Verwaltung einen Umschalter Alle/Lebensmittel/Gegenstaende. Er filtert die jeweilige Liste und in der Produktsuche auch die Kategorieauswahl auf den Typ. Co-Authored-By: Claude Opus 4.8 --- web/src/pages/Categories.jsx | 12 +++++++++++- web/src/pages/Products.jsx | 27 +++++++++++++++++++++++---- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/web/src/pages/Categories.jsx b/web/src/pages/Categories.jsx index 4acb805..2d1bad8 100644 --- a/web/src/pages/Categories.jsx +++ b/web/src/pages/Categories.jsx @@ -23,6 +23,8 @@ export default function Categories() { const [collapsed, setCollapsed] = useState(() => new Set()); // Kategorie, deren Felder gerade verwaltet werden. const [feldKat, setFeldKat] = useState(null); + // "" = alle, sonst "food"/"object": trennt Lebensmittel und Gegenstände. + const [typFilter, setTypFilter] = useState(""); function toggle(id) { setCollapsed((alt) => { @@ -101,7 +103,9 @@ export default function Categories() { } return false; } - const sichtbar = tree.filter((c) => !versteckt(c.id)); + const sichtbar = tree.filter( + (c) => !versteckt(c.id) && (!typFilter || c.tracking === typFilter), + ); return (
@@ -117,6 +121,12 @@ export default function Categories() {
{error &&
{error}
} +
+ + + +
+
diff --git a/web/src/pages/Products.jsx b/web/src/pages/Products.jsx index 28784ac..da6c19d 100644 --- a/web/src/pages/Products.jsx +++ b/web/src/pages/Products.jsx @@ -25,6 +25,8 @@ export default function Products() { const [categories, setCategories] = useState([]); // "" = alle, "0" = ohne Kategorie, sonst die ID (Unterkategorien zaehlen mit). const [categoryId, setCategoryId] = useState(""); + // "" = alle, sonst "food"/"object": trennt Lebensmittel und Gegenstände. + const [typ, setTyp] = useState(""); const [error, setError] = useState(null); async function load(cat = categoryId) { @@ -46,12 +48,23 @@ export default function Products() { load(); } + // Typ umschalten: passt der Kategoriefilter nicht mehr, zurücksetzen. + function changeTyp(neu) { + setTyp(neu); + if (neu && categoryId && categoryId !== "0") { + const cat = categories.find((c) => String(c.id) === String(categoryId)); + if (cat && cat.tracking !== neu) { setCategoryId(""); load(""); } + } + } + + const sichtbar = products.filter((p) => !typ || p.tracking === typ); + return (

Produkte

-
{products.length} Produkte im Katalog
+
{sichtbar.length} Produkte{typ ? (typ === "food" ? " · Lebensmittel" : " · Gegenstände") : " im Katalog"}
{isAdmin && ( Neues Produkt @@ -60,6 +73,12 @@ export default function Products() { {error &&
{error}
} +
+ + + +
+