From 6224271e07de5c11f9c2b456b40f2991576fc10b Mon Sep 17 00:00:00 2001 From: louispaulb Date: Wed, 8 Jul 2026 13:53:21 -0400 Subject: [PATCH] =?UTF-8?q?ticket=20:=20afficher=20le=20technicien=20assig?= =?UTF-8?q?n=C3=A9=20EN=20T=C3=8ATE=20du=20panneau=20d=C3=A9tail=20(IssueD?= =?UTF-8?q?etail)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le panneau (IssueDetail dans DetailModal, ouvert depuis /tickets ou la fiche client) ne montrait pas le tech assigné — seulement `_assign` (agents) + `assigned_tech` enfoui dans l'arbre des tâches. Ajout d'une bannière « Technicien » en tête : chips (initiales + nom) des techs des Dispatch Jobs liés (`assigned_tech`, déjà fetchés) + staff legacy (`doc.assigned_staff`, ce que montrent les lignes de liste), dédupliqués ; « Non assigné » si des jobs existent sans tech. Réutilise le `initials()` local. (1/4 de la standardisation des détails ticket — reste en session dédiée, cf reference_ticket_detail_disparities.) Co-Authored-By: Claude Opus 4.8 --- .../shared/detail-sections/IssueDetail.vue | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/apps/ops/src/components/shared/detail-sections/IssueDetail.vue b/apps/ops/src/components/shared/detail-sections/IssueDetail.vue index 4cc2725..ede38a9 100644 --- a/apps/ops/src/components/shared/detail-sections/IssueDetail.vue +++ b/apps/ops/src/components/shared/detail-sections/IssueDetail.vue @@ -35,6 +35,16 @@ + +
+ + Technicien + + Non assigné +
+
Statut @@ -427,6 +437,14 @@ async function unlinkCustomer () { const userOptions = ref([]) const loadingUsers = ref(false) const assignees = ref([]) +// Technicien(s) assigné(s) surfacé(s) EN TÊTE : tech des Dispatch Jobs liés (« assigné au job ») + staff legacy (ce que montrent les lignes de liste, absent du panneau jusqu'ici). Dédupliqué. +const assignedPeople = computed(() => { + const seen = new Set(); const out = [] + const add = v => { const s = (v == null ? '' : String(v)).trim(); if (s && !seen.has(s.toLowerCase())) { seen.add(s.toLowerCase()); out.push(s) } } + for (const j of (props.dispatchJobs || [])) add(j.assigned_tech) + add(props.doc && props.doc.assigned_staff) + return out +}) function parseAssign (raw) { if (!raw) return [] @@ -863,6 +881,8 @@ async function sendTicketEmail () { } .cust-name { font-weight: 600; font-size: 0.9rem; color: #166534; cursor: pointer; } .cust-name:hover { text-decoration: underline; } +.tech-banner { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; } +.tech-banner-lbl { font-size: 12px; font-weight: 600; color: #607d8b; } /* Fil unifié en bulles */ .thread-wrap { display: flex; flex-direction: column; gap: 10px; }