ui(paramètres): la liste complète des versions repousse le Journal tout en bas de Paramètres → Systèmes #372

Open
opened 2026-10-03 14:38:46 +00:00 by maximus · 1 comment
Owner

Contexte

Constat de Max le 2026-10-03, en testant la v0.16.0 : pour lire la ligne du contrôle de licence dans le Journal, il a fallu descendre sous toute la liste des versions. « C'est lourd, long. »

La page Paramètres → Systèmes (src/pages/settings/SystemsSettingsPage.tsx) empile, dans cet ordre : Version, Mises à jour (UpdateCard), Journal des modifications (ChangelogContent), Journaux (LogViewerCard), mention de sécurité des données. Le Journal sert de plus en plus : depuis #365, chaque contrôle de licence y est écrit, le guide y renvoie l'utilisateur, et le bouton de rétroaction s'y trouve.

Analyse (/analyze, 2026-10-03, main 0e4fef5)

Le corps d'origine est archivé en commentaire. Sa prémisse sur /changelog était fausse :

  • Pas de page d'historique ailleurs. src/pages/ChangelogPage.tsx est un <Navigate to="/settings/systems" replace /> depuis #190 (App.tsx:154, docs/architecture.md:472). ChangelogContent n'est importé que par SystemsSettingsPage. Aucun lien de l'app ne pointe vers /changelog.
  • Plus de cartes qu'annoncé. CHANGELOG.md porte 39 en-têtes ## [x] plus 10 anciennes versions sans crochets (## 0.3.2 à ## 0.2.1) ; la regex de ChangelogContent.tsx:17 les prend toutes, soit environ 49 cartes dépliées (space-y-6, L63), dont une carte « Unreleased » vide.
  • LogViewerCard a une liste à hauteur fixe qui défile (h-64 overflow-y-auto, L120-122) : environ 400 px, donc la remonter ne pousse pas le reste très loin.
  • UpdateCard lit les changelogs lui-même (L25-43) et ne dépend pas de ChangelogContent.
  • Motif de repli existant : src/hooks/useCollapsibleGroups.ts:49 (#254/#265/#288 ; isCollapsed, expandAll/collapseAll, storageKey: null = en mémoire seulement), utilisé par les tableaux de rapports, CategoryTree.tsx et StepDiscover.tsx:72-141.

Décision de Max (2026-10-03) : Journal avant + repli.

  1. La section Journaux remonte juste sous Mises à jour, avant le journal des modifications.
  2. Dans ChangelogContent, la version installée est dépliée, les autres sont repliées (titre cliquable avec chevron), plus un bouton « Tout déplier / Tout replier ». État en mémoire seulement (useCollapsibleGroups, storageKey: null).
  3. La carte « Unreleased » est masquée quand elle n'a aucune section ; elle reste affichée si elle a du contenu (builds de dev).
  4. Version installée : getVersion() (déjà lu par la page). Si elle n'est pas trouvée dans le changelog, la première version publiée est dépliée.

Écartés : une vraie page /changelog avec un lien « Tout l'historique » (une page et une navigation de plus), et le seul déplacement du Journal (le changelog continuerait de grandir déplié).

Travail à faire

  • SystemsSettingsPage.tsx : ordre Version, Mises à jour, Journaux, Journal des modifications, mention de sécurité.
  • ChangelogContent.tsx : extraire parseChangelog et une règle pure « quelles versions sont dépliées au départ » (version installée, repli sur la première publiée, « Unreleased » vide masquée) ; repli par version avec useCollapsibleGroups ; bouton tout déplier/replier ; ChangelogContent reçoit la version installée en prop.
  • i18n FR et EN : libellés du bouton et aria-expanded/titre accessible du repli.
  • docs/guide-utilisateur.md (§11 Paramètres, L482-502) : ordre des sections et repli de l'historique ; docs intégrées docs.* si elles décrivent la page ; docs/architecture.md:468.
  • CHANGELOG.md et CHANGELOG.fr.md (Changed/Modifié).

Surface de test

  • Existants : aucun test de ChangelogContent, LogViewerCard, SystemsSettingsPage ni ChangelogPage. UpsellCtas.render.test.tsx:153-171 rend UpdateCard.
  • À ajouter :
    • parseChangelog : versions avec et sans crochets, sections, « Unreleased » vide.
    • Règle de dépliage : version installée dépliée ; version absente → première publiée ; « Unreleased » vide masquée, non vide gardée.
    • Rendu statique (renderToStaticMarkup) de SystemsSettingsPage ou d'un sous-composant : la section Journaux précède le journal des modifications.

Critères d'acceptation

  • Le Journal est atteignable sans faire défiler l'historique des versions.
  • Les notes de la version installée sont lisibles sans clic.
  • L'historique complet reste accessible (dépliage par version ou global).
  • La page ne grandit plus d'une carte dépliée à chaque release.
  • npm test et la CI verts.

Complexité estimée

Simple.

Liens

#190 (redirection de /changelog), #365 (contrôle de licence écrit au Journal), #254 (repli dans les rapports).


Plan d'exécution — milestone lot-v018 (planifié le 2026-10-16)

Les sections ci-dessous viennent de la séance /plan-run du 2026-10-16 (revue /review-spec Sécurité, Architecture, Technique comprise). En cas de conflit avec le corps au-dessus, elles priment.

Consignes communes

  • Préflight : #369, #419 et #421 sont fermées et le tag v0.17.2 existe (git ls-remote --tags origin v0.17.2). Sinon, arrêt sans rien écrire.
  • Les numéros de ligne du corps ont été lus sur main 065f580 ; #369, #419 et #421 les ont déplacés depuis. Repérer chaque site par son contenu (symbole, chaîne), jamais par son numéro.
  • Toute clé i18n ajoutée l'est en FR et en EN (garde de #453, en tête de pile).
  • Les vérifications manuelles (app lancée) vont dans le corps de la PR et le DAILY-REPORT, pas dans STATE.md : le report dans STATE.md se fait au /merge-stack.

Depends on

Note : dépendance d'ordre de la pile (fichiers partagés : CHANGELOG, docs/architecture.md), pas de dépendance de code.

Décisions prises en planification

  • État de repli (Max) : pas de useCollapsibleGroups, contrairement au corps. Ce hook n'a qu'un defaultExpanded global, sans amorce par clé. ChangelogContent gère un useState<Set<string>> local, amorcé par la règle pure de dépliage. Le bouton Tout déplier / Tout replier agit sur ce Set.
  • Version asynchrone (Max) : SystemsSettingsPage ne monte ChangelogContent qu'une fois getVersion() résolu. En cas de rejet, la version est inconnue et la règle déplie la première version publiée. Un test de la règle couvre « version inconnue ».
  • parseChangelog va dans un module pur partagé, par exemple src/utils/changelog.ts. UpdateCard garde sa propre lecture : pas d'unification dans cette issue.

Review caveats

  • (Architecture, Technique, critique résolue) useCollapsibleGroups inadapté : résolu par la décision ci-dessus.

Spec source

spec-plan-lot-v018.md

## Contexte Constat de Max le 2026-10-03, en testant la v0.16.0 : pour lire la ligne du contrôle de licence dans le Journal, il a fallu descendre sous toute la liste des versions. « C'est lourd, long. » La page Paramètres → Systèmes (`src/pages/settings/SystemsSettingsPage.tsx`) empile, dans cet ordre : Version, Mises à jour (`UpdateCard`), Journal des modifications (`ChangelogContent`), Journaux (`LogViewerCard`), mention de sécurité des données. Le Journal sert de plus en plus : depuis #365, chaque contrôle de licence y est écrit, le guide y renvoie l'utilisateur, et le bouton de rétroaction s'y trouve. ## Analyse (`/analyze`, 2026-10-03, `main` `0e4fef5`) Le corps d'origine est archivé en commentaire. Sa prémisse sur `/changelog` était fausse : - **Pas de page d'historique ailleurs.** `src/pages/ChangelogPage.tsx` est un `<Navigate to="/settings/systems" replace />` depuis #190 (`App.tsx:154`, `docs/architecture.md:472`). `ChangelogContent` n'est importé que par `SystemsSettingsPage`. Aucun lien de l'app ne pointe vers `/changelog`. - **Plus de cartes qu'annoncé.** `CHANGELOG.md` porte 39 en-têtes `## [x]` plus 10 anciennes versions sans crochets (`## 0.3.2` à `## 0.2.1`) ; la regex de `ChangelogContent.tsx:17` les prend toutes, soit environ 49 cartes dépliées (`space-y-6`, L63), dont une carte « Unreleased » vide. - `LogViewerCard` a une liste à hauteur fixe qui défile (`h-64 overflow-y-auto`, L120-122) : environ 400 px, donc la remonter ne pousse pas le reste très loin. - `UpdateCard` lit les changelogs lui-même (L25-43) et ne dépend pas de `ChangelogContent`. - Motif de repli existant : `src/hooks/useCollapsibleGroups.ts:49` (#254/#265/#288 ; `isCollapsed`, `expandAll`/`collapseAll`, `storageKey: null` = en mémoire seulement), utilisé par les tableaux de rapports, `CategoryTree.tsx` et `StepDiscover.tsx:72-141`. **Décision de Max (2026-10-03) : Journal avant + repli.** 1. La section Journaux remonte juste sous Mises à jour, avant le journal des modifications. 2. Dans `ChangelogContent`, la version installée est dépliée, les autres sont repliées (titre cliquable avec chevron), plus un bouton « Tout déplier / Tout replier ». État en mémoire seulement (`useCollapsibleGroups`, `storageKey: null`). 3. La carte « Unreleased » est masquée quand elle n'a aucune section ; elle reste affichée si elle a du contenu (builds de dev). 4. Version installée : `getVersion()` (déjà lu par la page). Si elle n'est pas trouvée dans le changelog, la première version publiée est dépliée. Écartés : une vraie page `/changelog` avec un lien « Tout l'historique » (une page et une navigation de plus), et le seul déplacement du Journal (le changelog continuerait de grandir déplié). ## Travail à faire - [ ] `SystemsSettingsPage.tsx` : ordre Version, Mises à jour, Journaux, Journal des modifications, mention de sécurité. - [ ] `ChangelogContent.tsx` : extraire `parseChangelog` et une règle pure « quelles versions sont dépliées au départ » (version installée, repli sur la première publiée, « Unreleased » vide masquée) ; repli par version avec `useCollapsibleGroups` ; bouton tout déplier/replier ; `ChangelogContent` reçoit la version installée en prop. - [ ] i18n FR et EN : libellés du bouton et `aria-expanded`/titre accessible du repli. - [ ] `docs/guide-utilisateur.md` (§11 Paramètres, L482-502) : ordre des sections et repli de l'historique ; docs intégrées `docs.*` si elles décrivent la page ; `docs/architecture.md:468`. - [ ] `CHANGELOG.md` et `CHANGELOG.fr.md` (Changed/Modifié). ## Surface de test - Existants : aucun test de `ChangelogContent`, `LogViewerCard`, `SystemsSettingsPage` ni `ChangelogPage`. `UpsellCtas.render.test.tsx:153-171` rend `UpdateCard`. - À ajouter : - [ ] `parseChangelog` : versions avec et sans crochets, sections, « Unreleased » vide. - [ ] Règle de dépliage : version installée dépliée ; version absente → première publiée ; « Unreleased » vide masquée, non vide gardée. - [ ] Rendu statique (`renderToStaticMarkup`) de `SystemsSettingsPage` ou d'un sous-composant : la section Journaux précède le journal des modifications. ## Critères d'acceptation - [ ] Le Journal est atteignable sans faire défiler l'historique des versions. - [ ] Les notes de la version installée sont lisibles sans clic. - [ ] L'historique complet reste accessible (dépliage par version ou global). - [ ] La page ne grandit plus d'une carte dépliée à chaque release. - [ ] `npm test` et la CI verts. ## Complexité estimée Simple. ## Liens #190 (redirection de `/changelog`), #365 (contrôle de licence écrit au Journal), #254 (repli dans les rapports). --- # Plan d'exécution — milestone lot-v018 (planifié le 2026-10-16) Les sections ci-dessous viennent de la séance `/plan-run` du 2026-10-16 (revue `/review-spec` Sécurité, Architecture, Technique comprise). **En cas de conflit avec le corps au-dessus, elles priment.** ## Consignes communes - Préflight : #369, #419 et #421 sont fermées et le tag `v0.17.2` existe (`git ls-remote --tags origin v0.17.2`). Sinon, arrêt sans rien écrire. - Les numéros de ligne du corps ont été lus sur `main` `065f580` ; #369, #419 et #421 les ont déplacés depuis. Repérer chaque site par son contenu (symbole, chaîne), jamais par son numéro. - Toute clé i18n ajoutée l'est en FR et en EN (garde de #453, en tête de pile). - Les vérifications manuelles (app lancée) vont dans le corps de la PR et le DAILY-REPORT, pas dans `STATE.md` : le report dans `STATE.md` se fait au `/merge-stack`. ## Depends on - #449 Note : dépendance d'ordre de la pile (fichiers partagés : CHANGELOG, `docs/architecture.md`), pas de dépendance de code. ## Décisions prises en planification - **État de repli** (Max) : pas de `useCollapsibleGroups`, contrairement au corps. Ce hook n'a qu'un `defaultExpanded` global, sans amorce par clé. `ChangelogContent` gère un `useState<Set<string>>` local, amorcé par la règle pure de dépliage. Le bouton Tout déplier / Tout replier agit sur ce `Set`. - **Version asynchrone** (Max) : `SystemsSettingsPage` ne monte `ChangelogContent` qu'une fois `getVersion()` résolu. En cas de rejet, la version est inconnue et la règle déplie la première version publiée. Un test de la règle couvre « version inconnue ». - `parseChangelog` va dans un module pur partagé, par exemple `src/utils/changelog.ts`. `UpdateCard` garde sa propre lecture : pas d'unification dans cette issue. ## Review caveats - (Architecture, Technique, critique résolue) `useCollapsibleGroups` inadapté : résolu par la décision ci-dessus. ## Spec source spec-plan-lot-v018.md
maximus added the
status:triage
type:feature
source:human
labels 2026-10-03 14:38:46 +00:00
Author
Owner

Archive avant réécriture par /analyze (2026-10-03). Le corps d'origine affirmait qu'« une page /changelog (ChangelogPage) affiche déjà l'historique complet » et que ChangelogContent y est partagé. C'est inexact : src/pages/ChangelogPage.tsx n'est qu'un <Navigate to="/settings/systems" replace /> depuis #190, et ChangelogContent n'est importé que par SystemsSettingsPage. La piste « lien Tout l'historique vers /changelog » mènerait donc sur la même page. Le constat de fond (Journal repoussé en bas) tient.

Corps d'origine (2026-10-03)

Contexte

Constat de Max le 2026-10-03, en testant la v0.16.0 : pour lire la ligne du contrôle de licence dans le Journal, il a fallu descendre sous toute la liste des versions. « C'est lourd, long. »

Vérifié dans le code (src/pages/settings/SystemsSettingsPage.tsx), la page Paramètres → Systèmes empile, dans cet ordre :

  1. Version
  2. Mises à jour (UpdateCard)
  3. Journal des modifications (ChangelogContent), qui affiche chaque version du changelog, toutes dépliées : 39 sections dans CHANGELOG.md à la v0.16.0, et une de plus à chaque release
  4. Journaux (LogViewerCard), donc tout en bas
  5. La mention de sécurité des données

Une page /changelog (ChangelogPage) affiche déjà l'historique complet.

Le Journal sert de plus en plus : depuis #365, chaque contrôle de licence y est écrit, et le guide renvoie l'utilisateur vers lui pour savoir ce que l'app envoie. Le bouton de rétroaction s'y trouve aussi.

Pistes, à trancher par /analyze

  • Dans Paramètres, n'afficher que les notes de la version installée (ou des dernières), avec un lien « Tout l'historique » vers /changelog.
  • Placer la carte Journaux avant le journal des modifications.
  • Replier les versions par défaut, la version installée seule dépliée.

Les pistes se combinent ; la première règle aussi la croissance de la page à chaque release.

Fichiers

  • src/pages/settings/SystemsSettingsPage.tsx (ordre des sections)
  • src/components/settings/ChangelogContent.tsx (rendu des versions), partagé avec /changelog : vérifier que la page complète reste intacte
  • i18n FR et EN si un lien ou un libellé s'ajoute ; guide utilisateur (section Paramètres) si l'emplacement du Journal change

Critères d'acceptation

  • Le Journal est atteignable sans faire défiler l'historique complet des versions.
  • L'historique complet reste accessible.
  • npm test et la CI verts.
Archive avant réécriture par `/analyze` (2026-10-03). Le corps d'origine affirmait qu'« une page `/changelog` (`ChangelogPage`) affiche déjà l'historique complet » et que `ChangelogContent` y est partagé. C'est inexact : `src/pages/ChangelogPage.tsx` n'est qu'un `<Navigate to="/settings/systems" replace />` depuis #190, et `ChangelogContent` n'est importé que par `SystemsSettingsPage`. La piste « lien Tout l'historique vers `/changelog` » mènerait donc sur la même page. Le constat de fond (Journal repoussé en bas) tient. <details><summary>Corps d'origine (2026-10-03)</summary> ## Contexte Constat de Max le 2026-10-03, en testant la v0.16.0 : pour lire la ligne du contrôle de licence dans le Journal, il a fallu descendre sous toute la liste des versions. « C'est lourd, long. » Vérifié dans le code (`src/pages/settings/SystemsSettingsPage.tsx`), la page Paramètres → Systèmes empile, dans cet ordre : 1. Version 2. Mises à jour (`UpdateCard`) 3. Journal des modifications (`ChangelogContent`), qui affiche **chaque version** du changelog, toutes dépliées : 39 sections dans `CHANGELOG.md` à la v0.16.0, et une de plus à chaque release 4. Journaux (`LogViewerCard`), donc tout en bas 5. La mention de sécurité des données Une page `/changelog` (`ChangelogPage`) affiche déjà l'historique complet. Le Journal sert de plus en plus : depuis #365, chaque contrôle de licence y est écrit, et le guide renvoie l'utilisateur vers lui pour savoir ce que l'app envoie. Le bouton de rétroaction s'y trouve aussi. ## Pistes, à trancher par `/analyze` - Dans Paramètres, n'afficher que les notes de la version installée (ou des dernières), avec un lien « Tout l'historique » vers `/changelog`. - Placer la carte Journaux avant le journal des modifications. - Replier les versions par défaut, la version installée seule dépliée. Les pistes se combinent ; la première règle aussi la croissance de la page à chaque release. ## Fichiers - `src/pages/settings/SystemsSettingsPage.tsx` (ordre des sections) - `src/components/settings/ChangelogContent.tsx` (rendu des versions), partagé avec `/changelog` : vérifier que la page complète reste intacte - i18n FR et EN si un lien ou un libellé s'ajoute ; guide utilisateur (section Paramètres) si l'emplacement du Journal change ## Critères d'acceptation - [ ] Le Journal est atteignable sans faire défiler l'historique complet des versions. - [ ] L'historique complet reste accessible. - [ ] `npm test` et la CI verts. </details>
maximus added
status:ready
and removed
status:triage
labels 2026-10-03 17:54:34 +00:00
maximus added this to the planned-2026-10-16-lot-v018 milestone 2026-10-17 00:14:24 +00:00
maximus added
status:in-progress
and removed
status:ready
labels 2026-10-18 21:50:27 +00:00
maximus added
status:review
and removed
status:in-progress
labels 2026-10-18 22:10:42 +00:00
maximus added
status:approved
and removed
status:review
labels 2026-10-19 01:55:44 +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#372
No description provided.