1import{u as Je,r as o,d as E,e as C,O as x,Q as S,j as e,f as O,i as se,S as F,ae as xe,h as ue,z as pe,U as G,bo as We,aq as D,a2 as Xe,b3 as A,bw as os,a9 as ge,aR as je,aS as ve,x as q,an as ze,C as Ne,ah as ms,B as m,D as M,m as U,n as z,o as _,aw as fe,L as v,a4 as hs,ax as V,bx as Ae,a as xs,c as us,by as oe,l as _e,P as ps,E as gs,F as js,G as He,K as qe,N as Ke,I as P,ac as Q,aV as Qe,ak as B,g as vs,a6 as ee,au as me,ap as he,a$ as Be,ai as Ns,M as Ge,aa as fs,aT as ys,p as ye,q as be,s as we,t as Ce,v as H,bz as bs,bA as ws}from"./index-DKbmQBBZ.js";import{c as Cs}from"./development-questions-CLBUUFIu.js";import{C as Se}from"./circle-x-CMbgLbWe.js";const Ss="FLAGGED_POSSIBLE_MINOR",As={SUPERADMIN:ge,ASSISTANT_ADMIN:os,COORDINATOR:A,ACADEMY_COACH:A,SCHOOL_COACH:A,CLUB_COACH:A,REFEREE:Xe,ATHLETE:D,PARENT:We,VOLUNTEER:G},Ve={SUPERADMIN:"bg-purple-500/10 text-purple-500 border-purple-500/20",ASSISTANT_ADMIN:"bg-indigo-500/10 text-indigo-500 border-indigo-500/20",COORDINATOR:"bg-blue-500/10 text-blue-500 border-blue-500/20",ACADEMY_COACH:"bg-green-500/10 text-green-500 border-green-500/20",SCHOOL_COACH:"bg-emerald-500/10 text-emerald-500 border-emerald-500/20",CLUB_COACH:"bg-teal-500/10 text-teal-500 border-teal-500/20",REFEREE:"bg-orange-500/10 text-orange-500 border-orange-500/20",ATHLETE:"bg-cyan-500/10 text-cyan-500 border-cyan-500/20",PARENT:"bg-pink-500/10 text-pink-500 border-pink-500/20",VOLUNTEER:"bg-gray-500/10 text-gray-500 border-gray-500/20"};function Es(){const{toast:r}=Je(),[u,i]=o.useState(!1),[t,N]=o.useState(null),[d,n]=o.useState(""),{data:g=[],isLoading:f}=E({queryKey:["/api/role-assignments/pending"]}),k=C({mutationFn:async a=>(await S("PATCH",`/api/role-assignments/${a}/approve`)).json(),onSuccess:()=>{x.invalidateQueries({queryKey:["/api/role-assignments/pending"]}),x.invalidateQueries({queryKey:["/api/academy-people"]}),r({title:"Role approved",description:"The role request has been approved."})},onError:a=>{r({title:"Failed to approve role",description:a.message,variant:"destructive"})}}),y=C({mutationFn:async({id:a,reason:h})=>(await S("PATCH",`/api/role-assignments/${a}/reject`,{rejectionReason:h})).json(),onSuccess:()=>{x.invalidateQueries({queryKey:["/api/role-assignments/pending"]}),x.invalidateQueries({queryKey:["/api/academy-people"]}),i(!1),N(null),n(""),r({title:"Role rejected",description:"The role request has been rejected."})},onError:a=>{r({title:"Failed to reject role",description:a.message,variant:"destructive"})}}),ae=a=>{N(a),n(""),i(!0)},Y=()=>{t&&y.mutate({id:t.id,reason:d})},te=a=>a?`${a.firstName?.[0]||""}${a.lastName?.[0]||""}`.toUpperCase():"??",K=a=>a?a.preferredName||`${a.firstName} ${a.lastName}`:"Unknown Person",J=a=>Ae[a]?.label||a;return f?e.jsx("div",{className:"space-y-4",children:[1,2,3].map(a=>e.jsx(O,{children:e.jsx(se,{className:"p-4",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx(F,{className:"h-12 w-12 rounded-full"}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(F,{className:"h-4 w-32"}),e.jsx(F,{className:"h-3 w-48"}),e.jsx(F,{className:"h-5 w-24"})]})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(F,{className:"h-9 w-24"}),e.jsx(F,{className:"h-9 w-24"})]})]})})},a))}):g.length===0?e.jsxs(O,{className:"p-8 text-center",children:[e.jsx(xe,{className:"h-12 w-12 mx-auto text-green-500 mb-4"}),e.jsx(ue,{className:"mb-2",children:"All Caught Up"}),e.jsx(pe,{children:"No pending role requests to review"})]}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"space-y-4",children:g.map(a=>{const h=As[a.role]||D,W=Ve[a.role]||Ve.VOLUNTEER;return e.jsx(O,{"data-testid":`card-pending-role-${a.id}`,children:e.jsx(se,{className:"p-4",children:e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-4",children:[e.jsxs("div",{className:"flex items-start gap-4",children:[e.jsx(je,{className:"h-12 w-12",children:e.jsx(ve,{children:te(a.person)})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("h3",{className:"font-semibold text-base","data-testid":`text-person-name-${a.id}`,children:K(a.person)}),a.person?.primaryEmail&&e.jsx("p",{className:"text-sm text-muted-foreground truncate","data-testid":`text-person-email-${a.id}`,children:a.person.primaryEmail}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2 mt-2",children:[e.jsxs(q,{className:W,"data-testid":`badge-role-${a.id}`,children:[e.jsx(h,{className:"h-3 w-3 mr-1"}),J(a.role)]}),a.notes?.includes(Ss)&&e.jsxs(q,{variant:"destructive",className:"gap-1","data-testid":`badge-possible-minor-${a.id}`,title:"This alumni signup's name matches an existing under-18 person in the academy. Verify identity and age before approving.",children:[e.jsx(ze,{className:"h-3 w-3"}),"Possible minor"]}),e.jsxs("span",{className:"text-xs text-muted-foreground flex items-center gap-1",children:[e.jsx(Ne,{className:"h-3 w-3"}),"Requested ",a.requestedAt?ms(new Date(a.requestedAt),"MMM d, yyyy"):"N/A"]})]})]})]}),e.jsxs("div",{className:"flex gap-2 sm:flex-shrink-0",children:[e.jsxs(m,{size:"sm",variant:"outline",className:"text-green-600 border-green-600 hover:bg-green-50 dark:hover:bg-green-950",onClick:()=>k.mutate(a.id),disabled:k.isPending||y.isPending,"data-testid":`button-approve-${a.id}`,children:[e.jsx(xe,{className:"h-4 w-4 mr-1"}),"Approve"]}),e.jsxs(m,{size:"sm",variant:"outline",className:"text-red-600 border-red-600 hover:bg-red-50 dark:hover:bg-red-950",onClick:()=>ae(a),disabled:k.isPending||y.isPending,"data-testid":`button-reject-${a.id}`,children:[e.jsx(Se,{className:"h-4 w-4 mr-1"}),"Reject"]})]})]})})},a.id)})}),e.jsx(M,{open:u,onOpenChange:i,children:e.jsxs(U,{children:[e.jsxs(z,{children:[e.jsxs(_,{className:"flex items-center gap-2",children:[e.jsx(ze,{className:"h-5 w-5 text-red-500"}),"Reject Role Request"]}),e.jsxs(fe,{children:["You are about to reject the ",t&&J(t.role)," role request for ",t&&K(t.person),"."]})]}),e.jsx("div",{className:"space-y-4 py-4",children:e.jsxs("div",{children:[e.jsx(v,{htmlFor:"rejection-reason",children:"Rejection Reason (optional)"}),e.jsx(hs,{id:"rejection-reason",placeholder:"Provide a reason for rejecting this role request...",value:d,onChange:a=>n(a.target.value),className:"mt-2",rows:3,"data-testid":"textarea-rejection-reason"})]})}),e.jsxs(V,{children:[e.jsx(m,{variant:"outline",onClick:()=>i(!1),disabled:y.isPending,"data-testid":"button-cancel-reject",children:"Cancel"}),e.jsx(m,{variant:"destructive",onClick:Y,disabled:y.isPending,"data-testid":"button-confirm-reject",children:y.isPending?"Rejecting...":"Reject Request"})]})]})})]})}const Ps={SUPERADMIN:ge,ASSISTANT_ADMIN:ge,COORDINATOR:A,ACADEMY_COA
1CH:A,SCHOOL_COACH:A,CLUB_COACH:A,REFEREE:Xe,ATHLETE:D,ALUMNI:A,PARENT:We,VOLUNTEER:G},Os={SUPERADMIN:"bg-purple-500/10 text-purple-500 border-purple-500/20",ASSISTANT_ADMIN:"bg-violet-500/10 text-violet-500 border-violet-500/20",COORDINATOR:"bg-blue-500/10 text-blue-500 border-blue-500/20",ACADEMY_COACH:"bg-green-500/10 text-green-500 border-green-500/20",SCHOOL_COACH:"bg-emerald-500/10 text-emerald-500 border-emerald-500/20",CLUB_COACH:"bg-teal-500/10 text-teal-500 border-teal-500/20",REFEREE:"bg-orange-500/10 text-orange-500 border-orange-500/20",ATHLETE:"bg-cyan-500/10 text-cyan-500 border-cyan-500/20",ALUMNI:"bg-amber-500/10 text-amber-600 border-amber-500/20",PARENT:"bg-pink-500/10 text-pink-500 border-pink-500/20",VOLUNTEER:"bg-gray-500/10 text-gray-500 border-gray-500/20"},Rs={PENDING:"bg-yellow-500/10 text-yellow-600 border-yellow-500/20",APPROVED:"bg-green-500/10 text-green-600 border-green-500/20",REJECTED:"bg-red-500/10 text-red-600 border-red-500/20",SUSPENDED:"bg-gray-500/10 text-gray-600 border-gray-500/20"},Ds=["No longer active","Duplicate record","Moved away","Requested removal","Inactive for extended period","Other"];function Ye(r){const u=[],i=!!(r.primaryEmail&&r.primaryEmail.trim()!==""),t=(r.guardianEmails?.length??0)>0;if(!i&&!t&&u.push("Contact email"),(!r.streetAddress||!r.city)&&u.push("Home address"),r.isAthlete&&!(r.currentSchool&&r.currentSchool.trim()!=="")&&u.push("Current school"),r.isAthlete&&r.birthDate&&!t)try{Cs(r.birthDate)<18&&u.push("Guardian email (required for under-18)")}catch{}return r.lastTeamInYear||u.push("Last team (12 mo)"),u}function Ms(){const{isSuperAdmin:r,isCoordinator:u,isLoading:i}=xs(),{toast:t}
1=Je(),[N,d]=o.useState(""),[n,g]=o.useState(null),f=us(),k=(()=>{const s=new URLSearchParams(f).get("personId");if(!s)return null;const l=Number(s);return Number.isInteger(l)&&l>0?l:null})(),{data:y}=E({queryKey:["/api/academy-people",k],enabled:r&&k!==null}),[ae,Y]=o.useState(()=>new URLSearchParams(f).get("tab")==="pending"?"pending":"directory");o.useEffect(()=>{const s=new URLSearchParams(f).get("tab");(s==="pending"||s==="directory")&&Y(s)},[f]),o.useEffect(()=>{y&&oe(y.id)},[y?.id]);const[te,K]=o.useState(!1),[J,a]=o.useState(!1),[h,W]=o.useState(!1),[Ee,Pe]=o.useState(()=>new URLSearchParams(f).get("missingInfo")==="1");o.useEffect(()=>{new URLSearchParams(f).get("missingInfo")==="1"&&Pe(!0)},[f]);const[c,R]=o.useState(new Set),[Ze,X]=o.useState(!1),[Oe,Re]=o.useState("No longer active"),[es,T]=o.useState(!1),[w,L]=o.useState(null),{data:De=[],isLoading:ss}=E({queryKey:["/api/academy-people"],enabled:r&&!h}),{data:ke=[],isLoading:as}=E({queryKey:["/api/admin/people/archived"],enabled:r&&h}),{data:ts=[]}=E({queryKey:["/api/role-assignments/pending"],enabled:r}),{data:ie=[]}=E({queryKey:["/api/admin/guardian-cc-gaps"],enabled:r}),{data:is=[],isLoading:rs,isError:ns,error:ls}=E({queryKey:["/api/academy-people/search",{q:N,includeArchived:h?"true":void 0}],enabled:N.length>=2}),{data:Te=[]}=E({queryKey:["/api/academy-people",n?.id,"roles"],enabled:!!n}),Le=C({mutationFn:async s=>(await S("POST","/api/academy-people",s)).json(),onSuccess:()=>{x.invalidateQueries({queryKey:["/api/academy-people"]}),bs(),K(!1),t({title:"Person added successfully"})},onError:s=>{let l=s.message;const p=s.message.indexOf(": ");if(p>0){const j=s.message.slice(p+2).trim();if(j.startsWith("{"))try{const ce=JSON.parse(j);typeof ce.message=="string"&&ce.message.length>0&&(l=ce.message)}catch{}}t({title:"Failed to add person",description:l,variant:"destructive"})}}),Ie=C({mutationFn:async({personId:s,role:l,scopeType:p})=>(await S("POST",`/api/academy-people/${s}/roles`,{role:l,scopeType:p})).json(),onSuccess:()=>{x.invalidateQueries({queryKey:["/api/academy-people",n?.id,"roles"]}),a(!1),t({title:"Role assigned successfully"})},onError:s=>{t({title:"Failed to assign role",description:s.message,variant:"destructive"})}}),$e=C({mutationFn:async s=>(await S("DELETE",`/api/role-assignments/${s}`)).json(),onSuccess:()=>{x.invalidateQueries({queryKey:["/api/academy-people",n?.id,"roles"]}),x.invalidateQueries({queryKey:["/api/role-assignments/pending"]}),t({title:"Role suspended successfully"})},onError:s=>{t({title:"Failed to suspend role",description:s.message,variant:"destructive"})}}),re=C({mutationFn:async({personIds:s,reason:l})=>(await S("POST","/api/admin/people/bulk-archive",{personIds:s,reason:l})).json(),onSuccess:s=>{x.invalidateQueries({queryKey:["/api/academy-people"]}),x.invalidateQueries({queryKey:["/api/admin/people/archived"]}),R(new Set),X(!1),Re("No longer active"),t({title:`Archived ${s.archived} of ${s.total} people`,description:s.errors.length>0?`${s.errors.length} errors occurred`:void 0})},onError:s=>{t({title:"Bulk archive failed",description:s.message,variant:"destructive"})}}),I=C({mutationFn:async s=>(await S("POST",`/api/admin/person/${s}/restore`)).json(),onSuccess:()=>{x.invalidateQueries({queryKey:["/api/academy-people"]}),x.invalidateQueries({queryKey:["/api/admin/people/archived"]}),t({title:"Person restored successfully"})},onError:s=>{t({title:"Failed to restore person",description:s.message,variant:"destructive"})}}),ne=C({mutationFn:async s=>(await S("DELETE",`/api/admin/person/${s}/permanent`)).json(),onSuccess:()=>{x.invalidateQueries({queryKey:["/api/admin/people/archived"]}),x.invalidateQueries({queryKey:["/api/academy-people"]}),T(!1),L(null),t({title:"Person permanently deleted"})},onError:s=>{t({title:"Failed to delete person",description:s.message,variant:"destructive"})}}),le=C({mutationFn:async s=>(await S("POST","/api/admin/people/bulk-permanent-delete",{personIds:s})).json(),onSuccess:s=>{x.invalidateQueries({queryKey:["/api/admin/people/archived"]}),x.invalidateQueries({queryKey:["/api/academy-people"]}),R(new Set),T(!1),L(null),t({title:`Permanently deleted ${s.deleted} of ${s.total} people`,description:s.errors.length>0?`${s.errors.length} errors occurred`:void 0})},onError:s=>{t({title:"Bulk delete failed",description:s.message,variant:"destructive"})}});if(i)return e.jsx("div",{className:"flex items-center justify-center min-h-screen",children:"Loading..."});if(!r)return e.jsx("div",{className:"flex items-center justify-center min-h-screen",children:e.jsxs(O,{className:"p-6",children:[e.jsx(ue,{className:"text-center",children:"Access Denied"}),e.jsx(pe,{className:"text-center mt-2",children:"Only SuperAdmins can access Academy People management."})]})});const Z=N.length>=2,Fe=Z?is:h?ke:De,b=Ee?Fe.filter(s=>Ye(s).length>0):Fe,ds=Z?rs:h?as:ss,Me=s=>`${s.firstName?.[0]||""}${s.lastName?.[0]||""}`.toUpperCase(),$=s=>s.preferredName||`${s.firstName} ${s.lastName}`,cs=s=>{R(l=>{const p=new Set(l);return p.has(s)?p.delete(s):p.add(s),p})},de=()=>{c.size===b.length?R(new Set):R(new Set(b.map(s=>s.id)))},Ue=b.filter(s=>c.has(s.id));return e.jsx("div",{className:"min-h-screen bg-background",children:e.jsxs("div",{className:"container mx-auto p-6 space-y-6",children:[e.jsxs("div",{className:"flex items-center justify-between gap-4 flex-wrap",children:[e.jsxs("div",{children:[e.jsxs("h1",{className:"text-3xl font-bold flex items-center gap-3","data-testid":"text-page-title",children:[e.jsx(G,{className:"h-8 w-8"}),"Academy People"]}),e.jsx("p",{className:"text-muted-foreground mt-1",children:"Central registry of all community members"})]}),e.jsxs(M,{open:te,onOpenChange:K,children:[e.jsx(_e,{asChild:!0,children:e.jsxs(m,{"data-testid":"button-add-pers
1on",children:[e.jsx(ps,{className:"h-4 w-4 mr-2"}),"Add Person"]})}),e.jsxs(U,{className:"max-w-lg",children:[e.jsx(z,{children:e.jsx(_,{children:"Add New Person"})}),e.jsx(ks,{onSubmit:s=>Le.mutate(s),isPending:Le.isPending})]})]})]}),e.jsxs(gs,{value:ae,onValueChange:Y,className:"space-y-4",children:[e.jsxs(js,{children:[e.jsxs(He,{value:"directory","data-testid":"tab-directory",children:[e.jsx(G,{className:"h-4 w-4 mr-2"}),"Directory (",h?ke.length:De.length,")"]}),e.jsxs(He,{value:"pending","data-testid":"tab-pending",children:[e.jsx(Ne,{className:"h-4 w-4 mr-2"}),"Pending Approvals (",ts.length,")"]})]}),e.jsxs(qe,{value:"directory",className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between gap-4 flex-wrap",children:[e.jsxs("div",{className:"relative flex-1 min-w-[200px]",children:[e.jsx(Ke,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground"}),e.jsx(P,{placeholder:h?"Search archived people by name, email, or phone...":"Search by name, email, or phone...",value:N,onChange:s=>d(s.target.value),className:"pl-10","data-testid":"input-search"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(v,{htmlFor:"show-missing-info",className:"text-sm text-muted-foreground whitespace-nowrap",children:[e.jsx(Q,{className:"h-4 w-4 inline mr-1"}),"Missing Info Only"]}),e.jsx(Qe,{id:"show-missing-info",checked:Ee,onCheckedChange:Pe,"data-testid":"switch-show-missing-info"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(v,{htmlFor:"show-archived",className:"text-sm text-muted-foreground whitespace-nowrap",children:[e.jsx(B,{className:"h-4 w-4 inline mr-1"}),"Show Archived"]}),e.jsx(Qe,{id:"show-archived",checked:h,onCheckedChange:s=>{W(s),R(new Set),d("")},"data-testid":"switch-show-archived"})]})]}),ie.length>0&&e.jsxs(O,{className:"border-destructive/50","data-testid":"card-guardian-cc-gaps",children:[e.jsxs(vs,{className:"pb-3",children:[e.jsxs(ue,{className:"text-base flex items-center gap-2",children:[e.jsx(Q,{className:"h-4 w-4 text-destructive"}),"Emailed without a guardian copy (",ie.length,")"]}),e.jsx(pe,{children:"Under-18 athletes who received email in the last 30 days with no parent/guardian copied, and who still have no guardian email on file. Open the profile to add one â the list clears on its own."})]}),e.jsx(se,{className:"space-y-2",children:ie.map(s=>e.jsxs("button",{type:"button",onClick:()=>oe(s.personId),className:"w-full flex items-center justify-between gap-3 rounded-md border px-3 py-2 text-left hover-elevate","data-testid":`row-guardian-cc-gap-${s.personId}`,children:[e.jsxs("span",{className:"font-medium","data-testid":`text-guardian-gap-name-${s.personId}`,children:[s.firstName," ",s.lastName]}),e.jsxs("span",{className:"text-sm text-muted-foreground whitespace-nowrap","data-testid":`text-guardian-gap-stats-${s.personId}`,children:[s.affectedSendCount," email",s.affectedSendCount===1?"":"s"," · last"," ",new Date(s.lastFlaggedAt).toLocaleDateString("en-CA",{timeZone:"America/Regina"})]})]},s.personId))})]}),!h&&c.size>0&&e.jsxs("div",{className:"flex items-center justify-between gap-4 p-3 rounded-md bg-muted/50 border flex-wrap","data-testid":"bulk-action-toolbar",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(ee,{checked:c.size===b.length&&b.length>0,onCheckedChange:de,"data-testid":"checkbox-select-all"}),e.jsxs("span",{className:"text-sm font-medium","data-testid":"text-selected-count",children:[c.size," selected"]})]}),e.jsxs(m,{variant:"destructive",size:"sm",onClick:()=>X(!0),"data-testid":"button-bulk-archive",children:[e.jsx(B,{className:"h-4 w-4 mr-2"}),"Archive Selected"]})]}),h&&c.size>0&&e.jsxs("div",{className:"flex items-center justify-between gap-4 p-3 rounded-md bg-muted/50 border flex-wrap","data-testid":"bulk-action-toolbar-archived",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(ee,{checked:c.size===b.length&&b.length>0,onCheckedChange:de,"data-testid":"checkbox-select-all-archived"}),e.jsxs("span",{className:"text-sm font-medium","data-testid":"text-selected-count-archived",children:[c.size," selected"]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(m,{variant:"outline",size:"sm",onClick:()=>{for(const s of c)I.mutate(s);R(new Set)},disabled:I.isPending,"data-testid":"button-bulk-restore",children:[e.jsx(me,{className:"h-4 w-4 mr-2"}),"Restore Selected"]}),e.jsxs(m,{variant:"destructive",size:"sm",onClick:()=>{L({mode:"bulk"}),T(!0)},"data-testid":"button-bulk-delete",children:[e.jsx(he,{className:"h-4 w-4 mr-2"}),"Delete Selected"]})]})]}),c.size===0&&b.length>0&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(ee,{checked:!1,onCheckedChange:de,"data-testid":"checkbox-select-all"}),e.jsx("span",{className:"text-sm text-muted-foreground",children:"Select all"})]}),Z&&ns?e.jsxs(O,{className:"p-8 text-center border-destructive/40 bg-destructive/5",children:[e.jsx(Ke,{className:"h-12 w-12 mx-auto text-destructive mb-4"}),e.jsx("p",{className:"font-medium text-destructive","data-testid":"text-search-error",children:"Search request failed"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:ls?.message||"The directory search couldn't be reached. Try again in a moment."})]}):ds?e.jsx("div",{className:"text-center py-8 text-muted-foreground","data-testid":"text-loading",children:"Loading..."}):b.length===0?e.jsxs(O,{className:"p-8 text-center",children:[e.jsx(G,{className:"h-12 w-12 mx-auto text-muted-foreground mb-4"}),e.jsx("p",{className:"text-muted-foreground","data-testid":"text-empty-state",children:Z?"No peo
1ple found matching your search":h?"No archived people":"No people registered yet"})]}):e.jsx("div",{className:"grid gap-4 md:grid-cols-2 lg:grid-cols-3",children:b.map(s=>{const l=!!s.archivedAt,p=Ye(s);return e.jsx(O,{className:`cursor-pointer hover-elevate ${c.has(s.id)?"ring-2 ring-primary":""} ${l?"opacity-75":""}`,"data-testid":`card-person-${s.id}`,children:e.jsx(se,{className:"p-4",children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx("div",{className:"pt-1",onClick:j=>j.stopPropagation(),children:e.jsx(ee,{checked:c.has(s.id),onCheckedChange:()=>cs(s.id),"data-testid":`checkbox-person-${s.id}`})}),e.jsxs("div",{className:"flex items-start gap-4 flex-1 min-w-0",onClick:()=>oe(s.id),"data-testid":`button-open-person-${s.id}`,children:[e.jsxs(je,{className:"h-12 w-12",children:[e.jsx(Be,{src:s.profilePhotoUrl||void 0}),e.jsx(ve,{children:Me(s)})]}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[e.jsx("h3",{className:"font-semibold truncate",children:$(s)}),l&&e.jsxs(q,{variant:"outline",className:"text-destructive border-destructive/40","data-testid":`badge-archived-${s.id}`,children:[e.jsx(B,{className:"h-3 w-3 mr-1"}),"Archived"]})]}),(s.primaryEmail||s.guardianEmails?.[0])&&e.jsxs("p",{className:"text-sm text-muted-foreground truncate flex items-center gap-1",children:[e.jsx(Ns,{className:"h-3 w-3"}),s.primaryEmail||s.guardianEmails?.[0],!s.primaryEmail&&e.jsx(q,{variant:"outline",className:"text-[10px] px-1 py-0 shrink-0","data-testid":`badge-parent-email-${s.id}`,children:"parent"})]}),s.city&&e.jsxs("p",{className:"text-sm text-muted-foreground flex items-center gap-1",children:[e.jsx(Ge,{className:"h-3 w-3"}),s.city,", ",s.province]}),l&&s.archiveReason&&e.jsxs("p",{className:"text-xs text-destructive mt-1 flex items-center gap-1",children:[e.jsx(B,{className:"h-3 w-3"}),s.archiveReason]}),!l&&p.length>0&&e.jsxs("p",{className:"text-xs text-amber-600 dark:text-amber-500 mt-1 flex items-center gap-1","data-testid":`text-missing-info-${s.id}`,children:[e.jsx(Q,{className:"h-3 w-3 shrink-0"}),"Missing: ",p.join(", ")]})]})]}),e.jsx(m,{size:"sm",variant:"ghost",onClick:j=>{j.stopPropagation(),g(s)},"data-testid":`button-manage-person-${s.id}`,title:"Manage roles & admin actions",children:"Manage"}),l&&e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsxs(m,{size:"sm",variant:"outline",onClick:j=>{j.stopPropagation(),I.mutate(s.id)},disabled:I.isPending,"data-testid":`button-restore-${s.id}`,children:[e.jsx(me,{className:"h-4 w-4 mr-1"}),"Restore"]}),e.jsxs(m,{size:"sm",variant:"destructive",onClick:j=>{j.stopPropagation(),L({mode:"single",person:s}),T(!0)},"data-testid":`button-delete-${s.id}`,children:[e.jsx(he,{className:"h-4 w-4 mr-1"}),"Delete"]})]})]})})},s.id)})})]}),e.jsx(qe,{value:"pending",className:"space-y-4",children:e.jsx(Es,{})})]}),e.jsx(M,{open:!!n,onOpenChange:s=>!s&&g(null),children:e.jsx(U,{className:"max-w-2xl",children:n&&e.jsxs(e.Fragment,{children:[e.jsx(z,{children:e.jsxs(_,{className:"flex items-center gap-3",children:[e.jsxs(je,{className:"h-12 w-12",children:[e.jsx(Be,{src:n.profilePhotoUrl||void 0}),e.jsx(ve,{children:Me(n)})]}),e.jsxs("div",{children:[e.jsx("div",{children:$(n)}),e.jsx("div",{className:"text-sm font-normal text-muted-foreground",children:n.primaryEmail})]})]})}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4 text-sm",children:[n.primaryPhone&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(fs,{className:"h-4 w-4 text-muted-foreground"}),n.primaryPhone]}),n.city&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Ge,{className:"h-4 w-4 text-muted-foreground"}),n.city,", ",n.province]})]}),n.archivedAt&&e.jsxs("div",{className:"p-3 rounded-md bg-destructive/10 border border-destructive/20 text-sm",children:[e.jsxs("div",{className:"flex items-center gap-2 font-medium text-destructive",children:[e.jsx(B,{className:"h-4 w-4"}),"Archived"]}),n.archiveReason&&e.jsxs("p",{className:"mt-1 text-muted-foreground",children:["Reason: ",n.archiveReason]}),e.jsxs("p",{className:"mt-1 text-muted-foreground",children:["Date: ",new Date(n.archivedAt).toLocaleDateString()]}),e.jsxs(m,{size:"sm",variant:"outline",className:"mt-2",onClick:()=>{I.mutate(n.id),g(null)},disabled:I.isPending,"data-testid":"button-restore-detail",children:[e.jsx(me,{className:"h-4 w-4 mr-1"}),"Restore Person"]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between gap-2 mb-2 flex-wrap",children:[e.jsx("h4",{className:"font-semibold",children:"Roles"}),e.jsxs(M,{open:J,onOpenChange:a,children:[e.jsx(_e,{asChild:!0,children:e.jsxs(m,{size:"sm",variant:"outline","data-testid":"button-assign-role",children:[e.jsx(ys,{className:"h-4 w-4 mr-1"}),"Assign Role"]})}),e.jsxs(U,{children:[e.jsx(z,{children:e.jsxs(_,{children:["Assign Role to ",$(n)]})}),e.jsx(Ts,{onSubmit:s=>Ie.mutate({personId:n.id,...s}),isPending:Ie.isPending})]})]})]}),Te.length===0?e.jsx("p",{className:"text-sm text-muted-foreground",children:"No roles assigned"}):e.jsx("div",{className:"space-y-2",children:Te.map(s=>{const l=Ps[s.role]||D,j=Ae[s.role]?.label||s.role;return e.jsxs("div",{className:"flex items-center justify-between gap-2 p-2 rounded-md bg-muted/50","data-testid":`role-item-${s.id}`,children:[e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[e.jsxs(q,{className:Os[s.role]||"bg-gray-500/10 text-gray-600",children:[e.jsx(l,{className:"h-3 w-3 mr-1"}),j]}),e.jsxs(q,{variant:"outline",className:Rs[s.status],"data-testid":`status-badge-${s.id}`,children:[s.status==="APPROVED"&&e.jsx(xe,{className:"h-3 w-3 mr-1"}),s.status==="PENDING"&&e.jsx(Ne,{className:"h-3 w-3 mr-1"}),s.status==="REJECTED"&&e.jsx(Se,{className:"h-3 w-3 mr-1"}),s.status==="SUSPENDED"&&e.jsx(Se,{className:"h-3 w-3 mr-1"}),s.status]}),s.scopeType!=="GLOBAL"&&e.jsxs("span",{className:"text-xs text-muted-foreground",children:["(",s.scopeType,")"]})]}),s.status!=="SUSPENDED"&&e.jsx(m,{size:"icon",variant:"ghost",onClick:()=>$e.mutate(s.id),disabled:$e.isPending,"data-testid":`button-revoke-role-${s.id}`,children:e.jsx(he,{className:"h-4 w-4 text-destructive"})})]},s.id)})})]})]})]})})}),e.jsx(M,{open:Ze,onOpenChange:X,children:e.jsxs(U,{children:[e.jsxs(z,{children:[e.jsxs(_,{className:"flex items-center gap-2",children:[e.jsx(Q,{className:"h-5 w-5 text-destructive"}),"Archive ",c.size," ",c.size===1?"Person":"People"]}),e.jsx(fe,{children:"This will archive the selected people. They will be hidden from the directory but can be restored later."})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:"max-h-[200px] overflow-y-auto space-y-1",children:Ue.map(s=>e.jsxs("div",{className:"text-sm flex items-center gap-2 p-1",children:[e.jsx(D,{className:"h-3 w-3 text-muted-foreground"}),$(s),s.primaryEmail&&e.jsxs("span",{className:"text-muted-foreground",children:["(",s.primaryEmail,")"]})]},s.id))}),e.jsxs("div",{children:[e.jsx(v,{htmlFor:"archive-reason",children:"Reason"}),e.jsxs(ye,{value:Oe,onValueChange:Re,children:[e.jsx(be,{"data-testid":"select-archive-reason",children:e.jsx(we,{})}),e.jsx(Ce,{children:Ds.map(s=>e.jsx(H,{value:s,children:s},s))})]})]})]}),e.jsxs(V,{className:"gap-2",children:[e.jsx(m,{variant:"outline",onClick:()=>X(!1),"data-testid":"button-cancel-archive",children:"Cancel"}),e.jsx(m,{variant:"destructive",onClick:()=>re.mutate({personIds:Array.from(c),reason:Oe}),disabled:re.isPending,"data-testid":"button-confirm-archive",children:re.isPending?"Archiv
1ing...":`Archive ${c.size} ${c.size===1?"Person":"People"}`})]})]})}),e.jsx(M,{open:es,onOpenChange:s=>{s||(T(!1),L(null))},children:e.jsxs(U,{children:[e.jsxs(z,{children:[e.jsxs(_,{className:"flex items-center gap-2",children:[e.jsx(Q,{className:"h-5 w-5 text-destructive"}),"Permanently Delete ",w?.mode==="single"?"Person":`${c.size} ${c.size===1?"Person":"People"}`]}),e.jsxs(fe,{children:["This action is permanent and cannot be undone. All data associated with ",w?.mode==="single"?"this person":"these people"," will be permanently removed."]})]}),e.jsx("div",{className:"max-h-[200px] overflow-y-auto space-y-1",children:w?.mode==="single"?e.jsxs("div",{className:"text-sm flex items-center gap-2 p-1",children:[e.jsx(D,{className:"h-3 w-3 text-muted-foreground"}),$(w.person),w.person.primaryEmail&&e.jsxs("span",{className:"text-muted-foreground",children:["(",w.person.primaryEmail,")"]})]}):Ue.map(s=>e.jsxs("div",{className:"text-sm flex items-center gap-2 p-1",children:[e.jsx(D,{className:"h-3 w-3 text-muted-foreground"}),$(s),s.primaryEmail&&e.jsxs("span",{className:"text-muted-foreground",children:["(",s.primaryEmail,")"]})]},s.id))}),e.jsxs(V,{className:"gap-2",children:[e.jsx(m,{variant:"outline",onClick:()=>{T(!1),L(null)},"data-testid":"button-cancel-delete",children:"Cancel"}),e.jsx(m,{variant:"destructive",onClick:()=>{w?.mode==="single"?ne.mutate(w.person.id):le.mutate(Array.from(c))},disabled:ne.isPending||le.isPending,"data-testid":"button-confirm-delete",children:ne.isPending||le.isPending?"Deleting...":w?.mode==="single"?"Delete Permanently":`Delete ${c.size} ${c.size===1?"Person":"People"} Permanently`})]})]})})]})})}function ks({onSubmit:r,isPending:u}){const[i,t]=o.useState({firstName:"",lastName:"",preferredName:"",primaryEmail:"",primaryPhone:"",city:"",province:""}),N=d=>{d.preventDefault(),r(i)};return e.jsxs("form",{onSubmit:N,className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsx(v,{htmlFor:"firstName",children:"First Name *"}),e.jsx(P,{id:"firstName",value:i.firstName,onChange:d=>t({...i,firstName:d.target.value}),required:!0,"data-testid":"input-first-name"})]}),e.jsxs("div",{children:[e.jsx(v,{htmlFor:"lastName",children:"Last Name *"}),e.jsx(P,{id:"lastName",value:i.lastName,onChange:d=>t({...i,lastName:d.target.value}),required:!0,"data-testid":"input-last-name"})]})]}),e.jsxs("div",{children:[e.jsx(v,{htmlFor:"preferredName",children:"Preferred Name"}),e.jsx(P,{id:"preferredName",value:i.preferredName,onChange:d=>t({...i,preferredName:d.target.value}),placeholder:"Display name (optional)","data-testid":"input-preferred-name"})]}),e.jsxs("div",{children:[e.jsx(v,{htmlFor:"email",children:"Email"}),e.jsx(P,{id:"email",type:"email",value:i.primaryEmail,onChange:d=>t({...i,primaryEmail:d.target.value}),"data-testid":"input-email"})]}),e.jsxs("div",{children:[e.jsx(v,{htmlFor:"phone",children:"Phone"}),e.jsx(P,{id:"phone",value:i.primaryPhone,onChange:d=>t({...i,primaryPhone:d.target.value}),"data-testid":"input-phone"})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsx(v,{htmlFor:"city",children:"City"}),e.jsx(P,{id:"city",value:i.city,onChange:d=>t({...i,city:d.target.value}),"data-testid":"input-city"})]}),e.jsxs("div",{children:[e.jsx(v,{htmlFor:"province",children:"Province"}),e.jsx(P,{id:"province",value:i.province,onChange:d=>t({...i,province:d.target.value}),"data-testid":"input-province"})]})]}),e.jsx(V,{children:e.jsx(m,{type:"submit",disabled:u,"data-testid":"button-submit-person",children:u?"Adding...":"Add Person"})})]})}function Ts({onSubmit:r,isPending:u}
1){const[i,t]=o.useState(""),[N,d]=o.useState("GLOBAL"),n=g=>{g.preventDefault(),i&&r({role:i,scopeType:N})};return e.jsxs("form",{onSubmit:n,className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx(v,{htmlFor:"role",children:"Role *"}),e.jsxs(ye,{value:i,onValueChange:t,children:[e.jsx(be,{"data-testid":"select-role",children:e.jsx(we,{placeholder:"Select a role"})}),e.jsx(Ce,{children:ws.map(g=>{const f=Ae[g];return e.jsx(H,{value:g,"data-testid":`select-role-option-${g}`,children:e.jsxs("div",{className:"flex flex-col",children:[e.jsx("span",{children:f.label}),e.jsx("span",{className:"text-xs text-muted-foreground",children:f.description})]})},g)})})]})]}),e.jsxs("div",{children:[e.jsx(v,{htmlFor:"scopeType",children:"Scope"}),e.jsxs(ye,{value:N,onValueChange:d,children:[e.jsx(be,{"data-testid":"select-scope",children:e.jsx(we,{})}),e.jsxs(Ce,{children:[e.jsx(H,{value:"GLOBAL",children:"Global (All Events)"}),e.jsx(H,{value:"LEAGUE",children:"League"}),e.jsx(H,{value:"EVENT",children:"Event"}),e.jsx(H,{value:"PROGRAM",children:"Program"})]})]})]}),e.jsx(V,{children:e.jsx(m,{type:"submit",disabled:u||!i,"data-testid":"button-submit-role",children:u?"Assigning...":"Assign Role"})})]})}export{Ms 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.