Onboarding : états vides des pages Transactions et Budget #353

Closed
opened 2026-09-26 12:24:30 +00:00 by maximus · 0 comments
Owner

Vague planned-2026-10-03-onboarding-phase1 (séance /plan-run du 2026-10-03, spec + /review-spec du 2026-09-25, verdict APPROUVÉ après intégration). Les fichiers spec-decisions-onboarding-phase1.md / spec-plan-onboarding-phase1.md sont ignorés par git : ce corps est auto-suffisant, ne pas chercher le spec. Analyse d'origine : docs/analyse-onboarding-2026-09.md.

Règles de la vague : pile linéaire (chaque PR part de la précédente) ; ne pas toucher CHANGELOG.md / CHANGELOG.fr.md avant #357 qui les centralise ; FR + EN pour toute clé i18n (.claude/rules/i18n.md) ; aucune migration DB ; aucune chaîne en dur dans les composants.

Objectif

Transactions et Budget à base vide disent « importez d'abord » avec un bouton vers Import, sans toucher à leurs états « sans résultat » actuels.

Tâches

  • src/hooks/useTransactions.ts : exporter transactionsReducer + initialTransactionsState (reducer privé aujourd'hui en :80) ; état totalInDb: number | null, chargé une fois au montage avec les catégories et les sources via getTransactionCount() ; TransactionsPage.tsx rend EmptyState (« Aucune transaction pour l'instant. Importez d'abord vos relevés bancaires. », bouton « Importer des transactions » → /import) quand totalInDb === 0 et !isLoading, à la place de la barre de filtres, de la table et de la pagination ; sinon inchangé
  • src/hooks/useBudget.ts : exporter budgetReducer + état initial (privé en :47) ; état totalInDb ; BudgetPage.tsx rend EmptyState (« Le budget se construit sur vos transactions. Importez d'abord vos relevés bancaires. », même bouton) à la place de FilterPanel + BudgetTable quand totalInDb === 0, en gardant le titre, PageHelp et TemplateActions ; RequireFeature feature="budget" dans App.tsx:123-125 inchangé
  • Clés i18n FR + EN : transactions.empty.*, budget.empty.*

Pourquoi un compteur global : le filtre par défaut de Transactions est « depuis le 1er janvier » (useTransactions.ts:54-61), donc rows.length === 0 ne distingue pas « base vide » de « rien cette année ».

Fichiers concernés

  • src/hooks/useTransactions.ts + src/hooks/useTransactions.test.ts (nouveau)
  • src/hooks/useBudget.ts + src/hooks/useBudget.test.ts (existant, à étendre)
  • src/pages/TransactionsPage.tsx, src/pages/BudgetPage.tsx
  • src/i18n/locales/fr.json, src/i18n/locales/en.json

Depends on

Critères d'acceptation

  • Tests des deux reducers : poser totalInDb ne modifie ni filters, ni sort, ni page ; totalInDb 0 puis N > 0 → la table est rendue
  • Base vide : Transactions et Budget affichent l'état vide avec le bouton vers /import
  • Base non vide, filtre sans résultat : TransactionTable affiche toujours « Aucune transaction trouvée » ; BudgetTable affiche toujours « Aucune catégorie trouvée » quand rows est vide
  • npm test, npm run build verts

Review caveats

  • (ARCHITECTURE, résolu) Reducers exportés avec nommage préfixé.

Décisions prises en planification

  • Case 5 de la liste = « une transaction classée à la main » (is_manually_categorized = 1) et non « règle créée » ni « transactions catégorisées » : le seed IPC met 180 mots-clés dans tout profil neuf et le wizard catégorise pendant l'import (useImportWizard.ts:1016).
  • Ordre des vagues : planned-2026-09-24-paiements s'exécute avant celle-ci (fichiers partagés : fr.json, en.json, CHANGELOG, architecture.md, guide-utilisateur.md) ; partir d'un main qui contient déjà ses clés.

Spec source

spec-plan-onboarding-phase1.md (local, ignoré par git)

Vague `planned-2026-10-03-onboarding-phase1` (séance `/plan-run` du 2026-10-03, spec + `/review-spec` du 2026-09-25, verdict APPROUVÉ après intégration). Les fichiers `spec-decisions-onboarding-phase1.md` / `spec-plan-onboarding-phase1.md` sont **ignorés par git** : ce corps est auto-suffisant, ne pas chercher le spec. Analyse d'origine : `docs/analyse-onboarding-2026-09.md`. Règles de la vague : pile linéaire (chaque PR part de la précédente) ; **ne pas toucher `CHANGELOG.md` / `CHANGELOG.fr.md`** avant #357 qui les centralise ; FR + EN pour toute clé i18n (`.claude/rules/i18n.md`) ; aucune migration DB ; aucune chaîne en dur dans les composants. ## Objectif Transactions et Budget à base vide disent « importez d'abord » avec un bouton vers Import, sans toucher à leurs états « sans résultat » actuels. ## Tâches - [ ] `src/hooks/useTransactions.ts` : exporter `transactionsReducer` + `initialTransactionsState` (reducer privé aujourd'hui en `:80`) ; état `totalInDb: number | null`, chargé une fois au montage avec les catégories et les sources via `getTransactionCount()` ; `TransactionsPage.tsx` rend `EmptyState` (« Aucune transaction pour l'instant. Importez d'abord vos relevés bancaires. », bouton « Importer des transactions » → `/import`) quand `totalInDb === 0` et `!isLoading`, à la place de la barre de filtres, de la table et de la pagination ; sinon inchangé - [ ] `src/hooks/useBudget.ts` : exporter `budgetReducer` + état initial (privé en `:47`) ; état `totalInDb` ; `BudgetPage.tsx` rend `EmptyState` (« Le budget se construit sur vos transactions. Importez d'abord vos relevés bancaires. », même bouton) à la place de `FilterPanel` + `BudgetTable` quand `totalInDb === 0`, en gardant le titre, `PageHelp` et `TemplateActions` ; `RequireFeature feature="budget"` dans `App.tsx:123-125` inchangé - [ ] Clés i18n FR + EN : `transactions.empty.*`, `budget.empty.*` Pourquoi un compteur global : le filtre par défaut de Transactions est « depuis le 1er janvier » (`useTransactions.ts:54-61`), donc `rows.length === 0` ne distingue pas « base vide » de « rien cette année ». ## Fichiers concernés - `src/hooks/useTransactions.ts` + `src/hooks/useTransactions.test.ts` (nouveau) - `src/hooks/useBudget.ts` + `src/hooks/useBudget.test.ts` (existant, à étendre) - `src/pages/TransactionsPage.tsx`, `src/pages/BudgetPage.tsx` - `src/i18n/locales/fr.json`, `src/i18n/locales/en.json` ## Depends on - #352 ## Critères d'acceptation - [ ] Tests des deux reducers : poser `totalInDb` ne modifie ni `filters`, ni `sort`, ni `page` ; `totalInDb` 0 puis N > 0 → la table est rendue - [ ] Base vide : Transactions et Budget affichent l'état vide avec le bouton vers `/import` - [ ] Base non vide, filtre sans résultat : `TransactionTable` affiche toujours « Aucune transaction trouvée » ; `BudgetTable` affiche toujours « Aucune catégorie trouvée » quand `rows` est vide - [ ] `npm test`, `npm run build` verts ## Review caveats - (ARCHITECTURE, résolu) Reducers exportés avec nommage préfixé. ## Décisions prises en planification - Case 5 de la liste = « une transaction classée à la main » (`is_manually_categorized = 1`) et non « règle créée » ni « transactions catégorisées » : le seed IPC met 180 mots-clés dans tout profil neuf et le wizard catégorise pendant l'import (`useImportWizard.ts:1016`). - Ordre des vagues : `planned-2026-09-24-paiements` s'exécute **avant** celle-ci (fichiers partagés : `fr.json`, `en.json`, CHANGELOG, `architecture.md`, `guide-utilisateur.md`) ; partir d'un `main` qui contient déjà ses clés. ## Spec source spec-plan-onboarding-phase1.md (local, ignoré par git)
maximus added this to the planned-2026-10-03-onboarding-phase1 milestone 2026-09-26 12:24:30 +00:00
maximus added the
status:ready
type:feature
source:human
labels 2026-09-26 12:24:30 +00:00
maximus changed title from Onboarding: empty states on Transactions and Budget pages to Onboarding : états vides des pages Transactions et Budget 2026-10-03 14:09:45 +00:00
maximus added
status:in-progress
and removed
status:ready
labels 2026-10-03 23:36:54 +00:00
maximus added
status:approved
and removed
status:in-progress
labels 2026-10-03 23:41:54 +00:00
maximus removed the
status:approved
label 2026-10-04 12:52:52 +00:00
Sign in to join this conversation.
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: maximus/Simpl-Resultat#353
No description provided.