commit 43c6e0e4872252680c0ea9a4e53bdd43a0a5810a Author: Quentin Rouiller Date: Thu Apr 16 09:00:00 2026 +0200 Initial commit — LICENSE MIT + README + CHANGELOG + .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e3fe9a3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,39 @@ +# OS +.DS_Store +Thumbs.db +desktop.ini + +# Editors +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# Backups +*.bak +*.bak-* +*.orig +*.old + +# Build artifacts (les ZIP/XPI livrés ne sont pas dans le repo, ils sont buildés à la demande) +*.zip +*.xpi +*.crx + +# Node (si jamais utilisé pour build) +node_modules/ +package-lock.json +npm-debug.log* + +# Logs +*.log +rebuild.log + +# Dossiers de travail temporaires +extracted/ +temp/ +tmp/ + +# Tests +test-output/ diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..8ecad8b --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,179 @@ +# CHANGELOG — Extension Planification EasyVista Canton de Vaud + +> Ce changelog documente l'évolution de l'extension Chrome/Firefox "Planification" +> développée par Quentin Rouiller pour les techniciens IT du Canton de Vaud. +> +> Les versions documentées ci-dessous sont celles dont les détails sont connus. +> Pour les versions plus anciennes, Claude Code se basera sur l'analyse du code +> source pour déterminer un message de commit pertinent. + +--- + +## v2026.5.37 — Refonte vue horizontale (sidebar complète) +**Branche** : current + +- Topbar en haut supprimée en vue horizontale +- User-badge + titre déplacés tout en haut de la sidebar +- Bouton "Aujourd'hui" pleine largeur avec icône ↺ +- Date + heure centrés sous le bouton +- Séparateur visuel +- Sélecteur de date pleine largeur +- Flèches ◀ ▶ côte à côte (wrapper #sidebar-arrows) +- Stats empilées +- Synchronisé à HH:MM +- Espace vide intentionnel +- Boutons du bas vers le haut (margin-top: auto sur Absence) +- Barre de rafraîchissement en overlay top-left +- Banderole pompier masquée en vue horizontale (badge + barre rouge à gauche conservés) + +## v2026.5.36 — Sidebar verticale en vue horizontale +- Création wrapper flex-row #horizontal-wrapper contenant [sidebar] + [main] +- Sidebar 200px (170px sur <1400px), sticky, bg-muted +- Déplacement physique des éléments via JS (ELEMENTS_TO_RELOCATE) +- Mémorisation parents d'origine (data-orig-parent + data-orig-index) +- Restauration propre en vue classique +- Zone nom tech : 140px → 120px + +## v2026.5.35 — Fix popup épinglé position vue horizontale + stats gauche +- Fix popup épinglé qui partait en haut à gauche en vue horizontale +- Cause : rows .intervention-v2 cachées (display: none) → getBoundingClientRect (0,0,0,0) +- Solution : priorité 1 tooltip visible, priorité 2 segment timeline, fallback srcEl +- Stats globales en colonne verticale 200px à gauche en vue horizontale +- Position sticky, fond bg-muted, séparateurs · masqués +- Zone nom tech 200px → 140px (vue horizontale) + +## v2026.5.34 — Bouton 📌 restauré + badge user cliquable +- HTML : badge user toujours visible avec "?" par défaut (retiré class hidden) +- _softUnpinPopup refait en 8 étapes loggées +- Popup reste visible après désépinglage (plus de suppression auto au mouseleave) +- Restauration du bouton 📌 dans .tooltip-actions +- Handler click ré-attaché : clic 📌 = ré-épingle, clic ↻ = recharge +- _ensureSoftUnpinnedCleanupHandler : handler global clic hors popup +- _maybeRetryFetchUser : relance opportuniste après succès planning et reconnexion session +- Logs abondants : [currentUser], [softUnpin], [positionTooltip], [persistentTimeline], [showTooltip] +- Fonction positionTooltipAnchored unifiée (4 candidats droite/gauche/dessous/dessus) +- popup._linkedIv stocké pour ré-épinglage + +## v2026.5.33 — Interactions vue horizontale différenciées +- Hover segment timeline en vue horizontale → grande popup directement (openPersistentTimelinePopup) +- Clic segment timeline en vue horizontale → ouvre fiche EasyVista +- Popup absence en vue horizontale : hover uniquement sur badge .card-tech-badge (pas sur carte entière) +- Vue classique : comportement inchangé + +## v2026.5.32 — Vue horizontale togglable +- Bouton ⊞ "Vue" dans popup user-badge (à côté ⚙ Paramètres) +- Toggle Vue classique ↔ Vue horizontale persisté localStorage "view_mode" +- HTML class "view-classic" ou "view-horizontal" sur +- Chaque tech = 1 ligne horizontale compacte en mode horizontal +- Card header devient barre latérale gauche fixe 200px +- Interventions détaillées masquées (display: none) +- Timeline horizontale pleine largeur +- Stats rapides .tech-row-stats ajoutés au header (nb interv, Xm · Ya) + +## v2026.5.31 — Sarcelle pour absence récurrente (REJETÉ par utilisateur) +- Couleur Pillonel vendredi : sarcelle foncée #0f766e / soft #ccfbf1 +- Variables --c-recurring, --c-recurring-soft +- Layout 4 colonnes forcées + scroll interne cartes (REJETÉ : "scroll en continu") + +## v2026.5.30 — Absence récurrente cyan + mode compact 24" +- Absence récurrente Pillonel vendredi en cyan +- Mode compact @media (max-width: 1920px) avec grid-template-columns: repeat(4, 1fr) + +## v2026.5.29 — Contraste++ + footer +- Contrastes encore plus forts (text-muted #d0d5de dark, #2e3642 light) +- Footer QRO/version : 13px badge avec fond bg-muted + bordure +- Fix highlight row : selector .intervention-v2[data-iv-idx] +- Scroll-into-view automatique au hover segment timeline + +## v2026.5.28 — Ajustements visuels absences +- Retrait pastille ronde (.tech-name-dot supprimée) — barre gauche + badge suffisent +- "Maladie" → "Maladie/Accident" +- Contraste textes secondaires +30% +- Popups épinglés width fixe 520px (ne rétrécit plus au resize fenêtre) +- _clampPopupInSafeArea ne rétrécit plus si popup > zone dispo + +## v2026.5.27 — Classification absences (Maladie/Congé/Pompier) +- Topbar une ligne : "Jeudi 23.04.26 • 21:55" (gros point •, même taille 22px) +- Fermeture auto popups non-épinglés au survol autre popup/carte +- Texte +20% topbar/stats/boutons +- Icône thème ☀/🌙 plus contrastée (bordure 1.5px, fond bg-muted, ombre) +- Classification absences (ABSENCE_LABELS) + absenceCategory : "maladie"|"conge"|"pompier"|null +- Couleurs : Maladie #4338ca indigo foncé, Congé #06b6d4 cyan, Pompier #b03030 rouge +- Badge + barre gauche + dégradé fond pour catégorie +- Libellé "Absent du DD.MM au DD.MM — Maladie/Accident" +- Suffixe `s` adaptatif (Congé/Congés) + +## v2026.5.26 — Badge user inconnu cliquable + retry +- En cas d'échec fetch user, afficher rond gris "?" cliquable +- Bouton ⚙ Paramètres accessible même quand user inconnu +- Retry automatique 60s (max 10 essais = 10 min) +- Reset compteur au succès + +## v2026.5.25 — Bouton Paramètres dans popup user-badge +- Remplace les 5 clics sur le titre pour ouvrir admin +- Bouton ⚙ Paramètres explicite dans le popup user-badge + +## v2026.5.16-v2026.5.24 — Évolutions diverses (à compléter) +- v2026.5.17 : popup user-badge avec ligne session (MM:SS), couleur selon seuil +- v2026.5.18 : dock pastilles popups épinglés avec couleur catégorie +- v2026.5.19 : drag popup épinglé +- v2026.5.20 : safe area popups (topbar + dock) +- v2026.5.22 : régénération tooltip hover après softUnpin +- v2026.5.23 : reset bulleState.pinned + iv._reloading + +--- + +## Versions antérieures (v5.x et v4.x) + +> Ces versions sont à analyser par Claude Code à partir des fichiers source. +> Indices clés à chercher dans le viewer.js : +> +> - Présence de `pinTooltip` → version >= v4.x +> - Présence de `_softUnpinPopup` → version >= v4.3.3 +> - Présence de `initSessionTimer` → version >= v5.0.9 +> - Présence de `initAppClock` → version >= v5.0.0 +> - Présence de `_applyViewMode` → version >= v2026.5.32 +> - Présence de `bindTimelinePopover` → version >= v4.2.3 +> - Présence de `openPersistentTimelinePopup` → version >= v4.2.3 +> - Commentaires `// vX.Y.Z` au-dessus des fonctions = version d'introduction + +### v5.0.0 — Refonte topbar (horloge, menu admin) +- initAppClock : horloge HH:MM au milieu topbar +- initAdminMenu : menu admin caché (5 clics sur titre) +- initSessionTimer : compteur de session EV (tick 1s) + +### v4.x — Fonctions tooltip avancées +- v4.1.12 : moveTooltip devenu no-op (popup statique) +- v4.1.15 : pendant épinglage, ne pas remplacer contenu sur hover autre iv +- v4.2.3 : grande popup timeline persistante (clic), suit-souris (hover) +- v4.2.3 : bindTimelinePopover, showTimelinePopover, moveTimelineTooltip +- v4.2.4 : setTooltipViewportPosition (détection auto fixed/abs) +- v4.2.9 : pied de page discret QRO/version +- v4.2.9 : initModalScrollLock (bloquer scroll arrière modal) +- v4.3.0 : tooltip live libéré après épinglage (réutilisable autres survols) +- v4.3.3 : _softUnpinPopup (désépinglage mou) + +### v3.x et antérieures — Versions de base +- À analyser par Claude Code + +--- + +## Notes techniques persistantes (toutes versions) + +- 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 +- Domaines cibles : itsma.etat-de-vaud.ch (interne), itsma.vd.ch (externe) +- SSO : Canton ForgeRock OpenAM +- ABSENCE_LABELS = /^(cong[ée]s|maladie|pompier)$/i +- ADMIN_CONFIG_KEY = "admin_config" +- VIEW_MODE_KEY = "view_mode" (depuis v2026.5.32) +- DAY_NAMES_FULL = ["Dimanche", "Lundi", ..., "Samedi"] +- GUIDs forms EV : S={C99ECD05-3D48-4C62-ABF0-66292053AED6} demande, I={07ED9C68-6172-48EA-8A58-90912B0A283E} incident +- Couleurs catégories : livraison #2563eb, recup #16a34a, remplacement #ea580c, incident #8b5cf6, rollout #92400e, reservation #f59e0b, autre #6b7280 + +## Auteur + +**Quentin Rouiller** (QRO) +Canton de Vaud — Service IT +Email pour commits Git : `quentin.rouiller@ikmail.com` diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..204f0c8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Quentin Rouiller + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..e46f6fe --- /dev/null +++ b/README.md @@ -0,0 +1,182 @@ +# Planification — Extension EasyVista Canton de Vaud + +Extension Chrome / Firefox pour visualiser de manière claire et rapide le planning des techniciens IT du Canton de Vaud dans EasyVista. + +## Aperçu rapide + +- **Auteur** : Quentin Rouiller (QRO) +- **Cible** : techniciens IT Canton de Vaud, EasyVista (`itsma.etat-de-vaud.ch` / `itsma.vd.ch`) +- **Démarrage projet** : jeudi 16 avril 2026 +- **Version actuelle** : `v2026.5.37` +- **Manifest** : V3 (Chrome/Edge/Firefox) +- **Format** : `.zip` (Chromium) + `.xpi` signé (Firefox) + +## Fonctionnalités principales + +### 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) +- 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) +- Toggle Vue classique ↔ Vue horizontale via bouton ⊞ dans popup user-badge +- Persistance localStorage (`view_mode`) + +### Tooltips et popups +- Tooltips au survol (hover) sur chaque intervention +- Popups épinglables (📌) pour garder ouvert (depuis v4.1.3) +- Popups timeline persistantes au clic (depuis v4.2.3) +- Drag-and-drop des popups épinglés (depuis v2026.5.19) +- Safe area : popups jamais cachés sous topbar/dock (depuis v2026.5.20) +- Position auto adaptative (4 candidats : droite/gauche/dessous/dessus) + +### Classification des absences (depuis v2026.5.27) +- **Maladie/Accident** : indigo `#4338ca` +- **Congé / Congés** : cyan `#06b6d4` (suffixe `s` adaptatif) +- **Pompier** : rouge `#b03030` +- Badge + barre gauche colorée + dégradé fond +- Absence récurrente Pillonel vendredi : cyan (depuis v2026.5.30) + +### User et session +- Badge user avec photo/initiales en topbar +- Badge cliquable (depuis v2026.5.26) : popup avec ⚙ Paramètres + ⊞ Vue + compteur session MM:SS +- Retry automatique en cas d'échec fetch user (60s, max 10 essais) +- Compteur de session EasyVista (tick 1s, depuis v5.0.0) +- 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) + +## Versionning — historique et conventions + +L'extension a connu **3 systèmes de versionning successifs** : + +| Période | Format | Exemple | +|---|---|---| +| 16-17 avril 2026 | Versions de base | `1.0.0`, `2.0.0`, `3.0.0` | +| 18-20 avril 2026 | SemVer classique | `4.1.3`, `4.2.8`, `5.0.12` | +| 21 avril 2026 → maintenant | **Année + mois + patch** | `2026.5.16` → `2026.5.37` | + +### Pourquoi le passage à `YYYY.M.PATCH` ? + +À partir de la **v2026.5.16** (21 avril 2026), l'extension est passée au versionning par année : +- Plus lisible pour les utilisateurs (l'année indique immédiatement la fraîcheur) +- Plus de débat sur ce qui constitue un "majeur" vs "mineur" +- Bump du `PATCH` à chaque livraison + +⚠️ **Important** : `v2026.5.16` succède chronologiquement à `v5.0.12`, malgré le numéro qui semble plus petit. Le préfixe `2026` indique l'année. + +## Versions notables + +### `v2026.5.37` (latest, 25 avril 2026) — 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.36` — Sidebar verticale +- 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" + +### `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` + +### `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). + +## 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 +``` + +### `viewer.js` — fonctions clés + +| Fonction | Introduite | Rôle | +|---|---|---| +| `loadForDate` | v1.0.0 | Fetch + parse planning pour une date donnée | +| `buildTooltipHTML` | v1.0.0 | Construction HTML du tooltip d'intervention | +| `pinTooltip` | v4.1.3 | Épingler un tooltip (le rendre permanent) | +| `bindTimelinePopover` | v4.2.3 | Lier popover timeline aux segments | +| `showTimelinePopover` | v4.2.3 | Afficher popover persistante | +| `openPersistentTimelinePopup` | v4.2.3 | Grande popup détaillée | +| `setTooltipViewportPosition` | v4.2.4 | Détection auto fixed/abs | +| `_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) | + +### Constantes persistantes (toutes versions) + +- 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` +- GUIDs forms EV : + - Demande : `S={C99ECD05-3D48-4C62-ABF0-66292053AED6}` + - Incident : `I={07ED9C68-6172-48EA-8A58-90912B0A283E}` +- SSO : Canton ForgeRock OpenAM +- Storage keys : `admin_config`, `view_mode` (depuis v2026.5.32) +- Domaines : `itsma.etat-de-vaud.ch` (interne), `itsma.vd.ch` (externe SSO) + +## Installation + +### Firefox +Télécharger le `.xpi` signé depuis le serveur de mises à jour interne, ou drag-and-drop dans `about:addons`. + +### Chrome / Edge +Mode développeur : décompresser le ZIP et charger en tant qu'extension non empaquetée. + +## Développement + +```bash +git clone https://gitea.netaplaid.ch/FroSteel/Planification.git +cd Planification + +# Pour packager une nouvelle version : +# 1. modifier le code +# 2. bump version dans manifest.json +# 3. zip + xpi +git add -A +git commit -m "Version YYYY.M.PATCH — description" +git tag vYYYY.M.PATCH +git push origin main +git push --tags +``` + +## Licence + +[MIT License](LICENSE) — Copyright (c) 2026 Quentin Rouiller + +## Auteur + +**Quentin Rouiller** (QRO) +Canton de Vaud — Service IT