migration categories standards #246

Closed
opened 2026-07-04 20:20:48 +00:00 by maximus · 0 comments
Owner

Contexte

Flux de migration des catégories v2->v1 (refonte seed IPC, route /settings/categories/migrate). L'étape d'aperçu = StepSimulate.tsx (tableau source->cible), chaque ligne = MappingRow.tsx.

Aujourd'hui : une cible auto-détectée (confiance high/medium/low) est affichée en TEXTE NON éditable (MappingRow.tsx ~143) ; seules les lignes non résolues (confiance none) ont un <select> HTML PLAT sans détection à la saisie (~128). Un commentaire du code prétendant qu'une search box aide en étape 2 est obsolète/faux (la seule search est en étape 1).

Décision (figée via /analyze 2026-07-04)

Rendre la cible éditable pour TOUTES les lignes (pas seulement les non résolues) avec DÉTECTION À LA SAISIE (type-ahead), en réutilisant CategoryCombobox.

Travail à faire

  • Dans MappingRow.tsx, remplacer le rendu (texte non éditable + <select> plat) par un combobox type-ahead éditable sur TOUTES les lignes.
  • Réutiliser src/components/shared/CategoryCombobox.tsx (type-ahead accent-insensible, clavier, hiérarchique). Écueil : il attend le type Category ; la migration fournit des TaxonomyLeaf (useCategoryTaxonomy().getLeaves()). Écrire un mapping d'adaptation TaxonomyLeaf -> Category-like (ajouter parent_id/is_active/is_inputable), OU cloner l'idiome SecurityPicker alimenté par getLeaves().
  • Calculer la liste des cibles une fois dans StepSimulate et la passer en prop aux lignes (perf), plutôt que getLeaves() par ligne.
  • Badge de confiance quand on édite une ligne déjà résolue : conserver le comportement RESOLVE_ROW actuel (bump none->medium, inchangé sinon). Optionnel : marquer « modifié manuellement ».

Fichiers concernés

  • src/components/categories-migration/MappingRow.tsx — cœur du changement.
  • src/components/categories-migration/StepSimulate.tsx — passe la liste des cibles en prop.
  • src/components/shared/CategoryCombobox.tsx — réutilisé (+ adaptation de type).
  • src/hooks/useCategoryMigration.tsRESOLVE_ROW accepte déjà toute ligne (pas de changement de reducer requis).
  • src/services/categoryTaxonomyService.ts / useCategoryTaxonomy.ts — source des leaves.
  • src/i18n/locales/fr.json + en.json — clés categoriesSeed.migration.simulate.* / placeholder de recherche réutilisable.

Surface de test

  • categoryMappingService.test.ts + useCategoryMigration.test.ts (dont RESOLVE_ROW) couvrent la logique.
  • CategoryCombobox.test.ts teste sortHierarchical (helper pur ; pas de DOM dans le projet).
  • Ajouter un test du helper d'adaptation TaxonomyLeaf -> Category-like.

Critères d'acceptation

  • Toute ligne du mapping (résolue ou non) peut voir sa cible modifiée.
  • La saisie filtre les cibles en temps réel (type-ahead accent-insensible).
  • La garde de navigation (unresolved > 0 bloque l'étape suivante) reste fonctionnelle.
  • La cible éditée se propage à applyMigration (buildMappingFromRows).
  • Clés i18n FR + EN.

Complexité : Simple/Medium

Notes autopilot

  • Indépendant côté logique ; touche fr.json/en.json (conflit i18n possible en parallèle).
  • Micro-choix (badge « modifié manuellement ») = tier LOW, décider par défaut (garder comportement actuel).
  • Aucune question ouverte.
## Contexte Flux de migration des catégories v2->v1 (refonte seed IPC, route `/settings/categories/migrate`). L'étape d'aperçu = `StepSimulate.tsx` (tableau source->cible), chaque ligne = `MappingRow.tsx`. Aujourd'hui : une cible auto-détectée (confiance high/medium/low) est affichée en TEXTE NON éditable (`MappingRow.tsx` ~143) ; seules les lignes non résolues (confiance none) ont un `<select>` HTML PLAT sans détection à la saisie (~128). Un commentaire du code prétendant qu'une search box aide en étape 2 est obsolète/faux (la seule search est en étape 1). ## Décision (figée via /analyze 2026-07-04) Rendre la cible éditable pour TOUTES les lignes (pas seulement les non résolues) avec DÉTECTION À LA SAISIE (type-ahead), en réutilisant `CategoryCombobox`. ## Travail à faire - [ ] Dans `MappingRow.tsx`, remplacer le rendu (texte non éditable + `<select>` plat) par un combobox type-ahead éditable sur TOUTES les lignes. - [ ] Réutiliser `src/components/shared/CategoryCombobox.tsx` (type-ahead accent-insensible, clavier, hiérarchique). Écueil : il attend le type `Category` ; la migration fournit des `TaxonomyLeaf` (`useCategoryTaxonomy().getLeaves()`). Écrire un mapping d'adaptation `TaxonomyLeaf` -> `Category`-like (ajouter `parent_id`/`is_active`/`is_inputable`), OU cloner l'idiome `SecurityPicker` alimenté par `getLeaves()`. - [ ] Calculer la liste des cibles une fois dans `StepSimulate` et la passer en prop aux lignes (perf), plutôt que `getLeaves()` par ligne. - [ ] Badge de confiance quand on édite une ligne déjà résolue : conserver le comportement `RESOLVE_ROW` actuel (bump none->medium, inchangé sinon). Optionnel : marquer « modifié manuellement ». ## Fichiers concernés - `src/components/categories-migration/MappingRow.tsx` — cœur du changement. - `src/components/categories-migration/StepSimulate.tsx` — passe la liste des cibles en prop. - `src/components/shared/CategoryCombobox.tsx` — réutilisé (+ adaptation de type). - `src/hooks/useCategoryMigration.ts` — `RESOLVE_ROW` accepte déjà toute ligne (pas de changement de reducer requis). - `src/services/categoryTaxonomyService.ts` / `useCategoryTaxonomy.ts` — source des leaves. - `src/i18n/locales/fr.json` + `en.json` — clés `categoriesSeed.migration.simulate.*` / placeholder de recherche réutilisable. ## Surface de test - `categoryMappingService.test.ts` + `useCategoryMigration.test.ts` (dont `RESOLVE_ROW`) couvrent la logique. - `CategoryCombobox.test.ts` teste `sortHierarchical` (helper pur ; pas de DOM dans le projet). - Ajouter un test du helper d'adaptation `TaxonomyLeaf` -> `Category`-like. ## Critères d'acceptation - [ ] Toute ligne du mapping (résolue ou non) peut voir sa cible modifiée. - [ ] La saisie filtre les cibles en temps réel (type-ahead accent-insensible). - [ ] La garde de navigation (`unresolved > 0` bloque l'étape suivante) reste fonctionnelle. - [ ] La cible éditée se propage à `applyMigration` (`buildMappingFromRows`). - [ ] Clés i18n FR + EN. ## Complexité : Simple/Medium ## Notes autopilot - Indépendant côté logique ; touche `fr.json`/`en.json` (conflit i18n possible en parallèle). - Micro-choix (badge « modifié manuellement ») = tier LOW, décider par défaut (garder comportement actuel). - Aucune question ouverte.
maximus added this to the overnight-2026-07-05-bilan-rapports-ux milestone 2026-07-04 20:45:13 +00:00
maximus added the
status:ready
type:feature
source:human
labels 2026-07-04 20:45:13 +00:00
maximus added
status:approved
and removed
status:ready
labels 2026-07-05 01:19:13 +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#246
No description provided.