1import{r as l,K as W,a as $,j as e,S as z,G as u,v as I,o as w,A as B,h as L,g as G,T as t,z as M,i as H,V as A,a1 as K,w as Q,D as U}from"./index-CB1LRsvg.js";import{I as V}from"./IconAlertCircle-BJepXZla.js";import{I as Y}from"./IconInfoCircle-CGxJ5qpI.js";import{I as q}from"./IconSearch-CqQSV7iv.js";import{S as k}from"./StatusText-gwUfW1V-.js";import{u as J}from"./usePageTitle-PP7G01cs.js";import{f as C,a as N,b as D}from"./adminFormat-B7bN5vti.js";import{A as X}from"./Alert-Dvpb9ICu.js";import{S as E}from"./SegmentedControl-B2vw4mHc.js";import{T as i}from"./Table-D4aHVX52.js";import{A as Z}from"./Avatar-BsrwxVRy.js";import{B as c}from"./Badge-CvorhVBt.js";import{T as F}from"./ThemeIcon-DUJfKgY0.js";import{S as ee}from"./Switch-BZSEpu01.js";function se(){const[f,j]=l.useState(null),[n,p]=l.useState(!1),[y,o]=l.useState(null),h=l.useCallback(async()=>{p(!0),o(null);try{const d=await fetch("/v2/users",{credentials:"include"});if(d.status===403){o("You do not have permission to manage users."),j([]);return}if(!d.ok){o(`Failed to load users (${d.status})`),j([]);return}j(await d.json())}catch{o("Network error loading users."),j([])}finally{p(!1)}},[]);l.useEffect(()=>{h()},[h]);const a=l.useCallback(async(d,m)=>{p(!0);try{const g=await fetch(`/v2/users/${d}/site-admin`,{method:"PUT",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({is_site_admin:m})});if(!g.ok){const S=await g.json().catch(()=>({}));return o(S.detail??"Failed to update site admin."),!1}return await h(),!0}catch{return o("Network error updating site admin."),!1}finally{p(!1)}},[h]),b=l.useCallback(async d=>{try{const m=await fetch(`/v2/users/${d}`,{credentials:"include"});return m.ok?await m.json():null}catch{return null}},[]);return{users:f,loading:n,error:y,setSiteAdmin:a,refresh:h,fetchUserDetail:b}}const ae={owner:"blue",member:"gray"};function ge(){J("Site Admin · Users");const{user:f}=W(),{canManageUsers:j}=$(),{users:n,loading:p,error:y,setSiteAdmin:o,fetchUserDetail:h}=se(),[a,b]=l.useState(null),[d,m]=l.useState(!1),[g,S]=l.useState(""),[_,O]=l.useState("all"),[T,P]=l.useState("all"),x=l.useMemo(()=>{if(!n)return null;const s=g.trim().toLowerCase();return n.filter(r=>!(_==="admin"&&!r.is_site_admin||_==="standard"&&r.is_site_admin||T==="accepted"&&!r.tos_accepted_at||T==="pending"&&r.tos_accepted_at||s&&![r.username,r.email,r.company,r.title].filter(Boolean).join(" ").toLowerCase().includes(s)))},[n,g,_,T]),R=async s=>{m(!0),b(null);const r=await h(s);b(r),m(!1)};return e.jsxs(z,{gap:"lg",children:[e.jsxs(u,{gap:"xs",align:"center",children:[e.jsx(I,{order:2,children:"Users"}),e.jsx(w,{label:"Site admins have installation-wide privileges (manage all teams, users, feedback). Standard users have no special site privileges; their capability comes from each team they belong to.",withArrow:!0,multiline:!0,w:360,children:e.jsx(B,{variant:"subtle",color:"gray","aria-label":"About site admin roles",children:e.jsx(Y,{size:16,"aria-hidden":!0})})})]}),y&&e.jsx(X,{icon:e.jsx(V,{size:16,"aria-hidden":!0}),color:"red",children:y}),p&&!n&&e.jsx(u,{justify:"center",py:"xl",role:"status","aria-label":"Loading users",children:e.jsx(L,{size:"sm"})}),n&&n.length>0&&e.jsxs(u,{gap:"sm",wrap:"wrap",align:"flex-end",children:[e.jsx(G,{"aria-label":"Search users",placeholder:"Search by name, email, company...",value:g,onChange:s=>S(s.currentTarget.value),leftSection:e.jsx(q,{size:14,"aria-hidden":!0}),size:"xs",w:260}),e.jsxs("div",{children:[e.jsx(t,{size:"xs",c:"dimmed",mb:4,children:"Site admin"}),e.jsx(E,{"aria-label":"Site admin",size:"xs",value:_,onChange:O,data:[{value:"all",label:"All"},{value:"admin",label:"Admins"},{value:"standard",label:"Standard"}]})]}),e.jsxs("div",{children:[e.jsx(t,{size:"xs",c:"dimmed",mb:4,children:"Terms"}),e.jsx(E,{"aria-label":"Terms",size:"xs",value:T,onChange:P,data:[{value:"all",label:"All"},{value:"accepted",label:"Accepted"},{value:"pending",label:"Pending"}]})]}),e.jsxs(k,{size:"xs",c:"dimmed",ml:"auto",children:[(x==null?void 0:x.length)??0," of ",n.length]})]}),n&&n.length>0&&e.jsx(i.ScrollContainer,{minWidth:880,children:e.jsxs(i,{striped:!0,highlightOnHover:!0,"aria-label":"Users",children:[e.jsx(i.Thead,{children:e.jsxs(i.Tr,{children:[e.jsx(i.Th,{children:"Username"}),e.jsx(i.Th,{children:"Groups"}),e.jsx(i.Th,{ta:"center",w:60,children:"Terms"}),e.jsx(i.Th,{w:120,children:"Last login"}),e.jsx(i.Th,{w:140,children:"Site admin"})]})}),e.jsx(i.Tbody,{children:(x??[]).map(s=>{const r=s.id===(f==null?void 0:f.id);return e.jsxs(i.Tr,{children:[e.jsx(i.Td,{children:e.jsxs(u,{gap:"xs",wrap:"nowrap",children:[e.jsx(Z,{name:s.username,size:"sm",radiu
1s:"xl"}),e.jsx(M,{component:"button",type:"button",size:"sm",onClick:()=>R(s.id),style:{cursor:"pointer"},children:s.username}),r&&e.jsx(c,{size:"xs",variant:"light",color:"gray",children:"you"})]})}),e.jsx(i.Td,{children:e.jsx(u,{gap:4,wrap:"wrap",children:s.groups.length===0?e.jsx(t,{size:"xs",c:"dimmed",children:"â"}):s.groups.map(v=>e.jsx(c,{size:"sm",variant:"light",color:"gray",children:v.name},v.id))})}),e.jsx(i.Td,{ta:"center",children:s.tos_accepted_at?e.jsxs(F,{color:"green",size:20,radius:"xl",variant:"light",title:`Accepted ${C(s.tos_accepted_at)}`,children:[e.jsx(H,{size:12,"aria-hidden":!0}),e.jsxs(A,{children:["Accepted ",C(s.tos_accepted_at)]})]}):e.jsxs(F,{color:"red",size:20,radius:"xl",variant:"light",title:"Not accepted",children:[e.jsx(K,{size:12,"aria-hidden":!0}),e.jsx(A,{children:"Not accepted"})]})}),e.jsx(i.Td,{children:s.last_login_at?e.jsx(w,{label:D(s.last_login_at),withArrow:!0,children:e.jsx(t,{size:"xs",tabIndex:0,children:N(s.last_login_at)})}):e.jsx(t,{size:"xs",c:"dimmed",children:"Never"})}),e.jsx(i.Td,{children:r||!j?e.jsxs(z,{gap:2,align:"flex-start",children:[s.is_site_admin?e.jsx(c,{color:"blue",variant:"light",children:"Admin"}):e.jsxs(t,{size:"xs",c:"dimmed",children:["â",e.jsx(A,{children:"Standard"})]}),r&&e.jsx(t,{size:"xs",c:"dimmed",children:"You can't change your own status"})]}):e.jsx(ee,{checked:s.is_site_admin,onChange:v=>o(s.id,v.currentTarget.checked),size:"sm","aria-label":`Site admin for ${s.username}`,label:s.is_site_admin?"Admin":"Standard"})})]},s.id)})})]})}),n&&n.length>0&&(x==null?void 0:x.length)===0&&e.jsx(k,{size:"sm",c:"dimmed",ta:"center",py:"md",children:"No users match the current filters."}),e.jsxs(Q,{size:"auto",opened:d||!!a,onClose:()=>{b(null),m(!1)},title:a?[a.first_name,a.last_name].filter(Boolean).join(" ")||a.username:"Loading...",children:[d&&!a&&e.jsx(u,{justify:"center",py:"xl",role:"status","aria-label":"Loading user details",children:e.jsx(L,{size:"sm"})}),a&&e.jsxs(z,{gap:"md",miw:{base:"auto",sm:560},children:[e.jsxs("div",{children:[(a.first_name||a.last_name)&&e.jsx(t,{size:"sm",c:"dimmed",children:a.username}),a.title&&e.jsx(t,{size:"sm",c:"dimmed",children:a.title}),a.company&&e.jsx(t,{size:"sm",c:"dimmed",children:a.company}),a.email&&e.jsx(t,{size:"sm",c:"dimmed",children:a.email})]}),e.jsx(U,{}),e.jsxs(u,{gap:"lg",children:[e.jsxs("div",{children:[e.jsx(t,{size:"xs",c:"dimmed",mb:4,children:"Site admin"}),a.is_site_admin?e.jsx(c,{color:"blue",variant:"light",children:"Admin"}):e.jsx(c,{color:"gray",variant:"light",children:"Standard"})]}),e.jsxs("div",{children:[e.jsx(t,{size:"xs",c:"dimmed",mb:4,children:"Terms accepted"}),a.tos_accepted_at?e.jsx(c,{color:"green",variant:"light",children:C(a.tos_accepted_at)}):e.jsx(c,{color:"red",variant:"light",children:"Not accepted"})]}),e.jsxs("div",{children:[e.jsx(t,{size:"xs",c:"dimmed",mb:4,children:"Last login"}),a.last_login_at?e.jsx(w,{label:D(a.last_login_at),withArrow:!0,children:e.jsx(c,{color:"gray",variant:"light",tabIndex:0,children:N(a.last_login_at)})}):e.jsx(c,{color:"gray",variant:"light",children:"Never"})]})]}),e.jsx(U,{}),e.jsxs("div",{children:[e.jsx(I,{order:3,mb:"xs",children:"Workspaces"}),a.workspaces.length===0?e.jsx(k,{size:"sm",c:"dimmed",children:"No workspace memberships."}):e.jsxs(i,{striped:!0,"aria-label":"Workspaces",children:[e.jsx(i.Thead,{children:e.jsxs(i.Tr,{children:[e.jsx(i.Th,{children:"Workspace"}),e.jsx(i.Th,{w:120,children:"Role"})]})}),e.jsx(i.Tbody,{children:a.workspaces.map(s=>e.jsxs(i.Tr,{children:[e.jsx(i.Td,{children:s.name}),e.jsx(i.Td,{children:e.jsx(c,{size:"sm",variant:"light",color:ae[s.role]??"gray",children:s.role})})]},s.id))})]})]})]})]})]})}export{ge as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.