From 4904ff0032ee8a7f516f272a33a66c08f284e610 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?m=C3=BCde?= Date: Tue, 19 May 2026 18:19:26 +0200 Subject: [PATCH] admin: reorder drinks per bar --- client/src/admin/Admin.tsx | 93 ++++++++++++++++++++++++++++++-------- 1 file changed, 73 insertions(+), 20 deletions(-) diff --git a/client/src/admin/Admin.tsx b/client/src/admin/Admin.tsx index aa441b8..20cc6b9 100644 --- a/client/src/admin/Admin.tsx +++ b/client/src/admin/Admin.tsx @@ -191,6 +191,74 @@ function Drinks() { ); } +function BarDrinkEditor({ + bar, + allDrinks, + onChange, +}: { + bar: BarRow; + allDrinks: Drink[]; + onChange: (ids: number[]) => void; +}) { + const byId = new Map(allDrinks.map(d => [d.id, d])); + const selected = bar.drink_ids.filter(id => { + const d = byId.get(id); + return d && !d.archived; + }); + const available = allDrinks.filter(d => !d.archived && !selected.includes(d.id)); + + function move(idx: number, dir: -1 | 1) { + const j = idx + dir; + if (j < 0 || j >= selected.length) return; + const next = selected.slice(); + [next[idx], next[j]] = [next[j]!, next[idx]!]; + onChange(next); + } + function remove(idx: number) { + onChange(selected.filter((_, i) => i !== idx)); + } + function add(id: number) { + onChange([...selected, id]); + } + + return ( + <> +
Aktive Getränke (Reihenfolge)
+ + + {selected.length === 0 && ( + + )} + {selected.map((id, idx) => { + const d = byId.get(id); + if (!d) return null; + return ( + + + + + ); + })} + +
Keine
{idx + 1}. {d.name} + + + +
+ {available.length > 0 && ( + <> +
Hinzufügen
+
+ {available.map(d => ( + + ))} +
+ + )} + + ); +} + function Bars() { const [bars, setBars] = useState([]); const [drinks, setDrinks] = useState([]); @@ -253,26 +321,11 @@ function Bars() { /> -
- {drinks.filter(d => !d.archived).map(d => { - const checked = b.drink_ids.includes(d.id); - return ( - - ); - })} -
+ patch(b.id, { drink_ids: ids } as any)} + /> ))}