dashboard : alertes et journal de collecte de l'écran Qualité (#24) #155

Merged
florian merged 15 commits from marvin/24-liste-alertes into develop 2026-09-07 13:44:01 +00:00
Member

Les deux dernières cases du critère « écran qualité » du ticket #24 :

  • Écran qualité : disponibilité par site, part de points imputés, journal de collecte, alertes.

Empilée sur marvin/24-ecran-qualite, elle-même sur marvin/24-ecran-site (PR #140). À fusionner après elles.

Les alertes

Le dépôt les chargeait déjà et rien ne les affichait : à chaque arrivée sur /qualite, l'appel partait, réussissait, et le résultat était jeté. On avait le nombre d'alertes sur l'écran Parc, jamais lesquelles.

Ouvertes d'abord, résolues ensuite, et dans chaque groupe la plus sévère en tête. Une liste d'alertes se lit par ce qui appelle une action, pas par ordre d'arrivée. Le tri groupe par-dessus l'ordre de l'API, donc deux alertes de même sévérité gardent leur ordre chronologique.

Les résolues restent affichées, en retrait plutôt que masquées : une liste qui rétrécit sans qu'on sache ce qui en est sorti se lit mal, et la trace de ce qui s'est résolu seul a sa valeur sur un écran de qualité.

Chaque alerte nomme sa sévérité en toutes lettres à côté de la puce, et porte l'exigence qu'elle sert (EF-08, EF-04…) — c'est ce qui permet de remonter d'une alerte à la règle du produit qui l'a voulue. Une alerte sans site_id concerne le parc entier : elle le dit, plutôt que d'afficher un lien mort.

Les libellés de type, d'origine et d'état rejoignent api/glossaire.js, repris mot pour mot de docs/GLOSSAIRE.md §4.

Le journal de collecte

Une page par site, /sites/:id/journal, ouverte depuis la disponibilité — sur la fiche du site comme dans le tableau de l'écran Qualité. C'est ce chiffre-là que le journal explique : d'où viennent ces 82,5 %, quels relevés ont manqué, comment les trous ont été comblés (ADR 0006).

Une table, une ligne par jour : jour, disponibilité, relevés attendus, manquants, et la ventilation des relevés retenus par méthode.

Pas d'onglet dans l'en-tête, à dessein : on entre sur cette page par un site nommé, comme sur /sites/:id. Un onglet « Journal » devrait demander « lequel » avant d'avoir quoi que ce soit à ouvrir. La règle du dépôt tient donc toujours — deux onglets, Parc et Qualité.

chargerFiche arrive dans le dépôt du site : la page n'a besoin que du nom, du type et de la disponibilité pour son en-tête, là où charger() lancerait trois requêtes dont deux qu'elle n'affiche pas.

L'historique montre deux corrections

Les six commits sont gardés tels quels, y compris les tours de correction — c'est plus honnête qu'un écrasement, et les commentaires de code expliquent chaque état final :

Commit
5a94a3e la liste des alertes
26e1755 le journal, déplié dans une ligne du tableau
f16435c ↳ en table et non en cartes : le flex-wrap supposait trois jours sans le dire, et se serait défait au premier de plus
4ee0a8f ↳ sorti de la ligne, trop à l'étroit : cinq colonnes dans une cellule d'un tableau qui en compte six
fe76532 ↳ une page par site plutôt qu'une page qui les empile tous
ee4faab ↳ le lien rattaché à la disponibilité, plus une colonne muette

Vérification

npm run test:unit    33 fichiers, 320 tests
npm run build        passe
npm audit            0 vulnérabilité

+56 tests sur cette branche. Deux régressions ancrées au passage :

  • formaterJour lit en UTC. jour est une date nue (2026-09-01) : sans fuseau forcé, un poste à l'ouest de Greenwich l'aurait rendue la veille — un journal décalé d'un jour, en silence.
  • Le tableau de l'écran Qualité a cinq colonnes, chacune avec son en-tête. Un test le tient, pour qu'aucune colonne muette n'y revienne.

Reste à faire sur #24

  • Les captures d'écran demandées en preuve, et l'audit axe-core : les deux supposent des données à l'écran, donc une API jointe.
  • dashboard/autorisation.py rend les sept sites à tout utilisateur authentifié (ENF-02 attend une table qui n'existe dans aucune migration) : le critère « seuls les sites autorisés apparaissent » n'est pas tenu, et ça ne se corrige pas côté front.
Les deux dernières cases du critère « écran qualité » du ticket #24 : > - [x] Écran qualité : disponibilité par site, part de points imputés, **journal de collecte**, **alertes**. Empilée sur `marvin/24-ecran-qualite`, elle-même sur `marvin/24-ecran-site` (PR #140). À fusionner après elles. ## Les alertes Le dépôt les chargeait déjà et rien ne les affichait : à chaque arrivée sur `/qualite`, l'appel partait, réussissait, et le résultat était jeté. On avait le nombre d'alertes sur l'écran Parc, jamais lesquelles. **Ouvertes d'abord, résolues ensuite, et dans chaque groupe la plus sévère en tête.** Une liste d'alertes se lit par ce qui appelle une action, pas par ordre d'arrivée. Le tri groupe par-dessus l'ordre de l'API, donc deux alertes de même sévérité gardent leur ordre chronologique. Les résolues restent affichées, en retrait plutôt que masquées : une liste qui rétrécit sans qu'on sache ce qui en est sorti se lit mal, et la trace de ce qui s'est résolu seul a sa valeur sur un écran de qualité. Chaque alerte nomme sa sévérité en toutes lettres à côté de la puce, et porte **l'exigence qu'elle sert** (`EF-08`, `EF-04`…) — c'est ce qui permet de remonter d'une alerte à la règle du produit qui l'a voulue. Une alerte sans `site_id` concerne le parc entier : elle le dit, plutôt que d'afficher un lien mort. Les libellés de type, d'origine et d'état rejoignent `api/glossaire.js`, repris mot pour mot de `docs/GLOSSAIRE.md` §4. ## Le journal de collecte Une page par site, `/sites/:id/journal`, ouverte depuis la disponibilité — sur la fiche du site comme dans le tableau de l'écran Qualité. C'est ce chiffre-là que le journal explique : d'où viennent ces 82,5 %, quels relevés ont manqué, comment les trous ont été comblés (ADR 0006). Une table, une ligne par jour : jour, disponibilité, relevés attendus, manquants, et la ventilation des relevés retenus par méthode. **Pas d'onglet dans l'en-tête**, à dessein : on entre sur cette page par un site nommé, comme sur `/sites/:id`. Un onglet « Journal » devrait demander « lequel » avant d'avoir quoi que ce soit à ouvrir. La règle du dépôt tient donc toujours — deux onglets, Parc et Qualité. `chargerFiche` arrive dans le dépôt du site : la page n'a besoin que du nom, du type et de la disponibilité pour son en-tête, là où `charger()` lancerait trois requêtes dont deux qu'elle n'affiche pas. ## L'historique montre deux corrections Les six commits sont gardés tels quels, y compris les tours de correction — c'est plus honnête qu'un écrasement, et les commentaires de code expliquent chaque état final : | Commit | | |---|---| | `5a94a3e` | la liste des alertes | | `26e1755` | le journal, déplié dans une ligne du tableau | | `f16435c` | ↳ en table et non en cartes : le `flex-wrap` supposait trois jours sans le dire, et se serait défait au premier de plus | | `4ee0a8f` | ↳ sorti de la ligne, trop à l'étroit : cinq colonnes dans une cellule d'un tableau qui en compte six | | `fe76532` | ↳ une page **par site** plutôt qu'une page qui les empile tous | | `ee4faab` | ↳ le lien rattaché à la disponibilité, plus une colonne muette | ## Vérification ``` npm run test:unit 33 fichiers, 320 tests npm run build passe npm audit 0 vulnérabilité ``` **+56 tests** sur cette branche. Deux régressions ancrées au passage : - `formaterJour` lit en UTC. `jour` est une date nue (`2026-09-01`) : sans fuseau forcé, un poste à l'ouest de Greenwich l'aurait rendue la veille — un journal décalé d'un jour, en silence. - Le tableau de l'écran Qualité a cinq colonnes, chacune avec son en-tête. Un test le tient, pour qu'aucune colonne muette n'y revienne. ## Reste à faire sur #24 - Les captures d'écran demandées en preuve, et l'audit `axe-core` : les deux supposent des données à l'écran, donc une API jointe. - `dashboard/autorisation.py` rend les sept sites à tout utilisateur authentifié (ENF-02 attend une table qui n'existe dans aucune migration) : le critère « seuls les sites autorisés apparaissent » n'est pas tenu, et ça ne se corrige pas côté front.
Le dépôt les chargeait déjà et rien ne les affichait : à chaque arrivée
sur /qualite, l'appel partait, réussissait, et le résultat était jeté. On
avait le nombre d'alertes sur l'écran Parc, jamais lesquelles.

Ouvertes d'abord, résolues ensuite, et dans chaque groupe la plus sévère
en tête : une liste d'alertes se lit par ce qui appelle une action, pas
par ordre d'arrivée. Le tri groupe par-dessus l'ordre de l'API, donc deux
alertes de même sévérité gardent leur ordre chronologique.

Les résolues restent affichées, en retrait plutôt que masquées : une
liste qui rétrécit sans qu'on sache ce qui en est sorti se lit mal, et la
trace de ce qui s'est résolu seul a sa valeur sur un écran de qualité.

Chaque alerte nomme sa sévérité en toutes lettres à côté de la puce, et
porte l'exigence qu'elle sert. Une alerte sans site_id concerne le parc
entier : elle le dit, plutôt que d'afficher un lien mort.

Les libellés de type, d'origine et d'état rejoignent le glossaire, repris
mot pour mot de docs/GLOSSAIRE.md §4.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
La dernière case du critère « écran qualité » du ticket. Le tableau donne
un chiffre de disponibilité par site, une photo de l'instant ; le journal
donne les trois derniers jours, avec ce qui était attendu, ce qui a
manqué, et la ventilation des relevés retenus par méthode (ADR 0006).

Déplié à la demande, un site à la fois : la route n'en sert qu'un, et
personne ne lit le détail des sept en même temps. Le sortir en colonnes
aurait demandé les sept journaux au chargement. Plusieurs lignes peuvent
rester ouvertes ensemble — comparer deux sites qui décrochent est le
geste même de cet écran.

Patron « bouton révélateur » du WAI-ARIA : un bouton aria-expanded qui
commande sa ligne de détail par aria-controls, et rien de plus. Un rôle
de grille engagerait une navigation aux flèches que ce tableau ne tient
pas.

« formaterJour » lit la date en UTC comme le reste du module : « jour »
est une date nue, qu'un poste à l'ouest de Greenwich rendrait la veille —
un journal décalé d'un jour, en silence.

Les chemins d'expiration du dépôt Qualité ont enfin leurs tests : ils
étaient arrivés avec le correctif de la modale, sans couverture ici.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Un jour porte quatre grandeurs : c'est du tabulaire, et je l'avais rendu
en cartes « flex-wrap ». Ça tenait tant que l'API en servait trois
(_JOURS_JOURNAL = 3, en dur côté Python, sans paramètre de requête) et se
serait défait sans bruit au premier jour de plus — sept cartes sur deux
rangées, trente cartes en mur dans une ligne de tableau.

Une table encaisse trois lignes comme trente, et surtout elle aligne les
colonnes : c'est ce qui permet de suivre une disponibilité qui se dégrade
d'un jour à l'autre, ce qu'on attend d'un journal.

Son propre conteneur de défilement horizontal : celui de la table du
dessus ne la couvre pas, elle vit dans une cellule dont la largeur est
déjà contrainte.

Un test la monte sur trente jours pour que la disposition ne suppose plus
un petit nombre en silence.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Le journal se dépliait dans une ligne du tableau de l'écran Qualité et n'y
tenait pas : cinq colonnes imbriquées dans une cellule d'un tableau qui en
compte six, deux conteneurs de défilement l'un dans l'autre, et une
comparaison entre sites — le geste même de cet écran — qui demandait de
déplier ligne à ligne.

« /qualite/journal » rend les sept journaux en pleine largeur, l'un sous
l'autre, du site le moins disponible au plus disponible. Chaque ligne du
tableau y pointe désormais au lieu de déplier.

Premier onglet ajouté depuis que le dépôt s'en tient à « aucun onglet vers
un écran qui n'existe pas ». La règle n'est pas levée : elle interdit un
onglet vers un écran absent, pas vers un écran de plein droit. Celui-ci
existe et porte un critère du ticket. Le commentaire d'EnteteApplication
suit la décision.

« isExactActive » et non « isActive » sur les onglets : /qualite est un
préfixe de /qualite/journal, les deux s'allumeraient sinon. Un test le
tient.

« chargerTousLesJournaux » charge le référentiel puis un journal par site,
en parallèle. Chaque journal range son propre échec : un site en panne
n'empêche pas les six autres de s'afficher.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Rectifie le commit précédent, qui empilait les sept journaux sur une page
unique sous /qualite/journal. Un journal se lit site par site, et s'ouvre
depuis la fiche du site concerné : « /sites/:id/journal ».

L'onglet « Journal » de l'en-tête disparaît avec elle. On entre sur cette
page par un site nommé, comme sur /sites/:id : un onglet devrait demander
« lequel » avant d'avoir quoi que ce soit à ouvrir. La règle du dépôt
tient donc toujours, deux onglets et pas un de plus.

Deux entrées : le lien « Journal de collecte » en tête de la fiche du
site, et la colonne du tableau de l'écran Qualité, dont chaque ligne
pointe désormais vers le journal de son propre site.

« chargerTousLesJournaux » n'a plus d'appelant, il part. « chargerFiche »
arrive dans le dépôt du site : la page n'a besoin que du nom, du type et
de la disponibilité pour son en-tête, là où « charger() » lancerait trois
requêtes dont deux qu'elle n'affiche pas.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
dashboard : le journal s'ouvre depuis la disponibilité (#24)
All checks were successful
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 4s
Intégration / Aucun secret commité (pull_request) Successful in 3s
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 37s
Intégration / Python — qualité, tests et dépendances (pull_request) Successful in 2m3s
ee4faab424
Le lien flottait à droite du fil d'Ariane sur la fiche du site, et
occupait une sixième colonne sans en-tête lisible dans le tableau de
l'écran Qualité. Dans les deux cas il ne disait ni ce qu'on allait y
trouver, ni à quoi il se rapportait.

Il est maintenant rattaché à la disponibilité, aux deux endroits : c'est
ce chiffre-là que le journal explique — d'où viennent ces 82,5 %, quels
relevés ont manqué, comment les trous ont été comblés. Posé sous la
valeur, à la taille des étiquettes : il la complète, il ne rivalise pas
avec elle.

Sur la fiche, le lien vit dans le « dd » et non à côté : dans une liste de
définitions à « div », ces div ne portent que des « dt » et des « dd », un
« a » frère n'y serait pas valide.

Le tableau retrouve cinq colonnes, chacune avec son en-tête. Un test le
tient, pour qu'aucune colonne muette n'y revienne.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
marvin changed title from dashboard : alertes et journal de collecte de l'�cran Qualit� (#24) to dashboard : alertes et journal de collecte de l'écran Qualité (#24) 2026-09-04 14:27:33 +00:00
marvin changed target branch from marvin/24-ecran-qualite to develop 2026-09-07 07:37:45 +00:00
marvin requested review from florian 2026-09-07 07:49:24 +00:00
Member

LGTM

LGTM
Merge branch 'develop' into marvin/24-liste-alertes (#24)
Some checks failed
Infra Ansible / Playbooks Ansible valides (pull_request) Successful in 1m17s
Intégration / Python — qualité, tests et dépendances (pull_request) Has been cancelled
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Has been cancelled
Intégration / Contrôles statiques du dépôt (pull_request) Has been cancelled
Intégration / Aucun secret commité (pull_request) Has been cancelled
3426ad1e02
Huit conflits, dont trois qui demandaient une décision et non une union.

`glossaire.js` — les deux branches ont sorti la table des méthodes de
`TracabiliteDetail.vue`, mais pas de la même façon : develop en a fait une
table plate, cette branche deux registres (`libelleMethode` court pour une
colonne, `descriptionMethode` long pour la fiche de traçabilité). Les deux
registres sont conservés, et la justification que develop portait dans son
commentaire — pourquoi la table vit ici et pas dans le composant — est
reprise plutôt que perdue.

`GraphiquesView.vue` — develop affichait « Session expirée » quand
`erreurSites.statut` valait 401. Ce cas est mort depuis `estExpiration` : un
401 ne pose plus d'erreur, la modale de reprise prend la main. Le message est
retiré, et c'est celui de develop — « Référentiel des sites indisponible »
avec son bouton Réessayer — qui reste pour les vraies pannes, plutôt que le
« Se reconnecter » de cette branche, qui aurait fait de nouveau passer une
panne pour une déconnexion.

`GraphiquesView.test.js` — le test de develop qui ancrait ce message 401 est
retiré avec lui. Les deux autres, le référentiel en panne et le parc vide,
restent vrais et sont gardés.

Les cinq autres conflits étaient de l'adjacence : deux ajouts en fin de même
fichier. `graduationsY` et la palette de séries de develop cohabitent avec
`formaterPct` et `formaterJour` de cette branche.

npm run test:unit : 35 fichiers, 371 tests, tous verts.
npm run build : passe.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017EqcTJ5AHzfddf5tChFKNh
florian approved these changes 2026-09-07 13:22:58 +00:00
Merge branch 'develop' into marvin/24-liste-alertes
Some checks failed
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 37s
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 6s
Intégration / Workflows — lint et audit de sécurité (pull_request) Successful in 18s
Intégration / Python — qualité, tests et dépendances (pull_request) Has been cancelled
ffd5249b86
Merge branch 'develop' into marvin/24-liste-alertes
Some checks failed
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Has been cancelled
Intégration / Contrôles statiques du dépôt (pull_request) Has been cancelled
Intégration / Workflows — lint et audit de sécurité (pull_request) Has been cancelled
Intégration / Python — qualité, tests et dépendances (pull_request) Has been cancelled
96c7bffeb2
florian merged commit 843bdeca95 into develop 2026-09-07 13:44:01 +00:00
florian deleted branch marvin/24-liste-alertes 2026-09-07 13:44:01 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
3 participants
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
g2/enervision!155
No description provided.