1import{r as B,u as N,a as b,j as e}from"./vendor-react-CBLV7qUt.js";import{p as I,l as Q,a as O,u as z,ae as y,e as G,C as j,b as A,c as C,w,d as p,x as X,X as J,q as k,k as R}from"./index-DUM73hpv.js";import{C as W}from"./checkbox-DVpAPdwv.js";import{S as f}from"./skeleton-Co5St8lD.js";import{B as o}from"./badge-D-RE7SRG.js";import{T as Y,a as Z,b as T,c as S}from"./tabs-qhMeX6FP.js";import{S as U,a as ee,b as se,c as ie,d as x}from"./select-Dg2CCArX.js";import{T as L,a as _,b as u,c as r,d as q,e as m}from"./table-CHyys0r6.js";import{L as g}from"./lock-CEbuMXZm.js";import"./index-BdQq_4o_.js";import"./chevron-up-CseyHy4T.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 ae=I("UserCog",[["circle",{cx:"18",cy:"15",r:"3",key:"gjjjvw"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["path",{d:"M10 15H6a4 4 0 0 0-4 4v2",key:"1nfge6"}],["path",{d:"m21.7 16.4-.9-.3",key:"12j9ji"}],["path",{d:"m15.2 13.9-.9-.3",key:"1fdjdi"}],["path",{d:"m16.6 18.7.3-.9",key:"heedtr"}],["path",{d:"m19.1 12.2.3-.9",key:"1af3ki"}],["path",{d:"m19.6 18.7-.4-1",key:"1x9vze"}],["path",{d:"m16.8 12.3-.4-1",key:"vqeiwj"}],["path",{d:"m14.3 16.6 1-.4",key:"1qlj63"}],["path",{d:"m20.7 13.8 1-.4",key:"1v5t8k"}]]);function pe(){const{t:s}=Q(),{toast:c}=O(),{user:t}=z(),[E,H]=B.useState("matrix"),{data:a,isLoading:D}=N({queryKey:["/api/admin/permissions/matrix"]}),{data:h,isLoading:F}=N({queryKey:["/api/admin/permissions/users"],enabled:(t==null?void 0:t.isSuperAdmin)===!0}),v=b({mutationFn:async({roleType:i,permissionKey:n,enabled:d})=>R("PATCH","/api/admin/permissions",{roleType:i,permissionKey:n,enabled:d}),onSuccess:()=>{k.invalidateQueries({queryKey:["/api/admin/permissions/matrix"]}),c({title:s("adminPermissions.permissionUpdated"),description:s("adminPermissions.permissionUpdatedDesc")})},onError:i=>{c({title:s("adminPermissions.error"),description:i.message||s("adminPermissions.updateFailed"),variant:"destructive"})}}),P=b({mutationFn:async({userId:i,adminRole:n})=>R("PATCH",`/api/admin/permissions/users/${i}/role`,{adminRole:n}),onSuccess:()=>{k.invalidateQueries({queryKey:["/api/admin/permissions/users"]}),c({title:s("adminPermissions.userRoleUpdated"),description:s("adminPermissions.userRoleUpdatedDesc")})},onError:i=>{c({title:s("adminPermissions.error"),description:i.message||s("adminPermissions.updateRoleFailed"),variant:"destructive"})}}),K=(i,n,d)=>{a!=null&&a.canEdit&&v.mutate({roleType:n,permissionKey:i,enabled:d})},M=(i,n)=>{const d=n==="none"?null:n;P.mutate({userId:i,adminRole:d})},V=(a==null?void 0:a.permissions.reduce((i,n)=>(i[n.category]||(i[n.category]=[]),i[n.category].push(n),i),{}))||{};return t&&(t.tier==="team"||t.isSuperAdmin||t.adminRole==="teacher_admin"||t.adminRole==="student_admin"||t.adminRole==="agent")?e.jsxs("div",{className:"container mx-auto py-8 px-4 max-w-6xl",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-6",children:[e.jsx(y,{className:"w-8 h-8"}),e.jsxs("div",{children:[e.jsx("h1",{className:"text-3xl font-bold","data-testid":"text-page-title",children:s("adminPermissions.title")}),e.jsx("p",{className:"text-muted-foreground",children:a!=null&&a.canEdit?s("adminPermissions.description"):s("adminPermissions.descriptionViewOnly")})]}),(a==null?void 0:a.canEdit)&&e.jsxs(o,{variant:"default",className:"ml-auto",children:[e.jsx(g,{className:"w-3 h-3 mr-1"}),s("adminPermissions.superAdmin")]})]}),e.jsxs(Y,{value:E,onValueChange:H,children:[e.jsxs(Z,{className:"mb-4",children:[e.jsxs(T,{value:"matrix","data-testid":"tab-matrix",children:[e.jsx(y,{className:"w-4 h-4 mr-2"}),s("adminPermissions.tabs.matrix")]}),(t==null?void 0:t.isSuperAdmin)&&e.jsxs(T,{value:"users","data-testid":"tab-users",children:[e.jsx(G,{className:"w-4 h-4 mr-2"}),s("adminPermissions.tabs.users")]})]}),e.jsx(S,{value:"matrix",children:D?e.jsxs("div",{className:"space-y-4",children:[e.jsx(f,{className:"h-64 w-full"}),e.jsx(f,{className:"h-64 w-full"})]}):e.jsxs("div",{className:"space-y-6",children:[Object.entries(V).map(([i,n])=>e.jsxs(j,{children:[e.jsxs(A,{className:"pb-3",children:[e.jsx(C,{className:"text-lg",children:i}),e.jsx(w,{children:s("adminPermissions.permissionsInCategory",{count:n.length})})]}),e.jsx(p,{children:e.jsx("div",{className:"overflow-x-auto -mx-4 px-4 sm:mx-0 sm:px-0",children:e.jsxs(L,{children:[e.jsx(_,{children:e.jsxs(u,{children:[e.jsx(r,{className:"w-[180px] sm:w-[300px]",children:s("adminPermissions.permissionColumn")}),e.jsx(r,{className:"text-center w-[80px] sm:w-[120px]",children:(a==null?void 0:a.roleLabels.team)||s("adminPermissions.team")}),e.jsx(r,{className:"text-center w-[80px] sm:w-[120px]",children:(a==null?void 0:a.roleLabels.teacher_admin)||s("adminPermissions.teacherAdmin")}),e.jsx(r,{className:"text-center w-[80px] sm:w-[120px]",children:(a==null?void 0:a.roleLabels.student_admin)||s("adminPermissions.studentAdmin")}),e.jsx(r,{className:"text-center w-[80px] sm:w-[120px]",children:(a==null?void 0:a.roleLabels.agent)||s("adminPermissions.agent","Agent")})]})}),e.jsx(q,{className:"text-xs sm:text-sm",children:n.map(d=>e.jsxs(u,{children:[e.jsx(m,{children:e.jsxs("div",{children:[e.jsx("div",{className:"font-medium",children:d.label}),e.jsx("div",{className:"text-xs sm:text-sm text-muted-foreground",children:d.description})]})}),["team","teacher_admin","student_admin","agent"].map(l=>e.jsx(m,{className:"text-center",children:a!=null&&a.canEdit?e.jsx(W,{checked:d.roles[l],onCheckedChange:$=>K(d.key,l,$),disabled:v.isPending,"data-testid":`checkbox-${d.key}-${l}`}):d.roles[l]?e.jsx(X,{className:"w-5 h-5 text-green-500 mx-auto"}
6):e.jsx(J,{className:"w-5 h-5 text-muted-foreground/50 mx-auto"})},l))]},d.key))})]})})})]},i)),e.jsx(j,{className:"border-dashed",children:e.jsx(p,{className:"pt-6",children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(g,{className:"w-5 h-5 text-muted-foreground mt-0.5"}),e.jsxs("div",{children:[e.jsx("p",{className:"font-medium",children:s("adminPermissions.superAdmin")}),e.jsx("p",{className:"text-sm text-muted-foreground",children:s("adminPermissions.superAdminNote")})]})]})})})]})}),(t==null?void 0:t.isSuperAdmin)&&e.jsx(S,{value:"users",children:F?e.jsx(f,{className:"h-64 w-full"}):e.jsxs(j,{children:[e.jsxs(A,{children:[e.jsxs(C,{className:"flex items-center gap-2",children:[e.jsx(ae,{className:"w-5 h-5"}),s("adminPermissions.adminUsers")]}),e.jsx(w,{children:s("adminPermissions.adminUsersDesc")})]}),e.jsx(p,{children:e.jsx("div",{className:"overflow-x-auto -mx-4 px-4 sm:mx-0 sm:px-0",children:e.jsxs(L,{children:[e.jsx(_,{children:e.jsxs(u,{children:[e.jsx(r,{children:s("adminPermissions.userColumn")}),e.jsx(r,{children:s("adminPermissions.globalRoleColumn")}),e.jsx(r,{children:s("adminPermissions.localRoleColumn")}),e.jsx(r,{children:s("adminPermissions.effectiveAccessColumn")})]})}),e.jsx(q,{children:h==null?void 0:h.users.map(i=>e.jsxs(u,{children:[e.jsx(m,{children:e.jsxs("div",{children:[e.jsx("div",{className:"font-medium",children:i.classNickname||i.username||i.email}),e.jsx("div",{className:"text-sm text-muted-foreground",children:i.email})]})}),e.jsx(m,{children:i.tier==="team"?e.jsx(o,{variant:"secondary",children:s("adminPermissions.team")}):e.jsx("span",{className:"text-muted-foreground",children:"-"})}),e.jsx(m,{children:i.isSuperAdmin?e.jsxs(o,{variant:"default",children:[e.jsx(g,{className:"w-3 h-3 mr-1"}),s("adminPermissions.superAdmin")]}):i.id===t.id?e.jsx("span",{className:"text-muted-foreground",children:s("adminPermissions.cannotChangeSelf")}):e.jsxs(U,{value:i.adminRole||"none",onValueChange:n=>M(i.id,n),disabled:P.isPending,children:[e.jsx(ee,{className:"w-[180px]","data-testid":`select-role-${i.id}`,children:e.jsx(se,{})}),e.jsxs(ie,{children:[e.jsx(x,{value:"none",children:s("adminPermissions.noLocalRole")}),e.jsx(x,{value:"teacher_admin",children:s("adminPermissions.teacherAdmin")}),e.jsx(x,{value:"student_admin",children:s("adminPermissions.studentAdmin")}),e.jsx(x,{value:"agent",children:s("adminPermissions.agent","Agent")})]})]})}),e.jsx(m,{children:e.jsxs(o,{variant:i.effectiveRole==="super_admin"?"default":"outline",children:[i.effectiveRole==="super_admin"&&s("adminPermissions.superAdmin"),i.effectiveRole==="team"&&s("adminPermissions.teamGlobal"),i.effectiveRole==="teacher_admin"&&s("adminPermissions.teacherAdmin"),i.effectiveRole==="student_admin"&&s("adminPermissions.studentAdmin"),i.effectiveRole==="agent"&&s("adminPermissions.agent","Agent"),i.effectiveRole==="none"&&s("adminPermissions.noAdminAccess")]})})]},i.id))})]})})})]})})]})]}):e.jsx("div",{className:"container mx-auto py-8 px-4",children:e.jsx("p",{className:"text-center text-muted-foreground",children:s("adminPermissions.accessDenied")})})}export{pe 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.