Import TheMealDB : "Importer" reste bloqué sans explication pour les ingrédients comptés sans unité (ex. œufs) #5

Open
opened 2026-08-27 12:49:26 +02:00 by kyuno · 0 comments
Owner

Contexte

En important une recette depuis TheMealDB dont au moins un ingrédient est compté à l'unité sans mot d'unité dans le texte source (ex. "4 Egg Yolks", "2 Egg", "1 onion" — très courant), le bouton "Importer" du formulaire "Revoir l'import" reste indéfiniment désactivé, sans aucun message d'erreur ni indication visuelle de la ligne en cause. L'utilisateur n'a aucun moyen de comprendre pourquoi le formulaire est bloqué, ni de le débloquer (il n'y a pas de champ "unité" vide visible à corriger — voir "Détail" ci-dessous).

Reproduit avec la recette "Flan" (externalId 53322, https://www.themealdb.com/meal/53322), dont les ingrédients "4 Egg Yolks" / "2 Egg" sont bien reconnus comme l'ingrédient "Œuf" mais avec unit: null.

Cause

Deux endroits :

  1. apps/api/src/lib/ingredient-matcher.ts (matchUnit) — n'a aucune valeur de repli quand le texte restant après extraction de la quantité (extractQuantity) ne contient aucun mot d'unité (ex. "4 Egg Yolks" → quantité 4, reste "Egg Yolks" : aucun token ne correspond à une unité du catalogue). Pour un ingrédient dont l'unité est de type COUNT (piece, "unité"), ce cas devrait pouvoir retomber sur piece par défaut plutôt que sur null — une quantité comptée sans mot d'unité explicite (juste "4 œufs") est le cas le plus courant, pas un cas limite.

  2. apps/web/src/features/recipes/RecipeImportForm.tsx:215-223 (canSubmit) — exige unitId !== null pour chaque ligne d'ingrédient résolue avant d'activer "Importer" :

    const canSubmit =
      ...
      ingredientLines.every((line) => Number(line.quantity) > 0 && line.unitId !== null) &&
      ...
    

    Rien dans l'UI (IngredientRow) ne signale visuellement qu'une ligne précise a une unité manquante (pas de bordure/erreur sur le <select> "Choisir une unité"), et aucun message n'explique pourquoi le bouton "Importer" est désactivé — contrairement à la section "Ingrédients à compléter" qui, elle, a un traitement explicite pour les ingrédients non reconnus. Un ingrédient reconnu mais avec unité manquante n'a aucun traitement équivalent.

Reproduction

  1. Se connecter, ouvrir le planning, cliquer "Ajouter une recette" sur un créneau.
  2. Onglet "TheMealDB", sélectionner "Flan" (ou toute recette avec un ingrédient compté à l'unité, ex. "X eggs", "X onions").
  3. Dans "Revoir l'import" : les lignes "Œuf" (x2) affichent "Choisir une unité" (aucune unité pré-sélectionnée), alors que "Sucre"/"Lait" ont bien "g".
  4. Résoudre la section "Ingrédients à compléter" (retirer ou choisir un ingrédient pour "1 vanilla pod" / "To taste Dulce de leche") : le bouton "Importer" reste désactivé quand même, sans aucune explication — même en choisissant manuellement "unité" dans les deux <select> "Œuf", il faut deviner que c'est ça qui bloquait.

Impact

Étant donné que la quasi-totalité des recettes réelles contiennent au moins un ingrédient compté à l'unité (œufs, oignons, gousses d'ail non suivies du mot "clove", etc.), ce bug bloque silencieusement l'import d'une grande partie du catalogue TheMealDB — sans qu'aucun message n'oriente l'utilisateur vers la correction (choisir manuellement "unité" sur la ligne concernée).

Pistes de correction

  • Faire retomber matchUnit (ou son appelant translateRecipeIngredients) sur l'unité piece par défaut quand l'ingrédient matché est de type COUNT et qu'aucune unité n'a pu être extraite du texte.
  • Dans tous les cas, signaler visuellement dans IngredientRow/RecipeImportForm la ou les lignes dont l'unité est manquante (et pourquoi "Importer" est désactivé), au même titre que la section "Ingrédients à compléter" pour les ingrédients non reconnus.

🤖 Filed by Claude Code

## Contexte En important une recette depuis **TheMealDB** dont au moins un ingrédient est compté à l'unité sans mot d'unité dans le texte source (ex. "4 Egg Yolks", "2 Egg", "1 onion" — très courant), le bouton **"Importer"** du formulaire "Revoir l'import" reste **indéfiniment désactivé**, sans aucun message d'erreur ni indication visuelle de la ligne en cause. L'utilisateur n'a aucun moyen de comprendre pourquoi le formulaire est bloqué, ni de le débloquer (il n'y a pas de champ "unité" vide visible à corriger — voir "Détail" ci-dessous). Reproduit avec la recette "Flan" (`externalId` `53322`, https://www.themealdb.com/meal/53322), dont les ingrédients "4 Egg Yolks" / "2 Egg" sont bien reconnus comme l'ingrédient "Œuf" mais avec `unit: null`. ## Cause Deux endroits : 1. **`apps/api/src/lib/ingredient-matcher.ts` (`matchUnit`)** — n'a aucune valeur de repli quand le texte restant après extraction de la quantité (`extractQuantity`) ne contient aucun mot d'unité (ex. `"4 Egg Yolks"` → quantité `4`, reste `"Egg Yolks"` : aucun token ne correspond à une unité du catalogue). Pour un ingrédient dont l'unité est de type `COUNT` (`piece`, "unité"), ce cas devrait pouvoir retomber sur `piece` par défaut plutôt que sur `null` — une quantité comptée sans mot d'unité explicite (juste "4 œufs") est le cas le plus courant, pas un cas limite. 2. **`apps/web/src/features/recipes/RecipeImportForm.tsx:215-223`** (`canSubmit`) — exige `unitId !== null` pour **chaque** ligne d'ingrédient résolue avant d'activer "Importer" : ```ts const canSubmit = ... ingredientLines.every((line) => Number(line.quantity) > 0 && line.unitId !== null) && ... ``` Rien dans l'UI (`IngredientRow`) ne signale visuellement qu'une ligne précise a une unité manquante (pas de bordure/erreur sur le `<select>` "Choisir une unité"), et aucun message n'explique pourquoi le bouton "Importer" est désactivé — contrairement à la section "Ingrédients à compléter" qui, elle, a un traitement explicite pour les ingrédients non reconnus. Un ingrédient reconnu mais avec unité manquante n'a **aucun** traitement équivalent. ## Reproduction 1. Se connecter, ouvrir le planning, cliquer "Ajouter une recette" sur un créneau. 2. Onglet "TheMealDB", sélectionner "Flan" (ou toute recette avec un ingrédient compté à l'unité, ex. "X eggs", "X onions"). 3. Dans "Revoir l'import" : les lignes "Œuf" (x2) affichent "Choisir une unité" (aucune unité pré-sélectionnée), alors que "Sucre"/"Lait" ont bien "g". 4. Résoudre la section "Ingrédients à compléter" (retirer ou choisir un ingrédient pour "1 vanilla pod" / "To taste Dulce de leche") : le bouton "Importer" reste désactivé quand même, sans aucune explication — même en choisissant manuellement "unité" dans les deux `<select>` "Œuf", il faut deviner que c'est ça qui bloquait. ## Impact Étant donné que la quasi-totalité des recettes réelles contiennent au moins un ingrédient compté à l'unité (œufs, oignons, gousses d'ail non suivies du mot "clove", etc.), ce bug bloque silencieusement l'import d'une grande partie du catalogue TheMealDB — sans qu'aucun message n'oriente l'utilisateur vers la correction (choisir manuellement "unité" sur la ligne concernée). ## Pistes de correction - Faire retomber `matchUnit` (ou son appelant `translateRecipeIngredients`) sur l'unité `piece` par défaut quand l'ingrédient matché est de type `COUNT` et qu'aucune unité n'a pu être extraite du texte. - Dans tous les cas, signaler visuellement dans `IngredientRow`/`RecipeImportForm` la ou les lignes dont l'unité est manquante (et pourquoi "Importer" est désactivé), au même titre que la section "Ingrédients à compléter" pour les ingrédients non reconnus. 🤖 Filed by [Claude Code](https://claude.com/claude-code)
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: kyuno/batchCooking#5
No description provided.