1import{r as l,_ as xe,a5 as he,a as A,a6 as p,j as e,U as ee,bt as se,q as ae,C as v,b as y,d as b,e as N,B as o,au as ue,bd as P,bS as je,ak as R,al as $,am as F,an as I,ao as L,aq as U,h as ge,cn as pe,v as ve,f as ye,s as be,cb as Ne,ab as m,aF as fe,$ as O,a0 as q,a1 as V,a2 as _,a3 as f,a7 as B}from"./index-CuSEeJFb.js";import{T as we,a as Ce,b as K,c as Q}from"./tabs-CcPOXtvT.js";import{P as Se}from"./pen-line-Ys7SVokk.js";import{M as ke}from"./mail-Dl1RGATy.js";import{U as Me}from"./user-plus-Bycr7F9K.js";import{f as z}from"./format-hhvI2L0z.js";import"./en-US-BOoww7nS.js";const H=[{value:"owner",label:"Owner",description:"Full system access including billing"},{value:"admin",label:"Admin",description:"Manage team, clients, and all campaigns"},{value:"manager",label:"Manager",description:"Manage assigned clients and campaigns"},{value:"editor",label:"Editor",description:"Create and edit campaigns"},{value:"viewer",label:"Viewer",description:"View-only access"}],G=[{id:"manage_clients",label:"Client Management",description:"Add, edit, remove clients"},{id:"create_campaigns",label:"Campaign Creation",description:"Create new marketing campaigns"},{id:"edit_content",label:"Content Editing",description:"Edit campaign content and assets"},{id:"view_billing",label:"Billing Access",description:"View invoices and payment information"},{id:"manage_team",label:"Team Management",description:"Invite and manage team members"},{id:"export_data",label:"Data Export",description:"Export reports and campaign data"},{id:"advanced_settings",label:"Advanced Settings",description:"Access organization settings"}],Te=({status:h})=>{switch(h){case"active":return e.jsx(ye,{className:"w-4 h-4 text-green-500"});case"invited":case"pending":return e.jsx(ve,{className:"w-4 h-4 text-yellow-500"});case"suspended":return e.jsx(pe,{className:"w-4 h-4 text-red-500"});default:return e.jsx(ge,{className:"w-4 h-4 text-gray-500"})}},te=({status:h})=>{const u={active:"bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200",invited:"bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200",pending:"bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200",suspended:"bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200"};return e.jsx(be,{className:`${u[h]||u.active} text-xs`,children:h})};function Ie(){const[h,u]=l.useState(!1),[ie,w]=l.useState(!1),[i,X]=l.useState(null),[ne,j]=l.useState(!1),[r,J]=l.useState(null),{toast:c}=xe(),C=he(),{data:le=[],isLoading:de}=A({queryKey:["/api/team/members"]}),{data:W=[],isLoading:re}=A({queryKey:["/api/team/invitations"]}),{data:Y=[],isLoading:ce}=A({queryKey:["/api/team/activity"]}),S=p({mutationFn:async s=>B("POST","/api/team/invite"),onSuccess:()=>{C.invalidateQueries({queryKey:["/api/team/invitations"]}),u(!1),c({title:"Invitation sent",description:"Team member invitation has been sent successfully."})},onError:s=>{c({title:"Failed to send invitation",description:s.message,variant:"destructive"})}}),k=p({mutationFn:async s=>B("PATCH",`/api/team/members/${s.id}`,s.updates),onSuccess:()=>{C.invalidateQueries({queryKey:["/api/team/members"]}),w(!1),X(null),c({title:"Member updated",description:"Team member has been updated successfully."})},onError:s=>{c({title:"Failed to update member",description:s.message,variant:"destructive"})}}),M=p({mutationFn:async s=>B("DELETE",`/api/team/members/${s}`),onSuccess:()=>{C.invalidateQueries({queryKey:["/api/team/members"]}),j(!1),J(null),c({title:"Member removed",description:"Team member has been removed successfully."})},onError:s=>{c({title:"Failed to remove member",description:s.message,variant:"destructive"})}}),Z=p({mutationFn:async()=>{const s=await fetch("/api/team/activity/export",{method:"GET",headers:{"Content-Type":"application/json"},credentials:"include"});if(!s.ok)throw new Error("Failed to export activity");const n=await s.blob(),t=window.URL.createObjectURL(n),d=document.createElement("a");d.href=t,d.download=`team-activity-${z(new Date,"yyyy-MM-dd")}.csv`,document.body.appendChild(d),d.click(),window.URL.revokeObjectURL(t),document.body.removeChild(d)},onSuccess:()=>{c({title:"Export complete",description:"Activity report has been downloaded."})},onError:s=>{c({title:"Export failed",description:s.message,variant:"destructive"})}}),oe=()=>{const[s,n]=l.useState(""),[t,d]=l.useState("editor"),[x,g]=l.useState([]),T=()=>{!s||!t||S.mutate({email:s,role:t,permissions:x})};return e.jsxs(R,{open:h,onOpenChange:u,children:[e.jsx(Ne,{asChild:!0,children:e.jsxs(o,{className:"flex items-center gap-2","data-testid":"button-invite-member",children:[e.jsx(Me,{className:"w-4 h-4"}),e.jsx("span",{className:"hidden sm:inline",children:"Invite Team Member"}),e.jsx("span",{className:"sm:hidden",children:"Invite"})]})}),e.jsxs($,{className:"sm:max-w-md",children:[e.jsxs(F,{children:[e.jsx(I,{children:"Invite Team Member"}),e.jsx(L,{children:"Send an invitation to join your team. They'll receive an email with setup instructions."})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx(m,{htmlFor:"email",children:"Email Address"}),e.jsx(fe,{id:"email",type:"email",value:s,onChange:a=>n(a.target.value),placeholder:"[email protected]","data-testid":"input-email"})]}),e.jsxs("div",{children:[e.jsx(m,{htmlFor:"role",children:"Role"}),e.jsxs(O,{value:t,onValueChange:d,children:[e.jsx(q,{"data-testid":"select-role",children:e.jsx(V,{})}),e.jsx(_,{children:H.filter(a=>a.value!=="owner").map(a=>e.jsx(f,{value:a.value,children:a.label},a.value))})]})]}),e.jsxs("div",{children:[e.jsx(m,{children:"Permissions"}),e.jsx("div",{className:"space-y-2 max-h-32 overflow-y-auto",children:G.map(a=>e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(P,{id:a.id,checked:x.includes(a.id),onCheckedChange:E=>{g(E?[...x,a.id]:x.filter(D=>D!==a.id))},"data-testid":`checkbox-${a.id}`}),e.jsx(m,{htmlFor:a.id,className:"text-sm",children:a.label})]},a.id))})]})]}),e.jsx(U,{children:e.jsx(o,{onClick:T,disabled:S.isPending,"data-testid":"button-send-invite",children:S.isPending?"Sending...":"Send Invitation"})})]})]})},me=()=>{const[s,n]=l.useState((i==null?void 0:i.role)||""),[t,d]=l.useState((i==null?void 0:i.permissions)||[]),[x,g]=l.useState((i==null?void 0:i.status)||"active");if(!i)return null;const T=()=>{k.mutate({id:i.id,updates:{role:s,permissions:t,status:x}})};return e.jsx(R,{open:ie,onOpenChange:w,children:e.jsxs($,{className:"sm:max-w-md",children:[e.jsxs(F,{children:[e.jsx(I,{children:"Edit Team Member"}),e.jsxs(L,{children:["Update ",i.firstName," ",i.lastName,"'s role and permissions."]})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx(m,{children:"Role"}),e.jsxs(O,{value:s,onValueChange:n,children:[e.jsx(q,{"data-testid":"select-edit-role",children:e.jsx(V,{})}),e.jsx(_,{children:H.map(a=>e.jsx(f,{value:a.value,children:a.label},a.value))})]})]}),e.jsxs("div",{children:[e.jsx(m,{children:"Status"}),e.jsxs(O,{value:x,onValueChange:g,children:[e.jsx(q,{"data-testid":"select-edit-status",children:e.jsx(V,{})}),e.jsxs(_,{children:[e.jsx(f,{value:"active",children:"Active"}),e.jsx(f,{value:"suspended",children:"Suspended"})]})]})]}),e.jsxs("div",{children:[e.jsx(m,{children:"Permissions"}),e.jsx("div",{className:"space-y-2 max-h-32 overflow-y-auto",children:G.map(a=>e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(P,{id:`edit-${a.id}`,checked:t.includes(a.id),onCheckedChange:E=>{d(E?[...t,a.id]:t.filter(D=>D!==a.id))},"data-testid":`checkbox-edit-${a.id}`}),e.jsx(m,{htmlFor:`edit-${a.id}`,className:"text-sm",children:a.label})]},a.id))})]})]}),e.jsx(U,{children:e.jsx(o,{onClick:T,disabled:k.isPending,"data-testid":"button-save-changes",children:k.isPending?"Saving...":"Save Changes"})})]})})};return e.jsx("div",{className:"min-h-screen bg-gray-50 dark:bg-gray-900",children:e.jsxs("div",{className:"max-w-7xl mx-auto p-4 sm:p-6 lg:p-8",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between mb-6",children:[e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl font-bold text-gray-900 dark:text-white flex items-center gap-2",children:[e.jsx(ee,{className:"w-6 h-6 text-orange-500"}),"Team Settings"]}),e.jsx("p",{className:"text-gray-600 dark:text-gray-300 mt-1",children:"Manage your team members, roles, and permissions"})]}),e.jsx(oe,{})]}),e.jsxs(we,{defaultValue:"members",className:"space-y-6",children:[e.jsxs(Ce,{className:"grid w-full grid-cols-3 lg:w-fit lg:grid-cols-3",children:[e.jsxs(K,{value:"members",className:"flex items-center gap-2","data-testid":"tab-members",children:[e.jsx(ee,{className:"w-4 h-4"}),e.jsx("span",{className:"hidden sm:inline",children:"Members"})]}),e.jsxs(K,{value:"permissions",className:"flex items-center gap-2","data-testid":"tab-permissions",children:[e.jsx(se,{className:"w-4 h-4"}),e.jsx("span",{className:"hidden sm:inline",children:"Roles"})]}),e.jsxs(K,{value:"activity",className:"flex items-center gap-2","data-testid":"tab-activity",children:[e.jsx(ae,{className:"w-4 h-4"}),e.jsx("span",{className:"hidden sm:inline",children:"Activity"})]})]}),e.jsx(Q,{value:"members",className:"space-y-4",children:e.jsxs("div",{className:"grid gap-4",children:[e.jsxs(v,{children:[e.jsx(y,{children:e.jsx(b,{children:"Team Members"})}),e.jsx(N,{children:de?e.jsxs("div",{className:"text-center py-8",children:[e.jsx("div",{className:"animate-spin w-8 h-8 border-4 border-orange-500 border-t-transparent roun
1ded-full mx-auto"}),e.jsx("p",{className:"text-gray-500 mt-2",children:"Loading team members..."})]}):e.jsx("div",{className:"space-y-4",children:(le||[]).map(s=>{var n,t;return e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between p-4 border border-gray-200 dark:border-gray-700 rounded-lg",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("div",{className:"w-10 h-10 bg-orange-100 dark:bg-orange-900 rounded-full flex items-center justify-center",children:e.jsx("span",{className:"text-orange-600 dark:text-orange-400 font-semibold",children:((t=(n=s.firstName||s.email)==null?void 0:n[0])==null?void 0:t.toUpperCase())||"?"})}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("h3",{className:"font-medium","data-testid":`text-member-name-${s.id}`,children:[s.firstName," ",s.lastName," ",s.firstName||s.lastName?"":s.email]}),e.jsx(Te,{status:s.status}),e.jsx(te,{status:s.status})]}),e.jsx("p",{className:"text-sm text-gray-500","data-testid":`text-member-email-${s.id}`,children:s.email}),e.jsxs("p",{className:"text-sm text-gray-500",children:["Role: ",e.jsx("span",{className:"font-medium",children:s.role})]})]})]}),e.jsxs("div",{className:"flex items-center gap-2 mt-4 sm:mt-0",children:[e.jsx(o,{size:"sm",variant:"outline",onClick:()=>{X(s),w(!0)},"data-testid":`button-edit-${s.id}`,children:e.jsx(Se,{className:"w-4 h-4"})}),s.role!=="owner"&&e.jsx(o,{size:"sm",variant:"outline",onClick:()=>{J(s),j(!0)},className:"text-red-600 hover:text-red-700","data-testid":`button-delete-${s.id}`,children:e.jsx(ue,{className:"w-4 h-4"})})]})]},s.id)})})})]}),e.jsxs(v,{children:[e.jsx(y,{children:e.jsx(b,{children:"Pending Invitations"})}),e.jsx(N,{children:re?e.jsx("div",{className:"text-center py-4",children:e.jsx("div",{className:"animate-spin w-6 h-6 border-4 border-orange-500 border-t-transparent rounded-full mx-auto"})}):W.length===0?e.jsx("p",{className:"text-gray-500 text-center py-4",children:"No pending invitations"}):e.jsx("div",{className:"space-y-3",children:W.map(s=>e.jsxs("div",{className:"flex items-center justify-between p-3 border border-gray-200 dark:border-gray-700 rounded-lg",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(ke,{className:"w-5 h-5 text-orange-500"}),e.jsxs("div",{children:[e.jsx("p",{className:"font-medium","data-testid":`text-invitation-email-${s.id}`,children:s.email}),e.jsxs("p",{className:"text-sm text-gray-500",children:["Role: ",s.role," ⢠Sent ",z(new Date(s.createdAt),"MMM d, yyyy")]})]})]}),e.jsx(te,{status:s.status})]},s.id))})})]})]})}),e.jsx(Q,{value:"permissions",className:"space-y-4",children:e.jsxs(v,{children:[e.jsx(y,{children:e.jsx(b,{children:"Roles & Permissions Matrix"})}),e.jsx(N,{children:e.jsx("div",{className:"space-y-6",children:H.map(s=>e.jsxs("div",{className:"border border-gray-200 dark:border-gray-700 rounded-lg p-4",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-3",children:[e.jsx(se,{className:"w-5 h-5 text-orange-500"}),e.jsxs("div",{children:[e.jsx("h3",{className:"font-semibold text-lg",children:s.label}),e.jsx("p",{className:"text-sm text-gray-500",children:s.description})]})]}),e.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-2",children:G.map(n=>e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(P,{checked:!0,disabled:!0}),e.jsx("span",{children:n.label})]},n.id))})]},s.value))})})]})}),e.jsx(Q,{value:"activity",className:"space-y-4",children:e.jsxs(v,{children:[e.jsx(y,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(b,{children:"Team Activity & Audit Trail"}),e.jsxs(o,{onClick:()=>Z.mutate(),disabled:Z.isPending,className:"flex items-center gap-2","data-testid":"button-export-activity",children:[e.jsx(je,{className:"w-4 h-4"}),"Export"]})]})}),e.jsx(N,{children:ce?e.jsxs("div",{className:"text-center py-8",children:[e.jsx("div",{className:"animate-spin w-8 h-8 border-4 border-orange-500 border-t-transparent rounded-full mx-auto"}),e.jsx("p",{className:"text-gray-500 mt-2",children:"Loading activity logs..."})]}):Y.length===0?e.jsx("p",{className:"text-gray-500 text-center py-8",children:"No activity logs available"}):e.jsx("div",{className:"space-y-3",children:Y.map(s=>e.jsxs("div",{className:"flex items-start gap-4 p-3 border border-gray-200 dark:border-gray-700 rounded-lg",children:[e.jsx(ae,{className:"w-5 h-5 text-orange-500 mt-0.5"}),e.jsxs("div",{className:"flex-1",children:[e.jsxs("p",{className:"text-sm",children:[e.jsx("span",{className:"font-medium",children:s.user?`${s.user.firstName} ${s.user.lastName}`:"Unknown User"})," ",s.details]}),e.jsx("p",{className:"text-xs text-gray-500 mt-1","data-testid":`text-activity-time-${s.id}`,children:z(new Date(s.createdAt),"MMM d, yyyy 'at' h:mm a")})]})]},s.id))})})]})})]}),e.jsx(R,{open:ne,onOpenChange:j,children:e.jsxs($,{children:[e.jsxs(F,{children:[e.jsx(I,{children:"Remove Team Member"}),e.jsxs(L,{children:["Are you sure you want to remove ",r==null?void 0:r.firstName," ",r==null?void 0:r.lastName," from your team? This action cannot be undone."]})]}),e.jsxs(U,{children:[e.jsx(o,{variant:"outline",onClick:()=>j(!1),children:"Cancel"}),e.jsx(o,{variant:"destructive",onClick:()=>r&&M.mutate(r.id),disabled:M.isPending,"data-testid":"button-confirm-delete",children:M.isPending?"Removing...":"Remove Member"})]})]})}),e.jsx(me,{})]})})}export{Ie 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.