dashboard: intègre la page de connexion de la maquette #25 et son jeu de comptes #75

Merged
marvin merged 6 commits from olivier/25-page-connexion into develop 2026-09-03 09:35:36 +00:00
Member

Ce que ça change

Intègre la page de connexion de la maquette #25 dans le tableau de bord Vue :
trois des quatre cadres du fichier Figma, une couche de jetons relevée sur les
variables, et six comptes de démonstration qui remplacent une route d'API qui
n'existe pas encore.

Amène aussi sur develop le squelette Vue et FastAPI du ticket #27, qui avait
été fusionné directement dans main : services/dashboard/ ne contenait qu'un
README ici, et #25 n'avait pas de squelette où se poser.

Référence #25. Ne le ferme pas : voir « Où regarder en priorité ».

Preuve

$ npm run test:unit
 Test Files  5 passed (5)
      Tests  42 passed (42)

$ npm run build
✓ built in 70ms
dist/assets/index-DcNU25tM.js   105.38 kB │ gzip: 40.74 kB

$ grep -rlE "mdp-44|g2@enervision" dist/
(aucun résultat — le jeu de comptes n'entre pas dans le paquet livré)

Vérifié dans Chrome, cadre par cadre : « au repos » et « identifiants refusés »
en 1440×900, « mobile 390 » en 390×844. Le refus affiche bien le bandeau, le
décompte des tentatives, la bordure rouge et le message rattaché au champ, et
le focus revient au mot de passe.

Contrastes. Le tableau joint à la planche « Socle visuel » a été calculé sur
les valeurs de la planche, pas sur les variables réellement appliquées.
Recalculé sur les variables, tout atteint AA — relevé complet dans
services/dashboard/README.md. Le seul écart, trait-100 sur blanc à 1,23:1,
est un séparateur décoratif auquel le seuil ne s'applique pas.

Accessibilité. Libellés rattachés par for et id, erreurs par
aria-describedby, échec annoncé une seule fois dans une zone role="alert",
focus rendu au champ à corriger, bascule de révélation avec aria-pressed,
titre de page mis à jour à chaque navigation, cibles tactiles à 44 px.

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 nouvelle variable d'environnement est apparue, elle est dans .env.example
    (VITE_API_BASE, VITE_AUTH_MOCK)

Où regarder en priorité

1. Le formulaire mot de passe contredit le contrat gelé. ADR-006 pose
Keycloak et un mandataire OIDC confidentiel ; les 21 routes de openapi.json
n'en portent aucune qui accepte un mot de passe, et le cadre Figma « Variante
— identification déléguée » est celui qui correspond. Les deux chemins sont
écrits dans src/api/authentification.js, seul fichier à changer une fois la
décision prise. Tant qu'elle n'est pas prise, le critère « l'utilisateur peut
se connecter » de #25 n'est pas tenable contre l'API réelle, et le ticket reste
ouvert.

2. La planche « Socle visuel » diverge des variables Figma sur six
couleurs
, dont un accent annoncé cuivre (#A8501B) et appliqué bleu
(#016FB9). Les jetons suivent la variable, puisque c'est elle que les cadres
appliquent. Tableau des écarts dans le README du service, à trancher au #53.

3. Le contrat énumère trois rôleslecteur, gestionnaire,
administrateur — alors que le pied de la maquette écrit « Deux rôles :
exploitant, administrateur », où « exploitant » n'existe pas au contrat. Les
comptes de démonstration suivent le contrat ; le texte de la page suit la
maquette. À arbitrer.

4. Le garde-fou du jeu de comptes mérite un œil. Une garde if (MOCK_ACTIF)
ne suffisait pas : la première version laissait le mot de passe dans le paquet
de production. Il faut que le module ne soit pas importé statiquement. C'est
maintenant un import dynamique sous import.meta.env.DEV, et
tests/unit/paquet-de-production.test.js construit pour de vrai à chaque
exécution et échoue si quoi que ce soit fuit.

5. Deux écarts assumés à la maquette, tous deux pour l'ordre de tabulation
(RGAA 12.8) : « Mot de passe oublié ? » reste au-dessus du bouton aux deux
largeurs, et le panneau d'identité vient après le formulaire dans le DOM. Et un
ajout qui n'est dans aucun cadre : l'accusé « Session ouverte », qui tient lieu
de destination tant que #23 et #24 n'existent pas. À supprimer d'un bloc si vous
préférez que la page ne bouge pas.

6. La tâche CI Tableau de bord recoupe le ticket #57, qui étend la chaîne.
À réconcilier si les deux arrivent en même temps.

## Ce que ça change Intègre la page de connexion de la maquette #25 dans le tableau de bord Vue : trois des quatre cadres du fichier Figma, une couche de jetons relevée sur les variables, et six comptes de démonstration qui remplacent une route d'API qui n'existe pas encore. Amène aussi sur `develop` le squelette Vue et FastAPI du ticket #27, qui avait été fusionné directement dans `main` : `services/dashboard/` ne contenait qu'un README ici, et #25 n'avait pas de squelette où se poser. Référence #25. **Ne le ferme pas** : voir « Où regarder en priorité ». ## Preuve ``` $ npm run test:unit Test Files 5 passed (5) Tests 42 passed (42) $ npm run build ✓ built in 70ms dist/assets/index-DcNU25tM.js 105.38 kB │ gzip: 40.74 kB $ grep -rlE "mdp-44|g2@enervision" dist/ (aucun résultat — le jeu de comptes n'entre pas dans le paquet livré) ``` Vérifié dans Chrome, cadre par cadre : « au repos » et « identifiants refusés » en 1440×900, « mobile 390 » en 390×844. Le refus affiche bien le bandeau, le décompte des tentatives, la bordure rouge et le message rattaché au champ, et le focus revient au mot de passe. **Contrastes.** Le tableau joint à la planche « Socle visuel » a été calculé sur les valeurs de la planche, pas sur les variables réellement appliquées. Recalculé sur les variables, tout atteint AA — relevé complet dans `services/dashboard/README.md`. Le seul écart, `trait-100` sur `blanc` à 1,23:1, est un séparateur décoratif auquel le seuil ne s'applique pas. **Accessibilité.** Libellés rattachés par `for` et `id`, erreurs par `aria-describedby`, échec annoncé une seule fois dans une zone `role="alert"`, focus rendu au champ à corriger, bascule de révélation avec `aria-pressed`, titre de page mis à jour à chaque navigation, cibles tactiles à 44 px. ## 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 nouvelle variable d'environnement est apparue, elle est dans `.env.example` (`VITE_API_BASE`, `VITE_AUTH_MOCK`) ## Où regarder en priorité **1. Le formulaire mot de passe contredit le contrat gelé.** ADR-006 pose Keycloak et un mandataire OIDC confidentiel ; les 21 routes de `openapi.json` n'en portent aucune qui accepte un mot de passe, et le cadre Figma « Variante — identification déléguée » est celui qui correspond. Les deux chemins sont écrits dans `src/api/authentification.js`, seul fichier à changer une fois la décision prise. Tant qu'elle n'est pas prise, le critère « l'utilisateur peut se connecter » de #25 n'est pas tenable contre l'API réelle, et le ticket reste ouvert. **2. La planche « Socle visuel » diverge des variables Figma sur six couleurs**, dont un accent annoncé cuivre (`#A8501B`) et appliqué bleu (`#016FB9`). Les jetons suivent la variable, puisque c'est elle que les cadres appliquent. Tableau des écarts dans le README du service, à trancher au #53. **3. Le contrat énumère trois rôles** — `lecteur`, `gestionnaire`, `administrateur` — alors que le pied de la maquette écrit « Deux rôles : exploitant, administrateur », où « exploitant » n'existe pas au contrat. Les comptes de démonstration suivent le contrat ; le texte de la page suit la maquette. À arbitrer. **4. Le garde-fou du jeu de comptes mérite un œil.** Une garde `if (MOCK_ACTIF)` ne suffisait pas : la première version laissait le mot de passe dans le paquet de production. Il faut que le module ne soit pas importé statiquement. C'est maintenant un import dynamique sous `import.meta.env.DEV`, et `tests/unit/paquet-de-production.test.js` construit pour de vrai à chaque exécution et échoue si quoi que ce soit fuit. **5. Deux écarts assumés à la maquette**, tous deux pour l'ordre de tabulation (RGAA 12.8) : « Mot de passe oublié ? » reste au-dessus du bouton aux deux largeurs, et le panneau d'identité vient après le formulaire dans le DOM. Et un ajout qui n'est dans aucun cadre : l'accusé « Session ouverte », qui tient lieu de destination tant que #23 et #24 n'existent pas. À supprimer d'un bloc si vous préférez que la page ne bouge pas. **6. La tâche CI `Tableau de bord` recoupe le ticket #57**, qui étend la chaîne. À réconcilier si les deux arrivent en même temps.
enervision_api : création du projet python fastapi
Some checks failed
Intégration / Qualité du code Python (pull_request) Failing after 3s
Intégration / Tests unitaires (pull_request) Successful in 3s
Intégration / Aucun secret commité (pull_request) Successful in 3s
Intégration / Qualité du code Python (push) Failing after 3s
Intégration / Tests unitaires (push) Successful in 3s
Intégration / Aucun secret commité (push) Successful in 3s
a0ed7eb2aa
Les commits dd41634 et a0ed7eb (ticket #27) ont été fusionnés directement dans
main, alors que la convention veut qu'une branche parte de develop et y
retourne, et que main ne reçoive que develop. services/dashboard/ était donc
vide sur develop et le ticket #25 n'avait pas de squelette où se poser.

Aucun conflit : les deux branches ont touché des chemins disjoints.
Trois des quatre cadres du fichier Figma : « au repos », « identifiants
refusés » et « mobile 390 ». Point de rupture unique à 900 px, colonne
d'identité dans la proportion 620 / 820 du cadre 1440.

Le thème vit dans src/assets/jetons.css, relevé sur les variables Figma et
non sur la planche « Socle visuel » : les deux divergent sur six couleurs, et
c'est la variable que les cadres appliquent. Le détail et les contrastes
recalculés sont dans le README du service. L'ensemble atteint le niveau AA.

Accessibilité : libellés rattachés par « for » et « id », erreurs rattachées
par « aria-describedby », échec annoncé une seule fois dans une zone
« role=alert », focus rendu au champ à corriger, bascule de révélation avec
« aria-pressed », titre de page mis à jour à chaque navigation.

Deux écarts assumés à la maquette, tous deux pour l'ordre de tabulation :
« Mot de passe oublié ? » reste au dessus du bouton aux deux largeurs, et le
panneau d'identité vient après le formulaire dans le DOM.

Ne ferme pas #25 : le critère « l'utilisateur peut se connecter » reste ouvert
tant que le groupe n'a pas tranché entre le formulaire de la maquette et
l'identification déléguée du contrat gelé. Les deux chemins sont écrits dans
src/api/authentification.js, seul fichier à changer.

La démonstration livrée par create-vue est retirée : plus rien ne la référence
depuis que la racine mène à /connexion.

Ticket #25
La chaîne ne connaissait que Python. Les tests du tableau de bord ne
s'exécutaient donc nulle part, et « Tests Unitaires » en preuve du ticket #25
n'aurait rien prouvé.

Même idiome que les autres tâches : un scan décide, et l'étape se saute d'elle
même si services/dashboard/package.json n'existe pas.

Recoupe le ticket #57, qui étend la chaîne : à réconcilier si les deux
arrivent en même temps.

Ticket #25
dashboard: ajoute six comptes de démonstration pour la page de connexion
Some checks failed
Intégration / Qualité du code Python (pull_request) Failing after 3s
Intégration / Tests unitaires (pull_request) Successful in 3s
Intégration / Aucun secret commité (pull_request) Successful in 45s
Intégration / Tableau de bord (pull_request) Successful in 1m4s
0afee61568
La route d'ouverture de session n'existe pas côté API : sans jeu de comptes,
la page de connexion ne se démontrait pas et ses trois cadres restaient
inatteignables à la main.

Les comptes sont des données, pas du code : comptes-de-demonstration.json
porte les six adresses <prenom>.g2@enervision.fr, leur rôle et leurs sites.
Ajouter ou retirer quelqu'un ne demande de toucher à aucune logique. Aucune
dépendance ajoutée, Vite et Vitest importent le JSON nativement.

Les rôles suivent l'énumération du contrat gelé — lecteur, gestionnaire,
administrateur — et non les deux du pied de la maquette, où « exploitant »
n'existe pas au contrat. À trancher au ticket #53.

Le jeu rejoue les échecs de la maquette : 401 avec le décompte des tentatives,
puis 429 après quatre essais sur une même adresse.

Le mot de passe n'entre jamais dans une construction de production. La
première version le laissait pourtant dans le paquet : une garde « if » ne
suffit pas, il faut que le module ne soit pas importé statiquement.
tests/unit/paquet-de-production.test.js construit pour de vrai et vérifie que
ni le mot de passe, ni les adresses, ni le module n'y sont.

L'accusé de session ouverte n'est dans aucun cadre. Il tient lieu de
destination tant que le tableau de bord n'existe pas, et se remplace par une
redirection quand #23 et #24 arrivent.

Ticket #25
olivier added this to the EnerVision project 2026-09-02 09:26:50 +00:00
olivier self-assigned this 2026-09-02 09:27:08 +00:00
olivier canceled time tracking 2026-09-02 09:27:18 +00:00
olivier added the due date 2026-09-02 2026-09-02 09:27:22 +00:00
olivier added spent time 2026-09-02 09:27:26 +00:00
3 hours
marvin requested review from marvin 2026-09-03 09:22:01 +00:00
marvin approved these changes 2026-09-03 09:25:43 +00:00
Dismissed
marvin left a comment

ok je valide la page, je vais lier l'api a set page dans #94

ok je valide la page, je vais lier l'api a set page dans #94
Merge branch 'develop' of https://10.105.200.41/g2/enervision into olivier/25-page-connexion
Some checks failed
Intégration / Qualité du code Python (pull_request) Successful in 50s
Intégration / Tests unitaires et couverture (pull_request) Successful in 56s
Intégration / Dépendances du tableau de bord (pull_request) Successful in 17s
Intégration / Images épinglées par version (pull_request) Successful in 2s
Intégration / Tableau de bord (pull_request) Failing after 14s
Intégration / Aucun secret commité (pull_request) Successful in 2s
Intégration / Dépendances Python et inventaire applicatif (pull_request) Successful in 1m20s
bda15ea547
# Conflicts:
#	services/dashboard/.gitignore
#	services/dashboard/index.html
#	services/dashboard/package-lock.json
#	services/dashboard/package.json
#	services/dashboard/src/App.vue
#	services/dashboard/src/assets/base.css
#	services/dashboard/src/assets/main.css
#	services/dashboard/src/main.js
#	services/dashboard/src/router/index.js
marvin dismissed marvin's review 2026-09-03 09:30:17 +00:00
Reason:

New commits pushed, approval review dismissed automatically according to repository settings

dashboard: restaure la configuration vite perdue au revert
All checks were successful
Intégration / Qualité du code Python (pull_request) Successful in 43s
Intégration / Tests unitaires et couverture (pull_request) Successful in 52s
Intégration / Dépendances du tableau de bord (pull_request) Successful in 12s
Intégration / Images épinglées par version (pull_request) Successful in 3s
Intégration / Tableau de bord (pull_request) Successful in 17s
Intégration / Aucun secret commité (pull_request) Successful in 3s
Intégration / Dépendances Python et inventaire applicatif (pull_request) Successful in 1m11s
66b3732dab
Le fichier services/dashboard/vite.config.js avait été supprimé par le
revert 9d010d8 sans jamais être restauré. Sans lui, vite tourne sans le
plugin @vitejs/plugin-vue et refuse de parser les fichiers .vue, tandis
que vitest.config.js échoue à l'importer : le serveur de développement
comme les tests unitaires du tableau de bord étaient cassés.

Contenu repris tel quel de dd41634 : plugins vue et vue-devtools, alias
« @ » vers src.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GnUAobdPeQynk8EnCeMLdW
marvin approved these changes 2026-09-03 09:35:18 +00:00
marvin left a comment

un réalignement avec la branche develop a été fait

un réalignement avec la branche develop a été fait
marvin merged commit 1a94b57d03 into develop 2026-09-03 09:35:36 +00:00
gabriel removed this from the EnerVision project 2026-09-03 11:39:46 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Total time spent: 3 hours
olivier
3 hours
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
2026-09-02
Dependencies

No dependencies set

Reference
g2/enervision!75
No description provided.