PageSourceSearch

https://chpeptides.com/js/SupportTickets-CfQWqZsX.js

js chpeptides.com collected 2026-10-04 06:36:42 UTC 25,621 bytes, 1 lines download raw bytes

1import{j as e}from"./admin-vendor-B_1xywrZ.js";import{u as s,r as t,b as a}from"./react-vendor-DOiMLSFB.js";import{u as n,s as l,t as i}from"./index-BwhXW8eI.js";import{B as r,C as o,a as c}from"./Form-Cx5jTiq2.js";import{P as d}from"./PageHeader-DF5AHOuW.js";import{S as m}from"./StatCard-DXgpQUpt.js";import{B as x}from"./Badge-aquUlMmj.js";import{E as u}from"./EmptyState-DbYxesgC.js";import{D as p}from"./DataTable-BVp7uagh.js";import{T as h}from"./Tabs-8_8tRwe_.js";import{p as g,f as j,a as b,b as f,c as w,d as y,e as v,g as N,i as k,s as C,u as _,h as S,j as z,A as P,P as F,S as M,k as E,l as U}from"./ScheduleFollowUpModal-vJZWHgg2.js";import{aE as A,aF as T,b7 as D,w as I,b8 as O,b9 as R,al as L,ba as $,A as B,ac as q,b as H,as as Q,K,b5 as V,U as Y,M as Z,R as G,am as J,ad as W,I as X,a4 as ee,O as se,aL as te,an as ae,a_ as ne,X as le,a7 as ie,k as re}from"./ui-vendor-CtHzwLAQ.js";import"./data-vendor-CIxtln5N.js";import"./Modal-DEPHVPFx.js";const oe="America/Los_Angeles",ce=[10,20,50,100],de=[{value:"all",label:"All Statuses"},{value:"new",label:"New"},{value:"in_progress",label:"In Progress"},{value:"resolved",label:"Resolved"},{value:"closed",label:"Closed"}],me=[{value:"all",label:"All Types"},{value:"order_issue",label:"Order Issue"},{value:"product_question",label:"Product Question"},{value:"shipping_issue",label:"Shipping Issue"},{value:"general_inquiry",label:"General Inquiry"},{value:"other",label:"Other"}],xe=e=>{switch(e){case"new":return"amber";case"in_progress":return"blue";case"resolved":return"green";case"closed":return"gray";default:return"clay"}},ue=e=>e.replace(/_/g," ").replace(/\b\w/g,e=>e.toUpperCase()),pe=e=>{if(!e)return"—";const s=new Date(e),t=Math.floor((Date.now()-s.getTime())/6e4);if(t<1)return"Just now";if(t<60)return`${t}m ago`;const a=Math.floor(t/60);if(a<24)return`${a}h ago`;const n=Math.floor(a/24);return n<7?`${n}d ago`:s.toLocaleDateString("en-US",{month:"short",day:"numeric",timeZone:oe})},he=e=>{const s=new Date(e);return{overdue:s.getTime()<Date.now(),txt:s.toLocaleString("en-US",{month:"short",day:"numeric",hour:"numeric",minute:"2-digit",timeZone:oe})}},ge=()=>{const a=s(),{user:c}=n(),te=t.useMemo(()=>({id:c?.id||"",name:[c?.first_name,c?.last_name].filter(Boolean).join(" ")||c?.email||"You"}),[c]),[ae,ne]=t.useState("all"),[le,ie]=t.useState([]),[re,oe]=t.useState(0),[ge,fe]=t.useState(1),[ve,Ne]=t.useState(20),[ke,Ce]=t.useState(""),[_e,Se]=t.useState("all"),[ze,Pe]=t.useState("all"),[Fe,Me]=t.useState(!0),[Ee,Ue]=t.useState(!1),[Ae,Te]=t.useState({total:0,new:0,inProgress:0,resolved:0,closed:0,needsResponse:0,mine:0,pinned:0,followUpsDue:0}),[De,Ie]=t.useState([]),Oe=t.useMemo(()=>{const e={};return De.forEach(s=>{e[s.id]=s}),e},[De]),[Re,Le]=t.useState([]),[$e,Be]=t.useState([]),[qe,He]=t.useState({}),[Qe,Ke]=t.useState({}),[Ve,Ye]=t.useState(new Set),[Ze,Ge]=t.useState(new Set),[Je,We]=t.useState(!1),[Xe,es]=t.useState({open:!1,ids:[]}),[ss,ts]=t.useState({open:!1,id:""}),[as,ns]=t.useState({open:!1,id:""}),ls=t.useMemo(()=>{const e=new Set;return Re.forEach(s=>{g(s,te.id)&&e.add(s.ticket_id)}),e},[Re,te.id]),is=t.useMemo(()=>{const e={};return $e.forEach(s=>{"pending"===s.status&&(!e[s.ticket_id]||new Date(s.due_at)<new Date(e[s.ticket_id].due_at))&&(e[s.ticket_id]=s)}),e},[$e]),rs=t.useCallback(()=>{j(te.id).then(Te).catch(()=>{})},[te.id]),os=t.useCallback(async()=>{try{const[e,s,t]=await Promise.all([b().catch(()=>[]),f({status:"pending"}).catch(()=>[]),De.length?Promise.resolve(De):w().catch(()=>[])]);Le(e),Be(s),De.length||Ie(t);const a=[...e.map(e=>e.ticket_id),...s.map(e=>e.ticket_id)];a.length&&He(await y(a))}catch{}},[De]),cs=t.useCallback(async()=>{if(te.id)try{const{data:e}=await l.from("notifications").select("data").eq("user_id",te.id).eq("is_read",!1).eq("type","support_ticket"),s=new Set;(e||[]).forEach(e=>{e?.data?.ticket_id&&s.add(e.data.ticket_id)}),Ye(s)}catch{}},[te.id]),ds=t.useCallback(async(e,s=!1)=>
1{if("pinboard"!==ae&&"followups"!==ae){s?Ue(!0):Me(!0);try{const{tickets:s,total:t}=await v({page:e,itemsPerPage:ve,searchQuery:ke,statusFilter:_e,issueTypeFilter:ze,agingOnly:"needs"===ae,assignedTo:"mine"===ae?te.id:null});ie(s),oe(t),fe(e);const a=s.map(e=>e.id);a.length?Ke(await N(a)):Ke({})}catch(t){i.error(t?.message||"Failed to load tickets")}finally{Me(!1),Ue(!1)}}else Me(!1)},[ae,ve,ke,_e,ze,te.id]);t.useEffect(()=>{w().then(Ie).catch(()=>{}),rs(),os(),cs()},[]),t.useEffect(()=>{const e=setTimeout(()=>{fe(1),ds(1)},ke?400:0);return()=>clearTimeout(e)},[ae,ke,_e,ze,ve]),t.useEffect(()=>{const e=l.channel("support_dashboard_rt").on("postgres_changes",{event:"*",schema:"public",table:"contact_submissions"},()=>{ds(ge,!0),rs(),cs()}).on("postgres_changes",{event:"INSERT",schema:"public",table:"ticket_notes"},()=>{ds(ge,!0),cs()}).on("postgres_changes",{event:"*",schema:"public",table:"ticket_pins"},()=>{os(),rs()}).on("postgres_changes",{event:"*",schema:"public",table:"ticket_follow_ups"},()=>{os(),rs()}).subscribe();return()=>{l.removeChannel(e)}},[ge]);const ms=()=>{ds(ge,!0),rs(),os(),cs()},xs=async(e,s)=>{try{await E(e,s),ie(t=>t.map(t=>e.includes(t.id)?{...t,status:s}:t)),setMenuFor(null),rs()}catch(t){i.error(t?.message||"Failed to update status")}},us=async e=>{if(confirm(`Delete ${e.length>1?`${e.length} tickets`:"this ticket"}? This cannot be undone.`))try{await U(e),ie(s=>s.filter(s=>!e.includes(s.id))),Ge(new Set),setMenuFor(null),rs(),os(),i.success("Deleted")}catch(s){i.error(s?.message||"Failed to delete")}},ps=async e=>{if(Ze.size){We(!0);try{await E(Array.from(Ze),e),ie(s=>s.map(s=>Ze.has(s.id)?{...s,status:e}:s)),Ge(new Set),rs()}catch(s){i.error(s?.message||"Failed")}finally{We(!1)}}},hs=e=>Ge(s=>{const t=new Set(s);return t.has(e)?t.delete(e):t.add(e),t}),gs=Math.ceil(re/ve),js=(e,s="all")=>{Se(s),ne(e)},bs=[{header:e.jsx("button",{onClick:()=>Ge(e=>e.size===le.length?new Set:new Set(le.map(e=>e.id))),className:"p-0.5",children:Ze.size===le.length&&le.length>0?e.jsx(A,{className:"h-4 w-4 text-primary-600"}):e.jsx(T,{className:"h-4 w-4 text-gray-400"})}),className:"w-10",cell:s=>e.jsx("button",{onClick:e=>{e.stopPropagation(),hs(s.id)},className:"p-0.5",children:Ze.has(s.id)?e.jsx(A,{className:"h-4 w-4 text-primary-600"}):e.jsx(T,{className:"h-4 w-4 text-gray-400"})})},{header:"Subject",cell:s=>{const t=k(s),a=Qe[s.id],n=is[s.id];return e.jsxs("div",{className:"min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"font-semibold text-clay-ink truncate max-w-[260px]",children:s.subject}),ls.has(s.id)&&e.jsx(D,{className:"h-3.5 w-3.5 text-primary-500 flex-shrink-0"}),"new"===s.status&&e.jsx(x,{tone:"red",dot:!0,children:"New"}),Ve.has(s.id)&&"new"!==s.status&&e.jsx(x,{tone:"amber",dot:!0,children:"Unread"}),t&&e.jsxs(x,{tone:"amber",children:[e.jsx(I,{className:"h-3 w-3"}),"Aging"]})]}),e.jsxs("div",{className:"mt-0.5 flex flex-wrap items-center gap-x-3 gap-y-0.5 text-xs text-gray-400",children:[s.order_number&&e.jsxs("span",{children:["Order #",s.order_number]}),a&&e.jsxs("span",{className:"inline-flex items-center gap-1 text-gray-500",title:a.latest?.note||"",children:[e.jsx(O,{className:"h-3 w-3 text-amber-500"}),a.count," note",a.count>1?"s":"",a.latest&&e.jsxs("span",{className:"text-gray-400",children:["· ",a.latest.note.slice(0,36),a.latest.note.length>36?"…":""]})]}),n&&e.jsxs("span",{className:"inline-flex items-center gap-1 "+(he(n.due_at).overdue?"text-red-500":"text-primary-600"),children:[e.jsx(R,{className:"h-3 w-3"}),"Follow-up ",he(n.due_at).overdue?"overdue":he(n.due_at).txt]})]})]})}},{header:"Customer",hideOnMobile:!0,cell:s=>e.jsxs("div",{className:"text-sm",children:[e.jsx("div",{className:"font-medium text-gray-900 truncate max-w-[180px]",children:s.name||s.email}),s.name&&e.jsx("div",{className:"text-xs text-gray-400 truncate max-w-[180px]",children:s.email})]})},{header:"Assignee",hideOnMobile:!0,cell:s=>s.assigned_to?e.jsxs("span",{className:"inline-flex items-center gap-1.5 text-sm text-gray-700",children:[e.jsx("span",{className:"flex h-6 w-6 items-center justify-center rounded-full bg-clay-gradient text-[10px] font-bold text-white",children:C(Oe[s.assigned_to]).slice(0,1).toUpperCase()}),e.jsx("span",{className:"truncate max-w-[110px]",children:C(Oe[s.assigned_to])})]}):e.jsxs("button",{onClick:e=>{e.stopPropagation(),es({open:!0,ids:[s.id],current:null})},className:"text-xs text-gray-400 hover:text-primary-600 inline-flex items-center gap-1",children:[e.jsx(L,{className:"h-3.5 w-3.5"})," Assign"]})},{header:"Status",cell:s=>
1e.jsx(x,{tone:xe(s.status),dot:!0,children:ue(s.status)})},{header:"Turn",hideOnMobile:!0,cell:s=>"closed"===s.status||"resolved"===s.status?e.jsx("span",{className:"text-xs text-gray-300",children:"—"}):s.last_responder_is_admin?e.jsxs(x,{tone:"gray",children:[e.jsx($,{className:"h-3.5 w-3.5"}),"Their turn"]}):e.jsxs(x,{tone:"purple",children:[e.jsx($,{className:"h-3.5 w-3.5"}),"Your turn"]})},{header:"Activity",hideOnMobile:!0,cell:s=>e.jsx("span",{className:"text-sm text-gray-500",children:pe(s.last_message_at||s.created_at)})},{header:"",className:"w-24 text-right",cell:s=>e.jsxs("div",{className:"flex items-center justify-end gap-1",onClick:e=>e.stopPropagation(),children:[e.jsx(r,{size:"sm",variant:"secondary",onClick:()=>a(`/admin/support-tickets/${s.id}`),children:"View"}),e.jsx(je,{children:t=>e.jsxs(e.Fragment,{children:[e.jsx(be,{icon:L,label:"Assign…",onClick:()=>{t(),es({open:!0,ids:[s.id],current:s.assigned_to})}}),e.jsx(be,{icon:D,label:"Pin…",onClick:()=>{t(),ts({open:!0,id:s.id,label:s.subject})}}),e.jsx(be,{icon:R,label:"Schedule follow-up…",onClick:()=>{t(),ns({open:!0,id:s.id,label:s.subject})}}),e.jsx("div",{className:"my-1 border-t border-clay-border"}),e.jsx("p",{className:"px-3 py-1 text-[10px] font-semibold uppercase tracking-wide text-gray-400",children:"Status"}),e.jsx(be,{icon:B,label:"New",tone:"text-amber-500",onClick:()=>{t(),xs([s.id],"new")}}),e.jsx(be,{icon:q,label:"In Progress",tone:"text-blue-500",onClick:()=>{t(),xs([s.id],"in_progress")}}),e.jsx(be,{icon:H,label:"Resolved",tone:"text-emerald-500",onClick:()=>{t(),xs([s.id],"resolved")}}),e.jsx(be,{icon:Q,label:"Closed",tone:"text-gray-500",onClick:()=>{t(),xs([s.id],"closed")}}),e.jsx("div",{className:"my-1 border-t border-clay-border"}),e.jsx(be,{icon:K,label:"Delete",tone:"text-red-600",danger:!0,onClick:()=>{t(),us([s.id])}})]})})]})}],fs=[{id:"all",label:"All",icon:V},{id:"needs",label:"Needs Response",icon:I,badge:Ae.needsResponse},{id:"mine",label:"Mine",icon:Y,badge:Ae.mine},{id:"pinboard",label:"Pinboard",icon:D,badge:Ae.pinned},{id:"followups",label:"Follow-ups",icon:R,badge:Ae.followUpsDue}];return e.jsxs(e.Fragment,{children:[e.jsxs("div",{children:[e.jsx(d,{title:"Support Tickets",subtitle:"Triage, assign, pin, and follow up on customer inquiries",icon:Z,actions:e.jsxs(e.Fragment,{children:[e.jsx(r,{variant:"outline",size:"sm",icon:G,onClick:ms,children:"Refresh"}),e.jsx(r,{variant:"secondary",size:"sm",icon:J,onClick:()=>a("/admin/quick-replies"),children:"Quick Replies"}),e.jsx(r,{icon:W,onClick:()=>a("/admin/support-tickets/new"),children:"New Ticket"})]})}),e.jsxs("div",{className:"mb-5 grid grid-cols-2 gap-3 sm:grid-cols-4 xl:grid-cols-8",children:[e.jsx(m,{size:"sm",label:"Total",value:Ae.total,icon:V,onClick:()=>js("all")}),e.jsx(m,{size:"sm",label:"New",value:Ae.new,icon:B,onClick:()=>js("all","new")}),e.jsx(m,{size:"sm",label:"Needs Response",value:Ae.needsResponse,icon:I,onClick:()=>js("needs")}),e.jsx(m,{size:"sm",label:"In Progress",value:Ae.inProgress,icon:q,onClick:()=>js("all","in_progress")}),e.jsx(m,{size:"sm",label:"Resolved",value:Ae.resolved,icon:H,onClick:()=>js("all","resolved")}),e.jsx(m,{size:"sm",label:"Mine",value:Ae.mine,icon:Y,onClick:()=>js("mine")}),e.jsx(m,{size:"sm",label:"Pinned",value:Ae.pinned,icon:D,onClick:()=>ne("pinboard")}),e.jsx(m,{size:"sm",label:"Follow-ups",value:Ae.followUpsDue,icon:R,onClick:()=>ne("followups")})]}),e.jsxs("div",{className:"mb-4 flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between",children:[e.jsx(h,{tabs:fs,value:ae,onChange:e=>ne(e),className:"overflow-x-auto"}),("all"===ae||"needs"===ae||"mine"===ae)&&e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsxs("div",{className:"relative w-full sm:w-auto",children:[e.jsx(X,{className:"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-gray-400"}),e.jsx("input",{value:ke,onChange:e=>Ce(e.target.value),placeholder:"Search tickets…",className:"w-full rounded-xl border border-clay-border py-2 pl-9 pr-3 text-sm focus:border-primary-400 focus:outline-none focus:ring-2 focus:ring-primary-500/30 lg:w-64"})]}),e.jsx("select",{value:_e,onChange:e=>Se(e.target.value),className:"flex-1 sm:flex-none min-w-0 rounded-xl border border-clay-border py-2 pl-3 pr-8 text-sm focus:border-primary-400 focus:outline-none",children:de.map(s=>e.jsx("option",{value:s.value,children:s.label},s.value))}),e.jsx("select",{value:ze,onChange:e=>Pe(e.target.value),className:"flex-1 sm:flex-none min-w-0 rounded-xl border border-clay-border py-2 pl-3 pr-8 text-sm focus:border-primary-400 focus:outline-none",children:me.map(s=>e.jsx("option",{value:s.value,children:s.label},s.value))})]})]}),Ze.size>0&&("all"===ae||"needs"===ae||"mine"===ae)&&e.jsxs("div",{className:"mb-4 flex flex-wrap items-center justify-between gap-3 rounded-2xl bg-clay-ink p-3 px-4 text-white shadow-clay",children:[e.jsxs("span",{className:"flex items-center gap-2 text-sm font-medium",children:[e.jsx(A,{className:"h-4 w-4"}),Ze.size," selected"]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(r,{size:"sm",variant:"secondary",icon:L,onClick:()=>es({open:!0,ids:Array.from(Ze)}),children:"Assign"}),e.jsx(r,{size:"sm",variant:"outline",icon:q,loading:Je,onClick:()=>ps("in_progress"),children:"In Progress"}),e.jsx(r,{size:"sm",variant:"outline",icon:H,loading:Je,onClick:()=>ps("resolved"),children:"Resolve"}),e.jsx(r,{size:"sm",variant:"outline",icon:Q,loading:Je,onClick:()=>ps("closed"),children:"Close"}),e.jsx(r,{size:"sm",variant:"danger",icon:K,onClick:()=>us(Array.from(Ze)),children:"Delete"}),e.jsx("button",{onClick:()=>Ge(new Set),className:"text-xs text-gray-300 hover:text-white",children:"Clear"})]})]}),"pinboard"===ae?e.jsx(we,{pins:Re.filter(e=>g(e,te.id)),summaries:qe,staffById:Oe,currentUserId:te.id,onOpen:e=>a(`/admin/support-tickets/${e}`),onUnpin:async e=>{await _(e).then(()=>{i.success("Unpinned"),os(),rs()}).catch(e=>i.error(e?.message||"Failed"))}}):"followups"===ae?e.jsx(ye,{followUps:$e,summaries:qe,staffById:Oe,onOpen:e=>a(`/admin/support-tickets/${e}`),onCancel:async e=>{await z(e).then(()=>{i.success("Cancelled"),os(),rs()}).catch(e=>i.error(e?.message||"Failed"))},onDone:async e=>{await S(e).then(()=>{i.success("Marked done"),os(),rs()}).catch(e=>i.error(e?.message||"Failed"))}}):e.jsxs(e.Fragment,{children:[e.jsx(o,{flush:!0,children:e.jsx(p,{columns:bs,data:le,rowKey:e=>e.id,loading:Fe||Ee&&0===le.length,onRowClick:e=>a(`/admin/support-tickets/${e.id}`),empty:e.jsx(u,{icon:Z,title:"needs"===ae?"Nothing needs a response":"mine"===ae?"No tickets assigned to you":"No tickets found",description:"Try adjusting your filters."}),renderCard:s=>{const t=k(s),n=Qe[s.id],l=is[s.id];return e.jsxs("div",{className:"flex items-start gap-3 px-4 py-4",children:[e.jsx("button",{onClick:e=>{e.stopPropagation(),hs(s.id)},className:"mt-0.5 p-0.5 flex-shrink-0",children:Ze.has(s.id)?e.jsx(A,{className:"h-5 w-5 text-primary-600"}):e.jsx(T,{className:"h-5 w-5 text-gray-400"})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("span",{className:"font-semibold text-clay-ink break-words [overflow-wrap:anywhere]",children:s.subject}),ls.has(s.id)&&e.jsx(D,{className:"h-3.5 w-3.5 text-primary-500 flex-shrink-0"}),"new"===s.status&&e.jsx(x,{tone:"red",dot:!0,children:"New"}),Ve.has(s.id)&&"new"!==s.status&&e.jsx(x,{tone:"amber",dot:!0,children:"Unread"}),t&&e.jsxs(x,{tone:"amber",children:[e.jsx(I,{className:"h-3 w-3"}),"Aging"]})]}),e.jsxs("div",{className:"mt-1 flex flex-wrap items-center gap-x-2 gap-y-1",children:[e.jsx(x,{tone:xe(s.status),dot:!0,
1children:ue(s.status)}),e.jsx("span",{className:"text-xs text-gray-500 truncate min-w-0",children:s.name||s.email})]}),e.jsxs("div",{className:"mt-1 flex flex-wrap items-center gap-x-3 gap-y-0.5 text-xs text-gray-400",children:[s.order_number&&e.jsxs("span",{children:["Order #",s.order_number]}),e.jsx("span",{children:pe(s.last_message_at||s.created_at)}),s.assigned_to&&e.jsx("span",{className:"truncate min-w-0",children:C(Oe[s.assigned_to])}),n&&e.jsxs("span",{className:"inline-flex items-center gap-1 text-gray-500",children:[e.jsx(O,{className:"h-3 w-3 text-amber-500"}),n.count," note",n.count>1?"s":""]}),l&&e.jsxs("span",{className:"inline-flex items-center gap-1 "+(he(l.due_at).overdue?"text-red-500":"text-primary-600"),children:[e.jsx(R,{className:"h-3 w-3"}),"Follow-up ",he(l.due_at).overdue?"overdue":he(l.due_at).txt]})]}),e.jsxs("div",{className:"mt-3 flex items-center gap-2",onClick:e=>e.stopPropagation(),children:[e.jsx(r,{size:"sm",variant:"secondary",onClick:()=>a(`/admin/support-tickets/${s.id}`),children:"View"}),e.jsx(je,{children:t=>e.jsxs(e.Fragment,{children:[e.jsx(be,{icon:L,label:"Assign…",onClick:()=>{t(),es({open:!0,ids:[s.id],current:s.assigned_to})}}),e.jsx(be,{icon:D,label:"Pin…",onClick:()=>{t(),ts({open:!0,id:s.id,label:s.subject})}}),e.jsx(be,{icon:R,label:"Schedule follow-up…",onClick:()=>{t(),ns({open:!0,id:s.id,label:s.subject})}}),e.jsx("div",{className:"my-1 border-t border-clay-border"}),e.jsx("p",{className:"px-3 py-1 text-[10px] font-semibold uppercase tracking-wide text-gray-400",children:"Status"}),e.jsx(be,{icon:B,label:"New",tone:"text-amber-500",onClick:()=>{t(),xs([s.id],"new")}}),e.jsx(be,{icon:q,label:"In Progress",tone:"text-blue-500",onClick:()=>{t(),xs([s.id],"in_progress")}}),e.jsx(be,{icon:H,label:"Resolved",tone:"text-emerald-500",onClick:()=>{t(),xs([s.id],"resolved")}}),e.jsx(be,{icon:Q,label:"Closed",tone:"text-gray-500",onClick:()=>{t(),xs([s.id],"closed")}}),e.jsx("div",{className:"my-1 border-t border-clay-border"}),e.jsx(be,{icon:K,label:"Delete",tone:"text-red-600",danger:!0,onClick:()=>{t(),us([s.id])}})]})})]})]})]})}})}),gs>1&&e.jsxs("div",{className:"mt-4 flex flex-wrap items-center justify-between gap-3 text-sm text-gray-500",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{children:"Per page"}),e.jsx("select",{value:ve,onChange:e=>Ne(Number(e.target.value)),className:"rounded-lg border border-clay-border py-1 pl-2 pr-6 text-sm",children:ce.map(s=>e.jsx("option",{value:s,children:s},s))})]}),e.jsxs("span",{children:[(ge-1)*ve+1,"–",Math.min(ge*ve,re)," of ",re.toLocaleString()]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("button",{disabled:1===ge,onClick:()=>ds(ge-1,!0),className:"rounded-lg p-2 hover:bg-clay-wash disabled:opacity-40",children:e.jsx(ee,{className:"h-4 w-4"})}),e.jsxs("span",{className:"px-2 font-medium text-clay-ink",children:[ge,"/",gs]}),e.jsx("button",{disabled:ge>=gs,onClick:()=>ds(ge+1,!0),className:"rounded-lg p-2 hover:bg-clay-wash disabled:opacity-40",children:e.jsx(se,{className:"h-4 w-4"})})]})]})]})]}),c?.id&&e.jsxs(e.Fragment,{children:[e.jsx(P,{open:Xe.open,onClose:()=>es({open:!1,ids:[]}),ticketIds:Xe.ids,staff:De,currentUser:te,currentAssigneeId:Xe.current,onAssigned:ms}),e.jsx(F,{open:ss.open,onClose:()=>ts({open:!1,id:""}),ticketId:ss.id,ticketLabel:ss.label,staff:De,currentUser:te,onPinned:()=>{os(),rs()}}),e.jsx(M,{open:as.open,onClose:()=>ns({open:!1,id:""}),ticketId:as.id,ticketLabel:as.label,staff:De,currentUser:te,onScheduled:()=>{os(),rs()}})]})]})},je=({children:s})=>{const[n,l]=t.useState(!1),i=t.useRef(null),r=t.useRef(null),[o,c]=t.useState(null),d=t.useCallback(()=>{const e=i.current,s=r.current;if(!e)return;const t=e.getBoundingClientRect(),a=s?.offsetHeight||340,n=Math.max(8,Math.min(t.right-224,window.innerWidth-224-8)),l=t.bottom+6,o=t.top-a-6,d=l+a>window.innerHeight-8&&o>8?o:l;c({top:d,left:n})},[]);return t.useLayoutEffect(()=>{if(!n)return;d();const e=()=>d(),s=e=>{"Escape"===e.key&&l(!1)},t=e=>{r.current?.contains(e.target)||i.current?.contains(e.target)||l(!1)};return window.addEventListener("scroll",e,!0),window.addEventListener("resize",e),window.addEventListener("keydown",s),document.addEventListener("mousedown",t),()=>{window.removeEventListener("scroll",e,!0),window.removeEventListener("resize",e),window.removeEventListener("keydown",s),document.removeEventListener("mousedown",t)}},[n,d]),e.jsxs(e.Fragment,{children:[e.jsx("button",{ref:i,onClick:()=>l(e=>!e),className:"rounded-lg border border-clay-border p-1.5 text-gray-500 hover:bg-clay-wash","aria-haspopup":"menu","aria-expanded":n,children:e.jsx(te,{className:"h-4 w-4"})}),n&&a.createPortal(e.jsx("div",{ref:r,role:"menu",style:{position:"fixed",top:o?.top??-9999,left:o?.left??-9999,width:224},className:"z-[200] rounded-xl border border-clay-border bg-white py-1 shadow-clay-lg",children:s(()=>l(!1))}),document.body)]})},be=({icon:s,label:t,tone:a,danger:n,onClick:l})=>e.jsxs("button",{onClick:l,className:"flex w-full items-center gap-2 px-3 py-2 text-sm hover:bg-clay-wash "+(n?"text-red-600 hover:bg-red-50":"text-gray-700"),children:[e.jsx(s,{className:`h-4 w-4 ${a||""}`}),t]}),fe={everyone:{label:"Everyone's board",icon:ne},users:{label:"Shared with people",icon:ae},me:{label:"My pins",icon:Y}},we=({pins:s,summaries:t,staffById:a,onOpen:n,onUnpin:l})=>
1{if(0===s.length)return e.jsx(o,{children:e.jsx(u,{icon:D,title:"No pinned tickets",description:"Pin a ticket with a note to keep it on your board."})});const i={everyone:[],users:[],me:[]};return s.forEach(e=>{(i[e.scope]||i.me).push(e)}),e.jsx("div",{className:"space-y-5",children:["everyone","users","me"].map(s=>{const r=i[s];if(!r.length)return null;const c=fe[s];return e.jsxs("div",{children:[e.jsxs("div",{className:"mb-2 flex items-center gap-2 text-sm font-semibold text-gray-500",children:[e.jsx(c.icon,{className:"h-4 w-4"})," ",c.label," ",e.jsxs("span",{className:"text-gray-400",children:["(",r.length,")"]})]}),e.jsx("div",{className:"grid grid-cols-1 gap-3 md:grid-cols-2 xl:grid-cols-3",children:r.map(s=>{const i=t[s.ticket_id];return e.jsxs(o,{className:"flex flex-col gap-2",interactive:!0,children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsxs("button",{onClick:()=>n(s.ticket_id),className:"min-w-0 text-left",children:[e.jsx("p",{className:"truncate font-semibold text-clay-ink",children:i?.subject||"Ticket"}),e.jsx("p",{className:"truncate text-xs text-gray-400",children:i?.name||i?.email||""})]}),e.jsx("button",{onClick:()=>l(s.id),title:"Unpin",className:"rounded-lg p-1 text-gray-300 hover:bg-red-50 hover:text-red-500",children:e.jsx(le,{className:"h-4 w-4"})})]}),s.note&&e.jsx("p",{className:"rounded-lg bg-clay-wash px-3 py-2 text-sm text-gray-700",children:s.note}),e.jsxs("div",{className:"flex items-center justify-between text-xs text-gray-400",children:[e.jsx("span",{children:C(a[s.pinned_by||""])}),i&&e.jsx(x,{tone:xe(i.status),dot:!0,children:ue(i.status)})]})]},s.id)})})]},s)})})},ye=({followUps:s,summaries:t,staffById:a,onOpen:n,onCancel:l,onDone:i})=>{const d=s.filter(e=>"pending"===e.status);if(0===d.length)return e.jsx(o,{children:e.jsx(u,{icon:R,title:"No follow-ups scheduled",description:"Schedule a follow-up from a ticket to get a reminder email when it's time to reach back out."})});const m=d.filter(e=>he(e.due_at).overdue),p=d.filter(e=>!he(e.due_at).overdue),h=({f:s})=>{const o=t[s.ticket_id],c=he(s.due_at),d=s.recipient_user_ids.length?s.recipient_user_ids.map(e=>C(a[e])).join(", "):"All admins";return e.jsxs("div",{className:"flex flex-col gap-2 px-5 py-3.5 sm:flex-row sm:items-center sm:justify-between",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{onClick:()=>n(s.ticket_id),className:"truncate font-semibold text-clay-ink hover:text-primary-600",children:o?.subject||"Ticket"}),e.jsx(x,{tone:c.overdue?"red":"blue",dot:!0,children:c.overdue?"Overdue":"Upcoming"})]}),e.jsxs("div",{className:"mt-0.5 flex flex-wrap items-center gap-x-3 text-xs text-gray-400",children:[e.jsxs("span",{className:"inline-flex items-center gap-1",children:[e.jsx(R,{className:"h-3 w-3"}),c.txt]}),e.jsxs("span",{className:"inline-flex items-center gap-1",children:[e.jsx(ie,{className:"h-3 w-3"}),d]}),s.created_by&&e.jsxs("span",{children:["by ",C(a[s.created_by])]})]}),s.note&&e.jsx("p",{className:"mt-1 text-sm text-gray-600",children:s.note})]}),e.jsxs("div",{className:"flex flex-shrink-0 items-center gap-2",children:[e.jsx(r,{size:"sm",variant:"outline",icon:re,onClick:()=>n(s.ticket_id),children:"Open"}),e.jsx(r,{size:"sm",variant:"secondary",icon:H,onClick:()=>i(s.id),children:"Done"}),e.jsx(r,{size:"sm",variant:"ghost",icon:le,onClick:()=>l(s.id),children:"Cancel"})]})]})};return e.jsxs("div",{className:"space-y-5",children:[m.length>0&&e.jsxs(o,{flush:!0,children:[e.jsx(c,{title:"Overdue",icon:I,subtitle:`${m.length} need attention`}),e.jsx("div",{className:"divide-y divide-clay-border",children:m.map(s=>e.jsx(h,{f:s},s.id))})]}),p.length>0&&e.jsxs(o,{flush:!0,children:[e.jsx(c,{title:"Upcoming",icon:R,subtitle:`${p.length} scheduled`}),e.jsx("div",{className:"divide-y divide-clay-border",children:p.map(s=>e.jsx(h,{f:s},s.id))})]})]})};export{ge 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.