144 Commits

Author SHA1 Message Date
gilles ffe28cc4e3 feat(ui): composant Modal réutilisable (overlay + Escape) 2026-05-24 15:40:57 +02:00
gilles 1ca2d986ce feat(shopping): client API TypeScript typé 2026-05-24 15:39:32 +02:00
gilles e4c3edc72b test(shopping): 9 tests d'intégration CRUD listes et articles
Couvre : création liste, listing, ajout article custom, validation (422),
cocher/décocher, suppression, finish avec report des non cochés, 404, stores, recherche produits.
2026-05-24 15:37:15 +02:00
gilles 3e4c209417 fix(shopping): refresh(item, ["product"]) dans update_item pour éviter MissingGreenlet 2026-05-24 15:34:21 +02:00
gilles 917a57fadc feat(shopping): 10 endpoints CRUD listes et articles
Ajoute backend/app/api/shopping.py avec les routes :
- GET/POST /api/shopping/lists
- GET/PATCH/DELETE /api/shopping/lists/{id}
- POST/PATCH/DELETE /api/shopping/lists/{id}/items
- GET /api/shopping/stores
- GET /api/shopping/products
- POST /api/shopping/lists/{id}/finish (report des articles non cochés)

Enregistre le router dans main.py avec le prefix /api/shopping.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 15:32:45 +02:00
gilles f715061bb2 refactor(shopping): model_config sur tous les Response, suppression Field inutile 2026-05-24 15:30:26 +02:00
gilles 4e7a863431 feat(shopping): schémas Pydantic listes et articles + volume dev backend 2026-05-24 15:28:43 +02:00
gilles e3117f3aaf refactor(shopping): typage relation product avec syntaxe X | None (cohérence) 2026-05-24 15:27:07 +02:00
gilles 682b17f1f4 feat(shopping): relation product sur ListItem 2026-05-24 15:23:29 +02:00
gilles d6722bff97 docs: plan Phase 3 mis à jour — liste magique + modal édition liste 2026-05-24 15:17:45 +02:00
gilles 96e9375337 docs: plan Phase 3 — liste de courses (10 tâches) 2026-05-24 15:06:08 +02:00
gilles 134678a6f1 feat(todos): favicon maison + mode édition double-tap/double-clic
- Favicon SVG maison Gruvbox orange sur fond sombre
- TodoForm accepte initialValues et submitLabel pour l'édition
- SwipeableRow détecte le double-tap (< 300ms, sans déplacement)
- TodosPage : double-tap mobile / double-clic laptop ouvre l'édition

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 14:54:47 +02:00
gilles 6ef64dfe1c fix(home): tuiles d'accueil navigables via Link React Router
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 14:48:12 +02:00
gilles d31cde3d59 docs: commandes de démarrage claires dans le README
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 14:25:55 +02:00
gilles b87c96ceab chore: ajout .gitignore, CLAUDE.md, design system et docs Phase 2
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 14:10:18 +02:00
gilles 2b34abf4b0 fix: nginx proxy /api/ vers backend + routes shopping et notes manquantes
- Ajoute location /api/ dans nginx.conf pour proxifier les requêtes API
- Crée ShoppingPage et NotesPage (placeholders phase suivante)
- Enregistre les routes /shopping et /notes dans App.tsx

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 14:09:36 +02:00
gilles 04012f5817 fix(todos): typage union explicite pour l'état priority dans TodoForm 2026-05-24 13:20:32 +02:00
gilles 9d852c3bf1 fix(todos): handleResponse gère 204 No Content (suppression sans SyntaxError) 2026-05-24 12:37:03 +02:00
gilles 2e1f3a77fb fix(todos): types union TodoCreate, gestion erreurs handlers, transition SwipeableRow réactive
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 12:18:20 +02:00
gilles 8aeb45387d feat(todos): page TodosPage — vue mobile swipeable + vue laptop tableau filtrable
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 12:13:56 +02:00
gilles 580aab822a feat(todos): composant TodoForm (rapide mobile / étendu laptop) 2026-05-24 12:10:31 +02:00
gilles 9e6e0902ab feat(todos): composant SwipeableRow (swipe touch, seuil 80px) 2026-05-24 12:07:38 +02:00
gilles eea004f53b fix(todos): deleteTodo utilise handleResponse pour cohérence 2026-05-24 12:06:34 +02:00
gilles e89d2ff4f1 feat(todos): client API TypeScript — Todo interface + 5 fonctions fetch 2026-05-24 12:05:44 +02:00
gilles b5f0453cdd fix(todos): datetime query params typés FastAPI, ORDER BY déterministe
- Changer due_after/due_before de str | None vers datetime | None pour typage FastAPI
- FastAPI parse et valide automatiquement, retourne 422 si format invalide (pas 500)
- Supprimer le parsing manuel datetime.fromisoformat() qui levait ValueError brute
- Ajouter ORDER BY déterministe: due_date ASC NULLS LAST, created_at DESC
  évite les réordonnances aléatoires entre requêtes PostgreSQL

Tests: 15/15 passent ✓

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 12:02:37 +02:00
gilles a3704a2b27 feat(todos): endpoints CRUD + postpone — 15 tests passent
Ajoute les 5 endpoints REST (list, create, update, delete, postpone),
enregistre le routeur sur /api/todos, et corrige l'isolation des sessions
de test via NullPool + dependency_overrides dans conftest.py.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 09:20:53 +02:00
gilles 861f6497bb fix(todos): Literal types pour status/priority/days, Field default_factory pour tags 2026-05-24 09:17:39 +02:00
gilles 3591972014 test(todos): schémas Pydantic + 9 tests d'intégration todos (en échec)
Ajoute les schémas Pydantic TodoCreate/TodoUpdate/PostponeRequest/TodoResponse,
la fixture db_session dans conftest, et 9 tests d'intégration contre PostgreSQL
réel — tous en échec car les endpoints /api/todos/ n'existent pas encore.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 09:13:58 +02:00
gilles 53bb8bd27a fix: CORS_ORIGINS aligné sur port frontend 3001 2026-05-24 05:32:28 +02:00
gilles 9041b24384 chore: Phase 1 complète — socle technique HomeHub opérationnel
- Corrige le seed pour vérifier l'existence des tables avant insertion
  (évite l'échec au démarrage si les migrations n'ont pas encore été appliquées)
- Ajuste le port frontend de 3000 à 3001 (port 3000 occupé sur l'hôte)
- Migrations Alembic : schémas notes, shopping, todos créés avec succès
- Seed : 114 produits et 9 magasins chargés
- Endpoint /api/health : {"status":"ok"}
- Tests : 6/6 passent (health + media)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 05:30:53 +02:00
gilles 99b9f1641e chore: environnement dev local (hot reload backend + frontend) 2026-05-24 05:23:53 +02:00
gilles 0903115687 feat: dockerfile frontend nginx + cache statique 2026-05-24 05:23:16 +02:00
gilles 25a31f1f24 feat: layout responsive mobile (bottom nav) / laptop (sidebar) + page d'accueil 2026-05-24 05:22:45 +02:00
gilles e8aa9d6f3b feat: PWA configurée — service worker, manifest, icônes 2026-05-24 05:21:29 +02:00
gilles 137213241b feat: tailwind CSS + design system Gruvbox seventies intégré
- Ajoute postcss.config.js et tailwind.config.ts avec tokens CSS mappés
- Copie tokens.css dans frontend/src/design-system/
- Met à jour index.css avec import tokens + directives Tailwind
- Adapte ui-kit.jsx en ui-kit.tsx (UMD → ESM, exports nommés)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 05:19:33 +02:00
gilles 1877963f15 feat: scaffold frontend React 18 + Vite 5 + TypeScript
Mise en place de la structure de base du frontend HomeHub : React 18,
Vite 5, TypeScript strict, React Router v6, Tailwind CSS et vite-plugin-pwa
installés. Composants placeholder Layout et HomePage pour que le build
compile sans erreur. Build de production vérifié (dist/ généré, 0 erreur TS).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 05:15:21 +02:00
gilles 5a5997aa55 feat: seed données initiales (114 produits + 9 magasins) au démarrage 2026-05-24 05:08:50 +02:00
gilles cb85801061 feat: module media — upload, miniatures Pillow et suppression
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 05:05:37 +02:00
gilles 199565e77c feat: migration initiale — schémas todos/shopping/notes et toutes les tables 2026-05-24 05:02:24 +02:00
gilles 94b971cdf3 feat: endpoint GET /api/health + tests
Implémentation TDD : test écrit en premier (phase rouge), puis
app.main, app.api.health et app.api.media créés pour le faire passer.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 04:59:36 +02:00
gilles be5c34e4f7 feat: modèles SQLAlchemy pour todos, shopping et notes 2026-05-24 04:51:21 +02:00
gilles ee00848fdc feat: configuration FastAPI et moteur SQLAlchemy async 2026-05-24 04:49:41 +02:00
gilles b46c8351df chore: dockerfile backend et dépendances python 2026-05-24 04:48:27 +02:00
gilles 8bc69bb705 chore: structure initiale backend et docker-compose 2026-05-24 04:45:16 +02:00