Import : avertir des fichiers CSV posés directement dans le dossier d'import (ignorés aujourd'hui sans message) #427
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#427
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Un fichier posé directement dans le dossier d'import est ignoré sans laisser de trace : l'utilisateur qui y dépose ses relevés voit « Aucune source trouvée » sans savoir pourquoi. Le scan rend désormais ces fichiers, et la page Import les nomme dans un avertissement. Constat de l'analyse de #422, ouvert sur décision de Max.
Contexte
scan_import_folder(src-tauri/src/commands/fs_commands.rs:26) rendResult<Vec<ScannedSource>, String>et saute toute entrée de la racine qui n'est pas un dossier (:40-42) ;ScannedSource(:18-23) n'a pas de champ pour ces fichiers. Dans chaque sous-dossier, seuls les.csvet.txtposés directement sont lus.src/hooks/useImportWizard.ts:381(invoke<ScannedSource[]>), suivi dedispatch({ type: "SET_SCANNED_SOURCES", payload: sources })(:384), épinglé paruseImportWizard.mount.test.ts:93.RESETdu reducer garde le scan du dossier (:303-317, #384 : la lecture du montage ne se rejoue pas).Travail à faire
scan_import_folderrendImportFolderScan { sources: Vec<ScannedSource>, root_files: Vec<String> }(Serialize, noms de champs en snake_case commeScannedSource).root_files: noms des fichiers non cachés posés directement à la racine dont l'extension estcsvoutxt, avec la même règle de casse que les sous-dossiers, triés par nom. Mettre à jour le commentaire de la commande (règle du dépôt).ImportFolderScandanssrc/shared/types/index.ts. L'actionSET_SCANNED_SOURCESreçoit l'ImportFolderScanentier et posescannedSourcesetrootFilesensemble ;RESETgarderootFilescomme il gardescannedSources; un nouveau scan (changement de dossier, « Actualiser ») remplace les deux.useImportWizardexposerootFiles.src/utils/rootFiles.ts:formatRootFiles(names, max = 5)rend{ shown, more }.src/components/import/RootFilesWarning.tsx: icôneAlertTriangle(aria-hidden) et le message ; pas de région live (affiché au chargement). Rendu parImportPagequandrootFiles.length > 0: au-dessus de la liste des sources s'il y en a, sous l'état vide « aucune source » sinon ; jamais sans dossier choisi.{{folder}}=folderNameFromPath(importFolder)(ImportEmptyState.tsx:31), comme dans la carte « aucune source ».docs/architecture.md, ligne descan_import_folderdans la liste des commandes (« Scan récursif de dossier pour fichiers CSV/TXT ») : « Liste les sous-dossiers directs du dossier d'import (une source chacun) avec leurs fichiers CSV/TXT directs, et les CSV/TXT posés à la racine, ignorés (root_files) ».Textes (FR | EN)
{{names}}= les noms deshownjoints par « , », suivis d'un espace et deimport.rootFiles.morequandmore > 0.import.rootFiles.message_oneimport.rootFiles.message_otherimport.rootFiles.more_oneimport.rootFiles.more_otherdocs.import.tips(nouvelle, en dernier)Guide Markdown (section Import, astuces) : la même astuce.
Fichiers concernés
src-tauri/src/commands/fs_commands.rs(commande et tests)src/shared/types/index.tssrc/hooks/useImportWizard.ts,src/hooks/useImportWizard.test.ts,src/hooks/useImportWizard.mount.test.tssrc/utils/rootFiles.tset son test (nouveaux)src/components/import/RootFilesWarning.tsxet son test (nouveaux)src/pages/ImportPage.tsx,src/pages/ImportPage.render.test.tsxsrc/i18n/locales/fr.json,src/i18n/locales/en.jsondocs/architecture.md,docs/guide-utilisateur.md,docs/qa-onboarding.htmlCHANGELOG.md,CHANGELOG.fr.mdDepends on
Tests
root_files; autres extensions et fichiers cachés ignorés ; racine sans fichier →[].useImportWizard.test.ts) :SET_SCANNED_SOURCESpose sources etrootFiles;RESETgarde les deux.formatRootFiles: 0, 1, 5 et 7 noms (more= 2).useImportWizard.mount.test.ts: le fauxinvokerend la nouvelle forme,rootFilesest exposé.RootFilesWarning: message au singulier et au pluriel, cinq noms puis « et 2 autres ».ImportPage.render.test.tsx: l'avertissement au-dessus des sources, sous l'état vide « aucune source », absent sans dossier.Critères d'acceptation
a.csvà la racine et un sous-dossiervisa/affiche la sourcevisaet l'avertissement qui nommea.csv.cargo test,npm run buildetnpm testverts.Review caveats
rootFilesà[]parRESETaurait fait disparaître l'avertissement après « Annuler » ou « Terminé » alors que la liste des sources reste ; une seule action pose les deux etRESETgarde les deux.{{folder}}est le nom du dossier, pas le chemin (CWE-532).Décisions prises en planification
{ sources, root_files }en un seul appel ; avertissement sur la page Import avec jusqu'à 5 noms puis « et N autres » (Max, 2026-10-12).Conventions
src/i18n/locales/fr.json,en.json) ; les textes de ce corps s'écrivent mot pour mot (FR validé par Max le 2026-10-12, EN rédigé sur le même contenu).StepCardText.labels(src/utils/onboardingPath.ts), traduit parStepCard; jamais recopié dans la phrase. Guillemets « » en FR et “ ” en EN autour de chaque libellé de contrôle interpolé.## [Unreleased]dansCHANGELOG.mdetCHANGELOG.fr.md.renderToStaticMarkup(pas de jsdom) et le fauxtpartagé livré par #389.useImportWizard.ts:423-425: le Journal part avec un rapport de feedback).npm run build(il vérifie aussi les types des fichiers de test) etnpm testverts ;cargo testvert quand du Rust change.docs/guide-utilisateur.md) : repérer une ligne par son texte cité, pas par son numéro.CHANGELOG
Added / Ajouté : FR « Import : un avertissement nomme les fichiers CSV posés directement dans le dossier d'import, qui sont ignorés. » EN "Import: a warning names the CSV files placed directly in the import folder, which are ignored."
Spec source
spec-plan-retours-onboarding-v0171.md(local, ignoré par git) ; décisions dansspec-decisions-retours-onboarding-v0171.md.maximus referenced this issue2026-10-12 21:08:57 +00:00
Planification du 2026-10-12 (
/plan-run, jalonplanned-2026-10-12-retours-onboarding-v0171) : le corps est réécrit pour être autosuffisant (décisions de Max, constats de/review-specintégrés). Corps précédent ci-dessous.Corps précédent (titre : Import : avertir des fichiers CSV posés directement dans le dossier d'import (ignorés aujourd'hui sans message))
Contexte
Constat de l'analyse de #422 (2026-10-12,
mainà1954502), ouvert sur décision de Max.scan_import_folder(src-tauri/src/commands/fs_commands.rs:25-110) ne lit que les sous-dossiers du dossier d'import ::40-42) sans laisser de trace, etScannedSource(:18-23) n'a pas de champ pour elle ;.csvet.txtposés directement sont lus (WalkDir::max_depth(1)).Un utilisateur qui dépose ses relevés directement dans le dossier choisi voit donc « Aucune source trouvée » sans savoir pourquoi. #422 ajoute l'explication de la structure attendue (dossier parent, un sous-dossier par compte) ; cette issue ajoute l'avertissement à l'écran.
Travail à faire
.csvet.txttrouvés à la racine (leur nombre, ou leurs noms).Questions ouvertes
/analyze.Complexité estimée
Simple à moyenne (Rust et TS).