Web: Kategorie-Filter mit vollem Pfad (Oberkategorie findet Unterkategorien)

Der Kategorie-Spaltenfilter zeigte nur die Blatt-Kategorien, die an Produkten haengen - die Oberkategorie (z.B. 'Klamotten') fehlte, obwohl darunter (kurze Hosen, T-Shirts) etwas eingelagert ist. Kategorie wird jetzt als voller Pfad 'Klamotten -> kurze Hosen' gefuehrt; Freitext 'Klamotten' findet damit alles darunter. Betrifft Produkt- und Einzelstueckliste. (Lagerorte nutzen den Pfad bereits.)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-07-27 17:13:11 +02:00
parent 76dc29ac72
commit 487c5f5f38
3 changed files with 44 additions and 9 deletions

23
web/src/categoryPath.js Normal file
View File

@@ -0,0 +1,23 @@
// Kategorien sind verschachtelbar (Klamotten → kurze Hosen). Produkte hängen an
// der Blatt-Kategorie; um „alle Klamotten" filtern zu können, arbeiten die
// Listen mit dem vollen Pfad statt nur dem Blattnamen.
/** Map Kategorie-ID → voller Pfad "Klamotten → kurze Hosen". */
export function categoryPathMap(categories) {
const byId = new Map((categories || []).map((c) => [c.id, c]));
const cache = new Map();
const pfad = (id, seen) => {
if (cache.has(id)) return cache.get(id);
const c = byId.get(id);
if (!c) return "";
if (seen.has(id)) return c.name; // Ringschutz
seen.add(id);
const oben = c.parent_id != null ? pfad(c.parent_id, seen) : "";
const p = oben ? `${oben}${c.name}` : c.name;
cache.set(id, p);
return p;
};
const out = new Map();
for (const c of categories || []) out.set(c.id, pfad(c.id, new Set()));
return out;
}