refactor(categories) : unifier la machine a etats des 2 arbres de categories sur useCollapsibleGroups #290

Open
opened 2026-07-16 00:26:02 +00:00 by maximus · 0 comments
Owner

Refs: spec-decisions-collapse-multi-niveaux.md + spec-plan-collapse-multi-niveaux.md (plan v2)

Depends on

  • #288 (le hook doit d'abord gagner defaultExpanded + storageKey nullable)

Independante de #289.

Contexte

Le repo a trois implementations de repli : useCollapsibleGroups (rapports — 1 niveau avant #288, persiste, replie-par-defaut), CategoryTree (page Categories CRUD — N niveaux, NON persiste, deplie-par-defaut, + drag-and-drop) et CategoryTaxonomyTree (guide taxonomie — N niveaux, NON persiste, replie-par-defaut, a deja les boutons bulk).

Les rendus sont inconciliables (liste plate indentee vs recursion sur children[]) — on ne les fusionne pas. Mais la machine a etats est identique (Set d'ids, toggle, expandAll, collapseAll, allExpanded, polarite, persistance). Apres #288, useCollapsibleGroups est un sur-ensemble strict de ce que les deux arbres bricolent.

Travail a faire

  • src/components/categories/CategoryTree.tsx — adopter useCollapsibleGroups pour l'etat seul (storageKey: null, defaultExpanded: true), en gardant le rendu recursif et le drag-and-drop. Supprimer collectExpandable (l.195-204) et le Set local.
  • src/components/categories/CategoryTaxonomyTree.tsx + src/pages/CategoriesStandardGuidePage.tsx — idem (storageKey: null, defaultExpanded: false).
  • Corriger le bug avere : CategoriesStandardGuidePage:79 calcule allExpanded = expanded.size > 0 → deplier UN seul noeud bascule le bouton en « Tout replier ». Le allExpanded du hook est correct.
  • Les deux arbres passent leurs noeuds aplatis a expandAll/collapseAll/allExpanded/groupCount (qui attendent un tableau de lignes).
  • CHANGELOG.md + CHANGELOG.fr.md — uniquement pour le bug du bouton (le reste est interne, invisible utilisateur).

Fichiers concernes

  • src/components/categories/CategoryTree.tsx
  • src/components/categories/CategoryTaxonomyTree.tsx
  • src/pages/CategoriesStandardGuidePage.tsx
  • CHANGELOG.md, CHANGELOG.fr.md

Tests

Pas de rendu React testable → couvrir la polarite via le helper pur isCollapsedFor (extrait en #288). Les deux arbres restent des afficheurs.

Review caveats

  • 🟡 Triplication (Architecture) : ne PAS fusionner les rendus (projections legitimement differentes) ; unifier la machine a etats seule. Deux Set locaux supprimes, renderers intacts.
  • 🟡 allExpanded = expanded.size > 0 : bug avere du guide, corrige ici.

Decisions prises en planification

  • Elargir le scope a l'unification (tranche avec Max) : apres #288 le hook est un sur-ensemble strict, et l'un des arbres a un bug de bouton avere.
  • Comportements preserves : page Categories toujours depliee a l'ouverture (surface d'edition CRUD), guide toujours replie. Seule la machine a etats change, pas la polarite ressentie.

Criteres d'acceptation

  • CategoryTree et CategoryTaxonomyTree ne portent plus leur propre Set d'etat
  • La page Categories s'ouvre toujours depliee ; le guide toujours replie
  • Le drag-and-drop de la page Categories fonctionne comme avant
  • Sur le guide, deplier un noeud ne bascule plus le bouton en « Tout replier »

Spec source

spec-plan-collapse-multi-niveaux.md (v2)

Refs: `spec-decisions-collapse-multi-niveaux.md` + `spec-plan-collapse-multi-niveaux.md` (plan **v2**) ## Depends on - #288 (le hook doit d'abord gagner `defaultExpanded` + `storageKey` nullable) Independante de #289. ## Contexte Le repo a **trois** implementations de repli : `useCollapsibleGroups` (rapports — 1 niveau avant #288, persiste, replie-par-defaut), `CategoryTree` (page Categories CRUD — N niveaux, NON persiste, **deplie**-par-defaut, + drag-and-drop) et `CategoryTaxonomyTree` (guide taxonomie — N niveaux, NON persiste, replie-par-defaut, a deja les boutons bulk). Les **rendus** sont inconciliables (liste plate indentee vs recursion sur `children[]`) — on ne les fusionne pas. Mais la **machine a etats** est identique (Set d'ids, toggle, expandAll, collapseAll, allExpanded, polarite, persistance). Apres #288, `useCollapsibleGroups` est un **sur-ensemble strict** de ce que les deux arbres bricolent. ## Travail a faire - [ ] `src/components/categories/CategoryTree.tsx` — adopter `useCollapsibleGroups` pour **l'etat seul** (`storageKey: null`, `defaultExpanded: true`), en **gardant** le rendu recursif et le drag-and-drop. Supprimer `collectExpandable` (l.195-204) et le `Set` local. - [ ] `src/components/categories/CategoryTaxonomyTree.tsx` + `src/pages/CategoriesStandardGuidePage.tsx` — idem (`storageKey: null`, `defaultExpanded: false`). - [ ] **Corriger le bug avere** : `CategoriesStandardGuidePage:79` calcule `allExpanded = expanded.size > 0` → deplier UN seul noeud bascule le bouton en « Tout replier ». Le `allExpanded` du hook est correct. - [ ] Les deux arbres passent leurs noeuds **aplatis** a `expandAll`/`collapseAll`/`allExpanded`/`groupCount` (qui attendent un tableau de lignes). - [ ] CHANGELOG.md + CHANGELOG.fr.md — **uniquement** pour le bug du bouton (le reste est interne, invisible utilisateur). ## Fichiers concernes - `src/components/categories/CategoryTree.tsx` - `src/components/categories/CategoryTaxonomyTree.tsx` - `src/pages/CategoriesStandardGuidePage.tsx` - `CHANGELOG.md`, `CHANGELOG.fr.md` ## Tests Pas de rendu React testable → couvrir la polarite via le helper pur `isCollapsedFor` (extrait en #288). Les deux arbres restent des afficheurs. ## Review caveats - 🟡 **Triplication** (Architecture) : ne PAS fusionner les rendus (projections legitimement differentes) ; unifier **la machine a etats seule**. Deux Set locaux supprimes, renderers intacts. - 🟡 **`allExpanded = expanded.size > 0`** : bug avere du guide, corrige ici. ## Decisions prises en planification - Elargir le scope a l'unification (tranche avec Max) : apres #288 le hook est un sur-ensemble strict, et l'un des arbres a un bug de bouton avere. - **Comportements preserves** : page Categories toujours **depliee** a l'ouverture (surface d'edition CRUD), guide toujours **replie**. Seule la machine a etats change, pas la polarite ressentie. ## Criteres d'acceptation - [ ] `CategoryTree` et `CategoryTaxonomyTree` ne portent plus leur propre `Set` d'etat - [ ] La page Categories s'ouvre toujours **depliee** ; le guide toujours **replie** - [ ] Le drag-and-drop de la page Categories fonctionne comme avant - [ ] Sur le guide, deplier **un** noeud ne bascule plus le bouton en « Tout replier » ## Spec source spec-plan-collapse-multi-niveaux.md (v2)
maximus added this to the planned-2026-07-15-collapse-multi-niveaux milestone 2026-07-16 00:26:02 +00:00
maximus added the
status:ready
type:refactor
source:human
labels 2026-07-16 00:26:02 +00:00
Sign in to join this conversation.
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#290
No description provided.