Compare commits

..

6 Commits

Author SHA1 Message Date
FroSteel e42b145401 Version 4.1.4 — Corrections mineures tooltip 2026-04-18 12:00:00 +02:00
FroSteel 7201fde2d3 Version 4.1.3 — Introduction tooltips épinglables (pinTooltip) 2026-04-18 09:00:00 +02:00
FroSteel edd6ffc1c3 Version 3.3.0 — Corrections + raffinements
(manifest.json corrigé : était resté à 3.2.0 par oubli)
2026-04-17 18:00:00 +02:00
FroSteel 23244fc4db Version 3.2.0 — Stabilisation 3.2 2026-04-17 16:00:00 +02:00
FroSteel f52095dc4d Version 3.2.0 (pre-release) — Travail en cours sur la 3.2 2026-04-17 14:00:00 +02:00
FroSteel 94877cb816 Version 3.1.0 — Améliorations affichage 2026-04-17 11:00:00 +02:00
5 changed files with 729 additions and 626 deletions
+8 -57
View File
@@ -1,13 +1,18 @@
// background.js — Service worker (Manifest V3) // background.js — Service worker (Manifest V3) — v4
// //
// Rôles : // Rôles :
// 1. Au clic sur l'icône : ouvrir le viewer // 1. Au clic sur l'icône : ouvrir le viewer
// 2. Répondre aux messages du viewer : // 2. Répondre aux messages du viewer :
// - getSession : trouve l'onglet EasyVista ouvert, renvoie {phpsessid, origin} // - getSession : trouve l'onglet EasyVista ouvert, renvoie {phpsessid, origin}
// - fetchPlanning : fetch le XML du planning pour une date // - fetchPlanning : fetch le XML du planning pour une date (1 requête = tout)
// - fetchFiche : fetch une fiche individuelle (HTML) // - fetchXhr2 : fetch un texte d'action détaillé (utilisé en lazy-load au survol)
// - fetchFiche : fetch une fiche individuelle (HTML) pour statut + commentaire tech
// 3. Programmer les alarmes de refresh auto (12h, 15h) // 3. Programmer les alarmes de refresh auto (12h, 15h)
// 4. Nettoyer les vieux caches (>7 jours) // 4. Nettoyer les vieux caches (>7 jours)
//
// v4 : suppression de fetchTimeline (pu utilisé). Le calendar_block contient
// directement ref/contact/lieu/catégorie dans ses attributs attr1/attr2/attr3,
// donc on n'a plus besoin ni de xhr2 en masse, ni de l'API timeline.
// Domaines EasyVista reconnus (interne d'abord, externe en fallback) // Domaines EasyVista reconnus (interne d'abord, externe en fallback)
const EV_ORIGINS = [ const EV_ORIGINS = [
@@ -110,42 +115,6 @@ async function fetchFicheHtml(origin, phpsessid, formLink) {
return html; return html;
} }
// GUID du "sender" du menu/workflow — observé dans les URLs EasyVista du planning.
// Le sender du formLink du XML planning est {9C395E45-...} mais l'API timeline
// utilise le sender de la FICHE parent ({C99ECD05-...}).
const TIMELINE_SENDER = "%7BC99ECD05-3D48-4C62-ABF0-66292053AED6%7D";
/**
* Fetch l'API timeline JSON pour récupérer le texte des actions d'une fiche.
* Params :
* - target : ID interne de la fiche (pas l'action_id)
* - checksum : checksum frais extrait depuis le HTML de la fiche
* Retour : texte JSON de l'API, ou null en cas d'erreur.
*/
async function fetchTimelineJson(origin, phpsessid, target, checksum) {
const url =
`${origin}/api/v1/internal/forms/${TIMELINE_SENDER}/timeline` +
`?target=${encodeURIComponent(target)}` +
`&checksum=${encodeURIComponent(checksum)}` +
`&type=todo` +
`&sectionId=1` +
`&navigator=` +
`&nbRecord=0` +
`&PHPSESSID=${encodeURIComponent(phpsessid)}`;
console.log("[bg] fetchTimelineJson →", url.substring(0, 120));
const r = await fetch(url, {
credentials: "include",
headers: {
"Accept": "application/json",
"X-Requested-With": "XMLHttpRequest"
}
});
if (!r.ok) throw new Error("HTTP " + r.status);
const body = await r.text();
console.log("[bg] timeline status =", r.status, "| taille =", body.length);
return body;
}
// ============================================================================ // ============================================================================
// Détection "session invalide" // Détection "session invalide"
// ============================================================================ // ============================================================================
@@ -214,24 +183,6 @@ chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
return; return;
} }
if (msg.type === "fetchTimeline") {
const session = await findEasyVistaSession();
if (!session) {
sendResponse({ ok: false, error: "no_session" });
return;
}
const body = await fetchTimelineJson(
session.origin, session.phpsessid, msg.target, msg.checksum
);
// Si on reçoit du HTML au lieu de JSON, c'est une page d'erreur / login
if (body.trimStart().startsWith("<")) {
sendResponse({ ok: false, error: "not_json" });
return;
}
sendResponse({ ok: true, body });
return;
}
if (msg.type === "scheduleAutoRefresh") { if (msg.type === "scheduleAutoRefresh") {
scheduleAutoRefreshAlarms(); scheduleAutoRefreshAlarms();
sendResponse({ ok: true }); sendResponse({ ok: true });
+2 -2
View File
@@ -1,8 +1,8 @@
{ {
"manifest_version": 3, "manifest_version": 3,
"name": "Planning Techniciens — Vue claire", "name": "Planning Techniciens — Vue claire",
"version": "3.0.0", "version": "4.1.4",
"description": "Vue claire du planning EasyVista (itsma.etat-de-vaud.ch et itsma.vd.ch) avec navigation par date, détection automatique des interventions closes et cache 7 jours.", "description": "Vue claire du planning EasyVista (itsma.etat-de-vaud.ch et itsma.vd.ch). v4.1.4 : fetch fiche fraîche à chaque clic (checksum pas en cache) + logging détaillé console pour diagnostiquer le checksum.",
"permissions": [ "permissions": [
"activeTab", "activeTab",
"scripting", "scripting",
+12
View File
@@ -259,6 +259,18 @@ html, body {
opacity: 0.9; opacity: 0.9;
} }
/* Bouton "Arrêter" (apparaît pendant un refresh manuel) */
.btn-abort {
background: var(--danger-soft);
color: var(--danger);
border-color: var(--danger);
}
.btn-abort:hover {
background: var(--danger);
color: white;
border-color: var(--danger);
}
#refresh-icon.spinning { #refresh-icon.spinning {
display: inline-block; display: inline-block;
animation: spin 0.8s linear infinite; animation: spin 0.8s linear infinite;
+3
View File
@@ -22,6 +22,9 @@
<button id="refresh-btn" class="btn" title="Rafraîchir maintenant"> <button id="refresh-btn" class="btn" title="Rafraîchir maintenant">
<span id="refresh-icon"></span> Rafraîchir <span id="refresh-icon"></span> Rafraîchir
</button> </button>
<button id="abort-btn" class="btn btn-abort hidden" title="Arrêter le rafraîchissement en cours">
✕ Arrêter
</button>
<button id="clear-cache-btn" class="btn btn-subtle" title="Vider le cache du jour affiché"> <button id="clear-cache-btn" class="btn btn-subtle" title="Vider le cache du jour affiché">
Vider cache Vider cache
</button> </button>
+675 -538
View File
File diff suppressed because it is too large Load Diff