PageSourceSearch

https://app.empcloud.com/assets/RolesPage-CVpAOAua.js

js empcloud.com collected 2026-10-07 12:09:42 UTC 14,458 bytes, 1 lines download raw bytes

1import{u as R,A as H,r as h,y as P,D,x as S,j as e,S as X,f as T,w as Y,X as I,K as J,$ as U,o as W}from"./index-DtV7Ae65.js";import{P as Z}from"./plus-yYnZB84O.js";import{L as ee}from"./lock-DeoFK8fx.js";import{P as te}from"./pencil-I0queqJh.js";import{T as O}from"./trash-2-Cfyq2gqh.js";import{C as se}from"./check-CiUtfYAm.js";import{T as re}from"./triangle-alert-DIZpYAsU.js";const E={org_admin:"Org Admin",hr_admin:"HR Admin",manager:"Manager",employee:"Employee"};function ue(){const{t:a}=R(),s=(t,y)=>a(`roles.page.${t}`,{}),c=t=>t.type===0?a(`roles.${t.name}`,{defaultValue:E[t.name]||t.name}):t.name,u=t=>t.type===0?a(`roles.descriptions.${t.name}`,{defaultValue:t.description??""}):t.description,p=H(),[m,n]=h.useState(null),[i,d]=h.useState(null),{data:g=[],isLoading:f}=P({queryKey:["roles-list"],queryFn:()=>S.get("/roles").then(t=>{var y;return((y=t.data)==null?void 0:y.data)??[]})}),{data:j}=P({queryKey:["roles-permissions-catalogue"],queryFn:()=>S.get("/roles/permissions").then(t=>{var y;return(y=t.data)==null?void 0:y.data})}),b=D({mutationFn:t=>S.delete(`/roles/${t}`),onSuccess:()=>{p.invalidateQueries({queryKey:["roles-list"]}),d(null)}}),w=g.filter(t=>t.type===0),N=g.filter(t=>t.type===1);return e.jsxs("div",{className:"p-6",children:[e.jsxs("div",{className:"flex items-center justify-between mb-6",children:[e.jsxs("div",{children:[e.jsxs("h1",{className:"text-xl font-semibold tracking-tight text-foreground flex items-center gap-2",children:[e.jsx(X,{className:"h-6 w-6 text-brand-600 dark:text-brand-400"}),s("title")]}),e.jsx("p",{className:"text-[13px] text-muted-foreground mt-0.5",children:s("subtitle")})]}),e.jsxs("button",{type:"button",onClick:()=>n({role:null,mode:"create"}),className:"flex items-center gap-2 bg-brand-600 text-white px-4 py-2 rounded-md text-[13px] font-medium hover:bg-brand-700",children:[e.jsx(Z,{className:"h-4 w-4"})," ",s("newCustomRole")]})]}),e.jsx(z,{icon:e.jsx(ee,{className:"h-4 w-4"}),title:s("systemRolesTitle"),subtitle:s("systemRolesSubtitle")}),f?e.jsxs("div",{className:"flex items-center gap-2 text-muted-foreground text-[13px] py-6",children:[e.jsx(T,{className:"h-4 w-4 animate-spin"})," ",s("loadingRoles")]}):e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-3 mb-8",children:[w.length===0&&e.jsx("p",{className:"text-[13px] text-muted-foreground col-span-2",children:s("noSystemRoles")}),w.map(t=>e.jsx(q,{role:t,displayName:c(t),displayDescription:u(t),isCustomized:t.organization_id!==null,onEdit:()=>n({role:t,mode:"edit"}),onReset:t.organization_id!==null?()=>d(t):void 0},`sys-${t.id}`))]}),e.jsx(z,{icon:e.jsx(Y,{className:"h-4 w-4"}),title:s("customRolesTitle"),subtitle:s("customRolesSubtitle")}),N.length===0?e.jsxs("div",{className:"border border-dashed border-border rounded-lg p-4 text-center text-[13px] text-muted-foreground",children:[s("noCustomRolesPrefix")," ",e.jsx("button",{onClick:()=>n({role:null,mode:"create"}),className:"text-brand-600 dark:text-brand-400 hover:underline font-medium",children:s("noCustomRolesCreateOne")})," ",s("noCustomRolesSuffix")]}):e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-3",children:N.map(t=>e.jsx(q,{role:t,displayName:c(t),displayDescription:u(t),onEdit:()=>n({role:t,mode:"edit"}),onDelete:()=>d(t)},`custom-${t.id}`))}),m&&j&&e.jsx(ne,{mode:m.mode,role:m.role,catalogue:j,onClose:()=>n(null),onSaved:()=>{p.invalidateQueries({queryKey:["roles-list"]}),n(null)}}),i&&e.jsx(ae,{role:i,isPending:b.isPending,onConfirm:()=>b.mutate(i.id),onCancel:()=>d(null),error:b.isError?M(b.error):null})]})}function z({icon:a,title:s,subtitle:c}){return e.jsxs("div",{className:"mb-3",children:[e.jsxs("h2",{className:"text-[13px] font-semibold text-muted-foreground flex items-center gap-2",children:[a," ",s]}),e.jsx("p",{className:"text-[11px] text-muted-foreground mt-0.5 tabular-nums",children:c})]})}function q({role:a,displayName:s,displayDescription:c,isCustomized:u,onEdit:p,onDelete:m,onReset:n}){const{t:i}
1=R(),d=(f,j)=>i(`roles.page.${f}`,j??{}),g=a.type===0;return e.jsx("div",{className:"border border-border rounded-lg bg-card p-4 hover:border-brand-500 dark:hover:border-brand-400 transition-colors duration-150",children:e.jsxs("div",{className:"flex items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[e.jsx("h3",{className:"font-semibold text-foreground truncate",children:s}),g&&e.jsx("span",{className:"text-[10px] font-semibold uppercase tracking-wide bg-muted text-muted-foreground px-1.5 py-0.5 rounded",children:d("badgeSystem")}),u&&e.jsx("span",{title:d("badgeCustomizedTooltip"),className:"text-[10px] font-semibold uppercase tracking-wide bg-amber-100 dark:bg-amber-950/40 text-amber-700 dark:text-amber-300 px-1.5 py-0.5 rounded",children:d("badgeCustomized")})]}),c&&e.jsx("p",{className:"text-[11px] text-muted-foreground mt-1 line-clamp-2",children:c}),e.jsx("p",{className:"text-[11px] text-muted-foreground mt-2 tabular-nums",children:d("permissionsCount",{count:a.permissions.length})})]}),e.jsxs("div",{className:"flex flex-col items-end gap-1",children:[e.jsx("button",{type:"button",onClick:p,className:"p-1.5 text-muted-foreground hover:text-brand-600 dark:hover:text-brand-400 hover:bg-brand-50 dark:hover:bg-brand-950/40 rounded",title:d("editRoleTooltip"),children:e.jsx(te,{className:"h-4 w-4"})}),m&&e.jsx("button",{type:"button",onClick:m,className:"p-1.5 text-muted-foreground hover:text-red-600 dark:hover:text-red-400 hover:bg-red-50 dark:hover:bg-red-950/40 rounded",title:d("deleteRoleTooltip"),children:e.jsx(O,{className:"h-4 w-4"})}),n&&e.jsx("button",{type:"button",onClick:n,className:"p-1.5 text-muted-foreground hover:text-amber-600 dark:hover:text-amber-400 hover:bg-amber-50 dark:hover:bg-amber-950/40 rounded",title:d("resetRoleTooltip"),children:e.jsx(O,{className:"h-4 w-4"})})]})]})})}function ne({mode:a,role:s,catalogue:c,onClose:u,onSaved:p}){const{t:m}=R(),n=(r,o)=>m(`roles.page.${r}`,o??{}),i=(s==null?void 0:s.type)===0,[d,g]=h.useState((s==null?void 0:s.name)||""),[f,j]=h.useState((s==null?void 0:s.description)||""),[b,w]=h.useState(new Set((s==null?void 0:s.permissions)||[])),[N,t]=h.useState(""),[y,B]=h.useState(()=>new Set(Object.keys(c.grouped).slice(0,3))),C=D({mutationFn:r=>a==="edit"&&s?S.put(`/roles/${s.id}`,r).then(o=>o.data):S.post("/roles",r).then(o=>o.data),onSuccess:()=>p()}),$=h.useMemo(()=>Object.entries(c.grouped),[c]),L=h.useMemo(()=>{const r=N.trim().toLowerCase();return r?$.map(([o,l])=>[o,l.filter(v=>v.key.toLowerCase().includes(r)||v.label.toLowerCase().includes(r)||v.description.toLowerCase().includes(r))]).filter(([,o])=>o.length>0):$},[$,N]),_=r=>{w(o=>{const l=new Set(o);return l.has(r)?l.delete(r):l.add(r),l})},A=r=>{w(o=>{const l=new Set(o);return r.every(k=>l.has(k.key))?r.forEach(k=>l.delete(k.key)):r.forEach(k=>l.add(k.key)),l})},G=r=>{B(o=>{const l=new Set(o);return l.has(r)?l.delete(r):l.add(r),l})},K=()=>{d.trim()&&C.mutate({name:d.trim(),description:f.trim()||null,permissions:[...b]})},F=b.size,Q=c.permissions.length;return e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/40 p-4",children:e.jsxs("div",{className:"bg-card rounded-2xl shadow-2xl w-full max-w-3xl max-h-[90vh] flex flex-col",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-border px-6 py-4",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("h2",{className:"text-lg font-semibold text-foreground",children:n(a==="create"?"createCustomRoleTitle":i?"editSystemRoleTitle":"editRoleTitle")}),e.jsx("p",{className:"text-[11px] text-muted-foreground mt-0.5 tabular-nums",children:n("permissionsSelected",{selected:F,total:Q})})]}),e.jsx("button",{type:"button",onClick:u,className:"p-2 text-muted-foreground hover:text-foreground hover:bg-muted rounded",children:e.jsx(I,{className:"h-5 w-5"})})]}),e.jsxs("div",{className:"flex-1 overflow-y-auto px-6 py-4 space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsxs("label",{className:"block text-[13px] font-medium text-muted-foreground mb-1",children:[n("roleNameLabel"),i&&e.jsx("span",{className:"text-[11px] font-normal text-muted-foreground ml-2",children:n("roleNameLocked")})]}),e.jsx("input",{type:"text",value:i?m(`roles.${d}`,{defaultValue:E[d]||d}):d,onChange:r=>g(r.target.value),disabled:i,placeholder:n("roleNamePlaceholder"),className:`w-full border border-border rounded-md px-3 py-2 text-[13px] focus:ring-2 focus:ring-brand-500 ${i?"bg-muted text-muted-foreground cursor-not-allowed":"bg-card text-foreground"}`})]}),e.jsxs("div",{children:[e.jsxs("label",{className:"block text-[13px] font-medium text-muted-foreground mb-1",children:[n("descriptionLabel")," ",e.jsx("span",{className:"text-[11px] font-normal text-muted-foreground",children:n("descriptionOptional")})]}),e.jsx("input",{type:"text",value:f,onChange:r=>j(r.target.value),placeholder:n("descriptionPlaceholder"),className:"w-full border border-border rounded-md px-3 py-2 text-[13px] focus:ring-2 focus:ring-brand-500 bg-card text-foreground"})]})]}),e.jsxs("div",{className:"relative",children:[e.jsx(J,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground"}),e.jsx("input",{type:"text",value:N,onChange:r=>t(r.target.value),placeholder:n("searchPermissionsPlaceholder"),className:"bg-card text-foreground w-full pl-10 pr-4 py-2 border border-border rounded-md text-[13px] focus:ring-2 focus:ring-brand-500"})]}),e.jsxs("div",{className:"border border-border rounded-lg divide-y divide-border",children:[L.length===0&&e.jsx("div",{className:"px-4 py-6 text-center text-[13px] text-muted-foreground",children:n("noPermissionsMatch",{query:N})}),L.map(([r,o])=>{const l=y.has(r)||N.trim().length>0,v=o.filter(x=>b.has(x.key)).length,k=v===o.length,V=v>0&&!k;return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-2 px-3 py-2.5 bg-muted hover:bg-muted-foreground
1/10 transition-colors",children:[e.jsx("button",{type:"button",onClick:()=>G(r),className:"text-muted-foreground hover:text-foreground",children:l?e.jsx(U,{className:"h-4 w-4"}):e.jsx(W,{className:"h-4 w-4"})}),e.jsx("input",{type:"checkbox",checked:k,ref:x=>{x&&(x.indeterminate=V)},onChange:()=>A(o),className:"accent-brand-600"}),e.jsx("span",{className:"font-medium text-[13px] text-foreground flex-1",children:r}),e.jsxs("span",{className:"text-[11px] text-muted-foreground tabular-nums",children:[v," / ",o.length]})]}),l&&e.jsx("div",{className:"divide-y divide-border",children:o.map(x=>e.jsxs("label",{className:"flex items-start gap-3 px-3 py-2 hover:bg-brand-50/40 dark:hover:bg-brand-950/30 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:b.has(x.key),onChange:()=>_(x.key),className:"mt-0.5 accent-brand-600"}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-[13px] text-foreground",children:x.label}),e.jsx("span",{className:"text-[10px] font-mono text-muted-foreground",children:x.key}),x.scope&&e.jsx("span",{className:`text-[10px] font-semibold uppercase px-1 py-0.5 rounded ${x.scope==="all"?"bg-red-50 dark:bg-red-950/40 text-red-600 dark:text-red-400":x.scope==="team"?"bg-amber-50 dark:bg-amber-950/40 text-amber-700 dark:text-amber-300":"bg-muted text-muted-foreground"}`,children:x.scope})]}),e.jsx("p",{className:"text-[11px] text-muted-foreground",children:x.description})]})]},x.key))})]},r)})]})]}),e.jsxs("div",{className:"border-t border-border px-6 py-3 flex items-center justify-between gap-3",children:[C.isError&&e.jsx("span",{className:"text-[11px] text-red-600 dark:text-red-400",children:M(C.error)}),e.jsxs("div",{className:"ml-auto flex items-center gap-2",children:[e.jsx("button",{type:"button",onClick:u,className:"px-4 py-2 text-[13px] font-medium text-muted-foreground border border-border rounded-md hover:bg-muted",children:m("common.cancel")}),e.jsxs("button",{type:"button",onClick:K,disabled:!d.trim()||C.isPending,className:"px-4 py-2 text-[13px] font-medium text-white bg-brand-600 rounded-md hover:bg-brand-700 disabled:opacity-50 flex items-center gap-2",children:[C.isPending?e.jsx(T,{className:"h-4 w-4 animate-spin"}):e.jsx(se,{className:"h-4 w-4"}),n(a==="create"?"createRoleButton":"saveChanges")]})]})]})]})})}function ae({role:a,isPending:s,onConfirm:c,onCancel:u,error:p}){const{t:m}=R(),n=(b,w)=>m(`roles.page.${b}`,w??{}),i=a.type===0&&a.organization_id!==null,d=a.type===0?m(`roles.${a.name}`,{defaultValue:E[a.name]||a.name}):a.name,g=n(i?"resetTitle":"deleteTitle"),f=n(i?"resetButton":"deleteButton"),j=i?n("resetBody",{name:d}):n("deleteBody",{name:d});return e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/40 p-4",children:e.jsxs("div",{className:"bg-card rounded-2xl shadow-2xl w-full max-w-md",children:[e.jsxs("div",{className:"px-6 py-5",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-3",children:[e.jsx("div",{className:`w-10 h-10 rounded-xl flex items-center justify-center ${i?"bg-amber-50 dark:bg-amber-950/40":"bg-red-50 dark:bg-red-950/40"}`,children:e.jsx(re,{className:`h-5 w-5 ${i?"text-amber-600 dark:text-amber-400":"text-red-600 dark:text-red-400"}`})}),e.jsx("h3",{className:"text-lg font-semibold text-foreground",children:g})]}),e.jsx("p",{className:"text-[13px] text-muted-foreground",children:j}),p&&e.jsx("p",{className:"text-[13px] text-red-600 dark:text-red-400 mt-3",children:p})]}),e.jsxs("div",{className:"flex justify-end gap-2 px-6 py-3 border-t border-border",children:[e.jsx("button",{type:"button",onClick:u,className:"px-4 py-2 text-[13px] font-medium text-muted-foreground border border-border rounded-md hover:bg-muted",children:m("common.cancel")}),e.jsxs("button",{type:"button",onClick:c,disabled:s,className:`px-4 py-2 text-[13px] font-medium text-white rounded-md disabled:opacity-50 flex items-center gap-2 ${i?"bg-amber-600 hover:bg-amber-700":"bg-red-600 hover:bg-red-700"}`,children:[s&&e.jsx(T,{className:"h-4 w-4 animate-spin"}),f]})]})]})})}function M(a){var s,c,u,p,m;return((u=(c=(s=a==null?void 0:a.response)==null?void 0:s.data)==null?void 0:c.error)==null?void 0:u.message)||((m=(p=a==null?void 0:a.response)==null?void 0:p.data)==null?void 0:m.message)||(a==null?void 0:a.message)||"Request failed"}export{ue 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.