Dernière PR (4/4) du chantier « gestion des restes » (issue #34). `@dnd-kit/core` (+ `@dnd-kit/utilities`) — première et seule utilisation de DnD de l'app. `PlanningPage` monte un `<DndContext>` (Mouse + Touch + Keyboard sensors, distance d'activation 5px pour ne pas voler le clic « Jeter ») autour de la grille et du panier. - `LeftoversBasket` : chaque ligne a une poignée `⠿` `useDraggable` — le nœud draggable est la poignée elle-même (petite), pas toute la `<li>`, pour qu'une détection de collision au pointeur (`pointerWithin`, repli `closestCenter` pour le clavier) résolve proprement vers la seule case sous le curseur. `data` porte `sourceItemId`/`recipeName`/`available`. - `MealCell` : `useDroppable` (`data: { date, weekDay, meal }`), surbrillance `--drop-over` au survol. Un item « restes » (`sourceItem !== null`) porte un badge ♻️ sur sa pastille. - Au drop, `onDragEnd` ouvre `LeftoverAssignDialog` (quantité, défaut = disponible, plafonné) → `POST /planning/items/leftover` (`apiClient.assignLeftover`) → nouvel item patché dans `planning.items`. Tests : `planning-leftovers.feature` (Gherkin) — parcours complet drag → confirmation quantité → pastille ♻️ visible → compteur du panier à jour ; + jet d'un reste depuis le panier. Le drag est piloté par événements souris bruts (mousedown poignée → mousemove ×2 → mouseup cible). Vérifié localement : 2/2, et aucune régression sur `leftovers-basket.cy.ts` / `planning-page.cy.ts` / `planning.feature`. i18n : `planning.leftovers.*` (badge, poignée, dialogue). Docs : `frontend-architecture.md`. Closes #34 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
46 lines
1.3 KiB
JSON
46 lines
1.3 KiB
JSON
{
|
|
"name": "web",
|
|
"version": "0.2.0",
|
|
"private": true,
|
|
"type": "module",
|
|
"scripts": {
|
|
"dev": "vite --host 0.0.0.0",
|
|
"build": "tsc -b && vite build",
|
|
"preview": "vite preview",
|
|
"test": "echo \"no unit tests yet\" && exit 0",
|
|
"cy:open": "cypress open",
|
|
"cy:run": "cypress run",
|
|
"e2e": "start-server-and-test dev http://localhost:5173 cy:run",
|
|
"cy:run:component": "cypress run --component"
|
|
},
|
|
"dependencies": {
|
|
"@batch-cooking/date-tools": "workspace:*",
|
|
"@batch-cooking/shared": "workspace:*",
|
|
"@dnd-kit/core": "^6.3.1",
|
|
"@dnd-kit/utilities": "^3.2.2",
|
|
"i18next": "^26.3.6",
|
|
"lucide-react": "^1.32.0",
|
|
"react": "^18.3.1",
|
|
"react-dom": "^18.3.1",
|
|
"react-i18next": "^17.0.11",
|
|
"react-router-dom": "^7.18.2",
|
|
"recharts": "^2.15.0",
|
|
"socket.io-client": "^4.8.3",
|
|
"zod": "^3.25.76"
|
|
},
|
|
"devDependencies": {
|
|
"@badeball/cypress-cucumber-preprocessor": "22.2.0",
|
|
"@bahmutov/cypress-esbuild-preprocessor": "2.2.8",
|
|
"@cypress/vite-dev-server": "5.2.1",
|
|
"@types/node": "^22.9.0",
|
|
"@types/react": "^18.3.12",
|
|
"@types/react-dom": "^18.3.1",
|
|
"@vitejs/plugin-react": "^4.3.3",
|
|
"cypress": "13.17.0",
|
|
"esbuild": "0.21.5",
|
|
"sass": "^1.102.0",
|
|
"start-server-and-test": "^2.0.8",
|
|
"typescript": "^5.7.2",
|
|
"vite": "^5.4.11"
|
|
}
|
|
}
|