feat(planning): glisser-déposer un reste sur un autre créneau #51
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/leftovers-drag-drop"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Chantier « gestion des restes » (issue #34) — PR 4/4, la dernière : le glisser-déposer.
Closes #34.@dnd-kit/coreNouvelle dépendance (+
@dnd-kit/utilities) — première et seule utilisation de DnD de l'app (le réordonnancement deStepListEditorutilise des boutons haut/bas pour éviter d'en ajouter une ; ici le besoin le justifie et le support tactile/clavier vient presque gratuitement).PlanningPagemonte un<DndContext>autour de la grille + du panier :MouseSensor+TouchSensor+KeyboardSensor(plutôt quePointerSensor— même couverture, mais pilotable de façon fiable en Cypress via des évènements souris). Distance d'activation 5px → un clic sur « Jeter » ne démarre pas un drag.pointerWithin(repliclosestCenterpour le clavier) — les cases sont jointives, une stratégie par recouvrement de rectangles choisirait une voisine dès que la boîte de l'élément traîné franchit une bordure.Composants
LeftoversBasket— chaque ligne a une poignée⠿(useDraggable). Le nœud draggable est la poignée (petite), pas toute la<li>: combiné àpointerWithin, le drop résout proprement vers la seule case sous le curseur.data={ sourceItemId, recipeName, available }.MealCell—useDroppable(data: { date, weekDay, meal }), surbrillance--drop-over. Un item « restes » (sourceItem !== null) porte un badge ♻️ sur.recipe-chip--leftover.LeftoverAssignDialog(nouveau) — au drop,onDragEndl'ouvre : quantité (défaut = pool disponible, plafonnée), même style que l'étape « portions » deRecipePickerDialog. Confirme →POST /planning/items/leftover(apiClient.assignLeftover) → nouvel item patché dansplanning.items.Tests
apps/web/cypress/e2e/planning-leftovers.feature(Gherkin) :POST) → pastille ♻️ visible dans la case → compteur du panier disparu ;Le drag est piloté par évènements souris bruts (
mousedownpoignée →mousemove×2 →mouseupcible). Vérifié localement : 2/2, et aucune régression surleftovers-basket.cy.ts(3/3),planning-page.cy.ts(7/7),planning.feature(3/3).build+lintverts.i18n :
planning.leftovers.*. Docs :frontend-architecture.md.🤖 Generated with Claude Code