Version 4.1.3 — Introduction tooltips épinglables (pinTooltip)

This commit is contained in:
2026-04-18 09:00:00 +02:00
parent edd6ffc1c3
commit 7201fde2d3
3 changed files with 334 additions and 722 deletions
+8 -57
View File
@@ -1,13 +1,18 @@
// background.js — Service worker (Manifest V3)
// background.js — Service worker (Manifest V3) — v4
//
// Rôles :
// 1. Au clic sur l'icône : ouvrir le viewer
// 2. Répondre aux messages du viewer :
// - getSession : trouve l'onglet EasyVista ouvert, renvoie {phpsessid, origin}
// - fetchPlanning : fetch le XML du planning pour une date
// - fetchFiche : fetch une fiche individuelle (HTML)
// - fetchPlanning : fetch le XML du planning pour une date (1 requête = tout)
// - 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)
// 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)
const EV_ORIGINS = [
@@ -110,42 +115,6 @@ async function fetchFicheHtml(origin, phpsessid, formLink) {
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"
// ============================================================================
@@ -214,24 +183,6 @@ chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
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") {
scheduleAutoRefreshAlarms();
sendResponse({ ok: true });