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:
@@ -161,6 +161,17 @@
|
||||
"markCookedCountSingular": "Cooked 1 time",
|
||||
"markCookedCountPlural": "Cooked {count} times",
|
||||
"markCookedLast": " · last {date}",
|
||||
"cookLogMore": "+{count} more",
|
||||
"cookLogSheetTitle": "Cook history",
|
||||
"cookLogEmpty": "No cooks logged yet.",
|
||||
"cookLogNotesLabel": "Notes",
|
||||
"editCookLogTitle": "Edit cook log",
|
||||
"editCookLogSaved": "Cook log updated",
|
||||
"editCookLogFailed": "Failed to update cook log",
|
||||
"deleteCookLogSuccess": "Cook log removed",
|
||||
"deleteCookLogFailed": "Failed to remove cook log",
|
||||
"deleteCookLogConfirmTitle": "Remove this cook log?",
|
||||
"deleteCookLogConfirmDescription": "Remove the {date} entry from your cook history? This won't undo any pantry deduction from when it was logged.",
|
||||
"batchCookExpiresOn": "Cooked — good until {date}",
|
||||
"servings": "{count} servings",
|
||||
"prep": "{mins}m prep",
|
||||
@@ -745,6 +756,7 @@
|
||||
"loading": "Loading…",
|
||||
"error": "Something went wrong",
|
||||
"save": "Save",
|
||||
"saving": "Saving…",
|
||||
"saved": "Saved",
|
||||
"saveFailed": "Failed to save",
|
||||
"exportMarkdown": "Export as Markdown",
|
||||
@@ -1158,7 +1170,19 @@
|
||||
"scanNotFound": "Product not found. Try a photo scan instead.",
|
||||
"scanPhotoFailed": "Photo scan failed",
|
||||
"scanNoItemsFound": "No items recognized in this photo",
|
||||
"cameraError": "Couldn't access the camera"
|
||||
"cameraError": "Couldn't access the camera",
|
||||
"editItem": "Edit item",
|
||||
"editDialogTitle": "Edit pantry item",
|
||||
"editSaved": "Item updated",
|
||||
"editFailed": "Failed to update item",
|
||||
"categoryLabel": "Category",
|
||||
"notesLabel": "Notes",
|
||||
"notesPlaceholder": "e.g. opened, half used, brand preference…",
|
||||
"uncategorized": "Uncategorized",
|
||||
"mergeDuplicates": "Merge duplicates",
|
||||
"mergeDuplicatesFailed": "Failed to merge duplicates",
|
||||
"mergeDuplicatesNoneFound": "No duplicates found",
|
||||
"mergeDuplicatesSuccess": "{count, plural, one {Merged 1 duplicate item} other {Merged {count} duplicate items}}"
|
||||
},
|
||||
"feed": {
|
||||
"title": "Feed",
|
||||
|
||||
@@ -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é",
|
||||
|
||||
Reference in New Issue
Block a user