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?",
+15 -1
View File
@@ -648,7 +648,21 @@
"discardChangesTitle": "Abandonner les modifications ?",
"discardChangesDescription": "Vous avez des modifications non enregistrées. Si vous quittez maintenant, elles seront perdues.",
"keepEditing": "Continuer l'édition",
"discardChanges": "Abandonner"
"discardChanges": "Abandonner",
"batchCookToggle": "Ceci est une recette de batch cooking",
"batchCookToggleHelp": "Divisez cette recette en plusieurs plats cuisinés ensemble, chacun avec ses propres consignes de conservation et de réchauffage.",
"dishes": "Plats",
"addDish": "Ajouter un plat",
"dishName": "Nom du plat",
"dishDescription": "Description",
"fridgeDays": "Frigo (jours)",
"freezerFriendly": "Se congèle bien",
"freezerNote": "Note de congélation",
"dayOfInstructions": "Consignes le jour J",
"dishesRequired": "Ajoutez au moins un plat",
"dayOfInstructionsRequired": "Chaque plat nécessite des consignes pour le jour J",
"appliesTo": "Concerne",
"sharedPrep": "Préparation commune"
},
"canCook": {
"title": "Que puis-je cuisiner ?",