feat: manually create and edit batch-cook recipes

recipe-form.tsx previously had no batch-cook awareness at all — editing an
AI-generated batch-cook recipe and saving silently corrupted it (steps lost
their per-dish `appliesTo` tags, recipeBatchDishes rows went stale/orphaned,
since the create/update API schemas and edit-page query never touched them).

Adds a "batch-cook recipe" toggle to the form, an editable dish list (name,
description, fridge days, freezer-friendly/note, day-of instructions), and
per-step dish tagging (click a dish chip to mark which dish(es) that step
advances; empty = shared prep). Renaming a dish propagates to any step
still tagged with the old name instead of orphaning it. Wired through
Create/Update API schemas and the edit page's query/payload.

Verified locally: created a 2-dish batch recipe from scratch through the
real form, confirmed it renders identically to an AI-generated one (grouped
steps, dishes & storage cards), edited it, renamed a dish, reloaded, and
confirmed the step tag followed the rename rather than orphaning.
This commit is contained in:
Arnaud
2026-07-12 14:45:24 +02:00
parent 20e4ce3597
commit 61014a3224
6 changed files with 341 additions and 32 deletions
+15 -1
View File
@@ -660,7 +660,21 @@
"discardChangesTitle": "Discard changes?",
"discardChangesDescription": "You have unsaved changes. If you leave now, they will be lost.",
"keepEditing": "Keep editing",
"discardChanges": "Discard changes"
"discardChanges": "Discard changes",
"batchCookToggle": "This is a batch-cook recipe",
"batchCookToggleHelp": "Split this recipe into several dishes cooked together, each with its own storage and reheat guidance.",
"dishes": "Dishes",
"addDish": "Add dish",
"dishName": "Dish name",
"dishDescription": "Description",
"fridgeDays": "Fridge (days)",
"freezerFriendly": "Freezer-friendly",
"freezerNote": "Freezer note",
"dayOfInstructions": "Day-of instructions",
"dishesRequired": "Add at least one dish",
"dayOfInstructionsRequired": "Every dish needs day-of instructions",
"appliesTo": "Applies to",
"sharedPrep": "Shared prep"
},
"canCook": {
"title": "What can I cook?",