diff --git a/CHANGELOG.md b/CHANGELOG.md index cf3d7dc..9c2da76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 ``. -- `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` diff --git a/README.md b/README.md index e150ec0..a5838c6 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,8 @@ Extension Chrome / Firefox pour visualiser de manière claire et rapide le plann - **Auteur** : Quentin Rouiller (QRO) - **Cible** : techniciens DGNSI (Canton de Vaud), EasyVista (`itsma.etat-de-vaud.ch` / `itsma.vd.ch`) - **Démarrage projet** : jeudi 16 avril 2026 -- **Version actuelle** : `v2026.5.40` +- **Version actuelle** : `v2026.5.41` +- **Contact** : `quentin.rouiller@vd.ch` - **Manifest** : V3 (Chrome/Edge/Firefox) - **Format** : `.zip` (Chromium) + `.xpi` signé (Firefox) @@ -16,12 +17,13 @@ Extension Chrome / Firefox pour visualiser de manière claire et rapide le plann ### Vue planning - Affichage des interventions et réservations groupées par technicien - Horaires, contact, lieu, catégorie, statut visibles d'un coup d'œil -- 8 techniciens hardcodés (équipe IT canton) +- Équipe configurable depuis le panel admin (détection automatique via EasyVista) - Cache local pour réduire les requêtes serveur ### Modes d'affichage - **Vue classique** (depuis v1.0.0) : cards en grille, mode compact écran 24" (depuis v2026.5.30) - **Vue horizontale** (depuis v2026.5.32) : timeline par tech, sidebar verticale (depuis v2026.5.36) + - Depuis v2026.5.40 : barre couleur catégorie + référence + ville sur chaque segment timeline - Toggle Vue classique ↔ Vue horizontale via bouton ⊞ dans popup user-badge - Persistance localStorage (`view_mode`) @@ -48,9 +50,11 @@ Extension Chrome / Firefox pour visualiser de manière claire et rapide le plann - Reconnexion automatique ### Admin et configuration -- Mode admin caché : bouton ⚙ Paramètres dans popup user-badge (depuis v2026.5.25, remplace les 5 clics secrets sur le titre) -- Configuration persistée dans `localStorage` (`admin_config`) -- Catégories interventions personnalisables (livraison/recup/remplacement/incident/rollout/reservation/autre) +- Mode admin : bouton ⚙ Paramètres dans popup user-badge (depuis v2026.5.25) +- Configuration persistée dans `chrome.storage.local` (`admin_config`) +- Sélecteur de groupe EasyVista (SI-CSS, SI-EXT, …) en tête de l'onglet Équipe (depuis v2026.5.40) — détection automatique via le `` de la page Planning EV. Robuste aux ajouts/renommages côté EV. +### `v2026.5.41` (latest, 27 avril 2026) — Suppression des hardcodes + UX admin + thème unifié +- **Plus aucun hardcode runtime** pour le groupe EV, les domaines, la liste de techniciens ou les absences récurrentes. Tout est piloté par `admin_config` (chrome.storage.local), persisté entre les mises à jour. +- **Au 1er install** : aucun tech sélectionné, aucune absence récurrente. Le viewer affiche un message *"Aucun technicien sélectionné"* tant que l'utilisateur n'a rien configuré dans Paramètres → Équipe. +- **Édition des domaines** : `chrome.permissions.request()` au save quand l'utilisateur saisit un domaine custom (au-delà des 2 défauts). Manifest `optional_host_permissions: ["https://*/*"]` pour accepter n'importe quel domaine HTTPS après accord du navigateur. +- **Heures de la journée** : bouton ✓ Appliquer explicite (au lieu de save direct), toast de confirmation, refetch automatique du planning. Synchronisation effective avec les requêtes EV (`day_start_hour` / `day_end_hour` / `begin_hour` / `end_hour`) — avant, l'affichage changeait mais les requêtes restaient sur 8h-19h hardcodés. +- **Thème unifié** : le toggle 🌙 de la topbar et le sélecteur Apparence du panel admin écrivent dans la même clé (`cfg.theme`). Le mode "Automatique" est résolu en JS via `prefers-color-scheme` (le CSS n'avait pas de bloc `@media`, ce qui faisait retomber sur le clair même quand l'OS était en sombre). Listener `matchMedia` pour bascule live en mode auto. +- **Conflit absence/réservation × intervention** : 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 au même créneau, sa carte est peinte en **rouge plein** (intervention conflictuelle). Logique : full-day → toutes en rouge ; partiel → seules celles en chevauchement. +- **Pillonel & Cie** : suppression de la fonction hardcodée `isPillonelAbsentFriday()`. L'absence récurrente est désormais générique : `RECURRING_ABSENCES[tech.id]` lit `cfg.recurringAbsences` et le label "Absent le X" est calculé dynamiquement depuis le jour de la semaine. +- **Notifications au-dessus du flou** : z-index `.toast-stack` relevé à 11000 (le panel admin est à 10000) pour que les toasts de feedback restent visibles quand l'admin est ouvert. +- **Vue horizontale** : popups au survol/clic limités aux candidats `dessous`/`dessus` (la sidebar à gauche et la timeline pleine largeur rendent gauche/droite peu praticables). +- **Tri équipe** : inclus d'abord, puis exclus, alphabétique dans chaque sous-groupe (ne saute plus quand on coche/décoche). +- **Auto-refresh à l'enregistrement** : ajouter/retirer un tech, changer de groupe, modifier les domaines → le planning se met à jour immédiatement (plus besoin de recharger l'extension manuellement). +- **Onglet Statuts retiré** (placeholder lecture-seule, jamais utilisé). +- **Ménage de code** : suppression de `CACHE_DAYS` (inutilisée), `LS_THEME` (clé localStorage obsolète), commentaire historique sur `initAdminMenu()`. Aucun symbole orphelin restant. + +### `v2026.5.40` — Sélection groupe EV + édition domaines + tri équipe + vue horizontale enrichie +- **Onglet Équipe** : sélecteur de groupe EasyVista (SI-CSS, SI-EXT, …) en tête de section, détecté automatiquement à l'ouverture du panel via le `` de la page Planning EV. Robuste aux ajouts/renommages côté EV. - ID groupe affiché en italique (ex: `ID groupe : 191`). -- Refresh auto de la liste d'équipe au changement de groupe. -- Plus de bouton "Détecter" (tout est auto à l'ouverture). -- Tri double : inclus d'abord, puis exclus, alphabétique dans chaque sous-groupe. -- **Onglet EasyVista** : édition manuelle des deux domaines (interne / externe), bouton Réinitialiser, normalisation auto des URLs. -- **Onglet Statuts retiré** (placeholder lecture seule). -- **Vue horizontale enrichie** : barre verticale couleur catégorie, référence en gras, ville en gris muted, hauteur 22→32px. -- Coulisses : nouveau message `detectGroups`, fonction `detectGroupsFromEV()` côté `background.js`. `detectTeamFromEV()` accepte un groupId en argument. +- Quand on change de groupe, la liste d'équipe se rafraîchit automatiquement avec les membres du nouveau groupe. +- Plus de bouton "Détecter" : tout est auto à l'ouverture. +- Tri double des techniciens : inclus d'abord, puis exclus, alphabétique dans chaque sous-groupe. +- **Onglet EasyVista** : édition manuelle des deux domaines (interne DGNSI / externe Internet), bouton Réinitialiser, normalisation auto des URLs. +- **Onglet Statuts retiré** (placeholder lecture-seule). +- **Vue horizontale enrichie** : chaque segment timeline contient désormais une barre verticale couleur catégorie à gauche, la référence (ex: `SYYMMDD_NNNNN`) en gras, et la ville en gris muted. Hauteur passée de 22px à 32px. +- **Réorganisation interne du repo** : `src/` pour les sources, `dist/` généré, `Autres/` pour build.sh + meta files (LICENSE, README, CHANGELOG), `Builds/` pour les artefacts distribués. ### `v2026.5.39` — Séparation Matin / Après-midi + Apparence -- Pills "MATIN" / "APRÈS-MIDI" entre les interventions -- Section Apparence (thème, taille du texte, cache, heures de la journée) -- Section À propos (version, auteur, licence) +- Pills "MATIN" / "APRÈS-MIDI" entre les interventions de chaque tech +- Section **Apparence** dans les paramètres : thème, taille du texte, durée du cache, heures de la journée +- Section **À propos** (version, auteur, licence) ### `v2026.5.38` — Attribution auteur + nettoyage + observabilité - Module `LOG` unifié + handlers globaux d'erreur - Toggle "Logs verbeux (debug)" dans le panel admin +- En-têtes copyright dans tous les fichiers source -### `v2026.5.37` — Refonte vue horizontale -- Topbar supprimée en vue horizontale, tout passe en sidebar -- User-badge + titre + bouton "Aujourd'hui" + date/heure + sélecteur + flèches + stats dans sidebar -- Banderole pompier masquée (badge + barre rouge gauche conservés) +### `v2026.5.37` — Refonte vue horizontale (sidebar complète) +- Topbar entièrement déplacée en sidebar verticale -### `v2026.5.36` — Sidebar verticale +### `v2026.5.36` — Sidebar verticale en vue horizontale - Wrapper flex-row `#horizontal-wrapper` [sidebar 200px] + [main] -- Déplacement physique des éléments via `ELEMENTS_TO_RELOCATE` -- Restauration propre en vue classique ### `v2026.5.32` — Vue horizontale togglable - Bouton ⊞ "Vue" dans popup user-badge -- Chaque tech = 1 ligne horizontale compacte -- localStorage `view_mode` ### `v2026.5.27` — Classification absences -- ABSENCE_LABELS : `^(cong[ée]s|maladie|pompier)$` -- Couleurs catégories -- Topbar une ligne : "Jeudi 23.04.26 • 21:55" +- Maladie indigo, Congé cyan, Pompier rouge ### `v4.2.3` — Grande popup timeline persistante - Clic segment timeline = popup persistante -- Hover = popup qui suit la souris ### `v4.1.3` — Tooltips épinglables - Introduction de `pinTooltip` @@ -133,17 +145,30 @@ Le numéro de **majeure** n'est **pas** un mois et **pas** un chiffre lié au ca ### `v1.0.0` (16 avril 2026) — Initiale - Premier viewer EasyVista pour le canton -Voir [CHANGELOG.md](CHANGELOG.md) pour l'historique complet (40 versions taggées). +Voir [CHANGELOG.md](CHANGELOG.md) pour l'historique complet (40+ versions taggées). ## Architecture technique ``` -manifest.json # Manifest V3 (Chrome) + gecko_settings (Firefox) -background.js # Worker fond : fetch planning XML, gestion session, fetch fiches -viewer.html # Interface principale -viewer.js # Logique (~9000 lignes) — voir détail ci-dessous -viewer.css # Styles + thèmes clair/sombre -icons/ # icon16, icon48, icon128 +Planning/ +├── src/ # Sources de l'extension (chargées par le navigateur) +│ ├── manifest.json # Manifest V3 (Chrome) + gecko_settings (Firefox) +│ ├── background.js # Service worker : fetch planning XML, gestion session, fetch fiches +│ ├── viewer.html # Interface principale +│ ├── viewer.js # Logique (~9 500 lignes) +│ ├── viewer.css # Styles + thèmes clair/sombre +│ └── icons/ # icon16, icon48, icon128 +├── Autres/ # Méta : build script + docs (depuis v2026.5.40) +│ ├── build.sh # Génère dist/chromium/, dist/firefox/, .zip, .xpi +│ ├── CHANGELOG.md +│ ├── LICENSE +│ └── README.md +├── Builds/ # Artefacts distribués aux techniciens +│ ├── Chromium/ +│ ├── Firefox/ +│ ├── planification-vYYYY.M.PATCH-chromium.zip +│ └── planification-vYYYY.M.PATCH-firefox.xpi +└── dist/ # Sortie de build (gitignoré) ``` ### `viewer.js` — fonctions clés @@ -160,30 +185,42 @@ icons/ # icon16, icon48, icon128 | `_softUnpinPopup` | v4.3.3 | Désépinglage mou (popup reste visible) | | `initAppClock` | v5.0.0 | Horloge HH:MM topbar | | `initSessionTimer` | v5.0.0 | Compteur session EV (tick 1s) | -| `initAdminMenu` | v5.0.0 | Menu admin (5 clics titre) | | `_applyViewMode` | v2026.5.32 | Toggle vue classique/horizontale | | `_maybeRetryFetchUser` | v2026.5.34 | Relance opportuniste fetch user | | `positionTooltipAnchored` | v2026.5.34 | Positionnement unifié (4 candidats) | +| `renderAdminSectionTeam` | v5.0.0 | Onglet admin Équipe (sélecteur groupe EV depuis v2026.5.40) | +| `renderAdminSectionEV` | v5.0.0 | Onglet admin EasyVista (édition domaines depuis v2026.5.40) | -### Constantes persistantes (toutes versions) +### `background.js` — fonctions clés -- 8 techs hardcodés : `76272,83725,66635,92235,90070,40944,72485,86874` -- Pillonel Olivier (ID 40944) : absent tous les vendredis (hardcodé) -- Group ID EasyVista : `191` +| Fonction | Rôle | +|---|---| +| `findEasyVistaSession` | Trouve l'onglet EV ouvert + extrait PHPSESSID | +| `fetchPlanningXml` | Fetch XML calendar_block du planning | +| `fetchFicheHtml` | Fetch HTML d'une fiche EV (avec retry SSO) | +| `fetchCurrentUser` | Identifie l'user EV connecté | +| `detectGroupsFromEV` (v2026.5.40) | Parse le `