From 60d0cd7659c8b83397d252fc1457f543f3dd2393 Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Sat, 18 Apr 2026 14:40:57 +0200 Subject: [PATCH] =?UTF-8?q?feat(register):=20Rezept-hinzuf=C3=BCgen-Dropdo?= =?UTF-8?q?wn=20mit=20URL-Import=20+=20Manuell?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Der bisherige immer sichtbare URL-Importbalken ist durch einen "Rezept hinzufügen"-Button rechts im Register-Head ersetzt. Klick öffnet ein kleines Dropdown mit zwei Optionen: • Von URL importieren — öffnet einen Modal-Dialog zur URL-Eingabe und leitet wie bisher nach /preview weiter. • Leeres Rezept — POST /api/recipes/blank, Weiterleitung nach /recipes/{id}?edit=1; die Detailseite erkennt den Param und startet direkt im Editor, entfernt ihn nach Aktivierung wieder aus der URL. Der neue Blank-Endpoint legt ein Rezept mit Platzhalter-Titel "Neues Rezept", Portions-Default 4 und leeren Listen an. Der User füllt direkt im Edit-Modus aus und speichert wie gewohnt. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/routes/api/recipes/blank/+server.ts | 30 +++ src/routes/recipes/+page.svelte | 329 ++++++++++++++++++++---- src/routes/recipes/[id]/+page.svelte | 10 + 3 files changed, 319 insertions(+), 50 deletions(-) create mode 100644 src/routes/api/recipes/blank/+server.ts diff --git a/src/routes/api/recipes/blank/+server.ts b/src/routes/api/recipes/blank/+server.ts new file mode 100644 index 0000000..4e038c6 --- /dev/null +++ b/src/routes/api/recipes/blank/+server.ts @@ -0,0 +1,30 @@ +import type { RequestHandler } from './$types'; +import { json } from '@sveltejs/kit'; +import { getDb } from '$lib/server/db'; +import { insertRecipe } from '$lib/server/recipes/repository'; + +// Legt ein leeres Rezept an und gibt die ID zurück. Der Client leitet +// danach nach /recipes/{id}?edit=1 um, damit der Editor sofort offen ist. +// Titel "Neues Rezept" ist ein Platzhalter — der User überschreibt ihn +// beim ersten Speichern. +export const POST: RequestHandler = async () => { + const id = insertRecipe(getDb(), { + id: null, + title: 'Neues Rezept', + description: null, + source_url: null, + source_domain: null, + image_path: null, + servings_default: 4, + servings_unit: null, + prep_time_min: null, + cook_time_min: null, + total_time_min: null, + cuisine: null, + category: null, + ingredients: [], + steps: [], + tags: [] + }); + return json({ id }); +}; diff --git a/src/routes/recipes/+page.svelte b/src/routes/recipes/+page.svelte index 2eddcc4..5efbdd6 100644 --- a/src/routes/recipes/+page.svelte +++ b/src/routes/recipes/+page.svelte @@ -1,20 +1,85 @@
-

Register

-

{data.recipes.length} Rezepte insgesamt

+
+
+

Register

+

{data.recipes.length} Rezepte insgesamt

+
+
+ + {#if menuOpen} + + {/if} +
+
-
- - - -
+{#if importOpen} + +{/if}
import { onMount, onDestroy, tick } from 'svelte'; + import { page } from '$app/stores'; import { goto } from '$app/navigation'; import { Heart, @@ -315,6 +316,15 @@ } onMount(() => { + // Wenn wir über "Manuell anlegen" hier landen, ist ?edit=1 gesetzt + // und wir starten direkt im Editor. Den Param danach aus der URL + // entfernen, damit Refresh nicht automatisch wieder edit-Mode ist. + if ($page.url.searchParams.get('edit') === '1') { + editMode = true; + const url = new URL(window.location.href); + url.searchParams.delete('edit'); + history.replaceState(history.state, '', url.toString()); + } const stored = localStorage.getItem('kochwas.wakeLock'); if (stored !== null) wakeLockEnabled = stored === '1'; if (wakeLockEnabled) void acquireWakeLock();