Compare commits

..

40 Commits

Author SHA1 Message Date
FroSteel 2d242d26ec v2026.5.44 — Refonte topbar, personnalisation Apparence, onboarding équipe, fix #1
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.
2026-05-01 18:08:11 +02:00
Quentin Rouiller 54b8f826df docs: clarification audience — coordinateurs DGNSI (pas techniciens)
L'extension est utilisée par les coordinateurs DGNSI qui pilotent dans
EasyVista le planning de l'équipe technicienne. Les techniciens
eux-mêmes consultent leur planning sur leur douchette terrain et
n'utilisent pas cet outil.

Mises à jour cohérentes : 'public cible' dans README et CHANGELOG.
Les mentions 'technicien' qui désignent le sujet du planning (cartes
des techniciens, liste des techniciens cochés, etc.) sont conservées
puisque ce sont les personnes DONT on regarde le planning.
2026-04-27 06:02:12 +02:00
FroSteel 8ecf2d3df4 Actualiser README.md 2026-04-27 05:52:42 +02:00
Quentin Rouiller 9d8d8102d7 chore: retire CLAUDE.md et toutes mentions externes du repo
- Suppression du fichier CLAUDE.md (workflow de développement interne)
- Retrait des références correspondantes dans README.md et CHANGELOG.md
- .gitignore : retire la section dédiée (les règles secrets génériques
  .env / *.token / secrets.json couvrent l'essentiel)

Le repo ne contient plus que les sources, la doc utilisateur et les
métadonnées du projet.
2026-04-27 05:39:53 +02:00
Quentin Rouiller 48b00a8585 docs(README): refonte pour clarté + audience + installation directe
- Section Installation rapide ajoutée en tête (Firefox + Chromium avec
  liens directs vers la release courante).
- Audience clarifiée : 'coordinateurs et techniciens DGNSI' (pas juste
  techniciens — les deux rôles utilisent l'extension).
- Doublon de phrase v2026.5.40 retiré.
- Versions notables limitées aux 5 dernières + lien vers CHANGELOG / wiki
  Versions pour l'historique complet.
- Lien direct cliquable vers chaque version notable.
- Bandeau de liens vers toutes les pages wiki en haut du README.
- Lignes de code mises à jour : ~10 700 (viewer.js) + ~1 600 (background.js)
  + ~4 800 (viewer.css).
- Structure du repo réécrite pour refléter le layout flat sur Gitea
  (build.sh à la racine, pas dans Autres/).
- Section Développement simplifiée + référence à CLAUDE.md pour le
  workflow détaillé.
2026-04-27 05:31:29 +02:00
Quentin Rouiller 6bb97addd6 docs(CLAUDE.md): clarifie Phase 3 signature (addon AMO déjà enregistré)
L'addon planification-dgnsi@netaplaid.ch est désormais enregistré sur AMO.
Mise à jour du workflow Phase 3 : pour les versions futures, utiliser
'Téléverser une nouvelle version' (pas 'Submit a New Add-on'). Précision
aussi sur le fait que Chrome/Edge ne sont pas concernés par AMO et n'ont
pas d'auto-update natif.
2026-04-27 05:18:30 +02:00
Quentin Rouiller 05275a3be5 firefox: update_hash v2026.5.43 → sha256 du .xpi signé AMO 2026-04-27 05:02:27 +02:00
Quentin Rouiller d7b680fb3f v2026.5.43 — Fix Firefox menu dock position + stabilité popup pin/unpin
Bug Firefox uniquement : positionnement du menu hover des pastilles du
dock (popup réduit) corrigé. La cause était que getBoundingClientRect()
était appelé immédiatement après appendChild sans que Firefox n'ait fini
de calculer la mise en page, combiné à un transform: translateY dans
l'animation d'apparition du menu. Fix : positionnement hors écran initial,
force-layout via offsetHeight, puis pose finale. Animation CSS simplifiée
en opacité-only.

Stabilité popup au pin/unpin (tous navigateurs) : la popup épinglée
bougeait de 16px et changeait légèrement de taille quand on la
dé-épinglait via le bouton 📌. Cause : .pinned-popup avait padding-top
28px + border 2px alors que .soft-unpinned avait padding-top 12px + border
1px. Fix : .soft-unpinned conserve désormais les mêmes dimensions, juste
la couleur de bordure change (--border-strong gris au lieu de --accent
bleu) pour signaler le mode détaché.
2026-04-27 04:57:03 +02:00
Quentin Rouiller 3c7e7c0c25 firefox: update_hash v2026.5.42 → sha256 du .xpi signé par Mozilla AMO
Le .xpi distribué sur la release v2026.5.42 a été remplacé par sa version
signée AMO (signature META-INF/mozilla.rsa + COSE). Le sha256 dans
firefox-updates.json reflète maintenant le .xpi signé, ce qui permet
l'auto-update Firefox vers la version signée et installable.
2026-04-27 03:44:11 +02:00
Quentin Rouiller b3677d661a chore: change addon ID en planification-dgnsi@netaplaid.ch
L'ID précédent (planification@netaplaid.ch) était déjà enregistré sur AMO.
Nouvel ID : planification-dgnsi@netaplaid.ch — nom plus explicite (mention
DGNSI), domaine inchangé.

build.sh + firefox-updates.json mis à jour avec le nouvel ID. Sha256 du
.xpi v2026.5.42 régénéré.
2026-04-27 03:32:44 +02:00
Quentin Rouiller 8390db9937 v2026.5.42 — Nettoyage de commentaires + exemples génériques
Passage en revue des commentaires de 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. README, CHANGELOG et pages wiki Versions/Utilisation
mis à jour de manière cohérente.
2026-04-27 03:28:13 +02:00
Quentin Rouiller 2cc9552fbf security: anonymisation de toutes les données nominatives résiduelles
Suite à un audit de sécurité, retrait de TOUTES les données réelles dans
le code et la documentation :

- src/viewer.js : commentaires-exemples qui contenaient de vrais noms +
  numéros de téléphone (Seda Kaya, Hélène Dongiovanni, Krkic Admir et leurs
  numéros) → remplacés par 'Nom1 Prénom1 +41XXXXXXXXX', etc.
- src/viewer.js : refs tickets EV avec dates concrètes (SYYMMDD_NNNNN avec
  vraies dates) → remplacées par 'SYYMMDD_NNNNN' génériques.
- src/viewer.js : codes-barres / numéros de série (TPCQ_NNN, MNNN, DNNN,
  TNNN avec vrais chiffres) → remplacés par 'XXXX_NNNNNNNN', 'XNNNNNN'.
- README.md, CHANGELOG.md, wiki Utilisation/Versions : exemples de référence
  ticket S260424_00042 → SYYMMDD_NNNNN.

Aucune donnée nominative ni identifiant réel ne subsiste dans le code,
les commentaires, ni la documentation publique. Sha256 du .xpi mis à jour
dans firefox-updates.json.
2026-04-27 03:23:20 +02:00
Quentin Rouiller 0327a55c74 fix(firefox): ajoute background.scripts fallback (compat MV3 Firefox/AMO)
Mozilla AMO rejetait le .xpi avec :
  Unsupported "/background/service_worker" manifest property used without
  "/background/scripts" property as Firefox-compatible fallback.

build.sh ajoute maintenant 'scripts: [background.js]' à background.* dans
le manifest Firefox uniquement (Chrome ignore 'scripts' quand
'service_worker' est présent ; Firefox ignore 'service_worker' et utilise
'scripts'). Les deux navigateurs chargent le même background.js.

Sha256 du .xpi v2026.5.41 mis à jour dans firefox-updates.json.
2026-04-27 03:02:38 +02:00
Quentin Rouiller 67708d1ad3 chore: simplifie firefox-updates.json (repo public, URL raw fixe)
- update_url remis sur .../raw/branch/main/firefox-updates.json maintenant
  que le repo est public (raw URL accessible sans auth).
- firefox-updates.json toujours à la racine, contient toutes les versions ;
  Firefox lit la liste et choisit la plus haute compatible.
- Sha256 du .xpi v2026.5.41 mis à jour suite au rebuild.
- CLAUDE.md : note sur le channel d'update simplifiée.
2026-04-27 03:00:02 +02:00
Quentin Rouiller 1730758cb4 Distribution: firefox-updates.json + CLAUDE.md (workflow Claude) + nettoyage secrets
- firefox-updates.json à la racine : manifest auto-update Firefox avec entrées
  v2026.5.40 et v2026.5.41 (sha256 NON SIGNÉ pour le moment, à remplacer par
  celui des .xpi signés AMO).
- build.sh : maintient firefox-updates.json automatiquement à chaque build
  (ajoute ou met à jour l'entrée de la version courante avec son sha256
  calculé sur le .xpi produit).
- CLAUDE.md : workflow complet pour Claude Code (build → test → push → wiki →
  signature AMO). Token Gitea jamais dans le fichier (stocké hors repo en
  mémoire Claude .claude/projects/.../memory/gitea_token.md).
- .gitignore : ajout _archives/, .claude/, .env, *.token, secrets.json.
- README.md / CHANGELOG.md : retrait email auteur en clair (renvoi vers
  page wiki Contact, email obfusqué en entités HTML).
2026-04-27 02:55:18 +02:00
Quentin Rouiller 7c0742594c v2026.5.41 — Suppression des hardcodes runtime + UX admin + thème unifié 2026-04-27 03:00:00 +02:00
Quentin Rouiller af85473837 v2026.5.40 — Sélection groupe EV + édition domaines + tri équipe + vue horizontale enrichie 2026-04-27 00:43:00 +02:00
Quentin Rouiller 47a0bca998 refactor: ranger le code source dans src/ + script build.sh 2026-04-27 00:00:00 +02:00
Quentin Rouiller e92b0c4444 v2026.5.39 — Séparation Matin / Après-midi + Apparence (thème, taille du texte, durée du cache, heures de la journée) 2026-04-26 18:10:00 +02:00
Quentin Rouiller 957b754bdc v2026.5.38 — Attribution auteur + nettoyage + observabilité (LOG unifié, handlers globaux d'erreur, toggle logs verbeux dans admin) 2026-04-25 22:55:00 +02:00
Quentin Rouiller aabda3ba7e v2026.5.37 — Refonte vue horizontale (sidebar complète) : topbar supprimée, user-badge + titre + bouton Aujourd'hui + date/heure + stats en sidebar 2026-04-24 13:45:50 +02:00
Quentin Rouiller 6a0324b252 v2026.5.36 — Sidebar verticale en vue horizontale (#horizontal-wrapper [sidebar 200px] + [main]) [code interpolé entre v2026.5.35 et v2026.5.37] 2026-04-24 13:22:08 +02:00
Quentin Rouiller fd466504c2 v2026.5.35 — Fix popup épinglé position vue horizontale + stats gauche 2026-04-24 13:11:16 +02:00
Quentin Rouiller 02524e78b2 v2026.5.34 — Bouton 📌 restauré + badge user cliquable + positionTooltipAnchored unifiée [code interpolé] 2026-04-24 12:56:34 +02:00
Quentin Rouiller 193b3252d4 v2026.5.33 — Vue horizontale : interactions différenciées (hover/clic) [code interpolé] 2026-04-24 12:12:32 +02:00
Quentin Rouiller 3a28e1bd0a v2026.5.26 — Badge user-badge cliquable + auto-détection EV à l'ouverture admin 2026-04-23 16:21:48 +02:00
Quentin Rouiller 10a1aef4c7 v2026.5.25 — Bouton ⚙ Paramètres dans popup user-badge (remplace 5 clics secrets sur le titre) 2026-04-23 16:00:38 +02:00
Quentin Rouiller b77f0a9caa v2026.5.24 — Améliorations diverses 2026-04-23 15:40:00 +02:00
Quentin Rouiller f7f81f7d9d v2026.5.23 — Polish UX 2026-04-23 15:31:44 +02:00
Quentin Rouiller ddb075d563 v2026.5.22 — Stabilité popups 2026-04-23 15:13:04 +02:00
Quentin Rouiller f6dc9eaf7b v2026.5.21 — Polish positionnement popups 2026-04-23 15:03:54 +02:00
Quentin Rouiller 3d5bdbab3d v2026.5.20 — Safe area : popups jamais cachés sous topbar/dock 2026-04-23 14:48:16 +02:00
Quentin Rouiller ad952ebc55 v2026.5.19 — Drag-and-drop des popups épinglés 2026-04-23 14:34:08 +02:00
Quentin Rouiller 1a7393c297 v2026.5.18 — Polish date custom 2026-04-23 14:20:52 +02:00
Quentin Rouiller d589447533 v2026.5.17 — Date custom : label localisé (jour de la semaine en français) 2026-04-23 14:00:10 +02:00
Quentin Rouiller ea5a42c5e1 v2026.5.16 — Passage au schéma de versionning ANNÉE.MAJEURE.PATCH + faux input date custom (Mardi 24.04.2026) 2026-04-23 13:03:58 +02:00
Quentin Rouiller 763e63d9c6 v5.0.15 — Absences partielles affichées comme rows (gris foncé) 2026-04-21 16:24:24 +02:00
Quentin Rouiller bea236ca88 v5.0.14 — Affichage timeline pour absences partielles seules 2026-04-21 16:13:04 +02:00
Quentin Rouiller d6ab8d59e0 v5.0.13 — Cache + retry 2026-04-21 16:04:00 +02:00
Quentin Rouiller 909ddb8301 v5.0.12 — Stabilité 2026-04-21 15:49:08 +02:00
16 changed files with 19632 additions and 9608 deletions
+51
View File
@@ -0,0 +1,51 @@
# 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)
dist/
*.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/
# Archives historiques locales (jamais sur Gitea)
_archives/
Old.zip
Old/
# Variables d'environnement / secrets
.env
.env.*
*.token
secrets.json
+523
View File
@@ -0,0 +1,523 @@
# 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)
+21
View File
@@ -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.
+182 -85
View File
@@ -1,110 +1,207 @@
# Planning techniciens — Vue claire (v4.1.2) # Planification — Extension EasyVista Canton de Vaud
Extension Chrome/Brave/Edge pour afficher le planning techniciens EasyVista Extension Chrome / Firefox pour visualiser de manière claire et rapide le planning EasyVista de l'équipe technicienne DGNSI (Canton de Vaud).
(`itsma.etat-de-vaud.ch` / `itsma.vd.ch`) dans une vue plus lisible.
## Nouveautés v4.1.2 > 📖 **Documentation utilisateur complète** : [wiki](https://gitea.netaplaid.ch/FroSteel/Planification/wiki) ([Home](https://gitea.netaplaid.ch/FroSteel/Planification/wiki/Home) · [Utilisation](https://gitea.netaplaid.ch/FroSteel/Planification/wiki/Utilisation) · [Versions](https://gitea.netaplaid.ch/FroSteel/Planification/wiki/Versions) · [Architecture](https://gitea.netaplaid.ch/FroSteel/Planification/wiki/Architecture) · [Dépannage](https://gitea.netaplaid.ch/FroSteel/Planification/wiki/D%C3%A9pannage) · [Contact](https://gitea.netaplaid.ch/FroSteel/Planification/wiki/Contact))
- **Vraies infos contact/lieu dans les cartes** : les attributs attr1/attr2 du ## Aperçu rapide
XML contiennent les infos saisies à la *planification*, qui ne sont pas
toujours à jour (le tech a pu corriger le contact/lieu avant intervention).
Désormais, pour chaque intervention, on fetch AUSSI le xhr2 en arrière-plan
(en plus de la fiche), ce qui apporte les **vraies** infos validées. La
carte se met à jour automatiquement quand elles arrivent.
- **Clic ouverture restauré** : retour à la logique v4 (fetch fiche à la volée
+ extraction checksum + construction URL avec sender adéquat). Le checksum
est pré-rempli pendant le fetch arrière-plan, donc au clic l'ouverture est
instantanée dans la plupart des cas.
## Nouveautés v4.1 - **Auteur** : Quentin Rouiller (QRO), Technicien DGNSI — Canton de Vaud
- **Public cible** : coordinateurs DGNSI qui pilotent dans EasyVista (`itsma.etat-de-vaud.ch` / `itsma.vd.ch`) le planning de l'équipe technicienne
- **Démarrage projet** : jeudi 16 avril 2026
- **Version actuelle** : [`v2026.5.43`](https://gitea.netaplaid.ch/FroSteel/Planification/releases/tag/v2026.5.43) (latest)
- **Contact** : voir [page wiki Contact](https://gitea.netaplaid.ch/FroSteel/Planification/wiki/Contact) ou [ouvrir une issue](https://gitea.netaplaid.ch/FroSteel/Planification/issues/new)
- **Manifest** : V3 (Chrome/Edge/Firefox 140+)
- **Format** : `.zip` (Chromium) + `.xpi` signé Mozilla (Firefox)
- **Distribution** : auto-update natif Firefox via `firefox-updates.json`
- **Fetch des fiches séquentiel (1 par 1)** au lieu de 5 workers en parallèle. ## Installation rapide
Le serveur EasyVista sérialise les requêtes de toute façon, donc le parallélisme
n'apporte rien. Et surtout : quand tu changes de date pendant le fetch, l'abort
est **instantané** car il n'y a qu'une seule requête en vol au maximum.
- **Cache incrémental** : le cache est sauvé toutes les 5 fiches pendant le fetch,
pas juste à la fin. Si tu changes de date avant que tout soit fini, les statuts
déjà récupérés sont conservés.
## Nouveautés v4 ### Firefox 🦊 (recommandé — auto-update)
**Chargement ~50× plus rapide.** Le nombre de requêtes au serveur EasyVista passe 1. Télécharger le `.xpi` signé depuis la **[release courante](https://gitea.netaplaid.ch/FroSteel/Planification/releases/latest)**.
de ~100 par chargement à **1 seule requête** pour l'affichage principal. 2. Drag-and-drop dans `about:addons` de Firefox.
3. Cliquer "Ajouter".
Concrètement, en v3 un chargement initial faisait : À partir de là, l'extension se met à jour **automatiquement** à chaque nouvelle version (vérification toutes les ~24 h via `firefox-updates.json`).
- 1 fetch XML planning (`calendar_block`)
- ~40 fetches `planning_xhr_2.php` pour les lieux/contacts
- ~40 fetches de fiches HTML pour les catégories/refs/statuts
- jusqu'à ~40 fetches de l'API timeline
Total : ~120 requêtes, 10+ Mo, 8 à 15 secondes selon la charge serveur. ### Chrome / Edge / Brave 🌐 (manuel)
En v4, on a découvert que le XML initial `calendar_block` contient **déjà** 1. Télécharger le `.zip` depuis la **[release courante](https://gitea.netaplaid.ch/FroSteel/Planification/releases/latest)**.
dans ses attributs `attr1`/`attr2`/`attr3` le contact, le lieu et la catégorie 2. Décompresser dans un dossier permanent.
complète de chaque intervention, et la ref dans le textContent du nœud. 3. `chrome://extensions/` (ou `edge://extensions/`) → activer **Mode développeur** → "Charger l'extension non empaquetée" → sélectionner le dossier décompressé.
Toutes ces infos qu'on allait chercher ailleurs étaient en fait dans la toute
première réponse, ignorées par le code.
Résultat : le premier rendu complet arrive en **moins d'une seconde**. Les Les mises à jour sont **manuelles** : à chaque nouvelle release, retélécharger le `.zip`, écraser le dossier, puis cliquer ⟳ (Recharger) sur la carte de l'extension.
fiches individuelles ne sont plus fetchées qu'en arrière-plan, uniquement
pour le statut "Clôturé/Résolu" et le commentaire technicien.
**Lazy-load au survol.** Le texte détaillé d'une intervention (Problème, À faire, ➡ Pour le détail complet (stockage, désinstallation, comparatif), voir [wiki Utilisation → Installation et navigateurs](https://gitea.netaplaid.ch/FroSteel/Planification/wiki/Utilisation#installation-et-navigateurs).
Matériel, TFS ancien/nouveau poste...) n'est chargé qu'au premier survol de la
ligne, seulement pour l'intervention survolée. Imperceptible pour l'utilisateur,
énorme pour le serveur.
**Concurrence réduite.** Le pic de requêtes parallèles passe de 15 à 5 workers, ## Fonctionnalités principales
pour ménager le serveur EasyVista qui a tendance à saturer sous les rafales.
Toute l'interface utilisateur est **strictement identique** à la v3 — on n'a ### Vue planning
changé que ce qu'il y a sous le capot. - Affichage des interventions et réservations groupées par technicien
- Horaires, contact, lieu, catégorie, statut visibles d'un coup d'œil
- Équipe configurable depuis le panel admin (détection automatique via EasyVista)
- Cache local pour réduire les requêtes serveur
## Hérité des versions précédentes ### 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`)
- Navigation par date : ◀ ▶ et sélecteur ### Tooltips et popups
- Détection automatique des interventions closes (✓ vert, fond vert) - Tooltips au survol (hover) sur chaque intervention
- Cache persistant 7 jours - Popups épinglables (📌) pour garder ouvert (depuis v4.1.3)
- Ghosts : les interventions disparues d'EasyVista restent visibles dans la vue - Popups timeline persistantes au clic (depuis v4.2.3)
- Refresh auto 12h et 15h - Drag-and-drop des popups épinglés (depuis v2026.5.19)
- Annulation coopérative (bouton "Arrêter") - Safe area : popups jamais cachés sous topbar/dock (depuis v2026.5.20)
- Thème clair/sombre - Position auto adaptative (4 candidats : droite/gauche/dessous/dessus)
## Installation ### 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
- Absences récurrentes (configurées par tech) : cyan (depuis v2026.5.30)
1. Décompresser le zip ### User et session
2. Ouvrir Chrome, `chrome://extensions/` - Badge user avec photo/initiales en topbar
3. Activer **Mode développeur** (en haut à droite) - Badge cliquable (depuis v2026.5.26) : popup avec ⚙ Paramètres + ⊞ Vue + compteur session MM:SS
4. **Charger l'extension non empaquetée** → sélectionner le dossier `planning-extension-v4` - Retry automatique en cas d'échec fetch user (60s, max 10 essais)
- Compteur de session EasyVista (tick 1s, depuis v5.0.0)
- Reconnexion automatique
Si tu avais déjà la v3 installée, tu peux la supprimer avant — les caches des ### Admin et configuration
deux versions sont compatibles (même format). - 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 `<select id="plan_group_id">` de la page Planning EV, robuste aux ajouts/renommages côté EV
- Édition manuelle des domaines EasyVista interne / externe (depuis v2026.5.40)
- Tri des techniciens : actifs d'abord, puis exclus, alphabétique dans chaque groupe (depuis v2026.5.40)
## Utilisation ## Versionning — historique et conventions
1. Se connecter à EasyVista dans un onglet (`itsma.etat-de-vaud.ch` ou `itsma.vd.ch`) L'extension a connu **3 systèmes de versionning successifs** :
2. Cliquer sur l'icône de l'extension (depuis n'importe quel onglet)
3. La vue claire s'ouvre dans un nouvel onglet
## Comment ça marche techniquement | 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.MAJEURE.PATCH`** | `2026.5.16``2026.5.40` |
- `background.js` fait les fetches en arrière-plan (via le cookie de session EasyVista). ### Format actuel : `ANNÉE.MAJEURE.PATCH`
- L'extension détecte automatiquement le `PHPSESSID` depuis un onglet EasyVista ouvert.
- **v4 : le XML `planning_xhr.php?div=calendar_block` suffit à afficher tout
l'essentiel.** Les champs `attr1`/`attr2`/`attr3` contiennent contact, lieu
et catégorie. Le `textContent` du nœud contient la ref (S260.../I260...).
- Les fiches individuelles (`index.php?formEvent=...`) ne sont fetchées que pour
obtenir le statut Clôturé/Résolu et le commentaire technicien.
- Le texte d'action détaillé (Problème/À faire/Matériel/...) est récupéré en
lazy-load via `planning_xhr_2.php?id=ACTIONID` au premier survol.
- Le cache est stocké dans `chrome.storage.local` (local à ta machine).
- Aucune donnée n'est envoyée ailleurs que vers `itsma.etat-de-vaud.ch` et `itsma.vd.ch`.
## Limitations connues À partir de la **v2026.5.16** (21 avril 2026), l'extension utilise le schéma suivant :
- Nécessite un onglet EasyVista ouvert (même en arrière-plan) pour fonctionner | Position | Sens | Quand ça change |
- Fonctionne uniquement sur l'intranet cantonal (les fetches échoueront en externe) |---|---|---|
- Les 8 IDs des techs sont en dur dans le code (si quelqu'un quitte/arrive dans | `2026` | **Année** | À chaque nouvelle année calendaire |
l'équipe, il faut mettre à jour `viewer.js` ligne ~22) | `5` | **Majeure** | À chaque **gros changement / ajout important** (refonte, nouvelle feature majeure, bump volontaire) |
- Le statut "Clôturé/Résolu" met quelques secondes à apparaître après le | `40` | **Patch** | À **chaque livraison** dans la majeure courante (corrections, ajustements, petites features) |
chargement initial (fetch des fiches en arrière-plan, concurrence 5)
Exemples :
- `2026.5.16``2026.5.17` : petite correction ou ajustement (patch)
- `2026.5.40``2026.6.0` : refonte majeure (par exemple nouvelle vue, nouvelle architecture)
- `2026.x.y``2027.0.0` : passage à la nouvelle année
Le numéro de **majeure** n'est **pas** un mois et **pas** un chiffre lié au calendrier — c'est un compteur de versions importantes propre au projet (la `5` actuelle continue le `5.x` qui précédait, repris tel quel lors du passage au format annuel).
⚠️ **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.43` (latest, 27 avril 2026) — Fix Firefox : menu dock + stabilité popup pin/unpin
- Firefox : le menu hover sur les pastilles du dock (popup réduit) se
positionne désormais correctement au-dessus de la pastille.
- Pin/unpin : la popup épinglée ne bouge plus et garde la même taille
quand on la dé-épingle / re-épingle.
### `v2026.5.42` — Nettoyage de commentaires + exemples génériques
- Uniformisation des exemples utilisés dans les commentaires de `viewer.js`
(parsing contacts/lieux/références/codes-barres) en placeholders abstraits.
Comportement runtime strictement inchangé.
### `v2026.5.41` — 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.
- **Absences récurrentes génériques** : suppression de la fonction hardcodée `isXXXAbsentFriday()`. 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 `<select id="plan_group_id">` de la page Planning EV. Robuste aux ajouts/renommages côté EV.
- ID groupe affiché en italique (ex: `ID groupe : 191`).
- 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 de chaque tech
- Section **Apparence** dans les paramètres : thème, taille du texte, durée du cache, heures de la journée
➡ Pour l'historique complet (40+ versions depuis le 16 avril 2026), voir le **[CHANGELOG.md](CHANGELOG.md)** ou la **[page wiki Versions](https://gitea.netaplaid.ch/FroSteel/Planification/wiki/Versions)**.
## Architecture technique
```
Planification/ # Layout du repo Gitea (public)
├── src/ # Sources de l'extension (chargées par le navigateur)
│ ├── manifest.json # Manifest V3 (Chrome) + browser_specific_settings (Firefox)
│ ├── background.js # Service worker (~1 600 lignes)
│ ├── viewer.html # Interface principale
│ ├── viewer.js # Logique UI (~10 700 lignes)
│ ├── viewer.css # Styles + thèmes clair/sombre (~4 800 lignes)
│ └── icons/ # icon16, icon48, icon128
├── build.sh # Génère dist/chromium/, dist/firefox/, .zip, .xpi, met à jour firefox-updates.json
├── firefox-updates.json # Manifest auto-update Firefox (servi via update_url)
├── README.md
├── CHANGELOG.md
├── LICENSE # MIT
└── .gitignore
```
➡ Pour le détail des composants, fonctions clés et flux de données, voir la **[page wiki Architecture](https://gitea.netaplaid.ch/FroSteel/Planification/wiki/Architecture)**.
## Développement
```bash
git clone https://gitea.netaplaid.ch/FroSteel/Planification.git
cd Planification
# Modifier les sources dans src/
# Bumper src/manifest.json + entrée CHANGELOG.md
./build.sh
# → dist/chromium/, dist/firefox/, dist/*.zip, dist/*.xpi
# → firefox-updates.json mis à jour (sha256 .xpi NON SIGNÉ)
git add -A
git commit -m "vYYYY.M.PATCH — description"
git tag vYYYY.M.PATCH
git push origin main vYYYY.M.PATCH
```
Pour Firefox : signer le `.xpi` sur AMO en mode "On your own" (Unlisted),
remplacer l'asset `.xpi` de la release Gitea, puis mettre à jour le sha256
de cette version dans `firefox-updates.json`.
## Licence
[MIT License](LICENSE) — Copyright (c) 2026 Quentin Rouiller
## Auteur
**Quentin Rouiller** (QRO)
Technicien DGNSI — Canton de Vaud
Contact : voir [page wiki Contact](https://gitea.netaplaid.ch/FroSteel/Planification/wiki/Contact)
Executable
+98
View File
@@ -0,0 +1,98 @@
#!/usr/bin/env bash
###############################################################################
# build.sh — génère dist/chromium/, dist/firefox/, et les archives .zip / .xpi
# à partir du code source dans src/.
#
# Usage : ./build.sh
###############################################################################
set -e
# Le script est dans Autres/ — on remonte d'un cran pour se placer à la
# racine du projet, où se trouvent src/ et dist/.
cd "$(dirname "$0")"
VERSION=$(python3 -c "import json; print(json.load(open('src/manifest.json'))['version'])")
echo "==> Build Planification v$VERSION"
rm -rf dist
mkdir -p dist/chromium dist/firefox
# ---- Chromium : copie src/ tel quel (manifest sans gecko_settings) ----
cp -r src/* dist/chromium/
echo " ✓ dist/chromium/ ($(du -sh dist/chromium | cut -f1))"
# ---- Firefox : copie src/ + manifest avec browser_specific_settings ----
cp -r src/* dist/firefox/
python3 - <<EOF
import json
with open('src/manifest.json', 'r') as f: m = json.load(f)
m['browser_specific_settings'] = {
'gecko': {
'id': 'planification-dgnsi@netaplaid.ch',
'strict_min_version': '140.0',
'update_url': 'https://gitea.netaplaid.ch/FroSteel/Planification/raw/branch/main/firefox-updates.json',
'data_collection_permissions': {'required': ['none']}
}
}
# Firefox MV3 ne supporte pas (encore) 'service_worker' → AMO rejette.
# On ajoute 'scripts' (event page) comme fallback compatible Firefox.
# Chrome ignore 'scripts' quand 'service_worker' est présent ; Firefox
# ignore 'service_worker' et utilise 'scripts'. Les deux navigateurs
# chargent ainsi le même background.js.
bg = m.get('background', {})
if 'scripts' not in bg:
bg['scripts'] = ['background.js']
m['background'] = bg
with open('dist/firefox/manifest.json', 'w') as f:
json.dump(m, f, indent=2, ensure_ascii=False)
f.write('\n')
EOF
echo " ✓ dist/firefox/ ($(du -sh dist/firefox | cut -f1))"
# ---- Archives ZIP / XPI prêtes à distribuer ----
cd dist/chromium && zip -rq "../planification-v${VERSION}-chromium.zip" . && cd ../..
cd dist/firefox && zip -rq "../planification-v${VERSION}-firefox.xpi" . && cd ../..
echo ""
echo "==> Builds prêts dans dist/"
ls -la dist/*.zip dist/*.xpi 2>/dev/null
# ---- firefox-updates.json : ajout/mise à jour de l'entrée pour cette version
# (sha256 du .xpi NON SIGNÉ — sera remplacé par celui du .xpi signé après AMO).
python3 - <<EOF
import json, hashlib, os
xpi = f"dist/planification-v${VERSION}-firefox.xpi"
with open(xpi, 'rb') as f: sha = hashlib.sha256(f.read()).hexdigest()
JSON_PATH = "firefox-updates.json"
ADDON_ID = "planification-dgnsi@netaplaid.ch"
update_link = f"https://gitea.netaplaid.ch/FroSteel/Planification/releases/download/v${VERSION}/planification-v${VERSION}-firefox.xpi"
if os.path.exists(JSON_PATH):
with open(JSON_PATH) as f: data = json.load(f)
else:
data = {"addons": {ADDON_ID: {"updates": []}}}
addon = data.setdefault("addons", {}).setdefault(ADDON_ID, {"updates": []})
updates = addon.setdefault("updates", [])
# Retirer toute entrée existante pour cette version (idempotent)
updates = [u for u in updates if u.get("version") != "${VERSION}"]
# Ajouter en tête
updates.insert(0, {
"version": "${VERSION}",
"update_link": update_link,
"update_hash": "sha256:" + sha,
})
addon["updates"] = updates
with open(JSON_PATH, 'w') as f:
json.dump(data, f, indent=2, ensure_ascii=False)
f.write('\n')
print(f" ✓ firefox-updates.json mis à jour (sha256 NON SIGNÉ : {sha[:16]}…)")
EOF
echo ""
echo "Pour Chrome : charger dist/chromium/ en mode développeur"
echo "Pour Firefox : signer dist/planification-v${VERSION}-firefox.xpi sur AMO"
echo " Après signature, remplacer le sha256 dans firefox-updates.json par celui du .xpi signé."
+33
View File
@@ -0,0 +1,33 @@
{
"addons": {
"planification-dgnsi@netaplaid.ch": {
"updates": [
{
"version": "2026.5.44",
"update_link": "https://gitea.netaplaid.ch/FroSteel/Planification/releases/download/v2026.5.44/planification-v2026.5.44-firefox.xpi",
"update_hash": "sha256:e56e87d59c465e5df828b18d74376f561bf34e81e21bf4d70989a709e89217e0"
},
{
"version": "2026.5.43",
"update_link": "https://gitea.netaplaid.ch/FroSteel/Planification/releases/download/v2026.5.43/planification-v2026.5.43-firefox.xpi",
"update_hash": "sha256:7052200fab3c9266d5b809398a00dac768679ab2e96e4e147e4bb86c4ab648e5"
},
{
"version": "2026.5.42",
"update_link": "https://gitea.netaplaid.ch/FroSteel/Planification/releases/download/v2026.5.42/planification-v2026.5.42-firefox.xpi",
"update_hash": "sha256:a5291a1eab6768d430dfc1cf032f93aeb788083da620ae0568b9dee68f14734d"
},
{
"version": "2026.5.41",
"update_link": "https://gitea.netaplaid.ch/FroSteel/Planification/releases/download/v2026.5.41/planification-v2026.5.41-firefox.xpi",
"update_hash": "sha256:fbf7d8a57ad060306cb43f3db3a5d5b599bb07c75c4ef0dbd0346406bdb6c65b"
},
{
"version": "2026.5.40",
"update_link": "https://gitea.netaplaid.ch/FroSteel/Planification/releases/download/v2026.5.40/planification-v2026.5.40-firefox.xpi",
"update_hash": "sha256:2ba0758960b931f4211c613c75bbf21b3a250572dddc70d854ff1ecca3220421"
}
]
}
}
}
File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 444 B

After

Width:  |  Height:  |  Size: 444 B

Before

Width:  |  Height:  |  Size: 118 B

After

Width:  |  Height:  |  Size: 118 B

Before

Width:  |  Height:  |  Size: 207 B

After

Width:  |  Height:  |  Size: 207 B

+17 -4
View File
@@ -1,13 +1,22 @@
{ {
"manifest_version": 3, "manifest_version": 3,
"name": "Planification", "name": "Planification",
"version": "5.0.11", "version": "2026.5.44",
"description": "Vue claire et rapide du planning des techniciens EasyVista. Regroupe interventions et réservations par tech, affiche horaires, contact, lieu, catégorie et statut en un coup d'œil.", "description": "Vue claire et rapide du planning des techniciens EasyVista. Développé par Quentin Rouiller — DGNSI, Canton de Vaud.",
"permissions": ["activeTab", "scripting", "storage", "tabs", "alarms"], "permissions": [
"activeTab",
"scripting",
"storage",
"tabs",
"alarms"
],
"host_permissions": [ "host_permissions": [
"https://itsma.etat-de-vaud.ch/*", "https://itsma.etat-de-vaud.ch/*",
"https://itsma.vd.ch/*" "https://itsma.vd.ch/*"
], ],
"optional_host_permissions": [
"https://*/*"
],
"action": { "action": {
"default_title": "Ouvrir la Planification" "default_title": "Ouvrir la Planification"
}, },
@@ -21,7 +30,11 @@
}, },
"web_accessible_resources": [ "web_accessible_resources": [
{ {
"resources": ["viewer.html", "viewer.js", "viewer.css"], "resources": [
"viewer.html",
"viewer.js",
"viewer.css"
],
"matches": [ "matches": [
"https://itsma.etat-de-vaud.ch/*", "https://itsma.etat-de-vaud.ch/*",
"https://itsma.vd.ch/*" "https://itsma.vd.ch/*"
+5349
View File
File diff suppressed because it is too large Load Diff
+36 -10
View File
@@ -1,4 +1,13 @@
<!doctype html> <!doctype html>
<!--
Planification — Extension navigateur EasyVista (Canton de Vaud / DGNSI)
Copyright (c) 2026 Quentin Rouiller
Licensed under the MIT License — see LICENSE file in the project root.
@author Quentin Rouiller
@repository https://gitea.netaplaid.ch/FroSteel/Planification
-->
<html lang="fr"> <html lang="fr">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
@@ -9,22 +18,39 @@
<header class="topbar"> <header class="topbar">
<div class="topbar-left"> <div class="topbar-left">
<!-- v4.2.3 : pastille avec initiales de l'utilisateur connecté, avant <!-- v4.2.3 : pastille avec initiales de l'utilisateur connecté, avant
le titre. Clic → popup fixe avec nom complet juste en dessous. --> le titre. Clic → popup fixe avec nom complet juste en dessous.
<button id="user-badge" class="user-badge hidden" v2026.5.34 : TOUJOURS visible d'office avec "?" (état user inconnu)
pour garantir l'accès au menu (⊞ Vue / ⚙ Paramètres) même si
la détection user échoue ou est en retard.
Le script JS mettra à jour le textContent + classes quand le
fetch aboutit. En cas d'échec persistant, reste sur "?". -->
<button id="user-badge" class="user-badge user-badge-unknown"
type="button" aria-label="Utilisateur connecté" type="button" aria-label="Utilisateur connecté"
title="Utilisateur connecté"></button> title="Utilisateur — cliquer pour accéder aux paramètres">?</button>
<h1 id="app-title">Planification</h1> <h1 id="app-title">Planification</h1>
<div class="date-nav"> <!-- R13u : bloc "Aujourd'hui + horloge" encadré, suivi DIRECTEMENT
<button id="nav-prev" class="btn btn-nav" title="Jour précédent" aria-label="Jour précédent"></button> du statut d'actualisation (MAJ + ✓), puis le sélecteur de date
<input type="date" id="date-picker" class="date-input"> du planning. -->
<button id="nav-next" class="btn btn-nav" title="Jour suivant" aria-label="Jour suivant"></button> <div id="today-block" class="today-block">
<button id="nav-today" class="btn btn-today" title="Aujourd'hui">Auj.</button> <button id="nav-today" class="btn btn-today" title="Revenir au jour courant">Aujourd'hui</button>
<div id="app-clock" class="app-clock" title="Date et heure actuelles">
<div id="app-clock-date" class="app-clock-date"></div>
<div id="app-clock-time" class="app-clock-time"></div>
</div>
</div> </div>
<span id="capture-info" class="capture-info"></span> <span id="capture-info" class="capture-info"></span>
<span id="refresh-check" class="refresh-check hidden" title="Mise à jour terminée"></span> <span id="refresh-check" class="refresh-check hidden" title="Mise à jour terminée"></span>
<div class="date-nav">
<button id="nav-prev" class="btn btn-nav" title="Jour précédent" aria-label="Jour précédent"></button>
<div class="date-custom-wrapper">
<div id="date-custom" class="date-custom" role="button" tabindex="0" title="Choisir une date du planning">
<span id="date-custom-label"></span>
</div>
<input type="date" id="date-picker" class="date-input-hidden">
</div>
<button id="nav-next" class="btn btn-nav" title="Jour suivant" aria-label="Jour suivant"></button>
</div>
</div> </div>
<!-- v5.0.0 : horloge au milieu, format HH:MM, mise à jour toutes les min -->
<div id="app-clock" class="app-clock" title="Heure actuelle"></div>
<!-- v5.0.9 : compteur de session EasyVista (visible < 5 min restantes) --> <!-- v5.0.9 : compteur de session EasyVista (visible < 5 min restantes) -->
<div id="app-session" class="app-session hidden"></div> <div id="app-session" class="app-session hidden"></div>
<div class="topbar-right"> <div class="topbar-right">
+12704
View File
File diff suppressed because it is too large Load Diff
-2392
View File
File diff suppressed because it is too large Load Diff
-6990
View File
File diff suppressed because it is too large Load Diff