1import{b as A}from"./query-vendor-Ab0nfCYP.js";import{a4 as B,l,m as c,q as s,D as t,u as e,B as b,z as F,J as E,K as o,F as _,p as u,v as k,a6 as L,e as m,a9 as V}from"./vue-vendor-B52ivs5F.js";import{c as z}from"./noxFunnel-DwdCvw7L.js";import{u as O}from"./index-NM9cAr_v.js";import{ab as j,R as M}from"./ui-vendor-D-1UBobO.js";import"./date-vendor-HBGOQ70J.js";import"./twilio-DAuME2Y9.js";import"./charts-D4hDxUnJ.js";import"./socket-CzTGKfeH.js";const G={class:"mb-6 flex items-center justify-between"},J={class:"flex flex-wrap items-center gap-3"},K={class:"mt-3 flex flex-wrap gap-2"},U={class:"flex flex-wrap items-baseline gap-2"},P={key:1,class:"mt-1"},ae={__name:"ContactTrace",setup(Q){const $=O(),{isDarkMode:r}=B($),y=V(),x=m(()=>({company_id:y.query.company_id,ghl_contact_id:y.query.ghl_contact_id,person_id:y.query.person_id})),{isPending:C,isError:S,error:f,data:n}=A({queryKey:["admin","nox-funnel-trace",x],queryFn:()=>z(x.value),enabled:m(()=>!!x.value.company_id)}),R=m(()=>{const d={};for(const[a,i]of Object.entries(n.value?.contact?.signals||{}))typeof i=="number"&&i>0&&(d[a]=a==="time_on_site_ms"?`${Math.round(i/1e3)}s`:i);return d}),h={cold:["bg-blue-500/20 text-blue-400","bg-blue-50 text-blue-700"],intermediate:["bg-yellow-500/20 text-yellow-400","bg-yellow-50 text-yellow-700"],warm:["bg-orange-500/20 text-orange-400","bg-orange-50 text-orange-700"],booked:["bg-green-500/20 text-green-400","bg-green-50 text-green-700"]},T=d=>{const[a,i]=h[d]||h.cold;return["inline-flex rounded-full px-2 py-1 text-xs font-semibold",r.value?a:i]},D={stage_changed:"bg-teal-500",very_warm_flip:"bg-red-500",very_warm_expired:"bg-red-300",action_failed:"bg-red-500",signal_received:"bg-blue-500",contact_merged:"bg-purple-500"},N=d=>D[d]||"bg-gray-400",q=m(()=>["inline-flex rounded-full px-2 py-1 text-xs",r.value?"bg-gray-700 text-gray-300":"bg-gray-100 text-gray-700"]),w=d=>{const a=d.detail||{};switch(d.event_type){case"stage_changed":return`${a.from} â ${a.to} â ${a.reason||""}`;case"very_warm_flip":case"very_warm_expired":return a.reason||"";case"signal_received":return`${a.type}${a.channel?` (${a.channel})`:""} â ${a.counter}=${a.value??"?"}`;case"signal_deduped":case"signal_gated":return`${a.type||""} â ${a.reason||a.dedupe_key||""}`;case"dormancy_demotion":return`was ${a.from}, last engagement ${p(a.last_engagement_at)}`;case"contact_merged":return`merged doc ${a.merged_from||""} â stage kept: ${a.stage||""}`;default:return""}},p=d=>d?new Date(d).toLocaleString("en-US",{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit"}):"â";return(d,a)=>{const i=L("RouterLink");return l(),c("div",null,[s("div",G,[s("div",null,[s("h1",{class:t(["text-2xl font-bold",e(r)?"text-white":"text-gray-900"])}," Contact Trace ",2),s("p",{class:t(["mt-1 text-sm",e(r)?"text-gray-400":"text-gray-600"])}," Full funnel history for one contact â why they sit where they sit. ",2)]),b(i,{to:{name:"admin-nox-funnel-audit"},class:t(["inline-flex items-center gap-1 rounded-lg px-3 py-1.5 text-sm font-medium",e(r)?"bg-gray-700 text-gray-300 hover:bg-gray-600":"bg-gray-100 text-gray-700 hover:bg-gray-200"])},{default:F(()=>[b(e(j),{size:14}),a[0]||(a[0]=E(" Audit logs ",-1))]),_:1},8,["class"])]),e(C)?(l(),c("div",{key:0,class:t(["flex items-center justify-center rounded-lg border py-12",e(r)?"border-gray-700 bg-gray-800":"border-gray-200 bg-white"])},[b(e(M),{size:32,class:t(["animate-spin",e(r)?"text-gray-600":"text-gray-400"])},null,8,["class"])],2)):e(S)?(l(),c("div",{key:1,class:t(["rounded-lg border border-red-200 bg-red-50 p-4",e(r)&&"border-red-900/50 bg-red-900/20"])},[s("p",{class:t(["text-sm",e(r)?"text-red-300":"text-red-700"])},o(e(f)?.response?.data?.message||e(f)?.message||"Failed to load trace"),3)],2)):(l(),c(_,{key:2},[e(n)?.contact?(l(),c("div",{key:0,class:t(["mb-6 rounded-lg border p-4",e(r)?"border-gray-700 bg-gray-800":"border-gray-200 bg-white"])},[s("div",J,[s("span",{class:t(["text-lg font-semibold",e(r)?"text-white":"text-gray-900"])},o(e(n).contact.name||e(n).contact.email||e(n).contact.ghl_contact_id),3),s("span",{class:t(T(e(n).contact.stage))}
1,o(e(n).contact.stage.toUpperCase()),3),e(n).contact.very_warm?.active?(l(),c("span",{key:0,class:t(["inline-flex rounded-full border border-dashed px-2 py-1 text-xs font-medium",e(r)?"border-red-500 text-red-400":"border-red-400 text-red-600"])}," VERY WARM â "+o(e(n).contact.very_warm.reason),3)):u("",!0)]),s("p",{class:t(["mt-2 text-sm",e(r)?"text-gray-400":"text-gray-600"])},o(e(n).contact.stage_reason||"no stage reason")+" · source: "+o(e(n).contact.source||"â")+" · last engagement: "+o(p(e(n).contact.last_engagement_at)),3),s("div",K,[(l(!0),c(_,null,k(R.value,(g,v)=>(l(),c("span",{key:v,class:t(q.value)},o(v)+": "+o(g),3))),128))])],2)):u("",!0),s("div",{class:t(["rounded-lg border p-4",e(r)?"border-gray-700 bg-gray-800":"border-gray-200 bg-white"])},[s("h2",{class:t(["mb-4 text-sm font-medium",e(r)?"text-gray-300":"text-gray-700"])},o(e(n)?.events?.length||0)+" audit events, oldest first ",3),e(n)?.events?.length?(l(),c("ol",{key:1,class:t(["relative ml-2 border-l",e(r)?"border-gray-700":"border-gray-200"])},[(l(!0),c(_,null,k(e(n).events,g=>(l(),c("li",{key:g._id,class:"mb-4 ml-4"},[s("span",{class:t(["absolute -left-[5px] mt-1.5 h-2.5 w-2.5 rounded-full",N(g.event_type)])},null,2),s("div",U,[s("span",{class:t(["text-xs",e(r)?"text-gray-500":"text-gray-400"])},o(p(g.created_at)),3),s("span",{class:t(["text-sm font-medium",e(r)?"text-white":"text-gray-900"])},o(g.event_type),3),g.outcome!=="ok"?(l(),c("span",{key:0,class:t(["text-xs",e(r)?"text-yellow-400":"text-yellow-600"])},o(g.outcome),3)):u("",!0),s("span",{class:t(["text-xs",e(r)?"text-gray-500":"text-gray-400"])},o(g.actor),3)]),w(g)?(l(),c("p",{key:0,class:t(["mt-0.5 text-sm",e(r)?"text-gray-400":"text-gray-600"])},o(w(g)),3)):u("",!0),g.detail?(l(),c("details",P,[s("summary",{class:t(["cursor-pointer text-xs",e(r)?"text-gray-500":"text-gray-400"])}," raw detail ",2),s("pre",{class:t(["mt-1 overflow-x-auto rounded-lg p-2 text-xs whitespace-pre-wrap",e(r)?"bg-gray-900 text-gray-300":"bg-gray-50 text-gray-900"])},o(JSON.stringify(g.detail,null,2)),3)])):u("",!0)]))),128))],2)):(l(),c("p",{key:0,class:t(["text-sm",e(r)?"text-gray-400":"text-gray-600"])}," No audit events for this contact. ",2))],2)],64))])}}};export{ae 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.