From 5e7e37cc3c9a933a7dcdd0da83757eb6fb493730 Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Fri, 17 Apr 2026 19:29:00 +0200 Subject: [PATCH] =?UTF-8?q?feat(wishlist):=20"f=C3=BCr=20alle=20l=C3=B6sch?= =?UTF-8?q?en"=20+=20Badge=20refresht=20auf=20jede=20Navigation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1) Trash-Button auf Wunschliste wieder da. Im Gegensatz zum Heart entfernt er den Eintrag NICHT nur für das aktive Profil, sondern löscht alle Memberships auf diesem Rezept. Bestätigungsdialog macht das explizit ("wird für alle Profile aus der Wunschliste gestrichen"). - repository.ts: neue Funktion removeFromWishlistForAll(recipeId) - DELETE /api/wishlist/:id?all=true → family-wide DELETE /api/wishlist/:id?profile_id=X → nur mein Eintrag - UI: zwei Action-Buttons untereinander (Heart, Trash) 2) wishlistStore.refresh() läuft jetzt in afterNavigate des Root-Layouts. Vorher wurde der Badge nur aktualisiert, wenn derselbe Tab die Aktion ausgelöst hat. Wenn ein anderer Tab / anderes Gerät etwas ändert, bleibt der Badge stale bis zum nächsten Full-Reload. Mit afterNavigate reicht eine Client-Navigation, um ihn zu aktualisieren — was deutlich näher an dem liegt, was der User erwartet. --- src/lib/server/wishlist/repository.ts | 7 ++++ src/routes/+layout.svelte | 5 +++ .../api/wishlist/[recipe_id]/+server.ts | 16 ++++++-- src/routes/wishlist/+page.svelte | 39 ++++++++++++++++--- 4 files changed, 59 insertions(+), 8 deletions(-) diff --git a/src/lib/server/wishlist/repository.ts b/src/lib/server/wishlist/repository.ts index 5520611..cccec3f 100644 --- a/src/lib/server/wishlist/repository.ts +++ b/src/lib/server/wishlist/repository.ts @@ -94,6 +94,13 @@ export function removeFromWishlist( ); } +export function removeFromWishlistForAll( + db: Database.Database, + recipeId: number +): void { + db.prepare('DELETE FROM wishlist WHERE recipe_id = ?').run(recipeId); +} + export function isOnMyWishlist( db: Database.Database, recipeId: number, diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 9a029f9..6a0d2c0 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -102,6 +102,11 @@ navHits = []; navWebHits = []; navOpen = false; + // Badge nach jeder Client-Navigation frisch halten — sonst kann er + // hinter den tatsächlichen Wunschliste-Einträgen herlaufen, wenn + // auf einem anderen Gerät oder in einem anderen Tab etwas geändert + // wurde. + void wishlistStore.refresh(); }); onMount(() => { diff --git a/src/routes/api/wishlist/[recipe_id]/+server.ts b/src/routes/api/wishlist/[recipe_id]/+server.ts index 6939d4a..f4c2fba 100644 --- a/src/routes/api/wishlist/[recipe_id]/+server.ts +++ b/src/routes/api/wishlist/[recipe_id]/+server.ts @@ -1,7 +1,10 @@ import type { RequestHandler } from './$types'; import { json, error } from '@sveltejs/kit'; import { getDb } from '$lib/server/db'; -import { removeFromWishlist } from '$lib/server/wishlist/repository'; +import { + removeFromWishlist, + removeFromWishlistForAll +} from '$lib/server/wishlist/repository'; function parsePositiveInt(raw: string | null, field: string): number { const n = raw === null ? NaN : Number(raw); @@ -9,9 +12,16 @@ function parsePositiveInt(raw: string | null, field: string): number { return n; } +// DELETE /api/wishlist/:id?profile_id=X → entfernt nur den eigenen Wunsch +// DELETE /api/wishlist/:id?all=true → entfernt für ALLE Profile export const DELETE: RequestHandler = async ({ params, url }) => { const id = parsePositiveInt(params.recipe_id!, 'recipe_id'); - const profileId = parsePositiveInt(url.searchParams.get('profile_id'), 'profile_id'); - removeFromWishlist(getDb(), id, profileId); + const db = getDb(); + if (url.searchParams.get('all') === 'true') { + removeFromWishlistForAll(db, id); + } else { + const profileId = parsePositiveInt(url.searchParams.get('profile_id'), 'profile_id'); + removeFromWishlist(db, id, profileId); + } return json({ ok: true }); }; diff --git a/src/routes/wishlist/+page.svelte b/src/routes/wishlist/+page.svelte index b67fe66..1c55750 100644 --- a/src/routes/wishlist/+page.svelte +++ b/src/routes/wishlist/+page.svelte @@ -1,9 +1,9 @@