feat(planning): panier des restes dans l'en-tête (lecture seule + jeter) #50

Merged
kyuno merged 1 commit from feat/leftovers-basket into main 2026-09-06 00:32:42 +02:00
Owner

Chantier « gestion des restes » (issue #34) — PR 3/4 : le panier. Toujours pas de glisser-déposer (PR 4) — ici, consultation + jet.

LeftoversBasket

Une icône 🧺 (avec badge de compte) dans .planning-page__header, à côté de WeekNavigator. Ouvre un popover listant les restes encore disponibles de la semaine affichée — même patron montage conditionnel + fermeture au mousedown extérieur que le CalendarPopover de WeekNavigator.

Les lignes sont dérivées à chaque rendu de planning par collectLeftoverLines (leftovers-basket.ts, pur) : chaque item « frais » (sourceItem === null) dont computeAvailableLeftover (@batch-cooking/shared) est > 0. Le leftoverUses que cette fonction attend est reconstitué depuis le tableau plat planning.items (les items « restes » qui pointent vers l'item) — aucun aller-retour API supplémentaire, exactement le partage « une formule, deux appelants » que documente computeAvailableLeftover.

Chaque ligne : recette, jour/repas d'origine, portions restantes, bouton « Jeter » → PATCH /planning/items/:id/discard-leftover (nouveau apiClient.discardLeftover). La réponse (l'item mis à jour) est patchée dans planning.items par id (handleLeftoverDiscarded sur PlanningPage), donc le panier se recalcule. État vide quand rien ne reste.

Tests

apps/web/cypress/e2e/leftovers-basket.cy.ts (mode layout, GET /planning mocké) :

  • badge de compte = nombre d'items frais avec un pool restant ;
  • ouverture du popover, contenu d'une ligne (recette + origine + « 1 en restes ») ;
  • fermeture au clic extérieur ;
  • état vide ;
  • « Jeter » → PATCH appelé, ligne retirée, badge disparu.

Vérifié localement : 3/3. build + lint verts.

i18n : planning.leftovers.*. Docs : frontend-architecture.md (arbo + description du panier).

🤖 Generated with Claude Code

**Chantier « gestion des restes » ([issue #34](https://git.dev.kyuno.fr/kyuno/batchCooking/issues/34)) — PR 3/4 : le panier.** Toujours pas de glisser-déposer (PR 4) — ici, consultation + jet. ## `LeftoversBasket` Une icône 🧺 (avec badge de compte) dans `.planning-page__header`, à côté de `WeekNavigator`. Ouvre un popover listant les restes encore disponibles de la semaine affichée — même patron montage conditionnel + fermeture au `mousedown` extérieur que le `CalendarPopover` de `WeekNavigator`. Les lignes sont **dérivées à chaque rendu** de `planning` par `collectLeftoverLines` (`leftovers-basket.ts`, pur) : chaque item « frais » (`sourceItem === null`) dont `computeAvailableLeftover` (`@batch-cooking/shared`) est `> 0`. Le `leftoverUses` que cette fonction attend est **reconstitué depuis le tableau plat `planning.items`** (les items « restes » qui pointent vers l'item) — aucun aller-retour API supplémentaire, exactement le partage « une formule, deux appelants » que documente `computeAvailableLeftover`. Chaque ligne : recette, jour/repas d'origine, portions restantes, bouton **« Jeter »** → `PATCH /planning/items/:id/discard-leftover` (nouveau `apiClient.discardLeftover`). La réponse (l'item mis à jour) est patchée dans `planning.items` par id (`handleLeftoverDiscarded` sur `PlanningPage`), donc le panier se recalcule. État vide quand rien ne reste. ## Tests `apps/web/cypress/e2e/leftovers-basket.cy.ts` (mode layout, `GET /planning` mocké) : - badge de compte = nombre d'items frais avec un pool restant ; - ouverture du popover, contenu d'une ligne (recette + origine + « 1 en restes ») ; - fermeture au clic extérieur ; - état vide ; - « Jeter » → `PATCH` appelé, ligne retirée, badge disparu. **Vérifié localement : 3/3.** `build` + `lint` verts. i18n : `planning.leftovers.*`. Docs : `frontend-architecture.md` (arbo + description du panier). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
kyuno added 1 commit 2026-09-06 00:16:19 +02:00
feat(planning): panier des restes dans l'en-tête (lecture seule + jeter)
All checks were successful
CI / lint (push) Successful in 4m15s
CI / build (push) Successful in 4m12s
CI / intent-service-test (push) Successful in 4m55s
CI / e2e (push) Successful in 7m57s
CI / test (push) Successful in 16m14s
8278878898
PR 3/4 du chantier « gestion des restes » (issue #34).

`LeftoversBasket` (`features/planning/`) : une icône 🧺 avec badge de
compte dans l'en-tête du planning, à côté de `WeekNavigator`. Ouvre un
popover listant les restes encore disponibles de la semaine affichée —
même patron montage conditionnel + fermeture au `mousedown` extérieur que
`CalendarPopover`.

Les lignes sont dérivées à chaque rendu de `planning.items` par
`collectLeftoverLines` (`leftovers-basket.ts`, pur) : chaque item « frais »
(`sourceItem === null`) dont `computeAvailableLeftover` est `> 0`, le
`leftoverUses` étant reconstitué depuis le tableau plat (les items
« restes » qui pointent vers lui) — aucun aller-retour API en plus.

Chaque ligne : recette, jour/repas d'origine, portions restantes, bouton
« Jeter » → `PATCH /planning/items/:id/discard-leftover` (`apiClient.
discardLeftover`), la réponse est patchée dans `planning.items` par id
(`handleLeftoverDiscarded`). État vide quand rien ne reste.

Le glisser-déposer d'un reste sur un autre créneau arrive en PR 4.

Tests : `leftovers-basket.cy.ts` (mode layout) — badge de compte, ouverture
/ fermeture au clic extérieur, contenu d'une ligne, état vide, « Jeter »
qui appelle le PATCH et retire la ligne. Vérifié localement, 3/3.

i18n : `planning.leftovers.*`. Docs : `frontend-architecture.md`.

Réf #34

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
kyuno merged commit 25b4fc97f0 into main 2026-09-06 00:32:42 +02:00
Sign in to join this conversation.
No reviewers
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#50
No description provided.