PageSourceSearch

https://repsshield.com/assets/team-DrGdn2p5.js

js repsshield.com collected 2026-09-24 14:18:46 UTC 37,085 bytes, 11 lines download raw bytes

1import{y as be,a8 as U,db as $e,dc as re,dd as te,de as O,df as Xe,dg as ze,aJ as He,a as _e,l as je,n as ne,aC as P,aq as Be,dh as ie,ar as le,aK as se,ak as pe,ap as Ye,j as e,at as fe,au as V,av as q,aw as Q,ax as A,K as de,di as I,ay as ce,_ as We,$ as Je,a0 as Ze,a1 as Ge,a2 as oe,B as b,aI as C,Q as es,V as ss,R as as,b3 as ve,bH as ye,aZ as Ne,bI as rs,a_ as we,a$ as ke,b0 as Ce,b1 as Te,aL as Me,bf as ts,am as ns,af as is,bq as v,aN as ls,e as k,aY as ds,ao as Re,bT as Se,cL as Ee,bi as K,bU as De,bV as Ae,bW as Ie,bX as Pe,bY as Fe,bZ as Le,b_ as Ue,as as ae,aF as Ve,C as J,b as cs,c as os,aO as ms,d as Z,dj as me,dk as xs,aP as us,aQ as hs,aR as xe,aS as F,aT as gs,aU as L,E as bs,G as js,I as _,U as $,J as B}from"./index-Byg2HWAE.js";import{r as T,u as ps}from"./vendor-Qgthw7N1.js";import{t as R}from"./teamService-D0yxWeK5.js";import{C as X}from"./checkbox-Cqr9jids.js";import{P as fs}from"./schema-D2obYZ_w.js";import{U as qe}from"./user-plus-DIMyHSLg.js";import{c as vs,d as ys}from"./differenceInMonths-CWoVTq_U.js";import{K as Ns}from"./key-Dc7JBqE5.js";/**
2 * @license lucide-react v0.453.0 - ISC
3 *
4 * This source code is licensed under the ISC license.
5 * See the LICENSE file in the root directory of this source tree.
6 */const ws=be("Clock3",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16.5 12",key:"1aq6pp"}]]);/**
7 * @license lucide-react v0.453.0 - ISC
8 *
9 * This source code is licensed under the ISC license.
10 * See the LICENSE file in the root directory of this source tree.
11 */const Qe=be("Undo2",[["path",{d:"M9 14 4 9l5-5",key:"102s5s"}],["path",{d:"M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11",key:"f3b9sd"}]]);function ks(s){return a=>{const u=(s?Math[s]:Math.trunc)(a);return u===0?0:u}}function Cs(s,a){return+U(s)-+U(a)}function Ts(s,a,r){const u=Cs(s,a)/1e3;return ks(r==null?void 0:r.roundingMethod)(u)}function Ms(s,a,r){const u=Xe(),i=(r==null?void 0:r.locale)??u.locale??$e,l=2520,c=vs(s,a);if(isNaN(c))throw new RangeError("Invalid time value");const n=Object.assign({},r,{addSuffix:r==null?void 0:r.addSuffix,comparison:c});let t,d;c>0?(t=U(a),d=U(s)):(t=U(s),d=U(a));const m=Ts(d,t),y=(re(d)-re(t))/1e3,h=Math.round((m-y)/60);let o;if(h<2)return r!=null&&r.includeSeconds?m<5?i.formatDistance("lessThanXSeconds",5,n):m<10?i.formatDistance("lessThanXSeconds",10,n):m<20?i.formatDistance("lessThanXSeconds",20,n):m<40?i.formatDistance("halfAMinute",0,n):m<60?i.formatDistance("lessThanXMinutes",1,n):i.formatDistance("xMinutes",1,n):h===0?i.formatDistance("lessThanXMinutes",1,n):i.formatDistance("xMinutes",h,n);if(h<45)return i.formatDistance("xMinutes",h,n);if(h<90)return i.formatDistance("aboutXHours",1,n);if(h<te){const g=Math.round(h/60);return i.formatDistance("aboutXHours",g,n)}else{if(h<l)return i.formatDistance("xDays",1,n);if(h<O){const g=Math.round(h/te);return i.formatDistance("xDays",g,n)}else if(h<O*2)return o=Math.round(h/O),i.formatDistance("aboutXMonths",o,n)}if(o=ys(d,t),o<12){const g=Math.round(h/O);return i.formatDistance("xMonths",g,n)}else{const g=o%12,x=Math.trunc(o/12);return g<3?i.formatDistance("aboutXYears",x,n):g<9?i.formatDistance("overXYears",x,n):i.formatDistance("almostXYears",x+1,n)}}function G(s,a){return Ms(s,ze(s),a)}function Rs(){var o,g;const s=He(),{toast:a}=_e(),{user:r,isLoading:u,isAuthenticated:i}=je();T.useEffect(()=>{console.group("🔍 [useTeam] Authentication State"),console.groupEnd()},[u,r,i]);const l=ne({queryKey:["/api/team/members"],queryFn:()=>R.getMembers(),retry:!1});T.useEffect(()=>{l.error&&console.error("❌ [useTeam] Members query failed:",l.error)},[l.error]);const c=ne({queryKey:["/api/team/invitations"],queryFn:()=>R.getInvitations(),retry:!1});T.useEffect(()=>{c.error&&console.error("❌ [useTeam] Invitations query failed:",c.error)},[c.error]);const n=P({mutationFn:R.inviteMember,onSuccess:()=>{s.invalidateQueries({queryKey:["/api/team/invitations"]}),s.invalidateQueries({queryKey:["/api/team/members"]}),a({title:"Invitation Sent",description:"Team member invitation has been sent successfully."})},onError:x=>{a({title:"Failed to Send Invitation",description:x.message,variant:"destructive"})}}),t=P({mutationFn:({id:x,data:N})=>R.updateMemberPermissions(x,N),onMutate:async({id:x,data:N})=>{await s.cancelQueries({queryKey:["/api/team/members"]});const j=s.getQueryData(["/api/team/members"]);return j&&s.setQueryData(["/api/team/members"],{...j,members:j.members.map(w=>w.id===x?{...w,...N}:w)}),{previousData:j}},onSuccess:()=>{s.invalidateQueries({queryKey:["/api/team/members"]}),a({title:"Permissions Updated",description:"Team member permissions have been updated successfully."})},onError:(x,N,j)=>{j!=null&&j.previousData&&s.setQueryData(["/api/team/members"],j.previousData),a({title:"Update Failed",description:x.message,variant:"destructive"})}}),d=P({mutationFn:R.removeMember,onSuccess:async(x,N)=>{var p,S;await Promise.all([s.invalidateQueries({queryKey:["/api/team/members"]}),s.invalidateQueries({queryKey:["/api/team/invitations"]})]);const j=((S=(p=x==null?void 0:x.data)==null?void 0:p.deletedInvitations)==null?void 0:S.length)||0,w=j>0?`Team member permanently removed. ${j} pending invitation(s) also deleted.`:"The team member has been permanently removed from your workspace.";a({title:"Team Member Deleted",description:w})},onError:x=>{a({title:"Remove Failed",description:x.message,variant:"destructive"})}}),m=P({mutationFn:R.cancelInvitation,onSuccess:()=>{s.invalidateQueries({queryKey:["/api/team/invitations"]}),a({title:"Invitation Cancelled",description:"The invitation has been cancelled successfully."})},onError:x=>{a({title:"Cancel Failed",description:x.message,variant:"destructive"})}}),y=P({mutationFn:R.removeInvitation,onSuccess:()=>{s.invalidateQueries({queryKey:["/api/team/invitations"]}),a({title:"Invitation Removed",description:"The invitation has been permanently removed."})},onError:x=>{a({title:"Remove Failed",description:x.message,variant:"destructive"})}}),h=P({mutationFn:R.restoreMember,onSuccess:()=>{s.invalidateQueries({queryKey:["/api/team/members"]}),s.invalidateQueries({queryKey:["/api/team/invitations"]}),a({title:"Team Member Restored",description:"The team member has been successfully restored."})},onError:x=>{a({title:"Restore Failed",description:x.message,variant:"destructive"})}});return{members:((o=l.data)==null?void 0:o.members)||[],membersLoading:l.isLoading,membersError:l.error,membersSuccess:(g=l.data)==null?void 0:g.success,invitations:c.data||[],inv
11itationsLoading:c.isLoading,inviteMember:n.mutate,isInviting:n.isPending,updatePermissions:t.mutate,isUpdatingPermissions:t.isPending,removeMember:d.mutate,isRemovingMember:d.isPending,cancelInvitation:m.mutate,isCancellingInvitation:m.isPending,removeInvitation:y.mutate,isRemovingInvitation:y.isPending,restoreMember:h.mutate,isRestoringMember:h.isPending}}const Ss=/^[a-zA-Z0-9\s\-\/&()]+$/,Es=Be({email:le().email("Invalid email address"),teamMemberRole:le().min(1,"Role is required").max(100,"Role must be 100 characters or less").regex(Ss,"Role contains invalid characters"),canCreateTimeEntries:ie().default(!0),canViewAllTimeEntries:ie().default(!1)});function ee({onInvite:s,isInviting:a,triggerLabel:r="Invite Team Member",triggerClassName:u}){const[i,l]=T.useState(!1),[c,n]=T.useState(!1),t=se(),d=pe({resolver:Ye(Es),defaultValues:{teamMemberRole:"",canCreateTimeEntries:!0,canViewAllTimeEntries:!1}}),m=o=>{l(o),o||(n(!1),d.reset())},y=e.jsxs(b,{className:u,onClick:()=>l(!0),children:[e.jsx(qe,{className:"w-4 h-4 mr-2"}),r]}),h=e.jsx(fe,{...d,children:e.jsxs("form",{onSubmit:d.handleSubmit(o=>{s(o),m(!1)}),className:C("space-y-6",t&&"px-4 pb-4 pt-2"),children:[e.jsx(V,{control:d.control,name:"email",render:({field:o})=>e.jsxs(q,{children:[e.jsx(Q,{children:"Email Address *"}),e.jsx(A,{children:e.jsx(de,{className:t?"h-12 rounded-xl text-base":void 0,placeholder:"[email protected]",...o})}),e.jsx(I,{children:"The team member will receive an invitation email at this address"}),e.jsx(ce,{})]})}),e.jsx(V,{control:d.control,name:"teamMemberRole",render:({field:o})=>e.jsxs(q,{children:[e.jsx(Q,{children:"Team Member Role *"}),c?e.jsxs(e.Fragment,{children:[e.jsx(A,{children:e.jsxs("div",{className:"flex gap-2",children:[e.jsx(de,{className:t?"h-12 rounded-xl text-base":void 0,placeholder:"e.g., Landscaper, Property Ins
11pector",...o,autoFocus:!0}),e.jsx(b,{type:"button",variant:"outline",className:t?"h-12 rounded-xl":void 0,onClick:()=>{n(!1),o.onChange("")},children:"Cancel"})]})}),e.jsx(I,{children:"Max 100 characters. Letters, numbers, spaces, hyphens, slashes, and parentheses only."})]}):e.jsxs(e.Fragment,{children:[e.jsxs(We,{onValueChange:g=>{g==="custom"?(n(!0),o.onChange("")):o.onChange(g)},value:o.value,children:[e.jsx(A,{children:e.jsx(Je,{className:t?"h-12 rounded-xl text-base":void 0,children:e.jsx(Ze,{placeholder:"Select a role"})})}),e.jsxs(Ge,{className:t?"z-[120]":void 0,children:[fs.map(g=>e.jsx(oe,{value:g,children:g},g)),e.jsx(oe,{value:"custom",className:"text-blue-600 font-medium",children:"Create Custom Role"})]})]}),e.jsx(I,{children:"Choose a common role or create a custom one"})]}),e.jsx(ce,{})]})}),e.jsxs("div",{className:C("space-y-4 border bg-gray-50",t?"rounded-2xl p-4":"rounded-lg p-4"),children:[e.jsx("div",{className:"font-medium text-sm",children:"Permissions"}),e.jsx(V,{control:d.control,name:"canCreateTimeEntries",render:({field:o})=>e.jsxs(q,{className:"flex flex-row items-start space-x-3 space-y-0",children:[e.jsx(A,{children:e.jsx(X,{checked:o.value,onCheckedChange:o.onChange})}),e.jsxs("div",{className:"space-y-1 leading-none",children:[e.jsx(Q,{children:"Can Create Time Entries"}),e.jsx(I,{children:"Allow this team member to record their own time entries"})]})]})}),e.jsx(V,{control:d.control,name:"canViewAllTimeEntries",render:({field:o})=>e.jsxs(q,{className:"flex flex-row items-start space-x-3 space-y-0",children:[e.jsx(A,{children:e.jsx(X,{checked:o.value,onCheckedChange:o.onChange})}),e.jsxs("div",{className:"space-y-1 leading-none",children:[e.jsx(Q,{children:"Can View All Time Entries"}),e.jsx(I,{children:"Allow viewing all workspace time entries (not just their own)"})]})]})})]}),e.jsxs(es,{className:t?"rounded-2xl":void 0,children:[e.jsx(ss,{className:"h-4 w-4"}),e.jsx(as,{children:"The invitation will expire in 7 days. Team members will receive an email with instructions to accept the invitation."})]}),t?e.jsxs("div",{className:"flex gap-2 pt-1",children:[e.jsx(b,{type:"button",variant:"outline",className:"h-11 flex-1 rounded-xl",onClick:()=>m(!1),children:"Cancel"}),e.jsx(b,{type:"submit",disabled:a,className:"h-11 flex-1 rounded-xl bg-emerald-600 hover:bg-emerald-700",children:a?"Sending...":"Send Invitation"})]}):e.jsxs(ve,{children:[e.jsx(b,{type:"button",variant:"outline",onClick:()=>m(!1),children:"Cancel"}),e.jsx(b,{type:"submit",disabled:a,children:a?"Sending...":"Send Invitation"})]})]})});return t?e.jsxs(e.Fragment,{children:[y,e.jsxs(ye,{open:i,onOpenChange:m,title:"Invite Team Member",className:"bg-gray-50 dark:bg-gray-950",children:[e.jsx("p",{className:"px-4 pt-3 text-sm text-muted-foreground",children:"Send an invitation to add a new member to your REPSShield workspace."}),h]})]}):e.jsxs(Ne,{open:i,onOpenChange:m,children:[e.jsx(rs,{asChild:!0,children:y}),e.jsxs(we,{className:"max-w-2xl",children:[e.jsxs(ke,{children:[e.jsx(Ce,{children:"Invite Team Member"}),e.jsx(Te,{children:"Send an invitation to add a new member to your REPSShield workspace"})]}),h]})]})}function Ke({open:s,onOpenChange:a,member:r,onUpdate:u,isUpdating:i}){const l=se(),c=pe({defaultValues:{canCreateTimeEntries:r.canCreateTimeEntries,canViewAllTimeEntries:r.canViewAllTimeEntries}});T.useEffect(()=>{c.reset({canCreateTimeEntries:r.canCreateTimeEntries,canViewAllTimeEntries:r.canViewAllTimeEntries})},[r,c]);const n=m=>{u(r.id,m),a(!1)},t=()=>r.firstName&&r.lastName?`${r.firstName} ${r.lastName}`:r.email,d=e.jsx(fe,{...c,children:e.jsxs("form",{onSubmit:c.handleSubmit(n),className:C("space-y-6",l&&"px-4 pb-4 pt-2"),children:[e.jsxs("div",{className:"space-y-4",children:[e.jsx(V,{control:c.control,name:"canCreateTimeEntries",render:({field:m})=>e.jsxs(q,{className:C("flex flex-row items-start space-x-3 space-y-0 border p-4",l?"rounded-2xl bg-white dark:bg-gray-900":"rounded-md"),children:[e.jsx(A,{children:e.jsx(X,{checked:m.value,onCheckedChange:m.onChange})}),e.jsxs("div",{className:"space-y-1 leading-none",children:[e.jsx(Q,{children:"Can Create Time Entries"}),e.jsx(I,{children:"Allow this team member to record their own time entries"})]})]})}),e.jsx(V,{control:c.control,name:"canViewAllTimeEntries",render:({field:m})=>e.jsxs(q,{className:C("flex flex-row items-start space-x-3 space-y-0 border p-4",l?"rounded-2xl bg-white dark:bg-gray-900":"rounded-md"),children:[e.jsx(A,{children:e.jsx(X,{checked:m.value,onCheckedChange:m.onChange})}),e.jsxs("div",{className:"space-y-1 leading-none",children:[e.jsx(Q,{children:"Can View All Time Entries"}),e.jsx(I,{children:"Allow viewing all workspace time entries (not just their own)"})]})]})})]}),l?e.jsxs("div",{className:"flex gap-2 pt-1",children:[e.jsx(b,{type:"button",variant:"outline",className:"h-11 flex-1 rounded-xl",onClick:()=>a(!1),children:"Cancel"}),e.jsx(b,{type:"submit",disabled:i,className:"h-11 flex-1 rounded-xl bg-emerald-600 hover:bg-emerald-700",children:i?"Saving...":"Save Changes"})]}):e.jsxs(ve,{children:[e.jsx(b,{type:"button",variant:"outline",onClick:()=>a(!1),children:"Cancel"}),e.jsx(b,{type:"submit",disabled:i,children:i?"Saving...":"Save Changes"})]})]})});return l?e.jsxs(ye,{open:s,onOpenChange:a,title:"Edit Permissions",className:"bg-gray-50 dark:bg-gray-950",children:[e.jsxs("p",{className:"px-4 pt-3 text-sm text-muted-foreground",children:["Update permissions for ",t(),"."]}),d]}):e.jsx(Ne,{open:s,onOpenChange:a,children:e.jsxs(we,{children:[e.jsxs(ke,{children:[e.jsx(Ce,{children:"Edit Permissions"}),e.jsxs(Te,{children:["Update permissions for ",t()]})]}),d]})})}function ue(s){return`${s.firstName||""} ${s.lastName||""}`.trim()||s.email}function Ds(s){var a,r;return(s.firstName||s.lastName)&&`${((a=s.firstName)==null?void 0:a[0])||""}${((r=s.lastName)==null?void 0:r[0])||""}`.toUpperCase()||s.email[0].toUpperCase()}function Y({label:s,value:a,tone:r}){const u={green:"bg-emerald-50 text-emerald-700 dark:bg-emerald-950/40 dark:text-emerald-300",blue:"bg-blue-50 text-blue-700 dark:bg-blue-950/40 dark:text-blue-300",red:"bg-red-50 text-red-700 dark:bg-red-950/40 dark:text-red-300"};return e.jsxs("div",{className:"rounded-2xl border border-gray-100 bg-white p-4 shadow-sm dark:border-gray-800 dark:bg-gray-900",children:[e.jsx("div",{className:C("mb-3 inline-flex rounded-full px-2.5 py-1 text-xs font-bold",u[r]),children:s}),e.jsx("p",{className:"text-3xl font-black tracking-tight text-gray-950 dark:text-white",children:a})]})}function W({icon:s,title:a,description:r}){return e.jsxs("div",{className:"rounded-3xl border border-dashed border-gray-200 bg-white px-6 py-12 text-center shadow-sm dark:border-gray-800 dark:bg-gray-900",children:[e.jsx("div",{className:"mx-auto mb-4 flex h-14 w-14 items-center justify-center rounded-2xl bg-gray-100 text-gray-400 dark:bg-gray-800 dark:text-gray-500",children:e.jsx(s,{className:"h-7 w-7"})}),e.jsx("h3",{className:"text-base font-bold text-gray-950 dark:text-white",children:a}),e.jsx("p",{className:"mt-2 text-sm leading-6 text-gray-500 dark:text-gray-400",children:r})]})}function As({onBack:s}){return e.jsx("div",{className:"min-h-screen bg-gray-50 pb-24 pt-3 dark:bg-background",children:e.jsxs("div",{className:"mx-auto flex w-full container-mobile flex-col gap-4",children:[e.jsx(Me,{title:"Team",subtitle:"Workspace members and access",onBack:s}),e.jsx("section",{className:"rounded-3xl border border-gray-100 bg-white p-5 shadow-sm dark:border-gray-800 dark:bg-gray-900",children:e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"flex-1",children:[e.jsx(v,{className:"h-3 w-24 rounded-full"}),e.jsx(v,{className:"mt-3 h-7 w-44 rounded-xl"}),e.jsx(v,{className:"mt-3 h-4 w-full rounded-lg"}),e.jsx(v,{className:"mt-2 h-4 w-3/4 rounded-lg"})]}),e.jsx(v,{className:"h-12 w-12 rounded-2xl"})]})}),e.jsx("section",{className:"grid grid-cols-3 gap-2",children:[1,2,3].map(a=>e.jsxs("div",{className:"rounded-2xl border border-gray-100 bg-white p-4 shadow-sm dark:border-gray-800 dark:bg-gray-900",children:[e.jsx(v,{className:"h-6 w-14 roun
11ded-full"}),e.jsx(v,{className:"mt-4 h-8 w-10 rounded-xl"})]},a))}),e.jsx("div",{className:"rounded-2xl bg-gray-200/70 p-1 dark:bg-gray-800/80",children:e.jsx("div",{className:"grid grid-cols-3 gap-1",children:[1,2,3].map(a=>e.jsx(v,{className:"h-10 rounded-xl"},a))})}),e.jsx("div",{className:"space-y-3",children:[1,2,3].map(a=>e.jsxs("div",{className:"rounded-3xl border border-gray-100 bg-white p-4 shadow-sm dark:border-gray-800 dark:bg-gray-900",children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(v,{className:"h-12 w-12 rounded-2xl"}),e.jsxs("div",{className:"flex-1",children:[e.jsx(v,{className:"h-5 w-36 rounded-lg"}),e.jsx(v,{className:"mt-2 h-3 w-52 rounded-lg"}),e.jsxs("div",{className:"mt-4 flex gap-2",children:[e.jsx(v,{className:"h-6 w-20 rounded-full"}),e.jsx(v,{className:"h-6 w-16 rounded-full"})]})]})]}),e.jsxs("div",{className:"mt-4 grid grid-cols-2 gap-2",children:[e.jsx(v,{className:"h-11 rounded-2xl"}),e.jsx(v,{className:"h-11 rounded-2xl"})]})]},a))})]})})}function he({member:s,suspended:a=!1,onRemove:r,isRemoving:u,onUpdatePermissions:i,isUpdatingPermissions:l,onRestore:c,isRestoring:n}){const[t,d]=T.useState(!1);return e.jsxs("article",{className:C("rounded-3xl border bg-white p-4 shadow-sm dark:bg-gray-900",a?"border-red-100 dark:border-red-900/70":"border-gray-100 dark:border-gray-800"),children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx("div",{className:C("flex h-12 w-12 shrink-0 items-center justify-center rounded-2xl text-sm font-black",a?"bg-red-50 text-red-700 dark:bg-red-950/40 dark:text-red-300":"bg-emerald-50 text-emerald-700 dark:bg-emerald-950/40 dark:text-emerald-300"),children:Ds(s)}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("h3",{className:"truncate text-base font-bold text-gray-950 dark:text-white",children:ue(s)}),e.jsx("p",{className:"truncate text-xs font-medium text-gray-500 dark:text-gray-400",children:s.email})]}),a&&e.jsx(k,{className:"shrink-0 bg-red-100 text-red-700 hover:bg-red-100 dark:bg-red-950/50 dark:text-red-300",children:"Suspended"})]}),e.jsxs("div",{className:"mt-3 flex flex-wrap gap-2",children:[e.jsx(k,{variant:"secondary",className:"rounded-full bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-200",children:s.teamMemberRole||"Team Member"}),s.canCreateTimeEntries&&e.jsxs(k,{variant:"outline",className:"rounded-full border-emerald-200 bg-emerald-50 text-emerald-700 dark:border-emerald-900 dark:bg-emerald-950/30 dark:text-emerald-300",children:[e.jsx(ds,{className:"mr-1 h-3 w-3"})," Create"]}),s.canViewAllTimeEntries&&e.jsxs(k,{variant:"outline",className:"rounded-full border-blue-200 bg-blue-50 text-blue-700 dark:border-blue-900 dark:bg-blue-950/30 dark:text-blue-300",children:[e.jsx(Re,{className:"mr-1 h-3 w-3"})," View All"]})]}),e.jsxs("p",{className:"mt-3 text-xs text-gray-500 dark:text-gray-400",children:["Joined ",G(new Date(s.createdAt),{addSuffix:!0})]})]})]}),e.jsx("div",{className:"mt-4 grid grid-cols-2 gap-2",children:a?e.jsxs(b,{type:"button",className:"col-span-2 h-11 rounded-2xl bg-emerald-600 hover:bg-emerald-700",disabled:n,onClick:()=>c(s.id),children:[e.jsx(Qe,{className:"mr-2 h-4 w-4"}),n?"Restoring...":"Restore Member"]}):e.jsxs(e.Fragment,{children:[e.jsx(b,{type:"button",variant:"outline",className:"h-11 rounded-2xl",onClick:()=>d(!0),children:"Permissions"}),e.jsxs(Se,{children:[e.jsx(Ee,{asChild:!0,children:e.jsxs(b,{type:"button",variant:"outline",className:"h-11 rounded-2xl border-red-200 text-red-600 hover:bg-red-50 hover:text-red-700",disabled:u,children:[e.jsx(K,{className:"mr-2 h-4 w-4"})," Remove"]})}),e.jsxs(De,{children:[e.jsxs(Ae,{children:[e.jsx(Ie,{children:"Remove Team Member?"}),e.jsxs(Pe,{children:["Remove ",ue(s)," from your workspace. This action cannot be undone."]})]}),e.jsxs(Fe,{children:[e.jsx(Le,{children:"Cancel"}),e.jsx(Ue,{className:"bg-red-600 hover:bg-red-700",onClick:()=>r(s.id),children:"Remove"})]})]})]})]})}),e.jsx(Ke,{open:t,onOpenChange:d,member:s,onUpdate:i,isUpdating:l})]})}function Is({invitation:s,onCancel:a,onRemove:r,onResend:u,isCancelling:i,isRemoving:l,isResending:c}){const n=new Date(s.expiresAt)<new Date;return e.jsxs("article",{className:"rounded-3xl border border-gray-100 bg-white p-4 shadow-sm dark:border-gray-800 dark:bg-gray-900",children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx("div",{className:"flex h-12 w-12 shrink-0 items-center justify-center rounded-2xl bg-blue-50 text-blue-700 dark:bg-blue-950/40 dark:text-blue-300",children:e.jsx(ae,{className:"h-5 w-5"})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("h3",{className:"truncate text-base font-bold text-gray-950 dark:text-white",children:s.email}),e.jsx("p",{className:"mt-1 text-xs font-medium text-gray-500 dark:text-gray-400",children:s.teamMemberRole})]}),e.jsx(k,{className:C("shrink-0 rounded-full",n?"bg-red-100 text-red-700 hover:bg-red-100 dark:bg-red-950/40 dark:text-red-300":"bg-amber-100 text-amber-700 hover:bg-amber-100 dar
11k:bg-amber-950/40 dark:text-amber-300"),children:n?"Expired":s.status})]}),e.jsxs("div",{className:"mt-3 grid grid-cols-2 gap-2 text-xs text-gray-500 dark:text-gray-400",children:[e.jsxs("div",{className:"rounded-2xl bg-gray-50 p-3 dark:bg-gray-800",children:[e.jsx("p",{className:"font-semibold text-gray-900 dark:text-white",children:"Sent"}),e.jsx("p",{className:"mt-1",children:G(new Date(s.createdAt),{addSuffix:!0})})]}),e.jsxs("div",{className:"rounded-2xl bg-gray-50 p-3 dark:bg-gray-800",children:[e.jsx("p",{className:"font-semibold text-gray-900 dark:text-white",children:"Expires"}),e.jsx("p",{className:"mt-1",children:G(new Date(s.expiresAt),{addSuffix:!0})})]})]})]})]}),e.jsxs("div",{className:"mt-4 flex gap-2",children:[n?e.jsxs(b,{type:"button",variant:"outline",className:"h-11 flex-1 rounded-2xl text-blue-600",disabled:c,onClick:()=>u(s),children:[e.jsx(Ve,{className:"mr-2 h-4 w-4"})," Resend"]}):s.status==="pending"?e.jsx(b,{type:"button",variant:"outline",className:"h-11 flex-1 rounded-2xl text-amber-700",disabled:i||l,onClick:()=>a(s.id),children:"Cancel"}):null,e.jsxs(b,{type:"button",variant:"outline",className:"h-11 flex-1 rounded-2xl border-red-200 text-red-600 hover:bg-red-50 hover:text-red-700",disabled:l||i,onClick:()=>r(s.id),children:[e.jsx(K,{className:"mr-2 h-4 w-4"})," Remove"]})]})]})}function Ps({members:s,membersLoading:a,invitations:r,invitationsLoading:u,isAccountOwner:i,inviteMember:l,isInviting:c,updatePermissions:n,isUpdatingPermissions:t,removeMember:d,isRemovingMember:m,cancelInvitation:y,isCancellingInvitation:h,removeInvitation:o,isRemovingInvitation:g,restoreMember:x,isRestoringMember:N,onResend:j}){const[,w]=ps(),[p,S]=T.useState("members"),E=s.filter(f=>f.status!=="suspended"),D=s.filter(f=>f.status==="suspended"),M=()=>{w("/dashboard"),ls("/dashboard")},Oe=[{value:"members",label:"Active",count:E.length},{value:"invitations",label:"Invites",count:r.length},{value:"suspended",label:"Paused",count:D.length}];return a?e.jsx(As,{onBack:M}):e.jsx("div",{className:"min-h-screen bg-gray-50 pb-24 pt-3 dark:bg-background",children:e.jsxs("div",{className:"mx-auto flex w-full container-mobile flex-col gap-4",children:[e.jsx(Me,{title:"Team",subtitle:"Workspace members and access",onBack:M,rightAction:i?e.jsx(ee,{onInvite:l,isInviting:c,triggerLabel:"Invite",triggerClassName:"h-10 rounded-2xl bg-emerald-600 px-4 hover:bg-emerald-700"}):null}),e.jsx("section",{className:"rounded-3xl bg-gradient-to-br from-emerald-600 to-green-700 p-5 text-white shadow-lg shadow-emerald-900/10",children:e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-xs font-bold uppercase tracking-[0.2em] text-emerald-100",children:"Workspace"}),e.jsx("h2",{className:"mt-2 text-2xl text-white tracking-tight",children:"Team Access"}),e.jsx("p",{className:"mt-2 max-w-[18rem] text-sm leading-6 text-emerald-50",children:"Invite helpers, assign permissions, and keep REPS time entries tied to the right person."})]}),e.jsx("div",{className:"rounded-2xl bg-white/15 p-3 backdrop-blur",children:e.jsx(ts,{className:"h-6 w-6"})})]})}),e.jsxs("section",{className:"grid grid-cols-3 gap-2",children:[e.jsx(Y,{label:"Active",value:E.length,tone:"green"}),e.jsx(Y,{label:"Invites",value:r.length,tone:"blue"}),e.jsx(Y,{label:"Paused",value:D.length,tone:"red"})]}),e.jsx("div",{className:"rounded-2xl bg-gray-200/70 p-1 dark:bg-gray-800/80",children:e.jsx("div",{className:"grid grid-cols-3 gap-1",children:Oe.map(f=>e.jsxs("button",{type:"button",onClick:()=>S(f.value),className:C("flex h-10 items-center justify-center gap-1.5 rounded-xl text-xs font-bold transition active:scale-[0.98]",p===f.value?"bg-white text-gray-950 shadow-sm dark:bg-gray-950 dark:text-white":"text-gray-500 dark:text-gray-400"),children:[f.label,e.jsx("span",{className:"rounded-full bg-gray-100 px-1.5 py-0.5 text-[10px] dark:bg-gray-800",children:f.count})]},f.value))})}),p==="members"?e.jsx("div",{className:"space-y-3",children:E.length>0?E.map(f=>e.jsx(he,{member:f,onRemove:d,isRemoving:m,onUpdatePermissions:(z,H)=>n({id:z,data:H}),isUpdatingPermissions:t,onRestore:x,isRestoring:N},f.id)):e.jsx(W,{icon:qe,title:"No team members yet",description:"Invite your first teammate to start sharing workspace access."})}):p==="invitations"?e.jsx("div",{className:"space-y-3",children:u?e.jsx("div",{className:"rounded-3xl border border-gray-100 bg-white p-6 text-center text-sm text-gray-500 dark:border-gray-800 dark:bg-gray-900",children:"Loading invitations..."}):r.length>0?r.map(f=>e.jsx(Is,{invitation:f,onCancel:y,onRemove:o,onResend:j,isCancelling:h,isRemoving:g,isResending:c},f.id)):e.jsx(W,{icon:ws,title:"No pending invitations",description:"Invitations you send will appear here until accepted or expired."})}):e.jsx("div",{className:"space-y-3",children:D.length>0?D.map(f=>e.jsx(he,{member:f,suspended:!0,onRemove:d,isRemoving:m,onUpdatePermissions:(z,H)=>n({id:z,data:H}),isUpdatingPermissions:t,onRestore:x,isRestoring:N},f.id)):e.jsx(W,{icon:ns,title:"No suspended users",description:"Paused or suspended members will be listed here for restoration."})}),e.jsxs("button",{type:"button",onClick:M,className:"mb-2 flex items-center justify-between rounded-2xl border border-gray-100 bg-white p-4 text-left shadow-sm active:scale-[0.99] dark:border-gray-800 dark:bg-gray-900",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-bold text-gray-950 dark:text-white",children:"Back to dashboard"}),e.jsx("p",{className:"text-xs text-gray-500 dark:text-gray-400",children:"Return to your REPS overview"})]}),e.jsx(is,{className:"h-5 w-5 text-gray-400"})]})]})})}function ge({member:s,onRemove:a,isRemoving:r,onUpdatePermissions:u,isUpdatingPermissions:i,onRestore:l,isRestoring:c}){const[n,t]=T.useState(!1),d=()=>s.firstName&&s.lastName?`${s.firstName} ${s.lastName}`:s.email,m=()=>s.firstName&&s.lastName?`${s.firstName[0]}${s.lastName[0]}`.toUpperCase():s.email[0].toUpperCase();return e.jsxs(J,{children:[e.jsx(cs,{className:"pb-3",children:e.jsxs("div",{className:"flex items-center space-x-3",children:[e.jsx("div",{className:"w-10 h-10 bg-blue-100 rounded-full flex items-center justify-center",children:e.jsx("span",{className:"text-sm font-semibold text-blue-700",children:m()})}),e.jsxs("div",{children:[e.jsx(os,{className:"text-base",children:d()}),e.jsx(ms,{className:"text-sm",children:s.email})]})]})}),e.jsx(Z,{className:"pt-0",children:e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between text-sm",children:[e.jsx("span",{className:"text-gray-600",children:"Role:"}),e.jsx(k,{variant:"secondary",className:"font-medium",children:s.teamMemberRole||"Team Member"})]}),e.jsxs("div",{className:"flex items-center justify-between text-sm",children:[e.jsx("span",{className:"text-gray-600",children:"Joined:"}),e.jsx("span",{className:"font-medium",children:new Date(s.createdAt).toLocaleDateString()})]}),e.jsxs("div",{className:"flex flex-wrap gap-2 mt-2",children:[s.canCreateTimeEntries&&e.jsxs(k,{variant:"outline",className:"text-xs",children:[e.jsx(me,{className:"w-3 h-3 mr-1"}),"Create Entries"]}),s.canViewAllTimeEntries&&e.jsxs(k,{variant:"outline",className:"text-xs",children:[e.jsx(Re,{className:"w-3 h-3 mr-1"}),"View All"]})]})]})}),e.jsx(xs,{className:"flex gap-2 pt-4 border-t",children:l?e.jsxs(b,{variant:"default",size:"sm",className:"w-full bg-green-600 hover:bg-green-700",onClick:()=>
11l(s.id),disabled:c,children:[e.jsx(Qe,{className:"w-4 h-4 mr-2"}),c?"Restoring...":"Restore Member"]}):e.jsxs(e.Fragment,{children:[e.jsxs(b,{variant:"outline",size:"sm",className:"flex-1",onClick:()=>t(!0),children:[e.jsx(me,{className:"w-4 h-4 mr-2"}),"Edit Permissions"]}),e.jsxs(Se,{children:[e.jsx(Ee,{asChild:!0,children:e.jsxs(b,{variant:"outline",size:"sm",className:"flex-1 text-red-600 hover:bg-red-50 hover:text-red-600",disabled:r,children:[e.jsx(K,{className:"w-4 h-4 mr-2"}),r?"Removing...":"Remove"]})}),e.jsxs(De,{children:[e.jsxs(Ae,{children:[e.jsx(Ie,{children:"Remove Team Member?"}),e.jsxs(Pe,{children:["Are you sure you want to remove"," ",d()," from your team? This action cannot be undone."]})]}),e.jsxs(Fe,{children:[e.jsx(Le,{children:"Cancel"}),e.jsx(Ue,{onClick:()=>a(s.id),className:"bg-red-600 hover:bg-red-700",children:"Remove"})]})]})]})]})}),e.jsx(Ke,{open:n,onOpenChange:t,member:s,onUpdate:u,isUpdating:i})]})}function Fs({invitations:s,isLoading:a,onCancel:r,onRemove:u,onResend:i,isCancelling:l,isRemoving:c,isResending:n}){return a?e.jsx("div",{className:"text-center py-4",children:"Loading invitations..."}):s.length===0?e.jsxs("div",{className:"text-center py-8 text-gray-500",children:[e.jsx(ae,{className:"w-12 h-12 mx-auto mb-4 text-gray-300"}),e.jsx("p",{children:"No pending invitations"})]}):e.jsxs(us,{children:[e.jsx(hs,{children:e.jsxs(xe,{children:[e.jsx(F,{children:"Email"}),e.jsx(F,{children:"Role"}),e.jsx(F,{children:"Status"}),e.jsx(F,{children:"Expires"}),e.jsx(F,{children:"Sent"}),e.jsx(F,{className:"text-right",children:"Actions"})]})}),e.jsx(gs,{children:s.map(t=>{const d=new Date(t.expiresAt)<new Date;return e.jsxs(xe,{children:[e.jsx(L,{className:"font-medium",children:t.email}),e.jsx(L,{children:e.jsx(k,{variant:"outline",children:t.teamMemberRole})}),e.jsx(L,{children:e.jsx(k,{variant:t.status==="pending"&&!d?"secondary":"destructive",className:t.status==="pending"&&!d?"bg-yellow-100 text-yellow-800":t.status==="accepted"?"bg-green-100 text-green-800":"bg-red-100 text-red-800",children:d?"Expired":t.status})}),e.jsx(L,{children:new Date(t.expiresAt).toLocaleDateString()}),e.jsx(L,{children:new Date(t.createdAt).toLocaleDateString()}),e.jsx(L,{className:"text-right",children:e.jsxs("div",{className:"flex gap-2 justify-end",children:[d?e.jsxs(b,{variant:"outline",size:"sm",onClick:()=>i(t),disabled:n,className:"text-blue-600 hover:text-blue-700",children:[e.jsx(Ve,{className:"w-3 h-3 mr-1"}),"Resend"]}):t.status==="pending"?e.jsxs(b,{variant:"outline",size:"sm",onClick:()=>{confirm("Cancel this invitation? The email will remain in the list with 'cancelled' status.")&&r(t.id)},disabled:l||c,className:"text-yellow-600 hover:text-yellow-700",children:[e.jsx(K,{className:"w-3 h-3 mr-1"}),"Cancel"]}):null,e.jsxs(b,{variant:"outline",size:"sm",onClick:()=>{confirm("Permanently remove this invitation? This cannot be undone.")&&u(t.id)},disabled:c||l,className:"text-red-600 hover:text-red-700",children:[e.jsx(K,{className:"w-3 h-3 mr-1"}),"Remove"]})]})})]},t.id)})})]})}function Ls({members:s,invitations:a,invitationsLoading:r,isAccountOwner:u,inviteMember:i,isInviting:l,updatePermissions:c,isUpdatingPermissions:n,removeMember:t,isRemovingMember:d,cancelInvitation:m,isCancellingInvitation:y,removeInvitation:h,isRemovingInvitation:o,restoreMember:g,isRestoringMember:x,onResend:N}){const j=s.filter(p=>p.status!=="suspended"),w=s.filter(p=>p.status==="suspended");return e.jsxs("div",{className:"max-w-7xl mx-auto p-6 space-y-8",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-3xl font-bold text-gray-900",children:"Team Management"}),e.jsx("p",{className:"text-gray-600 mt-1",children:"Manage your team members, roles, and permissions for your REPSShield workspace"})]}),u&&e.jsx(ee,{onInvite:i,isInviting:l})]}),e.jsxs(bs,{defaultValue:"members",className:"space-y-6",children:[e.jsxs(js,{children:[e.jsxs(_,{value:"members",children:[e.jsx($,{className:"w-4 h-4 mr-2"}),"Team Members"]}),e.jsxs(_,{value:"suspended",children:[e.jsx($,{className:"w-4 h-4 mr-2 text-red-500"}
11),"Suspended Users"]}),e.jsxs(_,{value:"invitations",children:[e.jsx(ae,{className:"w-4 h-4 mr-2"}),"Pending Invitations"]})]}),e.jsx(B,{value:"members",className:"space-y-6",children:j.length===0?e.jsx(J,{className:"text-center py-12",children:e.jsxs(Z,{children:[e.jsx($,{className:"w-16 h-16 mx-auto mb-4 text-gray-300"}),e.jsx("h3",{className:"text-lg font-medium text-gray-900 mb-2",children:"No team members yet"}),e.jsx("p",{className:"text-gray-600 mb-4",children:"Start building your team by inviting members to collaborate on your properties and time tracking"}),u&&e.jsx(ee,{onInvite:i,isInviting:l})]})}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"bg-blue-50 border border-blue-200 rounded-lg p-4",children:e.jsxs("div",{className:"flex items-start space-x-3",children:[e.jsx(Ns,{className:"w-5 h-5 text-blue-600 mt-0.5"}),e.jsxs("div",{children:[e.jsx("h4",{className:"font-medium text-blue-900",children:"Multi-Tenant Workspace"}),e.jsx("p",{className:"text-sm text-blue-700 mt-1",children:"Team members share your workspace for free. They can record time entries under their own identity while you maintain full visibility and control over all workspace data."})]})]})}),e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6",children:j.map(p=>e.jsx(ge,{member:p,onRemove:t,isRemoving:d,onUpdatePermissions:(S,E)=>c({id:S,data:E}),isUpdatingPermissions:n},p.id))})]})}),e.jsx(B,{value:"suspended",className:"space-y-6",children:w.length===0?e.jsx(J,{className:"text-center py-12",children:e.jsxs(Z,{children:[e.jsx($,{className:"w-16 h-16 mx-auto mb-4 text-gray-300"}),e.jsx("h3",{className:"text-lg font-medium text-gray-900 mb-2",children:"No suspended users"}),e.jsx("p",{className:"text-gray-600 mb-4",children:"Suspended users will appear here. They will not be able to login to your workspace."})]})}):e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6",children:w.map(p=>e.jsxs("div",{className:"relative grayscale opacity-75 hover:grayscale-0 hover:opacity-100 transition-all duration-200",children:[e.jsx(ge,{member:p,onRemove:()=>{},isRemoving:!1,onUpdatePermissions:async()=>{},isUpdatingPermissions:!1,onRestore:g,isRestoring:x}),e.jsx("div",{className:"absolute top-2 right-2 bg-red-100 text-red-800 text-xs px-2 py-1 rounded font-bold border border-red-200 shadow-sm",children:"SUSPENDED"})]},p.id))})}),e.jsx(B,{value:"invitations",children:e.jsx(Fs,{invitations:a,isLoading:r,onCancel:m,isCancelling:y,onRemove:h,isRemoving:o,onResend:N,isResending:l})})]})]})}function zs(){const{user:s,isLoading:a,isAuthenticated:r}=je(),u=se(),{members:i,membersLoading:l,invitations:c,invitationsLoading:n,inviteMember:t,isInviting:d,updatePermissions:m,isUpdatingPermissions:y,removeMember:h,isRemovingMember:o,cancelInvitation:g,isCancellingInvitation:x,removeInvitation:N,isRemovingInvitation:j,restoreMember:w,isRestoringMember:p}=Rs(),D={members:i,membersLoading:a||l,invitations:c,invitationsLoading:a||n,isAccountOwner:r&&!!s,inviteMember:t,isInviting:d,updatePermissions:m,isUpdatingPermissions:y,removeMember:h,isRemovingMember:o,cancelInvitation:g,isCancellingInvitation:x,removeInvitation:N,isRemovingInvitation:j,restoreMember:w,isRestoringMember:p,onResend:M=>{t({email:M.email,teamMemberRole:M.teamMemberRole,canCreateTimeEntries:M.canCreateTimeEntries,canViewAllTimeEntries:M.canViewAllTimeEntries})}};return u?e.jsx(Ps,{...D}):a||l?e.jsx("div",{className:"flex min-h-screen items-center justify-center bg-gray-50 dark:bg-gray-900",children:e.jsx("div",{className:"h-20 w-20 animate-spin rounded-full border-b-2 border-primary"})}):e.jsx(Ls,{...D})}export{zs 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.