|
|
@@ -1955,11 +1955,19 @@ async function loadForDate(isoDate, opts = {}) {
|
|
|
|
)
|
|
|
|
)
|
|
|
|
);
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// v5.0.6 : logs détaillés pour diagnostiquer pourquoi le fetch ne se
|
|
|
|
|
|
|
|
// lance pas.
|
|
|
|
|
|
|
|
const totalIv = merged.techs.reduce((s, t) => s + (t.interventions || []).length, 0);
|
|
|
|
|
|
|
|
const totalInterIv = merged.techs.reduce((s, t) =>
|
|
|
|
|
|
|
|
s + (t.interventions || []).filter(i => i.type === "AL-Intervention").length, 0);
|
|
|
|
|
|
|
|
const notFetched = merged.techs.reduce((s, t) =>
|
|
|
|
|
|
|
|
s + (t.interventions || []).filter(i => i.type === "AL-Intervention" && !i.ficheFetched).length, 0);
|
|
|
|
|
|
|
|
console.log(`[load] merged : ${merged.techs.length} techs, ${totalIv} iv totales, ${totalInterIv} interventions réelles, ${notFetched} sans fiche`);
|
|
|
|
|
|
|
|
console.log(`[load] needFetch = ${needFetch} | doStatusRefresh = ${!!opts.doStatusRefresh} | forceRefetch = ${!!opts.forceRefetch} | aborted = ${isRefreshAborted(myToken)}`);
|
|
|
|
|
|
|
|
|
|
|
|
// v4.3.2 : avant de lancer le fetch des fiches (lourd, ~460 KB chacune),
|
|
|
|
// v4.3.2 : avant de lancer le fetch des fiches (lourd, ~460 KB chacune),
|
|
|
|
// on fait d'abord un batch xhr2 (léger, ~2-5 KB chacun) pour récupérer
|
|
|
|
// on fait d'abord un batch xhr2 (léger, ~2-5 KB chacun) pour récupérer
|
|
|
|
// les vraies infos contact/lieu de toutes les interventions en parallèle.
|
|
|
|
// les vraies infos contact/lieu de toutes les interventions en parallèle.
|
|
|
|
// Comme ça les cartes s'enrichissent en 1-3 secondes au lieu d'attendre
|
|
|
|
|
|
|
|
// que l'utilisateur les survole une par une.
|
|
|
|
|
|
|
|
if (!isRefreshAborted(myToken)) {
|
|
|
|
if (!isRefreshAborted(myToken)) {
|
|
|
|
await prefetchAllXhr2(merged.techs, myToken, opts.doStatusRefresh);
|
|
|
|
await prefetchAllXhr2(merged.techs, myToken, opts.doStatusRefresh);
|
|
|
|
}
|
|
|
|
}
|
|
|
@@ -1968,13 +1976,10 @@ async function loadForDate(isoDate, opts = {}) {
|
|
|
|
const tFiches = performance.now();
|
|
|
|
const tFiches = performance.now();
|
|
|
|
const nFiches = merged.techs.flatMap(t=>t.interventions).filter(i=>i.type==="AL-Intervention").length;
|
|
|
|
const nFiches = merged.techs.flatMap(t=>t.interventions).filter(i=>i.type==="AL-Intervention").length;
|
|
|
|
console.log(`[load] début fetch des ${nFiches} fiches (statuts)…`);
|
|
|
|
console.log(`[load] début fetch des ${nFiches} fiches (statuts)…`);
|
|
|
|
// forceAll : uniquement si refresh manuel (bouton "rafraichir").
|
|
|
|
|
|
|
|
// À la navigation normale entre dates, on ne refetch que les iv non
|
|
|
|
|
|
|
|
// encore enrichies (ficheFetched=false) — ça reprend là où on s'était
|
|
|
|
|
|
|
|
// arrêté si un refresh précédent a été interrompu par un changement de
|
|
|
|
|
|
|
|
// date.
|
|
|
|
|
|
|
|
await refreshStatuses(merged.techs, isoDate, { forceAll: !!opts.doStatusRefresh, myToken });
|
|
|
|
await refreshStatuses(merged.techs, isoDate, { forceAll: !!opts.doStatusRefresh, myToken });
|
|
|
|
console.log(`[load] fiches finies en ${Math.round(performance.now() - tFiches)} ms`);
|
|
|
|
console.log(`[load] fiches finies en ${Math.round(performance.now() - tFiches)} ms`);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
console.log(`[load] PAS DE FETCH : needFetch=${needFetch}, doStatusRefresh=${!!opts.doStatusRefresh}, aborted=${isRefreshAborted(myToken)}`);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 6. Sauvegarder dans le cache (une seule fois, après que tout soit enrichi)
|
|
|
|
// 6. Sauvegarder dans le cache (une seule fois, après que tout soit enrichi)
|
|
|
@@ -3942,16 +3947,16 @@ function buildCard(tech, isoDate) {
|
|
|
|
// bouton visible). Contient : détail période + bouton supprimer si
|
|
|
|
// bouton visible). Contient : détail période + bouton supprimer si
|
|
|
|
// c'est une absence supprimable (actionId réel, pas pompier récurrent).
|
|
|
|
// c'est une absence supprimable (actionId réel, pas pompier récurrent).
|
|
|
|
if (ab.actionId && !ab.isPompier && !ab._recurring) {
|
|
|
|
if (ab.actionId && !ab.isPompier && !ab._recurring) {
|
|
|
|
// On attache le tooltip sur la CARD ENTIÈRE (cardEl) — comme ça
|
|
|
|
// On attache le tooltip sur la CARD ENTIÈRE (card) — comme ça
|
|
|
|
// survoler n'importe où sur la zone grisée "absent" le déclenche.
|
|
|
|
// survoler n'importe où sur la zone grisée "absent" le déclenche.
|
|
|
|
const ivCopy = {
|
|
|
|
const ivCopy = {
|
|
|
|
...ab,
|
|
|
|
...ab,
|
|
|
|
type: "AL-Absence" // force pour buildTooltipHTML
|
|
|
|
type: "AL-Absence" // force pour buildTooltipHTML
|
|
|
|
};
|
|
|
|
};
|
|
|
|
cardEl.addEventListener("mouseenter", (e) => {
|
|
|
|
card.addEventListener("mouseenter", (e) => {
|
|
|
|
showTooltip(e, ivCopy, cardEl);
|
|
|
|
showTooltip(e, ivCopy, card);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
cardEl.addEventListener("mouseleave", () => {
|
|
|
|
card.addEventListener("mouseleave", () => {
|
|
|
|
hideTooltip();
|
|
|
|
hideTooltip();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|