forked from FroSteel/Planification
v2026.5.38 — Attribution auteur + nettoyage + observabilité (LOG unifié, handlers globaux d'erreur, toggle logs verbeux dans admin)
This commit is contained in:
@@ -1,110 +1,192 @@
|
||||
# Planning techniciens — Vue claire (v4.1.2)
|
||||
# Planification — Extension EasyVista Canton de Vaud
|
||||
|
||||
Extension Chrome/Brave/Edge pour afficher le planning techniciens EasyVista
|
||||
(`itsma.etat-de-vaud.ch` / `itsma.vd.ch`) dans une vue plus lisible.
|
||||
Extension Chrome / Firefox pour visualiser de manière claire et rapide le planning des techniciens DGNSI (Canton de Vaud) dans EasyVista.
|
||||
|
||||
## Nouveautés v4.1.2
|
||||
## Aperçu rapide
|
||||
|
||||
- **Vraies infos contact/lieu dans les cartes** : les attributs attr1/attr2 du
|
||||
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.
|
||||
- **Auteur** : Quentin Rouiller (QRO)
|
||||
- **Cible** : techniciens DGNSI (Canton de Vaud), EasyVista (`itsma.etat-de-vaud.ch` / `itsma.vd.ch`)
|
||||
- **Démarrage projet** : jeudi 16 avril 2026
|
||||
- **Version actuelle** : `v2026.5.37`
|
||||
- **Manifest** : V3 (Chrome/Edge/Firefox)
|
||||
- **Format** : `.zip` (Chromium) + `.xpi` signé (Firefox)
|
||||
|
||||
## Nouveautés v4.1
|
||||
## Fonctionnalités principales
|
||||
|
||||
- **Fetch des fiches séquentiel (1 par 1)** au lieu de 5 workers en parallèle.
|
||||
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.
|
||||
### Vue planning
|
||||
- Affichage des interventions et réservations groupées par technicien
|
||||
- Horaires, contact, lieu, catégorie, statut visibles d'un coup d'œil
|
||||
- 8 techniciens hardcodés (équipe IT canton)
|
||||
- Cache local pour réduire les requêtes serveur
|
||||
|
||||
## Nouveautés v4
|
||||
### Modes d'affichage
|
||||
- **Vue classique** (depuis v1.0.0) : cards en grille, mode compact écran 24" (depuis v2026.5.30)
|
||||
- **Vue horizontale** (depuis v2026.5.32) : timeline par tech, sidebar verticale (depuis v2026.5.36)
|
||||
- Toggle Vue classique ↔ Vue horizontale via bouton ⊞ dans popup user-badge
|
||||
- Persistance localStorage (`view_mode`)
|
||||
|
||||
**Chargement ~50× plus rapide.** Le nombre de requêtes au serveur EasyVista passe
|
||||
de ~100 par chargement à **1 seule requête** pour l'affichage principal.
|
||||
### Tooltips et popups
|
||||
- Tooltips au survol (hover) sur chaque intervention
|
||||
- Popups épinglables (📌) pour garder ouvert (depuis v4.1.3)
|
||||
- Popups timeline persistantes au clic (depuis v4.2.3)
|
||||
- Drag-and-drop des popups épinglés (depuis v2026.5.19)
|
||||
- Safe area : popups jamais cachés sous topbar/dock (depuis v2026.5.20)
|
||||
- Position auto adaptative (4 candidats : droite/gauche/dessous/dessus)
|
||||
|
||||
Concrètement, en v3 un chargement initial faisait :
|
||||
- 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
|
||||
### Classification des absences (depuis v2026.5.27)
|
||||
- **Maladie/Accident** : indigo `#4338ca`
|
||||
- **Congé / Congés** : cyan `#06b6d4` (suffixe `s` adaptatif)
|
||||
- **Pompier** : rouge `#b03030`
|
||||
- Badge + barre gauche colorée + dégradé fond
|
||||
- Absence récurrente Pillonel vendredi : cyan (depuis v2026.5.30)
|
||||
|
||||
Total : ~120 requêtes, 10+ Mo, 8 à 15 secondes selon la charge serveur.
|
||||
### User et session
|
||||
- Badge user avec photo/initiales en topbar
|
||||
- Badge cliquable (depuis v2026.5.26) : popup avec ⚙ Paramètres + ⊞ Vue + compteur session MM:SS
|
||||
- Retry automatique en cas d'échec fetch user (60s, max 10 essais)
|
||||
- Compteur de session EasyVista (tick 1s, depuis v5.0.0)
|
||||
- Reconnexion automatique
|
||||
|
||||
En v4, on a découvert que le XML initial `calendar_block` contient **déjà**
|
||||
dans ses attributs `attr1`/`attr2`/`attr3` le contact, le lieu et la catégorie
|
||||
complète de chaque intervention, et la ref dans le textContent du nœud.
|
||||
Toutes ces infos qu'on allait chercher ailleurs étaient en fait dans la toute
|
||||
première réponse, ignorées par le code.
|
||||
### Admin et configuration
|
||||
- Mode admin caché : bouton ⚙ Paramètres dans popup user-badge (depuis v2026.5.25, remplace les 5 clics secrets sur le titre)
|
||||
- Configuration persistée dans `localStorage` (`admin_config`)
|
||||
- Catégories interventions personnalisables (livraison/recup/remplacement/incident/rollout/reservation/autre)
|
||||
|
||||
Résultat : le premier rendu complet arrive en **moins d'une seconde**. Les
|
||||
fiches individuelles ne sont plus fetchées qu'en arrière-plan, uniquement
|
||||
pour le statut "Clôturé/Résolu" et le commentaire technicien.
|
||||
## Versionning — historique et conventions
|
||||
|
||||
**Lazy-load au survol.** Le texte détaillé d'une intervention (Problème, À faire,
|
||||
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.
|
||||
L'extension a connu **3 systèmes de versionning successifs** :
|
||||
|
||||
**Concurrence réduite.** Le pic de requêtes parallèles passe de 15 à 5 workers,
|
||||
pour ménager le serveur EasyVista qui a tendance à saturer sous les rafales.
|
||||
| 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.37` |
|
||||
|
||||
Toute l'interface utilisateur est **strictement identique** à la v3 — on n'a
|
||||
changé que ce qu'il y a sous le capot.
|
||||
### Format actuel : `ANNÉE.MAJEURE.PATCH`
|
||||
|
||||
## Hérité des versions précédentes
|
||||
À partir de la **v2026.5.16** (21 avril 2026), l'extension utilise le schéma suivant :
|
||||
|
||||
- Navigation par date : ◀ ▶ et sélecteur
|
||||
- Détection automatique des interventions closes (✓ vert, fond vert)
|
||||
- Cache persistant 7 jours
|
||||
- Ghosts : les interventions disparues d'EasyVista restent visibles dans la vue
|
||||
- Refresh auto 12h et 15h
|
||||
- Annulation coopérative (bouton "Arrêter")
|
||||
- Thème clair/sombre
|
||||
| Position | Sens | Quand ça change |
|
||||
|---|---|---|
|
||||
| `2026` | **Année** | À chaque nouvelle année calendaire |
|
||||
| `5` | **Majeure** | À chaque **gros changement / ajout important** (refonte, nouvelle feature majeure, bump volontaire) |
|
||||
| `37` | **Patch** | À **chaque livraison** dans la majeure courante (corrections, ajustements, petites features) |
|
||||
|
||||
Exemples :
|
||||
- `2026.5.16` → `2026.5.17` : petite correction ou ajustement (patch)
|
||||
- `2026.5.37` → `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.37` (latest, 25 avril 2026) — Refonte vue horizontale
|
||||
- Topbar supprimée en vue horizontale, tout passe en sidebar
|
||||
- User-badge + titre + bouton "Aujourd'hui" + date/heure + sélecteur + flèches + stats dans sidebar
|
||||
- Banderole pompier masquée (badge + barre rouge gauche conservés)
|
||||
|
||||
### `v2026.5.36` — Sidebar verticale
|
||||
- Wrapper flex-row `#horizontal-wrapper` [sidebar 200px] + [main]
|
||||
- Déplacement physique des éléments via `ELEMENTS_TO_RELOCATE`
|
||||
- Restauration propre en vue classique
|
||||
|
||||
### `v2026.5.32` — Vue horizontale togglable
|
||||
- Bouton ⊞ "Vue" dans popup user-badge
|
||||
- Chaque tech = 1 ligne horizontale compacte
|
||||
- localStorage `view_mode`
|
||||
|
||||
### `v2026.5.27` — Classification absences
|
||||
- ABSENCE_LABELS : `^(cong[ée]s|maladie|pompier)$`
|
||||
- Couleurs catégories
|
||||
- Topbar une ligne : "Jeudi 23.04.26 • 21:55"
|
||||
|
||||
### `v4.2.3` — Grande popup timeline persistante
|
||||
- Clic segment timeline = popup persistante
|
||||
- Hover = popup qui suit la souris
|
||||
|
||||
### `v4.1.3` — Tooltips épinglables
|
||||
- Introduction de `pinTooltip`
|
||||
|
||||
### `v1.0.0` (16 avril 2026) — Initiale
|
||||
- Premier viewer EasyVista pour le canton
|
||||
|
||||
Voir [CHANGELOG.md](CHANGELOG.md) pour l'historique complet (40 versions taggées).
|
||||
|
||||
## Architecture technique
|
||||
|
||||
```
|
||||
manifest.json # Manifest V3 (Chrome) + gecko_settings (Firefox)
|
||||
background.js # Worker fond : fetch planning XML, gestion session, fetch fiches
|
||||
viewer.html # Interface principale
|
||||
viewer.js # Logique (~9000 lignes) — voir détail ci-dessous
|
||||
viewer.css # Styles + thèmes clair/sombre
|
||||
icons/ # icon16, icon48, icon128
|
||||
```
|
||||
|
||||
### `viewer.js` — fonctions clés
|
||||
|
||||
| Fonction | Introduite | Rôle |
|
||||
|---|---|---|
|
||||
| `loadForDate` | v1.0.0 | Fetch + parse planning pour une date donnée |
|
||||
| `buildTooltipHTML` | v1.0.0 | Construction HTML du tooltip d'intervention |
|
||||
| `pinTooltip` | v4.1.3 | Épingler un tooltip (le rendre permanent) |
|
||||
| `bindTimelinePopover` | v4.2.3 | Lier popover timeline aux segments |
|
||||
| `showTimelinePopover` | v4.2.3 | Afficher popover persistante |
|
||||
| `openPersistentTimelinePopup` | v4.2.3 | Grande popup détaillée |
|
||||
| `setTooltipViewportPosition` | v4.2.4 | Détection auto fixed/abs |
|
||||
| `_softUnpinPopup` | v4.3.3 | Désépinglage mou (popup reste visible) |
|
||||
| `initAppClock` | v5.0.0 | Horloge HH:MM topbar |
|
||||
| `initSessionTimer` | v5.0.0 | Compteur session EV (tick 1s) |
|
||||
| `initAdminMenu` | v5.0.0 | Menu admin (5 clics titre) |
|
||||
| `_applyViewMode` | v2026.5.32 | Toggle vue classique/horizontale |
|
||||
| `_maybeRetryFetchUser` | v2026.5.34 | Relance opportuniste fetch user |
|
||||
| `positionTooltipAnchored` | v2026.5.34 | Positionnement unifié (4 candidats) |
|
||||
|
||||
### Constantes persistantes (toutes versions)
|
||||
|
||||
- 8 techs hardcodés : `76272,83725,66635,92235,90070,40944,72485,86874`
|
||||
- Pillonel Olivier (ID 40944) : absent tous les vendredis (hardcodé)
|
||||
- Group ID EasyVista : `191`
|
||||
- GUIDs forms EV :
|
||||
- Demande : `S={C99ECD05-3D48-4C62-ABF0-66292053AED6}`
|
||||
- Incident : `I={07ED9C68-6172-48EA-8A58-90912B0A283E}`
|
||||
- SSO : Canton ForgeRock OpenAM
|
||||
- Storage keys : `admin_config`, `view_mode` (depuis v2026.5.32)
|
||||
- Domaines : `itsma.etat-de-vaud.ch` (interne), `itsma.vd.ch` (externe SSO)
|
||||
|
||||
## Installation
|
||||
|
||||
1. Décompresser le zip
|
||||
2. Ouvrir Chrome, `chrome://extensions/`
|
||||
3. Activer **Mode développeur** (en haut à droite)
|
||||
4. **Charger l'extension non empaquetée** → sélectionner le dossier `planning-extension-v4`
|
||||
### Firefox
|
||||
Télécharger le `.xpi` signé depuis le serveur de mises à jour interne, ou drag-and-drop dans `about:addons`.
|
||||
|
||||
Si tu avais déjà la v3 installée, tu peux la supprimer avant — les caches des
|
||||
deux versions sont compatibles (même format).
|
||||
### Chrome / Edge
|
||||
Mode développeur : décompresser le ZIP et charger en tant qu'extension non empaquetée.
|
||||
|
||||
## Utilisation
|
||||
## Développement
|
||||
|
||||
1. Se connecter à EasyVista dans un onglet (`itsma.etat-de-vaud.ch` ou `itsma.vd.ch`)
|
||||
2. Cliquer sur l'icône de l'extension (depuis n'importe quel onglet)
|
||||
3. La vue claire s'ouvre dans un nouvel onglet
|
||||
```bash
|
||||
git clone https://gitea.netaplaid.ch/FroSteel/Planification.git
|
||||
cd Planification
|
||||
|
||||
## Comment ça marche techniquement
|
||||
# Pour packager une nouvelle version :
|
||||
# 1. modifier le code
|
||||
# 2. bump version dans manifest.json
|
||||
# 3. zip + xpi
|
||||
git add -A
|
||||
git commit -m "Version YYYY.M.PATCH — description"
|
||||
git tag vYYYY.M.PATCH
|
||||
git push origin main
|
||||
git push --tags
|
||||
```
|
||||
|
||||
- `background.js` fait les fetches en arrière-plan (via le cookie de session EasyVista).
|
||||
- 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`.
|
||||
## Licence
|
||||
|
||||
## Limitations connues
|
||||
[MIT License](LICENSE) — Copyright (c) 2026 Quentin Rouiller
|
||||
|
||||
- Nécessite un onglet EasyVista ouvert (même en arrière-plan) pour fonctionner
|
||||
- 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
|
||||
l'équipe, il faut mettre à jour `viewer.js` ligne ~22)
|
||||
- Le statut "Clôturé/Résolu" met quelques secondes à apparaître après le
|
||||
chargement initial (fetch des fiches en arrière-plan, concurrence 5)
|
||||
## Auteur
|
||||
|
||||
**Quentin Rouiller** (QRO)
|
||||
Technicien DGNSI — Canton de Vaud
|
||||
|
||||
Reference in New Issue
Block a user