1import{j as n}from"./calendar-vendor-DuyzT0xk.js";import{r as c,u as Ot}from"./auth-vendor-CihSfTEG.js";import{A as Ft}from"./ActivityKanbanBoard-Y0elW0pB.js";import{u as Pt,E as Rt,B as H,aL as Bt,M as qt,ay as $t}from"./capture-tools-CRkDZysP.js";import{g as Qt,I as _t}from"./konductor-embed-mRJrYIDF.js";import{ar as zt,dU as Ht,u as Wt,c as Vt,a as Kt,co as Xt,cp as Yt,G as Gt,dV as Ut,dW as Zt,b as Jt,X as te,dX as ee,bN as oe,bO as ae,dl as ne,aa as se,dm as ie,s as lt,v as ut,w as dt,x as pt,y as I,bA as ce,an as re,ao as le,ap as ue,aY as de,aZ as pe,a_ as me,dY as fe,a$ as W}from"./index-DzXtIXuL.js";import{a as he,S as ye}from"./TabContentSkeleton-BxxtkY-N.js";import{p as ge}from"./demo-fixtures-BcPhmQHJ.js";import{u as we}from"./use-contacts-Bd1UOSz1.js";import{u as ve}from"./use-sales-team-EjcoTPDO.js";import{u as Ce,f as mt,g as ft,h as xe,j as Ne,k as be}from"./contact-queue-Bec6eD8x.js";function De(){const{data:t}=zt(!0);return c.useMemo(()=>Ht(t?.opportunities),[t?.opportunities])}function ke(t){const{getToken:o}=Wt(),{isDemoMode:s}=Qt(),{user:r}=Ot(),m=r?.sub,x=Vt();return Kt({queryKey:["activities-closed",t,s,m],enabled:!!t,staleTime:6e4,retry:1,queryFn:async()=>{if(!t)return[];if(s)return[];const N=x.ensureQueryData({queryKey:Xt(!1,s),queryFn:()=>Yt(!1,s,o),staleTime:18e4}),b=await o(),D=fetch(`${Gt}/v1/activities/${t}`,{headers:{Authorization:`Bearer ${b}`,"Content-Type":"application/json"}}).then(async u=>{if(!u.ok){const $=await u.text().catch(()=>"");throw new Error(`Closed activities fetch failed (${u.status}): ${$||u.statusText}`)}const T=await u.json();return T.items??T.activities??[]}),[k,M]=await Promise.all([D,N]),E=new Map,L=new Map;for(const u of M.opportunities)u.accountId&&u.account&&E.set(u.accountId,u.account),u.id&&u.opportunity&&L.set(u.id,u.opportunity);return k.map((u,T)=>Ut(u,T,m,E,L))}})}const yt=30;function Te(t){const o=[t.completedDateIso,t.dueDateIso,t.createdDateIso];for(const s of o){if(!s)continue;const r=new Date(s);if(!Number.isNaN(r.getTime()))return r.getTime()}return null}function je(t,o=yt,s=Date.now()){const r=s-o*24*60*60*1e3;return t.filter(m=>{if(m.status!=="completed")return!1;const x=Te(m);return x===null?!0:x>=r})}function Ae(t=!0,o=yt){const{data:s,isLoading:r}=ke(t?"completed":null);return{activities:c.useMemo(()=>je(s??[],o),[s,o]),isLoading:r}}function Ie(t,o){const s=t||o;if(!s)return!1;const r=new Date(s);return Number.isNaN(r.getTime())?!1:r.toDateString()===new Date().toDateString()}function Se(t){const o=t.dueDateIso||t.dueDate;return o?Number.isNaN(new Date(o).getTime()):!0}function Me(t,o){if(t.status==="completed"||t.status==="cancelled")return!1;const s=t.labels??[];switch(o){case"all-open":return!0;case"recommendations":return!1;case"due-today":return Ie(t.dueDateIso,t.dueDate);case"no-due-date":return Se(t);case"not-started":return t.status==="not-started"||t.status==="on-hold";case"in-progress":return t.status==="in-progress";case"late":return s.includes("Late");case"at-risk":return s.includes("At Risk");case"follow-ups":return s.includes("Follow-up Required");case"meetings-to-review":return t.activityType==="meeting"&&(s.includes("Follow-up Required")||s.includes("Action Items"));case"meetings-to-schedule":return t.activityType==="meeting"&&t.status==="not-started";case"meetings-to-run":return t.activityType==="meeting"&&t.status==="in-progress";default:return!0}}function Ee(t){return(t||"").trim().split(/\s+/)[0]||t}function V(t){return t.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function Le(t,o){const s=(t||"").trim().toLowerCase();if(s!=="email"&&s!=="message")return!1;const r=(o||"").trim();return!(!r||r.startsWith("contact-rec-")||r.startsWith("konductor-"))}function Oe(t,o=new Date){const s=new Date(o);return s.setHours(9,0,0,0),t==="tomorrow"&&s.setDate(s.getDate()+1),t==="next-week"&&s.setDate(s.getDate()+7),s}function Fe(t,o){const s=[t.opportunityName,t.account].filter(Boolean).join(" · "),r=t.opportunityName?`Follow up â ${t.opportunityName}`:`Follow up with ${t.contactName}`,m=Zt(t.activityDescription||"").trim(),x=V(Ee(t.contactName)),N=V(s||t.activityTitle),b=[`<p>Hi ${x},</p>`,`<p>Following up on ${N}.</p>`,m?`<p>${V(m)}</p>`:"","<p>Let me know a good time to pick this up.</p>
1"].filter(Boolean),D=o?Oe(o).toISOString():t.dueDateIso||void 0,k=Le(t.activityType,t.activityId);return{title:r,subject:r,body:b.join(` 2`),toRecipients:t.contactEmail?[t.contactEmail]:[],recipientName:t.contactName,recipientEmail:t.contactEmail||void 0,account:t.account||void 0,accountId:t.accountId||void 0,opportunity:t.opportunityName||void 0,opportunityId:t.opportunityId||void 0,linkedActivity:t.activityTitle,linkedActivityId:t.activityId,completeLinkedActivityOnSend:k,advanceLinkedActivityOnDraft:k,labels:o?["Follow-up","Scheduled"]:["Follow-up"],dueDateISO:D}}const p="all",S=10;function Pe(t){return{id:be(t.contactId),type:"follow-up",action:`Follow up with ${t.contactName}`,description:t.lastContact?`No open follow-up â last contact ${t.lastContact}.`:"No open follow-up yet â reach out to keep this contact warm.",status:"recommendation",column:"recommendations",priority:"normal",contactName:t.contactName,account:t.account,accountName:t.account,accountId:t.accountId,opportunityId:t.opportunityId,opportunityName:t.opportunityName,requiredParticipants:t.contactEmail?[{name:t.contactName,email:t.contactEmail}]:[{name:t.contactName}],labelArray:t.contactTitle?[t.contactTitle]:[]}}function ht(t){const o=t.activity;return{id:o.id,type:o.activityType==="email"?"follow-up":o.activityType,action:o.activity,description:o.activityDescription||o.apiDescription||o.description||[t.contactTitle,o.opportunityName].filter(Boolean).join(" · ")||o.account,dueDate:o.dueDate,dueDateIso:o.dueDateIso,status:t.isOverdue?"late":o.status,atRisk:o.labels.includes("At Risk"),column:o.status==="in-progress"?"in-progress":o.status==="on-hold"?"on-hold":o.status==="completed"?"completed":"not-started",priority:o.priority==="high"?"high":o.priority==="low"?"low":"normal",assignee:o.assignedTo?.initials,assigneeName:o.assignedTo?.name,contactName:t.contactName,account:o.account,accountName:o.account,accountId:o.accountId,opportunityId:o.opportunityId,opportunityName:o.opportunityName,a
2piDescription:o.apiDescription,activityDescription:o.activityDescription,labelArray:o.labels,requiredParticipants:o.requiredParticipants,optionalParticipants:o.optionalParticipants,ccParticipants:o.ccParticipants,bccParticipants:o.bccParticipants,meetingType:o.meetingType,meetingStartDateTime:o.meetingStartDateTime,meetingEndDateTime:o.meetingEndDateTime,meetingDuration:o.meetingDuration,taskDuration:o.taskDuration,meetingProvider:o.meetingProvider,meetingLink:o.meetingLink,meetingLocation:o.meetingLocation,agenda:o.agenda,message:o.message,isDraft:o.isDraft}}function Re({target:t,onEmail:o}){const s=r=>{r.stopPropagation(),r.preventDefault()};return n.jsxs(n.Fragment,{children:[n.jsxs(re,{children:[n.jsx(le,{asChild:!0,children:n.jsx("button",{type:"button",className:"flex items-center justify-center p-1.5 rounded border border-muted hover:bg-muted transition-colors cursor-pointer",onClick:r=>{s(r),o(t)},"aria-label":`Email ${t.contactName}`,children:n.jsx(qt,{className:"h-3.5 w-3.5 text-indigo-600"})})}),n.jsxs(ue,{children:["Email ",t.contactName]})]}),n.jsxs(de,{children:[n.jsx(pe,{asChild:!0,children:n.jsx("button",{type:"button",className:"flex items-center justify-center p-1.5 rounded border border-muted hover:bg-muted transition-colors cursor-pointer",onClick:s,"aria-label":`Schedule an email to ${t.contactName}`,children:n.jsx($t,{className:"h-3.5 w-3.5 text-indigo-600"})})}),n.jsxs(me,{align:"end",className:"w-44 bg-background",onClick:s,children:[n.jsx(fe,{className:"text-xs font-normal text-muted-foreground",children:"Schedule email"}),n.jsx(W,{className:"cursor-pointer",onClick:()=>o(t,"today"),children:"Later today"}),n.jsx(W,{className:"cursor-pointer",onClick:()=>o(t,"tomorrow"),children:"Tomorrow"}),n.jsx(W,{className:"cursor-pointer",onClick:()=>o(t,"next-week"),children:"Next week"})]})]})]})}function Be({externalSearchTerm:t="",opportunityId:o,contactEmail:s,onCountChange:r,countUnit:m="contacts",hideStats:x=!1,includeUnmatched:N=!1,activitySegment:b=null,activityPredicate:D,hideFilters:k=!1}){const M=m==="contacts",{openCreateActivity:E,openMessageComposer:L}=Jt(),{data:u,isLoading:T,isError:$,refetch:gt}=te(),{data:j,isLoading:wt}=we(),{data:K}=ve(),X=De(),Y=Ce({forceFollowUp:!0}),[G,U]=c.useState(()=>new Set),[Z,vt]=c.useState(()=>new Map),Ct=c.useCallback(async(e,a)=>{const i=e.id.startsWith("contact-rec-")?e.id.slice(12):null;i&&U(h=>{const f=new Set(h);return f.add(i),f});try{const h=await Y(e,a),f=typeof h=="string"?h:h?.serverId;return i&&f&&vt(v=>{const l=new Map(v);return l.set(f,{...e,id:f,status:a,column:a,labelArray:[...(e.labelArray??[]).filter(g=>g!=="Recommendation"),"Follow-up Required"].filter((g,Et,Lt)=>Lt.indexOf(g)===Et)}),l}),h}catch(h){throw i&&U(f=>{const v=new Set(f);return v.delete(i),v}),h}},[Y]),{activities:J}=Ae(),Q=T||wt,[_,tt]=c.useState(""),[w,et]=c.useState(p),[y,z]=c.useState(p),[A,ot]=c.useState(!1),d=c.useMemo(()=>{const e=mt(u?.activities??[],o),a=ft(e,j?.contacts??[],new Date,{includeUnmatched:N}),i=(s||"").trim().toLowerCase();return[...i?a.filter(f=>(f.contactEmail||"").toLowerCase()===i):a].sort((f,v)=>ee(f.activity,v.activity,X))},[u?.activities,j?.contacts,o,s,N,X]),xt=c.useMemo(()=>{const e=new Set;return d.forEach(a=>{const i=a.activity.assignedTo?.name?.trim();i&&e.add(i)}),(K??[]).forEach(a=>{a?.name?.trim()&&e.add(a.name.trim())}),Array.from(e).sort((a,i)=>a.localeCompare(i))},[d,K]),C=(t||_).trim().toLowerCase(),P=c.useMemo(()=>d.filter(e=>b&&b!=="all-open"&&!Me(e.activity,b)||D&&!D(e.activity)||A&&!e.isOverdue||w!==p&&e.activity.assignedTo?.name!==w||y!==p&&e.activity.priority!==y?!1:C?[e.contactName,e.contactEmail,e.activity.activity,e.activity.account,e.activity.opportunityName].filter(Boolean).join(" ").toLowerCase().includes(C):!0),[d,A,w,y,C,b,D]),at=c.useMemo(()=>xe(j?.contacts??[],d),[j?.contacts,d]),R=c.useMemo(()=>{const e=a=>C?[a.contactName,a.contactEmail,a.account,a.opportunityName].filter(Boolean).join(" ").toLowerCase().includes(C):!0;return A||w!==p||y!==p?[]:o||s?[]:at.filter(a=>!G.has(a.contactId)).filter(e).map(a=>Pe(a))},[at,C,A,w,y,o,s,G]),O=c.useMemo(()=>{const e=new Map;for(const a of P){const i=e.get(a.activity.id);i?i.names.push(a.contactName):e.set(a.activity.id,{item:a,names:[a.contactName]})}return Array.from(e.values()).map(({item:a,names:i})=>({...ht(a),contactName:i.length>1?`${i[0]} +${i.length-1}`:i[0]}))},[P]),F=c.useMemo(()=>{const e=mt(J,o),a=ft(e,j?.contacts??[],new Date,{includeUnmatched:N,includeCompleted:!0}),i=(s||"").trim().toLowerCase(),f=(i?a.filter(l=>(l.contactEmail||"").toLowerCase()===i):a).filter(l=>w!==p&&l.activity.assignedTo?.name!==w||y!==p&&l.activity.priority!==y?!1:C?[l.contactName,l.contactEmail,l.activity.activity,l.activity.account,l.activity.opportunityName].filter(
2Boolean).join(" ").toLowerCase().includes(C):!0),v=new Map;for(const l of f){const g=v.get(l.activity.id);g?g.names.push(l.contactName):v.set(l.activity.id,{item:l,names:[l.contactName]})}return Array.from(v.values()).map(({item:l,names:g})=>({...ht(l),status:"completed",column:"completed",contactName:g.length>1?`${g[0]} +${g.length-1}`:g[0]}))},[J,j?.contacts,o,s,N,w,y,C]),[B,Nt]=c.useState(!1),nt=c.useMemo(()=>{const e=Array.from(Z.values()).filter(a=>!O.some(i=>i.id===a.id));return B?[...e,...O,...R,...F]:[...e,...O.slice(0,S),...R.slice(0,S),...F.slice(0,S)]},[O,R,F,Z,B]),st=Math.max(0,O.length-S)+Math.max(0,R.length-S)+Math.max(0,F.length-S),it=Ne(d),ct=c.useMemo(()=>new Set(d.map(e=>e.activity.id)).size,[d]);c.useEffect(()=>{Q||r?.(m==="activities"?ct:it)},[it,ct,m,Q,r]);const bt=d.filter(e=>e.isOverdue).length,Dt=d.filter(e=>e.activity.priority==="high").length,kt=c.useMemo(()=>new Set(d.filter(e=>e.activity.status==="on-hold").map(e=>e.activity.id)).size,[d]),Tt=c.useMemo(()=>new Set(d.filter(e=>e.activity.status==="in-progress").map(e=>e.activity.id)).size,[d]),jt=c.useMemo(()=>{const e=new Set;return d.forEach(a=>{he(a.lastContact)!==null&&e.add(a.contactId)}),e.size},[d]),At=c.useCallback((e,a)=>{E(a==="meeting"?"Meeting":a==="message"?"Message":"Task",{defaultStatus:e==="in-progress"?"InProgress":e==="on-hold"?"OnHold":"NotStarted"})},[E]),rt=c.useMemo(()=>{const e=new Map;return P.forEach(a=>{if(e.has(a.activity.id)||!a.contactEmail)return;const i=a.activity;e.set(i.id,{activityId:i.id,activityTitle:i.activity,activityDescription:i.activityDescription||i.apiDescription||i.description||null,activityType:i.activityType,contactName:a.contactName,contactEmail:a.contactEmail,account:i.account??null,accountId:i.accountId??null,opportunityName:i.opportunityName??null,opportunityId:i.opportunityId??null,dueDateIso:i.dueDateIso??null})}),e},[P]),q=c.useCallback((e,a,i=!1)=>{L({...Fe(e,a),autoGenerateDraft:i}),a&&Pt.info(`Draft scheduled for ${a==="today"?"later today":a==="tomorrow"?"tomorrow":"next week"} â review and send from the composer.`)},[L]),It=c.useCallback(e=>{if(!e.id.startsWith("contact-rec-")&&e.column!=="recommendations")return;const a=e.requiredParticipants?.find(h=>h.email),i=e.contactName||a?.name||"Contact";q({activityId:e.id,activityTitle:e.action,activityDescription:e.description,contactName:i,contactEmail:a?.email,account:e.accountName||e.account,accountId:e.accountId,opportunityName:e.opportunityName,opportunityId:e.opportunityId,dueDateIso:e.dueDateIso},void 0,!0)},[q]),St=c.useCallback(e=>{const a=rt.get(e.id);return a?n.jsx(Re,{target:a,onEmail:q}):null},[rt,q]),Mt=Q;return $?n.jsxs("div",{className:"flex flex-col items-center gap-3 rounded-md border border-border py-12",children:[n.jsx(Rt,{className:"h-6 w-6 text-destructive"}),n.jsx("p",{className:"text-sm text-muted-foreground",children:"We couldn't load your follow-up queue."}),n.jsxs(H,{variant:"outline",size:"sm",onClick:()=>void gt(),children:[n.jsx(Bt,{className:"mr-2 h-4 w-4"}),"Try again"]})]}):n.jsxs("div",{className:"space-y-3",children:[!x&&n.jsx(ye,{title:m==="activities"?"Activities in queue":"Contacts in queue",info:"Counts cover every open follow-up in the queue. Click a card to filter the board below.",total:d.length,columns:4,cards:[{id:"open",label:"Open follow-ups",count:d.length,tone:"indigo",definition:"Every open follow-up currently in the queue.",iconSrc:ge,isTotal:!0},{id:"overdue",label:"Overdue",count:bt,tone:"red",definition:"Follow-ups whose due date has already passed.",iconSrc:oe,isActive:A,onClick:()=>ot(e=>!e)},{id:"high",label:"High priority",count:Dt,tone:"amber",definition:"Follow-ups flagged as high priority.",iconSrc:ae,isActive:y==="high",onClick:()=>z(e=>e==="high"?p:"high")},{id:"in-progress",label:"In Progress",count:Tt,tone:"blue",definition:"Follow-ups actively being worked.",iconSrc:ne}],trailingChips:[{id:"contacted",label:"Contacted",count:M?F.length:jt,icon:se,tooltip:M?"Follow-ups completed in the last 30 days (the Contacted column).":"Queued contacts with a recorded last-contact date."},{id:"on-hold",label:"On hold",count:kt,icon:ie,tooltip:"Follow-ups paused or on hold."}]}),!k&&n.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[n.jsx(_t,{value:_,onCh
2ange:e=>tt(e.target.value),placeholder:"Search contact, account or follow-up",className:"h-9 w-full sm:w-[260px]","aria-label":"Search the contact follow-up queue"}),n.jsxs(lt,{value:w,onValueChange:et,children:[n.jsx(ut,{className:"h-9 w-[200px]","aria-label":"Filter by assignee",children:n.jsx(dt,{placeholder:"All assignees"})}),n.jsxs(pt,{children:[n.jsx(I,{value:p,children:"All assignees"}),xt.map(e=>n.jsx(I,{value:e,children:e},e))]})]}),n.jsxs(lt,{value:y,onValueChange:z,children:[n.jsx(ut,{className:"h-9 w-[160px]","aria-label":"Filter by priority",children:n.jsx(dt,{placeholder:"All priorities"})}),n.jsxs(pt,{children:[n.jsx(I,{value:p,children:"All priorities"}),n.jsx(I,{value:"high",children:"High"}),n.jsx(I,{value:"medium",children:"Medium"}),n.jsx(I,{value:"low",children:"Low"})]})]}),(A||w!==p||y!==p||_)&&n.jsx(H,{variant:"link",size:"sm",className:"px-0 text-primary",onClick:()=>{ot(!1),et(p),z(p),tt("")},children:"Clear filters"})]}),Mt?n.jsx("div",{className:"grid gap-3 sm:grid-cols-3",children:[0,1,2].map(e=>n.jsx(ce,{className:"h-[240px] w-full"},e))}):nt.length===0?n.jsxs("div",{className:"rounded-md border border-border py-12 text-center",children:[n.jsx("p",{className:"text-sm font-medium text-foreground",children:"No follow-ups queued"}),n.jsx("p",{className:"mt-1 text-sm text-muted-foreground",children:"Follow-ups you create against a contact appear here so you can prioritize, assign and track them."})]}):n.jsxs(n.Fragment,{children:[n.jsx(Ft,{activities:nt,onAddActivity:At,onActivityClick:It,onConvertRecommendation:Ct,renderCardActions:St,columnTitles:M?{completed:"Contacted"}:void 0}),(st>0||B)&&n.jsx("div",{className:"flex justify-center",children:n.jsx(H,{variant:"link",className:"text-indigo-600",onClick:()=>Nt(e=>!e),children:B?"Show fewer contacts":`View All Contacts (${st} more)`})})]})]})}const Ge=Object.freeze(Object.defineProperty({__proto__:null,ContactQueueBoard:Be},Symbol.toStringTag,{value:"Module"}));export{Be as C,Ae as a,ke as b,Ge as c,De as u};
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.