feat: pantry notes/categories, ingredient-alias matching, cook-log edit/delete, fork-list popover (v0.83.0)

Pantry: notes + category fields (collapsible grouping like the shopping list), a "Merge duplicates" cleanup action, and fixed quantity display precision (was showing raw decimal(10,4) strings like "0.3333 kg" everywhere — pantry, shopping list, print views, Markdown exports).

Ingredient-alias matching: the ingredients table (canonical name + aliases) existed but was never populated or used. Seeded ~10 bilingual EN/FR staples and wired resolution into pantry add/edit, can-cook scoring, auto-deduct-on-cook, and shopping-list pantry-awareness, so "sel"/"sel fin"/"table salt" are recognized as the same ingredient.

Cook log: entries from "Mark cooked" can now be edited and deleted (previously log-only, no fix-a-mistake path). The "Cooked N times" text is a hover tooltip listing every date and opens a full manage sheet on click.

Also: the "Forked by N others" backlink is now a click-to-open popover instead of an always-inline list.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Arnaud
2026-07-24 15:13:33 +02:00
parent a488b544dc
commit 93936eae10
37 changed files with 7255 additions and 117 deletions
+25 -1
View File
@@ -161,6 +161,17 @@
"markCookedCountSingular": "Cuisiné 1 fois",
"markCookedCountPlural": "Cuisiné {count} fois",
"markCookedLast": " · dernière fois le {date}",
"cookLogMore": "+{count} de plus",
"cookLogSheetTitle": "Historique de cuisine",
"cookLogEmpty": "Aucune cuisson enregistrée pour le moment.",
"cookLogNotesLabel": "Notes",
"editCookLogTitle": "Modifier l'entrée",
"editCookLogSaved": "Entrée mise à jour",
"editCookLogFailed": "Échec de la mise à jour",
"deleteCookLogSuccess": "Entrée supprimée",
"deleteCookLogFailed": "Échec de la suppression",
"deleteCookLogConfirmTitle": "Supprimer cette entrée ?",
"deleteCookLogConfirmDescription": "Supprimer l'entrée du {date} de votre historique ? Cela n'annule pas la déduction du garde-manger effectuée lors de l'enregistrement.",
"batchCookExpiresOn": "Cuisiné — bon jusqu'au {date}",
"servings": "{count} portions",
"prep": "{mins}m prép.",
@@ -745,6 +756,7 @@
"loading": "Chargement…",
"error": "Une erreur s'est produite",
"save": "Enregistrer",
"saving": "Enregistrement…",
"saved": "Enregistré",
"saveFailed": "Échec de l'enregistrement",
"exportMarkdown": "Exporter en Markdown",
@@ -1149,7 +1161,19 @@
"scanNotFound": "Produit introuvable. Essayez un scan photo.",
"scanPhotoFailed": "Échec du scan photo",
"scanNoItemsFound": "Aucun article reconnu sur cette photo",
"cameraError": "Impossible d'accéder à la caméra"
"cameraError": "Impossible d'accéder à la caméra",
"editItem": "Modifier l'article",
"editDialogTitle": "Modifier l'article du garde-manger",
"editSaved": "Article mis à jour",
"editFailed": "Échec de la mise à jour",
"categoryLabel": "Catégorie",
"notesLabel": "Notes",
"notesPlaceholder": "ex. ouvert, à moitié utilisé, marque préférée…",
"uncategorized": "Sans catégorie",
"mergeDuplicates": "Fusionner les doublons",
"mergeDuplicatesFailed": "Échec de la fusion des doublons",
"mergeDuplicatesNoneFound": "Aucun doublon trouvé",
"mergeDuplicatesSuccess": "{count, plural, one {1 doublon fusionné} other {{count} doublons fusionnés}}"
},
"feed": {
"title": "Fil d'actualité",