diff --git a/app/admin/device-link-conflicts/page.tsx b/app/admin/device-link-conflicts/page.tsx index e321313..72d06fb 100644 --- a/app/admin/device-link-conflicts/page.tsx +++ b/app/admin/device-link-conflicts/page.tsx @@ -55,6 +55,27 @@ function confidenceColor(c: string | null): 'default' | 'secondary' | 'outline' return 'outline'; } +const CONFIDENCE_RANK: Record = { + exact_serial: 0, + mac: 1, + hostname_in_company: 2, +}; + +function dedupeCandidates(candidates: Candidate[]): Candidate[] { + const byId = new Map(); + for (const c of candidates) { + const existing = byId.get(c.ciId); + if (!existing) { + byId.set(c.ciId, c); + continue; + } + const a = CONFIDENCE_RANK[existing.confidence ?? ''] ?? 99; + const b = CONFIDENCE_RANK[c.confidence ?? ''] ?? 99; + if (b < a) byId.set(c.ciId, c); + } + return Array.from(byId.values()); +} + export default function DeviceLinkConflictsPage() { const [items, setItems] = useState(null); const [total, setTotal] = useState(0); @@ -172,7 +193,9 @@ export default function DeviceLinkConflictsPage() { )} - {items?.map((r) => ( + {items?.map((r) => { + const candidates = dedupeCandidates(r.candidates); + return (
@@ -190,7 +213,7 @@ export default function DeviceLinkConflictsPage() {
- {r.candidates.length} candidates + {candidates.length} candidates
@@ -202,7 +225,7 @@ export default function DeviceLinkConflictsPage() {
- {r.candidates.map((c) => { + {candidates.map((c) => { const isResolving = resolving === `${r.id}:${c.ciId}`; return (
- ))} + ); + })}