Onboarding : état vide du tableau de bord, liste de démarrage et bouton de réaffichage dans Paramètres #352
Labels
No labels
autopilot:pending-human
source:analyste
source:defenseur
source:human
source:medic
status:approved
status:blocked
status:in-progress
status:needs-clarification
status:needs-fix
status:ready
status:review
status:triage
type:bug
type:feature
type:infra
type:refactor
type:schema
type:security
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: maximus/Simpl-Resultat#352
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Vague
planned-2026-10-03-onboarding-phase1(séance/plan-rundu 2026-10-03, spec +/review-specdu 2026-09-25, verdict APPROUVÉ après intégration). Les fichiersspec-decisions-onboarding-phase1.md/spec-plan-onboarding-phase1.mdsont 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.mdavant #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
Un profil sans transaction ouvre un tableau de bord qui dit quoi faire : état vide + liste de démarrage à la place des widgets à 0 $. Avec des transactions, la liste reste en tête en mode compact jusqu'à complète ou masquée.
Tâches
src/components/shared/EmptyState.tsx(composant pur, aucun hook) : props{ icon, title, description, primaryAction?: { label, to } | { label, onClick, disabled? }, secondaryAction?, children? }; la variantetorend un<Link>react-router, jamaisuseNavigate; style repris de l'état vide actuel deSourceList.tsx:21-33(carte en pointillés, icône centrée)src/components/dashboard/OnboardingChecklist.tsx(pur, seul hookuseTranslation) : props{ items, done, total, mode: "expanded" | "compact", budgetReady, onHide }; titre « Liste de démarrage », compteur « 3 / 6 » (ou « 3 / 5 ») ; six lignes case + libellé ;<Link>sur chaque case non cochée vers sonto; casebudget.locked→ cadenas + libellé « Base et plus » + lien/settings/users; tant quebudgetReadyest faux : case budget neutre (ni cochée ni cadenassée) et compteur masqué ; bouton texte « Masquer » ; mode compact = cases sur une ligne horizontale avec compteur, sans phrasessrc/components/dashboard/DashboardEmptyState.tsx: titre « Bienvenue dans Simpl'Résultat », phrase sur ce que la page montrera après import,OnboardingChecklisten mode étendu, bouton primaire « Choisir un dossier d'import » (<Link to="/import">)DashboardPage.tsx: monteruseOnboardingChecklist; brancher surstatus:loading→ titre +PageHelp+CategoriesV1DiscoveryBannerseuls ;error→ page v0.15.0 sans liste +logWarn(error);readyetcounters.transactions === 0→DashboardEmptyStaterendu hors du<div className={isLoading ? "opacity-50 pointer-events-none" : ""}>deDashboardPage.tsx:62;readyet> 0→ page actuelle avecOnboardingChecklistcompact entre le titre et leFilterPanel, seulement si nihiddennicompletesrc/pages/settings/UsersSettingsPage.tsx: dans la section Guide (:37-42), au-dessus deDocsContent, une ligne « Liste de démarrage sur le tableau de bord » + bouton « Afficher la liste de démarrage », visible seulement si la préférence vaut"1"(lecture au montage) ; clic →showChecklist()+ confirmation inline « La liste réapparaîtra sur le tableau de bord »dashboard.empty.*,onboarding.checklist.*(title, counter, hide, items.profile/importFolder/source/import/manualCategory/budget, lockedBudget),settings.users.onboarding.*Fichiers concernés
src/components/shared/EmptyState.tsx(nouveau) +EmptyState.test.tsx(nouveau)src/components/dashboard/OnboardingChecklist.tsx(nouveau) +OnboardingChecklist.test.tsx(nouveau)src/components/dashboard/DashboardEmptyState.tsx(nouveau)src/pages/DashboardPage.tsxsrc/pages/settings/UsersSettingsPage.tsxsrc/i18n/locales/fr.json,src/i18n/locales/en.jsonPattern de test des composants :
src/components/reports/FilterPanel.test.tsx(appel direct de la fonction,react-i18nextetlucide-reactmockés, aucun hook React dans le composant testé). Vitest tourne en node, sans jsdom ni testing-library.Depends on
Critères d'acceptation
/importcliquable (pas de voileopacity-50)status="loading", ni les widgets ni l'état vide ne sont rendus (pas de flash) ; enstatus="error", le tableau de bord actuel s'affiche sans listeOnboardingChecklist.test.tsx: cadenas en Free, case neutre et compteur absent quandbudgetReady=false, mode compact, liens par caseEmptyState.test.tsx: variantesto(rend unLink) etonClick(bouton,disabled)npm test,npm run buildverts ;grepsans chaîne en dur dans les nouveaux composantsReview caveats
status, pas sur un compteur seul ; état vide hors du voileisLoading.OnboardingChecklistetEmptyStatesont purs pour rester testables par appel direct.Décisions prises en planification
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).planned-2026-09-24-paiementss'exécute avant celle-ci (fichiers partagés :fr.json,en.json, CHANGELOG,architecture.md,guide-utilisateur.md) ; partir d'unmainqui contient déjà ses clés.counters.transactionsdu hook (une requête d'onboarding par montage) ;getTransactionCountest réservé aux pages sans liste.useDashboardcontinue de lancer ses requêtes à base vide (coût accepté).Spec source
spec-plan-onboarding-phase1.md (local, ignoré par git)
Onboarding: dashboard empty state, getting-started checklist and re-show button in Settingsto Onboarding : état vide du tableau de bord, liste de démarrage et bouton de réaffichage dans Paramètres