feat(categories): editable migration target with type-ahead (#246) #252
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#252
Loading…
Reference in a new issue
No description provided.
Delete branch "issue-246-migration-cible-editable"
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?
Make the v1 target editable on EVERY row of the categories-migration preview (not only the "needs review" ones), reusing CategoryCombobox (accent-insensitive type-ahead, keyboard, hierarchical). A pure adapter flattens the full v1 taxonomy once in StepSimulate and passes it as a prop; the full tree is fed so mid-tree default targets like "Divertissement" (id 1710) display and can be re-picked. Reducer/guard behavior unchanged.
Resolves #246
Generated autonomously by /autopilot run of 2026-07-04
Revue adversariale — PR #252 (Resolves #246)
Verdict : APPROVE ✅
Résumé
Change propre et bien cadré : la cible v1 de l'étape « aperçu » de la migration des catégories devient éditable sur chaque ligne via le
CategoryComboboxpartagé, alimenté par un adaptateur pur bien testé. Le reducer et la garde de continuation sont réellement inchangés, l'i18n et le CHANGELOG sont à jour, aucune régression détectée.Vérifications
categoryMigrationService.buildMappingFromRows) n'utilise querow.v1TargetId, jamaissplits. Re-piquer une ligne « split » (ex. v2 #26 → défaut non-feuille 1710 « Divertissement ») prend donc bien effet, et lesplitsrésiduel laissé parRESOLVE_ROWest inerte (TransactionPreviewPanelne le lit pas). Pas de bug de préséance splits/cible.DEFAULT_MAPPINGS[26].primaryV1Id = 1710, et 1710 a 5 enfants danscategoryTaxonomyV1.json. La ré-injection de la cible non-feuille courante pour éviter de vider l'input du combobox est justifiée.RESOLVE_ROW:confidence: r.confidence === "none" ? "medium" : r.confidence. Résoudre une ligne « none » → medium ; éditer une ligne déjà résolue conserve sa confiance. Commentaires exacts.taxonomyToComboboxCategoriesproduit unCategorycomplet et type-safe (parent_id: undefined→ liste plate,sort_ordercourant → ordre DFS préservé parsortHierarchical). Tests exacts : 150 nœuds / 112 feuilles / 38 parents vérifié contre le JSON bundlé.StepSimulate(pas par ligne),resolveTarget/targetCategoriesstables (deps[taxonomy], hook mémoïsé[]),comboboxCategoriesmémoïsé par ligne. OK.stopPropagationsuronClick/onKeyDownde la cellule cible empêche le combobox de déclencher le select/preview de la ligne, sans casser la navigation clavier interne du combobox (bulle après le handler de l'input). OK.editTargetAriaajoutée EN + FR ; entrées Changed/Modifié sous [Unreleased]/[Non publié] avec réf #246. Conforme.migrationTargets.test.ts) et le reducer (useCategoryMigration.test.ts) couvrent la logique ; aucun test composant existant ne référence l'ancien<select>, donc pas de régression. PR ciblantmain→check.ymls'exécute (pas de pile).Suggestions (non bloquantes)
CategoryComboboxne filtre pas suris_inputable), contrairement au commentaire « never offered as a new pick » dansMappingRow.tsx. Le pick est un no-op garanti inoffensif (gardetargetCategories.find(...)danshandleTargetChange), et 1710 n'apparaît que sur la ligne qui pointe déjà dessus → le re-sélectionner = conserver la valeur courante. Bénin, mais la formulation du commentaire pourrait être resserrée.comboboxCategories+handleTargetChangedansMappingRow) n'a pas de test RTL. Les helpers purs et le reducer sont couverts ; un test composant fermerait le trou mais n'est pas requis (aucunMappingRow.testpréexistant dans le repo).Rien ne bloque le merge.
Merged into
mainlocally as part of the milestone stack (merge commit9124c88). Closing manually — the merge was done outside Forgejo's API, so it can't flag this PR as merged. The change is onmain.Pull request closed