1import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{a as d}from"./index-BOFepIoo.js";import{j as U,a as O,B as g,q as N,I as Q,z as M,m as B,E as H,F as S,A as K,H as Y}from"./AppRouter-BZy88VzR.js";import{u as z}from"./useSuspenseQuery-DAf-mZj3.js";import{u as w}from"./utils-CjpktROR.js";import{R as G}from"./RowActions-CKZYiR8u.js";import{L as T}from"./LoadingOverlay-B0imrsC4.js";import{D as J}from"./DeleteIcon-DBS-HxKs.js";import{C as V}from"./Card-DJSQZwwX.js";import{A as W}from"./Alert-B3SzZIai.js";import"./lib-vye-0uEl.js";import"./DashboardConfigContext-BjZhgoRF.js";import"./index-DsYStbZt.js";import"./bundle-mjs-C6Cmh_M-.js";import"./ErrorFallback-vy0iYigB.js";import"./ErrorBoundary-rGAtuFEK.js";import"./useBaseQuery--CRDVBp_.js";const $=d.createContext(void 0),X=({siteKey:s,dashboardConfig:a,children:t})=>{const[n,r]=d.useState(),[u,l]=d.useState("READONLY"),[i,m]=d.useState("");return e.jsx($.Provider,{value:{siteKey:s,dashboardConfig:a,features:n,setFeatures:r,permissionLevel:u,setPermissionLevel:l,currentUserEmail:i,setCurrentUserEmail:m},children:t})},_=()=>{const s=d.useContext($);if(s===void 0)throw new Error("useUserManagementContext must be used within a UserManagementProvider");return s},Z={PASSWORD_CHANGE:"Password Change",READONLY:"Read Only",LIMITED_USER:"Limited User",USER:"User",ADMIN:"Admin",SUPERADMIN:"Super Admin"},A=s=>Z[s]||s,ee=["READONLY","LIMITED_USER","USER","ADMIN"],se=(s,a,t)=>(s==="ADMIN"||s==="SUPERADMIN")&&!(a===t),te=s=>s==="ADMIN"||s==="SUPERADMIN",ae=(s,a,t)=>t==="SUPERADMIN"&&s!==a,re=async s=>{try{return(await U.get(`/admin/sites/${s}/permissions`)).data}catch{throw new Error("Failed to fetch users")}},ne=async(s,a)=>(await U.post(`/admin/sites/${s}/users`,{email:a})).data,ie=async(s,a,t)=>{try{await U.post(`/admin/sites/${s}/permissions/${a}`,{level:t})}catch{throw new Error("Failed to change user role")}},le=async(s,a)=>{try{await U.delete(`/admin/sites/${s}/permissions/${a}`)}catch{throw new Error("Failed to delete user")}},C={fetchUsers:re,addUser:ne,changeRole:ie,deleteUser:le},oe=s=>z({queryKey:["userManagement","users",s],queryFn:()=>C.fetchUsers(s),staleTime:0}),de=()=>{const[s,a]=d.useState(!1),[t,n]=d.useState(null),r=w();return{addUser:async(i,m)=>{var h;a(!0),n(null);try{const x=await C.addUser(i,m);return await r.invalidateQueries({queryKey:["userManagement","users",i]}),x}catch(x){throw O.isAxiosError(x)&&((h=x.response)==null?void 0:h.status)===409?n("User already exists for this index"):n("Failed to add user"),x}finally{a(!1)}},isLoading:s,error:t,reset:()=>{n(null),a(!1)}}},ce=()=>{const[s,a]=d.useState(!1),[t,n]=d.useState(null),r=w();return{changeRole:async(l,i,m)=>{a(!0),n(null);try{await C.changeRole(l,i,m),await r.invalidateQueries({queryKey:["userManagement","users",l]})}catch(h){throw n("Failed to change user role"),h}finally{a(!1)}},isLoading:s,error:t}},ue=()=>{const[s,a]=d.useState(!1),[t,n]=d.useState(null),r=w();return{deleteUser:async(l,i)=>{a(!0),n(null);try{await C.deleteUser(l,i),await r.invalidateQueries({queryKey:["userManagement","users",l]})}catch(m){throw n("Failed to delete user"),m}finally{a(!1)}},isLoading:s,error:t}},me=({visible:s,siteName:a,onHide:t,onAddUser:n,isLoading:r,error:u})=>{const[l,i]=d.useState(""),[m,h]=d.useState(null),x=p=>/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(p),f=async()=>{if(!l.trim()){h("Email is required");return}if(!x(l)){h("Please enter a valid email address");return}h(null);try{await n(l),i(""),t()}catch{}},c=()=>{i(""),h(null),t()},E=e.jsxs("div",{className:"flex justify-end gap-2 pt-4",children:[e.jsx(g,{buttonStyle:"neutral",onClick:c,dataTestId:"cancel-add-user",children:"Cancel"}),e.jsx(g,{onClick:()=>{f()},disabled:r||!l.trim(),dataTestId:"confirm-add-user",children:r?"Adding...":"OK"})]});return e.jsx(N,{title:`Add user to ${a}`,open:s,onClose:c,footer:E,width:"md","data-testid":"add-user-dialog",children:e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx("label",{htmlFor:"add-user-email",className:"text-sm font-medium",children:"Email address"}
1),e.jsx(Q,{id:"add-user-email",type:"email",placeholder:"Enter email address",value:l,onChange:p=>{i(p.target.value),h(null)},onKeyDown:p=>{p.key==="Enter"&&f()},ariaLabel:"User email","data-testid":"add-user-email-input"}),(m||u)&&e.jsx("p",{className:"text-destructive text-sm","data-testid":"add-user-error",children:m||u})]})})},he=({visible:s,userEmail:a,currentRole:t,hasFeatures1Hidden:n,onHide:r,onChangeRole:u,isLoading:l})=>{const[i,m]=d.useState(t),h=async()=>{if(i!==t)try{await u(i),r()}catch{}},x=ee.filter(c=>!(c==="LIMITED_USER"&&!n)),f=e.jsxs("div",{className:"flex justify-end gap-2 pt-4",children:[e.jsx(g,{buttonStyle:"neutral",onClick:r,dataTestId:"cancel-change-role",children:"Cancel"}),e.jsx(g,{onClick:()=>{h()},disabled:l||i===t,dataTestId:"confirm-change-role",children:l?"Changing...":`Change role to ${A(i)}`})]});return e.jsx(N,{title:"Select new role for user",open:s,onClose:r,footer:f,width:"md","data-testid":"change-role-dialog",children:e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx("p",{className:"text-sm text-text-secondary mb-2",children:a}),x.map(c=>e.jsxs("label",{className:`flex items-center gap-3 p-3 rounded-md border cursor-pointer ${i===c?"border-primary bg-destructive-light":"border-border-default hover:border-border-strong"} ${c===t?"opacity-50":""}`,"data-testid":`role-option-${c}`,children:[e.jsx("input",{type:"radio",name:"user-role",value:c,checked:i===c,disabled:c===t,onChange:()=>m(c),className:"accent-primary"}),e.jsx("span",{className:"text-sm font-medium",children:A(c)}),c===t&&e.jsx("span",{className:"text-xs text-text-tertiary ml-auto",children:"(current)"})]},c))]})})},xe=({visible:s,userEmail:a,onHide:t,onConfirm:n,isLoading:r})=>{const u=async()=>{try{await n(),t()}catch{}},l=e.jsxs("div",{className:"flex justify-end gap-2 pt-4",children:[e.jsx(g,{buttonStyle:"neutral",onClick:t,dataTestId:"cancel-delete-user",children:"Cancel"}),e.jsx(g,{onClick:()=>{u()},disabled:r,dataTestId:"confirm-delete-user",children:r?"Removing...":"Continue"})]});return e.jsx(N,{title:"Are you sure?",open:s,onClose:t,footer:l,width:"md","data-testid":"confirm-delete-dialog",children:e.jsxs("p",{className:"text-sm text-text-secondary",children:["Are you sure you want to remove ",e.jsx("strong",{children:a})," from this index?"]})})},fe=({numUsersLimit:s,hasFeatures1Hidden:a})=>{const{siteKey:t,permissionLevel:n,currentUserEmail:r}=_(),{currentSite:u}=M(),{data:l}=oe(t),{addUser:i,isLoading:m,error:h,reset:x}=de(),{changeRole:f,isLoading:c}=ce(),{deleteUser:E,isLoading:p}=ue(),[R,D]=d.useState(!1),[y,I]=d.useState(null),[j,L]=d.useState(null),v=l.filter(o=>!ae(r,o.user.email,o.level)),k=te(n)&&v.length<s,F=async o=>{const b=await i(t,o);S("Users: Teammate Added",t,{invited_user_id:b.uid})},P=async o=>{y&&(await f(t,y.uid,o),S("Users: Role Changed",t,{new_role:o,previous_role:y.currentRole}))},q=async()=>{j&&(await E(t,j.uid),S("Users: Teammate Deleted",t,{removed_user_id:j.uid}))};return e.jsxs("div",{children:[e.jsxs("div",{className:"flex justify-between items-center mb-4",children:[e.jsxs("div",{className:"text-body-sm text-text-secondary",children:[v.length," user",v.length!==1?"s":"",s>0&&` (max ${s})`]}),e.jsx(g,{onClick:()=>{x(),D(!0)},disabled:!k,dataTestId:"add-user-button",size:"small",children:"Add new user"})]}),e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-body-sm","data-testid":"users-table",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-border-default",children:[e.jsx("th",{className:"text-left py-3 px-4 text-table-header text-text-secondary",children:"Email"}),e.jsx("th",{className:"text-left py-3 px-4 text-table-header text-text-secondary",children:"Role"}),e.jsx("th",{className:"text-left py-3 px-4 text-table-header text-text-secondary",children:"Actions"})]})}),e.jsx("tbody",{children:v.map(o=>{const b=se(n,r,o.user.email);return e.jsxs("tr",{className:"border-b border-border-default hover:bg-bg-surface-hover","data-testid":`user-row-${o.user.uid}`,children:[e.jsx("td",{className:"py-3 px-4",children:o.user.email}),e.jsx("td",{className:"py-3 px-4",children:A(o.level)}),e.jsx("td",{className:"py-3 px-4",children:e.jsxs(G,{children:[e.jsx(g,{buttonStyle:"link",size:"small",disabled:!b,onClick:()=>I({email:o.user.email,uid:o.user.uid,currentRole:o.level}),dataTestId:`change-role-${o.user.uid}`,children:"Change role"}),e.jsx(B,{icon:e.jsx(J,{className:"w-3.5 h-3.5 fill-current"}),variant:"destructive",disabled:!b,onClick:()=>L({email:o.user.email,uid:o.user.uid}),"data-testid":`delete-user-${o.user.uid}`,"aria-label":`Delete user ${o.user.email}`})]})})]},o.user.uid)})})]})}),e.jsx(me,{visible:R,siteName:u?H(u):t,onHide:()=>D(!1),onAddUser:F,isLoading:m,error:h}),y&&e.jsx(he,{visible:!0,userEmail:y.email,currentRole:y.currentRole,hasFeatures1Hidden:a,onHide:()=>I(null),onChangeRole:P,isLoading:c}),j&&e.jsx(xe,{visible:!0,userEmail:j.email,onHide:()=>L(null),onConfirm:q,isLoading:p})]})},ge=({numUsersLimit:s,hasFeatures1Hidden:a})=>e.jsx(d.Suspense,{fallback:e.jsx(T,{}),children:e.jsx(fe,{numUsersLimit:s,hasFeatures1Hidden:a})}),pe=()=>{const{features:s,setFeatures:a,setPermissionLevel:t,setCurrentUserEmail:n}=_(),r=M();if(d.useEffect(()=>{r.features&&a&&a(r.features)}
1,[r.features,a]),d.useEffect(()=>{r.permissionLevel&&t&&t(r.permissionLevel)},[r.permissionLevel,t]),d.useEffect(()=>{var i,m,h;try{const x=localStorage.getItem(K);if(x){const f=JSON.parse(x),c=(h=(m=(i=f==null?void 0:f._embedded)==null?void 0:i.accounts)==null?void 0:m[0])==null?void 0:h.email;c&&n&&n(c)}}catch{}},[n]),s===void 0)return e.jsx(T,{});const u=s["settings.num_users"]||0,l=u>0&&s["settings.num_users"]!==void 0;return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsxs("div",{children:[e.jsx(Y,{level:"page",className:"mb-2",children:"Users"}),e.jsx("p",{className:"text-body-sm text-text-secondary",children:"Manage users who have access to this search index. Add new users, change roles, or remove access."})]}),e.jsx(V,{children:e.jsx(ge,{numUsersLimit:u,hasFeatures1Hidden:l})}),e.jsxs(W,{type:"info",children:["Learn more about user roles and permissions in our"," ",e.jsx("a",{href:"https://www.addsearch.com/docs/account/team-management/",target:"_blank",rel:"noopener noreferrer",className:"underline",children:"documentation"}),"."]})]})},$e=({siteKey:s,dashboardConfig:a})=>e.jsx(X,{siteKey:s,dashboardConfig:a,children:e.jsx(pe,{})});export{$e 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.