From 4718d025f3c96fd738cc6f94cb371ac7b397c5ee Mon Sep 17 00:00:00 2001 From: louispaulb Date: Sun, 19 Jul 2026 19:56:16 -0400 Subject: [PATCH] =?UTF-8?q?improve(ops):=20accueil=20=3D=20tableau=20VIVAN?= =?UTF-8?q?T=20=E2=80=94=20rafra=C3=AEchit=20les=20compteurs=20(60=20s=20+?= =?UTF-8?q?=20retour=20d'onglet)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit L'accueil ne chargeait qu'au montage. Ajout : refetch toutes les 60 s + immédiat au retour sur l'onglet (visibilitychange), avec nettoyage à onUnmounted. dash() conserve la valeur précédente pendant le refetch → pas de clignotement vers « … ». Les compteurs « en attente de réponse / en retard / interventions » restent à jour sans rechargement. Build OK, leak-clean, déployé. Co-Authored-By: Claude Fable 5 --- apps/ops/src/components/shared/MonAujourdhui.vue | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/apps/ops/src/components/shared/MonAujourdhui.vue b/apps/ops/src/components/shared/MonAujourdhui.vue index 57b8684..bf1b85a 100644 --- a/apps/ops/src/components/shared/MonAujourdhui.vue +++ b/apps/ops/src/components/shared/MonAujourdhui.vue @@ -7,7 +7,7 @@ * (en route / sur place via /roster/geofence-states). Actions réelles (assistant NL pré-rempli, ⌘K, nouvelle vente). * Additif, monté en tête du tableau de bord. */ -import { ref, computed, onMounted } from 'vue' +import { ref, computed, onMounted, onUnmounted } from 'vue' import { useRouter } from 'vue-router' import { usePermissions } from 'src/composables/usePermissions' import { useCommandPalette } from 'src/composables/useCommandPalette' @@ -92,7 +92,12 @@ async function load () { try { await Promise.all(tasks) } catch (e) { /* dégradé */ } loading.value = false } -onMounted(load) +// Accueil = tableau VIVANT : rafraîchit les compteurs (en attente / en retard / interventions) toutes les 60 s et au +// retour sur l'onglet. dash() garde la valeur précédente pendant le refetch (pas de clignotement vers « … »). +let refreshTimer = null +function onVisible () { if (document.visibilityState === 'visible') load() } +onMounted(() => { load(); refreshTimer = setInterval(load, 60000); document.addEventListener('visibilitychange', onVisible) }) +onUnmounted(() => { if (refreshTimer) clearInterval(refreshTimer); document.removeEventListener('visibilitychange', onVisible) }) const dash = (v) => (loading.value && v == null) ? '…' : (v == null ? '—' : v) function allocate () { window.dispatchEvent(new CustomEvent('ops:assistant', { detail: { text: 'Allouer un technicien pour le client ' } })) }