# Améliorations Sprint — Jardin App > **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. **Goal:** Améliorer l'UI (settings taille/responsive), nettoyer la BDD, ajouter 404, sélection cases grille pour plantation, astuce du jour, médias galerie, export JSON, observations frontend. **Architecture:** Frontend Vue 3 + Tailwind (CSS vars pour tailles), backend FastAPI + SQLModel + SQLite. Les settings de taille sont stockés dans `user_settings` (table clé-valeur) et appliqués via des variables CSS sur `:root` dans App.vue au chargement. **Tech Stack:** Vue 3 TypeScript, Tailwind CSS, FastAPI, SQLModel, SQLite, Docker Compose --- ## Contexte du projet - Backend: `/home/gilles/Documents/vscode/jardin/backend/` sur port 8060 (Docker) - Frontend: `/home/gilles/Documents/vscode/jardin/frontend/` sur port 8061 (Docker) - DB: `/home/gilles/Documents/vscode/jardin/data/jardin.db` - Rebuild backend: `docker compose build backend && docker compose up -d backend` (depuis la racine du projet) - Rebuild frontend: `docker compose build frontend && docker compose up -d frontend` - Les `.vue` et `.ts` sont dans `frontend/src/` - Table `user_settings` : colonnes `cle` (str, PK), `valeur` (str) - API settings: `GET /api/settings` → `{cle: valeur, ...}` / `PUT /api/settings` → body `{cle: valeur, ...}` - Thème Gruvbox Dark: bg=#282828, bg-soft=#3c3836, bg-hard=#1d2021, text=#ebdbb2, green=#b8bb26, etc. --- ## Task 1: Settings UI — Paramètres de taille d'interface **Priorité:** Haute (demandé explicitement) **Files:** - Modify: `frontend/src/views/ReglagesView.vue` - Modify: `frontend/src/App.vue` **Paramètres à ajouter (clés dans user_settings):** - `ui_font_size` : taille texte général (12–20px, défaut 14) - `ui_menu_font_size` : taille texte menu latéral (11–18px, défaut 13) - `ui_menu_icon_size` : taille icônes menu (14–28px, défaut 18) - `ui_thumb_size` : taille miniatures images/vidéos (60–200px, défaut 96) **Step 1: Modifier ReglagesView.vue — ajouter section Interface** Ajouter une nouvelle section avant la section "Général" dans `ReglagesView.vue` : ```vue

Interface

Ajustez les tailles d'affichage. Les changements sont appliqués instantanément.

{{ uiSizes[s.key] }}{{ s.unit }}
{{ uiSavedMsg }}
``` Dans ` ``` **Step 2: Ajouter route catch-all dans router/index.ts** Ajouter en dernière position dans le tableau `routes` : ```typescript { path: '/:pathMatch(.*)*', component: () => import('@/views/NotFoundView.vue') }, ``` **Step 3: Rebuild et tester** ```bash docker compose build frontend && docker compose up -d frontend ``` Aller sur http://10.0.1.109:8061/page-inexistante → vérifier 404 page. **Step 4: Commit** ```bash git add frontend/src/views/NotFoundView.vue frontend/src/router/index.ts git commit -m "feat(frontend): page 404 avec redirect vers dashboard" ``` --- ## Task 5: B3 — Populer la table lunarcalendarentry **Priorité:** Haute **Contexte:** La table `lunarcalendarentry` existe (0 lignes). Le service lunar est dans `backend/app/services/lunar.py` et retourne les données par mois via `/api/lunar?month=YYYY-MM`. **Files:** - Read first: `backend/app/routers/lunar.py` - Read first: `backend/app/models/settings.py` (pour voir LunarCalendarEntry) - Modify: `backend/app/routers/lunar.py` (auto-persist after compute) **Step 1: Lire les fichiers concernés** ```bash cat /home/gilles/Documents/vscode/jardin/backend/app/routers/lunar.py cat /home/gilles/Documents/vscode/jardin/backend/app/services/lunar.py | head -80 ``` **Step 2: Vérifier le modèle LunarCalendarEntry** ```bash cat /home/gilles/Documents/vscode/jardin/backend/app/models/settings.py ``` **Step 3: Modifier le router lunar pour persister les données** Dans `backend/app/routers/lunar.py`, après avoir calculé les données du mois, sauvegarder chaque jour dans `lunarcalendarentry`. Pattern upsert : ```python from app.models.settings import LunarCalendarEntry from sqlmodel import Session, select from app.database import get_session # Dans l'endpoint GET /api/lunar?month=YYYY-MM : # Après avoir calculé days_data, persister : for day_data in days_data: existing = session.exec( select(LunarCalendarEntry).where(LunarCalendarEntry.date == day_data['date']) ).first() if not existing: entry = LunarCalendarEntry( date=day_data['date'], phase=day_data.get('phase'), illumination=day_data.get('illumination'), type_jour=day_data.get('type_jour'), # ... autres champs selon le modèle ) session.add(entry) session.commit() ``` **Step 4: Pré-populer les 3 prochains mois au démarrage** Dans `backend/app/main.py`, dans le lifespan, après la migration, appeler l'endpoint lunar pour les 3 mois autour de la date courante pour pré-remplir la table. **Step 5: Vérifier** ```bash sqlite3 /home/gilles/Documents/vscode/jardin/data/jardin.db "SELECT count(*) FROM lunarcalendarentry;" # Doit être > 0 après restart ``` **Step 6: Commit** ```bash git commit -m "feat(lunar): persister les données calculées dans lunarcalendarentry" ``` --- ## Task 6: Grille jardin — Sélection de case pour ajouter une plantation **Priorité:** Haute (demandé explicitement : "je peux sélectionner des cases de la grille jardin pour ajouter une plantation") **Files:** - Modify: `frontend/src/views/JardinDetailView.vue` - Read first: `frontend/src/api/plants.ts` et `frontend/src/api/gardens.ts` pour les types **Ce que ça fait:** - Clic sur une case libre → modal s'ouvre avec formulaire de création de plantation - Le formulaire propose: plante (liste déroulante), date plantation, notes - POST vers /api/plantings avec `garden_id`, `plant_id`, `cell_row`, `cell_col` - Après succès: la case passe en "occupé" (orange) **Step 1: Lire les fichiers API nécessaires** ```bash cat /home/gilles/Documents/vscode/jardin/frontend/src/api/plants.ts | head -40 cat /home/gilles/Documents/vscode/jardin/frontend/src/api/gardens.ts | head -40 ``` **Step 2: Ajouter le modal de plantation dans JardinDetailView.vue** Ajouter dans le `