feat(historique): page /historique — liste paginée des productions + gating plan (Sprint 3.7)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
da4e465125
commit
a752029c19
12 changed files with 762 additions and 1 deletions
|
|
@ -51,6 +51,43 @@ Chaque entrée suit ce format :
|
|||
- B8 : comportement actuel diffère du spec `PARCOURS_UTILISATEURS.md §2 "Quota atteint"` — affichage d'une bannière inline au lieu du modal de blocage attendu. À corriger dans un sprint dédié (non inclus dans ce clean, qui n'introduit aucune nouvelle fonctionnalité).
|
||||
|
||||
|
||||
## [Unreleased] — 2026-04-22 — Sprint 3.7 — Historique (Backend + Frontend)
|
||||
|
||||
### Added (backend)
|
||||
- `GET /simulations` — liste paginée des productions de l'utilisateur connecté.
|
||||
- Query params : `page` (défaut 1, entier ≥ 1), `limit` (défaut 20, entier entre 1 et 50).
|
||||
- Tri : `created_at DESC` côté Supabase.
|
||||
- Filtre : `user_id = profile.id` (double-protection avec RLS).
|
||||
- Projection : `id, tache, mode, score, nclc, nclc_cible, created_at` — champs lourds (`contenu`, `rapport`, `exercices`, `modele`) **exclus**.
|
||||
- Réponse : `{ data: ListItem[], pagination: { page, limit, total } }`.
|
||||
- Erreurs : `400 VALIDATION_ERROR` si `page`/`limit` invalide, `401 AUTH_REQUIRED` si JWT absent, `500 INTERNAL_ERROR` si DB down.
|
||||
- `simulationController.list(options, profile)` + interfaces `ListOptions`, `ListItem`, `ListResult`.
|
||||
- 12 nouveaux tests sur la route `GET /simulations` (186 tests backend verts, +12 vs baseline 174).
|
||||
|
||||
### Added (frontend)
|
||||
- Page `/historique` (route sous `AppLayout` + `ProtectedRoute`, remplace le placeholder `ComingSoon`).
|
||||
- `HistoriquePage` — orchestre `usePlan` + `useSimulationsList`, state local de pagination, gating plan Free via `hasAccess('dashboard')`.
|
||||
- `SimulationsList` — composant liste avec :
|
||||
- Empty state + CTA « Démarrer une simulation » → `/simulation/ee`
|
||||
- Loading skeleton (5 barres animées)
|
||||
- Error state (callout discret `border-l-danger`)
|
||||
- Aperçu flouté Free + bouton `variant="upgrade"` « Passer en Standard »
|
||||
- Pagination Précédent / Suivant (masquée si une seule page)
|
||||
- Affichage « Page X sur Y — Z simulations »
|
||||
- `SimulationListItem` — carte item : date relative, libellé de tâche (`formatTache`), score `/20`, `NCLC atteint / cible`, badges « Examen » et « En cours » (rapport non prêt). Clic → `/rapport/:id`.
|
||||
- `useSimulationsList(page, limit)` — hook TanStack Query, clé `['simulations', 'list', page, limit]`, `staleTime: 30s`, `placeholderData: keepPreviousData` pour éviter le flash de squelette au changement de page.
|
||||
- `listSimulations(page, limit)` dans `entities/production/api.ts` — wrap `apiFetch` + `URLSearchParams`.
|
||||
- Types `SimulationListItem` et `SimulationsListResponse` dans `entities/production/types.ts`.
|
||||
- `src/shared/lib/date.ts` — helper `formatRelativeDate(iso, now?)` basé sur `Intl.RelativeTimeFormat('fr', { numeric: 'auto' })`. Seuils : secondes → minutes → heures → jours → semaines → mois → années. Zéro dépendance.
|
||||
- 18 nouveaux tests frontend (7 `date.test.ts` + 11 `SimulationsList.test.tsx`).
|
||||
|
||||
### Notes
|
||||
- Les simulations avec `score === null` (en cours ou correction échouée) sont **affichées** avec un badge « En cours ». Clic → `/rapport/:id` — `RapportPage` gère le cas `REPORT_NOT_READY` (FTD-21) en redirigeant vers `/simulation/ee`.
|
||||
- `BlurredPreview` dupliqué localement dans `SimulationsList` (pattern équivalent à `BlurredSection` de `RapportPage`). À extraire en `shared/` si le pattern se répète dans un 3ᵉ endroit — pas fait dans ce sprint.
|
||||
- Pagination : Précédent/Suivant (MVP) retenu contre scroll infini. Le choix sera revu si l'historique dépasse 100 items en prod.
|
||||
- Tests frontend : **102/102 verts** (+18 vs baseline 84).
|
||||
|
||||
|
||||
## [Unreleased] — 2026-04-22 — Sprint 3.6b — Qualité correction — Frontend
|
||||
|
||||
### Added
|
||||
|
|
|
|||
|
|
@ -55,6 +55,15 @@
|
|||
- Gating plan conforme PLANS_TARIFAIRES.md : revelation/diagnostic/conseil_nclc tous plans ; criteres/exercices/modele Standard+
|
||||
- Tests : 84 verts (+8 vs baseline — floutage + helpers lib + ExerciceInteractive)
|
||||
|
||||
## Sprint 3.7 — Historique ✅
|
||||
- Backend : `GET /simulations` — liste paginée des productions de l'utilisateur connecté (page/limit, tri `created_at DESC`, projection légère). 186 tests backend verts.
|
||||
- Frontend : page `/historique` (route sous AppLayout), liste d'items (date relative, tâche, score /20, NCLC, badge Examen / En cours), pagination Précédent/Suivant, clic → `/rapport/:id`.
|
||||
- Gating plan : Free → aperçu flouté + CTA « Passer en Standard » (`hasAccess(plan, 'dashboard')`) ; Standard + Premium → liste complète.
|
||||
- État vide : CTA « Démarrer une simulation ».
|
||||
- Hook `useSimulationsList(page, limit)` — TanStack Query, `staleTime: 30s`, `keepPreviousData` pour transitions fluides.
|
||||
- Helper `formatRelativeDate` (Intl.RelativeTimeFormat, zéro dépendance).
|
||||
- 102 tests frontend verts (+18 vs baseline 84).
|
||||
|
||||
## Sprint 3.6c — Analyse patterns (Premium)
|
||||
- Backend : GET /users/patterns — agrégation SQL erreurs_codes sur 5 dernières productions
|
||||
- Backend : exercices long terme générés par DeepSeek sur patterns confirmés (≥ 3/5)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue