PageSourceSearch

https://blueroots-production.up.railway.app/assets/team-page-CTE8ERNW.js

js blueroots-production.up.railway.app collected 2026-10-03 12:11:42 UTC 40,007 bytes, 1 lines download raw bytes

1import{d as de,b as k,j as e}from"./tanstack-raftEBQU.js";import{r as d}from"./react-vendor-DG9jHnNQ.js";import{b4 as Je,bk as We,bj as Ye,bm as qe,aI as G,p as te,q as ie,s as ke,t as _e,aZ as Me,O as je,V as Te,i as c,Q as ve,T as fe,U as Ne,ag as w,af as P,b0 as p,ay as v,aD as f,aE as N,az as y,aB as a,ah as z,d as K,ak as Pe,bh as g,a5 as Xe,x as Ze,y as es,aF as ss,a_ as as}from"./index-CwEfLZlp.js";import{u as ts}from"./confirm-dialog-jbV0gT14.js";import{T as Ue,d as Ve,e as he,c as T,a as $e,b as A}from"./table-B9A6PX9v.js";import{S as Le}from"./scroll-area-3boIVyA5.js";import{P as Ke}from"./plus-B2Qz2fhA.js";import{C as is}from"./circle-check-BHqhkodH.js";import{P as ne}from"./pencil-BQDSAmsb.js";import{T as ge}from"./trash-2-D8NernoQ.js";import{B as ns}from"./briefcase-BXnHmI64.js";import{U as rs}from"./user-plus-H55RuFuN.js";import{S as ls}from"./send-QQ2CR8ls.js";import{C as ds}from"./clock-BBumLuNC.js";import"./radix-B0zOOFBK.js";import"./charts-ycOWY838.js";import"./dnd-IADusAtS.js";import"./alert-dialog-Cq3beUiG.js";
1const cs=Je("KeyRound",[["path",{d:"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z",key:"1s6t7t"}],["circle",{cx:"16.5",cy:"7.5",r:".5",fill:"currentColor",key:"w0ekpg"}]]),pe={owner:"Owner",campaign_manager:"Campaign Manager",candidate:"Candidate",finance_director:"Finance Director",field_director:"Field Director",volunteer:"Volunteer",staff:"Staff",texter_admin:"Texter Admin",texter:"Texter",manager:"Campaign Manager",field_staff:"Staff"},Oe={owner:"Full access to everything. Cannot be changed.",campaign_manager:"Full access to all sections and settings.",candidate:"The candidate themselves. Full access to all sections and settings. May sign the Client Agreement.",finance_director:"Access to Finance section and overview.",field_director:"Access to Voter Contact section and overview.",volunteer:"Limited access to Voter Contact sections.",staff:"Access to Overview, Voter Contact, and Finance.",texter_admin:"Manages the texting platform: invites texters, runs blasts, assigns reply batches. No voter or finance data outside texting.",texter:"Texting only. Sees the texting dashboard and replies to assigned batches. No voter or finance data."},re={master_admin:"Master Admin",admin:"Admin",consultant:"Consultant",staff:"Staff",sales_manager:"Sales Manager",sales:"Sales Team"},os="[email protected]",le=t=>t?String(t.email||t.username||"").toLowerCase()===os:!1;function ms({user:t,open:l,onOpenChange:o,currentUserId:U,isAdmin:V,isMasterAdmin:R}){const{toast:u}=qe(),[_,$]=d.useState(""),[b,M]=d.useState(""),[n,h]=d.useState(""),[E,S]=d.useState(""),[x,C]=d.useState(""),[L,Q]=d.useState("staff"),{data:O=[],isLoading:J}=de({queryKey:["/api/users",t?.id,"campaigns"],queryFn:async()=>(await p("GET",`/api/users/${t.id}/campaigns`)).json(),enabled:!!t?.id&&l}),{data:ce=[]}=de({queryKey:["/api/my-campaigns"],enabled:l}),W=ce.filter(i=>!O.some(m=>m.campaignId===i.id)),F=k({mutationFn:async i=>(await p("PATCH",`/api/users/${t.id}`,i)).json(),onSuccess:()=>{g.invalidateQueries({queryKey:["/api/users"]}),g.invalidateQueries({queryKey:["/api/campaigns"]}),u({title:"User updated"})},onError:i=>{u({title:"Error",description:i.message,variant:"destructive"})}}),oe=k({mutationFn:async({campaignId:i,campaignRole:m})=>(await p("PATCH",`/api/campaigns/${i}/team/${t.id}`,{campaignRole:m})).json(),onSuccess:()=>{g.invalidateQueries({queryKey:["/api/users",t?.id,"campaigns"]}),g.invalidateQueries({queryKey:["/api/campaigns"]}),u({title:"Campaign role updated"})},onError:i=>{u({title:"Error",description:i.message,variant:"destructive"})}}),I=k({mutationFn:async({campaignId:i,campaignRole:m})=>(await p("POST",`/api/users/${t.id}/campaigns`,{campaignId:i,campaignRole:m})).json(),onSuccess:()=>{g.invalidateQueries({queryKey:["/api/users",t?.id,"campaigns"]}),g.invalidateQueries({queryKey:["/api/campaigns"]}),C(""),Q("staff"),u({title:"Assigned to campaign"})},onError:i=>{u({title:"Error",description:i.message,variant:"destructive"})}}),B=k({mutationFn:async i=>(await p("DELETE",`/api/users/${t.id}/campaigns/${i}`)).json(),onSuccess:()=>{g.invalidateQueries({queryKey:["/api/users",t?.id,"campaigns"]}),g.invalidateQueries({queryKey:["/api/campaigns"]}),u({title:"Removed from campaign"})},onError:i=>{u({title:"Error",description:i.message,variant:"destructive"})}}),me=_||t?.displayName||"",Y=E||t?.role||"";return e.jsx(je,{open:l,onOpenChange:i=>{o(i),i||($(""),M(""),h(""),S(""))},children:e.jsxs(ve,{className:"max-w-lg w-[95vw] max-h-[85vh] overflow-y-auto",children:[e.jsx(fe,{children:e.jsxs(Ne,{className:"flex items-center gap-2",children:[e.jsx(ne,{className:"h-4 w-4"}),"Edit User — ",t?.displayName]})}),t&&e.jsxs("div",{className:"space-y-5 pt-2",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(w,{children:"Display Name"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(P,{value:me,onChange:i=>$(i.target.value),placeholder:"Display name","data-testid":"input-edit-display-name"}),_&&_!==t.displayName&&e.jsx(c,{size:"sm",onClick:()=>F.mutate({displayName:_}),disabled:F.isPending,"data-testid":"button-save-display-name",children:"Save"})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(w,{children:"Email"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(P,{value:b||t.email||"",onChange:i=>M(i.target.value),placeholder:"[email protected]",type:"email","data-testid":"input-edit-email"}),b&&b!==(t.email||"")&&e.jsx(c,{size:"sm",onClick:()=>F.mutate({email:b}),disabled:F.isPending,"data-testid":"button-save-email",children:"Save"})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(w,{children:"Phone"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(P,{value:n||t.phone||"",onChange:i=>h(i.target.value),placeholder:"(555) 123-4567",type:"tel","data-testid":"input-edit-phone"}),n&&n!==(t.phone||"")&&e.jsx(c,{size:"sm",onClick:()=>F.mutate({phone:n}),disabled:F.isPending,"data-testid":"button-save-phone",children:"Save"})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(w,{children:"System Role"}),(()=>{const i=le(t),m=t.role==="master_admin";return t.id===U||i||m&&!R||!V?e.jsxs(K,{variant:m?"default":"outline",className:"text-xs",children:[m?e.jsx(G,{className:"h-3 w-3 mr-1"}):null,re[t.role]||t.role,i?" • Locked":""]}):e.jsxs(v,{value:Y,onValueChange:D=>{S(D),F.mutate({role:D})},children:[e.jsx(f,{className:"w-[180px]","data-testid":"select-edit-system-role",children:e.jsx(N,{})}),e.jsxs(y,{children:[R&&e.jsx(a,{value:"master_admin",children:"Master Admin"}),e.jsx(a,{value:"admin",children:"Admin"}),e.jsx(a,{value:"consultant",children:"Consultant"}),e.jsx(a,{value:"staff",children:"Staff"}),e.jsx(a,{value:"sales",children:"Sales Team"}),e.jsx(a,{value:"sales_manager",disabled:!R,children:"Sales Manager"})]})]})})()]}),V&&t.id!==U&&e.jsx("div",{className:"pt-1",children:e.jsxs(c,{variant:"outline",size:"sm",className:"w-full text-xs","data-testid":"button-reset-password",onClick:async()=>{try{const m=await(await p("POST",`/api/admin/users/${t.id}/reset-password`)).json();m.resetUrl&&!m.emailSent?(u({title:"Reset link generated",description:m.message}),navigator.clipboard?.writeText(m.resetUrl),u({title:"Link copied to clipboard"})):u({title:"Reset email sent",description:m.message})}catch(i){u({title:"Error",description:i.message,variant:"destructive"})}},children:[e.jsx(cs,{className:"h-3.5 w-3.5 mr-1.5"}),"Reset Password"]})}),e.jsx(ss,{}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(w,{className:"text-sm font-medium",children:"Campaign Assignments"}),J?e.jsx("div",{className:"flex items-center justify-center py-4",children:e.jsx(z,{className:"h-4 w-4 animate-spin"})}):O.length===0?e.jsx("p",{className:"text-sm text-muted-foreground",children:"Not assigned to any campaigns."}):e.jsx("div",{className:"space-y-2",children:O.map(i=>e.jsxs("div",{className:"flex items-center gap-2 p-2 rounded-md border bg-muted/30",children:[e.jsx("div",{className:"flex-1 min-w-0",children:e.jsx("p",{className:"text-sm font-medium truncate",children:i.campaignName})}),e.jsxs(v,{value:i.campaignRole,onValueChange:m=>oe.mutate({campaignId:i.campaignId,campaignRole:m}),children:[e.jsx(f,{className:"w-[160px] h-8 text-xs","data-testid":`select-edit-campaign-role-${i.campaignId}`,children:e.jsx(N,{})}),e.jsxs(y,{children:[e.jsx(a,{value:"owner",children:"Owner"}),e.jsx(a,{value:"campaign_manager",children:"Campaign Manager"}),e.jsx(a,{value:"candidate",children:"Candidate"}),e.jsx(a,{value:"finance_director",children:"Finance Director"}),e.jsx(a,{value:"field_director",children:"Field Director"}),e.jsx(a,{value:"volunteer",children:"Volunteer"}),e.jsx(a,{value:"staff",children:"Staff"}),e.jsx(a,{value:"texter_admin",children:"Texter Admin"}),e.jsx(a,{value:"texter",children:"Texter"})]})]}),e.jsx(c,{variant:"ghost",size:"sm",className:"h-8 w-8 p-0 text-muted-foreground hover:text-destructive",onClick:()=>B.mutate(i.campaignId),disabled:B.isPending,"data-testid":`button-remove-campaign-${i.campaignId}`,children:e.jsx(as,{className:"h-3.5 w-3.5"})})]},i.id))}),W.length>0&&e.jsxs("div",{className:"flex items-center gap-2 pt-1",children:[e.jsxs(v,{value:x,onValueChange:C,children:[e.jsx(f,{className:"flex-1 h-8 text-xs","data-testid":"select-add-campaign",children:e.jsx(N,{placeholder:"Select campaign..."})}),e.jsx(y,{children:W.map(i=>e.jsx(a,{value:i.id,children:i.name},i.id))})]}),e.jsxs(v,{value:L,onValueChange:Q,children:[e.jsx(f,{className:"w-[140px] h-8 text-xs","data-testid":"select-add-campaign-role",children:e.jsx(N,{})}),e.jsxs(y,{children:[e.jsx(a,{value:"campaign_manager",children:"Campaign Manager"}),e.jsx(a,{value:"candidate",children:"Candidate"}),e.jsx(a,{value:"finance_director",children:"Finance Director"}),e.jsx(a,{value:"field_director",children:"Field Director"}),e.jsx(a,{value:"volunteer",children:"Volunteer"}),e.jsx(a,{value:"staff",children:"Staff"}),e.jsx(a,{value:"texter_admin",children:"Texter Admin"}),e.jsx(a,{value:"texter",children:"Texter"})]})]}),e.jsx(c,{size:"sm",className:"h-8 shrink-0",disabled:!x||I.isPending,onClick:()=>I.mutate({campaignId:x,campaignRole:L}),"data-testid":"button-assign-to-campaign",children:I.isPending?e.jsx(z,{className:"h-3 w-3 animate-spin"}):e.jsx(Ke,{className:"h-3 w-3"})})]})]})]})]})})}function Ds(){const{selectedCampaign:t}=We(),{user:l}=Ye(),{toast:o}=qe(),{confirm:U,confirmDialog:V}=ts(),[R,u]=d.useState(!1),[_,$]=d.useState(""),[b,M]=d.useState("staff"),[n,h]=d.useState(!1),[E,S]=d.use
1State(""),[x,C]=d.useState(null),[L,Q]=d.useState(""),[O,J]=d.useState(""),[ce,W]=d.useState("staff"),[F,oe]=d.useState(!1),[I,B]=d.useState(""),[me,Y]=d.useState(""),[i,m]=d.useState("staff"),[X,Ee]=d.useState("staff"),[D,ye]=d.useState(null),[ze,Z]=d.useState(!1),[Qe,ee]=d.useState(null),{data:H=[]}=de({queryKey:["/api/users"],enabled:l?.role==="admin"||l?.role==="master_admin"}),{data:se=[],isLoading:Be}=de({queryKey:["/api/campaigns",t?.id,"team"],queryFn:async()=>t?(await p("GET",`/api/campaigns/${t.id}/team`)).json():[],enabled:!!t}),we=se.find(s=>s.userId===l?.id)?.campaignRole,He=l?.role==="admin"||l?.role==="master_admin"||we==="owner"||we==="campaign_manager"||we==="candidate",be=k({mutationFn:async({userId:s,campaignRole:r})=>(await p("POST",`/api/campaigns/${t.id}/team`,{userId:s,campaignRole:r})).json(),onSuccess:()=>{g.invalidateQueries({queryKey:["/api/campaigns",t?.id,"team"]}),o({title:"Team member assigned"}),u(!1),$(""),M("staff")},onError:s=>{o({title:"Error",description:s.message,variant:"destructive"})}}),xe=k({mutationFn:async s=>(await p("DELETE",`/api/campaigns/${t.id}/team/${s}`)).json(),onSuccess:()=>{g.invalidateQueries({queryKey:["/api/campaigns",t?.id,"team"]}),o({title:"Team member removed"})},onError:s=>{o({title:"Error",description:s.message,variant:"destructive"})}}),De=k({mutationFn:async({userId:s,role:r})=>(await p("PATCH",`/api/users/${s}/role`,{role:r})).json(),onSuccess:()=>{g.invalidateQueries({queryKey:["/api/users"]}),g.invalidateQueries({queryKey:["/api/campaigns",t?.id,"team"]}),o({title:"Role updated"})},onError:s=>{o({title:"Error",description:s.message,variant:"destructive"})}}),Ce=k({mutationFn:async s=>(await p("POST",`/api/campaigns/${t.id}/invite`,s)).json(),onSuccess:s=>{g.invalidateQueries({queryKey:["/api/users"]}),g.invalidateQueries({queryKey:["/api/campaigns",t?.id,"team"]}),ye(s),s.emailSent?o({title:"Invitation sent",description:`Email sent to ${I}`}):o({title:"User created",description:"Account created but email failed. Credentials shown below.",variant:"destructive"})},onError:s=>{o({title:"Error",description:s.message,variant:"destructive"})}}),ue=k({mutationFn:async s=>(await p("DELETE",`/api/users/${s}`)).json(),onSuccess:()=>{g.invalidateQueries({queryKey:["/api/users"]}),g.invalidateQueries({queryKey:["/api/campaigns",t?.id,"team"]}),o({title:"User deleted"})},onError:s=>{o({title:"Error",description:s.message,variant:"destructive"})}}),ae=k({mutationFn:async s=>(await p("POST","/api/auth/register",s)).json(),onSuccess:()=>{g.invalidateQueries({queryKey:["/api/users"]}),o({title:"User created",description:`Account for ${L} has been created.`}),h(!1),S(""),Q(""),J(""),W("staff")},onError:s=>{o({title:"Error",description:s.message,variant:"destructive"})}}),Re=k({mutationFn:async({userId:s,campaignRole:r})=>(await p("PATCH",`/api/campaigns/${t.id}/team/${s}`,{campaignRole:r})).json(),onSuccess:()=>{g.invalidateQueries({queryKey:["/api/campaigns",t?.id,"team"]}),o({title:"Campaign role updated"})},onError:s=>{o({title:"Error",description:s.message,variant:"destructive"})}}),Fe=H.filter(s=>!se.some(r=>r.userId===s.id));return He?e.jsxs(Le,{className:"h-full",children:[e.jsxs("div",{className:"p-3 sm:p-6 max-w-5xl mx-auto space-y-4 sm:space-y-6",children:[e.jsx("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4",children:e.jsxs("div",{children:[e.jsx("h1",{className:"text-xl sm:text-2xl font-bold tracking-tight","data-testid":"text-team-heading",children:"Team Management"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:"Assign staff to campaigns. Each user only sees data for their assigned campaigns."})]})}),(l?.role==="admin"||l?.role==="master_admin")&&e.jsxs(te,{className:"cc-card",children:[e.jsx(ke,{className:"pb-3",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs(_e,{className:"text-sm font-medium flex items-center gap-2",children:[e.jsx(Me,{className:"h-4 w-4"}),"All Users"]}),e.jsxs(je,{open:n,onOpenChange:s=>{h(s),s||(C(null),S(""),J(""),Q(""))},children:[e.jsx(Te,{asChild:!0,children:e.jsxs(c,{size:"sm","data-testid":"button-create-user",children:[e.jsx(Ke,{className:"h-4 w-4 mr-1.5"}),"Add Team Member"]})}),e.jsxs(ve,{children:[e.jsx(fe,{children:e.jsx(Ne,{children:x?"Add Existing User to Campaign":"Add Team Member"})}),e.jsxs("div",{className:"space-y-4 pt-2",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(w,{children:"Username"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(P,{value:E,onChange:s=>{S(s.target.value),C(null)},placeholder:"e.g., janesmith",disabled:!!x,"data-testid":"input-new-username"}),!x&&E.trim()&&e.jsx(c,{variant:"outline",size:"sm",className:"shrink-0",onClick:async()=>{try{const s=await p("GET",`/api/users/lookup?username=${encodeURIComponent(E.trim())}`);if(s.ok){const r=await s.json();C(r),o({title:"User Found",description:`${r.displayName} already has an account. You can assign them to this campaign.`})}else C(null)}catch{C(null)}},"data-testid":"button-check-user",children:"Check"})]})]}),x&&e.jsxs("div",{className:"flex items-center gap-3 p-3 rounded-lg bg-emerald-500/10 border border-emerald-500/20",children:[e.jsx(is,{className:"h-5 w-5 text-emerald-500 shrink-0"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium",children:x.displayName}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Existing user — will be assigned to this campaign"})]}),e.jsx(c,{variant:"ghost",size:"sm",className:"ml-auto h-7 text-xs",onClick:()=>{C(null),S("")},children:"Clear"})]}),!x&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(w,{children:"Display Name"}),e.jsx(P,{value:L,onChange:s=>Q(s.target.value),placeholder:"e.g., Jane Smith","data-testid":"input-new-display-name"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(w,{children:"Password"}),e.jsx(P,{type:"password",value:O,onChange:s=>J(s.target.value),placeholder:"Set a password","data-testid":"input-new-password"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(w,{children:"System Role"}),e.jsxs(v,{value:ce,onValueChange:W,children:[e.jsx(f,{"data-testid":"select-new-role",children:e.jsx(N,{})}),e.jsxs(y,{children:[e.jsx(a,{value:"admin",children:"Admin"}),e.jsx(a,{value:"consultant",children:"Consultant"}),e.jsx(a,{value:"staff",children:"Staff"})]})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(w,{children:"Campaign Role"}),e.jsxs(v,{value:b,onValueChange:M,children:[e.jsx(f,{"data-testid":"select-new-campaign-role",children:e.jsx(N,{})}),e.jsxs(y,{children:[e.jsx(a,{value:"campaign_manager",children:"Campaign Manager"}),e.jsx(a,{value:"candidate",children:"Candidate"}),e.jsx(a,{value:"finance_director",children:"Finance Director"}),e.jsx(a,{value:"field_director",children:"Field Director"}),e.jsx(a,{value:"volunteer",children:"Volunteer"}),e.jsx(a,{value:"staff",children:"Staff"}),e.jsx(a,{value:"texter_admin",children:"Texter Admin"}),e.jsx(a,{value:"texter",children:"Texter"})]})]})]}),e.jsxs(c,{className:"w-full",disabled:x?ae.isPending:!E.trim()||!O.trim()||!L.trim()||ae.isPending,onClick:()=>{x?ae.mutate({username:E.trim(),password:"existing-user-no-password-needed",displayName:x.displayName,role:x.role||"staff"}):ae.mutate({username:E.trim(),password:O,displayName:L.trim(),role:ce})},"data-testid":"button-confirm-create-user",children:[ae.isPending&&e.jsx(z,{className:"mr-2 h-4 w-4 animate-spin"}),x?"Assign to Campaign":"Create & Assign"]})]})]})]})]})}),e.jsx(ie,{children:H.length===0?e.jsx("p",{className:"text-sm text-muted-foreground text-center py-4",children:"No users registered yet."}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"md:hidden space-y-3",children:H.map(s=>{const r=l?.role==="master_admin",j=le(s),q=s.role==="master_admin",Ie=s.id===l?.i
1d||j||q&&!r;return e.jsxs("div",{className:"rounded-lg border bg-card p-3 space-y-2","data-testid":`card-user-${s.id}`,children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("p",{className:"font-medium truncate",children:s.displayName}),e.jsx("p",{className:"text-xs text-muted-foreground truncate",children:s.email||e.jsx("span",{className:"italic text-muted-foreground/50",children:"no email"})}),s.phone&&e.jsx("p",{className:"text-xs text-muted-foreground truncate",children:s.phone})]}),e.jsxs("div",{className:"flex items-center gap-1 shrink-0",children:[e.jsx(c,{variant:"ghost",size:"sm",className:"h-8 w-8 p-0 text-muted-foreground hover:text-primary",onClick:()=>{ee(s),Z(!0)},children:e.jsx(ne,{className:"h-4 w-4"})}),s.id!==l?.id&&s.role!=="master_admin"&&!le(s)&&e.jsx(c,{variant:"ghost",size:"sm",className:"h-8 w-8 p-0 text-muted-foreground hover:text-destructive",onClick:async()=>{await U({title:`Delete user "${s.displayName}"?`,description:"This removes them from all campaigns and cannot be undone.",confirmLabel:"Delete user",destructive:!0})&&ue.mutate(s.id)},disabled:ue.isPending,children:e.jsx(ge,{className:"h-4 w-4"})})]})]}),e.jsx("div",{className:"pt-1",children:Ie?e.jsxs(K,{variant:q?"default":"outline",className:"text-xs",title:j?"This account is locked":void 0,children:[q?e.jsx(G,{className:"h-3 w-3 mr-1"}):null,re[s.role]||s.role,j?" • Locked":""]}):e.jsxs(v,{value:s.role,onValueChange:Se=>De.mutate({userId:s.id,role:Se}),children:[e.jsx(f,{className:"w-full h-9 text-xs",children:e.jsx(N,{})}),e.jsxs(y,{children:[r&&e.jsx(a,{value:"master_admin",children:"Master Admin"}),e.jsx(a,{value:"admin",children:"Admin"}),e.jsx(a,{value:"consultant",children:"Consultant"}),e.jsx(a,{value:"staff",children:"Staff"}),e.jsx(a,{value:"sales",children:"Sales Team"}),e.jsx(a,{value:"sales_manager",disabled:!r,children:"Sales Manager"})]})]})})]},s.id)})}),e.jsx("div",{className:"hidden md:block",children:e.jsxs(Ue,{children:[e.jsx(Ve,{children:e.jsxs(he,{children:[e.jsx(T,{children:"Name"}),e.jsx(T,{children:"Email"}),e.jsx(T,{children:"Phone"}),e.jsx(T,{children:"System Role"}),e.jsx(T,{className:"w-20",children:"Actions"})]})}),e.jsx($e,{children:H.map(s=>e.jsxs(he,{"data-testid":`row-user-${s.id}`,children:[e.jsx(A,{className:"font-medium",children:s.displayName}),e.jsx(A,{className:"text-muted-foreground text-sm",children:s.email||e.jsx("span",{className:"text-xs italic text-muted-foreground/50",children:"—"})}),e.jsx(A,{className:"text-muted-foreground text-sm",children:s.phone||e.jsx("span",{className:"text-xs italic text-muted-foreground/50",children:"—"})}),e.jsx(A,{children:(()=>{const r=l?.role==="master_admin",j=le(s),q=s.role==="master_admin";return s.id===l?.id||j||q&&!r?e.jsxs(K,{variant:q?"default":"outline",className:"text-xs",title:j?"This account is locked":void 0,children:[q?e.jsx(G,{className:"h-3 w-3 mr-1"}):null,re[s.role]||s.role,j?" • Locked":""]}):e.jsxs(v,{value:s.role,onValueChange:Se=>De.mutate({userId:s.id,role:Se}),children:[e.jsx(f,{className:"w-[150px] h-8 text-xs","data-testid":`select-role-${s.id}`,children:e.jsx(N,{})}),e.jsxs(y,{children:[r&&e.jsx(a,{value:"master_admin",children:"Master Admin"}),e.jsx(a,{value:"admin",children:"Admin"}),e.jsx(a,{value:"consultant",children:"Consultant"}),e.jsx(a,{value:"staff",children:"Staff"}),e.jsx(a,{value:"sales",children:"Sales Team"}),e.jsx(a,{value:"sales_manager",disabled:!r,children:"Sales Manager"})]})]})})()}),e.jsx(A,{children:e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(c,{variant:"ghost",size:"sm",className:"h-8 w-8 p-0 text-muted-foreground hover:text-primary",onClick:()=>{ee(s),Z(!0)},"data-testid":`button-edit-user-${s.id}`,children:e.jsx(ne,{className:"h-3.5 w-3.5"})}),s.id!==l?.id&&s.role!=="master_admin"&&!le(s)&&e.jsx(c,{variant:"ghost",size:"sm",className:"h-8 w-8 p-0 text-muted-foreground hover:text-destructive",onClick:async()=>{await U({title:`Delete user "${s.displayName}"?`,description:"This removes them from all campaigns and cannot be undone.",confirmLabel:"Delete user",destructive:!0})&&ue.mutate(s.id)},disabled:ue.isPending,"data-testid":`button-delete-user-${s.id}`,children:e.jsx(ge,{className:"h-3.5 w-3.5"})})]})})]},s.id))})]})})]})})]}),e.jsxs(te,{className:"cc-card",children:[e.jsx(ke,{className:"pb-3",children:e.jsxs("div",{className:"flex items-center justify-between gap-4",children:[e.jsxs(_e,{className:"text-sm font-medium flex items-center gap-2",children:[e.jsx(ns,{className:"h-4 w-4"}),"Campaign Team"]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs(je,{open:R,onOpenChange:u,children:[e.jsx(Te,{asChild:!0,children:e.jsxs(c,{size:"sm",disabled:!t||Fe.length===0,"data-testid":"button-add-team-member",children:[e.jsx(rs,{className:"h-4 w-4 mr-1.5"}),"Assign"]})}),e.jsxs(ve,{children:[e.jsx(fe,{children:e.jsx(Ne,{children:"Assign Team Member"})}),e.jsxs("div",{className:"space-y-4 pt-2",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{className:"text-sm font-medium",children:"User"}),e.jsxs(v,{value:_,onValueChange:$,children:[e.jsx(f,{"data-testid":"select-assign-user",children:e.jsx(N,{placeholder:"Select a user"})}),e.jsx(y,{children:Fe.map(s=>e.jsxs(a,{value:s.id,children:[s.displayName," (",s.username,")"]},s.id))})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{className:"text-sm font-medium",children:"Campaign Role"}),e.jsxs(v,{value:b,onValueChange:M,children:[e.jsx(f,{"data-testid":"select-assign-role",children:e.jsx(N,{})}),e.jsxs(y,{children:[e.jsx(a,{value:"owner",children:"Owner"}),e.jsx(a,{value:"campaign_manager",children:"Campaign Manager"}),e.jsx(a,{value:"candidate",children:"Candidate"}),e.jsx(a,{value:"finance_director",children:"Finance Director"}),e.jsx(a,{value:"field_director",children:"Field Director"}),e.jsx(a,{value:"volunteer",children:"Volunteer"}),e.jsx(a,{value:"staff",children:"Staff"}),e.jsx(a,{value:"texter_admin",children:"Texter Admin"}),e.jsx(a,{value:"texter",children:"Texter"})]})]}),b&&Oe[b]&&e.jsx("p",{className:"text-xs text-muted-foreground",children:Oe[b]})]}),e.jsxs(c,{className:"w-full",disabled:!_||be.isPending,onClick:()=>be.mutate({userId:_,campaignRole:b}),"data-testid":"button-confirm-assign",children:[be.isPending&&e.jsx(z,{className:"mr-2 h-4 w-4 animate-spin"}),"Assign to Campaign"]})]})]})]}),e.jsxs(je,{open:F,onOpenChange:s=>{oe(s),s||(ye(null),B(""),Y(""))},children:[e.jsx(Te,{asChild:!0,children:e.jsxs(c,{size:"sm",variant:"outline",disabled:!t,"data-testid":"button-invite-email",children:[e.jsx(Pe,{className:"h-4 w-4 mr-1.5"}),"Invite via Email"]})}),e.jsxs(ve,{children:[e.jsx(fe,{children:e.jsxs(Ne,{className:"flex items-center gap-2",children:[e.jsx(Pe,{className:"h-4 w-4 text-sky-400"}),"Invite Team Member via Email"]})}),D?e.jsxs("div",{className:"space-y-4 pt-2",children:[e.jsxs("div",{className:"bg-green-500/10 border border-green-500/20 rounded-lg p-4 text-center",children:[e.jsx("p",{className:"text-sm font-medium text-green-400 mb-1",children:D.emailSent?"Invitation sent":"Account created"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:D.emailSent?`A branded invitation email has been sent to ${I} with login credentials.`:"Email delivery failed. Share these credentials manually:"})]}),!D.emailSent&&D.tempPassword&&e.jsxs("div",{className:"bg-muted rounded-lg p-3 space-y-1",children:[e.jsxs("div",{className:"text-xs text-muted-foreground",children:["Username: ",e.jsx("span",{className:"font-mono text-foreground",children:D.username})]}),e.jsxs("div",{className:"text-xs text-muted-foreground",children:["Password: ",e.jsx("span",{className:"font-mono text-foreground",children:D.tempPassword})]})]}),e.jsx(c,{className:"w-full",onClick:()=>{oe(!1),ye(null),B(""),Y("")},children:"Done"})]}):e.jsxs("div",{className:"space-y-4 pt-2",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(w,{children:"Email Address"}),e.jsx(P,{type:"email",value:I,onChange:s=>B(s.target.value),placeholder:"[email protected]","data-testid":"input-invite-email"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(w,{children:"Display Name"}),e.jsx(P,{value:me,onChange:s=>Y(s.target.value),placeholder:"Jane Smith","data-testid":"input-invite-name"})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(w,{children:"System Role"}),e.jsxs(v,{value:i,onValueChange:m,children:[e.jsx(f,{"data-testid":"select-invite-role",children:e.jsx(N,{})}),e.jsxs(y,{children:[e.jsx(a,{value:"admin",children:"Admin"}),e.jsx(a,{value:"consultant",children:"Consultant"}),e.jsx(a,{value:"staff",children:"Staff"})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(w,{children:"Campaign Role"}),e.jsxs(v,{value:X,onValueChange:Ee,children:[e.jsx(f,{"data-testid":"select-invite-campaign-role",children:e.jsx(N,{})}),e.jsxs(y,{children:[e.jsx(a,{value:"owner",children:"Owner"}),e.jsx(a,{value:"campaign_manager",children:"Campaign Manager"}),e.jsx(a,{value:"candidate",children:"Candidate"}),e.jsx(a,{value:"finance_director",children:"Finance Director"}),e.jsx(a,{value:"field_director",children:"Field Director"}),e.jsx(a,{value:"volunteer",children:"Volunteer"}),e.jsx(a,{value:"staff",children:"Staff"}),e.jsx(a,{value:"texter_admin",children:"Texter Admin"}),e.jsx(a,{value:"texter",children:"Texter"})]})]})]})]}),e.jsxs(c,{className:"w-full",disabled:!I.trim()||Ce.isPending,onClick:()=>
1Ce.mutate({email:I.trim(),displayName:me.trim(),role:i,campaignRole:X}),"data-testid":"button-send-invite",children:[Ce.isPending?e.jsx(z,{className:"mr-2 h-4 w-4 animate-spin"}):e.jsx(ls,{className:"mr-2 h-4 w-4"}),"Send Invitation"]}),e.jsx("p",{className:"text-xs text-muted-foreground text-center",children:"Sends a branded email from [email protected] with login credentials"})]})]})]})]})]})}),e.jsx(ie,{children:t?Be?e.jsx("div",{className:"flex items-center justify-center py-8",children:e.jsx(z,{className:"h-5 w-5 animate-spin text-muted-foreground"})}):se.length===0?e.jsxs("div",{className:"text-center py-8",children:[e.jsx(Me,{className:"h-10 w-10 mx-auto text-muted-foreground/40 mb-2"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"No team members assigned to this campaign yet."}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:'Click "Assign" to add staff members.'})]}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"md:hidden space-y-3",children:se.map(s=>e.jsxs("div",{className:"rounded-lg border bg-card p-3 space-y-2","data-testid":`card-team-${s.userId}`,children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("p",{className:"font-medium truncate",children:s.displayName}),e.jsxs("p",{className:"text-xs text-muted-foreground truncate",children:["@",s.username]}),s.assignedAt&&e.jsxs("p",{className:"text-[11px] text-muted-foreground mt-0.5",children:["Assigned ",new Date(s.assignedAt).toLocaleDateString()]})]}),e.jsxs("div",{className:"flex items-center gap-1 shrink-0",children:[e.jsx(c,{variant:"ghost",size:"sm",className:"h-8 w-8 p-0 text-muted-foreground hover:text-primary",onClick:()=>{const r=H.find(j=>j.id===s.userId);r&&(ee(r),Z(!0))},children:e.jsx(ne,{className:"h-4 w-4"})}),e.jsx(c,{variant:"ghost",size:"sm",className:"h-8 w-8 p-0 text-muted-foreground hover:text-destructive",onClick:()=>xe.mutate(s.userId),disabled:xe.isPending,children:e.jsx(ge,{className:"h-4 w-4"})})]})]}),e.jsx("div",{className:"flex items-center gap-2 flex-wrap",children:e.jsx(K,{variant:"outline",className:"text-xs",children:re[s.userRole]||s.userRole})}),e.jsx("div",{children:s.campaignRole==="owner"?e.jsx(K,{variant:"default",className:"text-xs",children:pe[s.campaignRole]}):e.jsxs(v,{value:s.campaignRole,onValueChange:r=>Re.mutate({userId:s.userId,campaignRole:r}),children:[e.jsx(f,{className:"w-full h-9 text-xs",children:e.jsx(N,{children:pe[s.campaignRole]||s.campaignRole})}),e.jsxs(y,{children:[e.jsx(a,{value:"campaign_manager",children:"Campaign Manager"}),e.jsx(a,{value:"candidate",children:"Candidate"}),e.jsx(a,{value:"finance_director",children:"Finance Director"}),e.jsx(a,{value:"field_director",children:"Field Director"}),e.jsx(a,{value:"volunteer",children:"Volunteer"}),e.jsx(a,{value:"staff",children:"Staff"}),e.jsx(a,{value:"texter_admin",children:"Texter Admin"}),e.jsx(a,{value:"texter",children:"Texter"})]})]})})]},s.id))}),e.jsx("div",{className:"hidden md:block",children:e.jsxs(Ue,{children:[e.jsx(Ve,{children:e.jsxs(he,{children:[e.jsx(T,{children:"Name"}),e.jsx(T,{children:"Username"}),e.jsx(T,{children:"System Role"}),e.jsx(T,{children:"Campaign Role"}),e.jsx(T,{children:"Assigned"}),e.jsx(T,{className:"w-24",children:"Actions"})]})}),e.jsx($e,{children:se.map(s=>e.jsxs(he,{"data-testid":`row-team-${s.userId}`,children:[e.jsx(A,{className:"font-medium",children:s.displayName}),e.jsx(A,{className:"text-muted-foreground",children:s.username}),e.jsx(A,{children:e.jsx(K,{variant:"outline",className:"text-xs",children:re[s.userRole]||s.userRole})}),e.jsx(A,{children:s.campaignRole==="owner"?e.jsx(K,{variant:"default",className:"text-xs",children:pe[s.campaignRole]}):e.jsxs(v,{value:s.campaignRole,onValueChange:r=>Re.mutate({userId:s.userId,campaignRole:r}),children:[e.jsx(f,{className:"w-[160px] h-8 text-xs","data-testid":`select-campaign-role-${s.userId}`,children:e.jsx(N,{children:pe[s.campaignRole]||s.campaignRole})}),e.jsxs(y,{children:[e.jsx(a,{value:"campaign_manager",children:"Campaign Manager"}),e.jsx(a,{value:"candidate",children:"Candidate"}),e.jsx(a,{value:"finance_director",children:"Finance Director"}),e.jsx(a,{value:"field_director",children:"Field Director"}),e.jsx(a,{value:"volunteer",children:"Volunteer"}),e.jsx(a,{value:"staff",children:"Staff"}),e.jsx(a,{value:"texter_admin",children:"Texter Admin"}),e.jsx(a,{value:"texter",children:"Texter"})]})]})}),e.jsx(A,{className:"text-xs text-muted-foreground",children:s.assignedAt?new Date(s.assignedAt).toLocaleDateString():"—"}),e.jsx(A,{children:e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(c,{variant:"ghost",size:"sm",className:"h-8 w-8 p-0 text-muted-foreground hover:text-primary",onClick:()=>{const r=H.find(j=>j.id===s.userId);r&&(ee(r),Z(!0))},"data-testid":`button-edit-team-${s.userId}`,children:e.jsx(ne,{className:"h-3.5 w-3.5"})}),e.jsx(c,{variant:"ghost",size:"sm",className:"h-8 w-8 p-0 text-muted-foreground hover:text-destructive",onClick:()=>xe.mutate(s.userId),disabled:xe.isPending,"data-testid":`button-remove-${s.userId}`,children:e.jsx(ge,{className:"h-3.5 w-3.5"})})]})})]},s.id))})]})})]}):e.jsx("p",{className:"text-sm text-muted-foreground text-center py-4",children:"Select a campaign to manage its team."})})]}),e.jsx(te,{className:"cc-card border-dashed",children:e.jsx(ie,{className:"p-4",children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(G,{className:"h-5 w-5 text-primary mt-0.5 shrink-0"}),e.jsxs("div",{className:"text-sm text-muted-foreground",children:[e.jsx("p",{className:"font-medium text-foreground mb-1",children:"Role-Based Access"}),e.jsxs("ul",{className:"space-y-1 list-disc list-inside",children:[e.jsxs("li",{children:[e.jsx("strong",{children:"Owner / Campaign Manager"})," — Full access to all sections and settings"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Finance Director"})," — Finance section (Donors, Emails, Sprout, Content Studio, Fundraising Texts)"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Field Director"})," — Voter Contact section (Texting, Calls, Doors, Voters, Volunteers)"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Volunteer"})," — Limited Voter Contact access"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Staff"})," — Overview, Voter Contact, and Finance"]}),e.jsx("li",{children:"Admins and Master Admins bypass campaign role restrictions"})]})]})]})})})]}),(l?.role==="admin"||l?.role==="master_admin")&&e.jsx(xs,{}),V,e.jsx(ms,{user:Qe,open:ze,onOpenChange:s=>{Z(s),s||ee(null)},currentUserId:l?.id||"",isAdmin:l?.role==="admin"||l?.role==="master_admin",isMasterAdmin:l?.role==="master_admin"})]}):e.jsx(Le,{className:"h-full",children:e.jsxs("div",{className:"p-6 max-w-4xl mx-auto",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-6",children:[e.jsx(G,{className:"h-5 w-5 text-muted-foreground"}),e.jsx("h1",{className:"text-2xl font-bold tracking-tight",children:"Team Management"})]}),e.jsx(te,{children:e.jsxs(ie,{className:"p-8 text-center",children:[e.jsx(G,{className:"h-12 w-12 mx-auto text-muted-foreground
1/40 mb-3"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Only campaign owners, managers, candidates, or platform admins can manage team assignments."})]})})]})})}const Ae={"email-volunteer-link":{label:"Emailed volunteer link",icon:"📧",color:"text-blue-600"},"volunteer-register":{label:"Volunteer registered",icon:"🚪",color:"text-green-600"},"volunteer-login":{label:"Volunteer signed in",icon:"🔑",color:"text-slate-600"},"volunteer-join":{label:"Volunteer joined turf",icon:"📍",color:"text-sky-600"},"register-walker":{label:"Walker registered",icon:"🚶",color:"text-green-600"},login:{label:"User logged in",icon:"🔑",color:"text-slate-500"},login_failed:{label:"Failed login attempt",icon:"⚠️",color:"text-red-500"},login_locked:{label:"Account locked",icon:"🔒",color:"text-red-600"},logout:{label:"User logged out",icon:"👋",color:"text-slate-400"},"invite-user":{label:"Invited team member",icon:"📨",color:"text-blue-600"},user_role_change:{label:"Changed user role",icon:"🛡️",color:"text-amber-600"},user_delete:{label:"Deleted user",icon:"🗑️",color:"text-red-600"},campaign_create:{label:"Created campaign",icon:"🏛️",color:"text-green-600"},campaign_delete:{label:"Deleted campaign",icon:"🗑️",color:"text-red-600"}};function xs(){const[t,l]=d.useState(!1),[o,U]=d.useState("all"),V=de({queryKey:["/api/audit-logs"],queryFn:async()=>(await p("GET","/api/audit-logs?limit=200")).json(),enabled:t}),R=V.data||[],u=o==="all"?R:R.filter(n=>n.action===o),_=[...new Set(R.map(n=>n.action))].sort(),$=n=>{try{const h=new Date(n),S=new Date().getTime()-h.getTime(),x=Math.floor(S/6e4);if(x<1)return"Just now";if(x<60)return`${x}m ago`;const C=Math.floor(x/60);return C<24?`${C}h ago`:h.toLocaleDateString("en-US",{month:"short",day:"numeric",hour:"numeric",minute:"2-digit"})}catch{return n}},b=n=>{try{return JSON.parse(n||"{}")}catch{return{}}},M=n=>{const h=b(n.details),S=Ae[n.action]?.label||n.action;switch(n.action){case"email-volunteer-link":return e.jsxs(e.Fragment,{children:[n.userName," emailed the volunteer link to ",e.jsx("strong",{children:h.email})]});case"volunteer-register":return e.jsxs(e.Fragment,{children:[e.jsx("strong",{children:h.name||n.userName})," registered as a door knock volunteer"]});case"volunteer-join":return e.jsxs(e.Fragment,{children:[e.jsx("strong",{children:n.userName})," joined a turf"]});case"invite-user":return e.jsxs(e.Fragment,{children:[n.userName," invited ",e.jsx("strong",{children:h.email||h.displayName})," to the campaign"]});case"user_role_change":return e.jsxs(e.Fragment,{children:[n.userName," changed a user's role to ",e.jsx("strong",{children:h.newRole})]});case"login_failed":return e.jsxs(e.Fragment,{children:["Failed login attempt for ",e.jsx("strong",{children:h.username})]});default:return e.jsxs(e.Fragment,{children:[n.userName," — ",S]})}};return e.jsxs(te,{className:"cc-card",children:[e.jsx(ke,{className:"pb-3 cursor-pointer",onClick:()=>l(!t),children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs(_e,{className:"text-base flex items-center gap-2",children:[e.jsx(Xe,{className:"h-4 w-4"}),"Activity Log"]}),t?e.jsx(Ze,{className:"h-4 w-4 text-muted-foreground"}):e.jsx(es,{className:"h-4 w-4 text-muted-foreground"})]})}),t&&e.jsxs(ie,{className:"pt-0",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[e.jsxs("select",{value:o,onChange:n=>U(n.target.value),className:"h-8 text-xs rounded-md border border-input bg-background px-2",children:[e.jsx("option",{value:"all",children:"All activity"}),_.map(n=>e.jsx("option",{value:n,children:Ae[n]?.label||n},n))]}),e.jsxs("span",{className:"text-xs text-muted-foreground",children:[u.length," entries"]})]}),V.isLoading?e.jsx("div",{className:"flex items-center justify-center py-8",children:e.jsx(z,{className:"h-5 w-5 animate-spin text-muted-foreground"})}):u.length===0?e.jsx("p",{className:"text-sm text-muted-foreground text-center py-6",children:"No activity recorded yet."}):e.jsx("div",{className:"max-h-96 overflow-y-auto space-y-0 divide-y",children:u.map(n=>{const h=Ae[n.action];return e.jsxs("div",{className:"flex items-start gap-3 py-2.5 px-1",children:[e.jsx("div",{className:"shrink-0 mt-0.5 text-sm",children:h?.icon||"📋"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:`text-sm ${h?.color||"text-foreground"}`,children:M(n)}),e.jsxs("div",{className:"flex items-center gap-2 mt-0.5",children:[e.jsxs("span",{className:"text-[11px] text-muted-foreground flex items-center gap-1",children:[e.jsx(ds,{className:"h-2.5 w-2.5"}),$(n.createdAt)]}),n.ipAddress&&n.ipAddress!=="unknown"&&e.jsx("span",{className:"text-[10px] text-muted-foreground
1/60",children:n.ipAddress})]})]})]},n.id)})})]})]})}export{Ds 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.