fix: display level 4+ categories under their parent in dashboard (#23) #28

Merged
maximus merged 4 commits from fix/simpl-resultat-23-dashboard-category-ordering into main 2026-03-10 01:26:20 +00:00
Collaborator

Fixes #23

Summary

  • Category ordering fix: Replaced flat alphabetical sort with tree-order traversal so child categories (depth 2+) appear directly under their parent subtotal row instead of at the bottom of the section
  • Recursive hierarchy: Made buildSubGroup recursive to support arbitrary nesting depth (was hardcoded to 3 levels max)
  • Pie chart layout: Reduced pie chart from 1/2 to 1/3 of dashboard width, giving more space to the budget table
  • Labels on hover: Removed permanent legend below pie chart; category names and percentages now shown only via tooltip on hover

Files changed

  • src/services/budgetService.ts — Recursive buildSubGroup, tree-order sort, removed broken flat sort
  • src/shared/types/index.tsdepth type changed from 0|1|2 to number
  • src/components/reports/BudgetVsActualTable.tsx — Support depth 3+ padding
  • src/components/budget/BudgetTable.tsx — Type constraint update
  • src/components/dashboard/CategoryPieChart.tsx — Removed legend, reduced height
  • src/pages/DashboardPage.tsx — 3-column grid layout
  • CHANGELOG.md / CHANGELOG.fr.md — Changelog entries
Fixes #23 ## Summary - **Category ordering fix**: Replaced flat alphabetical sort with tree-order traversal so child categories (depth 2+) appear directly under their parent subtotal row instead of at the bottom of the section - **Recursive hierarchy**: Made `buildSubGroup` recursive to support arbitrary nesting depth (was hardcoded to 3 levels max) - **Pie chart layout**: Reduced pie chart from 1/2 to 1/3 of dashboard width, giving more space to the budget table - **Labels on hover**: Removed permanent legend below pie chart; category names and percentages now shown only via tooltip on hover ## Files changed - `src/services/budgetService.ts` — Recursive `buildSubGroup`, tree-order sort, removed broken flat sort - `src/shared/types/index.ts` — `depth` type changed from `0|1|2` to `number` - `src/components/reports/BudgetVsActualTable.tsx` — Support depth 3+ padding - `src/components/budget/BudgetTable.tsx` — Type constraint update - `src/components/dashboard/CategoryPieChart.tsx` — Removed legend, reduced height - `src/pages/DashboardPage.tsx` — 3-column grid layout - `CHANGELOG.md` / `CHANGELOG.fr.md` — Changelog entries
medic-bot added 1 commit 2026-03-09 05:11:01 +00:00
- Replace flat alphabetical sort with tree-order traversal so child
  categories appear directly under their parent subtotal row
- Make category hierarchy recursive (supports arbitrary depth)
- Reduce pie chart width from 1/2 to 1/3 of the dashboard
- Show pie chart labels only on hover via tooltip

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Author
Collaborator

Reviewer automatique — needs-fix

La logique récursive dans budgetService.ts semble correcte pour la construction de l'arbre, mais reorderRows() dans BudgetVsActualTable et BudgetTable ne gère que depth 0-1 pour le réordonnancement des sous-totaux — ce qui casse le toggle 'subtotals on bottom' pour les niveaux 2+. Aucun test n'est ajouté pour cette refonte significative. La suppression complète de la légende du PieChart va au-delà de ce que l'issue demandait.

Suggestions de simplification

  • src/pages/DashboardPage.tsx : La classe lg:col-span-1 (ligne 130) est la valeur par défaut dans une grille CSS et peut être supprimée — elle n'a aucun effet.
  • src/components/budget/BudgetTable.tsx : La fonction reorderRows est dupliquée entre BudgetTable.tsx et BudgetVsActualTable.tsx. C'est une dette existante, mais puisque les deux copies doivent être corrigées pour supporter depth > 1, c'est l'occasion de l'extraire dans un utilitaire partagé (ex: utils/rowReorder.ts).

Problèmes détectés

  • src/components/reports/BudgetVsActualTable.tsx:53 [high] BUG : reorderRows() ne gère que les sub-parents de depth 0 et 1 (lignes 36 et 53 : (child.depth ?? 0) === 0 et === 1). Avec la nouvelle profondeur arbitraire, un parent de depth 2+ ne sera jamais reconnu comme sub-parent → quand subtotalsOnTop=false, les sous-totaux de niveau 2+ resteront en haut de leur groupe au lieu d'être déplacés en bas. Il faut rendre cette logique récursive ou au minimum gérer tous les niveaux de depth.
  • src/components/budget/BudgetTable.tsx:21 [high] Même bug que BudgetVsActualTable : le type de depth est changé à number mais la logique de reorderRows (identique) ne gère toujours que depth 0 et 1. Le BudgetTable a probablement une copie de la même fonction — les deux doivent être corrigées ensemble.
  • src/components/dashboard/CategoryPieChart.tsx:112 [medium] La légende entière (lignes 113-134 de l'original) est supprimée. L'issue demandait 'afficher seulement les étiquettes quand on survole le graph', pas de supprimer la légende. Sans légende, l'utilisateur ne peut plus : (1) identifier visuellement quelle couleur/pattern correspond à quelle catégorie sans survoler chaque tranche une par une, (2) cacher une catégorie visible via clic sur la légende. Suggestion : garder la légende en mode compact (noms seulement, sans pourcentages) ou la remplacer par des labels directement sur les tranches du graphique.
  • src/services/budgetService.ts:322 [medium] Aucun test unitaire n'est ajouté pour la nouvelle fonction récursive buildSubGroup(). C'est une refonte majeure de la logique de hiérarchie (de 3 niveaux hardcodés vers une profondeur arbitraire). Des tests couvrant au minimum : (1) hiérarchie 4+ niveaux, (2) mix de catégories inputable/non-inputable à différentes profondeurs, (3) catégories avec transactions directes + enfants, seraient nécessaires pour éviter des régressions.
  • src/components/reports/BudgetVsActualTable.tsx:218 [low] paddingClass s'arrête à depth >= 3 (pl-20). Toutes les profondeurs 3, 4, 5... auront la même indentation. Pour supporter réellement une profondeur arbitraire, utiliser un padding calculé dynamiquement serait plus cohérent : style={{ paddingLeft: depth * 24 + 12 }} ou équivalent Tailwind.
## Reviewer automatique — needs-fix La logique récursive dans budgetService.ts semble correcte pour la construction de l'arbre, mais reorderRows() dans BudgetVsActualTable et BudgetTable ne gère que depth 0-1 pour le réordonnancement des sous-totaux — ce qui casse le toggle 'subtotals on bottom' pour les niveaux 2+. Aucun test n'est ajouté pour cette refonte significative. La suppression complète de la légende du PieChart va au-delà de ce que l'issue demandait. ### Suggestions de simplification - **src/pages/DashboardPage.tsx** : La classe `lg:col-span-1` (ligne 130) est la valeur par défaut dans une grille CSS et peut être supprimée — elle n'a aucun effet. - **src/components/budget/BudgetTable.tsx** : La fonction reorderRows est dupliquée entre BudgetTable.tsx et BudgetVsActualTable.tsx. C'est une dette existante, mais puisque les deux copies doivent être corrigées pour supporter depth > 1, c'est l'occasion de l'extraire dans un utilitaire partagé (ex: utils/rowReorder.ts). ### Problèmes détectés - **src/components/reports/BudgetVsActualTable.tsx:53** [high] BUG : reorderRows() ne gère que les sub-parents de depth 0 et 1 (lignes 36 et 53 : `(child.depth ?? 0) === 0` et `=== 1`). Avec la nouvelle profondeur arbitraire, un parent de depth 2+ ne sera jamais reconnu comme sub-parent → quand subtotalsOnTop=false, les sous-totaux de niveau 2+ resteront en haut de leur groupe au lieu d'être déplacés en bas. Il faut rendre cette logique récursive ou au minimum gérer tous les niveaux de depth. - **src/components/budget/BudgetTable.tsx:21** [high] Même bug que BudgetVsActualTable : le type de depth est changé à `number` mais la logique de reorderRows (identique) ne gère toujours que depth 0 et 1. Le BudgetTable a probablement une copie de la même fonction — les deux doivent être corrigées ensemble. - **src/components/dashboard/CategoryPieChart.tsx:112** [medium] La légende entière (lignes 113-134 de l'original) est supprimée. L'issue demandait 'afficher seulement les étiquettes quand on survole le graph', pas de supprimer la légende. Sans légende, l'utilisateur ne peut plus : (1) identifier visuellement quelle couleur/pattern correspond à quelle catégorie sans survoler chaque tranche une par une, (2) cacher une catégorie visible via clic sur la légende. Suggestion : garder la légende en mode compact (noms seulement, sans pourcentages) ou la remplacer par des labels directement sur les tranches du graphique. - **src/services/budgetService.ts:322** [medium] Aucun test unitaire n'est ajouté pour la nouvelle fonction récursive buildSubGroup(). C'est une refonte majeure de la logique de hiérarchie (de 3 niveaux hardcodés vers une profondeur arbitraire). Des tests couvrant au minimum : (1) hiérarchie 4+ niveaux, (2) mix de catégories inputable/non-inputable à différentes profondeurs, (3) catégories avec transactions directes + enfants, seraient nécessaires pour éviter des régressions. - **src/components/reports/BudgetVsActualTable.tsx:218** [low] paddingClass s'arrête à depth >= 3 (`pl-20`). Toutes les profondeurs 3, 4, 5... auront la même indentation. Pour supporter réellement une profondeur arbitraire, utiliser un padding calculé dynamiquement serait plus cohérent : `style={{ paddingLeft: depth * 24 + 12 }}` ou équivalent Tailwind.
maximus added 1 commit 2026-03-10 00:46:03 +00:00
- Make reorderRows() recursive to support subtotals toggle at all depth
  levels (not just depth 0-1)
- Restore pie chart legend (show on hover only to save space)
- Give more horizontal space to budget table (3/4 grid vs 2/3)
Author
Collaborator

Reviewer automatique — needs-fix

La récursion dans reorderRows et buildSubGroup est correcte et résout l'issue #23. Cependant, la suppression du tri alphabétique des enfants dans budgetService.ts est une régression potentielle, le styling des parents intermédiaires depth 2+ est ignoré, et aucun test n'a été ajouté malgré le signalement en round 1.

Suggestions de simplification

  • src/components/budget/BudgetTable.tsx : reorderRows est dupliqué mot pour mot dans BudgetTable.tsx et BudgetVsActualTable.tsx. Extraire dans un utilitaire partagé (ex: src/utils/reorderRows.ts) pour éviter la divergence future.
  • src/components/reports/BudgetVsActualTable.tsx : La ligne depth >= 3 ? "pl-20" plafonne l'indentation visuelle à un seul niveau pour toutes les profondeurs >= 3. Si on supporte une profondeur arbitraire, calculer dynamiquement le padding : pl-${8 + depth * 6} ou utiliser un style inline paddingLeft: ${depth * 1.5}rem.

Problèmes détectés

  • src/services/budgetService.ts:400 [high] Le bloc allChildRows.sort(...) a été entièrement supprimé. L'ancien code triait les enfants alphabétiquement avec '(direct)' en premier. Maintenant l'ordre dépend de l'ordre d'itération de children retourné par childrenByParent, qui est l'ordre d'insertion dans la boucle ligne 237 — donc l'ordre brut de allCategories. Si cet ordre n'est pas garanti stable (ex: requête SQL sans ORDER BY), l'affichage sera non-déterministe. Au minimum, trier children par sort_order puis name avant d'itérer, comme le faisait implicitement l'ancien code.
  • src/components/reports/BudgetVsActualTable.tsx:205 [medium] isIntermediateParent est toujours codé en dur à depth === 1. Avec le support de profondeurs arbitraires, les parents à depth 2+ ne recevront pas le styling intermédiaire (bold atténué, etc.). Devrait être isParent && depth > 0 ou isParent && depth >= 1.
  • src/services/budgetService.ts:345 [medium] buildSubtotal reçoit leafRows (ligne 399) filtré par !r.is_parent, mais dans buildSubGroup (ligne 357) il reçoit aussi leafRows filtré localement. Si un sous-groupe contient un row '(direct)' avec le même category_id que le parent, ce row sera compté à la fois dans le subtotal du sous-groupe ET dans le subtotal du groupe parent — risque de double-comptage. Vérifier avec un scénario où un parent intermédiaire is_inputable a aussi des enfants inputables.
  • src/services/budgetService.ts:0 [high] Aucun test unitaire ajouté. C'était déjà signalé en round 1. La logique récursive de buildSubGroup et reorderRows est non triviale — un test avec 4 niveaux de profondeur (le cas exact de l'issue) est indispensable pour éviter les régressions. Ajouter au minimum : (1) test buildSubGroup avec depth 0→3, (2) test reorderRows avec subtotalsOnTop=false et depth 3+, (3) test que les montants des subtotals ne double-comptent pas.
## Reviewer automatique — needs-fix La récursion dans reorderRows et buildSubGroup est correcte et résout l'issue #23. Cependant, la suppression du tri alphabétique des enfants dans budgetService.ts est une régression potentielle, le styling des parents intermédiaires depth 2+ est ignoré, et aucun test n'a été ajouté malgré le signalement en round 1. ### Suggestions de simplification - **src/components/budget/BudgetTable.tsx** : reorderRows est dupliqué mot pour mot dans BudgetTable.tsx et BudgetVsActualTable.tsx. Extraire dans un utilitaire partagé (ex: src/utils/reorderRows.ts) pour éviter la divergence future. - **src/components/reports/BudgetVsActualTable.tsx** : La ligne `depth >= 3 ? "pl-20"` plafonne l'indentation visuelle à un seul niveau pour toutes les profondeurs >= 3. Si on supporte une profondeur arbitraire, calculer dynamiquement le padding : `pl-${8 + depth * 6}` ou utiliser un style inline `paddingLeft: ${depth * 1.5}rem`. ### Problèmes détectés - **src/services/budgetService.ts:400** [high] Le bloc `allChildRows.sort(...)` a été entièrement supprimé. L'ancien code triait les enfants alphabétiquement avec '(direct)' en premier. Maintenant l'ordre dépend de l'ordre d'itération de `children` retourné par `childrenByParent`, qui est l'ordre d'insertion dans la boucle ligne 237 — donc l'ordre brut de `allCategories`. Si cet ordre n'est pas garanti stable (ex: requête SQL sans ORDER BY), l'affichage sera non-déterministe. Au minimum, trier `children` par `sort_order` puis `name` avant d'itérer, comme le faisait implicitement l'ancien code. - **src/components/reports/BudgetVsActualTable.tsx:205** [medium] `isIntermediateParent` est toujours codé en dur à `depth === 1`. Avec le support de profondeurs arbitraires, les parents à depth 2+ ne recevront pas le styling intermédiaire (bold atténué, etc.). Devrait être `isParent && depth > 0` ou `isParent && depth >= 1`. - **src/services/budgetService.ts:345** [medium] `buildSubtotal` reçoit `leafRows` (ligne 399) filtré par `!r.is_parent`, mais dans `buildSubGroup` (ligne 357) il reçoit aussi `leafRows` filtré localement. Si un sous-groupe contient un row '(direct)' avec le même `category_id` que le parent, ce row sera compté à la fois dans le subtotal du sous-groupe ET dans le subtotal du groupe parent — risque de double-comptage. Vérifier avec un scénario où un parent intermédiaire `is_inputable` a aussi des enfants inputables. - **src/services/budgetService.ts:0** [high] Aucun test unitaire ajouté. C'était déjà signalé en round 1. La logique récursive de `buildSubGroup` et `reorderRows` est non triviale — un test avec 4 niveaux de profondeur (le cas exact de l'issue) est indispensable pour éviter les régressions. Ajouter au minimum : (1) test buildSubGroup avec depth 0→3, (2) test reorderRows avec subtotalsOnTop=false et depth 3+, (3) test que les montants des subtotals ne double-comptent pas.
maximus added 1 commit 2026-03-10 01:02:30 +00:00
- Extract reorderRows into shared utility (src/utils/reorderRows.ts) to
  deduplicate identical function in BudgetTable and BudgetVsActualTable
- Restore alphabetical sorting of children in budgetService.ts
- Fix styling for intermediate parent rows at depth 2+ (was only handling
  depth 0-1)
- Reduce pie chart size (height 220->180, radii reduced) and padding to
  give more space to the table

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Author
Collaborator

Reviewer automatique — needs-fix

La refactorisation récursive résout correctement l'issue #23 et la déduplication de reorderRows est bienvenue. Cependant, le subtotal des parents intermédiaires ne comptabilise que les feuilles directes et ignore les sous-totaux imbriqués, ce qui peut produire des montants incorrects pour les hiérarchies profondes. La légende cachée par défaut (opacity-0) dégrade l'UX en rendant les catégories invisibles sans interaction.

Suggestions de simplification

  • src/components/budget/BudgetTable.tsx : Le calcul de parentPaddingClass (ligne 181-182) duplique la logique de paddingClass pour les lignes non-parent (ligne 220). Extraire une fonction utilitaire depthPaddingClass(depth: number, isParent: boolean) ou au minimum une constante partagée pour éviter la divergence entre les deux.
  • src/services/budgetService.ts : La logique du top-level loop (lignes 364-410) est quasi identique à buildSubGroup — la seule différence est parentId=null et depth=0. Envisager de réutiliser buildSubGroup pour le top-level aussi, ou au minimum extraire la boucle children commune.

Problèmes détectés

  • src/services/budgetService.ts:356 [high] buildSubGroup calcule le subtotal uniquement à partir des leafRows (filter !is_parent), mais dans une hiérarchie récursive, les feuilles les plus profondes ne sont pas des enfants directs — elles sont imbriquées dans des sous-groupes. Le filtre childRows.filter(r => !r.is_parent) récupère toutes les feuilles de l'arbre aplati, ce qui est correct pour la somme MAIS seulement si chaque feuille n'apparaît qu'une fois dans childRows. Vérifier que les feuilles d'un sous-sous-groupe (depth 3+) ne sont pas comptées en double quand elles remontent via buildSubGroup récursif. Le même pattern est utilisé ligne 402 pour le top-level — même risque.
  • src/services/budgetService.ts:340 [medium] Dans buildSubGroup, quand un enfant a des grandchildren (ligne 347) mais que buildSubGroup retourne [] (tous les rows sont all-zero), la catégorie intermédiaire est silencieusement ignorée. Si cette catégorie est elle-même is_inputable avec des transactions directes non-zero, ces transactions sont perdues car le check hasSubChildren (ligne 333) est basé sur l'existence d'enfants dans childrenByParent, pas sur le fait qu'ils ont des données. Ce cas de bord existe aussi dans l'ancien code mais la récursion le rend plus probable.
  • src/components/dashboard/CategoryPieChart.tsx:120 [medium] La légende est en opacity-0 pointer-events-none par défaut et ne s'affiche qu'au survol du graphique. L'issue demandait 'afficher seulement les étiquettes quand on survole le graph' — ce qui se réfère aux labels sur le graphique, pas à la légende entière. Cacher la légende par défaut rend impossible l'identification des catégories sans interaction. Suggestion : garder la légende visible en permanence et utiliser le tooltip de Recharts (déjà implémenté) pour les valeurs détaillées au survol, ou afficher les labels directement sur les slices au hover.
  • src/components/dashboard/CategoryPieChart.tsx:75 [low] La hauteur du graphique est réduite de 280 à 180px. Combiné avec la réduction à 1/3 de la largeur (lg:col-span-1 sur 4 colonnes), le pie chart devient très petit sur les écrans moyens. Les inner/outerRadius sont aussi réduits (50→35, 100→75). Tester sur des écrans ~1280px de large pour vérifier la lisibilité.
## Reviewer automatique — needs-fix La refactorisation récursive résout correctement l'issue #23 et la déduplication de reorderRows est bienvenue. Cependant, le subtotal des parents intermédiaires ne comptabilise que les feuilles directes et ignore les sous-totaux imbriqués, ce qui peut produire des montants incorrects pour les hiérarchies profondes. La légende cachée par défaut (opacity-0) dégrade l'UX en rendant les catégories invisibles sans interaction. ### Suggestions de simplification - **src/components/budget/BudgetTable.tsx** : Le calcul de parentPaddingClass (ligne 181-182) duplique la logique de paddingClass pour les lignes non-parent (ligne 220). Extraire une fonction utilitaire `depthPaddingClass(depth: number, isParent: boolean)` ou au minimum une constante partagée pour éviter la divergence entre les deux. - **src/services/budgetService.ts** : La logique du top-level loop (lignes 364-410) est quasi identique à buildSubGroup — la seule différence est parentId=null et depth=0. Envisager de réutiliser buildSubGroup pour le top-level aussi, ou au minimum extraire la boucle children commune. ### Problèmes détectés - **src/services/budgetService.ts:356** [high] buildSubGroup calcule le subtotal uniquement à partir des leafRows (filter !is_parent), mais dans une hiérarchie récursive, les feuilles les plus profondes ne sont pas des enfants directs — elles sont imbriquées dans des sous-groupes. Le filtre `childRows.filter(r => !r.is_parent)` récupère toutes les feuilles de l'arbre aplati, ce qui est correct pour la somme MAIS seulement si chaque feuille n'apparaît qu'une fois dans childRows. Vérifier que les feuilles d'un sous-sous-groupe (depth 3+) ne sont pas comptées en double quand elles remontent via buildSubGroup récursif. Le même pattern est utilisé ligne 402 pour le top-level — même risque. - **src/services/budgetService.ts:340** [medium] Dans buildSubGroup, quand un enfant a des grandchildren (ligne 347) mais que buildSubGroup retourne [] (tous les rows sont all-zero), la catégorie intermédiaire est silencieusement ignorée. Si cette catégorie est elle-même is_inputable avec des transactions directes non-zero, ces transactions sont perdues car le check hasSubChildren (ligne 333) est basé sur l'existence d'enfants dans childrenByParent, pas sur le fait qu'ils ont des données. Ce cas de bord existe aussi dans l'ancien code mais la récursion le rend plus probable. - **src/components/dashboard/CategoryPieChart.tsx:120** [medium] La légende est en `opacity-0 pointer-events-none` par défaut et ne s'affiche qu'au survol du graphique. L'issue demandait 'afficher seulement les étiquettes quand on survole le graph' — ce qui se réfère aux labels sur le graphique, pas à la légende entière. Cacher la légende par défaut rend impossible l'identification des catégories sans interaction. Suggestion : garder la légende visible en permanence et utiliser le tooltip de Recharts (déjà implémenté) pour les valeurs détaillées au survol, ou afficher les labels directement sur les slices au hover. - **src/components/dashboard/CategoryPieChart.tsx:75** [low] La hauteur du graphique est réduite de 280 à 180px. Combiné avec la réduction à 1/3 de la largeur (lg:col-span-1 sur 4 colonnes), le pie chart devient très petit sur les écrans moyens. Les inner/outerRadius sont aussi réduits (50→35, 100→75). Tester sur des écrans ~1280px de large pour vérifier la lisibilité.
maximus added 1 commit 2026-03-10 01:18:03 +00:00
Show category names permanently in compact form (text-xs) so they
are always discoverable. Percentages appear only on chart hover to
save space, matching the original request while keeping the legend
accessible without interaction.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Author
Collaborator

Reviewer automatique — needs-simplify

La refactorisation récursive est correcte et résout l'issue #23. Les problèmes des rounds précédents (subtotals multi-niveaux, tri alphabétique, légende PieChart) sont tous corrigés. La déduplication de reorderRows dans un utilitaire partagé est bienvenue. Reste l'absence persistante de tests unitaires et quelques simplifications possibles.

Suggestions de simplification

  • src/utils/reorderRows.ts : Ajouter au minimum un test unitaire pour reorderRows couvrant : (1) subtotals on top (passthrough), (2) 2 niveaux de profondeur, (3) 3+ niveaux. C'est la 4e ronde de review qui le demande — cette fonction récursive partagée entre 2 composants mérite une couverture de base pour éviter les régressions.
  • src/components/budget/BudgetTable.tsx : Le calcul de parentPaddingClass (ligne ~181) duplique la même logique ternaire que paddingClass dans BudgetVsActualTable.tsx (ligne ~169). Extraire une fonction utilitaire depthPaddingClass(depth: number): string dans un fichier partagé (ou à côté de reorderRows) pour éviter cette duplication.
  • src/components/dashboard/CategoryPieChart.tsx : Le state isChartHovered contrôle l'affichage des pourcentages dans la légende. Comme la légende est positionnée SOUS le chart (pas à l'intérieur du div onMouseEnter/Leave), survoler la légende elle-même ne déclenche pas isChartHovered — les pourcentages disparaissent quand l'utilisateur survole les noms de catégories. Envisager de remonter le onMouseEnter/Leave au conteneur parent englobant chart + légende, ou d'afficher les pourcentages en permanence (plus simple et plus accessible).
## Reviewer automatique — needs-simplify La refactorisation récursive est correcte et résout l'issue #23. Les problèmes des rounds précédents (subtotals multi-niveaux, tri alphabétique, légende PieChart) sont tous corrigés. La déduplication de reorderRows dans un utilitaire partagé est bienvenue. Reste l'absence persistante de tests unitaires et quelques simplifications possibles. ### Suggestions de simplification - **src/utils/reorderRows.ts** : Ajouter au minimum un test unitaire pour reorderRows couvrant : (1) subtotals on top (passthrough), (2) 2 niveaux de profondeur, (3) 3+ niveaux. C'est la 4e ronde de review qui le demande — cette fonction récursive partagée entre 2 composants mérite une couverture de base pour éviter les régressions. - **src/components/budget/BudgetTable.tsx** : Le calcul de parentPaddingClass (ligne ~181) duplique la même logique ternaire que paddingClass dans BudgetVsActualTable.tsx (ligne ~169). Extraire une fonction utilitaire `depthPaddingClass(depth: number): string` dans un fichier partagé (ou à côté de reorderRows) pour éviter cette duplication. - **src/components/dashboard/CategoryPieChart.tsx** : Le state `isChartHovered` contrôle l'affichage des pourcentages dans la légende. Comme la légende est positionnée SOUS le chart (pas à l'intérieur du div onMouseEnter/Leave), survoler la légende elle-même ne déclenche pas isChartHovered — les pourcentages disparaissent quand l'utilisateur survole les noms de catégories. Envisager de remonter le onMouseEnter/Leave au conteneur parent englobant chart + légende, ou d'afficher les pourcentages en permanence (plus simple et plus accessible).
maximus merged commit 9551399f5f into main 2026-03-10 01:26:20 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
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#28
No description provided.