Import : le nom d'une source est celui de son sous-dossier (une source renommée n'était plus retrouvée) #426

Closed
opened 2026-10-12 21:07:35 +00:00 by maximus · 1 comment
Owner

Le nom saisi à la configuration d'une source est enregistré, mais la source est retrouvée par le nom de son dossier : une source renommée paraît neuve au prochain import. Le nom d'une source devient celui de son sous-dossier, en lecture seule. Constat de l'analyse de #422, établi à la lecture du code ; correction choisie par Max le 2026-10-12.

Planifié le 2026-10-12 (/plan-run, jalon planned-2026-10-12-retours-onboarding-v0171), après /analyze et une revue /review-spec (sécurité, architecture, technique) dont les constats sont intégrés ci-dessous. Corps autosuffisant : la spec (spec-plan-retours-onboarding-v0171.md) est locale et ignorée par git. L'ancien corps est archivé en commentaire.

Préalable : ce jalon s'exécute après le merge de planned-2026-10-10-fiabilite-tests (#408, #409, #395, #389). Les numéros de ligne cités sont lus sur main à 8b5b3b1 et ont pu bouger : se fier aux noms de fonctions, aux clés et aux textes cités.

Contexte (établi à la lecture)

  • Le champ « Nom de la source » est modifiable (src/components/import/SourceConfigPanel.tsx:252-263), et la carte du parcours y invite (« Vérifiez le nom de la source et les fichiers cochés »).
  • À l'import, ce nom est écrit dans import_sources.name, colonne UNIQUE (src/hooks/useImportWizard.ts:1044-1060, consolidated_schema.sql:10).
  • À l'ouverture suivante du dossier, la source est cherchée par le nom du dossier : getSourceByName(source.folder_name) (useImportWizard.ts:525, src/services/importSourceService.ts:29-37). Les fichiers déjà importés sont indexés par import_sources.name (src/services/importedFileService.ts:87-89) et lus par le nom du dossier (useImportWizard.ts:508, :719).
  • Conséquences : la source renommée paraît non configurée (format re-deviné, contre l'ADR 0019), tous ses fichiers paraissent nouveaux et sont précochés, et l'import crée une seconde source au nom du dossier (useImportWizard.ts:578).

Travail à faire

  • SourceConfigPanel : le champ « Nom de la source » devient une valeur en lecture seule (le nom du sous-dossier, source.folder_name), avec l'aide import.config.sourceNameHint. Extraire ce bloc dans un petit composant src/components/import/SourceNameDisplay.tsx, testable en rendu statique.
  • executeImport (useImportWizard.ts:1019) : la garde de tête devient if (!state.duplicateResult || !state.selectedSource) return;, puis le nom enregistré est state.selectedSource.folder_name, à la création comme à la mise à jour, quel que soit config.name.
  • Texte de la carte de configuration (ci-dessous).
  • Le guide ne décrit nulle part la saisie du nom de la source (vérifié le 2026-10-12) : seulement l'astuce ci-dessous, dans docs.import.tips et dans la section Import du guide Markdown.

Textes (FR | EN)

Clé FR EN
onboarding.card.import.sourceConfig Vérifiez les fichiers cochés, puis cliquez « {{button}} ». Check the selected files, then click “{{button}}”.
import.config.sourceNameHint (nouvelle) Le nom de la source est celui de son sous-dossier. A source is named after its subfolder.
docs.import.tips (nouvelle, en dernier, après celle de #427) Le nom d'une source est celui de son sous-dossier A source is named after its subfolder

Fichiers concernés

  • src/components/import/SourceConfigPanel.tsx
  • src/components/import/SourceNameDisplay.tsx et son test (nouveaux)
  • src/hooks/useImportWizard.ts, src/hooks/useImportWizard.executeImport.test.ts
  • src/i18n/locales/fr.json, src/i18n/locales/en.json
  • docs/guide-utilisateur.md, docs/qa-onboarding.html
  • CHANGELOG.md, CHANGELOG.fr.md

Depends on

Lien d'ordre : mêmes clés import.* et docs.import.tips, même section du guide.

Tests

  • useImportWizard.executeImport.test.ts : le gabarit readyToImport() reçoit une selectedSource ; avec config.name différent du nom du dossier, le nom enregistré est celui du dossier, à la création et à la mise à jour ; sans selectedSource, rien n'est écrit.
  • SourceNameDisplay : affiche le nom et l'aide ; aucun <input>.
  • Mutation : remettre config.name à l'écriture doit rougir le test.

Critères d'acceptation

  • La configuration d'une source n'a plus de champ de saisie pour le nom ; le nom affiché est celui du sous-dossier.
  • Après un import, rouvrir le même sous-dossier retrouve la source : format restauré sans détection, fichiers déjà importés non précochés.
  • npm run build et npm test verts.

Review caveats

  • 🟡 Technique, résolu : le gabarit readyToImport() (useImportWizard.executeImport.test.ts:79-90) laisse selectedSource à null ; garde de tête ajoutée et gabarit complété.
  • 🟢 Architecture, gardé : config.name reste lu (ImportPage.tsx:56 pour le bouton suivant, :256 pour la confirmation) et alimenté en trois points (useImportWizard.ts:548, :578, :1302) ; une fois le champ retiré, ces trois points le fixent toujours au nom du dossier, et l'écriture par folder_name garantit le nom enregistré.

Décisions prises en planification

  • Le nom d'une source est celui de son sous-dossier, en lecture seule ; aucune migration (Max, 2026-10-12). Une colonne folder_name (v18) a été écartée.
  • Hors périmètre : réparer les sources déjà renommées dans les bases existantes (testeurs seuls) ; renommer le dossier crée une nouvelle source, comme aujourd'hui, d'où une aide qui n'invite pas à le faire.

Conventions

  • Toute chaîne en FR et en EN (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).
  • Phrase de carte : un contrôle cité passe par StepCardText.labels (src/utils/onboardingPath.ts), traduit par StepCard ; jamais recopié dans la phrase. Guillemets « » en FR et “ ” en EN autour de chaque libellé de contrôle interpolé.
  • CHANGELOG : une entrée sous ## [Unreleased] dans CHANGELOG.md et CHANGELOG.fr.md.
  • Tests de rendu : renderToStaticMarkup (pas de jsdom) et le faux t partagé livré par #389.
  • Journal : aucune ligne avec un chemin absolu, un nom de relevé ni un nom de dossier d'import (règle de useImportWizard.ts:423-425 : le Journal part avec un rapport de feedback).
  • Aucune migration ; npm run build (il vérifie aussi les types des fichiers de test) et npm test verts ; cargo test vert quand du Rust change.
  • Guide Markdown (docs/guide-utilisateur.md) : repérer une ligne par son texte cité, pas par son numéro.

CHANGELOG

Fixed / Corrigé : FR « Import : le nom d'une source est celui de son sous-dossier, en lecture seule ; une source renommée à la configuration n'est plus prise pour une nouvelle source au prochain import. » EN "Import: a source is named after its subfolder, read-only; a source renamed during configuration is no longer taken for a new source at the next import."

Spec source

spec-plan-retours-onboarding-v0171.md (local, ignoré par git) ; décisions dans spec-decisions-retours-onboarding-v0171.md.

Le nom saisi à la configuration d'une source est enregistré, mais la source est retrouvée par le nom de son dossier : une source renommée paraît neuve au prochain import. Le nom d'une source devient celui de son sous-dossier, en lecture seule. Constat de l'analyse de #422, établi à la lecture du code ; correction choisie par Max le 2026-10-12. > Planifié le 2026-10-12 (`/plan-run`, jalon `planned-2026-10-12-retours-onboarding-v0171`), après `/analyze` et une revue `/review-spec` (sécurité, architecture, technique) dont les constats sont intégrés ci-dessous. Corps autosuffisant : la spec (`spec-plan-retours-onboarding-v0171.md`) est locale et ignorée par git. L'ancien corps est archivé en commentaire. > > **Préalable :** ce jalon s'exécute après le merge de `planned-2026-10-10-fiabilite-tests` (#408, #409, #395, #389). Les numéros de ligne cités sont lus sur `main` à `8b5b3b1` et ont pu bouger : se fier aux noms de fonctions, aux clés et aux textes cités. ## Contexte (établi à la lecture) - Le champ « Nom de la source » est modifiable (`src/components/import/SourceConfigPanel.tsx:252-263`), et la carte du parcours y invite (« Vérifiez le nom de la source et les fichiers cochés »). - À l'import, ce nom est écrit dans `import_sources.name`, colonne `UNIQUE` (`src/hooks/useImportWizard.ts:1044-1060`, `consolidated_schema.sql:10`). - À l'ouverture suivante du dossier, la source est cherchée par le nom du dossier : `getSourceByName(source.folder_name)` (`useImportWizard.ts:525`, `src/services/importSourceService.ts:29-37`). Les fichiers déjà importés sont indexés par `import_sources.name` (`src/services/importedFileService.ts:87-89`) et lus par le nom du dossier (`useImportWizard.ts:508`, `:719`). - Conséquences : la source renommée paraît non configurée (format re-deviné, contre l'ADR 0019), tous ses fichiers paraissent nouveaux et sont précochés, et l'import crée une seconde source au nom du dossier (`useImportWizard.ts:578`). ## Travail à faire - [ ] `SourceConfigPanel` : le champ « Nom de la source » devient une valeur en lecture seule (le nom du sous-dossier, `source.folder_name`), avec l'aide `import.config.sourceNameHint`. Extraire ce bloc dans un petit composant `src/components/import/SourceNameDisplay.tsx`, testable en rendu statique. - [ ] `executeImport` (`useImportWizard.ts:1019`) : la garde de tête devient `if (!state.duplicateResult || !state.selectedSource) return;`, puis le nom enregistré est `state.selectedSource.folder_name`, à la création comme à la mise à jour, quel que soit `config.name`. - [ ] Texte de la carte de configuration (ci-dessous). - [ ] Le guide ne décrit nulle part la saisie du nom de la source (vérifié le 2026-10-12) : seulement l'astuce ci-dessous, dans `docs.import.tips` et dans la section Import du guide Markdown. ## Textes (FR | EN) | Clé | FR | EN | |---|---|---| | `onboarding.card.import.sourceConfig` | Vérifiez les fichiers cochés, puis cliquez « {{button}} ». | Check the selected files, then click “{{button}}”. | | `import.config.sourceNameHint` (nouvelle) | Le nom de la source est celui de son sous-dossier. | A source is named after its subfolder. | | `docs.import.tips` (nouvelle, en dernier, après celle de #427) | Le nom d'une source est celui de son sous-dossier | A source is named after its subfolder | ## Fichiers concernés - `src/components/import/SourceConfigPanel.tsx` - `src/components/import/SourceNameDisplay.tsx` et son test (nouveaux) - `src/hooks/useImportWizard.ts`, `src/hooks/useImportWizard.executeImport.test.ts` - `src/i18n/locales/fr.json`, `src/i18n/locales/en.json` - `docs/guide-utilisateur.md`, `docs/qa-onboarding.html` - `CHANGELOG.md`, `CHANGELOG.fr.md` ## Depends on - #427 > Lien d'ordre : mêmes clés `import.*` et `docs.import.tips`, même section du guide. ## Tests - `useImportWizard.executeImport.test.ts` : le gabarit `readyToImport()` reçoit une `selectedSource` ; avec `config.name` différent du nom du dossier, le nom enregistré est celui du dossier, à la création et à la mise à jour ; sans `selectedSource`, rien n'est écrit. - `SourceNameDisplay` : affiche le nom et l'aide ; aucun `<input>`. - Mutation : remettre `config.name` à l'écriture doit rougir le test. ## Critères d'acceptation - [ ] La configuration d'une source n'a plus de champ de saisie pour le nom ; le nom affiché est celui du sous-dossier. - [ ] Après un import, rouvrir le même sous-dossier retrouve la source : format restauré sans détection, fichiers déjà importés non précochés. - [ ] `npm run build` et `npm test` verts. ## Review caveats - 🟡 Technique, résolu : le gabarit `readyToImport()` (`useImportWizard.executeImport.test.ts:79-90`) laisse `selectedSource` à `null` ; garde de tête ajoutée et gabarit complété. - 🟢 Architecture, gardé : `config.name` reste lu (`ImportPage.tsx:56` pour le bouton suivant, `:256` pour la confirmation) et alimenté en trois points (`useImportWizard.ts:548`, `:578`, `:1302`) ; une fois le champ retiré, ces trois points le fixent toujours au nom du dossier, et l'écriture par `folder_name` garantit le nom enregistré. ## Décisions prises en planification - Le nom d'une source est celui de son sous-dossier, en lecture seule ; aucune migration (Max, 2026-10-12). Une colonne `folder_name` (v18) a été écartée. - Hors périmètre : réparer les sources déjà renommées dans les bases existantes (testeurs seuls) ; renommer le dossier crée une nouvelle source, comme aujourd'hui, d'où une aide qui n'invite pas à le faire. ## Conventions - Toute chaîne en FR et en EN (`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). - Phrase de carte : un contrôle cité passe par `StepCardText.labels` (`src/utils/onboardingPath.ts`), traduit par `StepCard` ; jamais recopié dans la phrase. Guillemets « » en FR et “ ” en EN autour de chaque libellé de contrôle interpolé. - CHANGELOG : une entrée sous `## [Unreleased]` dans `CHANGELOG.md` et `CHANGELOG.fr.md`. - Tests de rendu : `renderToStaticMarkup` (pas de jsdom) et le faux `t` partagé livré par #389. - Journal : aucune ligne avec un chemin absolu, un nom de relevé ni un nom de dossier d'import (règle de `useImportWizard.ts:423-425` : le Journal part avec un rapport de feedback). - Aucune migration ; `npm run build` (il vérifie aussi les types des fichiers de test) et `npm test` verts ; `cargo test` vert quand du Rust change. - Guide Markdown (`docs/guide-utilisateur.md`) : repérer une ligne par son texte cité, pas par son numéro. ## CHANGELOG Fixed / Corrigé : FR « Import : le nom d'une source est celui de son sous-dossier, en lecture seule ; une source renommée à la configuration n'est plus prise pour une nouvelle source au prochain import. » EN "Import: a source is named after its subfolder, read-only; a source renamed during configuration is no longer taken for a new source at the next import." ## Spec source `spec-plan-retours-onboarding-v0171.md` (local, ignoré par git) ; décisions dans `spec-decisions-retours-onboarding-v0171.md`.
maximus added the
status:triage
type:bug
source:human
labels 2026-10-12 21:07:35 +00:00
Author
Owner

Planification du 2026-10-12 (/plan-run, jalon planned-2026-10-12-retours-onboarding-v0171) : le corps est réécrit pour être autosuffisant (décisions de Max, constats de /review-spec intégrés). Corps précédent ci-dessous.

Corps précédent (titre : Import : une source renommée à la configuration n'est plus retrouvée à l'import suivant (recherche par nom de dossier))

Contexte

Constat de l'analyse de #422 (2026-10-12, main à 1954502), établi à la lecture du code, non reproduit. Ouvert sur décision de Max.

  • La configuration d'une source a un champ « Nom de la source », modifiable (src/components/import/SourceConfigPanel.tsx:252-263). La carte du parcours y invite : « Vérifiez le nom de la source et les fichiers cochés » (onboarding.card.import.sourceConfig).
  • À l'import, ce nom est écrit dans import_sources.name, colonne UNIQUE (src/hooks/useImportWizard.ts:1044-1060, src-tauri/src/database/consolidated_schema.sql:10).
  • À l'ouverture suivante du dossier, la source est cherchée par le nom du dossier : getSourceByName(source.folder_name) (useImportWizard.ts:525, src/services/importSourceService.ts:29-37).
  • Les fichiers déjà importés sont indexés par import_sources.name (src/services/importedFileService.ts:87-89), mais lus par le nom du dossier (useImportWizard.ts:508, :719).

Conséquences attendues, à confirmer :

  • la source paraît non configurée, et son format est re-deviné, contre l'ADR 0019 (format persisté, jamais re-deviné) ;
  • tous les fichiers du dossier paraissent nouveaux et sont précochés ;
  • l'import crée une seconde source au nom du dossier (useImportWizard.ts:578) ; seule la vérification des doublons arrête alors les transactions déjà importées.

Travail à faire

  • Reproduire : importer un dossier en changeant le nom de la source, puis rouvrir le dossier.
  • /analyze : choisir la correction. Pistes : une clé stable par dossier (colonne dédiée, donc migration v18), le nom gardé pour l'affichage seulement avec le dossier comme clé, ou un champ en lecture seule.

Critères d'acceptation (si le bug se confirme)

  • Une source renommée est retrouvée à l'ouverture suivante, avec son format et la liste de ses fichiers importés.
  • Test de régression sur le chemin renommage → réouverture.

Complexité estimée

À établir après reproduction ; moyenne si une migration est retenue.

Planification du 2026-10-12 (`/plan-run`, jalon `planned-2026-10-12-retours-onboarding-v0171`) : le corps est réécrit pour être autosuffisant (décisions de Max, constats de `/review-spec` intégrés). Corps précédent ci-dessous. <details><summary>Corps précédent (titre : Import : une source renommée à la configuration n'est plus retrouvée à l'import suivant (recherche par nom de dossier))</summary> ## Contexte Constat de l'analyse de #422 (2026-10-12, `main` à `1954502`), **établi à la lecture du code, non reproduit**. Ouvert sur décision de Max. - La configuration d'une source a un champ « Nom de la source », modifiable (`src/components/import/SourceConfigPanel.tsx:252-263`). La carte du parcours y invite : « Vérifiez le nom de la source et les fichiers cochés » (`onboarding.card.import.sourceConfig`). - À l'import, ce nom est écrit dans `import_sources.name`, colonne `UNIQUE` (`src/hooks/useImportWizard.ts:1044-1060`, `src-tauri/src/database/consolidated_schema.sql:10`). - À l'ouverture suivante du dossier, la source est cherchée par le **nom du dossier** : `getSourceByName(source.folder_name)` (`useImportWizard.ts:525`, `src/services/importSourceService.ts:29-37`). - Les fichiers déjà importés sont indexés par `import_sources.name` (`src/services/importedFileService.ts:87-89`), mais lus par le nom du dossier (`useImportWizard.ts:508`, `:719`). Conséquences attendues, à confirmer : - la source paraît non configurée, et son format est re-deviné, contre l'ADR 0019 (format persisté, jamais re-deviné) ; - tous les fichiers du dossier paraissent nouveaux et sont précochés ; - l'import crée une seconde source au nom du dossier (`useImportWizard.ts:578`) ; seule la vérification des doublons arrête alors les transactions déjà importées. ## Travail à faire - [ ] Reproduire : importer un dossier en changeant le nom de la source, puis rouvrir le dossier. - [ ] `/analyze` : choisir la correction. Pistes : une clé stable par dossier (colonne dédiée, donc migration v18), le nom gardé pour l'affichage seulement avec le dossier comme clé, ou un champ en lecture seule. ## Critères d'acceptation (si le bug se confirme) - [ ] Une source renommée est retrouvée à l'ouverture suivante, avec son format et la liste de ses fichiers importés. - [ ] Test de régression sur le chemin renommage → réouverture. ## Complexité estimée À établir après reproduction ; moyenne si une migration est retenue. </details>
maximus changed title from Import : une source renommée à la configuration n'est plus retrouvée à l'import suivant (recherche par nom de dossier) to Import : le nom d'une source est celui de son sous-dossier (une source renommée n'était plus retrouvée) 2026-10-12 23:25:27 +00:00
maximus added this to the planned-2026-10-12-retours-onboarding-v0171 milestone 2026-10-12 23:25:27 +00:00
maximus added
status:ready
and removed
status:triage
labels 2026-10-12 23:25:27 +00:00
maximus added
status:in-progress
and removed
status:ready
labels 2026-10-14 01:04:06 +00:00
maximus added
status:review
and removed
status:in-progress
labels 2026-10-14 01:08:50 +00:00
maximus added
status:approved
and removed
status:review
labels 2026-10-14 23:51:50 +00:00
maximus removed the
status:approved
label 2026-10-16 00:38:16 +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#426
No description provided.