diff --git a/src/views/PeopleView.vue b/src/views/PeopleView.vue index 92a1067..a5e4e0f 100644 --- a/src/views/PeopleView.vue +++ b/src/views/PeopleView.vue @@ -2056,6 +2056,8 @@ async function loadClusterResults() { } // Build cluster_id → faces[] mapping from frames const clusterFacesMap: Record = {} + const clusterTraceIdsMap: Record> = {} + const faceIdToTraceId: Record = {} for (const f of frames) { for (const face of (f.faces || [])) { const cid = face.cluster_id @@ -2066,15 +2068,35 @@ async function loadClusterResults() { frame: f.frame, timestamp: f.timestamp, confidence: face.confidence, - cluster_id: cid + cluster_id: cid, + trace_id: face.trace_id }) + if (face.trace_id !== undefined && face.trace_id !== null) { + if (!clusterTraceIdsMap[cid]) clusterTraceIdsMap[cid] = new Set() + clusterTraceIdsMap[cid].add(face.trace_id) + if (face.face_id) { + faceIdToTraceId[face.face_id] = face.trace_id + } + } } } - // Assign faces to each cluster + // Assign faces and trace_ids to each cluster for (const c of groups) { const cid = c.cluster_id || c.group_id c.member_faces = clusterFacesMap[cid] || [] c.face_count = c.member_faces.length + c.trace_ids = Array.from(clusterTraceIdsMap[cid] || []) + // Set representative_trace from representative_face + if (c.representative_face?.face_id) { + const repTraceId = faceIdToTraceId[c.representative_face.face_id] + if (repTraceId !== undefined) { + c.representative_trace = repTraceId + } + } + // Fallback to first trace_id + if (c.representative_trace === undefined && c.trace_ids.length > 0) { + c.representative_trace = c.trace_ids[0] + } } if (groups.length) { setClusterResults(fileUuid, groups)