feat(balance): tile-based landing + reachable account management (#244) #250

Closed
maximus wants to merge 0 commits from issue-244-bilan-landing-tuiles into main
Owner

Replaces the /balance landing with a tile-based hub (HubReportNavCard, modeled on the Reports page) and decouples the empty-state guard into three states via the pure helper deriveLandingState. Accounts-without-snapshot no longer forces the snapshot flow, and account management (/balance/accounts) is reachable from the landing in every state. Removes the obsolete BalanceOnboardingCard; adds balance.hub./balance.landing. i18n keys (FR+EN) and CHANGELOG entries.

Resolves #244

Generated autonomously by /autopilot run of 2026-07-04

Replaces the /balance landing with a tile-based hub (HubReportNavCard, modeled on the Reports page) and decouples the empty-state guard into three states via the pure helper `deriveLandingState`. Accounts-without-snapshot no longer forces the snapshot flow, and account management (/balance/accounts) is reachable from the landing in every state. Removes the obsolete BalanceOnboardingCard; adds balance.hub.*/balance.landing.* i18n keys (FR+EN) and CHANGELOG entries. Resolves #244 Generated autonomously by /autopilot run of 2026-07-04
maximus added 1 commit 2026-07-04 21:43:55 +00:00
feat(balance): tile-based landing hub + reachable account management
All checks were successful
PR Check / rust (pull_request) Successful in 25m34s
PR Check / frontend (pull_request) Successful in 2m30s
82550d6d38
Decouple the /balance empty-state guard into three explicit states via a
new pure helper `deriveLandingState` (empty / accounts-no-snapshot /
populated). Having accounts but no snapshot no longer strands the user on a
snapshot-only onboarding card: each state now renders navigation tiles
(HubReportNavCard, modeled on the Reports hub), and "Manage accounts"
(/balance/accounts) is reachable in every state, including the populated
dashboard.

- Remove BalanceOnboardingCard (component + test) and the dead
  balance.onboarding.* i18n keys; add balanceLanding.ts + test.
- Add balance.hub.* and balance.landing.* keys in FR and EN.
- CHANGELOG (EN + FR) under [Unreleased].

Resolves #244
maximus added the
status:approved
autopilot:pending-human
labels 2026-07-04 21:44:04 +00:00
Author
Owner

Revue PR #250feat(balance): tile-based landing + reachable account management (#244)

Verdict : APPROVE

Refonte propre et bien cadrée de la page d'accueil /balance. Le garde booléen d'état vide est découplé en trois états explicites via un helper pur testé, la gestion des comptes redevient accessible en tout temps, et le composant HubReportNavCard existant est réutilisé sans duplication. CI verte (rust + frontend sur le SHA de tête), commit conventionnel, changelog bilingue à jour.

Points vérifiés

  • Correction : deriveLandingState couvre les trois états et gère le cas anormal (0 compte mais flag snapshot → empty) ainsi que les comptes négatifs. Le rendu « populated » (sélecteur de période + graphique + tableau) est préservé à l'identique ; seul un bloc de tuiles est ajouté en fin de section — pas de régression sur le tableau de bord peuplé.
  • Routes : les deux tuiles pointent vers des routes existantes — /balance/accounts et /balance/snapshot sont bien déclarées dans App.tsx.
  • Réutilisation : HubReportNavCardProps expose exactement les 4 champs utilisés (to/icon/title/description) ; le markup de renderHub est calqué sur le hub de ReportsPage (mêmes classes section/h2/grid, même key={card.to}).
  • Nettoyage : BalanceOnboardingCard.tsx + son test supprimés ensemble ; aucune référence de code résiduelle (vérifié par grep). Les clés i18n balance.onboarding.* sont remplacées par balance.hub.* / balance.landing.* dans les deux locales, JSON valide (build Vite vert).
  • Tests : nouveau test unitaire balanceLanding.test.ts (3 états + garde négative + cas anormal), suite verte en CI. Convention « helper pur sans jsdom » respectée. Aucun skip/only.
  • i18n : toutes les chaînes passent par t(), FR + EN synchronisés.
  • Changelog : entrée Changed / Modifié sous [Unreleased] dans les deux fichiers.
  • Sécurité : aucun secret, aucune surface d'injection (changements UI/i18n/changelog uniquement).

Suggestions (non bloquantes)

  1. src/components/balance/StarterAccountsModal.test.tsx:4 — commentaire qui référence « the BalanceOnboardingCard.test.tsx pattern from #178 », or ce fichier est supprimé par cette PR. Commentaire devenu périmé (purement cosmétique, hors diff).
  2. Le markup de carte d'en-tête (<div className="bg-[var(--card)] rounded-xl border ..."> + h2 + p) est dupliqué entre les états empty et accounts-no-snapshot. Extraction possible en mini-helper, mais reste lisible à deux occurrences.

Aucun de ces points ne bloque le merge.


Revue générée par /pr-review.

## Revue PR #250 — `feat(balance): tile-based landing + reachable account management` (#244) **Verdict : APPROVE** Refonte propre et bien cadrée de la page d'accueil `/balance`. Le garde booléen d'état vide est découplé en trois états explicites via un helper pur testé, la gestion des comptes redevient accessible en tout temps, et le composant `HubReportNavCard` existant est réutilisé sans duplication. CI verte (rust + frontend sur le SHA de tête), commit conventionnel, changelog bilingue à jour. ### Points vérifiés - **Correction** : `deriveLandingState` couvre les trois états et gère le cas anormal (0 compte mais flag snapshot → `empty`) ainsi que les comptes négatifs. Le rendu « populated » (sélecteur de période + graphique + tableau) est préservé à l'identique ; seul un bloc de tuiles est ajouté en fin de section — pas de régression sur le tableau de bord peuplé. - **Routes** : les deux tuiles pointent vers des routes existantes — `/balance/accounts` et `/balance/snapshot` sont bien déclarées dans `App.tsx`. - **Réutilisation** : `HubReportNavCardProps` expose exactement les 4 champs utilisés (`to`/`icon`/`title`/`description`) ; le markup de `renderHub` est calqué sur le hub de `ReportsPage` (mêmes classes `section`/`h2`/`grid`, même `key={card.to}`). - **Nettoyage** : `BalanceOnboardingCard.tsx` + son test supprimés ensemble ; aucune référence de code résiduelle (vérifié par grep). Les clés i18n `balance.onboarding.*` sont remplacées par `balance.hub.*` / `balance.landing.*` dans les deux locales, JSON valide (build Vite vert). - **Tests** : nouveau test unitaire `balanceLanding.test.ts` (3 états + garde négative + cas anormal), suite verte en CI. Convention « helper pur sans jsdom » respectée. Aucun `skip`/`only`. - **i18n** : toutes les chaînes passent par `t()`, FR + EN synchronisés. - **Changelog** : entrée `Changed` / `Modifié` sous `[Unreleased]` dans les deux fichiers. - **Sécurité** : aucun secret, aucune surface d'injection (changements UI/i18n/changelog uniquement). ### Suggestions (non bloquantes) 1. `src/components/balance/StarterAccountsModal.test.tsx:4` — commentaire qui référence « the BalanceOnboardingCard.test.tsx pattern from #178 », or ce fichier est supprimé par cette PR. Commentaire devenu périmé (purement cosmétique, hors diff). 2. Le markup de carte d'en-tête (`<div className="bg-[var(--card)] rounded-xl border ...">` + `h2` + `p`) est dupliqué entre les états `empty` et `accounts-no-snapshot`. Extraction possible en mini-helper, mais reste lisible à deux occurrences. Aucun de ces points ne bloque le merge. --- *Revue générée par `/pr-review`.*
Author
Owner

Merged into main locally as part of the milestone stack (merge commit ead6294). Closing manually — the merge was done outside Forgejo's API, so it can't flag this PR as merged. The change is on main.

Merged into `main` locally as part of the milestone stack (merge commit `ead6294`). Closing manually — the merge was done outside Forgejo's API, so it can't flag this PR as *merged*. The change is on `main`.
maximus closed this pull request 2026-07-05 21:06:19 +00:00
All checks were successful
PR Check / rust (pull_request) Successful in 25m34s
PR Check / frontend (pull_request) Successful in 2m30s

Pull request closed

Sign in to join this conversation.
No reviewers
No milestone
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#250
No description provided.