Public Access
Compare commits
7
Commits
v2026.5.47
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3403b567ba | ||
|
|
a37b90aa13 | ||
|
|
a1c7f45b03 | ||
|
|
cd106484d5 | ||
|
|
e846e90bb8 | ||
|
|
519fca42ce | ||
|
|
5f72228f13 |
+146
-66
@@ -1,7 +1,7 @@
|
|||||||
# CHANGELOG — Extension Planification EasyVista Canton de Vaud
|
# CHANGELOG : extension Planification (EasyVista, Canton de Vaud)
|
||||||
|
|
||||||
> Ce changelog documente l'évolution de l'extension Chrome/Firefox "Planification"
|
> Ce changelog documente l'évolution de l'extension Chrome/Firefox "Planification"
|
||||||
> développée par FroSteel pour les coordinateurs DGNSI (Canton de Vaud).
|
> 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.
|
> 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
|
> Pour les versions plus anciennes, l'analyse du code source permet de
|
||||||
@@ -9,13 +9,96 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## v2026.5.47 — Vue « échelle de temps exacte » : aide à la saisie, erreurs mises en évidence, corrections de fiabilité
|
## v2026.5.50 : Texte des actions rétabli (format EasyVista du 29.09.2026), catégories Roll Out et Déménagement
|
||||||
|
|
||||||
> Cette version peaufine la vue horizontale « échelle de temps exacte » : un vrai retour visuel accompagne la pose d'un rendez-vous ou d'une absence, et les erreurs de saisie (rendez-vous dont le début est égal à la fin) sont désormais bien visibles et signalées. Elle corrige aussi plusieurs problèmes de navigation entre dates et de synchronisation du dossier partagé, réorganise le panneau de synchronisation, et ajoute un bouton de test de la communication avec le script du poste.
|
> Correctif urgent : depuis le 29 septembre 2026, le texte complet des actions ne s'affichait plus. EasyVista renvoie désormais les actions avec une cellule de moins, et l'extension les lisait par position. Elle les retrouve maintenant par leur contenu. Cette version ajoute aussi deux catégories de réservation.
|
||||||
|
|
||||||
### Vue « échelle de temps exacte » — aide à la saisie
|
### Texte des actions
|
||||||
|
|
||||||
- **Retour visuel au survol d'un créneau libre** : une zone surlignée suit la souris et affiche **l'heure exacte** (début → fin) du rendez-vous ou de l'absence qu'un clic droit poserait. Une bulle fixe, en haut de la ligne, rappelle la **plage libre et la durée disponible** du créneau (« Libre 12:00–18:00 / 6 h disponible »). Elle se place toujours sur un espace libre — jamais par-dessus un rendez-vous — et ne masque pas l'heure choisie.
|
- **Texte complet des actions rétabli** dans les bulles et les fiches, avec l'ancien comme avec le nouveau format d'EasyVista.
|
||||||
|
- **Plus robuste aux prochains changements** : la description est repérée par le nom de sa colonne, et l'identifiant de l'action par son contenu, plus par leur position.
|
||||||
|
- **Changement de format signalé** : si EasyVista modifie encore la structure au point qu'aucune action ne soit lisible, un avertissement apparaît dans la console (une seule fois, sans aucune donnée personnelle). Les fiches ou historiques qui ne se chargent pas sont aussi signalés dans la console.
|
||||||
|
|
||||||
|
### Réservations
|
||||||
|
|
||||||
|
- **Deux nouvelles catégories : Roll Out et Déménagement.** Elles sont propres à la Planification : dans EasyVista, la réservation reste « Evènements spéciaux ». Elles sont partagées entre tous les postes par le dossier partagé, comme le n°, la ville et la rue.
|
||||||
|
- **Catégorie proposée à la saisie du n°** : le n° d'une intervention Roll Out propose Roll Out.
|
||||||
|
- **Catégorie inconnue conservée** : une catégorie posée par une version plus récente n'est plus effacée quand on modifie la réservation.
|
||||||
|
|
||||||
|
### Déploiement
|
||||||
|
|
||||||
|
- **Mettre à jour tous les postes le même jour.** Un poste resté en 2026.5.49 qui modifie une réservation Roll Out ou Déménagement effacerait cette catégorie sur tous les postes.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## v2026.5.49 : Sécurité hors session, onglet Email clarifié, lecture au défilement, affichage et synchronisation fiabilisés
|
||||||
|
|
||||||
|
> Cette version renforce la **sécurité** quand aucune session EasyVista n'est active, clarifie l'**onglet Email** (déplacement et annulation bien séparés, aperçu de la copie), améliore la **lecture du planning au défilement** (le nom du technicien, son compteur et la frise horaire restent visibles), et corrige l'**affichage de la reconnexion** ainsi que plusieurs comportements de la synchronisation et des réservations.
|
||||||
|
|
||||||
|
### Sécurité et confidentialité (sans session EasyVista)
|
||||||
|
|
||||||
|
- **Aucune écriture dans le dossier partagé sans session active** : tant que vous n'êtes pas identifié dans EasyVista, l'extension travaille sur le **cache local seul** et ne touche plus au dossier partagé. Un ancien cache reste consultable, mais il n'est plus alimenté ni relu depuis le partage.
|
||||||
|
- **Aucune modification sans session active** : déplacement d'intervention, suppression, création ou édition d'absence, réservation : tout est bloqué proprement tant que la session n'est pas rétablie, avec un message clair. Cela évite d'écrire des données incohérentes qui seraient ensuite propagées aux autres postes.
|
||||||
|
|
||||||
|
### Onglet Email clarifié
|
||||||
|
|
||||||
|
- **Déplacement et annulation séparés** : l'onglet Email présente désormais deux sections distinctes (déplacement d'une intervention / annulation-suppression), chacune avec sa case d'activation et son propre modèle de message.
|
||||||
|
- **Copie (CC) commune avec aperçu en direct** : un bloc « Copie (CC) » en tête montre, sous forme de puces, les adresses effectivement retenues (les adresses invalides sont barrées) : vous voyez immédiatement à qui la copie sera envoyée.
|
||||||
|
- **Variables cliquables en colonnes** pour les deux modèles (déplacement et annulation), rangées par thème pour une insertion rapide.
|
||||||
|
|
||||||
|
### Lecture du planning au défilement (vue classique)
|
||||||
|
|
||||||
|
- **En-tête de carte collant** : quand vous faites défiler une carte, le **nom du technicien**, son **nombre d'interventions** et la **frise horaire** restent visibles en haut : plus besoin de remonter pour savoir de qui il s'agit.
|
||||||
|
- **Survol d'une pause** : passer la souris sur une pause met la **frise horaire en évidence** (sans faner les interventions), pour bien distinguer le créneau libre.
|
||||||
|
|
||||||
|
### Affichage et reconnexion fiabilisés
|
||||||
|
|
||||||
|
- La bannière **« Session EasyVista expirée »** s'affiche au bon endroit (dans le corps, sous la barre de recherche) et **uniquement quand de vraies cartes sont affichées** ; sinon un message centré prend la place du planning. Plus de fausse bannière au-dessus d'un écran vide.
|
||||||
|
- **Plus de bulles de techniciens vides** : lors d'un rafraîchissement automatique alors que la session est morte, l'extension détecte la page de connexion EasyVista et évite d'afficher une équipe vide.
|
||||||
|
- La **barre de progression** ne recouvre plus le nom du technicien pendant un rafraîchissement lorsqu'on a fait défiler.
|
||||||
|
|
||||||
|
### Corrections
|
||||||
|
|
||||||
|
- **Noms de contact nettoyés** : les caractères parasites (« ? » et caractères de remplacement) parfois collés aux noms venant d'EasyVista sont retirés.
|
||||||
|
- **Deux interventions du même technicien le même jour** (deux actions distinctes) s'affichent désormais chacune sur sa propre carte, sans en perdre.
|
||||||
|
- **Caractères parasités depuis EasyVista** (dans les libellés d'intervention, contacts, lieux) corrigés à la source.
|
||||||
|
- **Indicateur d'écart d'adresse** remis à jour après correction : actualiser une intervention dont l'adresse a été corrigée retire bien l'alerte.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## v2026.5.48 : Notification par email des déplacements, onglet Email, fiches réservation fiables entre postes, recherche et reconnexion durcies
|
||||||
|
|
||||||
|
> Après le déplacement d'une intervention (autre jour ou autre technicien), l'extension peut ouvrir un **brouillon d'email pré-rempli** dans votre application mail pour prévenir les techniciens concernés : l'envoi reste un geste manuel. Elle corrige aussi la circulation des informations de réservation entre postes, le bouton de reconnexion quand il n'y a aucun cache, et plusieurs comportements de la recherche.
|
||||||
|
|
||||||
|
### Email après un déplacement (nouveau)
|
||||||
|
|
||||||
|
- **Brouillon automatique** : après un déplacement vers un **autre jour** ou un **autre technicien** (fenêtre de modification ou glisser-déposer), un brouillon pré-adressé aux deux techniciens s'ouvre dans l'application mail (ex. Outlook). Un simple ajustement d'heures n'ouvre rien. **Rien n'est envoyé automatiquement.**
|
||||||
|
- **Case « Prévenir les techniciens par email »** dans les fenêtres de déplacement : quand l'option est active, la décocher ne vaut que pour **ce déplacement-là** : le prochain déplacement la retrouve cochée. L'option ne se désactive durablement que dans les Paramètres.
|
||||||
|
- **Destinataires** séparés par « ; » (compatibilité Outlook) ; si une adresse manque, le brouillon s'ouvre quand même, à compléter directement dans l'email (une notification indique qui manque).
|
||||||
|
- **Nouvel onglet « Email »** dans les Paramètres : option, et **modèle du message** entièrement personnalisable (sujet + texte), avec **variables cliquables** rangées par thème (Intervention / Avant / Après) et **aperçu en direct** sur un exemple. Le modèle de base présente le déplacement en deux blocs AVANT / APRÈS bien lisibles.
|
||||||
|
- **Adresses des techniciens** dans l'onglet Équipe (colonne Email, boutons au-dessus de la liste) : bouton « **Récupérer les emails** » qui remplit les adresses manquantes depuis l'annuaire EasyVista, et **complète au passage un nom affiché tronqué**, avec un garde-fou contre les homonymes. Une adresse saisie à la main n'est jamais écrasée. Champ vide = adresse proposée `prenom.nom@domaine` (domaine réglable au même endroit, appliqué à tous).
|
||||||
|
|
||||||
|
### Informations de réservation fiables entre postes
|
||||||
|
|
||||||
|
- Les informations saisies sur une réservation (n° d'intervention, ville, rue, catégorie) **voyagent désormais avec la réservation** dans le dossier partagé, horodatées : la modification la plus récente gagne, sur tous les postes.
|
||||||
|
- Fin des « fuites » d'informations : une réservation posée par un autre coordinateur ne récupère plus les infos d'une réservation précédente au même créneau, un identifiant recyclé par EasyVista ne fait plus hériter les infos d'un autre technicien, et un champ volontairement vidé ne « ressuscite » plus.
|
||||||
|
- Une réservation **re-planifiée directement dans EasyVista** conserve ses informations quand le rapprochement est sans ambiguïté.
|
||||||
|
- Divers : le pompier du jour n'est plus compté en double dans les statistiques ; « réservé toute la journée » se calcule sur les heures affichées ; les champs pré-remplis du formulaire ne sont plus écrasés par le remplissage automatique.
|
||||||
|
|
||||||
|
### Reconnexion et recherche
|
||||||
|
|
||||||
|
- **Bouton « Ouvrir EasyVista »** (écran « Session expirée » sans aucun cache) : après la reconnexion, l'écran se ferme réellement et le planning s'affiche ; re-cliquer relance le chargement au lieu d'être ignoré.
|
||||||
|
- **Recherche** : la recherche part de façon fiable quand on arrête de taper (les relances au survol ne l'interrompent plus), **Entrée** lance la recherche immédiatement, la roue de chargement est visible dès le début, déplier « Planifiée (passé) » ne ferme plus la zone de résultats, et seuls les statuts **Clôturé / Fait** sont affichés sur les résultats.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## v2026.5.47 : Vue « échelle de temps exacte », aide à la saisie, erreurs mises en évidence, corrections de fiabilité
|
||||||
|
|
||||||
|
> Cette version peaufine la vue horizontale « échelle de temps exacte » : un retour visuel accompagne la pose d'un rendez-vous ou d'une absence, et les erreurs de saisie (rendez-vous dont le début est égal à la fin) sont désormais bien visibles et signalées. Elle corrige aussi plusieurs problèmes de navigation entre dates et de synchronisation du dossier partagé, réorganise le panneau de synchronisation, et ajoute un bouton de test de la communication avec le script du poste.
|
||||||
|
|
||||||
|
### Vue « échelle de temps exacte » : aide à la saisie
|
||||||
|
|
||||||
|
- **Retour visuel au survol d'un créneau libre** : une zone surlignée suit la souris et affiche **l'heure exacte** (début → fin) du rendez-vous ou de l'absence qu'un clic droit poserait. Une bulle fixe, en haut de la ligne, rappelle la **plage libre et la durée disponible** du créneau (« Libre 12:00–18:00 / 6 h disponible »). Elle se place toujours sur un espace libre, jamais par-dessus un rendez-vous, et ne masque pas l'heure choisie.
|
||||||
- **Erreurs de saisie mises en évidence** : un rendez-vous dont le **début est égal à la fin** (ex. 10:00 → 10:00) est désormais affiché en **rouge** et reste **visible** (avant, il disparaissait sur l'échelle exacte). Survoler une telle zone pour en poser un autre affiche un **avertissement** et **empêche** la création tant que l'erreur n'est pas corrigée.
|
- **Erreurs de saisie mises en évidence** : un rendez-vous dont le **début est égal à la fin** (ex. 10:00 → 10:00) est désormais affiché en **rouge** et reste **visible** (avant, il disparaissait sur l'échelle exacte). Survoler une telle zone pour en poser un autre affiche un **avertissement** et **empêche** la création tant que l'erreur n'est pas corrigée.
|
||||||
- **Interventions courtes visibles** : une intervention de 1 à 5 minutes garde une largeur minimale et reste visible.
|
- **Interventions courtes visibles** : une intervention de 1 à 5 minutes garde une largeur minimale et reste visible.
|
||||||
- **Zone du nom** : le fond du nom du technicien remplit toute la hauteur de la ligne (nom centré).
|
- **Zone du nom** : le fond du nom du technicien remplit toute la hauteur de la ligne (nom centré).
|
||||||
@@ -26,7 +109,7 @@
|
|||||||
- **Navigation rapide entre dates** : le jour que l'on quitte ne peut plus écraser le jour qui vient de s'afficher.
|
- **Navigation rapide entre dates** : le jour que l'on quitte ne peut plus écraser le jour qui vient de s'afficher.
|
||||||
- **Technicien retiré de l'équipe** : n'apparaît plus sur les jours relus depuis le dossier partagé.
|
- **Technicien retiré de l'équipe** : n'apparaît plus sur les jours relus depuis le dossier partagé.
|
||||||
- **Synchronisation du dossier partagé** : correction d'un blocage où l'écriture n'aboutissait jamais (conflit permanent entre l'index et le fichier relu) ; l'index se répare de lui-même.
|
- **Synchronisation du dossier partagé** : correction d'un blocage où l'écriture n'aboutissait jamais (conflit permanent entre l'index et le fichier relu) ; l'index se répare de lui-même.
|
||||||
- **Jour présent au dossier mais pas en local** : lu depuis le dossier d'emblée — plus de re-remplissage visible inutile.
|
- **Jour présent au dossier mais pas en local** : lu depuis le dossier d'emblée : plus de re-remplissage visible inutile.
|
||||||
- **Absences** : plus de doublon « absence récurrente » + « vraie absence » le même jour ; le fond des cartes d'absence remplit toute la carte en échelle exacte.
|
- **Absences** : plus de doublon « absence récurrente » + « vraie absence » le même jour ; le fond des cartes d'absence remplit toute la carte en échelle exacte.
|
||||||
- **Réservations multiples le même jour** : les deux créneaux coexistent ; saisir le n° d'intervention dans le formulaire remplit automatiquement ville, rue et catégorie.
|
- **Réservations multiples le même jour** : les deux créneaux coexistent ; saisir le n° d'intervention dans le formulaire remplit automatiquement ville, rue et catégorie.
|
||||||
- **Barre de progression** et **message de reconnexion** : bien positionnés en vue horizontale (barre en haut de la sidebar, message centré dans le contenu).
|
- **Barre de progression** et **message de reconnexion** : bien positionnés en vue horizontale (barre en haut de la sidebar, message centré dans le contenu).
|
||||||
@@ -39,16 +122,16 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## v2026.5.46 — Refonte de la couche données, vue « échelle de temps exacte », session fiabilisée, réservations enrichies
|
## v2026.5.46 : Refonte de la couche données, vue « échelle de temps exacte », session fiabilisée, réservations enrichies
|
||||||
|
|
||||||
> Version majeure par son contenu : la couche données est entièrement refondue (store unifié par jour, un seul verdict par intervention, synchronisation du dossier partagé en sous-dossier `v2`), une nouvelle disposition « échelle de temps exacte » s'ajoute à la vue horizontale, la détection de session EasyVista est fiabilisée de bout en bout, et les réservations portent enfin leurs informations (n°, lieu, catégorie) sur tous les postes. Le script PowerShell du dossier partagé est désormais publié avec l'extension et téléchargeable depuis les Paramètres.
|
> Version majeure par son contenu : la couche données est entièrement refondue (store unifié par jour, un seul verdict par intervention, synchronisation du dossier partagé en sous-dossier `v2`), une nouvelle disposition « échelle de temps exacte » s'ajoute à la vue horizontale, la détection de session EasyVista est fiabilisée de bout en bout, et les réservations portent leurs informations (n°, lieu, catégorie) sur tous les postes. Le script PowerShell du dossier partagé est désormais publié avec l'extension et téléchargeable depuis les Paramètres.
|
||||||
|
|
||||||
### Couche données v2 (refonte complète)
|
### Couche données v2 (refonte complète)
|
||||||
|
|
||||||
- **Un store par jour** (`planv2_<date>`) : liste plate d'interventions dédoublonnées par identité stable (requestId > actionId > réf) — la seule source de vérité ; le rendu, le cache local, le dossier partagé et EasyVista n'en sont que des projections ou des sources.
|
- **Un store par jour** (`planv2_<date>`) : liste plate d'interventions dédoublonnées par identité stable (requestId > actionId > réf) : la seule source de vérité ; le rendu, le cache local, le dossier partagé et EasyVista n'en sont que des projections ou des sources.
|
||||||
- **Un seul verdict par intervention** (`live / done / suspended / closed / gone / moved / unknown`) qui remplace les anciens marqueurs dispersés (ghost, statuts de disparition, diagnostics).
|
- **Un seul verdict par intervention** (`live / done / suspended / closed / gone / moved / unknown`) qui remplace les anciens marqueurs dispersés (ghost, statuts de disparition, diagnostics).
|
||||||
- **Une seule fusion** (modèle vie/mort) utilisée partout : EV↔store, local↔dossier, import. Une vie strictement postérieure à une mort lève les tombstones (réapparition EV autoritaire).
|
- **Une seule fusion** (modèle vie/mort) utilisée partout : EV↔store, local↔dossier, import. Une vie strictement postérieure à une mort lève les tombstones (réapparition EV autoritaire).
|
||||||
- **Dossier partagé** : transport natif inchangé (verrous + écriture atomique + compare-and-swap), fichiers v2 dans le sous-dossier `v2` du partage — les postes en ancienne version n'interfèrent plus. Ordre des sources refondu : EasyVista s'affiche immédiatement, le dossier habille les cartes sans re-télécharger, le fetch ne traite que ce qui manque, l'enrichissement est repoussé au dossier en fin de chargement.
|
- **Dossier partagé** : transport natif inchangé (verrous + écriture atomique + compare-and-swap), fichiers v2 dans le sous-dossier `v2` du partage : les postes en ancienne version n'interfèrent plus. Ordre des sources refondu : EasyVista s'affiche immédiatement, le dossier habille les cartes sans re-télécharger, le fetch ne traite que ce qui manque, l'enrichissement est repoussé au dossier en fin de chargement.
|
||||||
- Les interventions déplacées par l'extension portent un verdict « déplacée » propagé (plus d'analyse inutile), avec fenêtre anti cache-serveur EV.
|
- Les interventions déplacées par l'extension portent un verdict « déplacée » propagé (plus d'analyse inutile), avec fenêtre anti cache-serveur EV.
|
||||||
- Les disparues en attente de verdict restent affichées (grisées, spinner) au lieu de disparaître puis réapparaître.
|
- Les disparues en attente de verdict restent affichées (grisées, spinner) au lieu de disparaître puis réapparaître.
|
||||||
- Outil réservé à l'auteur (onglet Test) : conversion de l'ancien cache dossier v1 vers le modèle v2, sans modifier les anciens fichiers.
|
- Outil réservé à l'auteur (onglet Test) : conversion de l'ancien cache dossier v1 vers le modèle v2, sans modifier les anciens fichiers.
|
||||||
@@ -60,24 +143,24 @@
|
|||||||
- Le bandeau timeline disparaît : chaque intervention/réservation/absence partielle est posée **en position réelle** sur une bande continue de la plage affichée (position et largeur proportionnelles à l'heure et à la durée).
|
- Le bandeau timeline disparaît : chaque intervention/réservation/absence partielle est posée **en position réelle** sur une bande continue de la plage affichée (position et largeur proportionnelles à l'heure et à la durée).
|
||||||
- **Règle des heures fixe** en haut (reste collée au défilement), **lignes verticales continues** sur toute la hauteur du tableau : trait net à chaque heure, pointillé discret aux demi-heures, césure rayée à midi ; les traits passent derrière les bulles et sautent les techniciens absents.
|
- **Règle des heures fixe** en haut (reste collée au défilement), **lignes verticales continues** sur toute la hauteur du tableau : trait net à chaque heure, pointillé discret aux demi-heures, césure rayée à midi ; les traits passent derrière les bulles et sautent les techniciens absents.
|
||||||
- **Ligne rouge « maintenant »** continue sur toute la hauteur (jour courant), reposée instantanément à chaque rendu ; elle saute aussi les absents.
|
- **Ligne rouge « maintenant »** continue sur toute la hauteur (jour courant), reposée instantanément à chaque rendu ; elle saute aussi les absents.
|
||||||
- **Chevauchements** : les éléments qui se recouvrent s'empilent en sous-lignes de même hauteur — la zone du technicien s'agrandit seulement dans ce cas ; tolérance de 10 minutes pour ne pas empiler de simples enchaînements.
|
- **Chevauchements** : les éléments qui se recouvrent s'empilent en sous-lignes de même hauteur : la zone du technicien s'agrandit seulement dans ce cas ; tolérance de 10 minutes pour ne pas empiler de simples enchaînements.
|
||||||
- **Cartes** : fond neutre, le bord gauche porte la couleur de catégorie et sert de **poignée** (cliquer = fenêtre de modification, glisser = déplacer ; présente sur toutes les cartes, déplacement bloqué pour les faites/clôturées, réservations et absences). Numéro d'intervention en tête, ville + adresse groupées ; cartes étroites : texte compact (ville + fin d'adresse, « Rue de l'Exemple 5 » → « Université 5 »), jamais vides tant qu'il reste de la place.
|
- **Cartes** : fond neutre, le bord gauche porte la couleur de catégorie et sert de **poignée** (cliquer = fenêtre de modification, glisser = déplacer ; présente sur toutes les cartes, déplacement bloqué pour les faites/clôturées, réservations et absences). Numéro d'intervention en tête, ville + adresse groupées ; cartes étroites : texte compact (ville + fin d'adresse, « Rue de l'Exemple 5 » → « Exemple 5 »), jamais vides tant qu'il reste de la place.
|
||||||
- **Réservations** : affichent sous l'intitulé le lieu renseigné à la création, sinon le nom de la personne qui a réservé.
|
- **Réservations** : affichent sous l'intitulé le lieu renseigné à la création, sinon le nom de la personne qui a réservé.
|
||||||
- **Zones libres** : survol = « Libre HH:MM–HH:MM » (y compris sur les journées totalement vides), clic droit = Réservation/Absence à l'heure du curseur, dépôt du drag précis (pas de 30 min) avec marqueur vert sur toute la bande.
|
- **Zones libres** : survol = « Libre HH:MM–HH:MM » (y compris sur les journées totalement vides), clic droit = Réservation/Absence à l'heure du curseur, dépôt du drag précis (pas de 30 min) avec marqueur vert sur toute la bande.
|
||||||
- Alignement règle/cartes mesuré au pixel réel (indépendant du zoom et de la taille de texte).
|
- Alignement règle/cartes mesuré au pixel réel (indépendant du zoom et de la taille de texte).
|
||||||
|
|
||||||
### Session EasyVista fiabilisée (fin des faux « déconnecté »)
|
### Session EasyVista fiabilisée (fin des faux « déconnecté »)
|
||||||
|
|
||||||
- **Cookie réécrit ≠ supprimé** : le navigateur émet toujours une « suppression » technique juste avant de reposer un cookie mis à jour — l'extension basculait à tort en « session expirée » à chaque rafraîchissement du PHPSESSID (permission cookies active). Désormais ignoré ; une vraie suppression attend 3 s (relog possible) puis vérifie au serveur avant d'alarmer.
|
- **Cookie réécrit ≠ supprimé** : le navigateur émet toujours une « suppression » technique juste avant de reposer un cookie mis à jour : l'extension basculait à tort en « session expirée » à chaque rafraîchissement du PHPSESSID (permission cookies active). Désormais ignoré ; une vraie suppression attend 3 s (relog possible) puis vérifie au serveur avant d'alarmer.
|
||||||
- **Expiration sur preuve uniquement** : une erreur transitoire (réseau, HTTP 5xx) ne déclenche plus la bannière — seule une preuve le fait (page de login à la sonde, temps restant nul, plus aucun PHPSESSID) ; sinon nouvel essai dans 30 s.
|
- **Expiration sur preuve uniquement** : une erreur transitoire (réseau, HTTP 5xx) ne déclenche plus la bannière : seule une preuve le fait (page de login à la sonde, temps restant nul, plus aucun PHPSESSID) ; sinon nouvel essai dans 30 s.
|
||||||
- **Onglet EasyVista facultatif** avec la permission cookies : le cookie suffit aux requêtes — fermer l'onglet EV ne « perd » plus la session.
|
- **Onglet EasyVista facultatif** avec la permission cookies : le cookie suffit aux requêtes ; fermer l'onglet EV ne « perd » plus la session.
|
||||||
- **Contre-vérification HTTP** : avant de classer un 401/403/404 en « session expirée », l'endpoint d'autorité `session_time` est sondé ; si la session vit, l'erreur est reclassée « EV inaccessible » (transitoire).
|
- **Contre-vérification HTTP** : avant de classer un 401/403/404 en « session expirée », l'endpoint d'autorité `session_time` est sondé ; si la session vit, l'erreur est reclassée « EV inaccessible » (transitoire).
|
||||||
- **Compteur calé sur le serveur** : recalage périodique sur la vraie valeur EasyVista (au démarrage, toutes les 90 s, au retour de visibilité), plus de recalage erroné sur l'expiration du cookie ; badge session en direct (MM:SS) avec « Prolonger la session » dans le popup.
|
- **Compteur calé sur le serveur** : recalage périodique sur la vraie valeur EasyVista (au démarrage, toutes les 90 s, au retour de visibilité), plus de recalage erroné sur l'expiration du cookie ; badge session en direct (MM:SS) avec « Prolonger la session » dans le popup.
|
||||||
|
|
||||||
### Réservations
|
### Réservations
|
||||||
|
|
||||||
- **Modal enrichie** : préréglages Matin/Après-midi/Journée puis heures ; champs n° d'intervention, ville, rue, catégorie ; recherche automatique des informations dans EasyVista à partir du n° (catégorie et localisation pré-remplies).
|
- **Modal enrichie** : préréglages Matin/Après-midi/Journée puis heures ; champs n° d'intervention, ville, rue, catégorie ; recherche automatique des informations dans EasyVista à partir du n° (catégorie et localisation pré-remplies).
|
||||||
- **Meta persistante et partagée** : ces informations survivent aux rafraîchissements (EV ne les stocke pas) et remontent désormais au dossier partagé — tous les postes voient le n°, le lieu et la catégorie d'une réservation, quel que soit le poste qui l'a créée ou modifiée.
|
- **Meta persistante et partagée** : ces informations survivent aux rafraîchissements (EV ne les stocke pas) et remontent désormais au dossier partagé : tous les postes voient le n°, le lieu et la catégorie d'une réservation, quel que soit le poste qui l'a créée ou modifiée.
|
||||||
- Édition d'une réservation (heures ou infos seules), suppression, tooltip détaillé avec ouverture/copie du n° lié.
|
- Édition d'une réservation (heures ou infos seules), suppression, tooltip détaillé avec ouverture/copie du n° lié.
|
||||||
|
|
||||||
### Pompier
|
### Pompier
|
||||||
@@ -91,7 +174,7 @@
|
|||||||
|
|
||||||
### Douchette
|
### Douchette
|
||||||
|
|
||||||
- **Vraie confirmation EasyVista** : l'envoi vérifie le marqueur de prise en compte renvoyé par EV — toast « confirmé par EasyVista » fiable.
|
- **Vraie confirmation EasyVista** : l'envoi vérifie le marqueur de prise en compte renvoyé par EV : toast « confirmé par EasyVista » fiable.
|
||||||
- **Resynchronisation automatique** après un déplacement d'intervention (jour source + jour cible, regroupés si même jour), avec compte-rendu clair et relance possible.
|
- **Resynchronisation automatique** après un déplacement d'intervention (jour source + jour cible, regroupés si même jour), avec compte-rendu clair et relance possible.
|
||||||
|
|
||||||
### Recherche
|
### Recherche
|
||||||
@@ -121,18 +204,18 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## v2026.5.45 — Dock latéral drag&drop, fix verdicts ghost, multi-onglets EZV résolu
|
## v2026.5.45 : Dock latéral drag&drop, fix verdicts ghost, multi-onglets EZV résolu
|
||||||
|
|
||||||
> Refonte de l'expérience drag&drop avec dock latéral pour parquer des interventions entre les jours, fix critique du parser de fiches qui marquait à tort des interventions terminées comme annulées, résolution des 6 issues ouvertes (multi-onglets EZV, absences récurrentes, popups épinglés, pompier absent), et nombreux ajustements d'ergonomie.
|
> Refonte de l'expérience drag&drop avec dock latéral pour parquer des interventions entre les jours, fix critique du parser de fiches qui marquait à tort des interventions terminées comme annulées, résolution des 6 issues ouvertes (multi-onglets EZV, absences récurrentes, popups épinglés, pompier absent), et nombreux ajustements d'ergonomie.
|
||||||
|
|
||||||
### Issues résolues
|
### Issues résolues
|
||||||
|
|
||||||
- **#3** — Coches « Absences récurrentes » : merge propre avec l'état stocké au lieu d'écrasement, les coches sont retenues lors d'un changement de groupe ou d'une réouverture des paramètres.
|
- **#3** Coches « Absences récurrentes » : merge propre avec l'état stocké au lieu d'écrasement, les coches sont retenues lors d'un changement de groupe ou d'une réouverture des paramètres.
|
||||||
- **#4** — Perte de session EZV multi-onglets : permission optionnelle `cookies` + listener `cookieChanged` côté background, toggle dans Paramètres → Diagnostics. La session reste valable même après reconnexion et fermeture d'un onglet EZV.
|
- **#4** Perte de session EZV multi-onglets : permission optionnelle `cookies` + listener `cookieChanged` côté background, toggle dans Paramètres → Diagnostics. La session reste valable même après reconnexion et fermeture d'un onglet EZV.
|
||||||
- **#5** — Bouton de copie de référence dans une popup épinglée : handler `copy-ref` ajouté.
|
- **#5** Bouton de copie de référence dans une popup épinglée : handler `copy-ref` ajouté.
|
||||||
- **#6** — Popup épinglée au premier plan : clic sur une popup recalcule le z-index pour la passer au-dessus des autres.
|
- **#6** Popup épinglée au premier plan : clic sur une popup recalcule le z-index pour la passer au-dessus des autres.
|
||||||
- **#7** — Notification « +2 min » fantôme : reset des flags d'alerte slide au retour de la prolongation.
|
- **#7** Notification « +2 min » fantôme : reset des flags d'alerte slide au retour de la prolongation.
|
||||||
- **#8** — Compteur pompier : un pompier absent toute la journée est exclu du compteur.
|
- **#8** Compteur pompier : un pompier absent toute la journée est exclu du compteur.
|
||||||
|
|
||||||
### Dock latéral drag&drop
|
### Dock latéral drag&drop
|
||||||
|
|
||||||
@@ -145,7 +228,7 @@ Le dock à droite permet de mettre des interventions de côté pendant qu'on nav
|
|||||||
- Drag depuis le dock : retrait différé à l'activation effective du drag (5 px). Ghost flottant sans heure à gauche. Drop sur tech → modal de confirmation. Drop hors zone / Échap / sur le même slot d'origine → restauration dans le dock.
|
- Drag depuis le dock : retrait différé à l'activation effective du drag (5 px). Ghost flottant sans heure à gauche. Drop sur tech → modal de confirmation. Drop hors zone / Échap / sur le même slot d'origine → restauration dans le dock.
|
||||||
- Plus de scrollbar horizontale en bas du dock, plus de clic-through dans la zone autour du bouton « Tout annuler ».
|
- Plus de scrollbar horizontale en bas du dock, plus de clic-through dans la zone autour du bouton « Tout annuler ».
|
||||||
|
|
||||||
### Verdicts ghost — fix critique
|
### Verdicts ghost : fix critique
|
||||||
|
|
||||||
Une intervention terminée par le tech mais dont la fiche était passée en statut « Redirigé » / « Finalisation » / « Exécution » était à tort marquée comme « annulée » et retirée du planning, parce que le parser de fiche cherchait les dates d'action aux indices `[8]`/`[9]` du tableau `rows` alors que le layout EV récent les place en `[6]`/`[7]` (et la description en `[9]` au lieu de `[11]`).
|
Une intervention terminée par le tech mais dont la fiche était passée en statut « Redirigé » / « Finalisation » / « Exécution » était à tort marquée comme « annulée » et retirée du planning, parce que le parser de fiche cherchait les dates d'action aux indices `[8]`/`[9]` du tableau `rows` alors que le layout EV récent les place en `[6]`/`[7]` (et la description en `[9]` au lieu de `[11]`).
|
||||||
|
|
||||||
@@ -170,7 +253,7 @@ Une intervention terminée par le tech mais dont la fiche était passée en stat
|
|||||||
- Le contact n'inclut plus les labels « fiche » (`Étage`, `Bureau`, `Service`, `Matériel`, `Problème`, `TFS`, `Date`, `Heure`, `Lieu`, `Bénéficiaire`, `Nom utilisateur`) qui se collent parfois à la valeur du contact à cause de séparateurs perdus dans la source EV. Le tooltip insère un saut de ligne avant chaque label collé pour la lisibilité.
|
- Le contact n'inclut plus les labels « fiche » (`Étage`, `Bureau`, `Service`, `Matériel`, `Problème`, `TFS`, `Date`, `Heure`, `Lieu`, `Bénéficiaire`, `Nom utilisateur`) qui se collent parfois à la valeur du contact à cause de séparateurs perdus dans la source EV. Le tooltip insère un saut de ligne avant chaque label collé pour la lisibilité.
|
||||||
|
|
||||||
|
|
||||||
## v2026.5.44 — Refonte topbar, personnalisation Apparence, onboarding équipe, refresh séquentiel
|
## v2026.5.44 : Refonte topbar, personnalisation Apparence, onboarding équipe, refresh séquentiel
|
||||||
|
|
||||||
> Refonte visuelle de la topbar (vue classique + horizontale), nouveau panneau
|
> Refonte visuelle de la topbar (vue classique + horizontale), nouveau panneau
|
||||||
> de personnalisation (couleur de la barre du haut + police de l'application
|
> de personnalisation (couleur de la barre du haut + police de l'application
|
||||||
@@ -206,7 +289,7 @@ Une intervention terminée par le tech mais dont la fiche était passée en stat
|
|||||||
le préfixe `[disparition]` dans la console F12 pour debug. En PROD
|
le préfixe `[disparition]` dans la console F12 pour debug. En PROD
|
||||||
(par défaut), les iv `cancelled` sont bien retirées comme avant.
|
(par défaut), les iv `cancelled` sont bien retirées comme avant.
|
||||||
|
|
||||||
### Topbar — vue classique
|
### Topbar : vue classique
|
||||||
|
|
||||||
- Sélecteur de date du planning **ancré au centre absolu** : il ne se décale
|
- 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
|
plus quand le bouton « ✕ Arrêter » apparaît à droite pendant un
|
||||||
@@ -217,7 +300,7 @@ Une intervention terminée par le tech mais dont la fiche était passée en stat
|
|||||||
- Date du planning agrandie et neutre (couleur stable, plus de bascule
|
- Date du planning agrandie et neutre (couleur stable, plus de bascule
|
||||||
selon la date sélectionnée).
|
selon la date sélectionnée).
|
||||||
|
|
||||||
### Personnalisation — Paramètres → Apparence
|
### Personnalisation : Paramètres → Apparence
|
||||||
|
|
||||||
- **Couleur de la barre du haut** : 12 presets cliquables (Défaut, Blanc,
|
- **Couleur de la barre du haut** : 12 presets cliquables (Défaut, Blanc,
|
||||||
Gris clair, Anthracite, Bleu DGNSI, Marine, Vert sapin, Brique, Violet,
|
Gris clair, Anthracite, Bleu DGNSI, Marine, Vert sapin, Brique, Violet,
|
||||||
@@ -298,7 +381,7 @@ Une intervention terminée par le tech mais dont la fiche était passée en stat
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## v2026.5.43 — Fix Firefox : positionnement menu dock + stabilité popup pin/unpin
|
## v2026.5.43 : Fix Firefox, positionnement menu dock + stabilité popup pin/unpin
|
||||||
|
|
||||||
### Menu hover sur pastille du dock (popup réduit)
|
### Menu hover sur pastille du dock (popup réduit)
|
||||||
- Bug Firefox uniquement : quand un popup épinglé était réduit dans la
|
- Bug Firefox uniquement : quand un popup épinglé était réduit dans la
|
||||||
@@ -325,19 +408,19 @@ Une intervention terminée par le tech mais dont la fiche était passée en stat
|
|||||||
`--border-strong` (gris discret) plutôt que `--accent` (bleu) pour
|
`--border-strong` (gris discret) plutôt que `--accent` (bleu) pour
|
||||||
signaler visuellement le mode "détaché". Position et taille stables.
|
signaler visuellement le mode "détaché". Position et taille stables.
|
||||||
|
|
||||||
## v2026.5.42 — Nettoyage de commentaires + exemples génériques
|
## v2026.5.42 : Nettoyage de commentaires + exemples génériques
|
||||||
|
|
||||||
- Passage en revue des commentaires de `src/viewer.js` : les exemples qui
|
- 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é
|
illustraient le parsing des contacts/lieux/références/codes-barres ont été
|
||||||
uniformisés en placeholders abstraits (`Nom1 Prénom1 +41XXXXXXXXX`,
|
uniformisés en placeholders abstraits (`Nom1 Prénom1 +41XXXXXXXXX`,
|
||||||
`SYYMMDD_NNNNN`, `XXXX_NNNNNNNN`, etc.) plutôt que des chaînes spécifiques.
|
`SYYMMDD_NNNNN`, `XXXX_NNNNNNNN`, etc.) plutôt que des chaînes spécifiques.
|
||||||
Comportement runtime strictement inchangé — uniquement de la documentation
|
Comportement runtime strictement inchangé : uniquement de la documentation
|
||||||
et des commentaires.
|
et des commentaires.
|
||||||
- Mise à jour cohérente du README, du CHANGELOG et des pages wiki Versions /
|
- 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
|
Utilisation pour utiliser les mêmes notations génériques dans les
|
||||||
exemples de référence.
|
exemples de référence.
|
||||||
|
|
||||||
## v2026.5.41 — Suppression des hardcodes (groupe / domaines / équipe) → tout depuis l'admin
|
## v2026.5.41 : Suppression des hardcodes (groupe / domaines / équipe) → tout depuis l'admin
|
||||||
|
|
||||||
### Plus aucun hardcode au runtime
|
### Plus aucun hardcode au runtime
|
||||||
- Le groupe EasyVista, les domaines (interne/externe) et la liste des
|
- Le groupe EasyVista, les domaines (interne/externe) et la liste des
|
||||||
@@ -415,9 +498,7 @@ Une intervention terminée par le tech mais dont la fiche était passée en stat
|
|||||||
`itsma.vd.ch`) restent dans `host_permissions` (toujours accordés à
|
`itsma.vd.ch`) restent dans `host_permissions` (toujours accordés à
|
||||||
l'install), pas besoin de redemander la permission pour eux.
|
l'install), pas besoin de redemander la permission pour eux.
|
||||||
|
|
||||||
## v2026.5.40 — Vue horizontale enrichie (ref + ville + barre couleur)
|
## v2026.5.40 : Vue horizontale enrichie (ref + ville + barre couleur)
|
||||||
**Branche** : current
|
|
||||||
|
|
||||||
- En vue horizontale, chaque segment timeline d'intervention contient
|
- En vue horizontale, chaque segment timeline d'intervention contient
|
||||||
désormais :
|
désormais :
|
||||||
- Une **barre verticale couleur catégorie** à gauche (mêmes teintes que
|
- Une **barre verticale couleur catégorie** à gauche (mêmes teintes que
|
||||||
@@ -435,7 +516,7 @@ Une intervention terminée par le tech mais dont la fiche était passée en stat
|
|||||||
généré, `Autres/` pour build.sh + meta files (LICENSE, README,
|
généré, `Autres/` pour build.sh + meta files (LICENSE, README,
|
||||||
CHANGELOG)
|
CHANGELOG)
|
||||||
|
|
||||||
## v2026.5.39 — Séparation Matin / Après-midi + Apparence (thème, zoom, cache)
|
## v2026.5.39 : Séparation Matin / Après-midi + Apparence (thème, zoom, cache)
|
||||||
|
|
||||||
### Séparation matin / après-midi
|
### Séparation matin / après-midi
|
||||||
- Séparateur visuel "MATIN" / "APRÈS-MIDI" entre les interventions
|
- Séparateur visuel "MATIN" / "APRÈS-MIDI" entre les interventions
|
||||||
@@ -444,7 +525,7 @@ Une intervention terminée par le tech mais dont la fiche était passée en stat
|
|||||||
- Si une période est vide, son séparateur n'est pas affiché.
|
- 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).
|
- Caché en vue horizontale (les rows sont masquées de toute façon).
|
||||||
|
|
||||||
### Timeline — coupure midi très visible
|
### Timeline : coupure midi très visible
|
||||||
- Bande verticale composée d'un trait massif central (couleur --text)
|
- Bande verticale composée d'un trait massif central (couleur --text)
|
||||||
+ stripes diagonales en arrière-plan (effet "césure"). 6 px de large
|
+ 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.
|
(7 px en vue horizontale). Visible immédiatement, pas de label superflu.
|
||||||
@@ -464,7 +545,7 @@ Une intervention terminée par le tech mais dont la fiche était passée en stat
|
|||||||
capture-info → refresh-check. Évite les déplacements au retour de
|
capture-info → refresh-check. Évite les déplacements au retour de
|
||||||
vue horizontale.
|
vue horizontale.
|
||||||
|
|
||||||
### Section Apparence (admin) — refondue + en première position
|
### Section Apparence (admin) : refondue + en première position
|
||||||
- **Thème** : sélecteur Auto / Clair / Sombre (s'enregistre direct).
|
- **Thème** : sélecteur Auto / Clair / Sombre (s'enregistre direct).
|
||||||
- **Durée du cache (jours)** : configurable, défaut 7 jours, range 1-365.
|
- **Durée du cache (jours)** : configurable, défaut 7 jours, range 1-365.
|
||||||
Lue par viewer.js (purge auto) ET background.js (au boot).
|
Lue par viewer.js (purge auto) ET background.js (au boot).
|
||||||
@@ -473,13 +554,11 @@ Une intervention terminée par le tech mais dont la fiche était passée en stat
|
|||||||
le boot.
|
le boot.
|
||||||
- Section "Apparence" est maintenant **la première** dans le panel admin.
|
- Section "Apparence" est maintenant **la première** dans le panel admin.
|
||||||
|
|
||||||
## v2026.5.38 — Attribution auteur + nettoyage code
|
## v2026.5.38 : Attribution auteur + nettoyage code
|
||||||
**Branche** : current
|
|
||||||
|
|
||||||
### Attribution auteur
|
### Attribution auteur
|
||||||
- Ajout en-têtes copyright dans tous les fichiers source
|
- Ajout en-têtes copyright dans tous les fichiers source
|
||||||
(viewer.js, viewer.html, viewer.css, background.js)
|
(viewer.js, viewer.html, viewer.css, background.js)
|
||||||
- Ajout `@author FroSteel` sur les fonctions principales
|
- Ajout `@author Quentin` sur les fonctions principales
|
||||||
(loadForDate, buildCard, buildTooltipHTML, pinTooltip, _softUnpinPopup,
|
(loadForDate, buildCard, buildTooltipHTML, pinTooltip, _softUnpinPopup,
|
||||||
positionTooltipAnchored, _applyViewMode, _moveElementsToSidebar,
|
positionTooltipAnchored, _applyViewMode, _moveElementsToSidebar,
|
||||||
_restoreElementsToTopbar, fetchAndShowCurrentUser, _maybeRetryFetchUser,
|
_restoreElementsToTopbar, fetchAndShowCurrentUser, _maybeRetryFetchUser,
|
||||||
@@ -487,7 +566,7 @@ Une intervention terminée par le tech mais dont la fiche était passée en stat
|
|||||||
openPersistentTimelinePopup, showTooltip, _findFreePopupPosition,
|
openPersistentTimelinePopup, showTooltip, _findFreePopupPosition,
|
||||||
_clampPopupInSafeArea, findEasyVistaSession, fetchPlanningXml,
|
_clampPopupInSafeArea, findEasyVistaSession, fetchPlanningXml,
|
||||||
fetchCurrentUser, detectNetworkContext)
|
fetchCurrentUser, detectNetworkContext)
|
||||||
- Ajout signature "Développé par FroSteel" en bas du popup
|
- Ajout signature "Développé par Quentin" en bas du popup
|
||||||
user-badge (style cohérent avec footer version : 11px, italique,
|
user-badge (style cohérent avec footer version : 11px, italique,
|
||||||
gris atténué, séparateur fin)
|
gris atténué, séparateur fin)
|
||||||
- Mise à jour `description` du manifest pour mentionner DGNSI
|
- Mise à jour `description` du manifest pour mentionner DGNSI
|
||||||
@@ -514,7 +593,7 @@ Une intervention terminée par le tech mais dont la fiche était passée en stat
|
|||||||
- `planification-v2026.5.38-chromium.zip` (~144 Ko)
|
- `planification-v2026.5.38-chromium.zip` (~144 Ko)
|
||||||
- `planification-v2026.5.38-firefox.xpi` (~144 Ko, à signer sur AMO)
|
- `planification-v2026.5.38-firefox.xpi` (~144 Ko, à signer sur AMO)
|
||||||
|
|
||||||
## v2026.5.37 — Refonte vue horizontale (sidebar complète)
|
## v2026.5.37 : Refonte vue horizontale (sidebar complète)
|
||||||
|
|
||||||
- Topbar en haut supprimée en vue horizontale
|
- Topbar en haut supprimée en vue horizontale
|
||||||
- User-badge + titre déplacés tout en haut de la sidebar
|
- User-badge + titre déplacés tout en haut de la sidebar
|
||||||
@@ -530,7 +609,7 @@ Une intervention terminée par le tech mais dont la fiche était passée en stat
|
|||||||
- Barre de rafraîchissement en overlay top-left
|
- Barre de rafraîchissement en overlay top-left
|
||||||
- Banderole pompier masquée en vue horizontale (badge + barre rouge à gauche conservés)
|
- Banderole pompier masquée en vue horizontale (badge + barre rouge à gauche conservés)
|
||||||
|
|
||||||
## v2026.5.36 — Sidebar verticale en vue horizontale
|
## v2026.5.36 : Sidebar verticale en vue horizontale
|
||||||
- Création wrapper flex-row #horizontal-wrapper contenant [sidebar] + [main]
|
- Création wrapper flex-row #horizontal-wrapper contenant [sidebar] + [main]
|
||||||
- Sidebar 200px (170px sur <1400px), sticky, bg-muted
|
- Sidebar 200px (170px sur <1400px), sticky, bg-muted
|
||||||
- Déplacement physique des éléments via JS (ELEMENTS_TO_RELOCATE)
|
- Déplacement physique des éléments via JS (ELEMENTS_TO_RELOCATE)
|
||||||
@@ -538,7 +617,7 @@ Une intervention terminée par le tech mais dont la fiche était passée en stat
|
|||||||
- Restauration propre en vue classique
|
- Restauration propre en vue classique
|
||||||
- Zone nom tech : 140px → 120px
|
- Zone nom tech : 140px → 120px
|
||||||
|
|
||||||
## v2026.5.35 — Fix popup épinglé position vue horizontale + stats gauche
|
## v2026.5.35 : Fix popup épinglé position vue horizontale + stats gauche
|
||||||
- Fix popup épinglé qui partait en haut à gauche en vue horizontale
|
- Fix popup épinglé qui partait en haut à gauche en vue horizontale
|
||||||
- Cause : rows .intervention-v2 cachées (display: none) → getBoundingClientRect (0,0,0,0)
|
- Cause : rows .intervention-v2 cachées (display: none) → getBoundingClientRect (0,0,0,0)
|
||||||
- Solution : priorité 1 tooltip visible, priorité 2 segment timeline, fallback srcEl
|
- Solution : priorité 1 tooltip visible, priorité 2 segment timeline, fallback srcEl
|
||||||
@@ -546,7 +625,7 @@ Une intervention terminée par le tech mais dont la fiche était passée en stat
|
|||||||
- Position sticky, fond bg-muted, séparateurs · masqués
|
- Position sticky, fond bg-muted, séparateurs · masqués
|
||||||
- Zone nom tech 200px → 140px (vue horizontale)
|
- Zone nom tech 200px → 140px (vue horizontale)
|
||||||
|
|
||||||
## v2026.5.34 — Bouton 📌 restauré + badge user cliquable
|
## v2026.5.34 : Bouton 📌 restauré + badge user cliquable
|
||||||
- HTML : badge user toujours visible avec "?" par défaut (retiré class hidden)
|
- HTML : badge user toujours visible avec "?" par défaut (retiré class hidden)
|
||||||
- _softUnpinPopup refait en 8 étapes loggées
|
- _softUnpinPopup refait en 8 étapes loggées
|
||||||
- Popup reste visible après désépinglage (plus de suppression auto au mouseleave)
|
- Popup reste visible après désépinglage (plus de suppression auto au mouseleave)
|
||||||
@@ -558,13 +637,13 @@ Une intervention terminée par le tech mais dont la fiche était passée en stat
|
|||||||
- Fonction positionTooltipAnchored unifiée (4 candidats droite/gauche/dessous/dessus)
|
- Fonction positionTooltipAnchored unifiée (4 candidats droite/gauche/dessous/dessus)
|
||||||
- popup._linkedIv stocké pour ré-épinglage
|
- popup._linkedIv stocké pour ré-épinglage
|
||||||
|
|
||||||
## v2026.5.33 — Interactions vue horizontale différenciées
|
## v2026.5.33 : Interactions vue horizontale différenciées
|
||||||
- Hover segment timeline en vue horizontale → grande popup directement (openPersistentTimelinePopup)
|
- Hover segment timeline en vue horizontale → grande popup directement (openPersistentTimelinePopup)
|
||||||
- Clic segment timeline en vue horizontale → ouvre fiche EasyVista
|
- 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)
|
- Popup absence en vue horizontale : hover uniquement sur badge .card-tech-badge (pas sur carte entière)
|
||||||
- Vue classique : comportement inchangé
|
- Vue classique : comportement inchangé
|
||||||
|
|
||||||
## v2026.5.32 — Vue horizontale togglable
|
## v2026.5.32 : Vue horizontale togglable
|
||||||
- Bouton ⊞ "Vue" dans popup user-badge (à côté ⚙ Paramètres)
|
- Bouton ⊞ "Vue" dans popup user-badge (à côté ⚙ Paramètres)
|
||||||
- Toggle Vue classique ↔ Vue horizontale persisté localStorage "view_mode"
|
- Toggle Vue classique ↔ Vue horizontale persisté localStorage "view_mode"
|
||||||
- HTML class "view-classic" ou "view-horizontal" sur <html>
|
- HTML class "view-classic" ou "view-horizontal" sur <html>
|
||||||
@@ -574,29 +653,30 @@ Une intervention terminée par le tech mais dont la fiche était passée en stat
|
|||||||
- Timeline horizontale pleine largeur
|
- Timeline horizontale pleine largeur
|
||||||
- Stats rapides .tech-row-stats ajoutés au header (nb interv, Xm · Ya)
|
- Stats rapides .tech-row-stats ajoutés au header (nb interv, Xm · Ya)
|
||||||
|
|
||||||
## v2026.5.31 — Sarcelle pour absence récurrente (REJETÉ par utilisateur)
|
## v2026.5.31 : Sarcelle pour absence récurrente (essai abandonné)
|
||||||
- Couleur absence récurrente (jour fixe) : sarcelle foncée #0f766e / soft #ccfbf1
|
- Couleur absence récurrente (jour fixe) : sarcelle foncée #0f766e / soft #ccfbf1
|
||||||
- Variables --c-recurring, --c-recurring-soft
|
- Variables --c-recurring, --c-recurring-soft
|
||||||
- Layout 4 colonnes forcées + scroll interne cartes (REJETÉ : "scroll en continu")
|
- Layout 4 colonnes forcées + scroll interne cartes
|
||||||
|
- Essai abandonné dans les versions suivantes.
|
||||||
|
|
||||||
## v2026.5.30 — Absence récurrente cyan + mode compact 24"
|
## v2026.5.30 : Absence récurrente cyan + mode compact 24"
|
||||||
- Absences récurrentes (configurées par tech) en cyan
|
- Absences récurrentes (configurées par tech) en cyan
|
||||||
- Mode compact @media (max-width: 1920px) avec grid-template-columns: repeat(4, 1fr)
|
- Mode compact @media (max-width: 1920px) avec grid-template-columns: repeat(4, 1fr)
|
||||||
|
|
||||||
## v2026.5.29 — Contraste++ + footer
|
## v2026.5.29 : Contraste++ + footer
|
||||||
- Contrastes encore plus forts (text-muted #d0d5de dark, #2e3642 light)
|
- Contrastes encore plus forts (text-muted #d0d5de dark, #2e3642 light)
|
||||||
- Footer FRS/version : 13px badge avec fond bg-muted + bordure
|
- Footer FRS/version : 13px badge avec fond bg-muted + bordure
|
||||||
- Fix highlight row : selector .intervention-v2[data-iv-idx]
|
- Fix highlight row : selector .intervention-v2[data-iv-idx]
|
||||||
- Scroll-into-view automatique au hover segment timeline
|
- Scroll-into-view automatique au hover segment timeline
|
||||||
|
|
||||||
## v2026.5.28 — Ajustements visuels absences
|
## v2026.5.28 : Ajustements visuels absences
|
||||||
- Retrait pastille ronde (.tech-name-dot supprimée) — barre gauche + badge suffisent
|
- Retrait pastille ronde (.tech-name-dot supprimée) : barre gauche + badge suffisent
|
||||||
- "Maladie" → "Maladie/Accident"
|
- "Maladie" → "Maladie/Accident"
|
||||||
- Contraste textes secondaires +30%
|
- Contraste textes secondaires +30%
|
||||||
- Popups épinglés width fixe 520px (ne rétrécit plus au resize fenêtre)
|
- 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
|
- _clampPopupInSafeArea ne rétrécit plus si popup > zone dispo
|
||||||
|
|
||||||
## v2026.5.27 — Classification absences (Maladie/Congé/Pompier)
|
## v2026.5.27 : Classification absences (Maladie/Congé/Pompier)
|
||||||
- Topbar une ligne : "Jeudi 23.04.26 • 21:55" (gros point •, même taille 22px)
|
- 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
|
- Fermeture auto popups non-épinglés au survol autre popup/carte
|
||||||
- Texte +20% topbar/stats/boutons
|
- Texte +20% topbar/stats/boutons
|
||||||
@@ -604,20 +684,20 @@ Une intervention terminée par le tech mais dont la fiche était passée en stat
|
|||||||
- Classification absences (ABSENCE_LABELS) + absenceCategory : "maladie"|"conge"|"pompier"|null
|
- Classification absences (ABSENCE_LABELS) + absenceCategory : "maladie"|"conge"|"pompier"|null
|
||||||
- Couleurs : Maladie #4338ca indigo foncé, Congé #06b6d4 cyan, Pompier #b03030 rouge
|
- Couleurs : Maladie #4338ca indigo foncé, Congé #06b6d4 cyan, Pompier #b03030 rouge
|
||||||
- Badge + barre gauche + dégradé fond pour catégorie
|
- Badge + barre gauche + dégradé fond pour catégorie
|
||||||
- Libellé "Absent du DD.MM au DD.MM — Maladie/Accident"
|
- Libellé "Absent du DD.MM au DD.MM" suivi de la catégorie (Maladie/Accident)
|
||||||
- Suffixe `s` adaptatif (Congé/Congés)
|
- Suffixe `s` adaptatif (Congé/Congés)
|
||||||
|
|
||||||
## v2026.5.26 — Badge user inconnu cliquable + retry
|
## v2026.5.26 : Badge user inconnu cliquable + retry
|
||||||
- En cas d'échec fetch user, afficher rond gris "?" cliquable
|
- En cas d'échec fetch user, afficher rond gris "?" cliquable
|
||||||
- Bouton ⚙ Paramètres accessible même quand user inconnu
|
- Bouton ⚙ Paramètres accessible même quand user inconnu
|
||||||
- Retry automatique 60s (max 10 essais = 10 min)
|
- Retry automatique 60s (max 10 essais = 10 min)
|
||||||
- Reset compteur au succès
|
- Reset compteur au succès
|
||||||
|
|
||||||
## v2026.5.25 — Bouton Paramètres dans popup user-badge
|
## v2026.5.25 : Bouton Paramètres dans popup user-badge
|
||||||
- Remplace les 5 clics sur le titre pour ouvrir admin
|
- Remplace les 5 clics sur le titre pour ouvrir admin
|
||||||
- Bouton ⚙ Paramètres explicite dans le popup user-badge
|
- Bouton ⚙ Paramètres explicite dans le popup user-badge
|
||||||
|
|
||||||
## v2026.5.16-v2026.5.24 — Évolutions diverses (à compléter)
|
## v2026.5.16 à v2026.5.24 : Évolutions diverses
|
||||||
- v2026.5.17 : popup user-badge avec ligne session (MM:SS), couleur selon seuil
|
- 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.18 : dock pastilles popups épinglés avec couleur catégorie
|
||||||
- v2026.5.19 : drag popup épinglé
|
- v2026.5.19 : drag popup épinglé
|
||||||
@@ -642,12 +722,12 @@ Une intervention terminée par le tech mais dont la fiche était passée en stat
|
|||||||
> - Présence de `openPersistentTimelinePopup` → version >= v4.2.3
|
> - Présence de `openPersistentTimelinePopup` → version >= v4.2.3
|
||||||
> - Commentaires `// vX.Y.Z` au-dessus des fonctions = version d'introduction
|
> - Commentaires `// vX.Y.Z` au-dessus des fonctions = version d'introduction
|
||||||
|
|
||||||
### v5.0.0 — Refonte topbar (horloge, menu admin)
|
### v5.0.0 : Refonte topbar (horloge, menu admin)
|
||||||
- initAppClock : horloge HH:MM au milieu topbar
|
- initAppClock : horloge HH:MM au milieu topbar
|
||||||
- initAdminMenu : menu admin caché (5 clics sur titre)
|
- initAdminMenu : menu admin caché (5 clics sur titre)
|
||||||
- initSessionTimer : compteur de session EV (tick 1s)
|
- initSessionTimer : compteur de session EV (tick 1s)
|
||||||
|
|
||||||
### v4.x — Fonctions tooltip avancées
|
### v4.x : Fonctions tooltip avancées
|
||||||
- v4.1.12 : moveTooltip devenu no-op (popup statique)
|
- v4.1.12 : moveTooltip devenu no-op (popup statique)
|
||||||
- v4.1.15 : pendant épinglage, ne pas remplacer contenu sur hover autre iv
|
- 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 : grande popup timeline persistante (clic), suit-souris (hover)
|
||||||
@@ -658,7 +738,7 @@ Une intervention terminée par le tech mais dont la fiche était passée en stat
|
|||||||
- v4.3.0 : tooltip live libéré après épinglage (réutilisable autres survols)
|
- v4.3.0 : tooltip live libéré après épinglage (réutilisable autres survols)
|
||||||
- v4.3.3 : _softUnpinPopup (désépinglage mou)
|
- v4.3.3 : _softUnpinPopup (désépinglage mou)
|
||||||
|
|
||||||
### v3.x et antérieures — Versions de base
|
### v3.x et antérieures : Versions de base
|
||||||
- Code historique consultable via les tags git correspondants.
|
- Code historique consultable via les tags git correspondants.
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -679,6 +759,6 @@ Une intervention terminée par le tech mais dont la fiche était passée en stat
|
|||||||
|
|
||||||
## Auteur
|
## Auteur
|
||||||
|
|
||||||
**FroSteel** (FRS)
|
**Quentin Rouiller**
|
||||||
Technicien DGNSI — Canton de Vaud
|
Technicien DGNSI, Canton de Vaud
|
||||||
Contact : voir [page wiki Contact](https://gitea.netaplaid.ch/FroSteel/Planification/wiki/Contact)
|
Contact : voir [page wiki Contact](https://gitea.netaplaid.ch/FroSteel/Planification/wiki/Contact)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2026 FroSteel
|
Copyright (c) 2026 Quentin Rouiller
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
@@ -1,245 +1,39 @@
|
|||||||
# Planification — Extension EasyVista Canton de Vaud
|
# Planification
|
||||||
|
|
||||||
Extension Chrome / Firefox pour visualiser de manière claire et rapide le planning EasyVista de l'équipe technicienne DGNSI (Canton de Vaud).
|
Extension Firefox et Chrome pour les coordinateurs de la DGNSI (Canton de Vaud). Elle affiche le planning EasyVista de l'équipe technicienne : une carte par technicien, une frise horaire, les absences et les conflits en couleur.
|
||||||
|
|
||||||
> 📖 **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))
|
**Version publiée : [2026.5.50](https://gitea.netaplaid.ch/FroSteel/Planification/releases/tag/v2026.5.50)** · [Documentation](https://gitea.netaplaid.ch/FroSteel/Planification/wiki) · [Signaler un problème](https://gitea.netaplaid.ch/FroSteel/Planification/issues/new)
|
||||||
|
|
||||||
## Aperçu rapide
|
## Installation
|
||||||
|
|
||||||
- **Auteur** : FroSteel (FRS), Technicien DGNSI — Canton de Vaud
|
- **Firefox 140 ou supérieur** : installer le fichier `.xpi` de la [dernière publication](https://gitea.netaplaid.ch/FroSteel/Planification/releases/latest). Mozilla signe ce fichier et Firefox applique les mises à jour de lui-même.
|
||||||
- **Public cible** : coordinateurs DGNSI qui pilotent dans EasyVista (`itsma.etat-de-vaud.ch` / `itsma.vd.ch`) le planning de l'équipe technicienne
|
- **Chrome et Edge** : extraire le `.zip` de la dernière publication dans un dossier permanent, puis le charger comme extension non empaquetée (mode développeur). Les mises à jour se font à la main.
|
||||||
- **Démarrage projet** : jeudi 16 avril 2026
|
|
||||||
- **Version actuelle** : [`v2026.5.47`](https://gitea.netaplaid.ch/FroSteel/Planification/releases/tag/v2026.5.47) (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`
|
|
||||||
|
|
||||||
## Installation rapide
|
Le pas à pas, le choix de l'équipe et la synchronisation entre postes sont décrits dans la page [Installation](https://gitea.netaplaid.ch/FroSteel/Planification/wiki/Installation) du wiki.
|
||||||
|
|
||||||
### Firefox 🦊 (recommandé — auto-update)
|
## Documentation
|
||||||
|
|
||||||
1. Télécharger le `.xpi` signé depuis la **[release courante](https://gitea.netaplaid.ch/FroSteel/Planification/releases/latest)**.
|
| Page | Contenu |
|
||||||
2. Drag-and-drop dans `about:addons` de Firefox.
|
|---|---|
|
||||||
3. Cliquer "Ajouter".
|
| [Installation](https://gitea.netaplaid.ch/FroSteel/Planification/wiki/Installation) | Firefox, Chrome et Edge, premier réglage, synchronisation entre postes |
|
||||||
|
| [Utilisation](https://gitea.netaplaid.ch/FroSteel/Planification/wiki/Utilisation) | Lire le planning, déplacer une intervention, rechercher, emails |
|
||||||
À partir de là, l'extension se met à jour **automatiquement** à chaque nouvelle version (vérification toutes les ~24 h via `firefox-updates.json`).
|
| [Réglages](https://gitea.netaplaid.ch/FroSteel/Planification/wiki/R%C3%A9glages) | Chaque onglet des Paramètres |
|
||||||
|
| [Dépannage](https://gitea.netaplaid.ch/FroSteel/Planification/wiki/D%C3%A9pannage) | Problèmes connus et marche à suivre |
|
||||||
### Chrome / Edge / Brave 🌐 (manuel)
|
| [Versions](https://gitea.netaplaid.ch/FroSteel/Planification/wiki/Versions) | Ce que change chaque version |
|
||||||
|
| [Architecture](https://gitea.netaplaid.ch/FroSteel/Planification/wiki/Architecture) | Structure du code, données stockées, réseau, publication |
|
||||||
1. Télécharger le `.zip` depuis la **[release courante](https://gitea.netaplaid.ch/FroSteel/Planification/releases/latest)**.
|
|
||||||
2. Décompresser dans un dossier permanent.
|
|
||||||
3. `chrome://extensions/` (ou `edge://extensions/`) → activer **Mode développeur** → "Charger l'extension non empaquetée" → sélectionner le dossier décompressé.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
➡ 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).
|
|
||||||
|
|
||||||
## Fonctionnalités principales
|
|
||||||
|
|
||||||
### Vue planning
|
|
||||||
- Affichage des interventions et réservations groupées par technicien
|
|
||||||
- Horaires, contact, lieu, catégorie, statut visibles d'un coup d'œil
|
|
||||||
- Équipe configurable depuis le panel admin (détection automatique via EasyVista)
|
|
||||||
- Cache local pour réduire les requêtes serveur
|
|
||||||
|
|
||||||
### Modes d'affichage
|
|
||||||
- **Vue classique** (depuis v1.0.0) : cards en grille, mode compact écran 24" (depuis v2026.5.30)
|
|
||||||
- **Vue horizontale** (depuis v2026.5.32) : timeline par tech, sidebar verticale (depuis v2026.5.36)
|
|
||||||
- Depuis v2026.5.40 : barre couleur catégorie + référence + ville sur chaque segment timeline
|
|
||||||
- **Vue horizontale « échelle de temps exacte » (depuis v2026.5.46)** : option Paramètres → Apparence — chaque intervention est posée à son heure réelle sur une bande continue (règle des heures fixe, lignes d'heures et demi-heures sur toute la hauteur, ligne rouge « maintenant », chevauchements empilés, poignée de déplacement colorée, zones libres survolables et cibles de drop précises)
|
|
||||||
- Toggle Vue classique ↔ Vue horizontale via bouton ⊞ dans popup user-badge
|
|
||||||
- Persistance localStorage (`view_mode`)
|
|
||||||
|
|
||||||
### Tooltips et popups
|
|
||||||
- Tooltips au survol (hover) sur chaque intervention
|
|
||||||
- Popups épinglables (📌) pour garder ouvert (depuis v4.1.3)
|
|
||||||
- Popups timeline persistantes au clic (depuis v4.2.3)
|
|
||||||
- Drag-and-drop des popups épinglés (depuis v2026.5.19)
|
|
||||||
- Safe area : popups jamais cachés sous topbar/dock (depuis v2026.5.20)
|
|
||||||
- Position auto adaptative (4 candidats : droite/gauche/dessous/dessus)
|
|
||||||
|
|
||||||
### Classification des absences (depuis v2026.5.27)
|
|
||||||
- **Maladie/Accident** : indigo `#4338ca`
|
|
||||||
- **Congé / Congés** : cyan `#06b6d4` (suffixe `s` adaptatif)
|
|
||||||
- **Pompier** : rouge `#b03030`
|
|
||||||
- Badge + barre gauche colorée + dégradé fond
|
|
||||||
- Absences récurrentes (configurées par tech) : cyan (depuis v2026.5.30)
|
|
||||||
|
|
||||||
### User et session
|
|
||||||
- Badge user avec photo/initiales en topbar
|
|
||||||
- Badge cliquable (depuis v2026.5.26) : popup avec ⚙ Paramètres + ⊞ Vue + compteur session MM:SS
|
|
||||||
- Retry automatique en cas d'échec fetch user (60s, max 10 essais)
|
|
||||||
- Compteur de session EasyVista (tick 1s, depuis v5.0.0) — recalé sur la vraie valeur serveur (depuis v2026.5.46)
|
|
||||||
- Reconnexion automatique
|
|
||||||
- Détection de session fiabilisée (v2026.5.46) : plus de faux « déconnecté » (cookie réécrit, erreurs transitoires, onglet EV facultatif avec la permission cookies)
|
|
||||||
|
|
||||||
### Admin et configuration
|
|
||||||
- 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)
|
|
||||||
- **Personnalisation Apparence (depuis v2026.5.44)** : couleur de la topbar (12 presets + custom + hex) avec contraste auto-calculé sur le texte ; 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
|
|
||||||
- **Onboarding équipe (depuis v2026.5.44)** : carte centrée propre quand aucun tech n'est sélectionné, avec bouton « Ouvrir paramètres » qui dépose directement sur la section Équipe
|
|
||||||
- **Statuts EV configurables (depuis v2026.5.44)** : clos / résolu / annulé / suspendu éditables depuis Paramètres → EasyVista, matching insensible à la casse / accents / conjugaisons
|
|
||||||
|
|
||||||
## Versionning — historique et conventions
|
|
||||||
|
|
||||||
L'extension a connu **3 systèmes de versionning successifs** :
|
|
||||||
|
|
||||||
| Période | Format | Exemple |
|
|
||||||
|---|---|---|
|
|
||||||
| 16-17 avril 2026 | Versions de base | `1.0.0`, `2.0.0`, `3.0.0` |
|
|
||||||
| 18-20 avril 2026 | SemVer classique | `4.1.3`, `4.2.8`, `5.0.12` |
|
|
||||||
| 21 avril 2026 → maintenant | **`ANNÉE.MAJEURE.PATCH`** | `2026.5.16` → `2026.5.45` |
|
|
||||||
|
|
||||||
### Format actuel : `ANNÉE.MAJEURE.PATCH`
|
|
||||||
|
|
||||||
À partir de la **v2026.5.16** (21 avril 2026), l'extension utilise le schéma suivant :
|
|
||||||
|
|
||||||
| 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) |
|
|
||||||
| `40` | **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.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.46` (latest, 9 juillet 2026) — Couche données v2, vue « échelle de temps exacte », session fiabilisée, réservations partagées
|
|
||||||
|
|
||||||
- Refonte complète de la couche données : store unifié par jour, un seul verdict par intervention, synchronisation du dossier partagé en sous-dossier v2
|
|
||||||
- Nouvelle disposition « échelle de temps exacte » pour la vue horizontale (option Apparence)
|
|
||||||
- Fin des faux « déconnecté » EasyVista (cookies, erreurs transitoires, contre-vérification serveur)
|
|
||||||
- Les informations des réservations (n°, lieu, catégorie) sont partagées entre tous les postes
|
|
||||||
- Douchette : vraie confirmation EasyVista + resynchronisation automatique après déplacement
|
|
||||||
- Recherche : opérateurs, pagination, mise en avant stabilisée
|
|
||||||
- Le script PowerShell du dossier partagé est publié et téléchargeable depuis Paramètres → Dossier partagé
|
|
||||||
|
|
||||||
### `v2026.5.45` (8 mai 2026) — Dock latéral drag&drop, fix verdicts ghost, multi-onglets EZV résolu
|
|
||||||
- **Dock latéral drag&drop** : nouvelle zone à droite pour parquer des interventions et les redéposer plus tard, avec apparition graduelle (peep-min/peep/expanded), délai 500 ms pour expand/collapse anti-flicker, card compacte (réf + durée + barre catégorie 4 px à gauche), bouton de retrait par appui long 2 s.
|
|
||||||
- **Verdicts ghost** : fix critique du parser de fiche (les dates d’action ne sont plus cherchées aux indices fixes \`[8]\`/\`[9]\` mais détectées par scan regex pattern \`DD/MM/YYYY HH:MM:SS\`). Décorrélation des « Logs verbeux » et « Garder les disparitions » dans Paramètres → Diagnostics.
|
|
||||||
- **Drag&drop bloqué** sur les interventions « Fait » (gris), « Clos » (vert ✓✓), statut Clôturé/Résolu/Terminé, et pendant l’analyse de disparition d’un ghost.
|
|
||||||
- **Issue #3** : coches « Absences récurrentes » retenues (merge propre au lieu d’écrasement) lors d’un changement de groupe.
|
|
||||||
- **Issue #4** : multi-onglets EZV — permission optionnelle \`cookies\` + listener \`cookieChanged\`, la session reste valable après reconnexion + fermeture d’un onglet EZV.
|
|
||||||
- **Issue #5** : copie de référence dans une popup épinglée fonctionne.
|
|
||||||
- **Issue #6** : popup épinglée passe au premier plan au clic.
|
|
||||||
- **Issue #7** : plus de notification « +2 min » fantôme après prolongation.
|
|
||||||
- **Issue #8** : pompier absent toute la journée n’est plus compté.
|
|
||||||
- **Auto-fermeture** des popups dépinglés quand la souris quitte leur zone et celle des cards liées.
|
|
||||||
- **Tooltip / contact nettoyé** : les labels « fiche » (Étage/Bureau/Service/etc.) collés à la valeur du contact sont retirés.
|
|
||||||
|
|
||||||
### `v2026.5.44` (1 mai 2026) — Refonte topbar, personnalisation Apparence, onboarding équipe, fix #1
|
|
||||||
- **Topbar refondue (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 dans un cadre encadré.
|
|
||||||
- **Personnalisation Apparence** : couleur de la barre du haut (12 presets + picker custom + champ hex), contraste de texte calculé automatiquement par luminance ; police de l'application avec 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.
|
|
||||||
- **Vue horizontale** : bloc Aujourd'hui + horloge dans le même cadre que la classique, barre verte verticale à droite des mini-cards clos/résolu, sidebar adopte la couleur de topbar custom de manière cohérente.
|
|
||||||
- **Stats globales** : nouveau compteur « X faits / Y clos » ; vue classique avec « // » après clos, vue horizontale avec barre horizontale 1px de séparation.
|
|
||||||
- **Onboarding équipe** : carte centrée propre (icône, titre, description, bouton « Ouvrir paramètres ») au lieu du bandeau d'erreur ; le bouton ouvre directement la section Équipe.
|
|
||||||
- **Refresh / cache / verdicts ghost** : rafraîchissement séquentiel avec arrêt instantané (AbortController), checksum frais via basicAutoComplete + redirectHeader, cache merge robuste, verdicts unifiés (✓✓ clos, ✓ Fait, ✓ Suspendu jaune, retrait silencieux pour cancelled), mode diagnostic optionnel.
|
|
||||||
- **Issue #1 (Pompier + Absence)** : les deux badges s'affichent désormais avec un séparateur `/` au lieu de masquer l'absence.
|
|
||||||
- **Bugfix divers** : absences récurrentes restaurées au switch de groupe, barre de progression / bannière session expirée suivent la hauteur dynamique de la topbar (`--topbar-height` via `ResizeObserver`), description action décodée proprement, flèche `↗` retirée des références cliquables.
|
|
||||||
|
|
||||||
### `v2026.5.43` (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
|
## Développement
|
||||||
|
|
||||||
|
Le code est du JavaScript sans framework ni bundler, dans `src/`. Le script `build.sh` (bash, python3, zip) produit les paquets Chromium et Firefox dans `dist/`.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://gitea.netaplaid.ch/FroSteel/Planification.git
|
git clone https://gitea.netaplaid.ch/FroSteel/Planification.git
|
||||||
cd Planification
|
cd Planification
|
||||||
|
|
||||||
# Modifier les sources dans src/
|
|
||||||
# Bumper src/manifest.json + entrée CHANGELOG.md
|
|
||||||
./build.sh
|
./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),
|
L'historique détaillé des versions se trouve dans [CHANGELOG.md](CHANGELOG.md).
|
||||||
remplacer l'asset `.xpi` de la release Gitea, puis mettre à jour le sha256
|
|
||||||
de cette version dans `firefox-updates.json`.
|
|
||||||
|
|
||||||
## Licence
|
## Licence et auteur
|
||||||
|
|
||||||
[MIT License](LICENSE) — Copyright (c) 2026 FroSteel
|
Code publié sous licence [MIT](LICENSE). Auteur : Quentin Rouiller, technicien DGNSI, Canton de Vaud.
|
||||||
|
|
||||||
## Auteur
|
|
||||||
|
|
||||||
**FroSteel** (FRS)
|
|
||||||
Technicien DGNSI — Canton de Vaud
|
|
||||||
Contact : voir [page wiki Contact](https://gitea.netaplaid.ch/FroSteel/Planification/wiki/Contact)
|
|
||||||
|
|||||||
+16
-1
@@ -2,10 +2,25 @@
|
|||||||
"addons": {
|
"addons": {
|
||||||
"[email protected]": {
|
"[email protected]": {
|
||||||
"updates": [
|
"updates": [
|
||||||
|
{
|
||||||
|
"version": "2026.5.50",
|
||||||
|
"update_link": "https://gitea.netaplaid.ch/FroSteel/Planification/releases/download/v2026.5.50/planification-v2026.5.50-firefox.xpi",
|
||||||
|
"update_hash": "sha256:314ae3cba7e31d1f6eb89c419a666d49d156cd78a83c116de03f5e48b8a094df"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "2026.5.49",
|
||||||
|
"update_link": "https://gitea.netaplaid.ch/FroSteel/Planification/releases/download/v2026.5.49/planification-v2026.5.49-firefox.xpi",
|
||||||
|
"update_hash": "sha256:73ac4e44e9fdfb1c3c179c7cc5d2e497b5cf27d207947cc559ab620bddd09fa1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "2026.5.48",
|
||||||
|
"update_link": "https://gitea.netaplaid.ch/FroSteel/Planification/releases/download/v2026.5.48/planification-v2026.5.48-firefox.xpi",
|
||||||
|
"update_hash": "sha256:be687aa2795649d7f1f9883f3384365bd224e0ab94987ff852b0901f5554a51a"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"version": "2026.5.47",
|
"version": "2026.5.47",
|
||||||
"update_link": "https://gitea.netaplaid.ch/FroSteel/Planification/releases/download/v2026.5.47/planification-v2026.5.47-firefox.xpi",
|
"update_link": "https://gitea.netaplaid.ch/FroSteel/Planification/releases/download/v2026.5.47/planification-v2026.5.47-firefox.xpi",
|
||||||
"update_hash": "sha256:e97883102af2f00fd468c9be62deac6c1d2546ef3e25afe90d79a390bbd1f0bb"
|
"update_hash": "sha256:0418062357b7c29bdd7a01b6d6e06eeb20e2ee419c67684a84855862af113cc2"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"version": "2026.5.46",
|
"version": "2026.5.46",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# Planification - native messaging host // 2026.1.4 - FRS
|
# Planification - native messaging host // 2026.1.4 - FRS
|
||||||
# Developpe par FroSteel (FRS) - DGNSI, Canton de Vaud.
|
# Developpe par Quentin (FRS) - DGNSI, Canton de Vaud.
|
||||||
# Licence MIT - voir le fichier LICENSE.
|
# Licence MIT - voir le fichier LICENSE.
|
||||||
#
|
#
|
||||||
# Pont entre l'extension et un dossier reseau partage pour le cache du planning.
|
# Pont entre l'extension et un dossier reseau partage pour le cache du planning.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# Planification - gestionnaire graphique du helper de sync. // 2026.1.5 - FRS
|
# Planification - gestionnaire graphique du helper de sync. // 2026.1.5 - FRS
|
||||||
# Developpe par FroSteel (FRS) - DGNSI, Canton de Vaud.
|
# Developpe par Quentin (FRS) - DGNSI, Canton de Vaud.
|
||||||
# Licence MIT - voir le fichier LICENSE.
|
# Licence MIT - voir le fichier LICENSE.
|
||||||
#
|
#
|
||||||
# Fenetre avec : Installer / Mettre a jour, Reparer, Desinstaller.
|
# Fenetre avec : Installer / Mettre a jour, Reparer, Desinstaller.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# Planification - icone barre des taches (best-effort, optionnel) // 2026.1.4 - FRS
|
# Planification - icone barre des taches (best-effort, optionnel) // 2026.1.4 - FRS
|
||||||
# Developpe par FroSteel (FRS) - DGNSI, Canton de Vaud.
|
# Developpe par Quentin (FRS) - DGNSI, Canton de Vaud.
|
||||||
# Licence MIT - voir le fichier LICENSE.
|
# Licence MIT - voir le fichier LICENSE.
|
||||||
#
|
#
|
||||||
# Indique que le helper de sync est installe. Clic / menu -> fenetre du journal
|
# Indique que le helper de sync est installe. Clic / menu -> fenetre du journal
|
||||||
|
|||||||
+8
-8
@@ -4,13 +4,13 @@
|
|||||||
* Service worker (Manifest V3) : récupération session EV, fetch planning XML,
|
* Service worker (Manifest V3) : récupération session EV, fetch planning XML,
|
||||||
* fetch fiches détaillées, gestion cache.
|
* fetch fiches détaillées, gestion cache.
|
||||||
*
|
*
|
||||||
* Copyright (c) 2026 FroSteel
|
* Copyright (c) 2026 Quentin
|
||||||
* Licensed under the MIT License — see LICENSE file in the project root.
|
* Licensed under the MIT License — see LICENSE file in the project root.
|
||||||
*
|
*
|
||||||
* @author FroSteel
|
* @author Quentin
|
||||||
* @repository https://gitea.netaplaid.ch/FroSteel/Planification
|
* @repository https://gitea.netaplaid.ch/FroSteel/Planification
|
||||||
*
|
*
|
||||||
* Développé par FroSteel (FRS) — DGNSI, Canton de Vaud. Licence MIT.
|
* Développé par Quentin (FRS) — DGNSI, Canton de Vaud. Licence MIT.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// background.js — Service worker (Manifest V3) — v4
|
// background.js — Service worker (Manifest V3) — v4
|
||||||
@@ -262,7 +262,7 @@ chrome.action.onClicked.addListener(async () => {
|
|||||||
* dans l'URL des onglets historiques après un relog. Sinon, fallback sur
|
* dans l'URL des onglets historiques après un relog. Sinon, fallback sur
|
||||||
* l'ancienne logique URL (compat sans la permission).
|
* l'ancienne logique URL (compat sans la permission).
|
||||||
*
|
*
|
||||||
* @author FroSteel
|
* @author Quentin
|
||||||
*/
|
*/
|
||||||
async function _hasCookiesPermission() {
|
async function _hasCookiesPermission() {
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
@@ -423,7 +423,7 @@ async function findEasyVistaSession() {
|
|||||||
* Ce n'est PAS le HTML de la page Planning — le serveur ne rend pas les données
|
* Ce n'est PAS le HTML de la page Planning — le serveur ne rend pas les données
|
||||||
* dans le HTML, elles arrivent via cet endpoint AJAX.
|
* dans le HTML, elles arrivent via cet endpoint AJAX.
|
||||||
*
|
*
|
||||||
* @author FroSteel
|
* @author Quentin
|
||||||
*/
|
*/
|
||||||
async function fetchPlanningXml(origin, phpsessid, unixDate) {
|
async function fetchPlanningXml(origin, phpsessid, unixDate) {
|
||||||
// v2026.5.41 : groupId vient de admin_config (défaut SI-CSS).
|
// v2026.5.41 : groupId vient de admin_config (défaut SI-CSS).
|
||||||
@@ -781,7 +781,7 @@ async function extendSessionKeepAlive(origin, phpsessid) {
|
|||||||
* @param {boolean} force - si true, ignore le cache et refait le test
|
* @param {boolean} force - si true, ignore le cache et refait le test
|
||||||
* @returns {Promise<"internal"|"external">}
|
* @returns {Promise<"internal"|"external">}
|
||||||
*
|
*
|
||||||
* @author FroSteel
|
* @author Quentin
|
||||||
*/
|
*/
|
||||||
async function detectNetworkContext(force = false) {
|
async function detectNetworkContext(force = false) {
|
||||||
const CACHE_KEY = "network_context_v2"; // v5.0.12 : nouvelle clé pour invalider le cache fautif v5.0.11
|
const CACHE_KEY = "network_context_v2"; // v5.0.12 : nouvelle clé pour invalider le cache fautif v5.0.11
|
||||||
@@ -921,7 +921,7 @@ function watchReconnectTabForIamLogin(tabId) {
|
|||||||
* Retourne { name: "Nom Prénom" | null, login: "..." | null } ou null si
|
* Retourne { name: "Nom Prénom" | null, login: "..." | null } ou null si
|
||||||
* tout a échoué.
|
* tout a échoué.
|
||||||
*
|
*
|
||||||
* @author FroSteel
|
* @author Quentin
|
||||||
*/
|
*/
|
||||||
async function fetchCurrentUser(origin, phpsessid) {
|
async function fetchCurrentUser(origin, phpsessid) {
|
||||||
const url = `${origin}/index.php?PHPSESSID=${encodeURIComponent(phpsessid)}`;
|
const url = `${origin}/index.php?PHPSESSID=${encodeURIComponent(phpsessid)}`;
|
||||||
@@ -1306,7 +1306,7 @@ async function deletePlanningItem(origin, phpsessid, actionId, kind) {
|
|||||||
* Retourne { groups: [{id, name}, ...] }. Liste vide si le fetch échoue ou
|
* Retourne { groups: [{id, name}, ...] }. Liste vide si le fetch échoue ou
|
||||||
* si EV renvoie une page de login / redirection JS.
|
* si EV renvoie une page de login / redirection JS.
|
||||||
*
|
*
|
||||||
* @author FroSteel
|
* @author Quentin
|
||||||
*/
|
*/
|
||||||
async function detectGroupsFromEV(origin, phpsessid) {
|
async function detectGroupsFromEV(origin, phpsessid) {
|
||||||
const url = `${origin}/index.php?eventName=HelpDesk_PlanningItem&PHPSESSID=${encodeURIComponent(phpsessid)}`;
|
const url = `${origin}/index.php?eventName=HelpDesk_PlanningItem&PHPSESSID=${encodeURIComponent(phpsessid)}`;
|
||||||
|
|||||||
+2
-2
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"manifest_version": 3,
|
"manifest_version": 3,
|
||||||
"name": "Planification",
|
"name": "Planification",
|
||||||
"version": "2026.5.47",
|
"version": "2026.5.50",
|
||||||
"description": "Vue claire et rapide du planning des techniciens EasyVista. Développé par FroSteel — DGNSI, Canton de Vaud.",
|
"description": "Vue claire et rapide du planning des techniciens EasyVista. Développé par Quentin — DGNSI, Canton de Vaud.",
|
||||||
"key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl/El4I9gxcZkp5bnheg4ZBCKxckRLt9xQ5x+i6phEPYlydl6NapWlkbOyycUaeTZcpoEh/tKQnpMpoEc5jY8zCoRTwh/vfejVBZE6ANDG/dc3iix/1Z8OhRI4zMaRYQ+DQTjS5Q6l6wkcwzbQB85HZNhke/k1qIW6RCuBjeJYmES5WVDwzfCNVvaF6uQvdOCpLjrA3+LI6vUBEwaMg1hM42mC3dU0z9p7qzAby/dH3XpZD9HTFXLJL9/1zryN9rXNDpvZwYWnJ0hLTu5tfmURkvgKOwquX1KJy9vupmhUALRtS08Fplx/e3kUH3LD+coS1ExLwoOZ+1ORBUE9JCB8wIDAQAB",
|
"key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl/El4I9gxcZkp5bnheg4ZBCKxckRLt9xQ5x+i6phEPYlydl6NapWlkbOyycUaeTZcpoEh/tKQnpMpoEc5jY8zCoRTwh/vfejVBZE6ANDG/dc3iix/1Z8OhRI4zMaRYQ+DQTjS5Q6l6wkcwzbQB85HZNhke/k1qIW6RCuBjeJYmES5WVDwzfCNVvaF6uQvdOCpLjrA3+LI6vUBEwaMg1hM42mC3dU0z9p7qzAby/dH3XpZD9HTFXLJL9/1zryN9rXNDpvZwYWnJ0hLTu5tfmURkvgKOwquX1KJy9vupmhUALRtS08Fplx/e3kUH3LD+coS1ExLwoOZ+1ORBUE9JCB8wIDAQAB",
|
||||||
"permissions": [
|
"permissions": [
|
||||||
"activeTab",
|
"activeTab",
|
||||||
|
|||||||
+242
-28
@@ -1,10 +1,10 @@
|
|||||||
/**
|
/**
|
||||||
* Planification — Extension navigateur EasyVista (Canton de Vaud / DGNSI)
|
* Planification — Extension navigateur EasyVista (Canton de Vaud / DGNSI)
|
||||||
*
|
*
|
||||||
* Copyright (c) 2026 FroSteel
|
* Copyright (c) 2026 Quentin
|
||||||
* Licensed under the MIT License — see LICENSE file in the project root.
|
* Licensed under the MIT License — see LICENSE file in the project root.
|
||||||
*
|
*
|
||||||
* @author FroSteel
|
* @author Quentin
|
||||||
* @repository https://gitea.netaplaid.ch/FroSteel/Planification
|
* @repository https://gitea.netaplaid.ch/FroSteel/Planification
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -64,6 +64,22 @@
|
|||||||
|
|
||||||
--shadow: 0 1px 3px rgba(20, 30, 50, 0.06), 0 1px 2px rgba(20, 30, 50, 0.04);
|
--shadow: 0 1px 3px rgba(20, 30, 50, 0.06), 0 1px 2px rgba(20, 30, 50, 0.04);
|
||||||
--shadow-hover: 0 2px 8px rgba(20, 30, 50, 0.08);
|
--shadow-hover: 0 2px 8px rgba(20, 30, 50, 0.08);
|
||||||
|
/* v2026.5.49 — relief des interventions : elles se posent en surface
|
||||||
|
claire (--bg-elevated) sur le corps de carte, qui recule (--iv-canvas).
|
||||||
|
Ombre un cran au-dessus de --shadow (qui porte les cartes elles-mêmes)
|
||||||
|
pour que la hiérarchie carte < intervention se voie sans devenir
|
||||||
|
tape-à-l'oeil. --iv-canvas est un gris un peu plus soutenu que
|
||||||
|
--bg-muted : sur du blanc, l'écart de --bg-muted se voyait à peine. */
|
||||||
|
--iv-canvas: #eaecf1;
|
||||||
|
--iv-relief: 0 1px 2px rgba(20, 30, 50, 0.10), 0 2px 5px rgba(20, 30, 50, 0.07);
|
||||||
|
/* v2026.5.49 — fond des plages LIBRES (pauses affichées, créneaux du mode
|
||||||
|
heure exacte). HACHURES claires plutôt qu'un voile uni : un aplat
|
||||||
|
légèrement plus clair se voyait à peine, et monter son contraste le
|
||||||
|
rapprochait des tuiles d'intervention. Le rayé reprend le langage des
|
||||||
|
trous de la timeline (45°) — impossible à confondre avec une surface
|
||||||
|
pleine, et lisible de loin. */
|
||||||
|
--iv-libre: repeating-linear-gradient(45deg,
|
||||||
|
var(--bg-elevated) 0 7px, var(--iv-canvas) 7px 14px);
|
||||||
--radius: 8px;
|
--radius: 8px;
|
||||||
--font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", sans-serif;
|
--font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", sans-serif;
|
||||||
--mono: ui-monospace, SFMono-Regular, "SF Mono", Consolas, "Liberation Mono", monospace;
|
--mono: ui-monospace, SFMono-Regular, "SF Mono", Consolas, "Liberation Mono", monospace;
|
||||||
@@ -112,6 +128,16 @@
|
|||||||
|
|
||||||
--shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
|
--shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
|
||||||
--shadow-hover: 0 2px 10px rgba(0, 0, 0, 0.4);
|
--shadow-hover: 0 2px 10px rgba(0, 0, 0, 0.4);
|
||||||
|
/* v2026.5.49 — sur fond sombre l'ombre porte moins : elle est plus dense
|
||||||
|
et c'est surtout l'écart de clarté (corps --iv-canvas / intervention
|
||||||
|
--bg-elevated #21242b) qui fait le relief. */
|
||||||
|
--iv-canvas: #191c21;
|
||||||
|
--iv-relief: 0 1px 2px rgba(0, 0, 0, 0.45), 0 2px 6px rgba(0, 0, 0, 0.30);
|
||||||
|
/* v2026.5.49 — en sombre, éclaircir veut dire monter vers la lumière :
|
||||||
|
les hachures partent de --bg-hover, sinon elles se confondaient avec le
|
||||||
|
fond. */
|
||||||
|
--iv-libre: repeating-linear-gradient(45deg,
|
||||||
|
var(--bg-hover) 0 7px, var(--iv-canvas) 7px 14px);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ==========================================================================
|
/* ==========================================================================
|
||||||
@@ -1204,7 +1230,11 @@ html.view-horizontal .session-needed {
|
|||||||
border: 1px solid var(--border);
|
border: 1px solid var(--border);
|
||||||
border-radius: var(--radius);
|
border-radius: var(--radius);
|
||||||
box-shadow: var(--shadow);
|
box-shadow: var(--shadow);
|
||||||
overflow: hidden;
|
/* v2026.5.49 — `clip` au lieu de `hidden` : coupe le débordement (coins
|
||||||
|
arrondis) SANS créer de conteneur de défilement, sinon l'en-tête sticky
|
||||||
|
(ci-dessous) se collerait à la carte au lieu de la fenêtre (même piège que
|
||||||
|
body { overflow-x: clip }). */
|
||||||
|
overflow: clip;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
@@ -1219,6 +1249,40 @@ html.view-horizontal .session-needed {
|
|||||||
gap: 10px;
|
gap: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* v2026.5.49 — VUE CLASSIQUE : l'en-tête de carte (nom du tech + badges)
|
||||||
|
suit le scroll et reste collé sous l'empilement du haut (topbar + bandeaux
|
||||||
|
session + ligne stats/recherche), tant que sa carte est à l'écran. Sinon le
|
||||||
|
nom disparaissait dès qu'on scrollait une carte haute. Même offset que la
|
||||||
|
barre de progression (--stack-top + --topline-h, mesurés en JS). En vue
|
||||||
|
horizontale, l'en-tête fait partie de la ligne : pas de sticky. */
|
||||||
|
html:not(.view-horizontal) .card-header {
|
||||||
|
position: sticky;
|
||||||
|
/* v2026.5.49 — pendant un rafraîchissement, la barre de progression est
|
||||||
|
sticky au MÊME offset (--stack-top + --topline-h) avec un z-index supérieur :
|
||||||
|
elle recouvrait le nom du tech collé quand on avait scrollé. On ajoute donc
|
||||||
|
--progress-h (hauteur réelle de la barre, mesurée en JS ; 0 hors refresh)
|
||||||
|
pour caler l'en-tête JUSTE SOUS la barre. */
|
||||||
|
top: calc(var(--stack-top, 56px) + var(--topline-h, 0px) + var(--progress-h, 0px));
|
||||||
|
/* au-dessus du contenu de la frise qui défile dessous (slot hover z2, midi
|
||||||
|
z3, trou survolé z6) ; reste sous la banderole session (z8) et la barre de
|
||||||
|
progression (z9), qui sont dans un autre contexte d'empilement. */
|
||||||
|
z-index: 7;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* v2026.5.49 — VUE CLASSIQUE : la frise horaire (.timeline) reste collée JUSTE
|
||||||
|
SOUS l'en-tête du tech quand on scrolle, tant que la carte est à l'écran —
|
||||||
|
pour garder le repère horaire ET le total d'interventions visibles (le total
|
||||||
|
vit dans l'en-tête .tech-row-stats, déjà collant). Elle se cale sous l'en-tête
|
||||||
|
via --card-header-h (hauteur RÉELLE de l'en-tête de CETTE carte, mesurée en JS
|
||||||
|
car un nom long fait 2-3 lignes). Fond opaque (--bg-muted) : le contenu défile
|
||||||
|
dessous sans transparence. z-index 6 : sous l'en-tête (7), au-dessus du corps
|
||||||
|
qui défile. */
|
||||||
|
html:not(.view-horizontal) .card-body > .timeline {
|
||||||
|
position: sticky;
|
||||||
|
top: calc(var(--stack-top, 56px) + var(--topline-h, 0px) + var(--progress-h, 0px) + var(--card-header-h, 0px));
|
||||||
|
z-index: 6;
|
||||||
|
}
|
||||||
|
|
||||||
.card-tech-name {
|
.card-tech-name {
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
@@ -1276,6 +1340,41 @@ html.view-horizontal .session-needed {
|
|||||||
.card-body {
|
.card-body {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
/* v2026.5.49 — le corps de la carte RECULE (fond en retrait) pour que
|
||||||
|
les interventions posées dessus ressortent. Avant, corps et interventions
|
||||||
|
partageaient le même blanc : tout le contenu se lisait comme un seul
|
||||||
|
aplat, séparé par des filets de 1 px. */
|
||||||
|
background: var(--iv-canvas);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* v2026.5.49 — vue classique, option « Afficher les pauses » ACTIVE : les
|
||||||
|
plages libres REMPLISSENT le vide de la carte au lieu de rester des bandes
|
||||||
|
de 44 px suivies d'un grand aplat gris. Les cartes d'une même ligne ont la
|
||||||
|
hauteur de la plus chargée : tout ce qui dépasse le contenu est du temps
|
||||||
|
disponible, il se lit donc comme tel. Le corps passe en colonne flex et
|
||||||
|
chaque pause reçoit le MÊME flex-grow (posé par _buildGapPlaceholder ;
|
||||||
|
v2026.5.49) : toutes les plages ont la même taille. Les autres
|
||||||
|
éléments gardent leur taille (flex-shrink: 0) — sans cela, un contenu plus
|
||||||
|
haut que la carte comprimerait les interventions. Option inactive ou vue
|
||||||
|
horizontale : rien ne change (les pauses y sont masquées ou gérées par les
|
||||||
|
règles .gap-placeholder-mini). */
|
||||||
|
html.show-iv-gaps:not(.view-horizontal) .card-body {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
html.show-iv-gaps:not(.view-horizontal) .card-body > *:not(.gap-placeholder) {
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* v2026.5.49 — cartes d'absence : leur couleur de catégorie est peinte sur
|
||||||
|
la CARTE (dégradé vers --iv-canvas) ; un fond opaque sur le corps la
|
||||||
|
masquerait. Le corps se contente donc de laisser passer, et les
|
||||||
|
interventions éventuelles gardent leur relief (tuile claire sur le
|
||||||
|
dégradé, qui finit sur la même teinte de retrait). */
|
||||||
|
.card.absence-cat-maladie .card-body,
|
||||||
|
.card.absence-cat-conge .card-body,
|
||||||
|
.card.absence-cat-recurring .card-body {
|
||||||
|
background: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
.card-empty {
|
.card-empty {
|
||||||
@@ -1606,12 +1705,18 @@ html.view-horizontal .iv-exact-card.iv-zero-duration {
|
|||||||
gap: 2px 10px;
|
gap: 2px 10px;
|
||||||
align-items: start;
|
align-items: start;
|
||||||
padding: 10px 12px 12px 8px;
|
padding: 10px 12px 12px 8px;
|
||||||
border-top: 1px solid var(--border);
|
|
||||||
cursor: default;
|
cursor: default;
|
||||||
transition: background 0.08s;
|
transition: background 0.08s;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
/* v2026.5.49 — tuile posée sur le corps de carte en retrait : surface
|
||||||
|
claire, contour et ombre. Remplace le simple filet border-top, qui ne
|
||||||
|
distinguait rien (même fond de part et d'autre du trait). */
|
||||||
|
background: var(--bg-elevated);
|
||||||
|
border: 1px solid var(--border);
|
||||||
|
border-radius: 6px;
|
||||||
|
box-shadow: var(--iv-relief);
|
||||||
|
margin: 6px 8px;
|
||||||
}
|
}
|
||||||
.intervention-v2:first-child { border-top: none; }
|
|
||||||
.intervention-v2:hover { background: var(--bg-hover); }
|
.intervention-v2:hover { background: var(--bg-hover); }
|
||||||
|
|
||||||
/* Pastille colorée (barre verticale) */
|
/* Pastille colorée (barre verticale) */
|
||||||
@@ -1637,23 +1742,25 @@ html.view-horizontal .iv-exact-card.iv-zero-duration {
|
|||||||
/* : on GARDE la couleur de catégorie visible (.intervention-dot reste
|
/* : on GARDE la couleur de catégorie visible (.intervention-dot reste
|
||||||
en couleur de catégorie + fond neutre). Le statut clos/résolu/terminé est
|
en couleur de catégorie + fond neutre). Le statut clos/résolu/terminé est
|
||||||
signalé par un bandeau vert sur la DROITE de la carte (inset shadow) +
|
signalé par un bandeau vert sur la DROITE de la carte (inset shadow) +
|
||||||
le ✓✓ ou ✓ existant. */
|
le ✓✓ ou ✓ existant.
|
||||||
|
v2026.5.49 — ce bandeau se COMPOSE avec le relief de la tuile : une
|
||||||
|
box-shadow unique aurait effacé l'ombre. */
|
||||||
.intervention-v2.status-closed {
|
.intervention-v2.status-closed {
|
||||||
box-shadow: inset -4px 0 0 var(--c-closed);
|
box-shadow: inset -4px 0 0 var(--c-closed), var(--iv-relief);
|
||||||
}
|
}
|
||||||
.intervention-v2.status-closed:hover {
|
.intervention-v2.status-closed:hover {
|
||||||
filter: brightness(0.96);
|
filter: brightness(0.96);
|
||||||
}
|
}
|
||||||
|
|
||||||
.intervention-v2.status-resolved {
|
.intervention-v2.status-resolved {
|
||||||
box-shadow: inset -4px 0 0 var(--c-resolved);
|
box-shadow: inset -4px 0 0 var(--c-resolved), var(--iv-relief);
|
||||||
}
|
}
|
||||||
.intervention-v2.status-resolved:hover {
|
.intervention-v2.status-resolved:hover {
|
||||||
filter: brightness(0.96);
|
filter: brightness(0.96);
|
||||||
}
|
}
|
||||||
|
|
||||||
.intervention-v2.status-terminated {
|
.intervention-v2.status-terminated {
|
||||||
box-shadow: inset -4px 0 0 var(--c-terminated, #16a34a);
|
box-shadow: inset -4px 0 0 var(--c-terminated, #16a34a), var(--iv-relief);
|
||||||
}
|
}
|
||||||
.intervention-v2.status-terminated:hover {
|
.intervention-v2.status-terminated:hover {
|
||||||
filter: brightness(0.96);
|
filter: brightness(0.96);
|
||||||
@@ -3239,6 +3346,48 @@ header.topbar::before {
|
|||||||
color: var(--text-muted);
|
color: var(--text-muted);
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
}
|
}
|
||||||
|
/* v2026.5.49 — chaque type d'email (déplacement / annulation) est une
|
||||||
|
SECTION visuellement délimitée : encadré léger + liseré d'accent à gauche,
|
||||||
|
pour qu'on distingue d'un coup d'oeil les deux zones. */
|
||||||
|
.admin-email-section {
|
||||||
|
border: 1px solid var(--border);
|
||||||
|
border-left: 3px solid var(--accent);
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 12px 14px 14px;
|
||||||
|
margin: 18px 0 0;
|
||||||
|
}
|
||||||
|
.admin-email-section .admin-email-section-titre {
|
||||||
|
margin-top: 0;
|
||||||
|
font-size: 17px;
|
||||||
|
}
|
||||||
|
/* v2026.5.49 — aperçu en direct des adresses en COPIE (CC) sous le champ :
|
||||||
|
une puce par adresse retenue, pour VOIR ce qui sera ajouté ; les saisies
|
||||||
|
invalides sont barrées en rouge. */
|
||||||
|
.cc-apercu {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
margin-top: 8px;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
.cc-apercu-intro { color: var(--text-muted); }
|
||||||
|
.cc-apercu-vide { color: var(--text-faint); font-style: italic; }
|
||||||
|
.cc-apercu-chip {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 2px 8px;
|
||||||
|
border-radius: 10px;
|
||||||
|
background: var(--accent-soft);
|
||||||
|
color: var(--accent);
|
||||||
|
border: 1px solid color-mix(in srgb, var(--accent) 30%, transparent);
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
.cc-apercu-chip-invalide {
|
||||||
|
background: var(--danger-soft);
|
||||||
|
color: var(--danger);
|
||||||
|
border-color: color-mix(in srgb, var(--danger) 35%, transparent);
|
||||||
|
text-decoration: line-through;
|
||||||
|
}
|
||||||
.admin-team-table {
|
.admin-team-table {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
border-collapse: collapse;
|
border-collapse: collapse;
|
||||||
@@ -4294,18 +4443,18 @@ html.theme-dark {
|
|||||||
/* Carte entière : couleur de fond + barre gauche épaisse pour absence */
|
/* Carte entière : couleur de fond + barre gauche épaisse pour absence */
|
||||||
.card.absence-cat-maladie {
|
.card.absence-cat-maladie {
|
||||||
border-left: 4px solid var(--c-maladie);
|
border-left: 4px solid var(--c-maladie);
|
||||||
background: linear-gradient(to bottom, var(--c-maladie-soft) 0%, var(--bg-elevated) 40%);
|
background: linear-gradient(to bottom, var(--c-maladie-soft) 0%, var(--iv-canvas) 40%);
|
||||||
}
|
}
|
||||||
html.theme-dark .card.absence-cat-maladie {
|
html.theme-dark .card.absence-cat-maladie {
|
||||||
background: linear-gradient(to bottom, rgba(67, 56, 202, 0.12) 0%, var(--bg-elevated) 40%);
|
background: linear-gradient(to bottom, rgba(67, 56, 202, 0.12) 0%, var(--iv-canvas) 40%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.card.absence-cat-conge {
|
.card.absence-cat-conge {
|
||||||
border-left: 4px solid var(--c-conge);
|
border-left: 4px solid var(--c-conge);
|
||||||
background: linear-gradient(to bottom, var(--c-conge-soft) 0%, var(--bg-elevated) 40%);
|
background: linear-gradient(to bottom, var(--c-conge-soft) 0%, var(--iv-canvas) 40%);
|
||||||
}
|
}
|
||||||
html.theme-dark .card.absence-cat-conge {
|
html.theme-dark .card.absence-cat-conge {
|
||||||
background: linear-gradient(to bottom, rgba(6, 182, 212, 0.12) 0%, var(--bg-elevated) 40%);
|
background: linear-gradient(to bottom, rgba(6, 182, 212, 0.12) 0%, var(--iv-canvas) 40%);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Pompier — on reprend le style existant mais on accentue le border-left */
|
/* Pompier — on reprend le style existant mais on accentue le border-left */
|
||||||
@@ -4387,10 +4536,10 @@ html.theme-dark .card.absence-cat-conge {
|
|||||||
/* Carte entière : bordure gauche cyan + fond dégradé */
|
/* Carte entière : bordure gauche cyan + fond dégradé */
|
||||||
.card.absence-cat-recurring {
|
.card.absence-cat-recurring {
|
||||||
border-left: 4px solid var(--c-conge);
|
border-left: 4px solid var(--c-conge);
|
||||||
background: linear-gradient(to bottom, var(--c-conge-soft) 0%, var(--bg-elevated) 40%);
|
background: linear-gradient(to bottom, var(--c-conge-soft) 0%, var(--iv-canvas) 40%);
|
||||||
}
|
}
|
||||||
html.theme-dark .card.absence-cat-recurring {
|
html.theme-dark .card.absence-cat-recurring {
|
||||||
background: linear-gradient(to bottom, rgba(6, 182, 212, 0.12) 0%, var(--bg-elevated) 40%);
|
background: linear-gradient(to bottom, rgba(6, 182, 212, 0.12) 0%, var(--iv-canvas) 40%);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* v2026.5.46 — vue horizontale : en échelle exacte, la carte d'un tech
|
/* v2026.5.46 — vue horizontale : en échelle exacte, la carte d'un tech
|
||||||
@@ -5259,7 +5408,7 @@ html.view-horizontal .horizontal-sidebar .date-custom {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 13. Barre de rafraîchissement en vue horizontale.
|
/* 13. Barre de rafraîchissement en vue horizontale.
|
||||||
v2026.5.47 — FroSteel : la barre doit RESTER dans la barre de gauche,
|
v2026.5.47 — la barre doit RESTER dans la barre de gauche,
|
||||||
AU-DESSUS des initiales — pas dans le contenu où elle couvrait
|
AU-DESSUS des initiales — pas dans le contenu où elle couvrait
|
||||||
les heures du mode « échelle exacte ». Elle repasse donc en overlay sur la
|
les heures du mode « échelle exacte ». Elle repasse donc en overlay sur la
|
||||||
SIDEBAR (left:0, width = --sidebar-w) ; top suit --stack-top (sous la
|
SIDEBAR (left:0, width = --sidebar-w) ; top suit --stack-top (sous la
|
||||||
@@ -5388,10 +5537,14 @@ html:not(.show-iv-gaps) .gap-placeholder:not(.gap-placeholder-full) {
|
|||||||
margin: 6px 0;
|
margin: 6px 0;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
color: var(--text-faint);
|
color: var(--text-muted);
|
||||||
border: 1px dashed var(--border);
|
border: 1px dashed var(--border-strong);
|
||||||
border-radius: 6px;
|
border-radius: 6px;
|
||||||
background: transparent;
|
/* v2026.5.49 — plage libre VISIBLE : sur le fond de retrait des cartes
|
||||||
|
(--iv-canvas), un rectangle transparent au contour pâle se voyait à
|
||||||
|
peine. Voile clair + contour tireté = « emplacement disponible », sans
|
||||||
|
atteindre la surface pleine d'une intervention. */
|
||||||
|
background: var(--iv-libre);
|
||||||
cursor: help;
|
cursor: help;
|
||||||
user-select: none;
|
user-select: none;
|
||||||
transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease;
|
transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease;
|
||||||
@@ -5460,6 +5613,21 @@ html.view-horizontal .gap-placeholder:not(.gap-placeholder-mini) {
|
|||||||
z-index: 6;
|
z-index: 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* v2026.5.49 — survol d'une PAUSE : on fane (désature + assombrit) les
|
||||||
|
interventions de la FRISE (.timeline-slot) uniquement, pour que la plage
|
||||||
|
libre survolée — qui garde sa couleur vive et son contour accent — ressorte,
|
||||||
|
même collée à une installation bleue (les deux se confondaient). La frise
|
||||||
|
existe dans les deux vues (classique et horizontale), donc l'effet vaut pour
|
||||||
|
les deux. On NE fane PAS les cartes d'intervention en dessous (.iv-mini-card,
|
||||||
|
.intervention-v2) : seule la timeline s'assombrit. La pause
|
||||||
|
elle-même (.timeline-hole / .gap-placeholder) n'est jamais ciblée. .gap-dimming
|
||||||
|
est posée par highlightGap sur la carte (classique) ou la ligne (horizontal). */
|
||||||
|
.gap-dimming .timeline-slot {
|
||||||
|
filter: saturate(0.3) brightness(0.82);
|
||||||
|
opacity: 0.45;
|
||||||
|
transition: filter 0.12s ease, opacity 0.12s ease;
|
||||||
|
}
|
||||||
|
|
||||||
/* : placeholder "—" sous le séparateur d'une période vide, dans
|
/* : placeholder "—" sous le séparateur d'une période vide, dans
|
||||||
la vue classique. Reprend le même design que .iv-mini-block-empty
|
la vue classique. Reprend le même design que .iv-mini-block-empty
|
||||||
en vue horizontale : encadré dashed, "—" centré, hauteur fixe. */
|
en vue horizontale : encadré dashed, "—" centré, hauteur fixe. */
|
||||||
@@ -5471,10 +5639,11 @@ html.view-horizontal .gap-placeholder:not(.gap-placeholder-mini) {
|
|||||||
margin: 6px 0;
|
margin: 6px 0;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
color: var(--text-faint);
|
color: var(--text-muted);
|
||||||
border: 1px dashed var(--border);
|
border: 1px dashed var(--border-strong);
|
||||||
border-radius: 6px;
|
border-radius: 6px;
|
||||||
background: transparent;
|
/* v2026.5.49 — même éclaircissement que .gap-placeholder. */
|
||||||
|
background: var(--iv-libre);
|
||||||
user-select: none;
|
user-select: none;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
@@ -5760,6 +5929,9 @@ html.view-horizontal .iv-mini-cards {
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
transition: background 0.1s, border-color 0.1s, box-shadow 0.1s;
|
transition: background 0.1s, border-color 0.1s, box-shadow 0.1s;
|
||||||
|
/* v2026.5.49 — même relief qu'en vue classique : la mini-carte est
|
||||||
|
posée sur le corps de carte, qui est en retrait. */
|
||||||
|
box-shadow: var(--iv-relief);
|
||||||
}
|
}
|
||||||
.iv-mini-card:hover {
|
.iv-mini-card:hover {
|
||||||
background: var(--bg-hover);
|
background: var(--bg-hover);
|
||||||
@@ -5977,10 +6149,11 @@ html.view-horizontal .pinned-popups-dock {
|
|||||||
min-height: 36px;
|
min-height: 36px;
|
||||||
font-size: calc(14px * var(--text-scale));
|
font-size: calc(14px * var(--text-scale));
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
color: var(--text-faint);
|
color: var(--text-muted);
|
||||||
border: 1px dashed var(--border);
|
border: 1px dashed var(--border-strong);
|
||||||
border-radius: 6px;
|
border-radius: 6px;
|
||||||
background: transparent;
|
/* v2026.5.49 — même éclaircissement que .gap-placeholder. */
|
||||||
|
background: var(--iv-libre);
|
||||||
user-select: none;
|
user-select: none;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
@@ -7071,13 +7244,20 @@ html.view-horizontal .iv-exact-lane + .iv-exact-lane {
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 0;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
background: transparent;
|
/* v2026.5.49 — le créneau libre se VOIT sans qu'il faille le survoler :
|
||||||
|
voile clair sur la bande en retrait, contour tireté discret. Même langage
|
||||||
|
que les pauses de la vue classique (clair + tireté = disponible). */
|
||||||
|
background: var(--iv-libre);
|
||||||
|
border: 1px dashed var(--border-strong);
|
||||||
|
border-radius: 4px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
z-index: 0;
|
z-index: 0;
|
||||||
}
|
}
|
||||||
.iv-exact-hole:hover,
|
.iv-exact-hole:hover,
|
||||||
.iv-exact-hole.highlight {
|
.iv-exact-hole.highlight {
|
||||||
background: rgba(127, 127, 127, 0.12);
|
/* v2026.5.49 — le survol reste plus marqué que l'état de repos, qui
|
||||||
|
n'est plus transparent : teinte d'accent au lieu d'un gris. */
|
||||||
|
background: var(--accent-soft);
|
||||||
outline: 1px dashed var(--accent, #3b82f6);
|
outline: 1px dashed var(--accent, #3b82f6);
|
||||||
outline-offset: -2px;
|
outline-offset: -2px;
|
||||||
}
|
}
|
||||||
@@ -7135,8 +7315,17 @@ html.view-horizontal .iv-exact-lane + .iv-exact-lane {
|
|||||||
font-size: calc(10.5px * var(--text-scale, 1));
|
font-size: calc(10.5px * var(--text-scale, 1));
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.75);
|
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
|
/* v2026.5.49 — la zone est désormais bornée au prochain rendez-vous : sur
|
||||||
|
un créneau de 30 min l'heure déborde du rectangle. Pastille opaque (au lieu
|
||||||
|
d'un simple texte ombré) pour qu'elle reste lisible hors de la zone, sur
|
||||||
|
les hachures d'un créneau libre comme sur le fond de la bande. */
|
||||||
|
padding: 1px 5px;
|
||||||
|
border-radius: 5px;
|
||||||
|
background: var(--accent, #3b82f6);
|
||||||
|
}
|
||||||
|
.iv-exact-selpreview.danger .iv-exact-selpreview-hour {
|
||||||
|
background: #b03030;
|
||||||
}
|
}
|
||||||
/* v2026.5.47 — un rendez-vous en ERREUR (début == fin) tombe dans la zone
|
/* v2026.5.47 — un rendez-vous en ERREUR (début == fin) tombe dans la zone
|
||||||
qu'on créerait : surbrillance ET bulle passent en rouge (le clic droit est
|
qu'on créerait : surbrillance ET bulle passent en rouge (le clic droit est
|
||||||
@@ -7346,3 +7535,28 @@ html.view-horizontal.horizontal-exact .cards {
|
|||||||
.reschedule-timeline-mark.reschedule-exact-mark {
|
.reschedule-timeline-mark.reschedule-exact-mark {
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ── Puces de variables du modèle d'email (v2026.5.48) ─────────────── */
|
||||||
|
/* Interactives : grossissent au survol, s'enfoncent au clic. Le style de base vit ici (plus d'inline) pour que :hover et
|
||||||
|
:active puissent surcharger la bordure. */
|
||||||
|
.admin-var-chip {
|
||||||
|
font-family: monospace;
|
||||||
|
font-size: 12px;
|
||||||
|
padding: 2px 8px;
|
||||||
|
align-self: flex-start;
|
||||||
|
border: 1px solid var(--border, #888);
|
||||||
|
border-radius: 6px;
|
||||||
|
background: transparent;
|
||||||
|
color: inherit;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: transform 0.09s ease, border-color 0.09s ease,
|
||||||
|
background-color 0.09s ease;
|
||||||
|
}
|
||||||
|
.admin-var-chip:hover {
|
||||||
|
transform: scale(1.07);
|
||||||
|
border-color: var(--accent, #4a90d9);
|
||||||
|
background: rgba(127, 127, 127, 0.12);
|
||||||
|
}
|
||||||
|
.admin-var-chip:active {
|
||||||
|
transform: scale(0.92);
|
||||||
|
}
|
||||||
|
|||||||
+18
-13
@@ -2,10 +2,10 @@
|
|||||||
<!--
|
<!--
|
||||||
Planification — Extension navigateur EasyVista (Canton de Vaud / DGNSI)
|
Planification — Extension navigateur EasyVista (Canton de Vaud / DGNSI)
|
||||||
|
|
||||||
Copyright (c) 2026 FroSteel
|
Copyright (c) 2026 Quentin
|
||||||
Licensed under the MIT License — see LICENSE file in the project root.
|
Licensed under the MIT License — see LICENSE file in the project root.
|
||||||
|
|
||||||
@author FroSteel
|
@author Quentin
|
||||||
@repository https://gitea.netaplaid.ch/FroSteel/Planification
|
@repository https://gitea.netaplaid.ch/FroSteel/Planification
|
||||||
-->
|
-->
|
||||||
<html lang="fr">
|
<html lang="fr">
|
||||||
@@ -118,17 +118,6 @@
|
|||||||
|
|
||||||
<main id="main">
|
<main id="main">
|
||||||
<div id="error-box" class="error-box hidden"></div>
|
<div id="error-box" class="error-box hidden"></div>
|
||||||
<div id="session-needed" class="session-needed hidden">
|
|
||||||
<h2>Session EasyVista expirée</h2>
|
|
||||||
<p>Reconnectez-vous à EasyVista pour continuer.</p>
|
|
||||||
<button id="open-ev-btn" class="btn btn-primary">Ouvrir EasyVista</button>
|
|
||||||
</div>
|
|
||||||
<div id="ev-unreachable" class="session-needed hidden">
|
|
||||||
<h2>EasyVista est inaccessible pour le moment.</h2>
|
|
||||||
<p>Réessayez dans quelques instants, ou ouvrez EasyVista directement.</p>
|
|
||||||
<button id="open-ev-btn-2" class="btn btn-primary">Ouvrir EasyVista</button>
|
|
||||||
<button id="retry-btn" class="btn btn-subtle">Réessayer</button>
|
|
||||||
</div>
|
|
||||||
<!-- v2026.5.46 — ligne collante (sticky) EN PREMIER : stats + barre de
|
<!-- v2026.5.46 — ligne collante (sticky) EN PREMIER : stats + barre de
|
||||||
recherche sur la même hauteur, toujours visibles au scroll. En vue
|
recherche sur la même hauteur, toujours visibles au scroll. En vue
|
||||||
horizontale, les deux enfants sont relocalisés dans la sidebar
|
horizontale, les deux enfants sont relocalisés dans la sidebar
|
||||||
@@ -160,6 +149,22 @@
|
|||||||
<!-- v2026.5.46 — le « Chargement… » vit DANS la zone des cartes
|
<!-- v2026.5.46 — le « Chargement… » vit DANS la zone des cartes
|
||||||
(sous la ligne stats+recherche), jamais en haut de page. -->
|
(sous la ligne stats+recherche), jamais en haut de page. -->
|
||||||
<div id="loading" class="loading">Chargement…</div>
|
<div id="loading" class="loading">Chargement…</div>
|
||||||
|
<!-- v2026.5.49 — les messages « session expirée » / « EV inaccessible »
|
||||||
|
CENTRÉS vivent DANS la zone de contenu (sous la barre de recherche, à
|
||||||
|
la place des cartes), pas en haut de #main : sinon ils s'affichaient
|
||||||
|
au-dessus de la ligne stats+recherche. showSessionNeeded/showEvUnreachable
|
||||||
|
vident #cards et affichent le message ici. -->
|
||||||
|
<div id="session-needed" class="session-needed hidden">
|
||||||
|
<h2>Session EasyVista expirée</h2>
|
||||||
|
<p>Reconnectez-vous à EasyVista pour continuer.</p>
|
||||||
|
<button id="open-ev-btn" class="btn btn-primary">Ouvrir EasyVista</button>
|
||||||
|
</div>
|
||||||
|
<div id="ev-unreachable" class="session-needed hidden">
|
||||||
|
<h2>EasyVista est inaccessible pour le moment.</h2>
|
||||||
|
<p>Réessayez dans quelques instants, ou ouvrez EasyVista directement.</p>
|
||||||
|
<button id="open-ev-btn-2" class="btn btn-primary">Ouvrir EasyVista</button>
|
||||||
|
<button id="retry-btn" class="btn btn-subtle">Réessayer</button>
|
||||||
|
</div>
|
||||||
<div id="cards" class="cards"></div>
|
<div id="cards" class="cards"></div>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
|
|||||||
+2167
-466
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user