From dbbcd721e40d464cd2ccd3a3b35160d5bde059b1 Mon Sep 17 00:00:00 2001 From: louispaulb Date: Sun, 19 Jul 2026 15:10:07 -0400 Subject: [PATCH] =?UTF-8?q?feat(ops):=20accueil=20=C2=AB=20Mon=20aujourd'h?= =?UTF-8?q?ui=20=C2=BB=20v2=20=E2=80=94=20chiffres=20exacts=20+=20=C3=A9ta?= =?UTF-8?q?t=20terrain=20live=20+=20actions=20r=C3=A9elles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Applique « ne pas réutiliser une UX/métrique faible telle quelle » : - Boîte de réception : remplace le compteur de session 'unread' (démarrait à 0, trompeur) par un VRAI décompte via /conversations/inbox-tickets — « à trier » (non assignés) + total ouvert. Tickets sur moi = _assign contient mon courriel. - Interventions aujourd'hui : ajoute l'ÉTAT TERRAIN LIVE (en route / sur place via /roster/geofence-states, pastilles qui pulsent) en plus du découpage par statut. - Barre d'ACTIONS réelles : « Allouer un technicien » → ouvre le copilote NL PRÉ-REMPLI (event ops:assistant → MainLayout), « Nouvelle vente », « Rechercher ⌘K ». Le pont ops:assistant est ajouté dans MainLayout (propre). - États chargement (« … ») / vide, focus clavier, prefers-reduced-motion. Vérifié en dev : rendu, 199 à trier (donnée réelle), event allocate + palette OK, 0 erreur console. Build OK, leak-clean, déployé. Co-Authored-By: Claude Fable 5 --- .../src/components/shared/MonAujourdhui.vue | Bin 7173 -> 10635 bytes apps/ops/src/layouts/MainLayout.vue | 6 ++++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/ops/src/components/shared/MonAujourdhui.vue b/apps/ops/src/components/shared/MonAujourdhui.vue index 6debda2589df6d1dbbba6f731187786ccb5ad0c8..18273f286211c91da21c6e3489d673495815ec4b 100644 GIT binary patch literal 10635 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 window.addEventListener('keydown', onGlobalKey)) -onBeforeUnmount(() => window.removeEventListener('keydown', onGlobalKey)) +// Ouvre le copilote NL PRÉ-REMPLI depuis un autre composant (ex. accueil → « Allouer un technicien »). +function onAssistantEvent (e) { onNlCommand((e && e.detail && e.detail.text) || '') } +onMounted(() => { window.addEventListener('keydown', onGlobalKey); window.addEventListener('ops:assistant', onAssistantEvent) }) +onBeforeUnmount(() => { window.removeEventListener('keydown', onGlobalKey); window.removeEventListener('ops:assistant', onAssistantEvent) }) const auth = useAuthStore() const { can, isLoaded, userName, userEmail } = usePermissions()