// 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 Pfad. `tokens` enthält jede Ebene als eigenen Wert (Ober- und eigene // Kategorie), damit im Filter-Dropdown auch die Oberkategorie wählbar ist. /** * Map Kategorie-ID → { path, parts, tokens }. * path = "Klamotten → kurze Hosen" * parts = ["Klamotten", "kurze Hosen"] * tokens = ["Klamotten", "Klamotten → kurze Hosen"] (jede Ebene kumuliert) */ export function categoryInfoMap(categories) { const byId = new Map((categories || []).map((c) => [c.id, c])); const partsCache = new Map(); const parts = (id, seen) => { if (partsCache.has(id)) return partsCache.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 ? parts(c.parent_id, seen) : []; const arr = [...oben, c.name]; partsCache.set(id, arr); return arr; }; const out = new Map(); for (const c of categories || []) { const arr = parts(c.id, new Set()); const tokens = arr.map((_, i) => arr.slice(0, i + 1).join(" → ")); out.set(c.id, { path: arr.join(" → "), parts: arr, tokens }); } return out; }