v2026.5.41 — Suppression des hardcodes runtime + UX admin + thème unifié

This commit is contained in:
Quentin Rouiller
2026-04-27 03:00:00 +02:00
parent af85473837
commit 7c0742594c
6 changed files with 639 additions and 242 deletions
+93 -55
View File
@@ -9,67 +9,105 @@
---
## v2026.5.40 — Sélection groupe EV + édition domaines + tri équipe + vue horizontale enrichie
**Branche** : main
## v2026.5.41 — Suppression des hardcodes (groupe / domaines / équipe) → tout depuis l'admin
### Onglet Équipe (panel admin)
- Nouveau **sélecteur de groupe EasyVista** (SI-CSS, SI-EXT, …) en
tête de section, détecté automatiquement à l'ouverture du panel
via le `<select id="plan_group_id">` de la page Planning EV →
source autoritative, robuste aux ajouts/renommages côté EV (un
nouveau groupe apparaît tout seul).
- ID groupe affiché en italique à côté du sélecteur (ex:
`ID groupe : 191`).
- Quand on change de groupe, la **liste d'équipe se rafraîchit
automatiquement** avec les membres du nouveau groupe (fetch live).
- **Plus de bouton "Détecter"** : tout est auto à l'ouverture de
l'onglet — détection groupes + détection membres.
- **Tri double** des techniciens : d'abord les inclus (cases cochées),
puis les exclus, et alphabétique dans chaque sous-groupe (insensible
casse/accents). Le tri se rafraîchit uniquement aux render() pour
éviter que les lignes sautent quand on coche/décoche.
### Plus aucun hardcode au runtime
- Le groupe EasyVista, les domaines (interne/externe) et la liste des
techniciens ne sont **plus codés en dur** dans `background.js` /
`viewer.js`. Tout est lu depuis `admin_config` (chrome.storage.local),
alimenté par les onglets **Équipe** et **EasyVista** du panel admin.
- `chrome.storage.local` survit aux mises à jour d'extension → la
configuration de l'utilisateur (groupe, équipe, absences récurrentes,
domaines) est conservée d'une version à l'autre.
### Onglet EasyVista (panel admin)
- Refonte complète : **édition manuelle des deux domaines** EV
(interne DGNSI = `https://itsma.etat-de-vaud.ch`, externe Internet =
`https://itsma.vd.ch`).
- Bouton **💾 Enregistrer** (normalise : ajoute `https://`, retire le
trailing slash) + bouton **↺ Réinitialiser** pour revenir aux
valeurs par défaut.
- Les domaines par défaut restent codés en dur en fallback ; le
branchement effectif côté `background.js` (utiliser `cfg.evOrigins`)
sera fait dans une prochaine version après validation.
### Domaines EasyVista (interne / externe)
- Défaut hardcodé conservé comme **filet de sécurité** au 1er install
(`https://itsma.etat-de-vaud.ch` + `https://itsma.vd.ch`).
- L'utilisateur peut les remplacer dans Paramètres → EasyVista. Le
service worker (`findEasyVistaSession`, `evFetch`, etc.) lit la valeur
effective via `getEvOrigins()`.
### Onglet Statuts retiré
- Section "Statuts" supprimée du panel admin (placeholder lecture
seule, jamais utile).
### Group ID EasyVista
- Défaut hardcodé conservé comme filet de sécurité (`191` = SI-CSS).
- Lu via `getGroupId()` dans `fetchPlanningXml`, `detectTeamFromEV` et
partout où c'était hardcodé.
- Le sélecteur de Paramètres → Équipe alimente `cfg.groupId`.
### Vue horizontale enrichie
- Chaque segment timeline d'intervention contient désormais :
- Une **barre verticale couleur catégorie** à gauche (mêmes teintes
que les `intervention-dot` de la vue classique : livraison/recup/
remplacement/incident/rollout/réservation/autre).
- La **référence** (ex: `SYYMMDD_NNNNN`) en gras.
- La **ville** en gris muted.
- Hauteur de la timeline horizontale passée de 22px à 32px pour
laisser la place au texte.
- Fond des segments d'intervention : `--bg-elevated` neutre + bordure
1px pour que le texte reste lisible (la couleur catégorie n'est
plus en fond plein, juste en barre gauche).
- Vue classique inchangée.
### Liste des techniciens
- **Aucun défaut hardcodé**. Sur un install vierge, `cfg.team` est
vide → le service worker lève `no_team_configured` plutôt que de
fetcher avec une liste fictive.
- Le viewer affiche : *"Aucun technicien sélectionné. Ouvrez ⚙
Paramètres → Équipe pour choisir le groupe EasyVista et cocher les
techniciens à afficher."*
- Lu via `getSupportIds()` (CSV des clés de `cfg.team`).
- Côté `viewer.js` : `TEAM` et `RECURRING_ABSENCES` sont des `let`
vides au démarrage, repeuplés par `_initTeamFromConfig()` appelé tôt
dans `init()`.
### Coulisses (`background.js`)
- Nouveau message `detectGroups` + fonction `detectGroupsFromEV()`
qui fetche `/index.php?eventName=HelpDesk_PlanningItem` et extrait
les paires `(id, nom)` via le `<select>`.
- `detectTeamFromEV()` accepte désormais un `groupId` en argument →
permet de basculer entre SI-CSS / SI-EXT depuis l'admin.
- ⚠ Le fetch du planning continue d'utiliser `group_id=191` codé en
dur — sera retiré quand on validera que `cfg.groupId` est bien
alimenté par le sélecteur en terrain réel.
### Coulisses
- Nouveau dans `background.js` : helpers `getAdminConfig()`,
`getEvOrigins()`, `getGroupId()`, `getSupportIds()`,
`getDayBounds()` qui centralisent la lecture de la config persistée.
- `fetchPlanningXml()` lève `Error("no_team_configured")` quand la
liste de techs est vide ; le handler `fetchPlanning` propage l'erreur
au viewer via `err.kind`.
- Toutes les anciennes constantes hardcodées (`EV_ORIGINS`,
`DEFAULT_SUPPORT_IDS` interne à `detectTeamFromEV`,
`isPillonelAbsentFriday`) ont été remplacées ou retirées.
### Conflits absence/réservation × intervention
- Nouveau code visuel : si une intervention est planifiée pendant
qu'un tech a une **absence** (toute la journée ou demi-journée) ou
une **réservation** sur le même créneau, sa carte (row classique +
mini-card en vue horizontale) est peinte en **rouge plein** avec
texte blanc. Logique : full-day → toutes les interv en rouge ;
partiel → seules celles en chevauchement.
### Synchronisation des heures EV ↔ admin
- Les paramètres `day_start_hour` / `day_end_hour` envoyés à
`planning_xhr.php` et `begin_hour` / `end_hour` envoyés à
`plan_set_holidays_popup.php` (création absence) et
`plan_set_tech_planif_popup.php` (douchette) lisent désormais
`cfg.dayStart` / `cfg.dayEnd` (Paramètres → Apparence → Heures de la
journée). Avant : `8` / `18` / `19` figés en dur, ce qui rendait le
réglage des heures côté UI partiellement effectif (la timeline se
redessinait, mais les requêtes EV continuaient sur la plage hardcodée).
### Édition des domaines EV → permissions runtime
- `manifest.json` : ajout de `"optional_host_permissions":
["https://*/*"]` pour permettre l'édition des domaines EasyVista
vers des origines non prévues à l'install.
- Quand l'utilisateur saisit un domaine custom dans Paramètres →
EasyVista et clique sur Enregistrer, l'extension appelle
`chrome.permissions.request()` pour demander la permission au
navigateur. Si refus → toast d'avertissement, les fetches échoueront
jusqu'à acceptation.
- Les deux domaines hardcodés (`itsma.etat-de-vaud.ch` +
`itsma.vd.ch`) restent dans `host_permissions` (toujours accordés à
l'install), pas besoin de redemander la permission pour eux.
## v2026.5.40 — Vue horizontale enrichie (ref + ville + barre couleur)
**Branche** : current
- En vue horizontale, chaque segment timeline d'intervention contient
désormais :
- Une **barre verticale couleur catégorie** à gauche (mêmes teintes que
les `.intervention-dot` de la vue classique : livraison/recup/
remplacement/incident/rollout/réservation/autre)
- La **référence** (ex: `SYYMMDD_NNNNN`) en gras
- La **ville** en gris muted
- Hauteur de la timeline en horizontale passée de 22px à 32px pour laisser
la place au texte
- Fond des segments d'intervention : `--bg-elevated` neutre + bordure 1px
pour que le texte reste lisible (la couleur catégorie n'est plus en fond
plein, juste en barre gauche)
- Vue classique inchangée
- Réorganisation interne du repo : `src/` pour les sources, `dist/`
généré, `Autres/` pour build.sh + meta files (LICENSE, README,
CHANGELOG)
## v2026.5.39 — Séparation Matin / Après-midi + Apparence (thème, zoom, cache)
**Branche** : current
### Séparation matin / après-midi
- Séparateur visuel "MATIN" / "APRÈS-MIDI" entre les interventions
@@ -314,4 +352,4 @@
**Quentin Rouiller** (QRO)
Technicien DGNSI — Canton de Vaud
Email pour commits Git : `quentin.rouiller@ikmail.com`
Contact : `quentin.rouiller@vd.ch`