feat(reports): adopt shared FilterPanel on the Trends page #283
No reviewers
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#283
Loading…
Reference in a new issue
No description provided.
Delete branch "issue-275-adopt-trends"
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?
Resolves #275
Generated autonomously by /autopilot run of 2026-07-11
Summary
<FilterPanel>(from #274) onReportsTrendsPage, next to the period selector, replacing the bare<PeriodSelector>.accountIds/setAccountIds(fromuseReportsPeriod, #272) into the panel;useTrendsnow also readsaccountIdsfromuseReportsPeriodand forwards it togetMonthlyTrends/getCategoryOverTime(both accountIds-aware since #273).accountsprop) is sourced viagetAllImportSources()fromtransactionService.ts— the same query the Transactions single-source filter (useTransactions.ts) uses — fetched once on mount insideuseTrends(newaccountsstate +SET_ACCOUNTSaction), since architecture convention keeps hook state out of the page component.accountIds([], the default) behaves as "no filter", already verified byte-identical at the service layer by the #273 test suite (reportService.test.ts).PeriodSelectorto sitting right-aligned below the newFilterPanelblock (FilterPanel is a self-contained card, like the other reports toolbars).## [Unreleased]/### Added; one-linedocs/architecture.mdupdate to theuseReportsPeriodrow reflecting it's now adopted on the Trends page (Compare/Budget/Dashboard/Hub still pending, #276).Caveat
useTrends/ReportsTrendsPagewiring itself: this repo has no@testing-library/react/jsdom, so hooks withuseReducer/useEffectare only unit-tested via extracted pure helpers (seeuseCompare.test.ts,FilterPanel.test.tsx's own note on this). There's no new pure branching logic here to extract — it's parameter forwarding into already-tested service functions (reportService.test.tscovers theaccountIdsfilter behavior exhaustively, including the empty-array/no-regression case). Manual/code-review verification only for the wiring itself.Test plan
npm run buildgreen (tsc + vite)npm testgreen — 788/788 (baseline unchanged, no new tests added)/pr-review — PR #283 ·
feat(reports): adopt shared FilterPanel on the Trends pageVerdict : APPROVE ✅
Résumé
Branchement propre et bien scopé du
FilterPanelpartagé (#274) sur la page Tendances. Le diff head-vs-base se limite à 5 fichiers (2× CHANGELOG,docs/architecture.md,useTrends.ts,ReportsTrendsPage.tsx) — pas de dérive de périmètre. Chaque appel a été vérifié contre le code réel des maillons #272-#274 de la pile.Vérifications
FilterPanel— les 4 props passées (temporalControl,accountIds,onAccountIdsChange,accounts) correspondent exactement àFilterPanelProps, types inclus (number[],(number[]) => void,ImportSource[]).getMonthlyTrends(from, to, ids):idsen 3ᵉ position =accountIds.getCategoryOverTime(from, to, undefined, ids):undefineden 3ᵉ laisse le défauttopN = 50s'appliquer,idsatterrit bien en 4ᵉ (accountIds). Correct.accountIdsvide = aucun filtre, byte-identique — garanti parinPlaceholders()qui retournenullpour[]/undefined, donc aucune clauseWHERE source_id IN (...)ajoutée. Couvert exhaustivement parreportService.test.ts(« an empty accountIds array behaves exactly like no filter » sur les deux fonctions).accountIdspasse par des placeholders paramétrés ($N) +params.push(...), jamais d'interpolation → pas d'injection.accountsexposé — bien renvoyé paruseTrendsvia...state; le chargement de la liste (getAllImportSources) vit dans le hook, pas dans la page (respecte la convention « état hors composant »).FilterPanelréutilisereports.filters.accounts.*, la page réutilisereports.trends.*.docs/architecture.md(ligneuseReportsPeriod) et CHANGELOG EN+FR sous[Unreleased]/Addedà jour et exacts. Pas de migration DB.idspassé en argument (pas de closure suraccountIds), gardefetchIdRefconservée → pas de course sur changement de filtre.Observations non bloquantes
error— le 2ᵉ effet (chargement des comptes) partage le sloterrordu reducer. Un succès du fetch Tendances (SET_TRENDS/SET_CATEGORY_OVER_TIMEremeterror: null) effacerait une erreur de chargement de comptes, et inversement une erreur comptes pourrait masquer transitoirement. Cohérent avec le pattern reducer existant, purement cosmétique (bannière) — non bloquant.useTrends/page lui-même. Justification du PR body valide : pas de jsdom/testing-library dans le repo, et le diff n'introduit aucune logique de branchement pure à extraire (simple forwarding de paramètres vers des services déjà testés à fond). Conforme à la convention du repo.Note de merge (pile stackée)
PR ciblant
issue-274-filter-panel, pasmain→check.ymlne tourne pas (statutno-status). Valider le tip cumulé en local avant de merger la pile (tsc && vite build,vitest run,cargo check,cargo test). Le PR body indique build vert + 788/788 vitest.🤖 Revue générée via
/pr-reviewMerged into
mainvia local fast-forward (commitfe9ae01) as a linear stack. Forgejo doesn't flag non-API merges as merged; closing manually.Pull request closed