Compare commits

...

4 Commits

Author SHA1 Message Date
FroSteel be49a89057 Version 4.1.6 — Améliorations tooltip 2026-04-18 15:00:00 +02:00
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
3 changed files with 490 additions and 724 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.2.0", "version": "4.1.6",
"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.6 : parsing fiche corrigé pour trouver l'Intervenant via ng-model=colData.value et ignorer les blocs d'action vides (étapes workflow automatiques).",
"permissions": [ "permissions": [
"activeTab", "activeTab",
"scripting", "scripting",
+479 -664
View File
File diff suppressed because it is too large Load Diff