@aiquants/authz-react-router 0.7.2 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- "use strict";var we=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var nt=Object.getOwnPropertyNames;var st=Object.prototype.hasOwnProperty;var it=(t,o)=>{for(var s in o)we(t,s,{get:o[s],enumerable:!0})},at=(t,o,s,i)=>{if(o&&typeof o=="object"||typeof o=="function")for(let n of nt(o))!st.call(t,n)&&n!==s&&we(t,n,{get:()=>o[n],enumerable:!(i=ot(o,n))||i.enumerable});return t};var lt=t=>at(we({},"__esModule",{value:!0}),t);var Pt={};it(Pt,{AuthzAdminAppView:()=>vt,AuthzErrorBoundary:()=>gt,AuthzGrantsView:()=>Fe,AuthzGraphView:()=>Be,AuthzGroupRolesView:()=>qe,AuthzLayout:()=>yt,AuthzResourcesView:()=>Ue,AuthzRolesView:()=>ke,AuthzUsageError:()=>q,AuthzUserRolesView:()=>He,ErrorAlert:()=>ne,Field:()=>W,MyPermissionGroupStatus:()=>Ie,MyPermissionIndicator:()=>ye,MyPermissionStatus:()=>mt,createAuthz:()=>zt,createAuthzAdminApp:()=>ut,createAuthzAdminServer:()=>Re,defaultAuthzAdminLabels:()=>Ne,defineResources:()=>wt,flattenGroupItems:()=>ge,formatResourceTooltip:()=>Ae,getPermissionSummary:()=>Ee,makeAuthzErrorBoundary:()=>Oe,resolveLabels:()=>le,resourceKeysOf:()=>Rt,toPermissionView:()=>Ce,ui:()=>d,usePermission:()=>Se});module.exports=lt(Pt);var fe=require("react-router");var oe=require("@aiquants/authz-core"),D=require("react-router");var Ne={title:"Authorization (RBAC)",myPermission:"Your permissions",tabs:{roles:"Roles",resources:"Resources",role_permissions:"Permissions",user_roles:"User assignments",group_roles:"Group assignments",graph:"Graph"},common:{add:"Add",save:"Save",delete:"Delete",remove:"Remove",assign:"Assign",grant:"Grant",select:"Select\u2026",active:"\u25CB Enabled",inactive:"\xD7 Disabled",optional:"optional"},roles:{heading:"Roles (TMRole)",note:"Edit name / description inline and click Save (role_key is an immutable identifier).",roleKey:"role_key",name:"name",description:"description",activeHeader:"Active",empty:"No roles",newHeading:"New role",hintRoleKey:"e.g. admin"},resources:{heading:"Resources (TMResource)",note:"Edit name / description inline and click Save (app_key / resource_key are immutable identifiers).",appKey:"app_key",resourceKey:"resource_key",name:"name",description:"description",empty:"No resources",newHeading:"New resource",hintAppKey:"e.g. quants",hintResourceKey:"e.g. daily_report",hintDailyReport:"optional"},grants:{heading:"Permissions (TDRolePermission)",note:"Empty row_scope / column_scope = all rows / all columns (NULL). JSON must satisfy the \xA73.2 contract.",role:"role",resource:"resource",action:"action",rowScope:"row_scope",columnScope:"column_scope",empty:"No permissions",newHeading:"Grant a permission",rowScopeHint:"JSON / empty = all rows",columnScopeHint:"JSON / empty = all columns",rowScopePlaceholder:"empty = all rows (NULL)",columnScopePlaceholder:"empty = all columns (NULL)",nullRows:"NULL (all rows)",nullCols:"NULL (all columns)",selectPlaceholder:"Select\u2026"},userRoles:{heading:"User assignments (TDUserRole)",note:"Assign active roles to specific users.",user:"user",role:"role",empty:"No assignments",newHeading:"Assign a role",selectPlaceholder:"Select\u2026"},groupRoles:{heading:"Group assignments (TDGroupRole)",note:"Assign active roles to user groups.",group:"group",role:"role",empty:"No group assignments",newHeading:"Assign a role to group",selectPlaceholder:"Select\u2026"},error:{forbiddenTitle:"Access denied",forbiddenBody:"You don't have permission to view this screen. Ask an administrator to grant access.",genericTitlePrefix:"Error",genericTitle:"An error occurred",genericBody:"An unexpected error occurred. Please try again later."},warn:{selfRoleDisable:"This role backs your own authorization-admin access. Disabling it may lock you out of this screen. Continue?",selfRoleDelete:"This role backs your own authorization-admin access. Deleting it may lock you out of this screen. Continue?",selfAssignmentRemove:"This assignment backs your own authorization-admin access. Removing it may lock you out of this screen. Continue?"}};function le(t){let o=Ne;return t?{title:t.title??o.title,myPermission:t.myPermission??o.myPermission,tabs:{...o.tabs,...t.tabs},common:{...o.common,...t.common},roles:{...o.roles,...t.roles},resources:{...o.resources,...t.resources},grants:{...o.grants,...t.grants},userRoles:{...o.userRoles,...t.userRoles},groupRoles:{...o.groupRoles,...t.groupRoles},error:{...o.error,...t.error},warn:{...o.warn,...t.warn}}:o}var dt=t=>t instanceof Response;function de(t){if(dt(t))throw t;if(t instanceof oe.AuthzDeniedError)throw new Response(t.message,{status:403});return(0,D.data)({error:t instanceof Error?t.message:"\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F"},{status:400})}function Re(t){let o=t.store,s=t.resourceKey??"authz_admin",i=le(t.labels),n=async(f,u)=>{let{userId:S,permission:l}=await t.requirePermission(f,u);if(S==null)throw new oe.AuthzDeniedError({appKey:"",resourceKey:u.resourceKey,action:u.action,reason:"unresolved-user",userId:null});return{userId:S,permission:l}};async function h(f){await t.requireUser(f);try{let{userId:u,permission:S}=await n(f,{resourceKey:s,action:"read"});return{userId:u,myPermissions:{[s]:S}}}catch(u){throw u instanceof oe.AuthzDeniedError?new Response(`Forbidden: ${s}`,{status:403}):u}}let p=async f=>{let[u,S]=await Promise.all([o.listRoles(),o.getSelfAdminContext(Number(f))]);return{roles:u,selfAdminRoleIds:S.selfAdminRoleIds,labels:i}},a=async()=>({resources:await o.listResources(),labels:i}),A=async()=>{let[f,u,S]=await Promise.all([o.listGrants(),o.listRoles(),o.listResources()]);return{grants:f,roles:u,resources:S,labels:i}},I=async f=>{let[u,S,l,v]=await Promise.all([o.listUserRoles(),o.listRoles(),o.listUsers(),o.getSelfAdminContext(Number(f))]);return{assignments:u,roles:S,users:l,actorUserId:v.actorUserId,selfAdminRoleIds:v.selfAdminRoleIds,labels:i}},w=async()=>{let[f,u,S]=await Promise.all([o.listGroupRoles(),o.listRoles(),o.listGroups()]);return{groupRoles:f,roles:u,groups:S,labels:i}},x=async()=>{let[f,u,S,l,v,K,G]=await Promise.all([o.listUsers(),o.listRoles(),o.listResources(),o.listGrants(),o.listUserRoles(),o.listGroupRoles(),o.listGroups()]);return{users:f,roles:u,resources:S,grants:l,assignments:v,groupRoles:K,groups:G,labels:i}};return{labels:i,resourceKey:s,layoutGuard:h,layout:{async loader({request:f}){let{myPermissions:u}=await h(f);return{myPermissions:u,labels:i,adminResourceKey:s}}},index:{loader(){throw(0,D.redirect)("/authz/roles")}},roles:{data:p,async loader({request:f}){let{userId:u}=await n(f,{resourceKey:s,action:"read"});return p(u)},async action({request:f}){let u=await f.formData(),S=String(u.get("_action"));try{switch(S){case"create":{let{userId:l}=await n(f,{resourceKey:s,action:"create"}),v=String(u.get("roleKey")??"").trim(),K=String(u.get("name")??"").trim();return v&&K?(await o.createRole({roleKey:v,name:K,description:String(u.get("description")??"").trim()||null},String(l)),{ok:!0}):(0,D.data)({error:"role_key \u3068 name \u306F\u5FC5\u9808\u3067\u3059"},{status:400})}case"save":{let{userId:l}=await n(f,{resourceKey:s,action:"update"}),v=String(u.get("roleKey")??"").trim(),K=String(u.get("name")??"").trim();return v&&K?(await o.updateRole(Number(u.get("id")),{roleKey:v,name:K,description:String(u.get("description")??"").trim()||null},String(l)),{ok:!0}):(0,D.data)({error:"roleKey \u3068 name \u306F\u5FC5\u9808\u3067\u3059"},{status:400})}case"toggle":{let{userId:l}=await n(f,{resourceKey:s,action:"update"});return await o.setRoleActive(Number(u.get("id")),u.get("isActive")==="true",String(l)),{ok:!0}}case"delete":return await n(f,{resourceKey:s,action:"delete"}),await o.deleteRole(Number(u.get("id"))),{ok:!0};default:return(0,D.data)({error:"unknown action"},{status:400})}}catch(l){return de(l)}}},resources:{data:a,async loader({request:f}){return await n(f,{resourceKey:s,action:"read"}),a()},async action({request:f}){let u=await f.formData(),S=String(u.get("_action"));try{switch(S){case"create":{let{userId:l}=await n(f,{resourceKey:s,action:"create"}),v=String(u.get("appKey")??"").trim(),K=String(u.get("resourceKey")??"").trim(),G=String(u.get("name")??"").trim();return v&&K&&G?(await o.createResource({appKey:v,resourceKey:K,name:G,description:String(u.get("description")??"").trim()||null},String(l)),{ok:!0}):(0,D.data)({error:"app_key / resource_key / name \u306F\u5FC5\u9808\u3067\u3059"},{status:400})}case"save":{let{userId:l}=await n(f,{resourceKey:s,action:"update"}),v=String(u.get("name")??"").trim();return v?(await o.updateResource(Number(u.get("id")),{name:v,description:String(u.get("description")??"").trim()||null},String(l)),{ok:!0}):(0,D.data)({error:"name \u306F\u5FC5\u9808\u3067\u3059"},{status:400})}case"delete":return await n(f,{resourceKey:s,action:"delete"}),await o.deleteResource(Number(u.get("id"))),{ok:!0};default:return(0,D.data)({error:"unknown action"},{status:400})}}catch(l){return de(l)}}},grants:{data:A,async loader({request:f}){return await n(f,{resourceKey:s,action:"read"}),A()},async action({request:f}){let u=await f.formData(),S=String(u.get("_action"));try{switch(S){case"create":{let{userId:l}=await n(f,{resourceKey:s,action:"create"}),v=Number(u.get("roleId")),K=Number(u.get("resourceId"));if(!(v&&K))return(0,D.data)({error:"\u30ED\u30FC\u30EB\u3068\u30EA\u30BD\u30FC\u30B9\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044"},{status:400});let G=String(u.get("action")??"");if(!oe.AUTHZ_ACTIONS.includes(G))return(0,D.data)({error:"\u7121\u52B9\u306A action \u3067\u3059"},{status:400});let Z=G;return await o.createGrant({roleId:v,resourceId:K,action:Z,rowScope:String(u.get("rowScope")??""),columnScope:String(u.get("columnScope")??"")},String(l)),{ok:!0}}case"save":{let{userId:l}=await n(f,{resourceKey:s,action:"update"}),v=String(u.get("action")??"");if(!oe.AUTHZ_ACTIONS.includes(v))return(0,D.data)({error:"\u7121\u52B9\u306A action \u3067\u3059"},{status:400});let K=v;return await o.updateGrant(Number(u.get("id")),{action:K,rowScope:String(u.get("rowScope")??""),columnScope:String(u.get("columnScope")??"")},String(l)),{ok:!0}}case"delete":return await n(f,{resourceKey:s,action:"delete"}),await o.deleteGrant(Number(u.get("id"))),{ok:!0};default:return(0,D.data)({error:"unknown action"},{status:400})}}catch(l){return de(l)}}},userRoles:{data:I,async loader({request:f}){let{userId:u}=await n(f,{resourceKey:s,action:"read"});return I(u)},async action({request:f}){let u=await f.formData(),S=String(u.get("_action"));try{switch(S){case"assign":{let{userId:l}=await n(f,{resourceKey:s,action:"create"}),v=Number(u.get("userId")),K=Number(u.get("roleId"));return v&&K?(await o.assignUserRole(v,K,String(l)),{ok:!0}):(0,D.data)({error:"\u30E6\u30FC\u30B6\u30FC\u3068\u30ED\u30FC\u30EB\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044"},{status:400})}case"remove":return await n(f,{resourceKey:s,action:"delete"}),await o.removeUserRole(Number(u.get("userId")),Number(u.get("roleId"))),{ok:!0};default:return(0,D.data)({error:"unknown action"},{status:400})}}catch(l){return de(l)}}},groupRoles:{data:w,async loader({request:f}){return await n(f,{resourceKey:s,action:"read"}),w()},async action({request:f}){let u=await f.formData(),S=String(u.get("_action"));try{switch(S){case"assign":{let{userId:l}=await n(f,{resourceKey:s,action:"create"}),v=Number(u.get("groupId")),K=Number(u.get("roleId"));return v&&K?(await o.assignGroupRole(v,K,String(l)),{ok:!0}):(0,D.data)({error:"\u30B0\u30EB\u30FC\u30D7\u3068\u30ED\u30FC\u30EB\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044"},{status:400})}case"remove":return await n(f,{resourceKey:s,action:"delete"}),await o.removeGroupRole(Number(u.get("groupId")),Number(u.get("roleId"))),{ok:!0};default:return(0,D.data)({error:"unknown action"},{status:400})}}catch(l){return de(l)}}},graph:{data:x,async loader({request:f}){return await n(f,{resourceKey:s,action:"read"}),x()}}}}function Me(t){return String(t["*"]??"").split("/")[0]}function ut(t){let o=Re(t),s=t.basePath??"/authz",i=["roles","resources","role_permissions","user_roles","group_roles","graph"],n={roles:o.roles.data,resources:o.resources.data,role_permissions:o.grants.data,user_roles:o.userRoles.data,group_roles:o.groupRoles.data,graph:o.graph.data},h=new Map([["roles",o.roles.action],["resources",o.resources.action],["role_permissions",o.grants.action],["user_roles",o.userRoles.action],["group_roles",o.groupRoles.action]]);async function p(A){let I=Me(A.params);if(!i.includes(I))throw(0,fe.redirect)(`${s}/roles`);let{userId:w,myPermissions:x}=await o.layoutGuard(A.request),f=await n[I](w);return{segment:I,basePath:s,myPermissions:x,adminResourceKey:o.resourceKey,...f}}async function a(A){let I=Me(A.params),w=h.get(I);return w?w(A):(0,fe.data)({error:"unknown action"},{status:400})}return{loader:p,action:a,server:o}}var ie=require("react/jsx-runtime"),d={page:{padding:"1.25rem",maxWidth:1280,margin:"0 auto",color:"#0f172a"},tableContainer:{width:"100%",overflowX:"auto",marginBottom:"1rem",WebkitOverflowScrolling:"touch"},table:{borderCollapse:"collapse",width:"100%",fontSize:"0.9rem",tableLayout:"fixed"},th:{textAlign:"left",borderBottom:"2px solid #e2e8f0",padding:"0.45rem 0.65rem",fontSize:"0.78rem",color:"#475569",fontWeight:600,textTransform:"uppercase",letterSpacing:"0.03em"},td:{borderBottom:"1px solid #f1f5f9",padding:"0.5rem 0.65rem",verticalAlign:"middle",wordBreak:"break-all"},input:{padding:"0.4rem 0.55rem",border:"1px solid #cbd5e1",borderRadius:6,fontSize:"0.9rem",background:"#fff",width:"100%",boxSizing:"border-box"},select:{padding:"0.4rem 0.55rem",border:"1px solid #cbd5e1",borderRadius:6,fontSize:"0.9rem",background:"#fff",width:"100%",boxSizing:"border-box"},textarea:{padding:"0.4rem 0.55rem",border:"1px solid #cbd5e1",borderRadius:6,fontSize:"0.82rem",fontFamily:"ui-monospace, SFMono-Regular, Menlo, monospace",minHeight:"3.25rem",resize:"vertical",width:"100%",boxSizing:"border-box"},button:{padding:"0.3rem 0.7rem",border:"1px solid #cbd5e1",borderRadius:6,background:"#fff",cursor:"pointer",fontSize:"0.82rem",color:"#334155"},save:{padding:"0.3rem 0.7rem",border:"1px solid #2563eb",borderRadius:6,background:"#eff6ff",cursor:"pointer",fontSize:"0.82rem",color:"#2563eb",fontWeight:600},danger:{padding:"0.3rem 0.7rem",border:"1px solid #fecaca",borderRadius:6,background:"#fff",cursor:"pointer",fontSize:"0.82rem",color:"#dc2626"},primary:{padding:"0.5rem 1.25rem",border:"1px solid #2563eb",borderRadius:6,background:"#2563eb",color:"#fff",cursor:"pointer",fontSize:"0.9rem",fontWeight:600,alignSelf:"flex-start"},card:{display:"flex",flexDirection:"column",gap:"0.85rem",maxWidth:600,marginTop:"0.75rem",padding:"1rem 1.1rem",border:"1px solid #e2e8f0",borderRadius:10,background:"#f8fafc"},code:{fontFamily:"ui-monospace, SFMono-Regular, Menlo, monospace",fontSize:"0.78rem",color:"#334155",wordBreak:"break-all"},muted:{color:"#94a3b8"},h2:{fontSize:"1.05rem",margin:"0 0 0.35rem",fontWeight:700},h3:{fontSize:"0.92rem",margin:"1.25rem 0 0",color:"#334155",fontWeight:600},note:{color:"#64748b",fontSize:"0.82rem",margin:"0 0 0.75rem"},empty:{color:"#94a3b8",padding:"0.75rem 0.65rem"}};function W({label:t,hint:o,children:s}){return(0,ie.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"0.3rem"},children:[(0,ie.jsxs)("span",{style:{fontSize:"0.8rem",color:"#475569",fontWeight:600},children:[t,o?(0,ie.jsxs)("span",{style:{fontWeight:400,color:"#94a3b8"},children:[" \u2014 ",o]}):null]}),s]})}function ne({message:t}){return t?(0,ie.jsx)("p",{role:"alert",style:{color:"#dc2626",background:"#fef2f2",border:"1px solid #fecaca",borderRadius:8,padding:"0.55rem 0.8rem",fontSize:"0.85rem",margin:"0.25rem 0"},children:t}):null}var Ke=require("@aiquants/authz-core"),Y=require("@aiquants/select-box"),_=require("react"),P=require("react-router");var ae=require("react");function Se(t){let o=t?.canRead?t.readPartial?"partial":"full":"none",s=t?.canCreate&&t?.canUpdate?"full":t?.canCreate||t?.canUpdate?"partial":"none",i=t?.canDelete?"full":"none";return{canRead:!!t?.canRead,canCreate:!!t?.canCreate,canUpdate:!!t?.canUpdate,canDelete:!!t?.canDelete,canWrite:!!t?.canWrite,readState:o,writeState:s,deleteState:i}}var N=require("react/jsx-runtime"),ct={full:{bg:"#ecfdf5",text:"#047857",border:"#a7f3d0"},partial:{bg:"#fffbeb",text:"#b45309",border:"#fde68a"},none:{bg:"#f8fafc",text:"#94a3b8",border:"#cbd5e1"}};function Ae(t,o){let s=t?.trim(),i=o?.trim();if(i&&s&&i!==s)return`\u5BFE\u8C61\u30EA\u30BD\u30FC\u30B9: ${i} (${s})`;if(i||s)return`\u5BFE\u8C61\u30EA\u30BD\u30FC\u30B9: ${i||s}`}function pt({state:t}){return t==="full"?(0,N.jsx)("svg",{style:{width:"0.85rem",height:"0.85rem",flexShrink:0},fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:3,"aria-hidden":"true",children:(0,N.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 13l4 4L19 7"})}):t==="partial"?(0,N.jsx)("svg",{style:{width:"0.85rem",height:"0.85rem",flexShrink:0},fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2.5,"aria-hidden":"true",children:(0,N.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"})}):(0,N.jsx)("svg",{style:{width:"0.85rem",height:"0.85rem",flexShrink:0},fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2.5,"aria-hidden":"true",children:(0,N.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728A9 9 0 015.636 5.636m12.728 12.728L5.636 5.636"})})}function ye({permission:t,resourceName:o,expectedResourceKey:s,showResourceTooltip:i=!0,labels:n,showScopeSummary:h=!0,className:p="authz-permission-indicator"}){let a=Se(t),A={read:n?.read??"\u95B2\u89A7",write:n?.write??"\u7DE8\u96C6",delete:n?.delete??"\u524A\u9664"},I=t?.resourceKey,w=o||I,x=i?Ae(I,o):void 0,f=!!(s&&I&&I!==s);f&&typeof console<"u"&&typeof console.error=="function"&&console.error(`[Authz Warning] Resource key mismatch in MyPermissionIndicator! Expected: "${s}", but received permission for: "${I}".`);let u=(S,l,v)=>{let K=ct[l],G=x?`${v}: ${l}
2
- ${x}`:`${v}: ${l}`;return(0,N.jsxs)("span",{"data-perm":S,"data-state":l,title:G,style:{display:"inline-flex",alignItems:"center",gap:"0.25rem",padding:"0.2rem 0.5rem",borderRadius:"100px",fontSize:"0.75rem",fontWeight:600,backgroundColor:K.bg,color:K.text,border:`1px solid ${K.border}`,lineHeight:1,userSelect:"none"},children:[(0,N.jsx)(pt,{state:l}),(0,N.jsx)("span",{children:v})]})};return(0,N.jsxs)("span",{className:p,title:x,"data-resource":I??"","data-resource-name":w??"","data-mismatch":f?"true":void 0,style:{display:"inline-flex",gap:"0.35rem",alignItems:"center",verticalAlign:"middle"},children:[u("read",a.readState,A.read),u("write",a.writeState,A.write),u("delete",a.deleteState,A.delete),h&&a.readState==="partial"?(0,N.jsx)("span",{"data-perm":"scope",title:x,style:{fontSize:"0.7rem",color:"#b45309",backgroundColor:"#fef3c7",padding:"0.15rem 0.35rem",borderRadius:"4px",fontWeight:600},children:"\u90E8\u5206\u5236\u9650"}):null,f?(0,N.jsxs)("span",{"data-testid":"resource-mismatch-warning",title:`expected: "${s}", actual: "${I}"`,style:{fontSize:"0.7rem",color:"#991b1b",backgroundColor:"#fee2e2",border:"1px solid #fca5a5",padding:"0.15rem 0.35rem",borderRadius:"4px",fontWeight:700},children:["\u26A0\uFE0F \u30EA\u30BD\u30FC\u30B9\u4E0D\u4E00\u81F4 (",I," \u2260 ",s,")"]}):null]})}function mt({permission:t,resourceName:o,expectedResourceKey:s,prefixLabel:i="\u3042\u306A\u305F\u306E\u6A29\u9650",showPrefixLabel:n=!0,showResourceTooltip:h=!0,labels:p,showScopeSummary:a=!0,className:A="authz-permission-status",style:I}){let w=t?.resourceKey,x=o||w,f=h?Ae(w,o):void 0;return(0,N.jsxs)("span",{className:A,title:f,"data-testid":"my-permission-status","data-resource":w??"","data-resource-name":x??"",style:{fontSize:"0.82rem",color:"#475569",display:"inline-flex",alignItems:"center",gap:"0.4rem",...I},children:[n&&(0,N.jsxs)("span",{"data-testid":"prefix-label",children:[i,":"]}),(0,N.jsx)(ye,{permission:t,resourceName:o,expectedResourceKey:s,showResourceTooltip:h,labels:p,showScopeSummary:a})]})}var C=require("react/jsx-runtime");function ge(t,o=0){let s=[];for(let i of t){let n=i.level??o;s.push({...i,level:n}),i.children&&i.children.length>0&&s.push(...ge(i.children,n+1))}return s}var Te={"2xs":{fontSize:"0.6rem",pillPadding:"0.05rem 0.25rem",pillGap:"0.15rem",wrapperGap:"0.15rem",triggerPadding:"0.1rem 0.35rem",triggerFontSize:"0.62rem",badgeFontSize:"0.58rem"},xs:{fontSize:"0.65rem",pillPadding:"0.08rem 0.35rem",pillGap:"0.18rem",wrapperGap:"0.2rem",triggerPadding:"0.12rem 0.4rem",triggerFontSize:"0.68rem",badgeFontSize:"0.62rem"},sm:{fontSize:"0.72rem",pillPadding:"0.1rem 0.4rem",pillGap:"0.2rem",wrapperGap:"0.25rem",triggerPadding:"0.15rem 0.45rem",triggerFontSize:"0.72rem",badgeFontSize:"0.65rem"},md:{fontSize:"0.78rem",pillPadding:"0.15rem 0.5rem",pillGap:"0.3rem",wrapperGap:"0.35rem",triggerPadding:"0.2rem 0.6rem",triggerFontSize:"0.78rem",badgeFontSize:"0.7rem"},lg:{fontSize:"0.85rem",pillPadding:"0.25rem 0.65rem",pillGap:"0.4rem",wrapperGap:"0.45rem",triggerPadding:"0.25rem 0.75rem",triggerFontSize:"0.85rem",badgeFontSize:"0.75rem"}};function Ee(t,o){let s=o?.noPermission??"\u6A29\u9650\u306A\u3057",i=o?.fullWrite??"\u7DE8\u96C6\u53EF",n=o?.partialRead??"\u4E00\u90E8\u95B2\u89A7",h=o?.readOnly??"\u95B2\u89A7\u306E\u307F";return t&&(t.canRead||t.canWrite||t.canDelete)?t.canWrite?{text:i,color:"#047857",bgColor:"#ecfdf5",borderColor:"#a7f3d0"}:t.canRead?t.readPartial?{text:n,color:"#b45309",bgColor:"#fffbeb",borderColor:"#fde68a"}:{text:h,color:"#1d4ed8",bgColor:"#eff6ff",borderColor:"#bfdbfe"}:{text:s,color:"#64748b",bgColor:"#f1f5f9",borderColor:"#cbd5e1"}:{text:s,color:"#64748b",bgColor:"#f1f5f9",borderColor:"#cbd5e1"}}function ft({item:t,size:o="md",labels:s}){let i=Ee(t.permission,s),n=t.permission?.resourceKey||t.resourceKey||t.expectedResourceKey,h=t.resourceName||n,p=!!(t.expectedResourceKey&&t.permission?.resourceKey&&t.permission.resourceKey!==t.expectedResourceKey),a=Te[o],A=`\u5BFE\u8C61: ${h}${n?` (${n})`:""}${t.permission?` | ${s?.read??"\u95B2\u89A7"}:${t.permission.canRead?"\u25CB":"\xD7"} ${s?.write??"\u7DE8\u96C6"}:${t.permission.canWrite?"\u25CB":"\xD7"} ${s?.delete??"\u524A\u9664"}:${t.permission.canDelete?"\u25CB":"\xD7"}`:""}`;return(0,C.jsxs)("span",{title:A,"data-testid":`permission-pill-${t.resourceName}`,"data-mismatch":p?"true":"false",style:{display:"inline-flex",alignItems:"center",gap:a.pillGap,fontSize:a.fontSize,padding:a.pillPadding,borderRadius:"9999px",backgroundColor:p?"#fee2e2":i.bgColor,color:p?"#991b1b":i.color,border:`1px solid ${p?"#fca5a5":i.borderColor}`,fontWeight:600,lineHeight:"1.2"},children:[(0,C.jsxs)("span",{children:[h,":"]}),(0,C.jsx)("span",{children:i.text}),p&&(0,C.jsx)("span",{title:`expected "${t.expectedResourceKey}", actual "${t.permission?.resourceKey}"`,children:"\u26A0\uFE0F"})]})}function Ie({items:t,prefixLabel:o="\u3042\u306A\u305F\u306E\u6A29\u9650",variant:s="pills",size:i="md",labels:n,className:h="authz-permission-group-status",style:p}){let[a,A]=(0,ae.useState)(!1),I=(0,ae.useRef)(null),w=Te[i];if((0,ae.useEffect)(()=>{if(s!=="popover"||!a)return;function x(u){I.current&&!I.current.contains(u.target)&&A(!1)}function f(u){u.key==="Escape"&&A(!1)}return document.addEventListener("mousedown",x),document.addEventListener("keydown",f),()=>{document.removeEventListener("mousedown",x),document.removeEventListener("keydown",f)}},[s,a]),s==="popover"){let x=ge(t),f=x.filter(v=>v.permission?.canWrite).length,u=x.filter(v=>v.permission?.canRead).length,S=x.length,l=S===0||f===0&&u===0?n?.noPermission??"\u6A29\u9650\u306A\u3057":f===S?n?.fullWrite??"\u7DE8\u96C6\u53EF":f>0?n?.partialWrite??"\u4E00\u90E8\u7DE8\u96C6\u53EF":n?.readOnly??"\u95B2\u89A7\u306E\u307F";return(0,C.jsxs)("span",{ref:I,className:h,"data-testid":"my-permission-group-popover",style:{position:"relative",display:"inline-block",...p},children:[(0,C.jsxs)("button",{type:"button",onClick:()=>A(!a),"data-testid":"permission-popover-trigger",style:{display:"inline-flex",alignItems:"center",gap:w.wrapperGap,fontSize:w.triggerFontSize,padding:w.triggerPadding,borderRadius:"6px",backgroundColor:"#f8fafc",color:"#334155",border:"1px solid #cbd5e1",fontWeight:600,cursor:"pointer"},children:[(0,C.jsxs)("span",{children:["\u{1F512} ",o]}),(0,C.jsxs)("span",{style:{fontSize:w.badgeFontSize,color:"#64748b"},children:["(",l,")"]}),(0,C.jsx)("span",{style:{fontSize:"0.65rem",marginLeft:"0.1rem"},children:a?"\u25B2":"\u25BE"})]}),a&&(0,C.jsxs)("div",{"data-testid":"permission-popover-card",style:{position:"absolute",top:"calc(100% + 6px)",right:0,zIndex:50,minWidth:"280px",whiteSpace:"nowrap",padding:"0.75rem 0.85rem",backgroundColor:"#ffffff",borderRadius:"8px",boxShadow:"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)",border:"1px solid #e2e8f0",fontSize:"0.82rem"},children:[(0,C.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:"0.5rem",paddingBottom:"0.4rem",borderBottom:"1px solid #f1f5f9",fontWeight:700,color:"#1e293b",whiteSpace:"nowrap"},children:[(0,C.jsxs)("span",{children:["\u{1F512} ",o]}),(0,C.jsx)("button",{type:"button",onClick:()=>A(!1),style:{border:"none",background:"none",cursor:"pointer",color:"#94a3b8",fontSize:"0.85rem",padding:"0 0.2rem"},children:"\u2715"})]}),(0,C.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:"0.4rem"},children:ge(t).map(v=>{let K=v.level??0,G=K>0;return(0,C.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"1.25rem",whiteSpace:"nowrap",paddingLeft:G?`${K*.85}rem`:"0"},children:[(0,C.jsxs)("div",{style:{display:"inline-flex",alignItems:"center",whiteSpace:"nowrap"},children:[G&&(0,C.jsx)("span",{"aria-hidden":"true",style:{display:"inline-block",width:"10px",height:"10px",borderLeft:"1.5px solid #cbd5e1",borderBottom:"1.5px solid #cbd5e1",borderBottomLeftRadius:"3px",marginRight:"6px",marginTop:"-4px",flexShrink:0}}),(0,C.jsxs)("span",{style:{fontWeight:G?500:600,color:G?"#64748b":"#1e293b",fontSize:G?"0.78rem":"0.82rem",whiteSpace:"nowrap"},children:[v.resourceName,":"]})]}),(0,C.jsx)(ye,{permission:v.permission,resourceName:v.resourceName,expectedResourceKey:v.expectedResourceKey,labels:n})]},v.resourceName)})})]})]})}return(0,C.jsxs)("span",{className:h,"data-testid":"my-permission-group-pills",style:{display:"inline-flex",alignItems:"center",flexWrap:"wrap",gap:w.pillGap,fontSize:w.fontSize,color:"#475569",...p},children:[o&&(0,C.jsxs)("span",{style:{fontWeight:600,color:"#334155"},children:[o,":"]}),(0,C.jsx)("span",{style:{display:"inline-flex",alignItems:"center",flexWrap:"wrap",gap:w.pillGap},children:t.map(x=>(0,C.jsx)(ft,{item:x,size:i,labels:n},x.resourceName))})]})}var e=require("react/jsx-runtime"),ue=t=>t?.error;function _e({children:t,renderHeader:o}){let{myPermissions:s,labels:i,adminResourceKey:n,basePath:h}=(0,P.useLoaderData)(),p=h??"/authz",[a,A]=(0,_.useState)("pills"),I=[["roles",i.tabs.roles],["resources",i.tabs.resources],["role_permissions",i.tabs.role_permissions],["user_roles",i.tabs.user_roles],["group_roles",i.tabs.group_roles],["graph",i.tabs.graph]],w=Object.entries(s||{}).map(([u,S])=>({resourceKey:u,resourceName:S?.resourceKey||u,permission:S,expectedResourceKey:u})),x=w.length>0?w:[{resourceKey:n,resourceName:n,permission:s?.[n],expectedResourceKey:n}],f=(0,e.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"0.4rem"},children:[(0,e.jsx)(Ie,{prefixLabel:i.myPermission,items:x,variant:a,size:"xs"}),(0,e.jsxs)("div",{style:{display:"inline-flex",borderRadius:"4px",border:"1px solid #cbd5e1",padding:"1px",backgroundColor:"#f8fafc",fontSize:"0.7rem"},children:[(0,e.jsx)("button",{type:"button",onClick:()=>A("pills"),"data-testid":"switch-variant-pills",style:{padding:"1px 5px",borderRadius:"3px",border:"none",cursor:"pointer",fontSize:"0.7rem",lineHeight:"1.2",fontWeight:a==="pills"?600:400,backgroundColor:a==="pills"?"#ffffff":"transparent",color:a==="pills"?"#1e293b":"#64748b",boxShadow:a==="pills"?"0 1px 2px rgba(0,0,0,0.05)":"none"},children:"Pills"}),(0,e.jsx)("button",{type:"button",onClick:()=>A("popover"),"data-testid":"switch-variant-popover",style:{padding:"1px 5px",borderRadius:"3px",border:"none",cursor:"pointer",fontSize:"0.7rem",lineHeight:"1.2",fontWeight:a==="popover"?600:400,backgroundColor:a==="popover"?"#ffffff":"transparent",color:a==="popover"?"#1e293b":"#64748b",boxShadow:a==="popover"?"0 1px 2px rgba(0,0,0,0.05)":"none"},children:"Popover"})]})]});return(0,e.jsxs)("div",{className:"authz-admin",style:d.page,children:[o?o({title:i.title,annotation:f}):(0,e.jsxs)("header",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"0.75rem",flexWrap:"wrap",margin:"0 0 0.4rem"},children:[(0,e.jsx)("h1",{style:{fontSize:"1.15rem",margin:0,fontWeight:700,color:"#1e293b"},children:i.title}),f]}),(0,e.jsx)("nav",{style:{display:"flex",gap:"0.25rem",borderBottom:"1px solid #e2e8f0",margin:"0.6rem 0 1rem"},children:I.map(([u,S])=>(0,e.jsx)(P.NavLink,{to:`${p}/${u}`,style:({isActive:l})=>({padding:"0.5rem 0.9rem",textDecoration:"none",color:l?"#2563eb":"#475569",borderBottom:l?"2px solid #2563eb":"2px solid transparent",marginBottom:-1,fontWeight:l?700:500,fontSize:"0.92rem"}),children:S},u))}),t]})}function yt({renderHeader:t}={}){return(0,e.jsx)(_e,{renderHeader:t,children:(0,e.jsx)(P.Outlet,{})})}function Oe(t){let o=le(t).error;return function(){let i=(0,P.useRouteError)(),n=(0,P.isRouteErrorResponse)(i)?i:null,h=n?.status===403,p=h?o.forbiddenTitle:n?`${o.genericTitlePrefix} (${n.status})`:o.genericTitle,a=h?o.forbiddenBody:n?typeof n.data=="string"&&n.data?n.data:n.statusText:o.genericBody;return(0,e.jsx)("div",{style:d.page,children:(0,e.jsxs)("div",{role:"alert",style:{maxWidth:480,margin:"3rem auto",padding:"1.5rem",border:"1px solid #fecaca",borderRadius:12,background:"#fef2f2"},children:[(0,e.jsx)("h1",{style:{fontSize:"1.1rem",fontWeight:700,color:"#b91c1c",margin:"0 0 0.5rem"},children:p}),(0,e.jsx)("p",{style:{color:"#7f1d1d",fontSize:"0.9rem",margin:0,lineHeight:1.7},children:a})]})})}}var gt=Oe(),ze=(t,o)=>s=>{t&&!window.confirm(o)&&s.preventDefault()};function ke(){let{roles:t,selfAdminRoleIds:o,labels:s}=(0,P.useLoaderData)(),i=s.roles,n=s.common,h=new Set(o??[]);return(0,e.jsxs)("section",{children:[(0,e.jsx)("h2",{style:d.h2,children:i.heading}),(0,e.jsx)(ne,{message:ue((0,P.useActionData)())}),(0,e.jsx)("p",{style:d.note,children:i.note}),(0,e.jsx)("div",{style:d.tableContainer,children:(0,e.jsxs)("table",{style:d.table,children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{style:{...d.th,width:"20%"},children:i.roleKey}),(0,e.jsx)("th",{style:{...d.th,width:"25%"},children:i.name}),(0,e.jsx)("th",{style:{...d.th,width:"35%"},children:i.description}),(0,e.jsx)("th",{style:{...d.th,width:"10%"},children:i.activeHeader}),(0,e.jsx)("th",{style:{...d.th,width:"10%"}})]})}),(0,e.jsxs)("tbody",{children:[t.map(p=>(0,e.jsxs)("tr",{children:[(0,e.jsx)("td",{style:d.td,children:p.roleKey==="@authenticated"||p.roleKey==="@anonymous"?(0,e.jsx)("span",{style:d.code,children:p.roleKey}):(0,e.jsx)("input",{name:"roleKey",defaultValue:p.roleKey,form:`save-role-${p.id}`,"aria-label":`roleKey-${p.id}`,required:!0,style:d.input})}),(0,e.jsx)("td",{style:d.td,children:(0,e.jsx)("input",{name:"name",defaultValue:p.name,form:`save-role-${p.id}`,"aria-label":`name-${p.id}`,required:!0,style:d.input})}),(0,e.jsx)("td",{style:d.td,children:(0,e.jsx)("input",{name:"description",defaultValue:p.description??"",form:`save-role-${p.id}`,"aria-label":`description-${p.id}`,style:d.input})}),(0,e.jsx)("td",{style:d.td,children:(0,e.jsxs)(P.Form,{method:"post",style:{display:"inline"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"toggle"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:p.id}),(0,e.jsx)("input",{type:"hidden",name:"isActive",value:String(!p.isActive)}),(0,e.jsx)("button",{type:"submit",style:d.button,onClick:p.isActive?ze(h.has(p.id),s.warn.selfRoleDisable):void 0,children:p.isActive?n.active:n.inactive})]})}),(0,e.jsxs)("td",{style:{...d.td,whiteSpace:"nowrap"},children:[(0,e.jsxs)(P.Form,{method:"post",id:`save-role-${p.id}`,style:{display:"inline"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"save"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:p.id}),(0,e.jsx)("button",{type:"submit",style:d.save,children:n.save})]}),(0,e.jsxs)(P.Form,{method:"post",style:{display:"inline",marginLeft:"0.4rem"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"delete"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:p.id}),(0,e.jsx)("button",{type:"submit",style:d.danger,onClick:ze(h.has(p.id),s.warn.selfRoleDelete),children:n.delete})]})]})]},p.id)),t.length===0?(0,e.jsx)("tr",{children:(0,e.jsx)("td",{style:d.empty,colSpan:5,children:i.empty})}):null]})]})}),(0,e.jsx)("h3",{style:d.h3,children:i.newHeading}),(0,e.jsxs)(P.Form,{method:"post",style:d.card,children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"create"}),(0,e.jsx)(W,{label:i.roleKey,hint:i.hintRoleKey,children:(0,e.jsx)("input",{name:"roleKey","aria-label":"role_key",required:!0,style:d.input})}),(0,e.jsx)(W,{label:i.name,children:(0,e.jsx)("input",{name:"name","aria-label":"name",required:!0,style:d.input})}),(0,e.jsx)(W,{label:i.description,hint:n.optional,children:(0,e.jsx)("input",{name:"description","aria-label":"description",style:d.input})}),(0,e.jsx)("button",{type:"submit",style:d.primary,children:n.add})]})]})}function Ue(){let{resources:t,labels:o}=(0,P.useLoaderData)(),s=o.resources,i=o.common;return(0,e.jsxs)("section",{children:[(0,e.jsx)("h2",{style:d.h2,children:s.heading}),(0,e.jsx)(ne,{message:ue((0,P.useActionData)())}),(0,e.jsx)("p",{style:d.note,children:s.note}),(0,e.jsx)("div",{style:d.tableContainer,children:(0,e.jsxs)("table",{style:d.table,children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{style:{...d.th,width:"15%"},children:s.appKey}),(0,e.jsx)("th",{style:{...d.th,width:"20%"},children:s.resourceKey}),(0,e.jsx)("th",{style:{...d.th,width:"25%"},children:s.name}),(0,e.jsx)("th",{style:{...d.th,width:"30%"},children:s.description}),(0,e.jsx)("th",{style:{...d.th,width:"10%"}})]})}),(0,e.jsxs)("tbody",{children:[t.map(n=>(0,e.jsxs)("tr",{children:[(0,e.jsx)("td",{style:d.td,children:(0,e.jsx)("span",{style:d.code,children:n.appKey})}),(0,e.jsx)("td",{style:d.td,children:(0,e.jsx)("span",{style:d.code,children:n.resourceKey})}),(0,e.jsx)("td",{style:d.td,children:(0,e.jsx)("input",{name:"name",defaultValue:n.name,form:`save-res-${n.id}`,"aria-label":`name-${n.id}`,required:!0,style:d.input})}),(0,e.jsx)("td",{style:d.td,children:(0,e.jsx)("input",{name:"description",defaultValue:n.description??"",form:`save-res-${n.id}`,"aria-label":`description-${n.id}`,style:d.input})}),(0,e.jsxs)("td",{style:{...d.td,whiteSpace:"nowrap"},children:[(0,e.jsxs)(P.Form,{method:"post",id:`save-res-${n.id}`,style:{display:"inline"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"save"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:n.id}),(0,e.jsx)("button",{type:"submit",style:d.save,children:i.save})]}),(0,e.jsxs)(P.Form,{method:"post",style:{display:"inline",marginLeft:"0.4rem"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"delete"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:n.id}),(0,e.jsx)("button",{type:"submit",style:d.danger,children:i.delete})]})]})]},n.id)),t.length===0?(0,e.jsx)("tr",{children:(0,e.jsx)("td",{style:d.empty,colSpan:5,children:s.empty})}):null]})]})}),(0,e.jsx)("h3",{style:d.h3,children:s.newHeading}),(0,e.jsxs)(P.Form,{method:"post",style:d.card,children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"create"}),(0,e.jsx)(W,{label:s.appKey,hint:s.hintAppKey,children:(0,e.jsx)("input",{name:"appKey","aria-label":"app_key",required:!0,style:d.input})}),(0,e.jsx)(W,{label:s.resourceKey,hint:s.hintResourceKey,children:(0,e.jsx)("input",{name:"resourceKey","aria-label":"resource_key",required:!0,style:d.input})}),(0,e.jsx)(W,{label:s.name,children:(0,e.jsx)("input",{name:"name","aria-label":"name",required:!0,style:d.input})}),(0,e.jsx)(W,{label:s.description,hint:i.optional,children:(0,e.jsx)("input",{name:"description","aria-label":"description",style:d.input})}),(0,e.jsx)("button",{type:"submit",style:d.primary,children:i.add})]})]})}function ht({g:t,labels:o}){let s=o.common,[i,n]=(0,_.useState)({label:t.action,value:t.action});return(0,e.jsxs)("tr",{children:[(0,e.jsx)("td",{style:d.td,children:(0,e.jsx)("span",{style:d.code,children:t.roleKey})}),(0,e.jsx)("td",{style:d.td,children:(0,e.jsxs)("span",{style:d.code,children:[t.appKey,":",t.resourceKey]})}),(0,e.jsx)("td",{style:d.td,children:t.roleKey==="@anonymous"?(0,e.jsx)("span",{style:d.code,children:t.action}):(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("input",{type:"hidden",name:"action",value:i.value,form:`save-grant-${t.id}`}),(0,e.jsx)(Y.SelectBox,{options:Ke.AUTHZ_ACTIONS.map(h=>({label:h,value:h})),value:i,onChange:h=>{h&&n(h)}})]})}),(0,e.jsx)("td",{style:d.td,children:(0,e.jsx)("textarea",{name:"rowScope",defaultValue:t.rowScope??"",form:`save-grant-${t.id}`,"aria-label":`row_scope-${t.id}`,rows:2,placeholder:o.grants.rowScopePlaceholder,style:d.textarea})}),(0,e.jsx)("td",{style:d.td,children:(0,e.jsx)("textarea",{name:"columnScope",defaultValue:t.columnScope??"",form:`save-grant-${t.id}`,"aria-label":`column_scope-${t.id}`,rows:2,placeholder:o.grants.columnScopePlaceholder,style:d.textarea})}),(0,e.jsxs)("td",{style:{...d.td,whiteSpace:"nowrap"},children:[(0,e.jsxs)(P.Form,{method:"post",id:`save-grant-${t.id}`,style:{display:"inline"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"save"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:t.id}),(0,e.jsx)("button",{type:"submit",style:d.save,children:s.save})]}),(0,e.jsxs)(P.Form,{method:"post",style:{display:"inline",marginLeft:"0.4rem"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"delete"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:t.id}),(0,e.jsx)("button",{type:"submit",style:d.danger,children:s.delete})]})]})]})}function Fe(){let{grants:t,roles:o,resources:s,labels:i}=(0,P.useLoaderData)(),n=i.grants,h=i.common,p=o.map(l=>({label:l.roleKey,value:l.id})),a=s.map(l=>({label:`${l.appKey}:${l.resourceKey}`,value:l.id})),A=Ke.AUTHZ_ACTIONS.map(l=>({label:l,value:l})),[I,w]=(0,_.useState)(void 0),[x,f]=(0,_.useState)(void 0),[u,S]=(0,_.useState)({label:"read",value:"read"});return(0,e.jsxs)("section",{children:[(0,e.jsx)("h2",{style:d.h2,children:n.heading}),(0,e.jsx)("p",{style:d.note,children:n.note}),(0,e.jsx)(ne,{message:ue((0,P.useActionData)())}),(0,e.jsx)("div",{style:d.tableContainer,children:(0,e.jsxs)("table",{style:d.table,children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{style:{...d.th,width:"15%"},children:n.role}),(0,e.jsx)("th",{style:{...d.th,width:"20%"},children:n.resource}),(0,e.jsx)("th",{style:{...d.th,width:"15%"},children:n.action}),(0,e.jsx)("th",{style:{...d.th,width:"20%"},children:n.rowScope}),(0,e.jsx)("th",{style:{...d.th,width:"20%"},children:n.columnScope}),(0,e.jsx)("th",{style:{...d.th,width:"10%"}})]})}),(0,e.jsxs)("tbody",{children:[t.map(l=>(0,e.jsx)(ht,{g:l,labels:i},l.id)),t.length===0?(0,e.jsx)("tr",{children:(0,e.jsx)("td",{style:d.empty,colSpan:6,children:n.empty})}):null]})]})}),(0,e.jsx)("h3",{style:d.h3,children:n.newHeading}),(0,e.jsxs)(P.Form,{method:"post",style:d.card,children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"create"}),(0,e.jsx)("input",{type:"hidden",name:"roleId",value:I?.value??""}),(0,e.jsx)("input",{type:"hidden",name:"resourceId",value:x?.value??""}),(0,e.jsx)("input",{type:"hidden",name:"action",value:u?.value??""}),(0,e.jsx)(W,{label:n.role,children:(0,e.jsx)(Y.SelectBox,{options:p,value:I,onChange:l=>w(l||void 0),placeholder:n.selectPlaceholder})}),(0,e.jsx)(W,{label:n.resource,children:(0,e.jsx)(Y.SelectBox,{options:a,value:x,onChange:l=>f(l||void 0),placeholder:n.selectPlaceholder})}),(0,e.jsx)(W,{label:n.action,children:(0,e.jsx)(Y.SelectBox,{options:A,value:u,onChange:l=>S(l||void 0)})}),(0,e.jsx)(W,{label:n.rowScope,hint:n.rowScopeHint,children:(0,e.jsx)("textarea",{name:"rowScope","aria-label":"row_scope",rows:2,style:d.textarea,placeholder:'{"filters":[{"field":"\u90E8\u9580CD","op":"in","values":["A"]}]}'})}),(0,e.jsx)(W,{label:n.columnScope,hint:n.columnScopeHint,children:(0,e.jsx)("textarea",{name:"columnScope","aria-label":"column_scope",rows:2,style:d.textarea,placeholder:'{"mode":"deny","columns":["\u91D1\u984D"]}'})}),(0,e.jsx)("button",{type:"submit",style:d.primary,children:h.grant})]})]})}function He(){let{assignments:t,roles:o,users:s,actorUserId:i,selfAdminRoleIds:n,labels:h}=(0,P.useLoaderData)(),p=h.userRoles,a=h.common,A=new Set(n??[]),I=s.map(l=>({label:`${l.email}\uFF08${l.displayName}\uFF09`,value:l.id})),w=o.filter(l=>l.roleKey!=="@authenticated"&&l.roleKey!=="@anonymous").map(l=>({label:l.roleKey,value:l.id})),[x,f]=(0,_.useState)(void 0),[u,S]=(0,_.useState)(void 0);return(0,e.jsxs)("section",{children:[(0,e.jsx)("h2",{style:d.h2,children:p.heading}),(0,e.jsx)(ne,{message:ue((0,P.useActionData)())}),(0,e.jsx)("p",{style:d.note,children:p.note}),(0,e.jsx)("div",{style:d.tableContainer,children:(0,e.jsxs)("table",{style:d.table,children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{style:{...d.th,width:"45%"},children:p.user}),(0,e.jsx)("th",{style:{...d.th,width:"45%"},children:p.role}),(0,e.jsx)("th",{style:{...d.th,width:"10%"}})]})}),(0,e.jsxs)("tbody",{children:[t.map(l=>(0,e.jsxs)("tr",{children:[(0,e.jsxs)("td",{style:d.td,children:[l.email,(0,e.jsxs)("span",{style:d.muted,children:["\uFF08",l.displayName,"\uFF09"]})]}),(0,e.jsx)("td",{style:d.td,children:l.roleKey}),(0,e.jsx)("td",{style:d.td,children:(0,e.jsxs)(P.Form,{method:"post",style:{display:"inline"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"remove"}),(0,e.jsx)("input",{type:"hidden",name:"userId",value:l.userId}),(0,e.jsx)("input",{type:"hidden",name:"roleId",value:l.roleId}),(0,e.jsx)("button",{type:"submit",style:d.danger,onClick:ze(l.userId===i&&A.has(l.roleId),h.warn.selfAssignmentRemove),children:a.remove})]})})]},`${l.userId}-${l.roleId}`)),t.length===0?(0,e.jsx)("tr",{children:(0,e.jsx)("td",{style:d.empty,colSpan:3,children:p.empty})}):null]})]})}),(0,e.jsx)("h3",{style:d.h3,children:p.newHeading}),(0,e.jsxs)(P.Form,{method:"post",style:d.card,children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"assign"}),(0,e.jsx)("input",{type:"hidden",name:"userId",value:x?.value??""}),(0,e.jsx)("input",{type:"hidden",name:"roleId",value:u?.value??""}),(0,e.jsx)(W,{label:p.user,children:(0,e.jsx)(Y.SelectBox,{options:I,value:x,onChange:l=>f(l||void 0),placeholder:p.selectPlaceholder})}),(0,e.jsx)(W,{label:p.role,children:(0,e.jsx)(Y.SelectBox,{options:w,value:u,onChange:l=>S(l||void 0),placeholder:p.selectPlaceholder})}),(0,e.jsx)("button",{type:"submit",style:d.primary,children:a.assign})]})]})}function qe(){let{groupRoles:t,roles:o,groups:s,labels:i}=(0,P.useLoaderData)(),n=(0,P.useActionData)(),h=ue(n),p=i.groupRoles,a=i.common,A=o.filter(l=>l.isActive&&l.roleKey!=="@authenticated"&&l.roleKey!=="@anonymous"),I=s.map(l=>({label:`${l.name} (${l.groupKey})`,value:l.id})),w=A.map(l=>({label:`${l.name} (${l.roleKey})`,value:l.id})),[x,f]=(0,_.useState)(I[0]),[u,S]=(0,_.useState)(w[0]);return(0,e.jsxs)("section",{style:{display:"flex",flexDirection:"column",gap:"1.25rem"},children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("h2",{style:d.h2,children:p.heading}),(0,e.jsx)("p",{style:d.note,children:p.note})]}),h&&(0,e.jsx)(ne,{message:h}),(0,e.jsxs)("table",{style:d.table,children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{style:d.th,children:p.group}),(0,e.jsx)("th",{style:d.th,children:p.role}),(0,e.jsx)("th",{style:{...d.th,width:"100px"}})]})}),(0,e.jsx)("tbody",{children:t.length===0?(0,e.jsx)("tr",{children:(0,e.jsx)("td",{colSpan:3,style:{...d.td,textAlign:"center",color:"#64748b"},children:p.empty})}):t.map(l=>(0,e.jsxs)("tr",{children:[(0,e.jsxs)("td",{style:d.td,children:[(0,e.jsx)("strong",{children:l.groupName})," ",(0,e.jsxs)("span",{style:{color:"#64748b",fontSize:"0.85rem"},children:["(",l.groupKey,")"]})]}),(0,e.jsx)("td",{style:d.td,children:(0,e.jsx)("code",{children:l.roleKey})}),(0,e.jsx)("td",{style:{...d.td,textAlign:"right"},children:(0,e.jsxs)(P.Form,{method:"post",onSubmit:v=>!confirm("\u3053\u306E\u30B0\u30EB\u30FC\u30D7\u30ED\u30FC\u30EB\u5272\u5F53\u3092\u89E3\u9664\u3057\u307E\u3059\u304B\uFF1F")&&v.preventDefault(),children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"remove"}),(0,e.jsx)("input",{type:"hidden",name:"groupId",value:l.groupId}),(0,e.jsx)("input",{type:"hidden",name:"roleId",value:l.roleId}),(0,e.jsx)("button",{type:"submit",style:d.dangerBtn,children:a.remove})]})})]},`${l.groupId}-${l.roleId}`))})]}),(0,e.jsxs)(P.Form,{method:"post",style:d.card,children:[(0,e.jsx)("h3",{style:d.h3,children:p.newHeading}),(0,e.jsx)("input",{type:"hidden",name:"_action",value:"assign"}),(0,e.jsx)("input",{type:"hidden",name:"groupId",value:x?.value??""}),(0,e.jsx)("input",{type:"hidden",name:"roleId",value:u?.value??""}),(0,e.jsx)(W,{label:p.group,children:(0,e.jsx)(Y.SelectBox,{options:I,value:x,onChange:l=>f(l||void 0),placeholder:p.selectPlaceholder})}),(0,e.jsx)(W,{label:p.role,children:(0,e.jsx)(Y.SelectBox,{options:w,value:u,onChange:l=>S(l||void 0),placeholder:p.selectPlaceholder})}),(0,e.jsx)("button",{type:"submit",style:d.primary,children:a.assign})]})]})}var Pe={read:{bg:"#ecfdf5",text:"#047857",border:"#a7f3d0"},create:{bg:"#eff6ff",text:"#1d4ed8",border:"#bfdbfe"},update:{bg:"#fffbeb",text:"#b45309",border:"#fde68a"},delete:{bg:"#fef2f2",text:"#b91c1c",border:"#fecaca"}};function bt({users:t,roles:o,resources:s,grants:i,assignments:n,groupRoles:h=[],groups:p=[],selectedNode:a,onNodeClick:A}){let[I,w]=(0,_.useState)(null),x=new Set(n.map(r=>r.userId)),f=new Set(h.map(r=>r.groupId)),u=new Set([...n.map(r=>r.roleId),...h.map(r=>r.roleId),...i.map(r=>r.roleId)]),S=new Set(i.map(r=>r.resourceId)),l=t.filter(r=>x.has(r.id)),v=p.filter(r=>f.has(r.id)),K=o.filter(r=>u.has(r.id)),G=s.filter(r=>S.has(r.id)),Z=r=>{let y=i.filter(g=>g.resourceId===r),c=Array.from(new Set(y.map(g=>g.action)));return c.length>0?c:["none"]},he=r=>32+Z(r).length*24+6,M=16,B=0,X=new Map;G.forEach(r=>{let y=Z(r.id),c=he(r.id),g=B,$=new Map;y.forEach((T,E)=>{let L=g+8+24+E*24+12;$.set(T,L)}),X.set(r.id,{top:g,height:c,actionYMap:$}),B+=c+M});let ee=B>0?B-M:0,V=52,Q=18,F=V+Q,se=K.length>0?K.length*F-Q:0,te=v.length>0?v.length*F-Q:0,J=l.length>0?l.length*F-Q:0,R=Math.max(ee,se,te,J,320)+60,z=(R-ee)/2,O=(R-se)/2,k=(R-te)/2,j=(R-J)/2,U=(r,y)=>{let c=X.get(r);if(!c)return R/2;let g=c.actionYMap.get(y)??c.height/2;return z+g},pe=r=>O+r*F+V/2,$e=r=>k+r*F+V/2,Ge=r=>j+r*F+V/2,be=140,re=420,xe=700,ve=980,b=I||a,Ye=r=>{if(!b)return!0;if(b.type==="user")return b.id===r;if(b.type==="role")return n.some(y=>y.userId===r&&y.roleId===b.id);if(b.type==="group")return!1;if(b.type==="resource"){let y=i.filter(c=>c.resourceId===b.id).map(c=>c.roleId);return n.some(c=>c.userId===r&&y.includes(c.roleId))}return!0},Xe=r=>{if(!b)return!0;if(b.type==="group")return b.id===r;if(b.type==="role")return h.some(y=>y.groupId===r&&y.roleId===b.id);if(b.type==="user")return!1;if(b.type==="resource"){let y=i.filter(c=>c.resourceId===b.id).map(c=>c.roleId);return h.some(c=>c.groupId===r&&y.includes(c.roleId))}return!0},Qe=r=>b?b.type==="role"?b.id===r:b.type==="user"?n.some(y=>y.userId===b.id&&y.roleId===r):b.type==="group"?h.some(y=>y.groupId===b.id&&y.roleId===r):b.type==="resource"?i.some(y=>y.resourceId===b.id&&y.roleId===r):!0:!0,Je=r=>{if(!b)return!0;if(b.type==="resource")return b.id===r;if(b.type==="role")return i.some(y=>y.roleId===b.id&&y.resourceId===r);if(b.type==="group"){let y=h.filter(c=>c.groupId===b.id).map(c=>c.roleId);return i.some(c=>y.includes(c.roleId)&&c.resourceId===r)}if(b.type==="user"){let y=n.filter(c=>c.userId===b.id).map(c=>c.roleId);return i.some(c=>y.includes(c.roleId)&&c.resourceId===r)}return!0},Ze=(r,y)=>b?b.type==="user"?b.id===r&&n.some(c=>c.userId===r&&c.roleId===y):b.type==="role"?b.id===y&&n.some(c=>c.userId===r&&c.roleId===y):b.type==="resource"?i.filter(g=>g.resourceId===b.id).map(g=>g.roleId).includes(y)&&n.some(g=>g.userId===r&&g.roleId===y):b.type!=="group":!0,et=(r,y)=>b?b.type==="group"?b.id===r&&h.some(c=>c.groupId===r&&c.roleId===y):b.type==="role"?b.id===y&&h.some(c=>c.groupId===r&&c.roleId===y):b.type==="resource"?i.filter(g=>g.resourceId===b.id).map(g=>g.roleId).includes(y)&&h.some(g=>g.groupId===r&&g.roleId===y):b.type!=="user":!0,tt=(r,y)=>b?b.type==="role"?b.id===r&&i.some(c=>c.roleId===r&&c.resourceId===y):b.type==="resource"?b.id===y&&i.some(c=>c.roleId===r&&c.resourceId===y):b.type==="group"?h.filter(g=>g.groupId===b.id).map(g=>g.roleId).includes(r)&&i.some(g=>g.roleId===r&&g.resourceId===y):b.type==="user"?n.filter(g=>g.userId===b.id).map(g=>g.roleId).includes(r)&&i.some(g=>g.roleId===r&&g.resourceId===y):!0:!0,Le=[];n.forEach(r=>{let y=l.findIndex(g=>g.id===r.userId),c=K.findIndex(g=>g.id===r.roleId);if(y!==-1&&c!==-1){let g=n.filter(L=>L.roleId===r.roleId),$=g.findIndex(L=>L.userId===r.userId&&L.roleId===r.roleId),T=g.length,E=T>1?Math.min(Math.max(($-(T-1)/2)*4,-16),16):0;Le.push({uIdx:y,rIdx:c,active:Ze(r.userId,r.roleId),key:`ur-${r.userId}-${r.roleId}`,offset:E})}});let De=[];h.forEach(r=>{let y=v.findIndex(g=>g.id===r.groupId),c=K.findIndex(g=>g.id===r.roleId);if(y!==-1&&c!==-1){let g=h.filter(L=>L.roleId===r.roleId),$=g.findIndex(L=>L.groupId===r.groupId&&L.roleId===r.roleId),T=g.length,E=T>1?Math.min(Math.max(($-(T-1)/2)*4,-16),16):0;De.push({gIdx:y,rIdx:c,active:et(r.groupId,r.roleId),key:`gr-${r.groupId}-${r.roleId}`,offset:E})}});let We=[];return i.forEach(r=>{let y=K.findIndex(g=>g.id===r.roleId),c=G.findIndex(g=>g.id===r.resourceId);if(y!==-1&&c!==-1){let g=i.filter(me=>me.resourceId===r.resourceId&&me.action===r.action),$=g.findIndex(me=>me.id===r.id),T=g.length,E=T>1?Math.min(Math.max(($-(T-1)/2)*4,-12),12):0,L=Pe[r.action],rt=L?L.text:"#6366f1";We.push({rIdx:y,resIdx:c,active:tt(r.roleId,r.resourceId),key:`rr-grant-${r.id}`,action:r.action,color:rt,offset:E})}}),(0,e.jsx)("div",{"data-testid":"authz-topology-map",style:{width:"100%",overflowX:"auto",backgroundColor:"#ffffff",borderRadius:"10px",border:"1px solid #e2e8f0",padding:"1rem",boxSizing:"border-box"},children:(0,e.jsxs)("div",{style:{position:"relative",minWidth:"1160px",height:`${R}px`},children:[(0,e.jsxs)("svg",{style:{position:"absolute",top:0,left:0,width:"100%",height:"100%",pointerEvents:"none",zIndex:1},children:[(0,e.jsx)("title",{children:"Topology Connections"}),We.map(r=>{let y=i.find(E=>`rr-grant-${E.id}`===r.key);if(!y)return null;let c=U(y.resourceId,y.action)+r.offset,g=pe(r.rIdx),$=be+135,T=re-135;return(0,e.jsx)("path",{d:`M ${be+90} ${c} C ${$} ${c}, ${T} ${g}, ${re-90} ${g}`,fill:"none",stroke:r.active?r.color:"#cbd5e1",strokeWidth:r.active&&b?3:2,strokeOpacity:r.active?b?1:.75:.12,style:{transition:"all 0.2s ease"}},r.key)}),De.map(r=>{let y=pe(r.rIdx)+r.offset,c=$e(r.gIdx),g=re+135,$=xe-135;return(0,e.jsx)("path",{"data-testid":`topo-link-group-role-${r.key}`,"data-active":r.active?"true":"false",d:`M ${re+90} ${y} C ${g} ${y}, ${$} ${c}, ${xe-90} ${c}`,fill:"none",stroke:r.active?"#8b5cf6":"#cbd5e1",strokeWidth:r.active&&b?3:2,strokeDasharray:"4 2",strokeOpacity:r.active?b?1:.75:.12,style:{transition:"all 0.2s ease"}},r.key)}),Le.map(r=>{let y=pe(r.rIdx)+r.offset,c=Ge(r.uIdx),g=re+135,$=ve-135;return(0,e.jsx)("path",{"data-testid":`topo-link-user-role-${r.key}`,"data-active":r.active?"true":"false",d:`M ${re+90} ${y} C ${g} ${y}, ${$} ${c}, ${ve-90} ${c}`,fill:"none",stroke:r.active?"#4f46e5":"#cbd5e1",strokeWidth:r.active&&b?3:2,strokeOpacity:r.active?b?1:.75:.12,style:{transition:"all 0.2s ease"}},r.key)})]}),(0,e.jsxs)("div",{style:{position:"relative",zIndex:2,width:"100%",height:"100%"},children:[G.map(r=>{let y=a?.type==="resource"&&a.id===r.id,c=Je(r.id),g=X.get(r.id);if(!g)return null;let $=z+g.top,T=Z(r.id);return(0,e.jsxs)("div",{style:{position:"absolute",left:`${be-90}px`,top:`${$}px`,width:"180px",height:`${g.height}px`,borderRadius:"8px",border:y?"2px solid #10b981":"1px solid #a7f3d0",backgroundColor:y?"#d1fae5":c?"#ffffff":"#f8fafc",opacity:c?1:.35,boxShadow:y?"0 4px 12px rgba(16, 185, 129, 0.2)":"0 1px 3px rgba(0,0,0,0.05)",transition:"all 0.15s ease",padding:"8px",boxSizing:"border-box",display:"flex",flexDirection:"column"},children:[(0,e.jsxs)("button",{type:"button",onClick:()=>A("resource",r.id),onMouseEnter:()=>w({type:"resource",id:r.id}),onMouseLeave:()=>w(null),"data-testid":`topo-node-resource-${r.id}`,"aria-label":`\u30EA\u30BD\u30FC\u30B9: ${r.name}`,"aria-pressed":y,style:{background:"none",border:"none",padding:0,margin:0,cursor:"pointer",textAlign:"left",width:"100%",display:"flex",alignItems:"center",gap:"6px",marginBottom:"6px",height:"18px"},children:[(0,e.jsx)("span",{style:{fontSize:"1rem",flexShrink:0},children:"\u{1F511}"}),(0,e.jsx)("span",{style:{fontWeight:600,fontSize:"0.78rem",color:"#047857",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:r.name})]}),(0,e.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:"2px"},children:T.map(E=>{if(E==="none")return(0,e.jsx)("div",{style:{fontSize:"0.68rem",color:"#94a3b8",height:"22px",display:"flex",alignItems:"center",padding:"0 6px"},children:"\u6A29\u9650\u8A2D\u5B9A\u306A\u3057"},"none");let L=Pe[E]??{bg:"#ecfdf5",text:"#047857",border:"#a7f3d0"};return(0,e.jsxs)("div",{style:{height:"22px",boxSizing:"border-box",padding:"0 8px",borderRadius:"4px",backgroundColor:L.bg,color:L.text,border:`1px solid ${L.border}`,display:"flex",alignItems:"center",justifyContent:"space-between",fontSize:"0.68rem",fontWeight:600},children:[(0,e.jsx)("span",{children:E}),(0,e.jsx)("span",{style:{fontSize:"0.6rem",opacity:.6},children:"\u25CF"})]},E)})})]},r.id)}),K.map((r,y)=>{let c=a?.type==="role"&&a.id===r.id,g=Qe(r.id),$=pe(y);return(0,e.jsxs)("button",{type:"button",onClick:()=>A("role",r.id),onMouseEnter:()=>w({type:"role",id:r.id}),onMouseLeave:()=>w(null),"data-testid":`topo-node-role-${r.id}`,"aria-label":`\u30ED\u30FC\u30EB: ${r.name}`,"aria-pressed":c,style:{position:"absolute",left:`${re-90}px`,top:`${$-26}px`,width:"180px",height:"52px",borderRadius:"8px",border:c?"2px solid #6366f1":"1px solid #c7d2fe",backgroundColor:c?"#e0e7ff":g?"#ffffff":"#f8fafc",opacity:g?1:.35,cursor:"pointer",display:"flex",alignItems:"center",padding:"0 10px",gap:"8px",boxShadow:c?"0 4px 12px rgba(99, 102, 241, 0.2)":"0 1px 3px rgba(0,0,0,0.05)",transition:"all 0.15s ease",textAlign:"left",boxSizing:"border-box"},children:[(0,e.jsx)("span",{style:{fontSize:"1.1rem",flexShrink:0},children:"\u{1F6E1}\uFE0F"}),(0,e.jsxs)("div",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",flex:1,minWidth:0},children:[(0,e.jsx)("div",{style:{fontWeight:600,fontSize:"0.78rem",color:"#4338ca",textOverflow:"ellipsis",overflow:"hidden"},children:r.name}),(0,e.jsx)("div",{style:{fontSize:"0.68rem",color:"#64748b",fontFamily:"monospace",textOverflow:"ellipsis",overflow:"hidden"},children:r.roleKey})]})]},r.id)}),v.map((r,y)=>{let c=a?.type==="group"&&a.id===r.id,g=Xe(r.id),$=$e(y);return(0,e.jsxs)("button",{type:"button",onClick:()=>A("group",r.id),onMouseEnter:()=>w({type:"group",id:r.id}),onMouseLeave:()=>w(null),"data-testid":`topo-node-group-${r.id}`,"aria-label":`\u30B0\u30EB\u30FC\u30D7: ${r.name}`,"aria-pressed":c,style:{position:"absolute",left:`${xe-90}px`,top:`${$-26}px`,width:"180px",height:"52px",borderRadius:"8px",border:c?"2px solid #8b5cf6":"1px solid #ddd6fe",backgroundColor:c?"#f3e8ff":g?"#ffffff":"#f8fafc",opacity:g?1:.35,cursor:"pointer",display:"flex",alignItems:"center",padding:"0 10px",gap:"8px",boxShadow:c?"0 4px 12px rgba(139, 92, 246, 0.2)":"0 1px 3px rgba(0,0,0,0.05)",transition:"all 0.15s ease",textAlign:"left",boxSizing:"border-box"},children:[(0,e.jsx)("span",{style:{fontSize:"1.1rem",flexShrink:0},children:"\u{1F465}"}),(0,e.jsxs)("div",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",flex:1,minWidth:0},children:[(0,e.jsx)("div",{style:{fontWeight:600,fontSize:"0.78rem",color:"#6d28d9",textOverflow:"ellipsis",overflow:"hidden"},children:r.name}),(0,e.jsx)("div",{style:{fontSize:"0.68rem",color:"#64748b",fontFamily:"monospace",textOverflow:"ellipsis",overflow:"hidden"},children:r.groupKey})]})]},r.id)}),l.map((r,y)=>{let c=a?.type==="user"&&a.id===r.id,g=Ye(r.id),$=Ge(y);return(0,e.jsxs)("button",{type:"button",onClick:()=>A("user",r.id),onMouseEnter:()=>w({type:"user",id:r.id}),onMouseLeave:()=>w(null),"data-testid":`topo-node-user-${r.id}`,"aria-label":`\u30E6\u30FC\u30B6\u30FC: ${r.displayName}`,"aria-pressed":c,style:{position:"absolute",left:`${ve-90}px`,top:`${$-26}px`,width:"180px",height:"52px",borderRadius:"8px",border:c?"2px solid #0284c7":"1px solid #bae6fd",backgroundColor:c?"#e0f2fe":g?"#ffffff":"#f8fafc",opacity:g?1:.35,cursor:"pointer",display:"flex",alignItems:"center",padding:"0 10px",gap:"8px",boxShadow:c?"0 4px 12px rgba(2, 132, 199, 0.2)":"0 1px 3px rgba(0,0,0,0.05)",transition:"all 0.15s ease",textAlign:"left",boxSizing:"border-box"},children:[(0,e.jsx)("span",{style:{fontSize:"1.1rem",flexShrink:0},children:"\u{1F464}"}),(0,e.jsxs)("div",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",flex:1,minWidth:0},children:[(0,e.jsx)("div",{style:{fontWeight:600,fontSize:"0.78rem",color:"#0369a1",textOverflow:"ellipsis",overflow:"hidden"},children:r.displayName}),(0,e.jsx)("div",{style:{fontSize:"0.68rem",color:"#64748b",textOverflow:"ellipsis",overflow:"hidden"},children:r.email})]})]},r.id)})]})]})})}function Be(){let{users:t,roles:o,resources:s,grants:i,assignments:n,groupRoles:h=[],groups:p=[]}=(0,P.useLoaderData)(),[a,A]=(0,_.useState)(null),[I,w]=(0,_.useState)(""),[x,f]=(0,_.useState)("topology"),u=new Map(o.map(m=>[m.id,m])),S=new Map(s.map(m=>[m.id,m])),l=new Map(p.map(m=>[m.id,m])),v=new Map(t.map(m=>[m.id,m])),K=m=>{if(!a)return!0;if(a.type==="user")return a.id===m;if(a.type==="role")return n.some(R=>R.userId===m&&R.roleId===a.id);if(a.type==="group")return!1;if(a.type==="resource"){let R=i.filter(z=>z.resourceId===a.id).map(z=>z.roleId);return n.some(z=>z.userId===m&&R.includes(z.roleId))}return!0},G=m=>{if(!a)return!0;if(a.type==="group")return a.id===m;if(a.type==="role")return h.some(R=>R.groupId===m&&R.roleId===a.id);if(a.type==="user")return!1;if(a.type==="resource"){let R=i.filter(z=>z.resourceId===a.id).map(z=>z.roleId);return h.some(z=>z.groupId===m&&R.includes(z.roleId))}return!0},Z=m=>a?a.type==="role"?a.id===m:a.type==="user"?n.some(R=>R.userId===a.id&&R.roleId===m):a.type==="group"?h.some(R=>R.groupId===a.id&&R.roleId===m):a.type==="resource"?i.some(R=>R.resourceId===a.id&&R.roleId===m):!0:!0,he=m=>{if(!a)return!0;if(a.type==="resource")return a.id===m;if(a.type==="role")return i.some(R=>R.roleId===a.id&&R.resourceId===m);if(a.type==="group"){let R=h.filter(z=>z.groupId===a.id).map(z=>z.roleId);return i.some(z=>R.includes(z.roleId)&&z.resourceId===m)}if(a.type==="user"){let R=n.filter(z=>z.userId===a.id).map(z=>z.roleId);return i.some(z=>R.includes(z.roleId)&&z.resourceId===m)}return!0},M=I.trim().toLowerCase(),B=t.filter(m=>!M||m.displayName.toLowerCase().includes(M)||m.email?.toLowerCase().includes(M)),X=p.filter(m=>!M||m.name.toLowerCase().includes(M)||m.groupKey.toLowerCase().includes(M)),ee=o.filter(m=>!M||m.name.toLowerCase().includes(M)||m.roleKey.toLowerCase().includes(M)),V=s.filter(m=>!M||m.name.toLowerCase().includes(M)||m.resourceKey.toLowerCase().includes(M)||m.appKey.toLowerCase().includes(M)),Q=a?.type==="user"?v.get(a.id):null,F=a?.type==="group"?l.get(a.id):null,se=a?.type==="role"?u.get(a.id):null,te=a?.type==="resource"?S.get(a.id):null,J=(m,R)=>{a&&a.type===m&&a.id===R?A(null):A({type:m,id:R})};return(0,e.jsxs)("section",{"data-testid":"authz-graph-view",style:{display:"flex",flexDirection:"column",gap:"1rem",width:"100%"},children:[(0,e.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",flexWrap:"wrap",gap:"0.75rem",backgroundColor:"#f8fafc",padding:"0.75rem 1rem",borderRadius:"8px",border:"1px solid #e2e8f0",width:"100%",boxSizing:"border-box"},children:[(0,e.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"0.75rem",flexWrap:"wrap"},children:[(0,e.jsxs)("div",{style:{display:"inline-flex",borderRadius:"6px",border:"1px solid #cbd5e1",padding:"2px",backgroundColor:"#ffffff"},children:[(0,e.jsx)("button",{type:"button",onClick:()=>f("topology"),"data-testid":"switch-mode-topology",style:{padding:"3px 10px",borderRadius:"4px",border:"none",cursor:"pointer",fontSize:"0.75rem",fontWeight:x==="topology"?600:400,backgroundColor:x==="topology"?"#eff6ff":"transparent",color:x==="topology"?"#0284c7":"#64748b",boxShadow:x==="topology"?"0 1px 2px rgba(0,0,0,0.08)":"none"},children:"\u{1F310} \u30C8\u30DD\u30ED\u30B8\u30DE\u30C3\u30D7 (Topology)"}),(0,e.jsx)("button",{type:"button",onClick:()=>f("columns"),"data-testid":"switch-mode-columns",style:{padding:"3px 10px",borderRadius:"4px",border:"none",cursor:"pointer",fontSize:"0.75rem",fontWeight:x==="columns"?600:400,backgroundColor:x==="columns"?"#eff6ff":"transparent",color:x==="columns"?"#0284c7":"#64748b",boxShadow:x==="columns"?"0 1px 2px rgba(0,0,0,0.08)":"none"},children:"\u{1F4CB} \u30AB\u30E9\u30E0\u4E00\u89A7 (Columns)"})]}),(0,e.jsxs)("div",{style:{display:"flex",gap:"0.4rem",fontSize:"0.75rem",flexWrap:"wrap"},children:[(0,e.jsxs)("span",{style:{backgroundColor:"#e0f2fe",color:"#0369a1",padding:"2px 8px",borderRadius:"12px",fontWeight:600},children:["\u{1F464} \u30E6\u30FC\u30B6\u30FC: ",t.length]}),(0,e.jsxs)("span",{style:{backgroundColor:"#f3e8ff",color:"#6d28d9",padding:"2px 8px",borderRadius:"12px",fontWeight:600},children:["\u{1F465} \u30B0\u30EB\u30FC\u30D7: ",p.length]}),(0,e.jsxs)("span",{style:{backgroundColor:"#e0e7ff",color:"#4338ca",padding:"2px 8px",borderRadius:"12px",fontWeight:600},children:["\u{1F6E1}\uFE0F \u30ED\u30FC\u30EB: ",o.length]}),(0,e.jsxs)("span",{style:{backgroundColor:"#d1fae5",color:"#047857",padding:"2px 8px",borderRadius:"12px",fontWeight:600},children:["\u{1F511} \u30EA\u30BD\u30FC\u30B9: ",s.length]}),(0,e.jsxs)("span",{style:{backgroundColor:"#fef3c7",color:"#b45309",padding:"2px 8px",borderRadius:"12px",fontWeight:600},children:["\u26A1\uFE0F \u6A29\u9650\u8A2D\u5B9A: ",i.length]})]})]}),(0,e.jsx)("div",{style:{display:"flex",alignItems:"center",gap:"0.5rem"},children:(0,e.jsx)("input",{type:"text",placeholder:"\u30AD\u30FC\u30EF\u30FC\u30C9\u3067\u7D5E\u308A\u8FBC\u307F...",value:I,onChange:m=>w(m.target.value),"data-testid":"graph-search-input",style:{padding:"5px 10px",borderRadius:"6px",border:"1px solid #cbd5e1",fontSize:"0.8rem",width:"200px"}})})]}),(0,e.jsxs)("div",{style:{minHeight:"38px",height:"38px",display:"flex",alignItems:"center",justifyContent:"space-between",backgroundColor:a?"#eff6ff":"#f8fafc",border:`1px solid ${a?"#bfdbfe":"#e2e8f0"}`,padding:"0 0.8rem",borderRadius:"6px",fontSize:"0.8rem",color:a?"#1e40af":"#64748b",width:"100%",boxSizing:"border-box",transition:"all 0.15s ease"},children:[(0,e.jsx)("div",{style:{display:"flex",alignItems:"center",gap:"0.4rem",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:a?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("span",{children:"\u{1F3AF}"}),(0,e.jsx)("strong",{children:"\u9078\u629E\u4E2D\u306E\u30CE\u30FC\u30C9:"}),(0,e.jsxs)("span",{children:[Q&&`\u30E6\u30FC\u30B6\u30FC\u300C${Q.displayName} (${Q.email})\u300D\u306B\u95A2\u9023\u3059\u308B\u30D1\u30B9\u3092\u8868\u793A\u4E2D`,F&&`\u30B0\u30EB\u30FC\u30D7\u300C${F.name} (${F.groupKey})\u300D\u306B\u95A2\u9023\u3059\u308B\u30D1\u30B9\u3092\u8868\u793A\u4E2D`,se&&`\u30ED\u30FC\u30EB\u300C${se.name} (${se.roleKey})\u300D\u306B\u95A2\u9023\u3059\u308B\u30D1\u30B9\u3092\u8868\u793A\u4E2D`,te&&`\u30EA\u30BD\u30FC\u30B9\u300C${te.name} (${te.appKey}:${te.resourceKey})\u300D\u306B\u95A2\u9023\u3059\u308B\u30D1\u30B9\u3092\u8868\u793A\u4E2D`]})]}):(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("span",{children:"\u{1F4A1}"}),(0,e.jsxs)("span",{children:[(0,e.jsx)("strong",{children:"\u30D2\u30F3\u30C8:"})," \u30CE\u30FC\u30C9\uFF08\u30EA\u30BD\u30FC\u30B9\u30FB\u30ED\u30FC\u30EB\u30FB\u30B0\u30EB\u30FC\u30D7\u30FB\u30E6\u30FC\u30B6\u30FC\uFF09\u3092\u30AF\u30EA\u30C3\u30AF\u3059\u308B\u3068\u3001\u95A2\u9023\u3059\u308B\u5168\u30D1\u30B9\u304C\u30CF\u30A4\u30E9\u30A4\u30C8\u8868\u793A\u3055\u308C\u307E\u3059"]})]})}),a&&(0,e.jsx)("button",{type:"button",onClick:()=>A(null),"data-testid":"graph-reset-selection",style:{padding:"3px 8px",borderRadius:"4px",border:"1px solid #93c5fd",backgroundColor:"#ffffff",fontSize:"0.72rem",cursor:"pointer",color:"#1d4ed8",fontWeight:600,whiteSpace:"nowrap",boxShadow:"0 1px 2px rgba(0,0,0,0.05)"},children:"\u2715 \u9078\u629E\u89E3\u9664"})]}),x==="topology"?(0,e.jsx)(bt,{users:B,roles:ee,resources:V,grants:i,assignments:n,groupRoles:h,groups:X,selectedNode:a,onNodeClick:J}):(0,e.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"repeat(4, minmax(0, 1fr))",gap:"1rem",alignItems:"start",width:"100%",boxSizing:"border-box"},children:[(0,e.jsxs)("div",{style:{backgroundColor:"#ffffff",borderRadius:"8px",border:"1px solid #e2e8f0",padding:"0.75rem"},children:[(0,e.jsxs)("div",{style:{fontWeight:700,fontSize:"0.85rem",color:"#047857",marginBottom:"0.6rem",display:"flex",alignItems:"center",gap:"0.3rem",borderBottom:"2px solid #a7f3d0",paddingBottom:"0.4rem"},children:[(0,e.jsx)("span",{children:"\u{1F511}"})," \u30EA\u30BD\u30FC\u30B9 (",V.length,")"]}),(0,e.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"0.5rem",maxHeight:"480px",overflowY:"auto",paddingRight:"4px"},children:[V.length===0&&(0,e.jsx)("div",{style:{fontSize:"0.8rem",color:"#94a3b8",textAlign:"center",padding:"1rem"},children:"\u5BFE\u8C61\u306E\u30EA\u30BD\u30FC\u30B9\u304C\u3042\u308A\u307E\u305B\u3093"}),V.map(m=>{let R=a?.type==="resource"&&a.id===m.id,z=he(m.id),O=i.filter(k=>k.resourceId===m.id);return(0,e.jsxs)("button",{type:"button",onClick:()=>J("resource",m.id),"data-testid":`graph-node-resource-${m.id}`,style:{textAlign:"left",width:"100%",padding:"0.6rem",borderRadius:"6px",border:R?"2px solid #10b981":"1px solid #e2e8f0",backgroundColor:R?"#d1fae5":z?"#ffffff":"#f8fafc",opacity:z?1:.4,cursor:"pointer",transition:"all 0.15s ease",boxShadow:R?"0 2px 4px rgba(16, 185, 129, 0.15)":"none"},children:[(0,e.jsx)("div",{style:{fontWeight:600,fontSize:"0.82rem",color:"#0f172a"},children:m.name}),(0,e.jsxs)("div",{style:{fontSize:"0.72rem",color:"#64748b",fontFamily:"monospace"},children:[m.appKey,":",m.resourceKey]}),(0,e.jsxs)("div",{style:{display:"flex",flexWrap:"wrap",gap:"0.25rem",marginTop:"0.4rem"},children:[O.map(k=>{let j=u.get(k.roleId),U=Pe[k.action]??{bg:"#f1f5f9",text:"#475569",border:"#cbd5e1"};return(0,e.jsxs)("span",{style:{fontSize:"0.68rem",padding:"1px 6px",borderRadius:"4px",backgroundColor:U.bg,color:U.text,border:`1px solid ${U.border}`},children:[j?.roleKey??`Role#${k.roleId}`,": ",(0,e.jsx)("strong",{children:k.action})]},k.id)}),O.length===0&&(0,e.jsx)("span",{style:{fontSize:"0.68rem",color:"#94a3b8"},children:"\u6A29\u9650\u8A2D\u5B9A\u306A\u3057"})]})]},m.id)})]})]}),(0,e.jsxs)("div",{style:{backgroundColor:"#ffffff",borderRadius:"8px",border:"1px solid #e2e8f0",padding:"0.75rem"},children:[(0,e.jsxs)("div",{style:{fontWeight:700,fontSize:"0.85rem",color:"#4338ca",marginBottom:"0.6rem",display:"flex",alignItems:"center",gap:"0.3rem",borderBottom:"2px solid #c7d2fe",paddingBottom:"0.4rem"},children:[(0,e.jsx)("span",{children:"\u{1F6E1}\uFE0F"})," \u30ED\u30FC\u30EB (",ee.length,")"]}),(0,e.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"0.5rem",maxHeight:"480px",overflowY:"auto",paddingRight:"4px"},children:[ee.length===0&&(0,e.jsx)("div",{style:{fontSize:"0.8rem",color:"#94a3b8",textAlign:"center",padding:"1rem"},children:"\u5BFE\u8C61\u306E\u30ED\u30FC\u30EB\u304C\u3042\u308A\u307E\u305B\u3093"}),ee.map(m=>{let R=a?.type==="role"&&a.id===m.id,z=Z(m.id),O=i.filter(U=>U.roleId===m.id),k=n.filter(U=>U.roleId===m.id),j=h.filter(U=>U.roleId===m.id);return(0,e.jsxs)("button",{type:"button",onClick:()=>J("role",m.id),"data-testid":`graph-node-role-${m.id}`,style:{textAlign:"left",width:"100%",padding:"0.6rem",borderRadius:"6px",border:R?"2px solid #6366f1":"1px solid #e2e8f0",backgroundColor:R?"#e0e7ff":z?"#ffffff":"#f8fafc",opacity:z?1:.4,cursor:"pointer",transition:"all 0.15s ease",boxShadow:R?"0 2px 4px rgba(99, 102, 241, 0.15)":"none"},children:[(0,e.jsx)("div",{style:{fontWeight:600,fontSize:"0.82rem",color:"#0f172a"},children:m.name}),(0,e.jsx)("div",{style:{fontSize:"0.72rem",color:"#64748b",fontFamily:"monospace"},children:m.roleKey}),(0,e.jsxs)("div",{style:{fontSize:"0.7rem",color:"#475569",marginTop:"0.3rem",display:"flex",gap:"0.5rem"},children:[(0,e.jsxs)("span",{children:["\u6A29\u9650: ",O.length]}),(0,e.jsxs)("span",{children:["\u30B0\u30EB\u30FC\u30D7: ",j.length]}),(0,e.jsxs)("span",{children:["\u30E6\u30FC\u30B6\u30FC: ",k.length]})]})]},m.id)})]})]}),(0,e.jsxs)("div",{style:{backgroundColor:"#ffffff",borderRadius:"8px",border:"1px solid #e2e8f0",padding:"0.75rem"},children:[(0,e.jsxs)("div",{style:{fontWeight:700,fontSize:"0.85rem",color:"#6d28d9",marginBottom:"0.6rem",display:"flex",alignItems:"center",gap:"0.3rem",borderBottom:"2px solid #ddd6fe",paddingBottom:"0.4rem"},children:[(0,e.jsx)("span",{children:"\u{1F465}"})," \u30B0\u30EB\u30FC\u30D7 (",X.length,")"]}),(0,e.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"0.5rem",maxHeight:"480px",overflowY:"auto",paddingRight:"4px"},children:[X.length===0&&(0,e.jsx)("div",{style:{fontSize:"0.8rem",color:"#94a3b8",textAlign:"center",padding:"1rem"},children:"\u5BFE\u8C61\u306E\u30B0\u30EB\u30FC\u30D7\u304C\u3042\u308A\u307E\u305B\u3093"}),X.map(m=>{let R=a?.type==="group"&&a.id===m.id,z=G(m.id),O=h.filter(k=>k.groupId===m.id);return(0,e.jsxs)("button",{type:"button",onClick:()=>J("group",m.id),"data-testid":`graph-node-group-${m.id}`,style:{textAlign:"left",width:"100%",padding:"0.6rem",borderRadius:"6px",border:R?"2px solid #8b5cf6":"1px solid #e2e8f0",backgroundColor:R?"#f3e8ff":z?"#ffffff":"#f8fafc",opacity:z?1:.4,cursor:"pointer",transition:"all 0.15s ease",boxShadow:R?"0 2px 4px rgba(139, 92, 246, 0.15)":"none"},children:[(0,e.jsx)("div",{style:{fontWeight:600,fontSize:"0.82rem",color:"#0f172a"},children:m.name}),(0,e.jsx)("div",{style:{fontSize:"0.72rem",color:"#64748b",fontFamily:"monospace"},children:m.groupKey}),(0,e.jsxs)("div",{style:{display:"flex",flexWrap:"wrap",gap:"0.25rem",marginTop:"0.4rem"},children:[O.map(k=>{let j=u.get(k.roleId);return(0,e.jsxs)("span",{style:{fontSize:"0.68rem",padding:"1px 6px",borderRadius:"4px",backgroundColor:"#f3e8ff",color:"#6d28d9",border:"1px solid #ddd6fe",fontWeight:600},children:["\u{1F6E1}\uFE0F ",j?.name??k.roleKey]},`${k.groupId}-${k.roleId}`)}),O.length===0&&(0,e.jsx)("span",{style:{fontSize:"0.68rem",color:"#94a3b8"},children:"\u30ED\u30FC\u30EB\u672A\u5272\u308A\u5F53\u3066"})]})]},m.id)})]})]}),(0,e.jsxs)("div",{style:{backgroundColor:"#ffffff",borderRadius:"8px",border:"1px solid #e2e8f0",padding:"0.75rem"},children:[(0,e.jsxs)("div",{style:{fontWeight:700,fontSize:"0.85rem",color:"#0369a1",marginBottom:"0.6rem",display:"flex",alignItems:"center",gap:"0.3rem",borderBottom:"2px solid #bae6fd",paddingBottom:"0.4rem"},children:[(0,e.jsx)("span",{children:"\u{1F464}"})," \u30E6\u30FC\u30B6\u30FC (",B.length,")"]}),(0,e.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"0.5rem",maxHeight:"480px",overflowY:"auto",paddingRight:"4px"},children:[B.length===0&&(0,e.jsx)("div",{style:{fontSize:"0.8rem",color:"#94a3b8",textAlign:"center",padding:"1rem"},children:"\u5BFE\u8C61\u306E\u30E6\u30FC\u30B6\u30FC\u304C\u3042\u308A\u307E\u305B\u3093"}),B.map(m=>{let R=a?.type==="user"&&a.id===m.id,z=K(m.id),O=n.filter(k=>k.userId===m.id);return(0,e.jsxs)("button",{type:"button",onClick:()=>J("user",m.id),"data-testid":`graph-node-user-${m.id}`,style:{textAlign:"left",width:"100%",padding:"0.6rem",borderRadius:"6px",border:R?"2px solid #0284c7":"1px solid #e2e8f0",backgroundColor:R?"#e0f2fe":z?"#ffffff":"#f8fafc",opacity:z?1:.4,cursor:"pointer",transition:"all 0.15s ease",boxShadow:R?"0 2px 4px rgba(2, 132, 199, 0.15)":"none"},children:[(0,e.jsx)("div",{style:{fontWeight:600,fontSize:"0.82rem",color:"#0f172a"},children:m.displayName}),(0,e.jsx)("div",{style:{fontSize:"0.72rem",color:"#64748b"},children:m.email}),(0,e.jsxs)("div",{style:{display:"flex",flexWrap:"wrap",gap:"0.25rem",marginTop:"0.4rem"},children:[O.map(k=>{let j=u.get(k.roleId);return(0,e.jsxs)("span",{style:{fontSize:"0.68rem",padding:"1px 6px",borderRadius:"4px",backgroundColor:"#e0f2fe",color:"#0369a1",border:"1px solid #bae6fd",fontWeight:600},children:["\u{1F6E1}\uFE0F ",j?.name??k.roleKey]},`${k.userId}-${k.roleId}`)}),O.length===0&&(0,e.jsx)("span",{style:{fontSize:"0.68rem",color:"#94a3b8"},children:"\u76F4\u63A5\u30ED\u30FC\u30EB\u306A\u3057"})]})]},m.id)})]})]})]})]})}var xt={roles:ke,resources:Ue,role_permissions:Fe,user_roles:He,group_roles:qe,graph:Be};function vt({renderHeader:t}={}){let{segment:o}=(0,P.useLoaderData)(),s=xt[o]??ke;return(0,e.jsx)(_e,{renderHeader:t,children:(0,e.jsx)(s,{})})}function wt(t){let o={};for(let s of Object.keys(t)){let i=t[s];o[s]={key:i.key??s,name:i.name,description:i.description}}return o}function Rt(t){return Object.values(t).map(o=>o.key)}var H=require("@aiquants/authz-core"),je=require("react-router"),St="@aiquants/authz-react-router",q=class extends Error{constructor(o){super(`[${St}] ${o}`),this.name="AuthzUsageError"}};function Ce(t,o){let s=(0,H.can)(o,"read"),i=(0,H.can)(o,"create"),n=(0,H.can)(o,"update"),h=(0,H.can)(o,"delete"),p=o?.scopeByAction.read,a=s&&(!p||p.rowScope!==null||p.columnScope!==null);return{resourceKey:t,canRead:s,canCreate:i,canUpdate:n,canDelete:h,canWrite:i||n,readPartial:a,actions:o?Array.from(o.actions):[]}}function ce(t){return t===null?"null":typeof t=="string"?`a string (${JSON.stringify(t)})`:Array.isArray(t)?"an array":`${typeof t} (${String(t)})`}function Ve(t,o){if(!Array.isArray(t)){let n=typeof t=="string"?` A bare string would be iterated character by character; pass \`{ resourceKeys: [${JSON.stringify(t)}] }\` instead.`:"";throw new q(`${o} must be an array of resource keys, but received ${ce(t)}.${n}`)}let s=new Set,i=[];return t.forEach((n,h)=>{if(typeof n!="string"||n.trim()==="")throw new q(`${o}[${h}] must be a non-empty resource key string, but received ${ce(n)}.`);s.has(n)||(s.add(n),i.push(n))}),i}function At(t){if(t==null)return;let o=t;if(o.actions instanceof Set&&typeof o.scopeByAction=="object")throw new q("createAuthz({ getEffectivePermissions }) must resolve to a record keyed by resource key (e.g. getEffectivePermissionsMany from @aiquants/authz-drizzle), but it resolved to a single EffectivePermission. Keeping the single-resource port would deny every resource silently.")}function It(t){if(typeof t!="object"||t===null)throw new q(`requirePermission(request, query) requires a query object like { resourceKey: "documents", action: "read" }, but received ${ce(t)}.`);let{resourceKey:o,action:s}=t;if(typeof o!="string"||o.trim()==="")throw new q(`query.resourceKey must be a non-empty string, but received ${ce(o)}.`);if(typeof s!="string"||!H.AUTHZ_ACTIONS.includes(s)){let i=s==="write"?' "write" is a derived concept (create \u222A update) and is never guarded directly \u2014 guard "create" or "update".':"";throw new q(`query.action must be one of ${H.AUTHZ_ACTIONS.join(" | ")}, but received ${ce(s)}.${i}`)}return{resourceKey:o,action:s}}function zt(t){async function o(p){return t.resolveGroupIds?await t.resolveGroupIds(p)??void 0:void 0}async function s(p,a,A){if(a.length===0)return{};let I=await o(p),w=await t.getEffectivePermissions({userId:A,groupIds:I,appKey:t.appKey,resourceKeys:a});return At(w),Object.fromEntries(a.map(x=>[x,(w&&Object.hasOwn(w,x)?w[x]:null)??null]))}async function i(p,a,A){let{resourceKey:I,action:w}=It(a),x=A?.failureRedirect?()=>{throw(0,je.redirect)(A.failureRedirect)}:t.onDeny,u=await(0,H.createRequirePermission)({resolveUserId:t.resolveUserId,getEffectivePermissions:async S=>(await s(p,[S.resourceKey],S.userId))[S.resourceKey],onDeny:x})(p,{appKey:t.appKey,resourceKey:I,action:w});return{userId:u.userId,scope:u.scope,permission:Ce(I,u.effectivePermission)}}async function n(p){if(!t.listResourceKeys)throw new q('getMyPermissions(request) needs to know which resources exist. Either pass them explicitly \u2014 getMyPermissions(request, { resourceKeys: ["documents"] }) \u2014 or configure createAuthz({ listResourceKeys }) (e.g. listResourceKeys from @aiquants/authz-drizzle) to report on every registered resource.');return Ve(await t.listResourceKeys(p)??[],"the listResourceKeys port result")}async function h(p,a){let A=a?.resourceKeys===void 0?await n(p):Ve(a.resourceKeys,"getMyPermissions options.resourceKeys"),I=await t.resolveUserId(p)??null,w=await s(p,A,I);return Object.fromEntries(A.map(x=>[x,Ce(x,w[x])]))}return{requirePermission:i,getMyPermissions:h}}0&&(module.exports={AuthzAdminAppView,AuthzErrorBoundary,AuthzGrantsView,AuthzGraphView,AuthzGroupRolesView,AuthzLayout,AuthzResourcesView,AuthzRolesView,AuthzUsageError,AuthzUserRolesView,ErrorAlert,Field,MyPermissionGroupStatus,MyPermissionIndicator,MyPermissionStatus,createAuthz,createAuthzAdminApp,createAuthzAdminServer,defaultAuthzAdminLabels,defineResources,flattenGroupItems,formatResourceTooltip,getPermissionSummary,makeAuthzErrorBoundary,resolveLabels,resourceKeysOf,toPermissionView,ui,usePermission});
1
+ "use strict";var Ae=Object.defineProperty;var it=Object.getOwnPropertyDescriptor;var at=Object.getOwnPropertyNames;var dt=Object.prototype.hasOwnProperty;var lt=(t,r)=>{for(var a in r)Ae(t,a,{get:r[a],enumerable:!0})},ut=(t,r,a,s)=>{if(r&&typeof r=="object"||typeof r=="function")for(let l of at(r))!dt.call(t,l)&&l!==a&&Ae(t,l,{get:()=>r[l],enumerable:!(s=it(r,l))||s.enumerable});return t};var ct=t=>ut(Ae({},"__esModule",{value:!0}),t);var Ct={};lt(Ct,{AuthzAdminAppView:()=>At,AuthzErrorBoundary:()=>xt,AuthzGrantsView:()=>He,AuthzGraphView:()=>je,AuthzGroupRolesView:()=>Ve,AuthzLayout:()=>bt,AuthzResourcesView:()=>qe,AuthzRolesView:()=>Te,AuthzUsageError:()=>Q,AuthzUserRolesView:()=>Be,ErrorAlert:()=>se,Field:()=>N,MyPermissionGroupStatus:()=>Pe,MyPermissionIndicator:()=>he,MyPermissionStatus:()=>gt,createAuthz:()=>Kt,createAuthzAdminApp:()=>mt,createAuthzAdminServer:()=>Re,defaultAuthzAdminLabels:()=>Ne,defineResources:()=>Rt,flattenGroupItems:()=>be,formatResourceTooltip:()=>ze,getPermissionSummary:()=>Oe,makeAuthzErrorBoundary:()=>Fe,resolveLabels:()=>ue,resourceKeysOf:()=>St,toPermissionView:()=>xe,ui:()=>i,usePermission:()=>Se});module.exports=ct(Ct);var ge=require("react-router");var Y=require("@aiquants/authz-core"),U=require("react-router");var Ne={title:"Authorization (RBAC)",myPermission:"Your permissions",tabs:{roles:"Roles",resources:"Resources",role_permissions:"Permissions",user_roles:"User assignments",group_roles:"Group assignments",graph:"Graph"},common:{add:"Add",save:"Save",delete:"Delete",remove:"Remove",assign:"Assign",grant:"Grant",select:"Select\u2026",active:"\u25CB Enabled",inactive:"\xD7 Disabled",optional:"optional",tenant:"tenant",tenantHint:"must match the tenant you are signed in to",unknownTenant:"\u2014"},roles:{heading:"Roles (TMRole)",note:"Edit name / description inline and click Save (role_key is an immutable identifier).",roleKey:"role_key",name:"name",description:"description",activeHeader:"Active",empty:"No roles",newHeading:"New role",hintRoleKey:"e.g. admin"},resources:{heading:"Resources (TMResource)",note:"Edit name / description inline and click Save (app_key / resource_key are immutable identifiers).",appKey:"app_key",resourceKey:"resource_key",name:"name",description:"description",empty:"No resources",newHeading:"New resource",hintAppKey:"e.g. quants",hintResourceKey:"e.g. daily_report",hintDailyReport:"optional"},grants:{heading:"Permissions (TDRolePermission)",note:"Empty row_scope / column_scope = all rows / all columns (NULL). JSON must satisfy the row_scope / column_scope contract.",role:"role",resource:"resource",action:"action",rowScope:"row_scope",columnScope:"column_scope",empty:"No permissions",newHeading:"Grant a permission",rowScopeHint:"JSON / empty = all rows",columnScopeHint:"JSON / empty = all columns",rowScopePlaceholder:"empty = all rows (NULL)",columnScopePlaceholder:"empty = all columns (NULL)",nullRows:"NULL (all rows)",nullCols:"NULL (all columns)",selectPlaceholder:"Select\u2026"},userRoles:{heading:"User assignments (TDUserRole)",note:"Assign active roles to specific users.",user:"user",role:"role",empty:"No assignments",newHeading:"Assign a role",selectPlaceholder:"Select\u2026"},groupRoles:{heading:"Group assignments (TDGroupRole)",note:"Assign active roles to user groups.",group:"group",role:"role",empty:"No group assignments",newHeading:"Assign a role to group",selectPlaceholder:"Select\u2026"},error:{forbiddenTitle:"Access denied",forbiddenBody:"You don't have permission to view this screen. Ask an administrator to grant access.",genericTitlePrefix:"Error",genericTitle:"An error occurred",genericBody:"An unexpected error occurred. Please try again later."},warn:{selfRoleDisable:"This role backs your own authorization-admin access. Disabling it may lock you out of this screen. Continue?",selfRoleDelete:"This role backs your own authorization-admin access. Deleting it may lock you out of this screen. Continue?",selfAssignmentRemove:"This assignment backs your own authorization-admin access. Removing it may lock you out of this screen. Continue?"}};function ue(t){let r=Ne;return t?{title:t.title??r.title,myPermission:t.myPermission??r.myPermission,tabs:{...r.tabs,...t.tabs},common:{...r.common,...t.common},roles:{...r.roles,...t.roles},resources:{...r.resources,...t.resources},grants:{...r.grants,...t.grants},userRoles:{...r.userRoles,...t.userRoles},groupRoles:{...r.groupRoles,...t.groupRoles},error:{...r.error,...t.error},warn:{...r.warn,...t.warn}}:r}var pt=t=>t instanceof Response;function ce(t){if(pt(t))throw t;if(t instanceof Y.AuthzDeniedError)throw new Response(t.message,{status:403});return(0,U.data)({error:t instanceof Error?t.message:"\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F"},{status:400})}function Re(t){let r=t.store,a=t.resourceKey??"authz_admin",s=ue(t.labels);function l(d,u){throw new Y.AuthzDeniedError({appKey:"",resourceKey:a,action:u,reason:"tenant-mismatch",tenantId:d.tenantId,userId:d.userId})}function c(d,u,R,m){let x=d.find($=>$.id===u);return x||l(R,m),x}function b(d,u,R,m){let x=c(d,u,R,m);return(0,Y.isSameTenant)(R.tenantId,x.tenantId)||l(R,m),x}function o(d,u,R){(0,Y.isSameTenant)(d.tenantId,R)||l(d,u)}async function w(d,u,R){return b(await r.listRoles(d.tenantId),R,d,u)}async function k(d,u,R){return b(await r.listResources(d.tenantId),R,d,u)}async function z(d,u,R){return b(await r.listGroups(d.tenantId),R,d,u)}async function A(d,u,R){c(await r.listUsers(d.tenantId),R,d,u)}async function C(d,u,R){c(await r.listGrants(d.tenantId),R,d,u)}let I=async(d,u)=>{let{userId:R,tenantId:m,permission:x}=await t.requirePermission(d,u);if((0,Y.assertTenantId)(m,"createAuthzAdminServer(requirePermission.tenantId)"),R==null)throw new Y.AuthzDeniedError({appKey:"",resourceKey:u.resourceKey,action:u.action,reason:"unresolved-user",tenantId:m,userId:null});return{userId:R,tenantId:m,permission:x}};async function G(d){await t.requireUser(d);try{let{userId:u,tenantId:R,permission:m}=await I(d,{resourceKey:a,action:"read"});return{userId:u,tenantId:R,myPermissions:{[a]:m}}}catch(u){throw u instanceof Y.AuthzDeniedError?new Response(`Forbidden: ${a}`,{status:403}):u}}let y=async d=>{let[u,R]=await Promise.all([r.listRoles(d.tenantId),r.getSelfAdminContext(d.tenantId,Number(d.userId))]);return{roles:u,selfAdminRoleIds:R.selfAdminRoleIds,tenantId:d.tenantId,labels:s}},S=async d=>({resources:await r.listResources(d.tenantId),tenantId:d.tenantId,labels:s}),E=async d=>{let[u,R,m]=await Promise.all([r.listGrants(d.tenantId),r.listRoles(d.tenantId),r.listResources(d.tenantId)]);return{grants:u,roles:R,resources:m,tenantId:d.tenantId,labels:s}},q=async d=>{let[u,R,m,x]=await Promise.all([r.listUserRoles(d.tenantId),r.listRoles(d.tenantId),r.listUsers(d.tenantId),r.getSelfAdminContext(d.tenantId,Number(d.userId))]);return{assignments:u,roles:R,users:m,actorUserId:x.actorUserId,selfAdminRoleIds:x.selfAdminRoleIds,tenantId:d.tenantId,labels:s}},ne=async d=>{let[u,R,m]=await Promise.all([r.listGroupRoles(d.tenantId),r.listRoles(d.tenantId),r.listGroups(d.tenantId)]);return{groupRoles:u,roles:R,groups:m,tenantId:d.tenantId,labels:s}},ae=async d=>{let[u,R,m,x,$,L,_]=await Promise.all([r.listUsers(d.tenantId),r.listRoles(d.tenantId),r.listResources(d.tenantId),r.listGrants(d.tenantId),r.listUserRoles(d.tenantId),r.listGroupRoles(d.tenantId),r.listGroups(d.tenantId)]);return{users:u,roles:R,resources:m,grants:x,assignments:$,groupRoles:L,groups:_,tenantId:d.tenantId,labels:s}};return{labels:s,resourceKey:a,layoutGuard:G,layout:{async loader({request:d}){let{tenantId:u,myPermissions:R}=await G(d);return{myPermissions:R,tenantId:u,labels:s,adminResourceKey:a}}},index:{loader(){throw(0,U.redirect)("/authz/roles")}},roles:{data:y,async loader({request:d}){let u=await I(d,{resourceKey:a,action:"read"});return y(u)},async action({request:d}){let u=await d.formData(),R=String(u.get("_action"));try{switch(R){case"create":{let m=await I(d,{resourceKey:a,action:"create"}),x=String(u.get("tenantId")??"").trim(),$=String(u.get("roleKey")??"").trim(),L=String(u.get("name")??"").trim();return x&&$&&L?(o(m,"create",x),await r.createRole(m.tenantId,{tenantId:x,roleKey:$,name:L,description:String(u.get("description")??"").trim()||null},String(m.userId)),{ok:!0}):(0,U.data)({error:"tenant_id \u3068 role_key \u3068 name \u306F\u5FC5\u9808\u3067\u3059"},{status:400})}case"save":{let m=await I(d,{resourceKey:a,action:"update"}),x=String(u.get("tenantId")??"").trim(),$=String(u.get("roleKey")??"").trim(),L=String(u.get("name")??"").trim();if(!(x&&$&&L))return(0,U.data)({error:"tenantId \u3068 roleKey \u3068 name \u306F\u5FC5\u9808\u3067\u3059"},{status:400});o(m,"update",x);let _=await w(m,"update",Number(u.get("id")));return await r.updateRole(m.tenantId,_.id,{tenantId:x,roleKey:$,name:L,description:String(u.get("description")??"").trim()||null},String(m.userId)),{ok:!0}}case"toggle":{let m=await I(d,{resourceKey:a,action:"update"}),x=await w(m,"update",Number(u.get("id")));return await r.setRoleActive(m.tenantId,x.id,u.get("isActive")==="true",String(m.userId)),{ok:!0}}case"delete":{let m=await I(d,{resourceKey:a,action:"delete"}),x=await w(m,"delete",Number(u.get("id")));return await r.deleteRole(m.tenantId,x.id),{ok:!0}}default:return(0,U.data)({error:"unknown action"},{status:400})}}catch(m){return ce(m)}}},resources:{data:S,async loader({request:d}){let u=await I(d,{resourceKey:a,action:"read"});return S(u)},async action({request:d}){let u=await d.formData(),R=String(u.get("_action"));try{switch(R){case"create":{let m=await I(d,{resourceKey:a,action:"create"}),x=String(u.get("tenantId")??"").trim(),$=String(u.get("appKey")??"").trim(),L=String(u.get("resourceKey")??"").trim(),_=String(u.get("name")??"").trim();return x&&$&&L&&_?(o(m,"create",x),await r.createResource(m.tenantId,{tenantId:x,appKey:$,resourceKey:L,name:_,description:String(u.get("description")??"").trim()||null},String(m.userId)),{ok:!0}):(0,U.data)({error:"tenant_id / app_key / resource_key / name \u306F\u5FC5\u9808\u3067\u3059"},{status:400})}case"save":{let m=await I(d,{resourceKey:a,action:"update"}),x=String(u.get("name")??"").trim();if(!x)return(0,U.data)({error:"name \u306F\u5FC5\u9808\u3067\u3059"},{status:400});let $=await k(m,"update",Number(u.get("id")));return await r.updateResource(m.tenantId,$.id,{name:x,description:String(u.get("description")??"").trim()||null},String(m.userId)),{ok:!0}}case"delete":{let m=await I(d,{resourceKey:a,action:"delete"}),x=await k(m,"delete",Number(u.get("id")));return await r.deleteResource(m.tenantId,x.id),{ok:!0}}default:return(0,U.data)({error:"unknown action"},{status:400})}}catch(m){return ce(m)}}},grants:{data:E,async loader({request:d}){let u=await I(d,{resourceKey:a,action:"read"});return E(u)},async action({request:d}){let u=await d.formData(),R=String(u.get("_action"));try{switch(R){case"create":{let m=await I(d,{resourceKey:a,action:"create"}),x=String(u.get("tenantId")??"").trim(),$=Number(u.get("roleId")),L=Number(u.get("resourceId"));if(!(x&&$&&L))return(0,U.data)({error:"tenant_id \u3068\u30ED\u30FC\u30EB\u3068\u30EA\u30BD\u30FC\u30B9\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044"},{status:400});let _=String(u.get("action")??"");if(!Y.AUTHZ_ACTIONS.includes(_))return(0,U.data)({error:"\u7121\u52B9\u306A action \u3067\u3059"},{status:400});let ee=_;o(m,"create",x);let Z=await w(m,"create",$),f=await k(m,"create",L);return await r.createGrant(m.tenantId,{tenantId:x,roleId:Z.id,resourceId:f.id,action:ee,rowScope:String(u.get("rowScope")??""),columnScope:String(u.get("columnScope")??"")},String(m.userId)),{ok:!0}}case"save":{let m=await I(d,{resourceKey:a,action:"update"}),x=String(u.get("action")??"");if(!Y.AUTHZ_ACTIONS.includes(x))return(0,U.data)({error:"\u7121\u52B9\u306A action \u3067\u3059"},{status:400});let $=x,L=Number(u.get("id"));return await C(m,"update",L),await r.updateGrant(m.tenantId,L,{action:$,rowScope:String(u.get("rowScope")??""),columnScope:String(u.get("columnScope")??"")},String(m.userId)),{ok:!0}}case"delete":{let m=await I(d,{resourceKey:a,action:"delete"}),x=Number(u.get("id"));return await C(m,"delete",x),await r.deleteGrant(m.tenantId,x),{ok:!0}}default:return(0,U.data)({error:"unknown action"},{status:400})}}catch(m){return ce(m)}}},userRoles:{data:q,async loader({request:d}){let u=await I(d,{resourceKey:a,action:"read"});return q(u)},async action({request:d}){let u=await d.formData(),R=String(u.get("_action"));try{switch(R){case"assign":{let m=await I(d,{resourceKey:a,action:"create"}),x=Number(u.get("userId")),$=Number(u.get("roleId"));if(!(x&&$))return(0,U.data)({error:"\u30E6\u30FC\u30B6\u30FC\u3068\u30ED\u30FC\u30EB\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044"},{status:400});await A(m,"create",x);let L=await w(m,"create",$);return await r.assignUserRole(m.tenantId,x,L.id,String(m.userId)),{ok:!0}}case"remove":{let m=await I(d,{resourceKey:a,action:"delete"}),x=Number(u.get("userId"));await A(m,"delete",x);let $=await w(m,"delete",Number(u.get("roleId")));return await r.removeUserRole(m.tenantId,x,$.id),{ok:!0}}default:return(0,U.data)({error:"unknown action"},{status:400})}}catch(m){return ce(m)}}},groupRoles:{data:ne,async loader({request:d}){let u=await I(d,{resourceKey:a,action:"read"});return ne(u)},async action({request:d}){let u=await d.formData(),R=String(u.get("_action"));try{switch(R){case"assign":{let m=await I(d,{resourceKey:a,action:"create"}),x=Number(u.get("groupId")),$=Number(u.get("roleId"));if(!(x&&$))return(0,U.data)({error:"\u30B0\u30EB\u30FC\u30D7\u3068\u30ED\u30FC\u30EB\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044"},{status:400});let L=await z(m,"create",x),_=await w(m,"create",$);return await r.assignGroupRole(m.tenantId,L.id,_.id,String(m.userId)),{ok:!0}}case"remove":{let m=await I(d,{resourceKey:a,action:"delete"}),x=await z(m,"delete",Number(u.get("groupId"))),$=await w(m,"delete",Number(u.get("roleId")));return await r.removeGroupRole(m.tenantId,x.id,$.id),{ok:!0}}default:return(0,U.data)({error:"unknown action"},{status:400})}}catch(m){return ce(m)}}},graph:{data:ae,async loader({request:d}){let u=await I(d,{resourceKey:a,action:"read"});return ae(u)}}}}function Ee(t){return String(t["*"]??"").split("/")[0]}function mt(t){let r=Re(t),a=t.basePath??"/authz",s=["roles","resources","role_permissions","user_roles","group_roles","graph"],l={roles:r.roles.data,resources:r.resources.data,role_permissions:r.grants.data,user_roles:r.userRoles.data,group_roles:r.groupRoles.data,graph:r.graph.data},c=new Map([["roles",r.roles.action],["resources",r.resources.action],["role_permissions",r.grants.action],["user_roles",r.userRoles.action],["group_roles",r.groupRoles.action]]);async function b(w){let k=Ee(w.params);if(!s.includes(k))throw(0,ge.redirect)(`${a}/roles`);let{userId:z,tenantId:A,myPermissions:C}=await r.layoutGuard(w.request),I=await l[k]({tenantId:A,userId:z});return{segment:k,basePath:a,myPermissions:C,adminResourceKey:r.resourceKey,...I}}async function o(w){let k=Ee(w.params),z=c.get(k);return z?z(w):(0,ge.data)({error:"unknown action"},{status:400})}return{loader:b,action:o,server:r}}var de=require("react/jsx-runtime"),i={page:{padding:"1.25rem",maxWidth:1280,margin:"0 auto",color:"#0f172a"},tableContainer:{width:"100%",overflowX:"auto",marginBottom:"1rem",WebkitOverflowScrolling:"touch"},table:{borderCollapse:"collapse",width:"100%",fontSize:"0.9rem",tableLayout:"fixed"},th:{textAlign:"left",borderBottom:"2px solid #e2e8f0",padding:"0.45rem 0.65rem",fontSize:"0.78rem",color:"#475569",fontWeight:600,textTransform:"uppercase",letterSpacing:"0.03em"},td:{borderBottom:"1px solid #f1f5f9",padding:"0.5rem 0.65rem",verticalAlign:"middle",wordBreak:"break-all"},input:{padding:"0.4rem 0.55rem",border:"1px solid #cbd5e1",borderRadius:6,fontSize:"0.9rem",background:"#fff",width:"100%",boxSizing:"border-box"},select:{padding:"0.4rem 0.55rem",border:"1px solid #cbd5e1",borderRadius:6,fontSize:"0.9rem",background:"#fff",width:"100%",boxSizing:"border-box"},textarea:{padding:"0.4rem 0.55rem",border:"1px solid #cbd5e1",borderRadius:6,fontSize:"0.82rem",fontFamily:"ui-monospace, SFMono-Regular, Menlo, monospace",minHeight:"3.25rem",resize:"vertical",width:"100%",boxSizing:"border-box"},button:{padding:"0.3rem 0.7rem",border:"1px solid #cbd5e1",borderRadius:6,background:"#fff",cursor:"pointer",fontSize:"0.82rem",color:"#334155"},save:{padding:"0.3rem 0.7rem",border:"1px solid #2563eb",borderRadius:6,background:"#eff6ff",cursor:"pointer",fontSize:"0.82rem",color:"#2563eb",fontWeight:600},danger:{padding:"0.3rem 0.7rem",border:"1px solid #fecaca",borderRadius:6,background:"#fff",cursor:"pointer",fontSize:"0.82rem",color:"#dc2626"},primary:{padding:"0.5rem 1.25rem",border:"1px solid #2563eb",borderRadius:6,background:"#2563eb",color:"#fff",cursor:"pointer",fontSize:"0.9rem",fontWeight:600,alignSelf:"flex-start"},card:{display:"flex",flexDirection:"column",gap:"0.85rem",maxWidth:600,marginTop:"0.75rem",padding:"1rem 1.1rem",border:"1px solid #e2e8f0",borderRadius:10,background:"#f8fafc"},code:{fontFamily:"ui-monospace, SFMono-Regular, Menlo, monospace",fontSize:"0.78rem",color:"#334155",wordBreak:"break-all"},muted:{color:"#94a3b8"},h2:{fontSize:"1.05rem",margin:"0 0 0.35rem",fontWeight:700},h3:{fontSize:"0.92rem",margin:"1.25rem 0 0",color:"#334155",fontWeight:600},note:{color:"#64748b",fontSize:"0.82rem",margin:"0 0 0.75rem"},empty:{color:"#94a3b8",padding:"0.75rem 0.65rem"}};function N({label:t,hint:r,children:a}){return(0,de.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"0.3rem"},children:[(0,de.jsxs)("span",{style:{fontSize:"0.8rem",color:"#475569",fontWeight:600},children:[t,r?(0,de.jsxs)("span",{style:{fontWeight:400,color:"#94a3b8"},children:[" \u2014 ",r]}):null]}),a]})}function se({message:t}){return t?(0,de.jsx)("p",{role:"alert",style:{color:"#dc2626",background:"#fef2f2",border:"1px solid #fecaca",borderRadius:8,padding:"0.55rem 0.8rem",fontSize:"0.85rem",margin:"0.25rem 0"},children:t}):null}var Ce=require("@aiquants/authz-core"),re=require("@aiquants/select-box"),V=require("react"),T=require("react-router");var le=require("react");function Se(t){let r=t?.canRead?t.readPartial?"partial":"full":"none",a=t?.canCreate&&t?.canUpdate?"full":t?.canCreate||t?.canUpdate?"partial":"none",s=t?.canDelete?"full":"none";return{canRead:!!t?.canRead,canCreate:!!t?.canCreate,canUpdate:!!t?.canUpdate,canDelete:!!t?.canDelete,canWrite:!!t?.canWrite,readState:r,writeState:a,deleteState:s}}var F=require("react/jsx-runtime"),ft={full:{bg:"#ecfdf5",text:"#047857",border:"#a7f3d0"},partial:{bg:"#fffbeb",text:"#b45309",border:"#fde68a"},none:{bg:"#f8fafc",text:"#94a3b8",border:"#cbd5e1"}};function ze(t,r){let a=t?.trim(),s=r?.trim();if(s&&a&&s!==a)return`\u5BFE\u8C61\u30EA\u30BD\u30FC\u30B9: ${s} (${a})`;if(s||a)return`\u5BFE\u8C61\u30EA\u30BD\u30FC\u30B9: ${s||a}`}function yt({state:t}){return t==="full"?(0,F.jsx)("svg",{style:{width:"0.85rem",height:"0.85rem",flexShrink:0},fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:3,"aria-hidden":"true",children:(0,F.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 13l4 4L19 7"})}):t==="partial"?(0,F.jsx)("svg",{style:{width:"0.85rem",height:"0.85rem",flexShrink:0},fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2.5,"aria-hidden":"true",children:(0,F.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"})}):(0,F.jsx)("svg",{style:{width:"0.85rem",height:"0.85rem",flexShrink:0},fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2.5,"aria-hidden":"true",children:(0,F.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728A9 9 0 015.636 5.636m12.728 12.728L5.636 5.636"})})}function he({permission:t,resourceName:r,expectedResourceKey:a,showResourceTooltip:s=!0,labels:l,showScopeSummary:c=!0,className:b="authz-permission-indicator"}){let o=Se(t),w={read:l?.read??"\u95B2\u89A7",write:l?.write??"\u7DE8\u96C6",delete:l?.delete??"\u524A\u9664"},k=t?.resourceKey,z=r||k,A=s?ze(k,r):void 0,C=!!(a&&k&&k!==a);C&&typeof console<"u"&&typeof console.error=="function"&&console.error(`[Authz Warning] Resource key mismatch in MyPermissionIndicator! Expected: "${a}", but received permission for: "${k}".`);let I=(G,y,S)=>{let E=ft[y],q=A?`${S}: ${y}
2
+ ${A}`:`${S}: ${y}`;return(0,F.jsxs)("span",{"data-perm":G,"data-state":y,title:q,style:{display:"inline-flex",alignItems:"center",gap:"0.25rem",padding:"0.2rem 0.5rem",borderRadius:"100px",fontSize:"0.75rem",fontWeight:600,backgroundColor:E.bg,color:E.text,border:`1px solid ${E.border}`,lineHeight:1,userSelect:"none"},children:[(0,F.jsx)(yt,{state:y}),(0,F.jsx)("span",{children:S})]})};return(0,F.jsxs)("span",{className:b,title:A,"data-resource":k??"","data-resource-name":z??"","data-mismatch":C?"true":void 0,style:{display:"inline-flex",gap:"0.35rem",alignItems:"center",verticalAlign:"middle"},children:[I("read",o.readState,w.read),I("write",o.writeState,w.write),I("delete",o.deleteState,w.delete),c&&o.readState==="partial"?(0,F.jsx)("span",{"data-perm":"scope",title:A,style:{fontSize:"0.7rem",color:"#b45309",backgroundColor:"#fef3c7",padding:"0.15rem 0.35rem",borderRadius:"4px",fontWeight:600},children:"\u90E8\u5206\u5236\u9650"}):null,C?(0,F.jsxs)("span",{"data-testid":"resource-mismatch-warning",title:`expected: "${a}", actual: "${k}"`,style:{fontSize:"0.7rem",color:"#991b1b",backgroundColor:"#fee2e2",border:"1px solid #fca5a5",padding:"0.15rem 0.35rem",borderRadius:"4px",fontWeight:700},children:["\u26A0\uFE0F \u30EA\u30BD\u30FC\u30B9\u4E0D\u4E00\u81F4 (",k," \u2260 ",a,")"]}):null]})}function gt({permission:t,resourceName:r,expectedResourceKey:a,prefixLabel:s="\u3042\u306A\u305F\u306E\u6A29\u9650",showPrefixLabel:l=!0,showResourceTooltip:c=!0,labels:b,showScopeSummary:o=!0,className:w="authz-permission-status",style:k}){let z=t?.resourceKey,A=r||z,C=c?ze(z,r):void 0;return(0,F.jsxs)("span",{className:w,title:C,"data-testid":"my-permission-status","data-resource":z??"","data-resource-name":A??"",style:{fontSize:"0.82rem",color:"#475569",display:"inline-flex",alignItems:"center",gap:"0.4rem",...k},children:[l&&(0,F.jsxs)("span",{"data-testid":"prefix-label",children:[s,":"]}),(0,F.jsx)(he,{permission:t,resourceName:r,expectedResourceKey:a,showResourceTooltip:c,labels:b,showScopeSummary:o})]})}var W=require("react/jsx-runtime");function be(t,r=0){let a=[];for(let s of t){let l=s.level??r;a.push({...s,level:l}),s.children&&s.children.length>0&&a.push(...be(s.children,l+1))}return a}var _e={"2xs":{fontSize:"0.6rem",pillPadding:"0.05rem 0.25rem",pillGap:"0.15rem",wrapperGap:"0.15rem",triggerPadding:"0.1rem 0.35rem",triggerFontSize:"0.62rem",badgeFontSize:"0.58rem"},xs:{fontSize:"0.65rem",pillPadding:"0.08rem 0.35rem",pillGap:"0.18rem",wrapperGap:"0.2rem",triggerPadding:"0.12rem 0.4rem",triggerFontSize:"0.68rem",badgeFontSize:"0.62rem"},sm:{fontSize:"0.72rem",pillPadding:"0.1rem 0.4rem",pillGap:"0.2rem",wrapperGap:"0.25rem",triggerPadding:"0.15rem 0.45rem",triggerFontSize:"0.72rem",badgeFontSize:"0.65rem"},md:{fontSize:"0.78rem",pillPadding:"0.15rem 0.5rem",pillGap:"0.3rem",wrapperGap:"0.35rem",triggerPadding:"0.2rem 0.6rem",triggerFontSize:"0.78rem",badgeFontSize:"0.7rem"},lg:{fontSize:"0.85rem",pillPadding:"0.25rem 0.65rem",pillGap:"0.4rem",wrapperGap:"0.45rem",triggerPadding:"0.25rem 0.75rem",triggerFontSize:"0.85rem",badgeFontSize:"0.75rem"}};function Oe(t,r){let a=r?.noPermission??"\u6A29\u9650\u306A\u3057",s=r?.fullWrite??"\u7DE8\u96C6\u53EF",l=r?.partialRead??"\u4E00\u90E8\u95B2\u89A7",c=r?.readOnly??"\u95B2\u89A7\u306E\u307F";return t&&(t.canRead||t.canWrite||t.canDelete)?t.canWrite?{text:s,color:"#047857",bgColor:"#ecfdf5",borderColor:"#a7f3d0"}:t.canRead?t.readPartial?{text:l,color:"#b45309",bgColor:"#fffbeb",borderColor:"#fde68a"}:{text:c,color:"#1d4ed8",bgColor:"#eff6ff",borderColor:"#bfdbfe"}:{text:a,color:"#64748b",bgColor:"#f1f5f9",borderColor:"#cbd5e1"}:{text:a,color:"#64748b",bgColor:"#f1f5f9",borderColor:"#cbd5e1"}}function ht({item:t,size:r="md",labels:a}){let s=Oe(t.permission,a),l=t.permission?.resourceKey||t.resourceKey||t.expectedResourceKey,c=t.resourceName||l,b=!!(t.expectedResourceKey&&t.permission?.resourceKey&&t.permission.resourceKey!==t.expectedResourceKey),o=_e[r],w=`\u5BFE\u8C61: ${c}${l?` (${l})`:""}${t.permission?` | ${a?.read??"\u95B2\u89A7"}:${t.permission.canRead?"\u25CB":"\xD7"} ${a?.write??"\u7DE8\u96C6"}:${t.permission.canWrite?"\u25CB":"\xD7"} ${a?.delete??"\u524A\u9664"}:${t.permission.canDelete?"\u25CB":"\xD7"}`:""}`;return(0,W.jsxs)("span",{title:w,"data-testid":`permission-pill-${t.resourceName}`,"data-mismatch":b?"true":"false",style:{display:"inline-flex",alignItems:"center",gap:o.pillGap,fontSize:o.fontSize,padding:o.pillPadding,borderRadius:"9999px",backgroundColor:b?"#fee2e2":s.bgColor,color:b?"#991b1b":s.color,border:`1px solid ${b?"#fca5a5":s.borderColor}`,fontWeight:600,lineHeight:"1.2"},children:[(0,W.jsxs)("span",{children:[c,":"]}),(0,W.jsx)("span",{children:s.text}),b&&(0,W.jsx)("span",{title:`expected "${t.expectedResourceKey}", actual "${t.permission?.resourceKey}"`,children:"\u26A0\uFE0F"})]})}function Pe({items:t,prefixLabel:r="\u3042\u306A\u305F\u306E\u6A29\u9650",variant:a="pills",size:s="md",labels:l,className:c="authz-permission-group-status",style:b}){let[o,w]=(0,le.useState)(!1),k=(0,le.useRef)(null),z=_e[s];if((0,le.useEffect)(()=>{if(a!=="popover"||!o)return;function A(I){k.current&&!k.current.contains(I.target)&&w(!1)}function C(I){I.key==="Escape"&&w(!1)}return document.addEventListener("mousedown",A),document.addEventListener("keydown",C),()=>{document.removeEventListener("mousedown",A),document.removeEventListener("keydown",C)}},[a,o]),a==="popover"){let A=be(t),C=A.filter(S=>S.permission?.canWrite).length,I=A.filter(S=>S.permission?.canRead).length,G=A.length,y=G===0||C===0&&I===0?l?.noPermission??"\u6A29\u9650\u306A\u3057":C===G?l?.fullWrite??"\u7DE8\u96C6\u53EF":C>0?l?.partialWrite??"\u4E00\u90E8\u7DE8\u96C6\u53EF":l?.readOnly??"\u95B2\u89A7\u306E\u307F";return(0,W.jsxs)("span",{ref:k,className:c,"data-testid":"my-permission-group-popover",style:{position:"relative",display:"inline-block",...b},children:[(0,W.jsxs)("button",{type:"button",onClick:()=>w(!o),"data-testid":"permission-popover-trigger",style:{display:"inline-flex",alignItems:"center",gap:z.wrapperGap,fontSize:z.triggerFontSize,padding:z.triggerPadding,borderRadius:"6px",backgroundColor:"#f8fafc",color:"#334155",border:"1px solid #cbd5e1",fontWeight:600,cursor:"pointer"},children:[(0,W.jsxs)("span",{children:["\u{1F512} ",r]}),(0,W.jsxs)("span",{style:{fontSize:z.badgeFontSize,color:"#64748b"},children:["(",y,")"]}),(0,W.jsx)("span",{style:{fontSize:"0.65rem",marginLeft:"0.1rem"},children:o?"\u25B2":"\u25BE"})]}),o&&(0,W.jsxs)("div",{"data-testid":"permission-popover-card",style:{position:"absolute",top:"calc(100% + 6px)",right:0,zIndex:50,minWidth:"280px",whiteSpace:"nowrap",padding:"0.75rem 0.85rem",backgroundColor:"#ffffff",borderRadius:"8px",boxShadow:"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)",border:"1px solid #e2e8f0",fontSize:"0.82rem"},children:[(0,W.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:"0.5rem",paddingBottom:"0.4rem",borderBottom:"1px solid #f1f5f9",fontWeight:700,color:"#1e293b",whiteSpace:"nowrap"},children:[(0,W.jsxs)("span",{children:["\u{1F512} ",r]}),(0,W.jsx)("button",{type:"button",onClick:()=>w(!1),style:{border:"none",background:"none",cursor:"pointer",color:"#94a3b8",fontSize:"0.85rem",padding:"0 0.2rem"},children:"\u2715"})]}),(0,W.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:"0.4rem"},children:be(t).map(S=>{let E=S.level??0,q=E>0;return(0,W.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"1.25rem",whiteSpace:"nowrap",paddingLeft:q?`${E*.85}rem`:"0"},children:[(0,W.jsxs)("div",{style:{display:"inline-flex",alignItems:"center",whiteSpace:"nowrap"},children:[q&&(0,W.jsx)("span",{"aria-hidden":"true",style:{display:"inline-block",width:"10px",height:"10px",borderLeft:"1.5px solid #cbd5e1",borderBottom:"1.5px solid #cbd5e1",borderBottomLeftRadius:"3px",marginRight:"6px",marginTop:"-4px",flexShrink:0}}),(0,W.jsxs)("span",{style:{fontWeight:q?500:600,color:q?"#64748b":"#1e293b",fontSize:q?"0.78rem":"0.82rem",whiteSpace:"nowrap"},children:[S.resourceName,":"]})]}),(0,W.jsx)(he,{permission:S.permission,resourceName:S.resourceName,expectedResourceKey:S.expectedResourceKey,labels:l})]},S.resourceName)})})]})]})}return(0,W.jsxs)("span",{className:c,"data-testid":"my-permission-group-pills",style:{display:"inline-flex",alignItems:"center",flexWrap:"wrap",gap:z.pillGap,fontSize:z.fontSize,color:"#475569",...b},children:[r&&(0,W.jsxs)("span",{style:{fontWeight:600,color:"#334155"},children:[r,":"]}),(0,W.jsx)("span",{style:{display:"inline-flex",alignItems:"center",flexWrap:"wrap",gap:z.pillGap},children:t.map(A=>(0,W.jsx)(ht,{item:A,size:s,labels:l},A.resourceName))})]})}var e=require("react/jsx-runtime"),pe=t=>t?.error;function me({tenantId:t,testId:r}){return(0,e.jsx)("td",{style:i.td,children:(0,e.jsx)("span",{style:i.code,"data-testid":r,children:t})})}function $e(t,r,a){let s=t.find(l=>l.id===r);return s?s.tenantId:a.common.unknownTenant}function Ue({children:t,renderHeader:r}){let{myPermissions:a,labels:s,adminResourceKey:l,basePath:c,tenantId:b}=(0,T.useLoaderData)(),o=c??"/authz",[w,k]=(0,V.useState)("pills"),z=[["roles",s.tabs.roles],["resources",s.tabs.resources],["role_permissions",s.tabs.role_permissions],["user_roles",s.tabs.user_roles],["group_roles",s.tabs.group_roles],["graph",s.tabs.graph]],A=Object.entries(a||{}).map(([G,y])=>({resourceKey:G,resourceName:y?.resourceKey||G,permission:y,expectedResourceKey:G})),C=A.length>0?A:[{resourceKey:l,resourceName:l,permission:a?.[l],expectedResourceKey:l}],I=(0,e.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"0.4rem"},children:[(0,e.jsxs)("span",{"data-testid":"authz-tenant-badge",style:{...i.code,border:"1px solid #cbd5e1",borderRadius:4,padding:"1px 6px",background:"#f8fafc"},children:[s.common.tenant,": ",b]}),(0,e.jsx)(Pe,{prefixLabel:s.myPermission,items:C,variant:w,size:"xs"}),(0,e.jsxs)("div",{style:{display:"inline-flex",borderRadius:"4px",border:"1px solid #cbd5e1",padding:"1px",backgroundColor:"#f8fafc",fontSize:"0.7rem"},children:[(0,e.jsx)("button",{type:"button",onClick:()=>k("pills"),"data-testid":"switch-variant-pills",style:{padding:"1px 5px",borderRadius:"3px",border:"none",cursor:"pointer",fontSize:"0.7rem",lineHeight:"1.2",fontWeight:w==="pills"?600:400,backgroundColor:w==="pills"?"#ffffff":"transparent",color:w==="pills"?"#1e293b":"#64748b",boxShadow:w==="pills"?"0 1px 2px rgba(0,0,0,0.05)":"none"},children:"Pills"}),(0,e.jsx)("button",{type:"button",onClick:()=>k("popover"),"data-testid":"switch-variant-popover",style:{padding:"1px 5px",borderRadius:"3px",border:"none",cursor:"pointer",fontSize:"0.7rem",lineHeight:"1.2",fontWeight:w==="popover"?600:400,backgroundColor:w==="popover"?"#ffffff":"transparent",color:w==="popover"?"#1e293b":"#64748b",boxShadow:w==="popover"?"0 1px 2px rgba(0,0,0,0.05)":"none"},children:"Popover"})]})]});return(0,e.jsxs)("div",{className:"authz-admin",style:i.page,children:[r?r({title:s.title,annotation:I}):(0,e.jsxs)("header",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"0.75rem",flexWrap:"wrap",margin:"0 0 0.4rem"},children:[(0,e.jsx)("h1",{style:{fontSize:"1.15rem",margin:0,fontWeight:700,color:"#1e293b"},children:s.title}),I]}),(0,e.jsx)("nav",{style:{display:"flex",gap:"0.25rem",borderBottom:"1px solid #e2e8f0",margin:"0.6rem 0 1rem"},children:z.map(([G,y])=>(0,e.jsx)(T.NavLink,{to:`${o}/${G}`,style:({isActive:S})=>({padding:"0.5rem 0.9rem",textDecoration:"none",color:S?"#2563eb":"#475569",borderBottom:S?"2px solid #2563eb":"2px solid transparent",marginBottom:-1,fontWeight:S?700:500,fontSize:"0.92rem"}),children:y},G))}),t]})}function bt({renderHeader:t}={}){return(0,e.jsx)(Ue,{renderHeader:t,children:(0,e.jsx)(T.Outlet,{})})}function Fe(t){let r=ue(t).error;return function(){let s=(0,T.useRouteError)(),l=(0,T.isRouteErrorResponse)(s)?s:null,c=l?.status===403,b=c?r.forbiddenTitle:l?`${r.genericTitlePrefix} (${l.status})`:r.genericTitle,o=c?r.forbiddenBody:l?typeof l.data=="string"&&l.data?l.data:l.statusText:r.genericBody;return(0,e.jsx)("div",{style:i.page,children:(0,e.jsxs)("div",{role:"alert",style:{maxWidth:480,margin:"3rem auto",padding:"1.5rem",border:"1px solid #fecaca",borderRadius:12,background:"#fef2f2"},children:[(0,e.jsx)("h1",{style:{fontSize:"1.1rem",fontWeight:700,color:"#b91c1c",margin:"0 0 0.5rem"},children:b}),(0,e.jsx)("p",{style:{color:"#7f1d1d",fontSize:"0.9rem",margin:0,lineHeight:1.7},children:o})]})})}}var xt=Fe(),ke=(t,r)=>a=>{t&&!window.confirm(r)&&a.preventDefault()};function Te(){let{roles:t,selfAdminRoleIds:r,labels:a,tenantId:s}=(0,T.useLoaderData)(),l=a.roles,c=a.common,b=new Set(r??[]);return(0,e.jsxs)("section",{children:[(0,e.jsx)("h2",{style:i.h2,children:l.heading}),(0,e.jsx)(se,{message:pe((0,T.useActionData)())}),(0,e.jsx)("p",{style:i.note,children:l.note}),(0,e.jsx)("div",{style:i.tableContainer,children:(0,e.jsxs)("table",{style:i.table,children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{style:{...i.th,width:"12%"},children:c.tenant}),(0,e.jsx)("th",{style:{...i.th,width:"18%"},children:l.roleKey}),(0,e.jsx)("th",{style:{...i.th,width:"22%"},children:l.name}),(0,e.jsx)("th",{style:{...i.th,width:"28%"},children:l.description}),(0,e.jsx)("th",{style:{...i.th,width:"10%"},children:l.activeHeader}),(0,e.jsx)("th",{style:{...i.th,width:"10%"}})]})}),(0,e.jsxs)("tbody",{children:[t.map(o=>(0,e.jsxs)("tr",{children:[(0,e.jsx)(me,{tenantId:o.tenantId,testId:`tenant-role-${o.id}`}),(0,e.jsxs)("td",{style:i.td,children:[(0,e.jsx)("input",{type:"hidden",name:"tenantId",value:o.tenantId,form:`save-role-${o.id}`}),o.roleKey==="@authenticated"||o.roleKey==="@anonymous"?(0,e.jsx)("span",{style:i.code,children:o.roleKey}):(0,e.jsx)("input",{name:"roleKey",defaultValue:o.roleKey,form:`save-role-${o.id}`,"aria-label":`roleKey-${o.id}`,required:!0,style:i.input})]}),(0,e.jsx)("td",{style:i.td,children:(0,e.jsx)("input",{name:"name",defaultValue:o.name,form:`save-role-${o.id}`,"aria-label":`name-${o.id}`,required:!0,style:i.input})}),(0,e.jsx)("td",{style:i.td,children:(0,e.jsx)("input",{name:"description",defaultValue:o.description??"",form:`save-role-${o.id}`,"aria-label":`description-${o.id}`,style:i.input})}),(0,e.jsx)("td",{style:i.td,children:(0,e.jsxs)(T.Form,{method:"post",style:{display:"inline"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"toggle"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:o.id}),(0,e.jsx)("input",{type:"hidden",name:"isActive",value:String(!o.isActive)}),(0,e.jsx)("button",{type:"submit",style:i.button,onClick:o.isActive?ke(b.has(o.id),a.warn.selfRoleDisable):void 0,children:o.isActive?c.active:c.inactive})]})}),(0,e.jsxs)("td",{style:{...i.td,whiteSpace:"nowrap"},children:[(0,e.jsxs)(T.Form,{method:"post",id:`save-role-${o.id}`,style:{display:"inline"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"save"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:o.id}),(0,e.jsx)("button",{type:"submit",style:i.save,children:c.save})]}),(0,e.jsxs)(T.Form,{method:"post",style:{display:"inline",marginLeft:"0.4rem"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"delete"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:o.id}),(0,e.jsx)("button",{type:"submit",style:i.danger,onClick:ke(b.has(o.id),a.warn.selfRoleDelete),children:c.delete})]})]})]},o.id)),t.length===0?(0,e.jsx)("tr",{children:(0,e.jsx)("td",{style:i.empty,colSpan:6,children:l.empty})}):null]})]})}),(0,e.jsx)("h3",{style:i.h3,children:l.newHeading}),(0,e.jsxs)(T.Form,{method:"post",style:i.card,children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"create"}),(0,e.jsx)(N,{label:c.tenant,hint:c.tenantHint,children:(0,e.jsx)("input",{name:"tenantId","aria-label":"tenant_id",defaultValue:s,required:!0,style:i.input})}),(0,e.jsx)(N,{label:l.roleKey,hint:l.hintRoleKey,children:(0,e.jsx)("input",{name:"roleKey","aria-label":"role_key",required:!0,style:i.input})}),(0,e.jsx)(N,{label:l.name,children:(0,e.jsx)("input",{name:"name","aria-label":"name",required:!0,style:i.input})}),(0,e.jsx)(N,{label:l.description,hint:c.optional,children:(0,e.jsx)("input",{name:"description","aria-label":"description",style:i.input})}),(0,e.jsx)("button",{type:"submit",style:i.primary,children:c.add})]})]})}function qe(){let{resources:t,labels:r,tenantId:a}=(0,T.useLoaderData)(),s=r.resources,l=r.common;return(0,e.jsxs)("section",{children:[(0,e.jsx)("h2",{style:i.h2,children:s.heading}),(0,e.jsx)(se,{message:pe((0,T.useActionData)())}),(0,e.jsx)("p",{style:i.note,children:s.note}),(0,e.jsx)("div",{style:i.tableContainer,children:(0,e.jsxs)("table",{style:i.table,children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{style:{...i.th,width:"12%"},children:l.tenant}),(0,e.jsx)("th",{style:{...i.th,width:"13%"},children:s.appKey}),(0,e.jsx)("th",{style:{...i.th,width:"18%"},children:s.resourceKey}),(0,e.jsx)("th",{style:{...i.th,width:"22%"},children:s.name}),(0,e.jsx)("th",{style:{...i.th,width:"25%"},children:s.description}),(0,e.jsx)("th",{style:{...i.th,width:"10%"}})]})}),(0,e.jsxs)("tbody",{children:[t.map(c=>(0,e.jsxs)("tr",{children:[(0,e.jsx)(me,{tenantId:c.tenantId,testId:`tenant-resource-${c.id}`}),(0,e.jsx)("td",{style:i.td,children:(0,e.jsx)("span",{style:i.code,children:c.appKey})}),(0,e.jsx)("td",{style:i.td,children:(0,e.jsx)("span",{style:i.code,children:c.resourceKey})}),(0,e.jsx)("td",{style:i.td,children:(0,e.jsx)("input",{name:"name",defaultValue:c.name,form:`save-res-${c.id}`,"aria-label":`name-${c.id}`,required:!0,style:i.input})}),(0,e.jsx)("td",{style:i.td,children:(0,e.jsx)("input",{name:"description",defaultValue:c.description??"",form:`save-res-${c.id}`,"aria-label":`description-${c.id}`,style:i.input})}),(0,e.jsxs)("td",{style:{...i.td,whiteSpace:"nowrap"},children:[(0,e.jsxs)(T.Form,{method:"post",id:`save-res-${c.id}`,style:{display:"inline"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"save"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:c.id}),(0,e.jsx)("button",{type:"submit",style:i.save,children:l.save})]}),(0,e.jsxs)(T.Form,{method:"post",style:{display:"inline",marginLeft:"0.4rem"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"delete"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:c.id}),(0,e.jsx)("button",{type:"submit",style:i.danger,children:l.delete})]})]})]},c.id)),t.length===0?(0,e.jsx)("tr",{children:(0,e.jsx)("td",{style:i.empty,colSpan:6,children:s.empty})}):null]})]})}),(0,e.jsx)("h3",{style:i.h3,children:s.newHeading}),(0,e.jsxs)(T.Form,{method:"post",style:i.card,children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"create"}),(0,e.jsx)(N,{label:l.tenant,hint:l.tenantHint,children:(0,e.jsx)("input",{name:"tenantId","aria-label":"tenant_id",defaultValue:a,required:!0,style:i.input})}),(0,e.jsx)(N,{label:s.appKey,hint:s.hintAppKey,children:(0,e.jsx)("input",{name:"appKey","aria-label":"app_key",required:!0,style:i.input})}),(0,e.jsx)(N,{label:s.resourceKey,hint:s.hintResourceKey,children:(0,e.jsx)("input",{name:"resourceKey","aria-label":"resource_key",required:!0,style:i.input})}),(0,e.jsx)(N,{label:s.name,children:(0,e.jsx)("input",{name:"name","aria-label":"name",required:!0,style:i.input})}),(0,e.jsx)(N,{label:s.description,hint:l.optional,children:(0,e.jsx)("input",{name:"description","aria-label":"description",style:i.input})}),(0,e.jsx)("button",{type:"submit",style:i.primary,children:l.add})]})]})}function vt({g:t,tenantId:r,labels:a}){let s=a.common,[l,c]=(0,V.useState)({label:t.action,value:t.action});return(0,e.jsxs)("tr",{children:[(0,e.jsx)(me,{tenantId:r,testId:`tenant-grant-${t.id}`}),(0,e.jsx)("td",{style:i.td,children:(0,e.jsx)("span",{style:i.code,children:t.roleKey})}),(0,e.jsx)("td",{style:i.td,children:(0,e.jsxs)("span",{style:i.code,children:[t.appKey,":",t.resourceKey]})}),(0,e.jsx)("td",{style:i.td,children:t.roleKey==="@anonymous"?(0,e.jsx)("span",{style:i.code,children:t.action}):(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("input",{type:"hidden",name:"action",value:l.value,form:`save-grant-${t.id}`}),(0,e.jsx)(re.SelectBox,{options:Ce.AUTHZ_ACTIONS.map(b=>({label:b,value:b})),value:l,onChange:b=>{b&&c(b)}})]})}),(0,e.jsx)("td",{style:i.td,children:(0,e.jsx)("textarea",{name:"rowScope",defaultValue:t.rowScope??"",form:`save-grant-${t.id}`,"aria-label":`row_scope-${t.id}`,rows:2,placeholder:a.grants.rowScopePlaceholder,style:i.textarea})}),(0,e.jsx)("td",{style:i.td,children:(0,e.jsx)("textarea",{name:"columnScope",defaultValue:t.columnScope??"",form:`save-grant-${t.id}`,"aria-label":`column_scope-${t.id}`,rows:2,placeholder:a.grants.columnScopePlaceholder,style:i.textarea})}),(0,e.jsxs)("td",{style:{...i.td,whiteSpace:"nowrap"},children:[(0,e.jsxs)(T.Form,{method:"post",id:`save-grant-${t.id}`,style:{display:"inline"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"save"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:t.id}),(0,e.jsx)("button",{type:"submit",style:i.save,children:s.save})]}),(0,e.jsxs)(T.Form,{method:"post",style:{display:"inline",marginLeft:"0.4rem"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"delete"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:t.id}),(0,e.jsx)("button",{type:"submit",style:i.danger,children:s.delete})]})]})]})}function He(){let{grants:t,roles:r,resources:a,labels:s,tenantId:l}=(0,T.useLoaderData)(),c=s.grants,b=s.common,o=r.map(S=>({label:S.roleKey,value:S.id})),w=a.map(S=>({label:`${S.appKey}:${S.resourceKey}`,value:S.id})),k=Ce.AUTHZ_ACTIONS.map(S=>({label:S,value:S})),[z,A]=(0,V.useState)(void 0),[C,I]=(0,V.useState)(void 0),[G,y]=(0,V.useState)({label:"read",value:"read"});return(0,e.jsxs)("section",{children:[(0,e.jsx)("h2",{style:i.h2,children:c.heading}),(0,e.jsx)("p",{style:i.note,children:c.note}),(0,e.jsx)(se,{message:pe((0,T.useActionData)())}),(0,e.jsx)("div",{style:i.tableContainer,children:(0,e.jsxs)("table",{style:i.table,children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{style:{...i.th,width:"10%"},children:b.tenant}),(0,e.jsx)("th",{style:{...i.th,width:"13%"},children:c.role}),(0,e.jsx)("th",{style:{...i.th,width:"17%"},children:c.resource}),(0,e.jsx)("th",{style:{...i.th,width:"13%"},children:c.action}),(0,e.jsx)("th",{style:{...i.th,width:"19%"},children:c.rowScope}),(0,e.jsx)("th",{style:{...i.th,width:"18%"},children:c.columnScope}),(0,e.jsx)("th",{style:{...i.th,width:"10%"}})]})}),(0,e.jsxs)("tbody",{children:[t.map(S=>(0,e.jsx)(vt,{g:S,tenantId:$e(r,S.roleId,s),labels:s},S.id)),t.length===0?(0,e.jsx)("tr",{children:(0,e.jsx)("td",{style:i.empty,colSpan:7,children:c.empty})}):null]})]})}),(0,e.jsx)("h3",{style:i.h3,children:c.newHeading}),(0,e.jsxs)(T.Form,{method:"post",style:i.card,children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"create"}),(0,e.jsx)("input",{type:"hidden",name:"roleId",value:z?.value??""}),(0,e.jsx)("input",{type:"hidden",name:"resourceId",value:C?.value??""}),(0,e.jsx)("input",{type:"hidden",name:"action",value:G?.value??""}),(0,e.jsx)(N,{label:b.tenant,hint:b.tenantHint,children:(0,e.jsx)("input",{name:"tenantId","aria-label":"tenant_id",defaultValue:l,required:!0,style:i.input})}),(0,e.jsx)(N,{label:c.role,children:(0,e.jsx)(re.SelectBox,{options:o,value:z,onChange:S=>A(S||void 0),placeholder:c.selectPlaceholder})}),(0,e.jsx)(N,{label:c.resource,children:(0,e.jsx)(re.SelectBox,{options:w,value:C,onChange:S=>I(S||void 0),placeholder:c.selectPlaceholder})}),(0,e.jsx)(N,{label:c.action,children:(0,e.jsx)(re.SelectBox,{options:k,value:G,onChange:S=>y(S||void 0)})}),(0,e.jsx)(N,{label:c.rowScope,hint:c.rowScopeHint,children:(0,e.jsx)("textarea",{name:"rowScope","aria-label":"row_scope",rows:2,style:i.textarea,placeholder:'{"filters":[{"field":"\u90E8\u9580CD","op":"in","values":["A"]}]}'})}),(0,e.jsx)(N,{label:c.columnScope,hint:c.columnScopeHint,children:(0,e.jsx)("textarea",{name:"columnScope","aria-label":"column_scope",rows:2,style:i.textarea,placeholder:'{"mode":"deny","columns":["\u91D1\u984D"]}'})}),(0,e.jsx)("button",{type:"submit",style:i.primary,children:b.grant})]})]})}function Be(){let{assignments:t,roles:r,users:a,actorUserId:s,selfAdminRoleIds:l,labels:c}=(0,T.useLoaderData)(),b=c.userRoles,o=c.common,w=new Set(l??[]),k=a.map(y=>({label:`${y.email}\uFF08${y.displayName}\uFF09`,value:y.id})),z=r.filter(y=>y.roleKey!=="@authenticated"&&y.roleKey!=="@anonymous").map(y=>({label:y.roleKey,value:y.id})),[A,C]=(0,V.useState)(void 0),[I,G]=(0,V.useState)(void 0);return(0,e.jsxs)("section",{children:[(0,e.jsx)("h2",{style:i.h2,children:b.heading}),(0,e.jsx)(se,{message:pe((0,T.useActionData)())}),(0,e.jsx)("p",{style:i.note,children:b.note}),(0,e.jsx)("div",{style:i.tableContainer,children:(0,e.jsxs)("table",{style:i.table,children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{style:{...i.th,width:"12%"},children:o.tenant}),(0,e.jsx)("th",{style:{...i.th,width:"40%"},children:b.user}),(0,e.jsx)("th",{style:{...i.th,width:"38%"},children:b.role}),(0,e.jsx)("th",{style:{...i.th,width:"10%"}})]})}),(0,e.jsxs)("tbody",{children:[t.map(y=>(0,e.jsxs)("tr",{children:[(0,e.jsx)(me,{tenantId:$e(r,y.roleId,c),testId:`tenant-assignment-${y.userId}-${y.roleId}`}),(0,e.jsxs)("td",{style:i.td,children:[y.email,(0,e.jsxs)("span",{style:i.muted,children:["\uFF08",y.displayName,"\uFF09"]})]}),(0,e.jsx)("td",{style:i.td,children:y.roleKey}),(0,e.jsx)("td",{style:i.td,children:(0,e.jsxs)(T.Form,{method:"post",style:{display:"inline"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"remove"}),(0,e.jsx)("input",{type:"hidden",name:"userId",value:y.userId}),(0,e.jsx)("input",{type:"hidden",name:"roleId",value:y.roleId}),(0,e.jsx)("button",{type:"submit",style:i.danger,onClick:ke(y.userId===s&&w.has(y.roleId),c.warn.selfAssignmentRemove),children:o.remove})]})})]},`${y.userId}-${y.roleId}`)),t.length===0?(0,e.jsx)("tr",{children:(0,e.jsx)("td",{style:i.empty,colSpan:4,children:b.empty})}):null]})]})}),(0,e.jsx)("h3",{style:i.h3,children:b.newHeading}),(0,e.jsxs)(T.Form,{method:"post",style:i.card,children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"assign"}),(0,e.jsx)("input",{type:"hidden",name:"userId",value:A?.value??""}),(0,e.jsx)("input",{type:"hidden",name:"roleId",value:I?.value??""}),(0,e.jsx)(N,{label:b.user,children:(0,e.jsx)(re.SelectBox,{options:k,value:A,onChange:y=>C(y||void 0),placeholder:b.selectPlaceholder})}),(0,e.jsx)(N,{label:b.role,children:(0,e.jsx)(re.SelectBox,{options:z,value:I,onChange:y=>G(y||void 0),placeholder:b.selectPlaceholder})}),(0,e.jsx)("button",{type:"submit",style:i.primary,children:o.assign})]})]})}function Ve(){let{groupRoles:t,roles:r,groups:a,labels:s}=(0,T.useLoaderData)(),l=(0,T.useActionData)(),c=pe(l),b=s.groupRoles,o=s.common,w=r.filter(y=>y.isActive&&y.roleKey!=="@authenticated"&&y.roleKey!=="@anonymous"),k=a.map(y=>({label:`${y.name} (${y.groupKey})`,value:y.id})),z=w.map(y=>({label:`${y.name} (${y.roleKey})`,value:y.id})),[A,C]=(0,V.useState)(k[0]),[I,G]=(0,V.useState)(z[0]);return(0,e.jsxs)("section",{style:{display:"flex",flexDirection:"column",gap:"1.25rem"},children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("h2",{style:i.h2,children:b.heading}),(0,e.jsx)("p",{style:i.note,children:b.note})]}),c&&(0,e.jsx)(se,{message:c}),(0,e.jsxs)("table",{style:i.table,children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{style:{...i.th,width:"12%"},children:o.tenant}),(0,e.jsx)("th",{style:i.th,children:b.group}),(0,e.jsx)("th",{style:i.th,children:b.role}),(0,e.jsx)("th",{style:{...i.th,width:"100px"}})]})}),(0,e.jsx)("tbody",{children:t.length===0?(0,e.jsx)("tr",{children:(0,e.jsx)("td",{colSpan:4,style:{...i.td,textAlign:"center",color:"#64748b"},children:b.empty})}):t.map(y=>(0,e.jsxs)("tr",{children:[(0,e.jsx)(me,{tenantId:$e(r,y.roleId,s),testId:`tenant-group-role-${y.groupId}-${y.roleId}`}),(0,e.jsxs)("td",{style:i.td,children:[(0,e.jsx)("strong",{children:y.groupName})," ",(0,e.jsxs)("span",{style:{color:"#64748b",fontSize:"0.85rem"},children:["(",y.groupKey,")"]})]}),(0,e.jsx)("td",{style:i.td,children:(0,e.jsx)("code",{children:y.roleKey})}),(0,e.jsx)("td",{style:{...i.td,textAlign:"right"},children:(0,e.jsxs)(T.Form,{method:"post",onSubmit:S=>!confirm("\u3053\u306E\u30B0\u30EB\u30FC\u30D7\u30ED\u30FC\u30EB\u5272\u5F53\u3092\u89E3\u9664\u3057\u307E\u3059\u304B\uFF1F")&&S.preventDefault(),children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"remove"}),(0,e.jsx)("input",{type:"hidden",name:"groupId",value:y.groupId}),(0,e.jsx)("input",{type:"hidden",name:"roleId",value:y.roleId}),(0,e.jsx)("button",{type:"submit",style:i.danger,children:o.remove})]})})]},`${y.groupId}-${y.roleId}`))})]}),(0,e.jsxs)(T.Form,{method:"post",style:i.card,children:[(0,e.jsx)("h3",{style:i.h3,children:b.newHeading}),(0,e.jsx)("input",{type:"hidden",name:"_action",value:"assign"}),(0,e.jsx)("input",{type:"hidden",name:"groupId",value:A?.value??""}),(0,e.jsx)("input",{type:"hidden",name:"roleId",value:I?.value??""}),(0,e.jsx)(N,{label:b.group,children:(0,e.jsx)(re.SelectBox,{options:k,value:A,onChange:y=>C(y||void 0),placeholder:b.selectPlaceholder})}),(0,e.jsx)(N,{label:b.role,children:(0,e.jsx)(re.SelectBox,{options:z,value:I,onChange:y=>G(y||void 0),placeholder:b.selectPlaceholder})}),(0,e.jsx)("button",{type:"submit",style:i.primary,children:o.assign})]})]})}var Ke={read:{bg:"#ecfdf5",text:"#047857",border:"#a7f3d0"},create:{bg:"#eff6ff",text:"#1d4ed8",border:"#bfdbfe"},update:{bg:"#fffbeb",text:"#b45309",border:"#fde68a"},delete:{bg:"#fef2f2",text:"#b91c1c",border:"#fecaca"}};function wt({users:t,roles:r,resources:a,grants:s,assignments:l,groupRoles:c=[],groups:b=[],selectedNode:o,onNodeClick:w}){let[k,z]=(0,V.useState)(null),A=new Set(l.map(n=>n.userId)),C=new Set(c.map(n=>n.groupId)),I=new Set([...l.map(n=>n.roleId),...c.map(n=>n.roleId),...s.map(n=>n.roleId)]),G=new Set(s.map(n=>n.resourceId)),y=t.filter(n=>A.has(n.id)),S=b.filter(n=>C.has(n.id)),E=r.filter(n=>I.has(n.id)),q=a.filter(n=>G.has(n.id)),ne=n=>{let g=s.filter(h=>h.resourceId===n),p=Array.from(new Set(g.map(h=>h.action)));return p.length>0?p:["none"]},ae=n=>32+ne(n).length*24+6,d=16,u=0,R=new Map;q.forEach(n=>{let g=ne(n.id),p=ae(n.id),h=u,M=new Map;g.forEach((H,B)=>{let O=h+8+24+B*24+12;M.set(H,O)}),R.set(n.id,{top:h,height:p,actionYMap:M}),u+=p+d});let m=u>0?u-d:0,x=52,$=18,L=x+$,_=E.length>0?E.length*L-$:0,ee=S.length>0?S.length*L-$:0,Z=y.length>0?y.length*L-$:0,P=Math.max(m,_,ee,Z,320)+60,K=(P-m)/2,X=(P-_)/2,D=(P-ee)/2,te=(P-Z)/2,J=(n,g)=>{let p=R.get(n);if(!p)return P/2;let h=p.actionYMap.get(g)??p.height/2;return K+h},fe=n=>X+n*L+x/2,Ge=n=>D+n*L+x/2,Le=n=>te+n*L+x/2,ve=140,oe=420,we=700,Ie=980,v=k||o,Je=n=>{if(!v)return!0;if(v.type==="user")return v.id===n;if(v.type==="role")return l.some(g=>g.userId===n&&g.roleId===v.id);if(v.type==="group")return!1;if(v.type==="resource"){let g=s.filter(p=>p.resourceId===v.id).map(p=>p.roleId);return l.some(p=>p.userId===n&&g.includes(p.roleId))}return!0},Ze=n=>{if(!v)return!0;if(v.type==="group")return v.id===n;if(v.type==="role")return c.some(g=>g.groupId===n&&g.roleId===v.id);if(v.type==="user")return!1;if(v.type==="resource"){let g=s.filter(p=>p.resourceId===v.id).map(p=>p.roleId);return c.some(p=>p.groupId===n&&g.includes(p.roleId))}return!0},et=n=>v?v.type==="role"?v.id===n:v.type==="user"?l.some(g=>g.userId===v.id&&g.roleId===n):v.type==="group"?c.some(g=>g.groupId===v.id&&g.roleId===n):v.type==="resource"?s.some(g=>g.resourceId===v.id&&g.roleId===n):!0:!0,tt=n=>{if(!v)return!0;if(v.type==="resource")return v.id===n;if(v.type==="role")return s.some(g=>g.roleId===v.id&&g.resourceId===n);if(v.type==="group"){let g=c.filter(p=>p.groupId===v.id).map(p=>p.roleId);return s.some(p=>g.includes(p.roleId)&&p.resourceId===n)}if(v.type==="user"){let g=l.filter(p=>p.userId===v.id).map(p=>p.roleId);return s.some(p=>g.includes(p.roleId)&&p.resourceId===n)}return!0},rt=(n,g)=>v?v.type==="user"?v.id===n&&l.some(p=>p.userId===n&&p.roleId===g):v.type==="role"?v.id===g&&l.some(p=>p.userId===n&&p.roleId===g):v.type==="resource"?s.filter(h=>h.resourceId===v.id).map(h=>h.roleId).includes(g)&&l.some(h=>h.userId===n&&h.roleId===g):v.type!=="group":!0,nt=(n,g)=>v?v.type==="group"?v.id===n&&c.some(p=>p.groupId===n&&p.roleId===g):v.type==="role"?v.id===g&&c.some(p=>p.groupId===n&&p.roleId===g):v.type==="resource"?s.filter(h=>h.resourceId===v.id).map(h=>h.roleId).includes(g)&&c.some(h=>h.groupId===n&&h.roleId===g):v.type!=="user":!0,ot=(n,g)=>v?v.type==="role"?v.id===n&&s.some(p=>p.roleId===n&&p.resourceId===g):v.type==="resource"?v.id===g&&s.some(p=>p.roleId===n&&p.resourceId===g):v.type==="group"?c.filter(h=>h.groupId===v.id).map(h=>h.roleId).includes(n)&&s.some(h=>h.roleId===n&&h.resourceId===g):v.type==="user"?l.filter(h=>h.userId===v.id).map(h=>h.roleId).includes(n)&&s.some(h=>h.roleId===n&&h.resourceId===g):!0:!0,De=[];l.forEach(n=>{let g=y.findIndex(h=>h.id===n.userId),p=E.findIndex(h=>h.id===n.roleId);if(g!==-1&&p!==-1){let h=l.filter(O=>O.roleId===n.roleId),M=h.findIndex(O=>O.userId===n.userId&&O.roleId===n.roleId),H=h.length,B=H>1?Math.min(Math.max((M-(H-1)/2)*4,-16),16):0;De.push({uIdx:g,rIdx:p,active:rt(n.userId,n.roleId),key:`ur-${n.userId}-${n.roleId}`,offset:B})}});let We=[];c.forEach(n=>{let g=S.findIndex(h=>h.id===n.groupId),p=E.findIndex(h=>h.id===n.roleId);if(g!==-1&&p!==-1){let h=c.filter(O=>O.roleId===n.roleId),M=h.findIndex(O=>O.groupId===n.groupId&&O.roleId===n.roleId),H=h.length,B=H>1?Math.min(Math.max((M-(H-1)/2)*4,-16),16):0;We.push({gIdx:g,rIdx:p,active:nt(n.groupId,n.roleId),key:`gr-${n.groupId}-${n.roleId}`,offset:B})}});let Me=[];return s.forEach(n=>{let g=E.findIndex(h=>h.id===n.roleId),p=q.findIndex(h=>h.id===n.resourceId);if(g!==-1&&p!==-1){let h=s.filter(ye=>ye.resourceId===n.resourceId&&ye.action===n.action),M=h.findIndex(ye=>ye.id===n.id),H=h.length,B=H>1?Math.min(Math.max((M-(H-1)/2)*4,-12),12):0,O=Ke[n.action],st=O?O.text:"#6366f1";Me.push({rIdx:g,resIdx:p,active:ot(n.roleId,n.resourceId),key:`rr-grant-${n.id}`,action:n.action,color:st,offset:B})}}),(0,e.jsx)("div",{"data-testid":"authz-topology-map",style:{width:"100%",overflowX:"auto",backgroundColor:"#ffffff",borderRadius:"10px",border:"1px solid #e2e8f0",padding:"1rem",boxSizing:"border-box"},children:(0,e.jsxs)("div",{style:{position:"relative",minWidth:"1160px",height:`${P}px`},children:[(0,e.jsxs)("svg",{style:{position:"absolute",top:0,left:0,width:"100%",height:"100%",pointerEvents:"none",zIndex:1},children:[(0,e.jsx)("title",{children:"Topology Connections"}),Me.map(n=>{let g=s.find(B=>`rr-grant-${B.id}`===n.key);if(!g)return null;let p=J(g.resourceId,g.action)+n.offset,h=fe(n.rIdx),M=ve+135,H=oe-135;return(0,e.jsx)("path",{d:`M ${ve+90} ${p} C ${M} ${p}, ${H} ${h}, ${oe-90} ${h}`,fill:"none",stroke:n.active?n.color:"#cbd5e1",strokeWidth:n.active&&v?3:2,strokeOpacity:n.active?v?1:.75:.12,style:{transition:"all 0.2s ease"}},n.key)}),We.map(n=>{let g=fe(n.rIdx)+n.offset,p=Ge(n.gIdx),h=oe+135,M=we-135;return(0,e.jsx)("path",{"data-testid":`topo-link-group-role-${n.key}`,"data-active":n.active?"true":"false",d:`M ${oe+90} ${g} C ${h} ${g}, ${M} ${p}, ${we-90} ${p}`,fill:"none",stroke:n.active?"#8b5cf6":"#cbd5e1",strokeWidth:n.active&&v?3:2,strokeDasharray:"4 2",strokeOpacity:n.active?v?1:.75:.12,style:{transition:"all 0.2s ease"}},n.key)}),De.map(n=>{let g=fe(n.rIdx)+n.offset,p=Le(n.uIdx),h=oe+135,M=Ie-135;return(0,e.jsx)("path",{"data-testid":`topo-link-user-role-${n.key}`,"data-active":n.active?"true":"false",d:`M ${oe+90} ${g} C ${h} ${g}, ${M} ${p}, ${Ie-90} ${p}`,fill:"none",stroke:n.active?"#4f46e5":"#cbd5e1",strokeWidth:n.active&&v?3:2,strokeOpacity:n.active?v?1:.75:.12,style:{transition:"all 0.2s ease"}},n.key)})]}),(0,e.jsxs)("div",{style:{position:"relative",zIndex:2,width:"100%",height:"100%"},children:[q.map(n=>{let g=o?.type==="resource"&&o.id===n.id,p=tt(n.id),h=R.get(n.id);if(!h)return null;let M=K+h.top,H=ne(n.id);return(0,e.jsxs)("div",{style:{position:"absolute",left:`${ve-90}px`,top:`${M}px`,width:"180px",height:`${h.height}px`,borderRadius:"8px",border:g?"2px solid #10b981":"1px solid #a7f3d0",backgroundColor:g?"#d1fae5":p?"#ffffff":"#f8fafc",opacity:p?1:.35,boxShadow:g?"0 4px 12px rgba(16, 185, 129, 0.2)":"0 1px 3px rgba(0,0,0,0.05)",transition:"all 0.15s ease",padding:"8px",boxSizing:"border-box",display:"flex",flexDirection:"column"},children:[(0,e.jsxs)("button",{type:"button",onClick:()=>w("resource",n.id),onMouseEnter:()=>z({type:"resource",id:n.id}),onMouseLeave:()=>z(null),"data-testid":`topo-node-resource-${n.id}`,"aria-label":`\u30EA\u30BD\u30FC\u30B9: ${n.name}`,"aria-pressed":g,style:{background:"none",border:"none",padding:0,margin:0,cursor:"pointer",textAlign:"left",width:"100%",display:"flex",alignItems:"center",gap:"6px",marginBottom:"6px",height:"18px"},children:[(0,e.jsx)("span",{style:{fontSize:"1rem",flexShrink:0},children:"\u{1F511}"}),(0,e.jsx)("span",{style:{fontWeight:600,fontSize:"0.78rem",color:"#047857",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:n.name})]}),(0,e.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:"2px"},children:H.map(B=>{if(B==="none")return(0,e.jsx)("div",{style:{fontSize:"0.68rem",color:"#94a3b8",height:"22px",display:"flex",alignItems:"center",padding:"0 6px"},children:"\u6A29\u9650\u8A2D\u5B9A\u306A\u3057"},"none");let O=Ke[B]??{bg:"#ecfdf5",text:"#047857",border:"#a7f3d0"};return(0,e.jsxs)("div",{style:{height:"22px",boxSizing:"border-box",padding:"0 8px",borderRadius:"4px",backgroundColor:O.bg,color:O.text,border:`1px solid ${O.border}`,display:"flex",alignItems:"center",justifyContent:"space-between",fontSize:"0.68rem",fontWeight:600},children:[(0,e.jsx)("span",{children:B}),(0,e.jsx)("span",{style:{fontSize:"0.6rem",opacity:.6},children:"\u25CF"})]},B)})})]},n.id)}),E.map((n,g)=>{let p=o?.type==="role"&&o.id===n.id,h=et(n.id),M=fe(g);return(0,e.jsxs)("button",{type:"button",onClick:()=>w("role",n.id),onMouseEnter:()=>z({type:"role",id:n.id}),onMouseLeave:()=>z(null),"data-testid":`topo-node-role-${n.id}`,"aria-label":`\u30ED\u30FC\u30EB: ${n.name}`,"aria-pressed":p,style:{position:"absolute",left:`${oe-90}px`,top:`${M-26}px`,width:"180px",height:"52px",borderRadius:"8px",border:p?"2px solid #6366f1":"1px solid #c7d2fe",backgroundColor:p?"#e0e7ff":h?"#ffffff":"#f8fafc",opacity:h?1:.35,cursor:"pointer",display:"flex",alignItems:"center",padding:"0 10px",gap:"8px",boxShadow:p?"0 4px 12px rgba(99, 102, 241, 0.2)":"0 1px 3px rgba(0,0,0,0.05)",transition:"all 0.15s ease",textAlign:"left",boxSizing:"border-box"},children:[(0,e.jsx)("span",{style:{fontSize:"1.1rem",flexShrink:0},children:"\u{1F6E1}\uFE0F"}),(0,e.jsxs)("div",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",flex:1,minWidth:0},children:[(0,e.jsx)("div",{style:{fontWeight:600,fontSize:"0.78rem",color:"#4338ca",textOverflow:"ellipsis",overflow:"hidden"},children:n.name}),(0,e.jsx)("div",{style:{fontSize:"0.68rem",color:"#64748b",fontFamily:"monospace",textOverflow:"ellipsis",overflow:"hidden"},children:n.roleKey})]})]},n.id)}),S.map((n,g)=>{let p=o?.type==="group"&&o.id===n.id,h=Ze(n.id),M=Ge(g);return(0,e.jsxs)("button",{type:"button",onClick:()=>w("group",n.id),onMouseEnter:()=>z({type:"group",id:n.id}),onMouseLeave:()=>z(null),"data-testid":`topo-node-group-${n.id}`,"aria-label":`\u30B0\u30EB\u30FC\u30D7: ${n.name}`,"aria-pressed":p,style:{position:"absolute",left:`${we-90}px`,top:`${M-26}px`,width:"180px",height:"52px",borderRadius:"8px",border:p?"2px solid #8b5cf6":"1px solid #ddd6fe",backgroundColor:p?"#f3e8ff":h?"#ffffff":"#f8fafc",opacity:h?1:.35,cursor:"pointer",display:"flex",alignItems:"center",padding:"0 10px",gap:"8px",boxShadow:p?"0 4px 12px rgba(139, 92, 246, 0.2)":"0 1px 3px rgba(0,0,0,0.05)",transition:"all 0.15s ease",textAlign:"left",boxSizing:"border-box"},children:[(0,e.jsx)("span",{style:{fontSize:"1.1rem",flexShrink:0},children:"\u{1F465}"}),(0,e.jsxs)("div",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",flex:1,minWidth:0},children:[(0,e.jsx)("div",{style:{fontWeight:600,fontSize:"0.78rem",color:"#6d28d9",textOverflow:"ellipsis",overflow:"hidden"},children:n.name}),(0,e.jsx)("div",{style:{fontSize:"0.68rem",color:"#64748b",fontFamily:"monospace",textOverflow:"ellipsis",overflow:"hidden"},children:n.groupKey})]})]},n.id)}),y.map((n,g)=>{let p=o?.type==="user"&&o.id===n.id,h=Je(n.id),M=Le(g);return(0,e.jsxs)("button",{type:"button",onClick:()=>w("user",n.id),onMouseEnter:()=>z({type:"user",id:n.id}),onMouseLeave:()=>z(null),"data-testid":`topo-node-user-${n.id}`,"aria-label":`\u30E6\u30FC\u30B6\u30FC: ${n.displayName}`,"aria-pressed":p,style:{position:"absolute",left:`${Ie-90}px`,top:`${M-26}px`,width:"180px",height:"52px",borderRadius:"8px",border:p?"2px solid #0284c7":"1px solid #bae6fd",backgroundColor:p?"#e0f2fe":h?"#ffffff":"#f8fafc",opacity:h?1:.35,cursor:"pointer",display:"flex",alignItems:"center",padding:"0 10px",gap:"8px",boxShadow:p?"0 4px 12px rgba(2, 132, 199, 0.2)":"0 1px 3px rgba(0,0,0,0.05)",transition:"all 0.15s ease",textAlign:"left",boxSizing:"border-box"},children:[(0,e.jsx)("span",{style:{fontSize:"1.1rem",flexShrink:0},children:"\u{1F464}"}),(0,e.jsxs)("div",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",flex:1,minWidth:0},children:[(0,e.jsx)("div",{style:{fontWeight:600,fontSize:"0.78rem",color:"#0369a1",textOverflow:"ellipsis",overflow:"hidden"},children:n.displayName}),(0,e.jsx)("div",{style:{fontSize:"0.68rem",color:"#64748b",textOverflow:"ellipsis",overflow:"hidden"},children:n.email})]})]},n.id)})]})]})})}function je(){let{users:t,roles:r,resources:a,grants:s,assignments:l,groupRoles:c=[],groups:b=[]}=(0,T.useLoaderData)(),[o,w]=(0,V.useState)(null),[k,z]=(0,V.useState)(""),[A,C]=(0,V.useState)("topology"),I=new Map(r.map(f=>[f.id,f])),G=new Map(a.map(f=>[f.id,f])),y=new Map(b.map(f=>[f.id,f])),S=new Map(t.map(f=>[f.id,f])),E=f=>{if(!o)return!0;if(o.type==="user")return o.id===f;if(o.type==="role")return l.some(P=>P.userId===f&&P.roleId===o.id);if(o.type==="group")return!1;if(o.type==="resource"){let P=s.filter(K=>K.resourceId===o.id).map(K=>K.roleId);return l.some(K=>K.userId===f&&P.includes(K.roleId))}return!0},q=f=>{if(!o)return!0;if(o.type==="group")return o.id===f;if(o.type==="role")return c.some(P=>P.groupId===f&&P.roleId===o.id);if(o.type==="user")return!1;if(o.type==="resource"){let P=s.filter(K=>K.resourceId===o.id).map(K=>K.roleId);return c.some(K=>K.groupId===f&&P.includes(K.roleId))}return!0},ne=f=>o?o.type==="role"?o.id===f:o.type==="user"?l.some(P=>P.userId===o.id&&P.roleId===f):o.type==="group"?c.some(P=>P.groupId===o.id&&P.roleId===f):o.type==="resource"?s.some(P=>P.resourceId===o.id&&P.roleId===f):!0:!0,ae=f=>{if(!o)return!0;if(o.type==="resource")return o.id===f;if(o.type==="role")return s.some(P=>P.roleId===o.id&&P.resourceId===f);if(o.type==="group"){let P=c.filter(K=>K.groupId===o.id).map(K=>K.roleId);return s.some(K=>P.includes(K.roleId)&&K.resourceId===f)}if(o.type==="user"){let P=l.filter(K=>K.userId===o.id).map(K=>K.roleId);return s.some(K=>P.includes(K.roleId)&&K.resourceId===f)}return!0},d=k.trim().toLowerCase(),u=t.filter(f=>!d||f.displayName.toLowerCase().includes(d)||f.email?.toLowerCase().includes(d)),R=b.filter(f=>!d||f.name.toLowerCase().includes(d)||f.groupKey.toLowerCase().includes(d)),m=r.filter(f=>!d||f.name.toLowerCase().includes(d)||f.roleKey.toLowerCase().includes(d)),x=a.filter(f=>!d||f.name.toLowerCase().includes(d)||f.resourceKey.toLowerCase().includes(d)||f.appKey.toLowerCase().includes(d)),$=o?.type==="user"?S.get(o.id):null,L=o?.type==="group"?y.get(o.id):null,_=o?.type==="role"?I.get(o.id):null,ee=o?.type==="resource"?G.get(o.id):null,Z=(f,P)=>{o&&o.type===f&&o.id===P?w(null):w({type:f,id:P})};return(0,e.jsxs)("section",{"data-testid":"authz-graph-view",style:{display:"flex",flexDirection:"column",gap:"1rem",width:"100%"},children:[(0,e.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",flexWrap:"wrap",gap:"0.75rem",backgroundColor:"#f8fafc",padding:"0.75rem 1rem",borderRadius:"8px",border:"1px solid #e2e8f0",width:"100%",boxSizing:"border-box"},children:[(0,e.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"0.75rem",flexWrap:"wrap"},children:[(0,e.jsxs)("div",{style:{display:"inline-flex",borderRadius:"6px",border:"1px solid #cbd5e1",padding:"2px",backgroundColor:"#ffffff"},children:[(0,e.jsx)("button",{type:"button",onClick:()=>C("topology"),"data-testid":"switch-mode-topology",style:{padding:"3px 10px",borderRadius:"4px",border:"none",cursor:"pointer",fontSize:"0.75rem",fontWeight:A==="topology"?600:400,backgroundColor:A==="topology"?"#eff6ff":"transparent",color:A==="topology"?"#0284c7":"#64748b",boxShadow:A==="topology"?"0 1px 2px rgba(0,0,0,0.08)":"none"},children:"\u{1F310} \u30C8\u30DD\u30ED\u30B8\u30DE\u30C3\u30D7 (Topology)"}),(0,e.jsx)("button",{type:"button",onClick:()=>C("columns"),"data-testid":"switch-mode-columns",style:{padding:"3px 10px",borderRadius:"4px",border:"none",cursor:"pointer",fontSize:"0.75rem",fontWeight:A==="columns"?600:400,backgroundColor:A==="columns"?"#eff6ff":"transparent",color:A==="columns"?"#0284c7":"#64748b",boxShadow:A==="columns"?"0 1px 2px rgba(0,0,0,0.08)":"none"},children:"\u{1F4CB} \u30AB\u30E9\u30E0\u4E00\u89A7 (Columns)"})]}),(0,e.jsxs)("div",{style:{display:"flex",gap:"0.4rem",fontSize:"0.75rem",flexWrap:"wrap"},children:[(0,e.jsxs)("span",{style:{backgroundColor:"#e0f2fe",color:"#0369a1",padding:"2px 8px",borderRadius:"12px",fontWeight:600},children:["\u{1F464} \u30E6\u30FC\u30B6\u30FC: ",t.length]}),(0,e.jsxs)("span",{style:{backgroundColor:"#f3e8ff",color:"#6d28d9",padding:"2px 8px",borderRadius:"12px",fontWeight:600},children:["\u{1F465} \u30B0\u30EB\u30FC\u30D7: ",b.length]}),(0,e.jsxs)("span",{style:{backgroundColor:"#e0e7ff",color:"#4338ca",padding:"2px 8px",borderRadius:"12px",fontWeight:600},children:["\u{1F6E1}\uFE0F \u30ED\u30FC\u30EB: ",r.length]}),(0,e.jsxs)("span",{style:{backgroundColor:"#d1fae5",color:"#047857",padding:"2px 8px",borderRadius:"12px",fontWeight:600},children:["\u{1F511} \u30EA\u30BD\u30FC\u30B9: ",a.length]}),(0,e.jsxs)("span",{style:{backgroundColor:"#fef3c7",color:"#b45309",padding:"2px 8px",borderRadius:"12px",fontWeight:600},children:["\u26A1\uFE0F \u6A29\u9650\u8A2D\u5B9A: ",s.length]})]})]}),(0,e.jsx)("div",{style:{display:"flex",alignItems:"center",gap:"0.5rem"},children:(0,e.jsx)("input",{type:"text",placeholder:"\u30AD\u30FC\u30EF\u30FC\u30C9\u3067\u7D5E\u308A\u8FBC\u307F...",value:k,onChange:f=>z(f.target.value),"data-testid":"graph-search-input",style:{padding:"5px 10px",borderRadius:"6px",border:"1px solid #cbd5e1",fontSize:"0.8rem",width:"200px"}})})]}),(0,e.jsxs)("div",{style:{minHeight:"38px",height:"38px",display:"flex",alignItems:"center",justifyContent:"space-between",backgroundColor:o?"#eff6ff":"#f8fafc",border:`1px solid ${o?"#bfdbfe":"#e2e8f0"}`,padding:"0 0.8rem",borderRadius:"6px",fontSize:"0.8rem",color:o?"#1e40af":"#64748b",width:"100%",boxSizing:"border-box",transition:"all 0.15s ease"},children:[(0,e.jsx)("div",{style:{display:"flex",alignItems:"center",gap:"0.4rem",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:o?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("span",{children:"\u{1F3AF}"}),(0,e.jsx)("strong",{children:"\u9078\u629E\u4E2D\u306E\u30CE\u30FC\u30C9:"}),(0,e.jsxs)("span",{children:[$&&`\u30E6\u30FC\u30B6\u30FC\u300C${$.displayName} (${$.email})\u300D\u306B\u95A2\u9023\u3059\u308B\u30D1\u30B9\u3092\u8868\u793A\u4E2D`,L&&`\u30B0\u30EB\u30FC\u30D7\u300C${L.name} (${L.groupKey})\u300D\u306B\u95A2\u9023\u3059\u308B\u30D1\u30B9\u3092\u8868\u793A\u4E2D`,_&&`\u30ED\u30FC\u30EB\u300C${_.name} (${_.roleKey})\u300D\u306B\u95A2\u9023\u3059\u308B\u30D1\u30B9\u3092\u8868\u793A\u4E2D`,ee&&`\u30EA\u30BD\u30FC\u30B9\u300C${ee.name} (${ee.appKey}:${ee.resourceKey})\u300D\u306B\u95A2\u9023\u3059\u308B\u30D1\u30B9\u3092\u8868\u793A\u4E2D`]})]}):(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("span",{children:"\u{1F4A1}"}),(0,e.jsxs)("span",{children:[(0,e.jsx)("strong",{children:"\u30D2\u30F3\u30C8:"})," \u30CE\u30FC\u30C9\uFF08\u30EA\u30BD\u30FC\u30B9\u30FB\u30ED\u30FC\u30EB\u30FB\u30B0\u30EB\u30FC\u30D7\u30FB\u30E6\u30FC\u30B6\u30FC\uFF09\u3092\u30AF\u30EA\u30C3\u30AF\u3059\u308B\u3068\u3001\u95A2\u9023\u3059\u308B\u5168\u30D1\u30B9\u304C\u30CF\u30A4\u30E9\u30A4\u30C8\u8868\u793A\u3055\u308C\u307E\u3059"]})]})}),o&&(0,e.jsx)("button",{type:"button",onClick:()=>w(null),"data-testid":"graph-reset-selection",style:{padding:"3px 8px",borderRadius:"4px",border:"1px solid #93c5fd",backgroundColor:"#ffffff",fontSize:"0.72rem",cursor:"pointer",color:"#1d4ed8",fontWeight:600,whiteSpace:"nowrap",boxShadow:"0 1px 2px rgba(0,0,0,0.05)"},children:"\u2715 \u9078\u629E\u89E3\u9664"})]}),A==="topology"?(0,e.jsx)(wt,{users:u,roles:m,resources:x,grants:s,assignments:l,groupRoles:c,groups:R,selectedNode:o,onNodeClick:Z}):(0,e.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"repeat(4, minmax(0, 1fr))",gap:"1rem",alignItems:"start",width:"100%",boxSizing:"border-box"},children:[(0,e.jsxs)("div",{style:{backgroundColor:"#ffffff",borderRadius:"8px",border:"1px solid #e2e8f0",padding:"0.75rem"},children:[(0,e.jsxs)("div",{style:{fontWeight:700,fontSize:"0.85rem",color:"#047857",marginBottom:"0.6rem",display:"flex",alignItems:"center",gap:"0.3rem",borderBottom:"2px solid #a7f3d0",paddingBottom:"0.4rem"},children:[(0,e.jsx)("span",{children:"\u{1F511}"})," \u30EA\u30BD\u30FC\u30B9 (",x.length,")"]}),(0,e.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"0.5rem",maxHeight:"480px",overflowY:"auto",paddingRight:"4px"},children:[x.length===0&&(0,e.jsx)("div",{style:{fontSize:"0.8rem",color:"#94a3b8",textAlign:"center",padding:"1rem"},children:"\u5BFE\u8C61\u306E\u30EA\u30BD\u30FC\u30B9\u304C\u3042\u308A\u307E\u305B\u3093"}),x.map(f=>{let P=o?.type==="resource"&&o.id===f.id,K=ae(f.id),X=s.filter(D=>D.resourceId===f.id);return(0,e.jsxs)("button",{type:"button",onClick:()=>Z("resource",f.id),"data-testid":`graph-node-resource-${f.id}`,style:{textAlign:"left",width:"100%",padding:"0.6rem",borderRadius:"6px",border:P?"2px solid #10b981":"1px solid #e2e8f0",backgroundColor:P?"#d1fae5":K?"#ffffff":"#f8fafc",opacity:K?1:.4,cursor:"pointer",transition:"all 0.15s ease",boxShadow:P?"0 2px 4px rgba(16, 185, 129, 0.15)":"none"},children:[(0,e.jsx)("div",{style:{fontWeight:600,fontSize:"0.82rem",color:"#0f172a"},children:f.name}),(0,e.jsxs)("div",{style:{fontSize:"0.72rem",color:"#64748b",fontFamily:"monospace"},children:[f.appKey,":",f.resourceKey]}),(0,e.jsxs)("div",{style:{display:"flex",flexWrap:"wrap",gap:"0.25rem",marginTop:"0.4rem"},children:[X.map(D=>{let te=I.get(D.roleId),J=Ke[D.action]??{bg:"#f1f5f9",text:"#475569",border:"#cbd5e1"};return(0,e.jsxs)("span",{style:{fontSize:"0.68rem",padding:"1px 6px",borderRadius:"4px",backgroundColor:J.bg,color:J.text,border:`1px solid ${J.border}`},children:[te?.roleKey??`Role#${D.roleId}`,": ",(0,e.jsx)("strong",{children:D.action})]},D.id)}),X.length===0&&(0,e.jsx)("span",{style:{fontSize:"0.68rem",color:"#94a3b8"},children:"\u6A29\u9650\u8A2D\u5B9A\u306A\u3057"})]})]},f.id)})]})]}),(0,e.jsxs)("div",{style:{backgroundColor:"#ffffff",borderRadius:"8px",border:"1px solid #e2e8f0",padding:"0.75rem"},children:[(0,e.jsxs)("div",{style:{fontWeight:700,fontSize:"0.85rem",color:"#4338ca",marginBottom:"0.6rem",display:"flex",alignItems:"center",gap:"0.3rem",borderBottom:"2px solid #c7d2fe",paddingBottom:"0.4rem"},children:[(0,e.jsx)("span",{children:"\u{1F6E1}\uFE0F"})," \u30ED\u30FC\u30EB (",m.length,")"]}),(0,e.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"0.5rem",maxHeight:"480px",overflowY:"auto",paddingRight:"4px"},children:[m.length===0&&(0,e.jsx)("div",{style:{fontSize:"0.8rem",color:"#94a3b8",textAlign:"center",padding:"1rem"},children:"\u5BFE\u8C61\u306E\u30ED\u30FC\u30EB\u304C\u3042\u308A\u307E\u305B\u3093"}),m.map(f=>{let P=o?.type==="role"&&o.id===f.id,K=ne(f.id),X=s.filter(J=>J.roleId===f.id),D=l.filter(J=>J.roleId===f.id),te=c.filter(J=>J.roleId===f.id);return(0,e.jsxs)("button",{type:"button",onClick:()=>Z("role",f.id),"data-testid":`graph-node-role-${f.id}`,style:{textAlign:"left",width:"100%",padding:"0.6rem",borderRadius:"6px",border:P?"2px solid #6366f1":"1px solid #e2e8f0",backgroundColor:P?"#e0e7ff":K?"#ffffff":"#f8fafc",opacity:K?1:.4,cursor:"pointer",transition:"all 0.15s ease",boxShadow:P?"0 2px 4px rgba(99, 102, 241, 0.15)":"none"},children:[(0,e.jsx)("div",{style:{fontWeight:600,fontSize:"0.82rem",color:"#0f172a"},children:f.name}),(0,e.jsx)("div",{style:{fontSize:"0.72rem",color:"#64748b",fontFamily:"monospace"},children:f.roleKey}),(0,e.jsxs)("div",{style:{fontSize:"0.7rem",color:"#475569",marginTop:"0.3rem",display:"flex",gap:"0.5rem"},children:[(0,e.jsxs)("span",{children:["\u6A29\u9650: ",X.length]}),(0,e.jsxs)("span",{children:["\u30B0\u30EB\u30FC\u30D7: ",te.length]}),(0,e.jsxs)("span",{children:["\u30E6\u30FC\u30B6\u30FC: ",D.length]})]})]},f.id)})]})]}),(0,e.jsxs)("div",{style:{backgroundColor:"#ffffff",borderRadius:"8px",border:"1px solid #e2e8f0",padding:"0.75rem"},children:[(0,e.jsxs)("div",{style:{fontWeight:700,fontSize:"0.85rem",color:"#6d28d9",marginBottom:"0.6rem",display:"flex",alignItems:"center",gap:"0.3rem",borderBottom:"2px solid #ddd6fe",paddingBottom:"0.4rem"},children:[(0,e.jsx)("span",{children:"\u{1F465}"})," \u30B0\u30EB\u30FC\u30D7 (",R.length,")"]}),(0,e.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"0.5rem",maxHeight:"480px",overflowY:"auto",paddingRight:"4px"},children:[R.length===0&&(0,e.jsx)("div",{style:{fontSize:"0.8rem",color:"#94a3b8",textAlign:"center",padding:"1rem"},children:"\u5BFE\u8C61\u306E\u30B0\u30EB\u30FC\u30D7\u304C\u3042\u308A\u307E\u305B\u3093"}),R.map(f=>{let P=o?.type==="group"&&o.id===f.id,K=q(f.id),X=c.filter(D=>D.groupId===f.id);return(0,e.jsxs)("button",{type:"button",onClick:()=>Z("group",f.id),"data-testid":`graph-node-group-${f.id}`,style:{textAlign:"left",width:"100%",padding:"0.6rem",borderRadius:"6px",border:P?"2px solid #8b5cf6":"1px solid #e2e8f0",backgroundColor:P?"#f3e8ff":K?"#ffffff":"#f8fafc",opacity:K?1:.4,cursor:"pointer",transition:"all 0.15s ease",boxShadow:P?"0 2px 4px rgba(139, 92, 246, 0.15)":"none"},children:[(0,e.jsx)("div",{style:{fontWeight:600,fontSize:"0.82rem",color:"#0f172a"},children:f.name}),(0,e.jsx)("div",{style:{fontSize:"0.72rem",color:"#64748b",fontFamily:"monospace"},children:f.groupKey}),(0,e.jsxs)("div",{style:{display:"flex",flexWrap:"wrap",gap:"0.25rem",marginTop:"0.4rem"},children:[X.map(D=>{let te=I.get(D.roleId);return(0,e.jsxs)("span",{style:{fontSize:"0.68rem",padding:"1px 6px",borderRadius:"4px",backgroundColor:"#f3e8ff",color:"#6d28d9",border:"1px solid #ddd6fe",fontWeight:600},children:["\u{1F6E1}\uFE0F ",te?.name??D.roleKey]},`${D.groupId}-${D.roleId}`)}),X.length===0&&(0,e.jsx)("span",{style:{fontSize:"0.68rem",color:"#94a3b8"},children:"\u30ED\u30FC\u30EB\u672A\u5272\u308A\u5F53\u3066"})]})]},f.id)})]})]}),(0,e.jsxs)("div",{style:{backgroundColor:"#ffffff",borderRadius:"8px",border:"1px solid #e2e8f0",padding:"0.75rem"},children:[(0,e.jsxs)("div",{style:{fontWeight:700,fontSize:"0.85rem",color:"#0369a1",marginBottom:"0.6rem",display:"flex",alignItems:"center",gap:"0.3rem",borderBottom:"2px solid #bae6fd",paddingBottom:"0.4rem"},children:[(0,e.jsx)("span",{children:"\u{1F464}"})," \u30E6\u30FC\u30B6\u30FC (",u.length,")"]}),(0,e.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"0.5rem",maxHeight:"480px",overflowY:"auto",paddingRight:"4px"},children:[u.length===0&&(0,e.jsx)("div",{style:{fontSize:"0.8rem",color:"#94a3b8",textAlign:"center",padding:"1rem"},children:"\u5BFE\u8C61\u306E\u30E6\u30FC\u30B6\u30FC\u304C\u3042\u308A\u307E\u305B\u3093"}),u.map(f=>{let P=o?.type==="user"&&o.id===f.id,K=E(f.id),X=l.filter(D=>D.userId===f.id);return(0,e.jsxs)("button",{type:"button",onClick:()=>Z("user",f.id),"data-testid":`graph-node-user-${f.id}`,style:{textAlign:"left",width:"100%",padding:"0.6rem",borderRadius:"6px",border:P?"2px solid #0284c7":"1px solid #e2e8f0",backgroundColor:P?"#e0f2fe":K?"#ffffff":"#f8fafc",opacity:K?1:.4,cursor:"pointer",transition:"all 0.15s ease",boxShadow:P?"0 2px 4px rgba(2, 132, 199, 0.15)":"none"},children:[(0,e.jsx)("div",{style:{fontWeight:600,fontSize:"0.82rem",color:"#0f172a"},children:f.displayName}),(0,e.jsx)("div",{style:{fontSize:"0.72rem",color:"#64748b"},children:f.email}),(0,e.jsxs)("div",{style:{display:"flex",flexWrap:"wrap",gap:"0.25rem",marginTop:"0.4rem"},children:[X.map(D=>{let te=I.get(D.roleId);return(0,e.jsxs)("span",{style:{fontSize:"0.68rem",padding:"1px 6px",borderRadius:"4px",backgroundColor:"#e0f2fe",color:"#0369a1",border:"1px solid #bae6fd",fontWeight:600},children:["\u{1F6E1}\uFE0F ",te?.name??D.roleKey]},`${D.userId}-${D.roleId}`)}),X.length===0&&(0,e.jsx)("span",{style:{fontSize:"0.68rem",color:"#94a3b8"},children:"\u76F4\u63A5\u30ED\u30FC\u30EB\u306A\u3057"})]})]},f.id)})]})]})]})]})}var It={roles:Te,resources:qe,role_permissions:He,user_roles:Be,group_roles:Ve,graph:je};function At({renderHeader:t}={}){let{segment:r}=(0,T.useLoaderData)(),a=It[r]??Te;return(0,e.jsx)(Ue,{renderHeader:t,children:(0,e.jsx)(a,{})})}function Rt(t){let r={};for(let a of Object.keys(t)){let s=t[a];r[a]={key:s.key??a,name:s.name,description:s.description}}return r}function St(t){return Object.values(t).map(r=>r.key)}var j=require("@aiquants/authz-core"),Xe=require("react-router"),Qe="@aiquants/authz-react-router",Q=class extends Error{constructor(r){super(`[${Qe}] ${r}`),this.name="AuthzUsageError"}};function xe(t,r){let a=(0,j.can)(r,"read"),s=(0,j.can)(r,"create"),l=(0,j.can)(r,"update"),c=(0,j.can)(r,"delete"),b=r?.scopeByAction.read,o=a&&(!b||b.rowScope!==null||b.columnScope!==null);return{resourceKey:t,canRead:a,canCreate:s,canUpdate:l,canDelete:c,canWrite:s||l,readPartial:o,actions:r?Array.from(r.actions):[]}}function ie(t){return t===null?"null":typeof t=="string"?`a string (${JSON.stringify(t)})`:Array.isArray(t)?"an array":`${typeof t} (${String(t)})`}function Ye(t,r){if(!Array.isArray(t)){let l=typeof t=="string"?` A bare string would be iterated character by character; pass \`{ resourceKeys: [${JSON.stringify(t)}] }\` instead.`:"";throw new Q(`${r} must be an array of resource keys, but received ${ie(t)}.${l}`)}let a=new Set,s=[];return t.forEach((l,c)=>{if(typeof l!="string"||l.trim()==="")throw new Q(`${r}[${c}] must be a non-empty resource key string, but received ${ie(l)}.`);a.has(l)||(a.add(l),s.push(l))}),s}function zt(t){if(t==null)return;let r=t;if(r.actions instanceof Set&&typeof r.scopeByAction=="object")throw new Q("createAuthz({ getEffectivePermissions }) must resolve to a record keyed by resource key (e.g. getEffectivePermissionsMany from @aiquants/authz-drizzle), but it resolved to a single EffectivePermission. Keeping the single-resource port would deny every resource silently.")}function Pt(t){if(typeof t!="object"||t===null)throw new Q(`requirePermission(request, query) requires a query object like { resourceKey: "documents", action: "read" }, but received ${ie(t)}.`);let{resourceKey:r,action:a}=t;if(typeof r!="string"||r.trim()==="")throw new Q(`query.resourceKey must be a non-empty string, but received ${ie(r)}.`);if(typeof a!="string"||!j.AUTHZ_ACTIONS.includes(a)){let s=a==="write"?' "write" is a derived concept (create \u222A update) and is never guarded directly \u2014 guard "create" or "update".':"";throw new Q(`query.action must be one of ${j.AUTHZ_ACTIONS.join(" | ")}, but received ${ie(a)}.${s}`)}return{resourceKey:r,action:a}}function kt(t,r){return t!==null&&(0,j.isSameTenant)(r,t.tenantId)?t:null}function Kt(t){if(typeof t.resolveTenantId!="function")throw new Q(`createAuthz({ resolveTenantId }) is required: every permission check is scoped to exactly one tenant, but received ${ie(t.resolveTenantId)}.`);if(typeof t.assertTenantMembership!="function")throw new Q(`createAuthz({ assertTenantMembership }) is required: resolving a tenant only says which tenant the request named \u2014 it never proves the caller may act as it, so without this port naming another tenant is enough to be authorized inside it. Received ${ie(t.assertTenantMembership)}.`);async function r(o,w){return t.resolveGroupIds?await t.resolveGroupIds(o,w)??void 0:void 0}async function a(o){return(0,j.assertTenantId)(await t.resolveTenantId(o),`${Qe} createAuthz(resolveTenantId)`)}async function s(o,w,k,z){if(w.length===0)return{};let A=await r(o,z),C=await t.getEffectivePermissions({userId:k,tenantId:z,groupIds:A,appKey:t.appKey,resourceKeys:w});return zt(C),Object.fromEntries(w.map(I=>[I,(C&&Object.hasOwn(C,I)?C[I]:null)??null]))}async function l(o,w,k){let{resourceKey:z,action:A}=Pt(w),C=k?.failureRedirect?()=>{throw(0,Xe.redirect)(k.failureRedirect)}:t.onDeny,G=await(0,j.createRequirePermission)({resolveUserId:t.resolveUserId,resolveTenantId:a,assertTenantMembership:({ctx:y,tenantId:S,userId:E})=>t.assertTenantMembership(y,S,E),getEffectivePermissions:async y=>(await s(o,[y.resourceKey],y.userId,y.tenantId))[y.resourceKey],onDeny:C})(o,{appKey:t.appKey,resourceKey:z,action:A});return{userId:G.userId,tenantId:G.tenantId,scope:G.scope,permission:xe(z,G.effectivePermission)}}function c(o){if(o?.resourceKeys!==void 0)return{kind:"explicit",keys:Ye(o.resourceKeys,"getMyPermissions options.resourceKeys")};if(!t.listResourceKeys)throw new Q('getMyPermissions(request) needs to know which resources exist. Either pass them explicitly \u2014 getMyPermissions(request, { resourceKeys: ["documents"] }) \u2014 or configure createAuthz({ listResourceKeys }) (e.g. listResourceKeys from @aiquants/authz-drizzle) to report on every registered resource.');return{kind:"all",listResourceKeys:t.listResourceKeys}}async function b(o,w){let k=c(w),z=await t.resolveUserId(o)??null,A=await a(o);if(!await t.assertTenantMembership(o,A,z))return k.kind==="explicit"?Object.fromEntries(k.keys.map(G=>[G,xe(G,null)])):{};let C=k.kind==="explicit"?k.keys:Ye(await k.listResourceKeys(o,A)??[],"the listResourceKeys port result"),I=await s(o,C,z,A);return Object.fromEntries(C.map(G=>[G,xe(G,kt(I[G],A))]))}return{requirePermission:l,getMyPermissions:b}}0&&(module.exports={AuthzAdminAppView,AuthzErrorBoundary,AuthzGrantsView,AuthzGraphView,AuthzGroupRolesView,AuthzLayout,AuthzResourcesView,AuthzRolesView,AuthzUsageError,AuthzUserRolesView,ErrorAlert,Field,MyPermissionGroupStatus,MyPermissionIndicator,MyPermissionStatus,createAuthz,createAuthzAdminApp,createAuthzAdminServer,defaultAuthzAdminLabels,defineResources,flattenGroupItems,formatResourceTooltip,getPermissionSummary,makeAuthzErrorBoundary,resolveLabels,resourceKeysOf,toPermissionView,ui,usePermission});
3
3
  //# sourceMappingURL=index.js.map