refactor(categories) : unifier la machine a etats des 2 arbres de categories sur useCollapsibleGroups #294
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#294
Loading…
Reference in a new issue
No description provided.
Delete branch "issue-290-categories-unify"
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 #290
Stacked on #293 (
issue-289-budget-collapse) — base branch isissue-289-budget-collapse, notmain. Review/merge #293 first.Unifies the collapse state machine of the two category trees onto
useCollapsibleGroups(a strict superset after #288), keeping each tree's distinct recursive render and CategoryTree's drag-and-drop untouched.storageKey: null+defaultExpanded: true(expanded by default, no seeding); drops the localSet+collectExpandable.storageKey: null+defaultExpanded: false(collapsed by default); sharedTAXONOMY_COLLAPSE_ACCESSORSexported from the tree.allExpanded = expanded.size > 0flipped after one node → hook's correctallExpanded), and migrates a 4th consumer (StepDiscover, same bug) onto the hook for a green build + consistency.Behaviours preserved: Categories opens expanded (DnD intact), guide/wizard open collapsed, and opening one node no longer flips the button.
Build 0 TS errors · 828 vitest pass · cargo check clean. No DB migration.
Generated autonomously by /autopilot run of 2026-07-15
/pr-review — PR #294 · Verdict : APPROVE ✅
Review adversariale, head-vs-base (
issue-289-budget-collapse). Pile stackée : #293 à reviewer/merger d'abord.Résumé — Refactor propre et fidèle : la machine à états de collapse des deux arbres de catégories est unifiée sur
useCollapsibleGroups(superset strict après #288), le rendu récursif distinct de chaque arbre et le drag-and-drop deCategoryTreerestant intacts. Le bug du bouton #290 est corrigé par délégation au primitive testé. Une seule suggestion non bloquante.Correction — vérifié
CategoryTree:defaultExpanded: true+ set vide ⇒ tous les parents dépliés sans seeding (réplique l'anciencollectExpandable+Setlocal). Guide +StepDiscover:defaultExpanded: false+ set vide ⇒ tout replié (réplique l'ancienSetvide initial).allExpanded = expanded.size > 0basculait le bouton dès un seul nœud déplié ; le nouveaugroups.allExpanded(flatNodes)=keys.length > 0 && keys.every(!isCollapsedFor)n'est vrai que si tous les parents sont ouverts. Les atomes (isCollapsedFordeux polarités,collapsibleKeys) sont couverts parcollapsibleRows.test.ts.flattenNodes/flatNodesalimentent correctement les bulk ops du hook —collapsibleKeysn'est pas récursif, donc les consommateurs doivent lui passer une liste aplatie. Les feuilles incluses dans l'aplatissement sont filtrées sans effet parisParent.CategoryTaxonomyTree(CategoriesStandardGuidePage,StepDiscover), tous deux mis à jour ; lesPropspubliques deCategoryTreerestent inchangées ⇒CategoriesPagecorrectement non touchée.noUnusedLocals+noUnusedParameters: truecombinés au « 0 erreur TS » annoncé garantissent l'absence de code mort ou de consommateur oublié.depthOf: () => 0n'est jamais appelé sur le chemin des arbres ;visibleRows/parentKeyOfnon plus (les deux arbres rendent récursivement et gatent chaque nœud surisCollapsed).CategoryTreefournit même unparentKeyOfcorrect viaparent_id.groups.isCollapsedchange avecflipped, les accessors module-const gardent les callbacks stables, les arbres se re-rendent bien au toggle.Tests — un manque non bloquant
allExpandedvit dansuseCollapsibleGroups, sans fichier de test dédié : ses briques sont testées, mais le collage précis qui corrige #290 (length > 0 && every(!isCollapsedFor)) ne l'est pas directement. Un test ciblé du hook (1-sur-N déplié ⇒ faux ; tous ⇒ vrai ; vide ⇒ faux) serait le vrai garde-fou de régression. Non bloquant : #290 est étiquetétype:refactor, le fix est une pure délégation à des primitives déjà couvertes, sans logique nouvelle.Observations mineures (non bloquantes)
CategoryTree— léger gain comportemental. Un nœud devenu parent après le montage s'ouvre désormais déplié (defaultExpanded: true) au lieu de replié (ancienSetseedé une seule fois). Meilleure UX, pas une régression de l'invariant « ouvre déplié ».categoriesSeed.migration.discover). Trivial.check.ymlne tourne que sur les PR versmain, donc ce maillon intermédiaire n'est pas CI-validé. Valider le tip cumulé en local (tsc && vite build,vitest run,cargo check) avant de merger la pile.Qualité / Sécurité / Données
[Unreleased], ordre Keep-a-Changelog correct (Changed avant Fixed). ✓refactor(categories): …·Resolves #290. ✓Verdict : APPROVE — 1 suggestion non bloquante (test de régression du hook
allExpanded).Mergé en fast-forward dans
main(pile #292→#295), commit9f628aa. Forgejo ne détecte pas le merge local → fermeture manuelle. L'issue liée s'est auto-fermée viaResolves #N.Pull request closed