dashboard : surveiller, comparer et alerter sur trois ecrans (#184) #207
No reviewers
Labels
No labels
Compat/Breaking
EC01
EC02
EC03
EC04
EC05
EC06
Kind/BDD
Kind/Back
Kind/Bug
Kind/CICD
Kind/Cloud
Kind/Contenu
Kind/Data
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Front
Kind/IA
Kind/Infra
Kind/Monitoring
Kind/Security
Kind/Testing
Portée/Post-jury
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Status
Abandoned
Status
Blocked
Status
Need More Info
ops/alerte
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
g2/enervision!207
Loading…
Reference in a new issue
No description provided.
Delete branch "marvin/184-refonte-tableau-de-bord"
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?
Ce que la PR fait
Refonte de la surveillance du tableau de bord. L'ecran unique qui melait tout
devient trois ecrans, chacun repondant a une seule question.
Surveiller / comparer / alertes sur des ecrans separes
/graphiques) : ou en est le parc maintenant, faut-il agir. Quatremesures de tete, profil des dernieres heures, sites a traiter, etat courant
des sites. Une seule periode en tete (24 h / 7 j / 30 j) qui commande le
profil et les micro-courbes ensemble.
/comparaison) : comment les sites se situent sur la duree.Sept ou trente jours. Sorti de l'ecran Parc, ou il donnait un second
selecteur de periode qui ignorait le premier.
/alertes) : les alertes des sites visibles, paginees a vingt,la plus severe en tete. Sorties du pied de l'ecran Qualite, ou leur liste
poussait le reste de la page.
Corrections d'affichage (revue visuelle)
annulait.
taisent.
« A traiter » : trois lignes puis defilement
La liste s'etirait sur toute la hauteur de sa rangee des que plusieurs sites
decrochaient. Le compte en tete dit le total.
Verification
npm run test:unit: 408 tests, tous verts.npm run build: ok.Hors perimetre
Le rafraichissement automatique des ecrans (ticket #196, branche a part).
Relecture ciblée : deux défauts bloquants, corrigés dans
f104dd0Relecture volontairement resserrée sur ce qui empêche une mise en production : bug de correctness, construction, CI. Le reste (mise en page, capitalisation, pagination, jauges, micro-courbes, navigation sous 900 px) tient et n'appelle rien de ma part.
Vérifié localement sur
4ee28e6:npm ci,npm run test:unit(408 verts),npm run buildavecVITE_API_BASE— tout passe, comme les cinq jobs de la forge. Rien ne bloque la chaîne. Les deux défauts ci-dessous sont des défauts de données affichées, et ils touchent tous deux la période que cette PR met en tête de chaque écran — c'est-à-dire son apport principal.1. Les séries survivent au changement d'écran, sous la mauvaise étiquette
fenetreest un état unique du magasin, et chaque vue le pose à l'arrivée avant de rappelerchargerSites(). MaisafficherTousLesSites()ne relançait une série qu'en l'absence d'entrée :Les entrées existent déjà après le premier écran, donc rien ne repart. Parcours :
/graphiques(24 h) →/comparaisonpose7j→ le graphique de comparaison affiche les points horaires de 24 h sous un sélecteur qui indique « 7 j ». Et au retour, les micro-courbes du tableau du parc montrent sept ou trente jours pendant que l'en-tête annonce « 24 h » et que le profil, lui, a bien été rechargé. Deux périodes sur le même écran — exactement le défaut que la PR entend supprimer, déplacé d'un cran.Reproduit par un test avant correction : après
fenetre = '7j'puischargerSites(), les trois entrées deseriesportaient encorefenetre: '24h'etmesuresSiten'avait été appelé que trois fois, toutes en24h.Correction : chaque entrée de
seriesretient la fenêtre pour laquelle elle a été demandée — pendant son chargement et sur son échec comprises — et c'est cette marque, non la simple présence de l'entrée, qui décide du rechargement. Un remontage sur la même fenêtre ne redemande toujours rien.2.
ProfilHoraireParcreste écrit pour 24 h au pas horaireLe composant est figé sur
'1h'en cinq endroits (titre, étiquettes d'axe, résumé pour lecteur d'écran, en-tête et corps du tableau équivalent), ce qui se tenait tant queprofilParcétait lui-même figé à 24 h. Depuis que le sélecteur le commande, sur7j/30j:etiquetteAxe(t, '1h')sur un point journalier rend l'heure de son seau, donc « 00 h » répété sur tous les points de l'axe et toutes les lignes du tableau ;PAS_ETIQUETTE = 4ne laissait que deux étiquettes sur sept points.Correction : titre, étiquettes, résumé et en-tête se règlent sur
pasetfenetrerendus par l'API (SerieParcOut), pas déduits de la fenêtre demandée — c'est l'API qui décide du pas. L'espacement des étiquettes se calcule (six au plus) et vaut toujours quatre sur 24 h. Le titre devient « Profil journalier du parc, 7 jours » le cas échéant.Au passage
Le gabarit
serie()degraphique.test.jsportaitfenetre: '7j'quand le magasin démarre maintenant à24h: la réponse simulée contredisait la requête. Corrigé pour refléter ce que rend l'API, sinon les deux tests « ne relance pas les sites déjà chargés » passaient pour la mauvaise raison.État
412 tests verts(408 + 4 de non-régression),npm run buildok. Je ne fusionne pas : le correctif touche le magasin et un composant, il vaut un regard de l'auteur avant.Deux remarques non bloquantes, laissées telles quelles : sur
/comparaison,changerFenetre()redemande aussimesuresParcalors que l'écran n'affiche pas le profil du parc (un appel pour rien, sans effet visible) ; etSitesATraiterformatederniere_relevesans garde, ce qui donnerait « depuis 00:00 » si l'API rendait un jour ce champ nul — le contrat le déclare non nullable aujourd'hui.Conflits résolus :
developfusionné dans la branche (de29d55)mergeableest repassé àTrue. Cinq fichiers étaient en conflit, tous sur le tableau de bord, et tous de la même forme :developa ajouté un comportement là où la #184 avait renommé ou refait la structure. Rien n'a été arbitré au profit d'un seul côté — le comportement dedevelopest reporté dans la structure de la #184.developapportaitapi/glossaire.jsmeasured= la mesure,none= le trou assumécapitaliserresteFicheSite.vueformaterPctde la #184GraphiqueSite.vuedevelop, formateur français de la #184 pour l'écart :toFixed(1)rendait « 2.7 % », pas « 2,7 % »SyntheseParc.vue.pavé*en.mesure*et refait le bandeau ; les deux faits sont reportés dans la nouvelle nomenclatureTableauSites.vueUn piège trouvé en reportant la mention de total partiel
.mesure__second--partielet.mesure__secondpèsent une classe chacune : c'est donc l'ordre des règles qui tranche. Posée avant, la teinte de vigilance était écrasée parcolor: var(--ev-ink-500)et plus rien à l'écran ne distinguait un total partiel d'un total complet — exactement la collision de spécificité que cette PR corrige par ailleurs sur.tableau__num. La règle passe après, etrevue-visuelle.test.jsle retient, là où vivent déjà les trois autres cas de ce genre.Couverture
La mention de total partiel n'avait aucun test du côté de
develop, et elle vient de changer de nom : trois cas ajoutés (mention présente sur parc incomplet, absente sur parc complet, ordre de cascade).Les assertions de
developpassent toutes sans être touchées — « dernière connue » (TableauSites.test.js), « aucune prévision servie » (SyntheseParc.test.js),libelleMethode('none') === 'trou assumé'(glossaire.test.js) : le report a bien gardé les comportements qu'elles gardent.État
425 tests verts(38 fichiers),npm run buildok, aucun marqueur de conflit résiduel,package-lock.jsoninchangé. La CI tourne surde29d55— elle couvre cette fois aussi le Python et l'Ansible que la fusion fait entrer. Je ne fusionne toujours pas : à Marvin de valider le report, en particulier l'arbitrageformaterPctsur l'écart deGraphiqueSite.vueet le placement de la mention partielle sous le pavé « Consommation » plutôt que dans « Disponibilité », qui porte déjà « n/m mesurés ».