dashboard : écran Parc — synthèse, comparaison des sites, navigation (#24) #139

Merged
justine merged 11 commits from marvin/24-ecran-parc into develop 2026-09-07 08:53:09 +00:00
Member

Ce que ça change

L'écran Parc : les cinq indicateurs de tête du parc au-dessus de la comparaison multi-sites, un appel /v1/sites/{id}/mesures par site coché — un site dont la source ne répond pas (503) n'empêche pas les autres de s'afficher. Plus la coquille commune aux pages authentifiées (colonne latérale, menu du compte) et une modale de reconnexion sur session expirée en cours de route.

Base : marvin/25-connexion-session (PR #138), dont l'écran dépend. À merger après elle.

Refs #24

Preuve

170 tests vitest passes
build de production propre

Pile locale : API sur 127.0.0.1:8000 (branche de la PR #137), front sur localhost:5173.

Ecran Parc -- les quatre indicateurs de tete, la comparaison des sept sites, et
l'etat de source indisponible : Bureau Bordeaux Centre repond 503 sans empecher les
six autres de s'afficher, avec son lien Reessayer. C'est la raison d'etre d'un appel
par site plutot que d'un appel global.

Ecran Parc

Tableau des sites -- paliers du glossaire (normal, vigilance, tension, surcharge),
consommation instantanee, moyenne de periode, fraicheur. Le site muet porte des tirets
et indisponible, jamais un zero.

Tableau des sites

Rendu aux trois largeurs du ticket

Critere d'acceptation de #24. Largeur de viewport mesuree dans chaque cas
(window.innerWidth du cadre), pas estimee a l'oeil.

360 px 768 px 1280 px
bandeau horizontal, paves empiles quatre paves en ligne, bandeau conserve colonne laterale, graphique et selecteur cote a cote

360 px

768 px

1280 px

Ce que ces captures ne prouvent pas. Elles valent pour le developpement, ou le
proxy Vite relaie /v1 sans rien retirer. La production passe par Caddy, qui retire
/api, et depend de VITE_API_BASE au moment de la construction. Le rendu visuel est
le meme, le chemin reseau ne l'est pas -- voir la section suivante.

Relecture

  • Un pair a relu et laissé un commentaire, même court
  • Ses remarques sont traitées, ou une réponse explique pourquoi elles ne le sont pas

Ce qui suit le code

  • Une variable d'environnement a changé de statut, elle est dans .env.example — voir ci-dessous

Où regarder en priorité

1. Le préfixe des appels, et un piège de production qui allait avec.

sites.js écrivait /api/v1/… en dur et ignorait VITE_API_BASE, alors qu'authentification.js le lit depuis toujours : deux conventions dans le même dossier. Caddy relaie en handle_path /api/*, qui retire le préfixe, donc l'appel arrivait à l'API en /v1/sites — 404, et seulement en production, le proxy Vite conservant /api. Ce module vise désormais /v1/… et préfixe par VITE_API_BASE comme /auth ; le proxy Vite relaie /v1. Le pendant côté API est dans la PR #137.

2. .env.example annonçait qu'une base vide était « le bon réglage », production comprise. C'est faux et silencieux. Caddy ne relaie que /api/* ; tout le reste tombe sur try_files {path} /index.html, donc /v1/sites reçoit index.html en 200, que le front essaie de lire en JSON. VITE_API_BASE=https://app.g2.enervision/api est obligatoire à la construction de production — c'est maintenant écrit, avec la valeur attendue.

À vérifier côté pile de déploiement (#94) : le même piège vaut pour /auth, qui est dans ce cas depuis develop et sans rapport avec cette PR. Ça mérite sans doute un ticket.

3. Deux tests neufs gardent la régression (sites.test.js) : une base configurée préfixe bien l'appel, une base vide ne préfixe rien. Aucun test ne regardait l'origine jusqu'ici, seulement le chemin — c'est exactement pour ça que personne ne l'avait vu.

Ce que cette PR ne fait pas (#24 reste ouvert) :

  • Écran Qualité : pas commencé côté front, alors que ses routes existent (PR #137). C'est le dernier critère de #24.
  • /alertes n'est affiché nulle part, seul le compteur de /parc/synthese l'est.
  • Pas de garde de route sur un 401 : la modale couvre le cas pendant qu'on est sur la page, rien ne redirige /graphiques/connexion a priori.
  • RGAA non vérifié par axe-core, pas de tests e2e, pas de vérification aux trois largeurs du ticket (360/768/1280 px).
## Ce que ça change L'écran Parc : les cinq indicateurs de tête du parc au-dessus de la comparaison multi-sites, un appel `/v1/sites/{id}/mesures` par site coché — un site dont la source ne répond pas (503) n'empêche pas les autres de s'afficher. Plus la coquille commune aux pages authentifiées (colonne latérale, menu du compte) et une modale de reconnexion sur session expirée en cours de route. **Base : `marvin/25-connexion-session`** (PR #138), dont l'écran dépend. À merger après elle. Refs #24 ## Preuve ``` 170 tests vitest passes build de production propre ``` Pile locale : API sur 127.0.0.1:8000 (branche de la PR #137), front sur localhost:5173. **Ecran Parc** -- les quatre indicateurs de tete, la comparaison des sept sites, et l'etat de source indisponible : Bureau Bordeaux Centre repond 503 sans empecher les six autres de s'afficher, avec son lien Reessayer. C'est la raison d'etre d'un appel par site plutot que d'un appel global. ![Ecran Parc](https://10.105.200.41/attachments/09a5b688-fae8-4946-aaee-a0bf33770819) **Tableau des sites** -- paliers du glossaire (normal, vigilance, tension, surcharge), consommation instantanee, moyenne de periode, fraicheur. Le site muet porte des tirets et `indisponible`, jamais un zero. ![Tableau des sites](https://10.105.200.41/attachments/61acf7c7-77b2-4fbd-af52-5f07969a4f46) ### Rendu aux trois largeurs du ticket Critere d'acceptation de #24. Largeur de viewport **mesuree** dans chaque cas (`window.innerWidth` du cadre), pas estimee a l'oeil. | 360 px | 768 px | 1280 px | |---|---|---| | bandeau horizontal, paves empiles | quatre paves en ligne, bandeau conserve | colonne laterale, graphique et selecteur cote a cote | ![360 px](https://10.105.200.41/attachments/f25ec19d-a2b2-48c1-8677-9d885e2f4282) ![768 px](https://10.105.200.41/attachments/d003f515-fe10-4a30-a34b-e2138b3a011c) ![1280 px](https://10.105.200.41/attachments/d513aa56-ce7c-4c8a-9f71-be143275c1dc) > **Ce que ces captures ne prouvent pas.** Elles valent pour le developpement, ou le > proxy Vite relaie `/v1` sans rien retirer. La production passe par Caddy, qui retire > `/api`, et depend de `VITE_API_BASE` au moment de la construction. Le rendu visuel est > le meme, le chemin reseau ne l'est pas -- voir la section suivante. ## Relecture - [ ] Un pair a relu et laissé un commentaire, même court - [ ] Ses remarques sont traitées, ou une réponse explique pourquoi elles ne le sont pas ## Ce qui suit le code - [x] Une variable d'environnement a changé de statut, elle est dans `.env.example` — voir ci-dessous ## Où regarder en priorité **1. Le préfixe des appels, et un piège de production qui allait avec.** `sites.js` écrivait `/api/v1/…` en dur et ignorait `VITE_API_BASE`, alors qu'`authentification.js` le lit depuis toujours : deux conventions dans le même dossier. Caddy relaie en `handle_path /api/*`, qui **retire** le préfixe, donc l'appel arrivait à l'API en `/v1/sites` — 404, et seulement en production, le proxy Vite conservant `/api`. Ce module vise désormais `/v1/…` et préfixe par `VITE_API_BASE` comme `/auth` ; le proxy Vite relaie `/v1`. Le pendant côté API est dans la PR #137. **2. `.env.example` annonçait qu'une base vide était « le bon réglage », production comprise. C'est faux et silencieux.** Caddy ne relaie que `/api/*` ; tout le reste tombe sur `try_files {path} /index.html`, donc `/v1/sites` reçoit **index.html en 200**, que le front essaie de lire en JSON. `VITE_API_BASE=https://app.g2.enervision/api` est **obligatoire à la construction de production** — c'est maintenant écrit, avec la valeur attendue. > À vérifier côté pile de déploiement (#94) : le même piège vaut pour `/auth`, qui est dans ce cas depuis `develop` et sans rapport avec cette PR. Ça mérite sans doute un ticket. **3. Deux tests neufs gardent la régression** (`sites.test.js`) : une base configurée préfixe bien l'appel, une base vide ne préfixe rien. Aucun test ne regardait l'origine jusqu'ici, seulement le chemin — c'est exactement pour ça que personne ne l'avait vu. **Ce que cette PR ne fait pas** (#24 reste ouvert) : - Écran Qualité : pas commencé côté front, alors que ses routes existent (PR #137). C'est le dernier critère de #24. - `/alertes` n'est affiché nulle part, seul le compteur de `/parc/synthese` l'est. - Pas de garde de route sur un 401 : la modale couvre le cas pendant qu'on est sur la page, rien ne redirige `/graphiques` → `/connexion` a priori. - RGAA non vérifié par axe-core, pas de tests e2e, pas de vérification aux trois largeurs du ticket (360/768/1280 px).
Écran Parc du ticket #24 : sept sites, consommation agrégée et son profil
horaire, disponibilité moyenne contre sa cible, alertes ouvertes par
sévérité (SyntheseParc, GET /parc/synthese + /parc/mesures) — au-dessus
de la comparaison multi-sites déjà en place (un appel /sites/{id}/mesures
par site coché, ligne de moyenne, infobulle, source indisponible sans
bloquer les autres, défilement horizontal sur téléphone).

Colonne fraîcheur (dernière relève) ajoutée au tableau des sites.

Reprise de session au chargement (App.vue) : session.reprendre() existait
dans le dépôt sans être jamais appelée — un rechargement de page perdait
une session pourtant valide côté cookie.

Menu du compte dans l'en-tête (EnteteApplication, MenuProfil) : profil,
panneau admin si le rôle l'autorise, déconnexion — qui redirige maintenant
vers /connexion, comme une connexion réussie redirige vers /graphiques.
/profil et /administration sont des pages minimales, sans contenu inventé :
le changement de mot de passe (#21) et la gestion des comptes (#16) restent
à construire, aucun lien mort en attendant.

42 tests neufs (154 au total), palette catégorielle validée par le skill
dataviz.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GnUAobdPeQynk8EnCeMLdW
Un 401 reçu par un appel du tableau de bord (api/sites.js — le seul module
qui parle à des routes gatées) signale l'expiration au dépôt de session
(signalerExpiration()), qui vide le profil et ouvre ModalReconnexion.

La modale se pose par-dessus la page dans son état incomplet : ni Échap ni
clic sur le fond ne la ferment, piège à focus minimal (Tab/Maj+Tab bouclent
dedans). Deux issues : une reconnexion réussie (le dépôt referme expiree
lui-même, symétrique à connecter()), ou « Retourner à la connexion » qui
abandonne franchement la page plutôt que de laisser croire que tout va
bien. Montée une fois dans EnteteApplication, donc présente sur toutes les
pages authentifiées.

Distinct des 401 que /auth gère déjà (identifiants refusés, rafraîchissement
épuisé au démarrage) : ceux-là restent traités par connecter() et
reprendre(), signalerExpiration() ne couvre que l'expiration en cours de
route.

13 tests neufs.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Supprime la route /administration, la page AdministrationView.vue (stub du
ticket #16, sans contenu réel) et son lien conditionnel au rôle dans le
menu du compte. #16 reste ouvert sur la forge, non touché.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
La coquille commune (EnteteApplication) passe de bandeau horizontal
permanent à colonne latérale au delà de 900 px — marque, puis le compte,
puis la navigation. Un seul lien aujourd'hui, « Parc » : le seul écran qui
existe, en ajouter vers des écrans absents inventerait une arborescence que
personne n'a validée.

Fond clair (--ev-paper, celui de la page) plutôt que sombre, sans bordure :
la colonne se fond dans le fond plutôt que de trancher dessus. Le
déclencheur du menu du compte devient une ligne pleine largeur — avatar,
adresse, chevron — au delà du même point de rupture, au lieu du rond
compact du bandeau mobile.

GraphiquesView et ProfilView passent en rangée au même point de rupture
pour que le contenu se place à droite de la colonne plutôt que dessous.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Padding, taille du chiffre principal et espacements resserrés — le bloc
prenait plus de la moitié de l'écran pour quatre chiffres.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
dashboard : les appels du parc visent /v1 et passent par VITE_API_BASE
All checks were successful
Intégration / Python — qualité, tests et dépendances (pull_request) Successful in 2m7s
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 3s
Intégration / Aucun secret commité (pull_request) Successful in 3s
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 4m16s
2b538a1aa4
sites.js écrivait « /api/v1/… » en dur et ignorait VITE_API_BASE, alors
qu'authentification.js, lui, le lit depuis toujours. Deux conventions dans le
même dossier, et une seule correspond à ce que Caddy attend.

Caddy relaie en « handle_path /api/* », qui RETIRE le préfixe : « /api/v1/sites »
arrivait à l'API en « /v1/sites », qu'elle ne servait pas — 404. Le proxy de
Vite, lui, conservait « /api », donc le développement marchait et la faute ne
serait apparue qu'une fois déployée.

Le routeur du tableau de bord sert désormais « /v1 » (commit précédent), ce
module vise « /v1/… » et préfixe par VITE_API_BASE comme /auth, et le proxy de
Vite relaie « /v1 » au lieu de « /api » pour que les deux environnements
tapent le même chemin.

Au passage, .env.example annonçait qu'une base vide était « le bon réglage »,
y compris en production. C'est faux et silencieux : Caddy ne relaie que
« /api/* », donc « /v1/sites » tombe sur le bloc qui sert la SPA et rend
index.html en 200, que le front lit en JSON. La variable est obligatoire à la
construction de production — dit explicitement, avec la valeur attendue.

Deux tests gardent la régression : l'un vérifie que la base configurée
préfixe bien l'appel, l'autre qu'elle ne préfixe rien par défaut. Aucun test
ne regardait l'origine jusqu'ici, seulement le chemin — c'est pour ça que
personne ne l'a vu.

Refs #24

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P6BwMkMyRBYJJYaHheLwGY
marvin force-pushed marvin/24-ecran-parc from 2b538a1aa4
All checks were successful
Intégration / Python — qualité, tests et dépendances (pull_request) Successful in 2m7s
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 3s
Intégration / Aucun secret commité (pull_request) Successful in 3s
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 4m16s
to eeea397e94
All checks were successful
Intégration / Python — qualité, tests et dépendances (pull_request) Successful in 2m5s
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 1m5s
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 4s
Intégration / Aucun secret commité (pull_request) Successful in 3s
2026-09-04 08:02:05 +00:00
Compare
marvin changed title from dashboard : �cran Parc � synth�se, comparaison des sites, navigation (#24) to dashboard : écran Parc — synthèse, comparaison des sites, navigation (#24) 2026-09-04 08:04:03 +00:00
marvin self-assigned this 2026-09-04 08:35:45 +00:00
marvin requested review from justine 2026-09-04 08:52:48 +00:00
Merge branch 'marvin/25-connexion-session' into marvin/24-ecran-parc
All checks were successful
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 38s
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 5s
Intégration / Aucun secret commité (pull_request) Successful in 3s
Intégration / Python — qualité, tests et dépendances (pull_request) Successful in 2m57s
2340d69974
Member

@marvin
La quasi totalité des critères du #24 sont respectés (en ce qui concerne le parc) à l'exception du "profil horaire" :
Le profil horaire du parc n'est qu'une polyligne de 20 px aria-hidden dans un pavé : mesuresParc est appelé mais son seul usage est décoratif, sans axe ni équivalent textuel.

Sinon petit soucis en production :
.env.example documente VITE_API_BASE mais rien ne l'applique donc la CI construit sans, et le rôle app ne construit pas le tableau de bord -> fait une assertion dans vite.config.js ?

Quelques bugs

  • glossaire.js:35 : PALIER[palier].libelle sans repli : un palier inconnu fait tomber TableauSites sur un TypeError, alors que libelleType et libelleSeverite ont leur "??"
  • GraphiqueConsommation.vue : le titre et le pied d'infobulle annoncent « kWh » alors que les données sont des kW.
  • graphique.js:63 : chargerSites() n'a pas de catch et part d'un onMounted : rejet non géré en console dès que le référentiel échoue.

Autres (mais problèmes mineurs)

  • L'en-tête de GraphiquesView.vue dit encore la coquille de navigation « hors périmètre » alors que 76e295d l'a montée.
  • TEINTES (variables CSS) et TEINTES_SERIE (hex) sont deux sources pour la même palette, que jetons.css peut désynchroniser sans bruit.
  • ecartTexte(null) laisse « par rapport à hier » seul dans le pavé.
  • La disponibilité sous cible ne se signale que par la couleur, aucun mot ne le dit.

T'auras aussi des conflits à régler avec la develop visiblement

@marvin La quasi totalité des critères du #24 sont respectés (en ce qui concerne le parc) à l'exception du "profil horaire" : **Le profil horaire** du parc n'est qu'une polyligne de 20 px aria-hidden dans un pavé : mesuresParc est appelé mais son seul usage est décoratif, sans axe ni équivalent textuel. **Sinon petit soucis en production :** .env.example documente VITE_API_BASE mais rien ne l'applique donc la CI construit sans, et le rôle app ne construit pas le tableau de bord -> fait une assertion dans vite.config.js ? **Quelques bugs** - glossaire.js:35 : PALIER[palier].libelle sans repli : un palier inconnu fait tomber TableauSites sur un TypeError, alors que libelleType et libelleSeverite ont leur "??" - GraphiqueConsommation.vue : le titre et le pied d'infobulle annoncent « kWh » alors que les données sont des kW. - graphique.js:63 : chargerSites() n'a pas de catch et part d'un onMounted : rejet non géré en console dès que le référentiel échoue. **Autres (mais problèmes mineurs)** - L'en-tête de GraphiquesView.vue dit encore la coquille de navigation « hors périmètre » alors que 76e295d l'a montée. - TEINTES (variables CSS) et TEINTES_SERIE (hex) sont deux sources pour la même palette, que jetons.css peut désynchroniser sans bruit. - ecartTexte(null) laisse « par rapport à hier » seul dans le pavé. - La disponibilité sous cible ne se signale que par la couleur, aucun mot ne le dit. T'auras aussi des conflits à régler avec la develop visiblement
marvin changed target branch from marvin/25-connexion-session to develop 2026-09-07 07:37:17 +00:00
.env.example documentait la variable, mais rien ne l'appliquait : la CI
construisait sans, et un paquet livré sans base d'API appelle « /v1/… » en
relatif. Caddy ne relaie que « /api/* » ; le reste tombe sur try_files et rend
index.html en 200, que le front essaie de lire en JSON. La panne est totale,
silencieuse, et ne se voit qu'une fois déployée.

vite.config.js refuse donc la construction de production sans elle. Une
assertion et non une valeur par défaut : un défaut plausible (« /api »)
marcherait sur la pile actuelle et masquerait le jour où elle change.

Le fichier exporte désormais une fonction, pour connaître la commande et le
mode ; vitest.config.js l'appelle avec le contexte des tests, mergeConfig ne
sachant pas fusionner une fonction. Le job du tableau de bord passe la
variable, sinon l'assertion le mettrait au rouge sans rien apprendre à
personne. Le paquet réellement déployé reste construit par le rôle app (#94).

Trois tests gardent l'assertion : elle refuse une production sans base, laisse
passer le développement et les tests, et laisse passer une production réglée.

Relecture de la #139.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DFGp2MvuHVuoJEss2G5nn1
dashboard: le profil horaire du parc se lit, et les corrections de relecture (#24)
All checks were successful
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 6s
Intégration / Aucun secret commité (pull_request) Successful in 3s
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 30s
Intégration / Python — qualité, tests et dépendances (pull_request) Successful in 2m57s
Infra Ansible / Playbooks Ansible valides (pull_request) Successful in 2m59s
d05ca020f0
Le profil horaire était le dernier critère du #24 en défaut : une polyligne de
20 px, aria-hidden, au fond du pavé « consommation ». mesuresParc était appelé
mais son résultat ne servait qu'à décorer — une courbe sans axe montre une
forme, jamais une valeur ni une heure, et aria-hidden la retirait de l'arbre
d'accessibilité sans rien mettre à la place.

Il a donc sa propre carte : deux axes gradués, l'un en heures UTC, l'autre en
kW depuis zéro, un résumé lu à la place du dessin (bornes et heure des
extrêmes) et un tableau hors écran qui porte les vingt-quatre valeurs. En SVG
et non avec Chart.js : une polyligne à deux axes ne vaut pas la dépendance, et
le SVG reste dans le DOM, donc inspectable.

Le reste de la relecture :

- glossaire.js rendait PALIER[palier].libelle sans repli, quand libelleType et
  libelleSeverite ont le leur : un palier hors référentiel faisait tomber
  TableauSites sur un TypeError.
- chargerSites() n'avait pas de catch et part d'un onMounted. Au-delà du rejet
  non géré, afficherTousLesSites() n'était jamais atteint : la liste restait
  vide, sans état d'erreur ni reprise, là où chargerSynthese fait déjà les
  deux. Elle les fait maintenant aussi.
- le titre et le pied d'infobulle du graphique annonçaient des kWh sur des
  données en kW (valeur_kw).
- TEINTES (variables CSS) et TEINTES_SERIE (hex) décrivaient la même palette
  dans deux fichiers, que jetons.css pouvait désynchroniser sans bruit. Une
  seule source, et un test qui relit jetons.css : la désynchronisation fait
  désormais échouer un test au lieu de peindre deux graphiques discordants.
  La classe .carte, elle aussi, devient commune plutôt que recopiée.
- ecartTexte(null) laissait « par rapport à hier » seul dans le pavé, ce qui
  se lit comme un écart nul. Une absence de mesure n'est pas une stabilité.
- la disponibilité sous cible ne se signalait que par la couleur (RGAA 1.4.1) :
  elle est écrite, la teinte ne fait que la redoubler.
- l'en-tête de GraphiquesView disait encore la coquille de navigation « hors
  périmètre », montée depuis 76e295d.

207 tests vitest passent, la construction de production est propre.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DFGp2MvuHVuoJEss2G5nn1
Merge branch 'marvin/25-connexion-session' into marvin/24-ecran-parc
All checks were successful
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 5s
Intégration / Aucun secret commité (pull_request) Successful in 3s
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 28s
Infra Ansible / Playbooks Ansible valides (pull_request) Successful in 1m2s
Intégration / Python — qualité, tests et dépendances (pull_request) Successful in 2m59s
da5b4d25ae
App.vue et App.test.js avaient été écrits deux fois : une première ici, le
03/09, parce que le menu du compte avait besoin de la reprise de session ; une
seconde sur la branche de la #138, le 04/09, quand justine y a signalé que
« reprendre() » n'était appelée de nulle part. Deux créations indépendantes
depuis un ancêtre où le fichier n'existait pas — d'où un conflit de contenu et
un conflit add/add, et non deux intentions qui divergent.

La version de la branche de base est retenue pour les deux fichiers. Les
App.vue sont fonctionnellement identiques (même import, même
onMounted(session.reprendre)), seul le commentaire diffère ; son App.test.js,
lui, couvre un cas de plus, la rotation de l'accès sur 401.

209 tests vitest passent, la construction de production est propre.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DFGp2MvuHVuoJEss2G5nn1
Author
Member

corrigé !

corrigé !
Merge branch 'develop' into marvin/24-ecran-parc
All checks were successful
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 5s
Intégration / Aucun secret commité (pull_request) Successful in 3s
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 26s
Intégration / Python — qualité, tests et dépendances (pull_request) Successful in 3m18s
225db5186e
justine merged commit 2ed259ef87 into develop 2026-09-07 08:53:09 +00:00
justine deleted branch marvin/24-ecran-parc 2026-09-07 08:53:10 +00:00
justine approved these changes 2026-09-07 08:59:08 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 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!139
No description provided.