improve(ops): accueil = tableau VIVANT — rafraîchit les compteurs (60 s + retour d'onglet)

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 <noreply@anthropic.com>
This commit is contained in:
louispaulb 2026-07-19 19:56:16 -04:00
parent 7371c1b446
commit 4718d025f3

View File

@ -7,7 +7,7 @@
* (en route / sur place via /roster/geofence-states). Actions réelles (assistant NL pré-rempli, K, nouvelle vente). * (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. * 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 { useRouter } from 'vue-router'
import { usePermissions } from 'src/composables/usePermissions' import { usePermissions } from 'src/composables/usePermissions'
import { useCommandPalette } from 'src/composables/useCommandPalette' import { useCommandPalette } from 'src/composables/useCommandPalette'
@ -92,7 +92,12 @@ async function load () {
try { await Promise.all(tasks) } catch (e) { /* dégradé */ } try { await Promise.all(tasks) } catch (e) { /* dégradé */ }
loading.value = false 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) 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 ' } })) } function allocate () { window.dispatchEvent(new CustomEvent('ops:assistant', { detail: { text: 'Allouer un technicien pour le client ' } })) }