Public Access
Compare commits
53
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c65e943dac | ||
|
|
d23824359f | ||
|
|
2d242d26ec | ||
|
|
54b8f826df | ||
|
|
8ecf2d3df4 | ||
|
|
9d8d8102d7 | ||
|
|
48b00a8585 | ||
|
|
6bb97addd6 | ||
|
|
05275a3be5 | ||
|
|
d7b680fb3f | ||
|
|
3c7e7c0c25 | ||
|
|
b3677d661a | ||
|
|
8390db9937 | ||
|
|
2cc9552fbf | ||
|
|
0327a55c74 | ||
|
|
67708d1ad3 | ||
|
|
1730758cb4 | ||
|
|
7c0742594c | ||
|
|
af85473837 | ||
|
|
47a0bca998 | ||
|
|
e92b0c4444 | ||
|
|
957b754bdc | ||
|
|
aabda3ba7e | ||
|
|
6a0324b252 | ||
|
|
fd466504c2 | ||
|
|
02524e78b2 | ||
|
|
193b3252d4 | ||
|
|
3a28e1bd0a | ||
|
|
10a1aef4c7 | ||
|
|
b77f0a9caa | ||
|
|
f7f81f7d9d | ||
|
|
ddb075d563 | ||
|
|
f6dc9eaf7b | ||
|
|
3d5bdbab3d | ||
|
|
ad952ebc55 | ||
|
|
1a7393c297 | ||
|
|
d589447533 | ||
|
|
ea5a42c5e1 | ||
|
|
763e63d9c6 | ||
|
|
bea236ca88 | ||
|
|
d6ab8d59e0 | ||
|
|
909ddb8301 | ||
|
|
6794360887 | ||
|
|
7ba28d3bac | ||
|
|
e17f604d9e | ||
|
|
9d701701e6 | ||
|
|
77c68dbe83 | ||
|
|
d4fc8ff250 | ||
|
|
3996e3fb4f | ||
|
|
86f52029f5 | ||
|
|
984f326b39 | ||
|
|
6d3058028f | ||
|
|
c59abbed23 |
-51
@@ -1,51 +0,0 @@
|
||||
# OS
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
desktop.ini
|
||||
|
||||
# Editors
|
||||
.vscode/
|
||||
.idea/
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
|
||||
# Backups
|
||||
*.bak
|
||||
*.bak-*
|
||||
*.orig
|
||||
*.old
|
||||
|
||||
# Build artifacts (les ZIP/XPI livrés ne sont pas dans le repo, ils sont buildés à la demande)
|
||||
dist/
|
||||
*.zip
|
||||
*.xpi
|
||||
*.crx
|
||||
|
||||
# Node (si jamais utilisé pour build)
|
||||
node_modules/
|
||||
package-lock.json
|
||||
npm-debug.log*
|
||||
|
||||
# Logs
|
||||
*.log
|
||||
rebuild.log
|
||||
|
||||
# Dossiers de travail temporaires
|
||||
extracted/
|
||||
temp/
|
||||
tmp/
|
||||
|
||||
# Tests
|
||||
test-output/
|
||||
|
||||
# Archives historiques locales (jamais sur Gitea)
|
||||
_archives/
|
||||
Old.zip
|
||||
Old/
|
||||
|
||||
# Variables d'environnement / secrets
|
||||
.env
|
||||
.env.*
|
||||
*.token
|
||||
secrets.json
|
||||
+6
-6
@@ -1,7 +1,7 @@
|
||||
# CHANGELOG — Extension Planification EasyVista Canton de Vaud
|
||||
|
||||
> 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.
|
||||
> Pour les versions plus anciennes, l'analyse du code source permet de
|
||||
@@ -318,7 +318,7 @@
|
||||
### Attribution auteur
|
||||
- Ajout en-têtes copyright dans tous les fichiers source
|
||||
(viewer.js, viewer.html, viewer.css, background.js)
|
||||
- Ajout `@author FroSteel` sur les fonctions principales
|
||||
- Ajout `@author Quentin Rouiller` sur les fonctions principales
|
||||
(loadForDate, buildCard, buildTooltipHTML, pinTooltip, _softUnpinPopup,
|
||||
positionTooltipAnchored, _applyViewMode, _moveElementsToSidebar,
|
||||
_restoreElementsToTopbar, fetchAndShowCurrentUser, _maybeRetryFetchUser,
|
||||
@@ -326,7 +326,7 @@
|
||||
openPersistentTimelinePopup, showTooltip, _findFreePopupPosition,
|
||||
_clampPopupInSafeArea, findEasyVistaSession, fetchPlanningXml,
|
||||
fetchCurrentUser, detectNetworkContext)
|
||||
- Ajout signature "Développé par FroSteel" en bas du popup
|
||||
- Ajout signature "Développé par Quentin Rouiller" en bas du popup
|
||||
user-badge (style cohérent avec footer version : 11px, italique,
|
||||
gris atténué, séparateur fin)
|
||||
- Mise à jour `description` du manifest pour mentionner DGNSI
|
||||
@@ -424,7 +424,7 @@
|
||||
|
||||
## v2026.5.29 — Contraste++ + footer
|
||||
- Contrastes encore plus forts (text-muted #d0d5de dark, #2e3642 light)
|
||||
- Footer FRS/version : 13px badge avec fond bg-muted + bordure
|
||||
- Footer QRO/version : 13px badge avec fond bg-muted + bordure
|
||||
- Fix highlight row : selector .intervention-v2[data-iv-idx]
|
||||
- Scroll-into-view automatique au hover segment timeline
|
||||
|
||||
@@ -492,7 +492,7 @@
|
||||
- v4.2.3 : grande popup timeline persistante (clic), suit-souris (hover)
|
||||
- v4.2.3 : bindTimelinePopover, showTimelinePopover, moveTimelineTooltip
|
||||
- v4.2.4 : setTooltipViewportPosition (détection auto fixed/abs)
|
||||
- v4.2.9 : pied de page discret FRS/version
|
||||
- v4.2.9 : pied de page discret QRO/version
|
||||
- v4.2.9 : initModalScrollLock (bloquer scroll arrière modal)
|
||||
- v4.3.0 : tooltip live libéré après épinglage (réutilisable autres survols)
|
||||
- v4.3.3 : _softUnpinPopup (désépinglage mou)
|
||||
@@ -518,6 +518,6 @@
|
||||
|
||||
## Auteur
|
||||
|
||||
**FroSteel** (FRS)
|
||||
**Quentin Rouiller** (QRO)
|
||||
Technicien DGNSI — Canton de Vaud
|
||||
Contact : voir [page wiki Contact](https://gitea.netaplaid.ch/FroSteel/Planification/wiki/Contact)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2026 FroSteel
|
||||
Copyright (c) 2026 Quentin Rouiller
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
||||
@@ -6,10 +6,10 @@ Extension Chrome / Firefox pour visualiser de manière claire et rapide le plann
|
||||
|
||||
## Aperçu rapide
|
||||
|
||||
- **Auteur** : FroSteel (FRS), Technicien DGNSI — Canton de Vaud
|
||||
- **Auteur** : Quentin Rouiller (QRO), Technicien DGNSI — Canton de Vaud
|
||||
- **Public cible** : coordinateurs DGNSI qui pilotent dans EasyVista (`itsma.etat-de-vaud.ch` / `itsma.vd.ch`) le planning de l'équipe technicienne
|
||||
- **Démarrage projet** : jeudi 16 avril 2026
|
||||
- **Version actuelle** : [`v2026.5.43`](https://gitea.netaplaid.ch/FroSteel/Planification/releases/tag/v2026.5.43) (latest)
|
||||
- **Version actuelle** : [`v2026.5.44`](https://gitea.netaplaid.ch/FroSteel/Planification/releases/tag/v2026.5.44) (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)
|
||||
@@ -78,6 +78,9 @@ Les mises à jour sont **manuelles** : à chaque nouvelle release, retélécharg
|
||||
- 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
|
||||
|
||||
@@ -87,7 +90,7 @@ L'extension a connu **3 systèmes de versionning successifs** :
|
||||
|---|---|---|
|
||||
| 16-17 avril 2026 | Versions de base | `1.0.0`, `2.0.0`, `3.0.0` |
|
||||
| 18-20 avril 2026 | SemVer classique | `4.1.3`, `4.2.8`, `5.0.12` |
|
||||
| 21 avril 2026 → maintenant | **`ANNÉE.MAJEURE.PATCH`** | `2026.5.16` → `2026.5.40` |
|
||||
| 21 avril 2026 → maintenant | **`ANNÉE.MAJEURE.PATCH`** | `2026.5.16` → `2026.5.44` |
|
||||
|
||||
### Format actuel : `ANNÉE.MAJEURE.PATCH`
|
||||
|
||||
@@ -110,7 +113,17 @@ Le numéro de **majeure** n'est **pas** un mois et **pas** un chiffre lié au ca
|
||||
|
||||
## Versions notables
|
||||
|
||||
### `v2026.5.43` (latest, 27 avril 2026) — Fix Firefox : menu dock + stabilité popup pin/unpin
|
||||
### `v2026.5.44` (latest, 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
|
||||
@@ -198,10 +211,10 @@ de cette version dans `firefox-updates.json`.
|
||||
|
||||
## Licence
|
||||
|
||||
[MIT License](LICENSE) — Copyright (c) 2026 FroSteel
|
||||
[MIT License](LICENSE) — Copyright (c) 2026 Quentin Rouiller
|
||||
|
||||
## Auteur
|
||||
|
||||
**FroSteel** (FRS)
|
||||
**Quentin Rouiller** (QRO)
|
||||
Technicien DGNSI — Canton de Vaud
|
||||
Contact : voir [page wiki Contact](https://gitea.netaplaid.ch/FroSteel/Planification/wiki/Contact)
|
||||
|
||||
+7
-7
@@ -4,10 +4,10 @@
|
||||
* Service worker (Manifest V3) : récupération session EV, fetch planning XML,
|
||||
* fetch fiches détaillées, gestion cache.
|
||||
*
|
||||
* Copyright (c) 2026 FroSteel
|
||||
* Copyright (c) 2026 Quentin Rouiller
|
||||
* Licensed under the MIT License — see LICENSE file in the project root.
|
||||
*
|
||||
* @author FroSteel
|
||||
* @author Quentin Rouiller
|
||||
* @repository https://gitea.netaplaid.ch/FroSteel/Planification
|
||||
*/
|
||||
|
||||
@@ -207,7 +207,7 @@ chrome.action.onClicked.addListener(async () => {
|
||||
/**
|
||||
* Trouve l'onglet EasyVista ouvert et récupère phpsessid + origin.
|
||||
*
|
||||
* @author FroSteel
|
||||
* @author Quentin Rouiller
|
||||
*/
|
||||
async function findEasyVistaSession() {
|
||||
// v2026.5.41 : les origines EV viennent de admin_config (éditables dans
|
||||
@@ -237,7 +237,7 @@ async function findEasyVistaSession() {
|
||||
* 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.
|
||||
*
|
||||
* @author FroSteel
|
||||
* @author Quentin Rouiller
|
||||
*/
|
||||
async function fetchPlanningXml(origin, phpsessid, unixDate) {
|
||||
// v2026.5.41 : groupId vient de admin_config (défaut SI-CSS).
|
||||
@@ -545,7 +545,7 @@ async function extendSessionKeepAlive(origin, phpsessid) {
|
||||
* @param {boolean} force - si true, ignore le cache et refait le test
|
||||
* @returns {Promise<"internal"|"external">}
|
||||
*
|
||||
* @author FroSteel
|
||||
* @author Quentin Rouiller
|
||||
*/
|
||||
async function detectNetworkContext(force = false) {
|
||||
const CACHE_KEY = "network_context_v2"; // v5.0.12 : nouvelle clé pour invalider le cache fautif v5.0.11
|
||||
@@ -685,7 +685,7 @@ function watchReconnectTabForIamLogin(tabId) {
|
||||
* Retourne { name: "Nom Prénom" | null, login: "..." | null } ou null si
|
||||
* tout a échoué.
|
||||
*
|
||||
* @author FroSteel
|
||||
* @author Quentin Rouiller
|
||||
*/
|
||||
async function fetchCurrentUser(origin, phpsessid) {
|
||||
const url = `${origin}/index.php?PHPSESSID=${encodeURIComponent(phpsessid)}`;
|
||||
@@ -1064,7 +1064,7 @@ async function deletePlanningItem(origin, phpsessid, actionId, kind) {
|
||||
* Retourne { groups: [{id, name}, ...] }. Liste vide si le fetch échoue ou
|
||||
* si EV renvoie une page de login / redirection JS.
|
||||
*
|
||||
* @author FroSteel
|
||||
* @author Quentin Rouiller
|
||||
*/
|
||||
async function detectGroupsFromEV(origin, phpsessid) {
|
||||
const url = `${origin}/index.php?eventName=HelpDesk_PlanningItem&PHPSESSID=${encodeURIComponent(phpsessid)}`;
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
"manifest_version": 3,
|
||||
"name": "Planification",
|
||||
"version": "2026.5.44",
|
||||
"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 Rouiller — DGNSI, Canton de Vaud.",
|
||||
"permissions": [
|
||||
"activeTab",
|
||||
"scripting",
|
||||
|
||||
+3
-3
@@ -1,10 +1,10 @@
|
||||
/**
|
||||
* Planification — Extension navigateur EasyVista (Canton de Vaud / DGNSI)
|
||||
*
|
||||
* Copyright (c) 2026 FroSteel
|
||||
* Copyright (c) 2026 Quentin Rouiller
|
||||
* Licensed under the MIT License — see LICENSE file in the project root.
|
||||
*
|
||||
* @author FroSteel
|
||||
* @author Quentin Rouiller
|
||||
* @repository https://gitea.netaplaid.ch/FroSteel/Planification
|
||||
*/
|
||||
|
||||
@@ -4714,7 +4714,7 @@ html.view-horizontal .card-status-note.pompier {
|
||||
|
||||
/* ==========================================================================
|
||||
v2026.5.38 : Signature auteur en bas du popup user-badge
|
||||
Style cohérent avec le footer "FRS/vX.Y.Z" en bas à droite : petit, gris
|
||||
Style cohérent avec le footer "QRO/vX.Y.Z" en bas à droite : petit, gris
|
||||
atténué, séparé par une fine ligne supérieure.
|
||||
========================================================================== */
|
||||
.user-name-popup-author {
|
||||
|
||||
+2
-2
@@ -2,10 +2,10 @@
|
||||
<!--
|
||||
Planification — Extension navigateur EasyVista (Canton de Vaud / DGNSI)
|
||||
|
||||
Copyright (c) 2026 FroSteel
|
||||
Copyright (c) 2026 Quentin Rouiller
|
||||
Licensed under the MIT License — see LICENSE file in the project root.
|
||||
|
||||
@author FroSteel
|
||||
@author Quentin Rouiller
|
||||
@repository https://gitea.netaplaid.ch/FroSteel/Planification
|
||||
-->
|
||||
<html lang="fr">
|
||||
|
||||
+36
-36
@@ -5,10 +5,10 @@
|
||||
* réservations, absences, statut pompier, etc. Regroupé par tech avec
|
||||
* timelines visuelles et popups détaillés.
|
||||
*
|
||||
* Copyright (c) 2026 FroSteel
|
||||
* Copyright (c) 2026 Quentin Rouiller
|
||||
* Licensed under the MIT License — see LICENSE file in the project root.
|
||||
*
|
||||
* @author FroSteel
|
||||
* @author Quentin Rouiller
|
||||
* @repository https://gitea.netaplaid.ch/FroSteel/Planification
|
||||
*/
|
||||
|
||||
@@ -193,9 +193,9 @@ LOG.info("boot", "viewer.js chargé", { version: LOG.version() });
|
||||
LOG.warn("planification",
|
||||
`🩺 Planification v${LOG.version()} — Mode ${LOG.isDebug() ? "DIAGNOSTIC" : "PROD"}.`);
|
||||
|
||||
// on n'analyse que les ghosts du tech FroSteel pour se concentrer.
|
||||
// on n'analyse que les ghosts du tech Quentin pour se concentrer.
|
||||
// Les ghosts des autres techs sont loggés comme "skipped" et restent visibles.
|
||||
const DIAGNOSTIC_TECH_FILTER_ID = "86874"; // FroSteel
|
||||
const DIAGNOSTIC_TECH_FILTER_ID = "86874"; // Rouiller, Quentin
|
||||
|
||||
// v2026.5.40 r22 : pattern simple et fiable pour fermer le tooltip
|
||||
// - mouseleave row → timer 500ms (démarré dans hideTooltip)
|
||||
@@ -583,7 +583,7 @@ const _CURRENT_USER_RETRY_DELAY_MS = 60 * 1000;
|
||||
/**
|
||||
* Récupère le nom de l'utilisateur EasyVista connecté et l'affiche dans le badge.
|
||||
*
|
||||
* @author FroSteel
|
||||
* @author Quentin Rouiller
|
||||
*/
|
||||
async function fetchAndShowCurrentUser() {
|
||||
const attemptId = _currentUserRetryCount + 1;
|
||||
@@ -670,7 +670,7 @@ async function fetchAndShowCurrentUser() {
|
||||
*
|
||||
* @param {string} reason - contexte pour les logs (ex: "after_load_success")
|
||||
*
|
||||
* @author FroSteel
|
||||
* @author Quentin Rouiller
|
||||
*/
|
||||
function _maybeRetryFetchUser(reason) {
|
||||
if (state.currentUser && state.currentUser.name) {
|
||||
@@ -802,11 +802,11 @@ function toggleUserNamePopup() {
|
||||
popup.appendChild(settingsBtn);
|
||||
|
||||
// v2026.5.38 : signature auteur en bas du popup user-badge
|
||||
// Style : même look que le footer "FRS/vX.Y.Z" en bas à droite — petit,
|
||||
// Style : même look que le footer "QRO/vX.Y.Z" en bas à droite — petit,
|
||||
// gris atténué, séparé par une fine ligne supérieure.
|
||||
const authorLine = document.createElement("div");
|
||||
authorLine.className = "user-name-popup-author";
|
||||
authorLine.textContent = "Développé par FroSteel";
|
||||
authorLine.textContent = "Développé par Quentin Rouiller";
|
||||
authorLine.title = "Auteur de l'extension";
|
||||
popup.appendChild(authorLine);
|
||||
|
||||
@@ -1284,12 +1284,12 @@ function initModalScrollLock() {
|
||||
updateLock(); // au cas où un modal serait déjà là au boot
|
||||
}
|
||||
|
||||
// v4.2.9 : pied de page discret "FRS / vX.X.X" en bas à droite.
|
||||
// v4.2.9 : pied de page discret "QRO / vX.X.X" en bas à droite.
|
||||
// La version est lue depuis le manifest (source unique de vérité).
|
||||
/**
|
||||
* Pied de page discret bas-droite avec FRS et numéro de version.
|
||||
* Pied de page discret bas-droite avec QRO et numéro de version.
|
||||
*
|
||||
* @author FroSteel
|
||||
* @author Quentin Rouiller
|
||||
*/
|
||||
function initAppFooter() {
|
||||
if (document.querySelector(".app-footer")) return;
|
||||
@@ -1303,7 +1303,7 @@ function initAppFooter() {
|
||||
}
|
||||
const el = document.createElement("div");
|
||||
el.className = "app-footer";
|
||||
el.textContent = `FRS${version ? " / " + version : ""}`;
|
||||
el.textContent = `QRO${version ? " / " + version : ""}`;
|
||||
document.body.appendChild(el);
|
||||
}
|
||||
|
||||
@@ -1360,7 +1360,7 @@ function _toggleView() {
|
||||
* logs verbeux étape par étape ont été retirés, ils polluaient la console
|
||||
* à chaque toggle.
|
||||
*
|
||||
* @author FroSteel
|
||||
* @author Quentin Rouiller
|
||||
*/
|
||||
function _applyViewMode() {
|
||||
const mode = _getCurrentView();
|
||||
@@ -1409,7 +1409,7 @@ function _applyViewMode() {
|
||||
* v2026.5.36 : crée ou retrouve la sidebar, et y déplace les éléments listés.
|
||||
* Les éléments sont déplacés dans l'ordre du tableau.
|
||||
*
|
||||
* @author FroSteel
|
||||
* @author Quentin Rouiller
|
||||
*/
|
||||
function _moveElementsToSidebar(ids) {
|
||||
// Créer (ou retrouver) le wrapper qui contiendra sidebar + main côte à côte
|
||||
@@ -1487,7 +1487,7 @@ function _moveElementsToSidebar(ids) {
|
||||
* v2026.5.36 : restaure chaque élément à son parent d'origine (mémorisé dans
|
||||
* data-orig-parent). Utilisé quand on revient en vue classique.
|
||||
*
|
||||
* @author FroSteel
|
||||
* @author Quentin Rouiller
|
||||
*/
|
||||
function _restoreElementsToTopbar(ids) {
|
||||
// v2026.5.37 : d'abord remettre les flèches dans .date-nav (avant de
|
||||
@@ -1594,7 +1594,7 @@ function _restoreToOriginalParent(el, label) {
|
||||
/**
|
||||
* Horloge HH:MM au milieu de la topbar, mise à jour chaque minute (depuis v5.0.0).
|
||||
*
|
||||
* @author FroSteel
|
||||
* @author Quentin Rouiller
|
||||
*/
|
||||
function initAppClock() {
|
||||
const el = document.getElementById("app-clock");
|
||||
@@ -3475,7 +3475,7 @@ function renderAdminSectionAbout(container, cfg, saveFn) {
|
||||
</div>
|
||||
<div class="admin-about-row">
|
||||
<div class="admin-about-label">Auteur</div>
|
||||
<div class="admin-about-value"><strong>FroSteel</strong></div>
|
||||
<div class="admin-about-value"><strong>Quentin Rouiller</strong></div>
|
||||
</div>
|
||||
<div class="admin-about-row">
|
||||
<div class="admin-about-label">Affiliation</div>
|
||||
@@ -4547,7 +4547,7 @@ async function _purgeOldCacheEntries() {
|
||||
/**
|
||||
* Charge le planning pour la date donnée (fetch XML EasyVista + cache).
|
||||
*
|
||||
* @author FroSteel
|
||||
* @author Quentin Rouiller
|
||||
*/
|
||||
async function loadForDate(isoDate, opts = {}) {
|
||||
LOG.info("load", `début pour ${isoDate}`, { opts, hasSession: !!state.session });
|
||||
@@ -5295,7 +5295,7 @@ function mergeCacheAndFresh(cached, fresh) {
|
||||
});
|
||||
// les réservations/absences disparues du planning EV sont
|
||||
// retirées immédiatement (pas de "ghost" pour elles) — comportement
|
||||
// v5.0.1 d'origine, demandé par FroSteel.
|
||||
// v5.0.1 d'origine, demandé par Quentin.
|
||||
if (iv.type === "AL-Reservation" || iv.type === "AL-Absence") {
|
||||
continue; // on ne rajoute pas → disparait du planning
|
||||
}
|
||||
@@ -7502,7 +7502,7 @@ function _recurringAbsenceLabel(isoDate) {
|
||||
/**
|
||||
* Construit la card HTML d'un technicien (header, timeline, interventions, absences).
|
||||
*
|
||||
* @author FroSteel
|
||||
* @author Quentin Rouiller
|
||||
*/
|
||||
function buildCard(tech, isoDate) {
|
||||
const card = document.createElement("section");
|
||||
@@ -8343,7 +8343,7 @@ function getStatusClass(iv) {
|
||||
/**
|
||||
* Lie les segments timeline à un popover persistant au clic (depuis v4.2.3).
|
||||
*
|
||||
* @author FroSteel
|
||||
* @author Quentin Rouiller
|
||||
*/
|
||||
function bindTimelinePopover(el) {
|
||||
// v2026.5.40 r4 : comportement UNIFIÉ vue classique + vue horizontale.
|
||||
@@ -8477,7 +8477,7 @@ function findIvByActionId(actionId) {
|
||||
/**
|
||||
* Ouvre une grande popup détaillée pour un segment timeline.
|
||||
*
|
||||
* @author FroSteel
|
||||
* @author Quentin Rouiller
|
||||
*/
|
||||
function openPersistentTimelinePopup(el) {
|
||||
if (!el) {
|
||||
@@ -9160,10 +9160,10 @@ function showToast(label, ref) {
|
||||
|
||||
/**
|
||||
* Formate un numéro de téléphone suisse / français.
|
||||
* 079 000 00 79 (mobile CH)
|
||||
* 021 000 00 63 (fixe CH)
|
||||
* +41 79 000 00 67
|
||||
* +33 1 00 00 00 07
|
||||
* 079 123 45 67 (mobile CH)
|
||||
* 021 123 45 67 (fixe CH)
|
||||
* +41 79 123 45 67
|
||||
* +33 1 23 45 67 89
|
||||
* Si le format n'est pas reconnu, renvoie le numéro tel quel (avec les chiffres seuls).
|
||||
*/
|
||||
function formatPhone(raw) {
|
||||
@@ -9462,8 +9462,8 @@ function cleanContactName(raw) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Split un lieu du type "Lausanne/Rue de l'Exemple 9 bis" en
|
||||
* { ville: "Lausanne", adresse: "Rue de l'Exemple 9 bis" }
|
||||
* Split un lieu du type "Lausanne/Rue Caroline 9 bis" en
|
||||
* { ville: "Lausanne", adresse: "Rue Caroline 9 bis" }
|
||||
* Si format inconnu, retourne { ville: null, adresse: raw }.
|
||||
*/
|
||||
function splitLieu(raw) {
|
||||
@@ -9475,7 +9475,7 @@ function splitLieu(raw) {
|
||||
|
||||
// v2026.5.16 : le format EasyVista peut avoir jusqu'à 3 parties séparées
|
||||
// par "/" : VILLE / ADRESSE / PRÉCISIONS (étage, bureau, indications).
|
||||
// Exemple : "LAUSANNE / Av. de l'Exemple 19 / 4eme en face de l'ascenseur"
|
||||
// Exemple : "LAUSANNE / Av. de Beaulieu 19 / 4eme en face de l'ascenseur"
|
||||
// On ne garde que VILLE + ADRESSE. Les précisions (3e partie et suivantes)
|
||||
// sont strippées — elles alourdissent la carte et sont disponibles dans
|
||||
// le tooltip détaillé.
|
||||
@@ -9945,7 +9945,7 @@ function _cancelPendingShowTooltip() {
|
||||
/**
|
||||
* Affiche un tooltip au survol d'une intervention/réservation.
|
||||
*
|
||||
* @author FroSteel
|
||||
* @author Quentin Rouiller
|
||||
*/
|
||||
function showTooltip(e, iv, rowEl) {
|
||||
// v2026.5.39 : on planifie l'affichage à +500ms.
|
||||
@@ -10205,7 +10205,7 @@ function reapplyTooltipPosition() {
|
||||
* @param {HTMLElement} sourceEl - l'élément déclencheur (row, card, segment)
|
||||
* @param {object} opts - options { anchorBelow: true pour préférer dessous }
|
||||
*
|
||||
* @author FroSteel
|
||||
* @author Quentin Rouiller
|
||||
*/
|
||||
function positionTooltipAnchored(sourceEl, opts) {
|
||||
opts = opts || {};
|
||||
@@ -10359,7 +10359,7 @@ function _rectsOverlap(a, b) {
|
||||
* ligne source `rowEl`. Essaie dans l'ordre : droite, gauche, dessous, dessus.
|
||||
* Retourne {x, y} en coordonnées document, ou null si aucune position libre.
|
||||
*
|
||||
* @author FroSteel
|
||||
* @author Quentin Rouiller
|
||||
*/
|
||||
function _findFreePopupPosition(rowEl, w, h) {
|
||||
const pad = 14;
|
||||
@@ -10473,7 +10473,7 @@ function _findFreePopupPosition(rowEl, w, h) {
|
||||
* v4.3.0 : épingle la bulle courante en la clonant dans un popup détaché
|
||||
* ancré au contenu. Le tooltip live redevient disponible.
|
||||
*
|
||||
* @author FroSteel
|
||||
* @author Quentin Rouiller
|
||||
*/
|
||||
function pinTooltip() {
|
||||
if (!state.currentTooltipIv) return;
|
||||
@@ -10895,7 +10895,7 @@ async function _refreshPinnedPopupIv(popup, iv) {
|
||||
*
|
||||
* @param {HTMLElement} el - le popup à désépingler
|
||||
*
|
||||
* @author FroSteel
|
||||
* @author Quentin Rouiller
|
||||
*/
|
||||
function _softUnpinPopup(el) {
|
||||
if (!el) {
|
||||
@@ -11402,7 +11402,7 @@ function _getPopupSafeArea() {
|
||||
* dans la safe area. Appelé à l'épinglage, pendant le drag, et quand le dock
|
||||
* apparaît/disparaît.
|
||||
*
|
||||
* @author FroSteel
|
||||
* @author Quentin Rouiller
|
||||
*/
|
||||
function _clampPopupInSafeArea(popup) {
|
||||
if (!popup) return;
|
||||
@@ -12189,7 +12189,7 @@ function bindTooltipInteractions() {
|
||||
/**
|
||||
* Construit le HTML du tooltip détaillé pour une intervention/réservation.
|
||||
*
|
||||
* @author FroSteel
|
||||
* @author Quentin Rouiller
|
||||
*/
|
||||
function buildTooltipHTML(iv) {
|
||||
if (!iv) return '<dl><dt>Info</dt><dd>—</dd></dl>';
|
||||
|
||||
Reference in New Issue
Block a user