From 41a6508b89b14d1d66931cc201046616321ea919 Mon Sep 17 00:00:00 2001 From: Florian Wilde Date: Fri, 17 Jul 2026 20:07:53 +0200 Subject: [PATCH] =?UTF-8?q?Gerichte:=20Mehrfachauswahl=20zum=20Batch-L?= =?UTF-8?q?=C3=B6schen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Checkbox je Zeile plus "Alle auswählen"; "Ausgewählte löschen (n)" löscht alle markierten Gerichte in einem einzigen delete().in()-Request. --- components/DishManager.tsx | 133 +++++++++++++++++++++++++++++-------- 1 file changed, 104 insertions(+), 29 deletions(-) diff --git a/components/DishManager.tsx b/components/DishManager.tsx index d672956..11f4e9a 100644 --- a/components/DishManager.tsx +++ b/components/DishManager.tsx @@ -19,6 +19,8 @@ export default function DishManager() { const [form, setForm] = useState(null); const [error, setError] = useState(null); const [loading, setLoading] = useState(true); + const [selected, setSelected] = useState>(new Set()); + const [bulkBusy, setBulkBusy] = useState(false); const load = useCallback(async () => { const { data, error } = await supabase @@ -64,9 +66,51 @@ export default function DishManager() { return; const { error } = await supabase.from("dishes").delete().eq("id", dish.id); if (error) setError(`Löschen fehlgeschlagen: ${error.message}`); + setSelected((prev) => { + const next = new Set(prev); + next.delete(dish.id); + return next; + }); await load(); } + function toggleOne(id: string) { + setSelected((prev) => { + const next = new Set(prev); + if (next.has(id)) next.delete(id); + else next.add(id); + return next; + }); + } + + function toggleAll() { + setSelected((prev) => + prev.size === dishes.length ? new Set() : new Set(dishes.map((d) => d.id)) + ); + } + + async function removeSelected() { + if (selected.size === 0) return; + if ( + !window.confirm( + `${selected.size} Gericht(e) wirklich löschen? Sie werden auch aus allen Wochenplänen entfernt.` + ) + ) + return; + setBulkBusy(true); + setError(null); + const { error } = await supabase + .from("dishes") + .delete() + .in("id", Array.from(selected)); + if (error) setError(`Löschen fehlgeschlagen: ${error.message}`); + setSelected(new Set()); + setBulkBusy(false); + await load(); + } + + const allSelected = dishes.length > 0 && selected.size === dishes.length; + return (
@@ -137,41 +181,72 @@ export default function DishManager() { {loading ? (

Lade Gerichte…

) : ( -
    - {dishes.map((dish) => ( -
  • - - {dish.name}{" "} - – {formatPrice(dish.price)} + <> + {dishes.length > 0 && ( +
    + + + {selected.size} ausgewählt - -
  • - ))} - {dishes.length === 0 && ( -
  • - Noch keine Gerichte angelegt. -
  • +
)} - +
    + {dishes.map((dish) => ( +
  • + toggleOne(dish.id)} + aria-label={`${dish.name} auswählen`} + /> + + {dish.name}{" "} + – {formatPrice(dish.price)} + + + +
  • + ))} + {dishes.length === 0 && ( +
  • + Noch keine Gerichte angelegt. +
  • + )} +
+ )}
);