1import{r as x,j as e}from"./vendor-BMTqjksT.js";import{t as d,i as s,aE as D,n as C,ay as k,aa as M,ag as P}from"./index-C0VezhcQ.js";import{A as E,M as u}from"./AdminLayout-Cd2syILU.js";import{R as G}from"./route-ZVFl2Rsv.js";import"./trpc-c2OaEmLI.js";import"./d3-ngNJxV2x.js";import"./sparkles-D2L2V_UA.js";import"./chart-no-axes-column-D7MgvIiw.js";const $=[{value:"pending",label:"Safe pending"},{value:"needs_review",label:"Needs review"},{value:"approved",label:"Approved for merge"},{value:"merged",label:"Merged"}],_=[{key:"safePendingGroups",label:"Safe Groups Ready",icon:C,tone:"text-emerald-700 bg-emerald-50 border-emerald-200"},{key:"manualReviewRows",label:"Manual Review Rows",icon:D,tone:"text-amber-700 bg-amber-50 border-amber-200"},{key:"completedMerges",label:"Completed Merges",icon:u,tone:"text-blue-700 bg-blue-50 border-blue-200"},{key:"activeRedirects",label:"Active 301 Redirects",icon:G,tone:"text-violet-700 bg-violet-50 border-violet-200"}];function q(){const n=d.useUtils(),[t,y]=x.useState("pending"),[g,j]=x.useState("Reviewed against current firm and contact details"),[c,h]=x.useState([]),N=d.duplicateRemediation.getStats.useQuery(void 0,{refetchInterval:3e4}),r=d.duplicateRemediation.listCandidates.useQuery({status:t,limit:50}),o=d.duplicateRemediation.scanCandidates.useMutation({onSuccess:()=>{s.success("Duplicate candidates refreshed"),n.duplicateRemediation.invalidate()},onError:a=>s.error(a.message)}),b=d.duplicateRemediation.runSafePilot.useMutation({onSuccess:a=>{s.success(`Pilot complete: ${a.merged.length} duplicate profiles merged`),n.duplicateRemediation.invalidate()},onError:a=>s.error(a.message)}),m=d.duplicateRemediation.reviewGroup.useMutation({onSuccess:()=>{s.success("Manual review decision saved"),n.duplicateRemediation.invalidate()},onError:a=>s.error(a.message)}),R=d.duplicateRemediation.runApprovedBatch.useMutation({onSuccess:a=>{s.success(`Approved batch complete: ${a.merged.length} profiles merged`),n.duplicateRemediation.invalidate()},onError:a=>s.error(a.message)}),p=d.duplicateRemediation.mergeSelectedApprovedGroups.useMutation({onSuccess:a=>{s.success(`Selected merge complete: ${a.merged.length} profiles merged`),h([]),n.duplicateRemediation.invalidate()},onError:a=>s.error(a.message)}),A=(a,i,l)=>{window.confirm(i==="approve"?"Approve this profile as canonical for its duplicate group? The group can be merged later through the approved batch control.":"Keep this duplicate group separate? This prevents automatic merging for the group.")&&m.mutate({groupKey:a,action:i,canonicalAttorneyId:l,note:g})},w=a=>h(i=>i.includes(a)?i.filter(l=>l!==a):[...i,a]),v=a=>{a.length&&window.confirm(`Merge ${a.length} manually approved duplicate group${a.length===1?"":"s"}? Every retired profile receives an audit record and permanent redirect.`)&&p.mutate({groupKeys:a})},f=N.data;return e.jsx(E,{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:62",title:"Duplicate Profile Remediation",breadcrumb:"Data Quality / Duplicate Remediation",children:e.jsxs("div",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:63",className:"space-y-6",children:[e.jsx("div",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:64",className:"rounded-xl border border-amber-200 bg-amber-50 p-5",children:e.jsxs("div",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:65",className:"flex gap-3",children:[e.jsx(D,{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:66",className:"h-5 w-5 shrink-0 text-amber-700 mt-0.5"}),e.jsxs("div",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:67",children:[e.jsx("h2",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:68",className:"font-semibold text-amber-950",children:"Protected merge workflow"}),e.jsx("p",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:69",className:"mt-1 text-sm text-amber-900",children:"Only same-firm, contact-corroborated, unclaimed profiles are eligible for the automatic pilot. Multi-firm and conflicting-identity records remain in manual review; every completed merge creates an audit record and a one-hop 301 redirect."})]})]})}),e.jsx("div",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:74",className:"grid gap-4 sm:grid-cols-2 xl:grid-cols-4",children:_.map(({key:a,label:i,icon:l,tone
1:S})=>e.jsxs("div",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:76",className:`rounded-xl border p-4 ${S}`,children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:77",className:"flex items-center justify-between",children:[e.jsx("span",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:77",className:"text-sm font-medium",children:i}),e.jsx(l,{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:77",className:"h-5 w-5"})]}),e.jsx("div",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:78",className:"mt-3 text-3xl font-bold",children:f?.[a]??"â"})]},a))}),e.jsxs("div",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:83",className:"flex flex-wrap gap-3",children:[e.jsxs("button",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:84",onClick:()=>o.mutate(),disabled:o.isPending,className:"inline-flex items-center gap-2 rounded-lg bg-slate-900 px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:[e.jsx(k,{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:84",className:`h-4 w-4 ${o.isPending?"animate-spin":""}`})," Scan candidates"]}),e.jsxs("button",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:85",onClick:()=>b.mutate({limit:25}),disabled:b.isPending||!f?.safePendingGroups,className:"inline-flex items-center gap-2 rounded-lg bg-emerald-700 px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:[e.jsx(M,{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:85",className:"h-4 w-4"})," Run safe 25-group pilot"]}),e.jsxs("button",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:86",onClick:()=>{window.confirm("Merge up to 10 manually approved groups? Each retirement will create an audit record and permanent redirect.")&&R.mutate({limit:10})},disabled:R.isPending,className:"inline-flex items-center gap-2 rounded-lg bg-blue-700 px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:[e.jsx(u,{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:86",className:"h-4 w-4"})," Merge approved groups"]}),t==="approved"&&e.jsxs("button",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:87",onClick:()=>v(c),disabled:p.isPending||c.length===0,className:"inline-flex items-center gap-2 rounded-lg bg-indigo-700 px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:[e.jsx(u,{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:87",className:"h-4 w-4"})," Merge selected approved groups (",c.length,")"]}),e.jsx("div",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:88",className:"inline-flex overflow-hidden rounded-lg border border-slate-300 bg-white",role:"group","aria-label":"Candidate status filter",children:$.map(({value:a,label:i})=>e.jsx("button",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:90",type:"button",onClick:()=>y(a),"aria-pressed":t===a,className:`border-r border-slate-300 px-3 py-2 text-sm font-medium last:border-r-0 ${t===a?"bg-slate-900 text-white":"text-slate-700 hover:bg-slate-50"}`,children:i},a))}),t==="needs_review"&&e.jsx("input",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:101",value:g,onChange:a=>j(a.target.value),maxLength:500,className:"min-w-72 rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-slate-700","aria-label":"Manual review note"})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:104",className:"overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm",children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:105",className:"border-b border-slate-200 px-5 py-4",children:[e.jsx("h2",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:105",className:"font-semibold text-slate-900",children:"Candidate profiles"}),e.jsx("p",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:105",className:"mt-1 text-sm text-slate-500",children:"Rows belong to a matching group; review a group together before any manual merge."})]}),e.jsx("div",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",className:"overflow-x-auto",children:e.jsxs("table",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",className:"w-full min-w-[1080px] text-left text-sm",children:[e.jsx("thead",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",className:"bg-slate-50 text-xs uppercase tracking-wide text-slate-500",children:e.jsxs("tr",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",children:[t==="approved"&&e.jsx("th",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",className:"px-5 py-3",children:"Select"}),e.jsx("th",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",className:"px-5 py-3",children:"Attorney"}),e.jsx("th",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",className:"px-5 py-3",children:"Firm"}),e.jsx("th",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",className:"px-5 py-3",children:"Location"}),e.jsx("th",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",className:"px-5 py-3",children:"Class"}),e.jsx("th",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",className:"px-5 py-3",children:"Score"}),e.jsx("th",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",className:"px-5 py-3",children:"Profile"}),t==="needs_review"&&e.jsx("th",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",className:"px-5 py-3",children:"Decision"}),t==="approved"&&e.jsx("th",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",className:"px-5 py-3",children:"Merge"})]})}),e.jsxs("tbody",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",className:"divide-y divide-slate-100",children:[r.data?.map(a=>e.jsxs("tr",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",children:[t==="approved"&&e.jsx("td",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",className:"px-5 py-3",children:e.jsx("input",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",type:"checkbox","aria-label":`Select ${a.attorneyName} group`,checked:c.includes(a.groupKey),onChange:()=>w(a.groupKey)})}),e.jsx("td",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",className:"px-5 py-3 font-medium text-slate-900",children:a.attorneyName}),e.jsx("td",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",className:"px-5 py-3 text-slate-700",children:a.firmName}),e.jsxs("td",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",className:"px-5 py-3 text-slate-600",children:[a.city,", ",a.state]}),e.jsx("td",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",className:"px-5 py-3",children:e.jsx("span",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",className:"rounded bg-slate-100 px-2 py-1 text-xs font-medium text-slate-700",children:a.reviewClass})}),e.jsx("td",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",className:"px-5 py-3",children:a.confidenceScore}),e.jsx("td",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",className:"px-5 py-3",children:e.jsxs("a",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",href:`/attorney/${a.slug}/`,target:"_blank",rel:"noreferrer",className:"inline-flex items-center gap-1 text-amber-700 hover:text-amber-900",children:[e.jsx("span",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",children:"Open"}),e.jsx(P,{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",className:"h-3.5 w-3.5"})]})}),t==="needs_review"&&e.jsx("td",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",className:"px-5 py-3",children:e.jsxs("div",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",className:"flex gap-2",children:[e.jsx("button",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",type:"button",onClick:()=>A(a.groupKey,"approve",a.attorneyId),disabled:m.isPending,className:"rounded bg-emerald-700 px-2 py-1 text-xs font-semibold text-white disabled:opacity-50",children:"Approve canonical"}),e.jsx("button",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",type:"button",onClick:()=>A(a.groupKey,"keep_separate"),disabled:m.isPending,className:"rounded border border-slate-300 px-2 py-1 text-xs font-semibold text-slate-700 disabled:opacity-50",children:"Keep separate"})]})}),t==="approved"&&e.jsx("td",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",className:"px-5 py-3",children:e.jsx("button",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",type:"button",onClick:()=>v([a.groupKey]),disabled:p.isPending,className:"rounded bg-indigo-700 px-2 py-1 text-xs font-semibold text-white disabled:opacity-50",children:"Merge approved group"})})]},a.id)),!r.isLoading&&r.data?.length===0&&e.jsx("tr",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",children:e.jsx("td",{"data-loc":"client/src/pages/admin/AdminDuplicateRemediation.tsx:106",colSpan:t==="needs_review"?7:t==="approved"?8:6,className:"px-5 py-10 text-center text-slate-500",children:"Run a candidate scan to populate this queue."})})]})]})})]})]})})}export{q as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.