Refresh / cache / verdicts ghost : - Rafraîchissement séquentiel (1 fiche à la fois) avec arrêt instantané via AbortController. - Re-fetch checksum frais (basicAutoComplete + redirectHeader). - Cache merge robuste avec fallback cachedByRef ; cache écrit toutes les 5 fiches (incrémental). - Verdicts ghost unifiés : ✓✓ clos/résolu, ✓ Fait (pending), ✓ jaune Suspendu, retrait silencieux pour cancelled. - Statuts EV configurables depuis Paramètres → EasyVista (matching insensible à la casse, accents, conjugaisons). - Mode diagnostic optionnel (Diagnostics) qui logge tout sans rien retirer. Topbar (vue classique) : - Sélecteur de date du planning ancré au centre absolu (ne se décale plus quand le bouton Arrêter apparaît). - Bouton Aujourd'hui en toutes lettres. - Horloge contextuelle réduite à côté. Personnalisation (Paramètres → Apparence) : - Couleur de la topbar : 12 presets cliquables + picker custom + champ hex. Texte topbar adapté automatiquement (luminance) pour rester lisible. - Police de l'application : 28 choix (Arial, Helvetica, Verdana, Tahoma, Trebuchet, Calibri, Segoe UI, Times New Roman, Georgia, Cambria, Garamond, Palatino, Courier, Consolas, Comic Sans, Impact, …) appliquée à toute la page (cards, popups, panel admin) avec preview live. - Export / import du cache et de admin_config. Vue horizontale : - Bloc Aujourd'hui + horloge empilé verticalement dans la sidebar. - Date sélectionnée mise en avant (taille augmentée, gras), date du jour + heure réduites à la même petite taille. - Barre verticale verte à droite des mini-cards clos/résolu (✓✓), avec décalage du ✓✓ pour ne pas chevaucher. - Sidebar adopte la couleur de topbar custom (titre, horloge, today-block, date sélectionnée, boutons, theme-toggle, séparateurs translucides cohérents via color-mix). Stats globales : - Nouveau compteur 'X faits / Y clos' entre (matin · après-midi) et tech. dispo. - Vue classique : séparateur '//' après clos. - Vue horizontale (sidebar) : barre horizontale 1px de séparation. Onboarding équipe : - Carte centrée propre (icône, titre, description, bouton 'Ouvrir paramètres') quand aucun technicien n'est sélectionné. Bouton ouvre directement la section Équipe du panel admin. Bugfix : - Issue #1 (Pompier + Absence) : les deux badges s'affichent désormais avec '/' au lieu de masquer l'absence. - Absences récurrentes restaurées au switch de groupe (étaient invisibles alors qu'en storage). - Barre de progression / bannière session expirée suivent la hauteur dynamique de la topbar (--topbar-height via ResizeObserver). - STATUS_FR regex limite 30 → 200 chars. - Description action décodée proprement (\u0022, <br>, HTML strippé) ; préfixe 'login:' retiré du commentaire technicien. - Flèche '↗' retirée des références cliquables.
27 KiB
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 coordinateurs DGNSI (Canton de Vaud).
Les versions documentées ci-dessous sont celles dont les détails sont connus. Pour les versions plus anciennes, l'analyse du code source permet de reconstituer un message de version pertinent.
v2026.5.44 — Refonte topbar, personnalisation Apparence, onboarding équipe, refresh séquentiel
Refonte visuelle de la topbar (vue classique + horizontale), nouveau panneau de personnalisation (couleur de la barre du haut + police de l'application sur toute la page), nouvelle expérience d'onboarding quand aucun technicien n'est sélectionné, refonte du système de verdicts ghost (✓✓ clos / ✓ Fait / ✓ Suspendu), refresh strictement séquentiel avec arrêt instantané, et plusieurs corrections.
Refresh / cache / verdicts ghost
- Rafraîchissement séquentiel (1 fiche à la fois) au lieu de 5 workers parallèles → arrêt instantané via le bouton « ✕ Arrêter » (AbortController), plus de races DOM, ordre d'affichage cohérent (pompier d'abord, puis alpha, puis matin → après-midi).
- Re-fetch du checksum frais via
basicAutoComplete+redirectHeader(plus de fiche périmée entre sessions). - Cache merge robuste (fallback
cachedByRefquandactionIdchange) et cache écrit toutes les 5 fiches pendant le refresh (incrémental). - Système de verdicts ghost unifié : ✓✓ vert (clos / résolu officiel), ✓ gris « Fait » (terminated-pending), ✓ jaune « Suspendu » (terminated-suspended), retrait silencieux pour cancelled / cancelled- reservation / cancelled-absence.
- Statuts EV (clos / résolu / annulé / suspendu) éditables depuis Paramètres → EasyVista avec matching insensible à la casse, accents et conjugaisons.
- Mise à jour live du tooltip et du popup épinglé après un verdict (plus besoin de fermer/réouvrir).
- Clic immédiat sur la carte dès que le verdict tombe (avant la fin du refresh complet).
- Boutons « Actualiser » (rapide, ne re-télécharge pas les fiches déjà connues) vs « Tout recharger » (force tout sauf les ✓✓ déjà clos).
- Mode diagnostic optionnel (Paramètres → Diagnostics) : aucune
intervention disparue n'est retirée silencieusement, tout est tracé sous
le préfixe
[disparition]dans la console F12 pour debug. En PROD (par défaut), les ivcancelledsont bien retirées comme avant.
Topbar — vue classique
- Sélecteur de date du planning ancré au centre absolu : il ne se décale plus quand le bouton « ✕ Arrêter » apparaît à droite pendant un rafraîchissement.
- Bouton « Aujourd'hui » affiché en toutes lettres (au lieu de « Auj. »).
- Horloge contextuelle (date du jour + heure) réduite et discrète, à côté du bouton Aujourd'hui dans un cadre encadré.
- Date du planning agrandie et neutre (couleur stable, plus de bascule selon la date sélectionnée).
Personnalisation — Paramètres → Apparence
- Couleur de la barre du haut : 12 presets cliquables (Défaut, Blanc,
Gris clair, Anthracite, Bleu DGNSI, Marine, Vert sapin, Brique, Violet,
Rouge, Bleu pastel, Vert pastel) + picker custom + champ hex
#rrggbb- bouton « Réinitialiser ».
- La couleur s'applique uniquement à la topbar (et à la sidebar quand on est en vue horizontale).
- Le texte de la topbar (titre, horloge, date, capture-info, badges, boutons) s'adapte automatiquement (clair/foncé) selon la luminance de la couleur choisie pour rester toujours lisible.
- Police de l'application : 28 choix organisés en familles (sans-serif : Arial, Helvetica, Verdana, Tahoma, Trebuchet, Calibri, Segoe UI, Gill Sans, Futura, Optima ; serif : Times New Roman, Georgia, Cambria, Garamond, Palatino, Bookman ; monospace : Courier New, Consolas, Lucida Console, JetBrains Mono ; display : Comic Sans MS, Impact, Brush Script, Copperplate ; condensée : Arial Narrow). La police choisie s'applique à toute la page (topbar, cards, popups, tooltips, panel admin) et chaque option du select s'affiche dans sa propre police pour prévisualiser le rendu, avec un aperçu live à droite.
- Export / import du cache et de
admin_configdepuis Paramètres → Diagnostics.
Vue horizontale
- Bloc « Aujourd'hui + horloge » empilé verticalement dans la sidebar, dans le même cadre encadré que la vue classique.
- Date sélectionnée mise en avant (taille augmentée, en gras), date du jour et heure réduites à la même petite taille pour rester discrètes.
- Barre verticale verte ajoutée à droite des mini-cards quand le ticket est officiellement clôturé / résolu (✓✓), avec léger décalage du ✓✓ pour ne pas chevaucher la barre.
- Quand l'utilisateur a choisi une couleur de topbar, la sidebar prend
aussi la couleur : titre, horloge, capture-info, stats, today-block,
date sélectionnée, boutons, theme-toggle et séparateurs adoptent une
teinte translucide cohérente (via
color-mix) qui contraste correctement sur n'importe quel fond.
Statistiques globales
- Nouveau compteur « X faits / Y clos » entre
(matin · après-midi)ettech. dispo. Inclut tous les tickets terminés (clos/résolus officiels- verdicts ghost « Fait » / « Suspendu »).
- En vue classique, séparateur
//aprèsclos(au lieu de·). - En vue horizontale (sidebar), une barre horizontale 1px sépare le bloc interventions/faits/clos du bloc tech. dispo + pompiers / absents.
Onboarding équipe (1ʳᵉ install ou config vide)
- L'erreur générique « Aucun technicien sélectionné » est remplacée par une
carte d'onboarding centrée comprenant :
- icône (👥) cerclée en couleur accent du thème ;
- titre « Aucune équipe configurée » ;
- description claire ;
- bouton primary « Ouvrir paramètres » qui ouvre directement le panel admin sur la section Équipe.
- Carte centrée verticalement et horizontalement dans la zone disponible, identique en vue classique et horizontale.
Bugfix
- Issue #1 (Pompier + Absence) : si un tech est à la fois pompier ET
absent, les deux badges s'affichent désormais avec un séparateur
/au lieu de masquer l'absence derrière le badge pompier. - Absences récurrentes : quand on changeait de groupe puis revenait au
groupe initial, les jours d'absence cochés pour les techniciens
disparaissaient visuellement (la donnée elle-même restait en storage).
Correction : restauration depuis
cfg.recurringAbsencesà chaque re-render. - Barre de progression / bannière session expirée : suivent désormais
la hauteur dynamique de la topbar (variable CSS
--topbar-heightmesurée par unResizeObserver). Plus de chevauchement quand on scrolle. - STATUS_FR regex : limite augmentée de 30 à 200 caractères (battait sur « Suspendu : Attente info bénéficiaire/demandeur »).
- Description action : décodage
" → ",<br> → \n, HTML strippé. Préfixe « login: » retiré du commentaire technicien dans le tooltip / popup. - Tooltip référence : flèche « ↗ » retirée du lien cliquable.
v2026.5.43 — Fix Firefox : positionnement menu dock + stabilité popup pin/unpin
Menu hover sur pastille du dock (popup réduit)
- Bug Firefox uniquement : quand un popup épinglé était réduit dans la taskbar du bas, le menu qui apparaît au survol de la pastille (Agrandir / Fermer) se positionnait trop haut, pas juste au-dessus de la pastille.
- Cause :
getBoundingClientRect()était appelé immédiatement aprèsappendChild, avant que Firefox n'ait calculé la mise en page. Combiné avec untransform: translateY(4px)dans l'animationpill-hover-menu-appear, Firefox lisait des dimensions décalées. - Fix : positionnement hors écran initial, force-layout via
void offsetHeight, mesure des dimensions, puis pose finale. CSS de l'animation simplifiée en opacité-only (plus de transform).
Stabilité popup au pin/unpin
- Bug : la popup épinglée bougeait visuellement et changeait légèrement de taille quand on la dé-épinglait avec le bouton 📌 (puis l'inverse).
- Cause :
.pinned-popupavaitpadding-top: 28px(place pour la dragbar) etborder: 2px, alors que.soft-unpinnedavaitpadding-top: 12pxetborder: 1px. Le contenu se décalait de 16px vers le haut et la popup devenait 1px plus fine de chaque côté. - Fix :
.soft-unpinnedconserve désormaispadding-top: 28pxetborder: 2pxcomme.pinned-popup. Bordure passe juste en--border-strong(gris discret) plutôt que--accent(bleu) pour signaler visuellement le mode "détaché". Position et taille stables.
v2026.5.42 — Nettoyage de commentaires + exemples génériques
- Passage en revue des commentaires de
src/viewer.js: les exemples qui illustraient le parsing des contacts/lieux/références/codes-barres ont été uniformisés en placeholders abstraits (Nom1 Prénom1 +41XXXXXXXXX,SYYMMDD_NNNNN,XXXX_NNNNNNNN, etc.) plutôt que des chaînes spécifiques. Comportement runtime strictement inchangé — uniquement de la documentation et des commentaires. - Mise à jour cohérente du README, du CHANGELOG et des pages wiki Versions / Utilisation pour utiliser les mêmes notations génériques dans les exemples de référence.
v2026.5.41 — Suppression des hardcodes (groupe / domaines / équipe) → tout depuis l'admin
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 depuisadmin_config(chrome.storage.local), alimenté par les onglets Équipe et EasyVista du panel admin. chrome.storage.localsurvit aux mises à jour d'extension → la configuration de l'utilisateur (groupe, équipe, absences récurrentes, domaines) est conservée d'une version à l'autre.
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 viagetEvOrigins().
Group ID EasyVista
- Défaut hardcodé conservé comme filet de sécurité (
191= SI-CSS). - Lu via
getGroupId()dansfetchPlanningXml,detectTeamFromEVet partout où c'était hardcodé. - Le sélecteur de Paramètres → Équipe alimente
cfg.groupId.
Liste des techniciens
- Aucun défaut hardcodé. Sur un install vierge,
cfg.teamest vide → le service worker lèveno_team_configuredplutô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 decfg.team). - Côté
viewer.js:TEAMetRECURRING_ABSENCESsont desletvides au démarrage, repeuplés par_initTeamFromConfig()appelé tôt dansinit().
Coulisses
- Nouveau dans
background.js: helpersgetAdminConfig(),getEvOrigins(),getGroupId(),getSupportIds(),getDayBounds()qui centralisent la lecture de la config persistée. fetchPlanningXml()lèveError("no_team_configured")quand la liste de techs est vide ; le handlerfetchPlanningpropage l'erreur au viewer viaerr.kind.- Toutes les anciennes constantes hardcodées (
EV_ORIGINS,DEFAULT_SUPPORT_IDSinterne àdetectTeamFromEV,isXXXAbsentFriday) 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_hourenvoyés àplanning_xhr.phpetbegin_hour/end_hourenvoyés àplan_set_holidays_popup.php(création absence) etplan_set_tech_planif_popup.php(douchette) lisent désormaiscfg.dayStart/cfg.dayEnd(Paramètres → Apparence → Heures de la journée). Avant :8/18/19figé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 danshost_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-dotde 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
- Une barre verticale couleur catégorie à gauche (mêmes teintes que
les
- Hauteur de la timeline en horizontale passée de 22px à 32px pour laisser la place au texte
- Fond des segments d'intervention :
--bg-elevatedneutre + 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)
Séparation matin / après-midi
- Séparateur visuel "MATIN" / "APRÈS-MIDI" entre les interventions dans la vue classique : pill grise neutre, ligne 3px épaisse.
- Affiché aussi entre les absences partielles (demi-journée).
- Si une période est vide, son séparateur n'est pas affiché.
- Caché en vue horizontale (les rows sont masquées de toute façon).
Timeline — coupure midi très visible
- Bande verticale composée d'un trait massif central (couleur --text)
- stripes diagonales en arrière-plan (effet "césure"). 6 px de large (7 px en vue horizontale). Visible immédiatement, pas de label superflu.
Vue horizontale (sidebar)
- Boutons (Absence, Douchette, Actualiser, Tout recharger, Vider cache,
Thème) maintenant vraiment poussés en bas via
min-height: 100vhsur la sidebar. - Bouton "Aujourd'hui" : style cohérent avec les flèches ◀ ▶ (même padding, font-size, hauteur), texte centré, libellé complet "Aujourd'hui" (au lieu de "Auj.").
- Espace visuel entre
Actualisé à HH:MMet le bouton Absence (fine bordure top + padding).
Vue classique (topbar)
- Ordre verrouillé via CSS
order: badge user → titre → date-nav → capture-info → refresh-check. Évite les déplacements au retour de vue horizontale.
Section Apparence (admin) — refondue + en première position
- Thème : sélecteur Auto / Clair / Sombre (s'enregistre direct).
- Durée du cache (jours) : configurable, défaut 7 jours, range 1-365. Lue par viewer.js (purge auto) ET background.js (au boot).
- Taille du texte : 5 niveaux (-20%, -10%, 100%, +10%, +20%) via CSS
zoomsur body. Persisté dans admin_config.textZoom et appliqué dès le boot. - Section "Apparence" est maintenant la première dans le panel admin.
v2026.5.38 — Attribution auteur + nettoyage code
Branche : current
Attribution auteur
- Ajout en-têtes copyright dans tous les fichiers source (viewer.js, viewer.html, viewer.css, background.js)
- Ajout
@author Quentin Rouillersur les fonctions principales (loadForDate, buildCard, buildTooltipHTML, pinTooltip, _softUnpinPopup, positionTooltipAnchored, _applyViewMode, _moveElementsToSidebar, _restoreElementsToTopbar, fetchAndShowCurrentUser, _maybeRetryFetchUser, initAppClock, initAppFooter, bindTimelinePopover, openPersistentTimelinePopup, showTooltip, _findFreePopupPosition, _clampPopupInSafeArea, findEasyVistaSession, fetchPlanningXml, fetchCurrentUser, detectNetworkContext) - Ajout signature "Développé par Quentin Rouiller" en bas du popup user-badge (style cohérent avec footer version : 11px, italique, gris atténué, séparateur fin)
- Mise à jour
descriptiondu manifest pour mentionner DGNSI
Nettoyage et optimisation
- Retrait fonction vide
initAdminMenu()(inutile depuis v2026.5.25, l'admin passe par le bouton ⚙ Paramètres du popup user-badge) - Retrait classe CSS orpheline
.date-picker-day(déjà remplacée par.date-customen v2026.5.17) - Retrait anciens styles CSS
.intervention(layout v1, jamais générés depuis le passage à.intervention-v2) - Retrait commentaire orphelin
.intervention-v2.is-ghost(classe retirée en v4.3.3) - Retrait 14×
console.log("[viewMode]")debug verbose (gardé uniquement lesconsole.warnutiles pour erreurs) - Retrait 5×
console.log("[bg]")debug verbose dans fetchPlanningXml / fetchFicheHtml / fetchSessionTimeRemaining / extendSessionKeepAlive (gardé warnings + logs critiques) - Remplacement
extendBtn.onclickparaddEventListener("click", ...)pour plus de cohérence
Builds
dist/chromium/etdist/firefox/prêts à charger en mode devplanification-v2026.5.38-chromium.zip(~144 Ko)planification-v2026.5.38-firefox.xpi(~144 Ko, à signer sur AMO)
v2026.5.37 — Refonte vue horizontale (sidebar complète)
- 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 <html>
- 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 absence récurrente (jour fixe) : 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"
- Absences récurrentes (configurées par tech) 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
sadaptatif (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 ne sont pas documentées en détail. Pour les analyser à partir des fichiers source historiques (consultables via les tags git), voici les indices clés à chercher dans
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.Zau-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
- Code historique consultable via les tags git correspondants.
Notes techniques persistantes (toutes versions)
- 8 techs hardcodés à l'origine (depuis v2026.5.41 : retirés, alimentés par admin_config)
- Absences récurrentes (un tech absent un jour fixe par semaine) hardcodées à l'origine, depuis v2026.5.41 configurables via Paramètres → Équipe
- 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) Technicien DGNSI — Canton de Vaud Contact : voir page wiki Contact