forked from FroSteel/Planification
2d242d26ec
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.
524 lines
27 KiB
Markdown
524 lines
27 KiB
Markdown
# 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 `cachedByRef` quand `actionId` change) 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 iv `cancelled` sont 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_config` depuis 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)`
|
||
et `tech. dispo`. Inclut tous les tickets terminés (clos/résolus officiels
|
||
+ verdicts ghost « Fait » / « Suspendu »).
|
||
- En vue classique, séparateur `//` après `clos` (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-height` mesurée
|
||
par un `ResizeObserver`). 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ès
|
||
`appendChild`, avant que Firefox n'ait calculé la mise en page.
|
||
Combiné avec un `transform: translateY(4px)` dans l'animation
|
||
`pill-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-popup` avait `padding-top: 28px` (place pour la
|
||
dragbar) et `border: 2px`, alors que `.soft-unpinned` avait
|
||
`padding-top: 12px` et `border: 1px`. Le contenu se décalait de 16px
|
||
vers le haut et la popup devenait 1px plus fine de chaque côté.
|
||
- Fix : `.soft-unpinned` conserve désormais `padding-top: 28px` et
|
||
`border: 2px` comme `.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 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.
|
||
|
||
### 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()`.
|
||
|
||
### 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`.
|
||
|
||
### 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
|
||
- 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`,
|
||
`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_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)
|
||
|
||
### 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: 100vh`
|
||
sur 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:MM` et 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
|
||
`zoom` sur 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 Rouiller` sur 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 `description` du 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-custom` en 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 les `console.warn` utiles pour erreurs)
|
||
- Retrait 5× `console.log("[bg]")` debug verbose dans
|
||
fetchPlanningXml / fetchFicheHtml / fetchSessionTimeRemaining /
|
||
extendSessionKeepAlive (gardé warnings + logs critiques)
|
||
- Remplacement `extendBtn.onclick` par `addEventListener("click", ...)`
|
||
pour plus de cohérence
|
||
|
||
### Builds
|
||
- `dist/chromium/` et `dist/firefox/` prêts à charger en mode dev
|
||
- `planification-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 `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 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.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
|
||
- 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](https://gitea.netaplaid.ch/FroSteel/Planification/wiki/Contact)
|