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
+
+ {{ initials(p) }}{{ p }}
+
+ 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; }