@aiquants/authz-react-router 0.5.0 → 0.6.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 +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
"use strict";var ce=Object.defineProperty;var Ee=Object.getOwnPropertyDescriptor;var Te=Object.getOwnPropertyNames;var Fe=Object.prototype.hasOwnProperty;var Oe=(t,o)=>{for(var i in o)ce(t,i,{get:o[i],enumerable:!0})},Ue=(t,o,i,s)=>{if(o&&typeof o=="object"||typeof o=="function")for(let n of Te(o))!Fe.call(t,n)&&n!==i&&ce(t,n,{get:()=>o[n],enumerable:!(s=Ee(o,n))||s.enumerable});return t};var He=t=>Ue(ce({},"__esModule",{value:!0}),t);var st={};Oe(st,{AuthzAdminAppView:()=>rt,AuthzErrorBoundary:()=>Je,AuthzGrantsView:()=>Ge,AuthzGraphView:()=>Ne,AuthzGroupRolesView:()=>De,AuthzLayout:()=>Qe,AuthzResourcesView:()=>$e,AuthzRolesView:()=>we,AuthzUserRolesView:()=>Le,ErrorAlert:()=>te,Field:()=>W,MyPermissionGroupStatus:()=>he,MyPermissionIndicator:()=>ue,MyPermissionStatus:()=>Xe,createAuthz:()=>nt,createAuthzAdminApp:()=>Ve,createAuthzAdminServer:()=>me,defaultAuthzAdminLabels:()=>Ie,defineResources:()=>ot,flattenGroupItems:()=>ge,formatResourceTooltip:()=>ye,getPermissionSummary:()=>ke,makeAuthzErrorBoundary:()=>Ce,resolveLabels:()=>ie,toPermissionView:()=>Me,ui:()=>l,usePermission:()=>fe});module.exports=He(st);var de=require("react-router");var ee=require("@aiquants/authz-core"),N=require("react-router");var Ie={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 ie(t){let o=Ie;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 Be=t=>t instanceof Response;function ae(t){if(Be(t))throw t;if(t instanceof ee.AuthzDeniedError)throw new Response(t.message,{status:403});return(0,N.data)({error:t instanceof Error?t.message:"\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F"},{status:400})}function me(t){let o=t.store,i=t.resourceKey??"authz_admin",s=ie(t.labels),n=async(c,u)=>{let{userId:d}=await t.requirePermission(c,u);if(d==null)throw new ee.AuthzDeniedError({appKey:"",resourceKey:u.resourceKey,action:u.action,reason:"unresolved-user",userId:null});return{userId:d}};async function g(c){await t.requireUser(c);try{return await n(c,{resourceKey:i,action:"read"})}catch(u){throw u instanceof ee.AuthzDeniedError?new Response(`Forbidden: ${i}`,{status:403}):u}}let f=c=>t.getMyPermissions(c,{resourceKeys:[i]}),a=async c=>{let[u,d]=await Promise.all([o.listRoles(),o.getSelfAdminContext(Number(c))]);return{roles:u,selfAdminRoleIds:d.selfAdminRoleIds,labels:s}},v=async()=>({resources:await o.listResources(),labels:s}),S=async()=>{let[c,u,d]=await Promise.all([o.listGrants(),o.listRoles(),o.listResources()]);return{grants:c,roles:u,resources:d,labels:s}},w=async c=>{let[u,d,x,I]=await Promise.all([o.listUserRoles(),o.listRoles(),o.listUsers(),o.getSelfAdminContext(Number(c))]);return{assignments:u,roles:d,users:x,actorUserId:I.actorUserId,selfAdminRoleIds:I.selfAdminRoleIds,labels:s}},A=async()=>{let[c,u,d]=await Promise.all([o.listGroupRoles(),o.listRoles(),o.listGroups()]);return{groupRoles:c,roles:u,groups:d,labels:s}},K=async()=>{let[c,u,d,x,I,k,G]=await Promise.all([o.listUsers(),o.listRoles(),o.listResources(),o.listGrants(),o.listUserRoles(),o.listGroupRoles(),o.listGroups()]);return{users:c,roles:u,resources:d,grants:x,assignments:I,groupRoles:k,groups:G,labels:s}};return{labels:s,resourceKey:i,layoutGuard:g,loadMyPermissions:f,layout:{async loader({request:c}){return await g(c),{myPermissions:await f(c),labels:s,adminResourceKey:i}}},index:{loader(){throw(0,N.redirect)("/authz/roles")}},roles:{data:a,async loader({request:c}){let{userId:u}=await n(c,{resourceKey:i,action:"read"});return a(u)},async action({request:c}){let u=await c.formData(),d=String(u.get("_action"));try{switch(d){case"create":{let{userId:x}=await n(c,{resourceKey:i,action:"create"}),I=String(u.get("roleKey")??"").trim(),k=String(u.get("name")??"").trim();return I&&k?(await o.createRole({roleKey:I,name:k,description:String(u.get("description")??"").trim()||null},String(x)),{ok:!0}):(0,N.data)({error:"role_key \u3068 name \u306F\u5FC5\u9808\u3067\u3059"},{status:400})}case"save":{let{userId:x}=await n(c,{resourceKey:i,action:"update"}),I=String(u.get("roleKey")??"").trim(),k=String(u.get("name")??"").trim();return I&&k?(await o.updateRole(Number(u.get("id")),{roleKey:I,name:k,description:String(u.get("description")??"").trim()||null},String(x)),{ok:!0}):(0,N.data)({error:"roleKey \u3068 name \u306F\u5FC5\u9808\u3067\u3059"},{status:400})}case"toggle":{let{userId:x}=await n(c,{resourceKey:i,action:"update"});return await o.setRoleActive(Number(u.get("id")),u.get("isActive")==="true",String(x)),{ok:!0}}case"delete":return await n(c,{resourceKey:i,action:"delete"}),await o.deleteRole(Number(u.get("id"))),{ok:!0};default:return(0,N.data)({error:"unknown action"},{status:400})}}catch(x){return ae(x)}}},resources:{data:v,async loader({request:c}){return await n(c,{resourceKey:i,action:"read"}),v()},async action({request:c}){let u=await c.formData(),d=String(u.get("_action"));try{switch(d){case"create":{let{userId:x}=await n(c,{resourceKey:i,action:"create"}),I=String(u.get("appKey")??"").trim(),k=String(u.get("resourceKey")??"").trim(),G=String(u.get("name")??"").trim();return I&&k&&G?(await o.createResource({appKey:I,resourceKey:k,name:G,description:String(u.get("description")??"").trim()||null},String(x)),{ok:!0}):(0,N.data)({error:"app_key / resource_key / name \u306F\u5FC5\u9808\u3067\u3059"},{status:400})}case"save":{let{userId:x}=await n(c,{resourceKey:i,action:"update"}),I=String(u.get("name")??"").trim();return I?(await o.updateResource(Number(u.get("id")),{name:I,description:String(u.get("description")??"").trim()||null},String(x)),{ok:!0}):(0,N.data)({error:"name \u306F\u5FC5\u9808\u3067\u3059"},{status:400})}case"delete":return await n(c,{resourceKey:i,action:"delete"}),await o.deleteResource(Number(u.get("id"))),{ok:!0};default:return(0,N.data)({error:"unknown action"},{status:400})}}catch(x){return ae(x)}}},grants:{data:S,async loader({request:c}){return await n(c,{resourceKey:i,action:"read"}),S()},async action({request:c}){let u=await c.formData(),d=String(u.get("_action"));try{switch(d){case"create":{let{userId:x}=await n(c,{resourceKey:i,action:"create"}),I=Number(u.get("roleId")),k=Number(u.get("resourceId"));if(!(I&&k))return(0,N.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(!ee.AUTHZ_ACTIONS.includes(G))return(0,N.data)({error:"\u7121\u52B9\u306A action \u3067\u3059"},{status:400});let se=G;return await o.createGrant({roleId:I,resourceId:k,action:se,rowScope:String(u.get("rowScope")??""),columnScope:String(u.get("columnScope")??"")},String(x)),{ok:!0}}case"save":{let{userId:x}=await n(c,{resourceKey:i,action:"update"}),I=String(u.get("action")??"");if(!ee.AUTHZ_ACTIONS.includes(I))return(0,N.data)({error:"\u7121\u52B9\u306A action \u3067\u3059"},{status:400});let k=I;return await o.updateGrant(Number(u.get("id")),{action:k,rowScope:String(u.get("rowScope")??""),columnScope:String(u.get("columnScope")??"")},String(x)),{ok:!0}}case"delete":return await n(c,{resourceKey:i,action:"delete"}),await o.deleteGrant(Number(u.get("id"))),{ok:!0};default:return(0,N.data)({error:"unknown action"},{status:400})}}catch(x){return ae(x)}}},userRoles:{data:w,async loader({request:c}){let{userId:u}=await n(c,{resourceKey:i,action:"read"});return w(u)},async action({request:c}){let u=await c.formData(),d=String(u.get("_action"));try{switch(d){case"assign":{let{userId:x}=await n(c,{resourceKey:i,action:"create"}),I=Number(u.get("userId")),k=Number(u.get("roleId"));return I&&k?(await o.assignUserRole(I,k,String(x)),{ok:!0}):(0,N.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(c,{resourceKey:i,action:"delete"}),await o.removeUserRole(Number(u.get("userId")),Number(u.get("roleId"))),{ok:!0};default:return(0,N.data)({error:"unknown action"},{status:400})}}catch(x){return ae(x)}}},groupRoles:{data:A,async loader({request:c}){return await n(c,{resourceKey:i,action:"read"}),A()},async action({request:c}){let u=await c.formData(),d=String(u.get("_action"));try{switch(d){case"assign":{let{userId:x}=await n(c,{resourceKey:i,action:"create"}),I=Number(u.get("groupId")),k=Number(u.get("roleId"));return I&&k?(await o.assignGroupRole(I,k,String(x)),{ok:!0}):(0,N.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(c,{resourceKey:i,action:"delete"}),await o.removeGroupRole(Number(u.get("groupId")),Number(u.get("roleId"))),{ok:!0};default:return(0,N.data)({error:"unknown action"},{status:400})}}catch(x){return ae(x)}}},graph:{data:K,async loader({request:c}){return await n(c,{resourceKey:i,action:"read"}),K()}}}}function ze(t){return String(t["*"]??"").split("/")[0]}function Ve(t){let o=me(t),i=t.basePath??"/authz",s=["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},g={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 f(v){let S=ze(v.params);if(!s.includes(S))throw(0,de.redirect)(`${i}/roles`);let{userId:w}=await o.layoutGuard(v.request),[A,K]=await Promise.all([o.loadMyPermissions(v.request),n[S](w)]);return{segment:S,basePath:i,myPermissions:A,adminResourceKey:o.resourceKey,...K}}async function a(v){let S=ze(v.params),w=g[S];return w?w(v):(0,de.data)({error:"unknown action"},{status:400})}return{loader:f,action:a,server:o}}var oe=require("react/jsx-runtime"),l={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:i}){return(0,oe.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"0.3rem"},children:[(0,oe.jsxs)("span",{style:{fontSize:"0.8rem",color:"#475569",fontWeight:600},children:[t,o?(0,oe.jsxs)("span",{style:{fontWeight:400,color:"#94a3b8"},children:[" \u2014 ",o]}):null]}),i]})}function te({message:t}){return t?(0,oe.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 ve=require("@aiquants/authz-core"),q=require("@aiquants/select-box"),E=require("react"),P=require("react-router");var ne=require("react");function fe(t){let o=t?.read?t.readPartial?"partial":"full":"none",i=t?.create&&t?.update?"full":t?.create||t?.update?"partial":"none",s=t?.delete?"full":"none";return{canRead:!!t?.read,canWrite:!!t?.write,canDelete:!!t?.delete,readState:o,writeState:i,deleteState:s}}var M=require("react/jsx-runtime"),qe={full:{bg:"#ecfdf5",text:"#047857",border:"#a7f3d0"},partial:{bg:"#fffbeb",text:"#b45309",border:"#fde68a"},none:{bg:"#f8fafc",text:"#94a3b8",border:"#cbd5e1"}};function ye(t,o){let i=t?.trim(),s=o?.trim();if(s&&i&&s!==i)return`\u5BFE\u8C61\u30EA\u30BD\u30FC\u30B9: ${s} (${i})`;if(s||i)return`\u5BFE\u8C61\u30EA\u30BD\u30FC\u30B9: ${s||i}`}function Ye({state:t}){return t==="full"?(0,M.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,M.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 13l4 4L19 7"})}):t==="partial"?(0,M.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,M.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,M.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,M.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 ue({permission:t,resourceName:o,expectedResourceKey:i,showResourceTooltip:s=!0,labels:n,showScopeSummary:g=!0,className:f="authz-permission-indicator"}){let a=fe(t),v={read:n?.read??"\u95B2\u89A7",write:n?.write??"\u7DE8\u96C6",delete:n?.delete??"\u524A\u9664"},S=t?.resourceKey,w=o||S,A=s?ye(S,o):void 0,K=!!(i&&S&&S!==i);K&&typeof console<"u"&&typeof console.error=="function"&&console.error(`[Authz Warning] Resource key mismatch in MyPermissionIndicator! Expected: "${i}", but received permission for: "${S}".`);let c=(u,d,x)=>{let I=qe[d],k=A?`${x}: ${d}
|
|
2
|
-
${A}`:`${x}: ${d}`;return(0,M.jsxs)("span",{"data-perm":u,"data-state":d,title:k,style:{display:"inline-flex",alignItems:"center",gap:"0.25rem",padding:"0.2rem 0.5rem",borderRadius:"100px",fontSize:"0.75rem",fontWeight:600,backgroundColor:I.bg,color:I.text,border:`1px solid ${I.border}`,lineHeight:1,userSelect:"none"},children:[(0,M.jsx)(Ye,{state:d}),(0,M.jsx)("span",{children:x})]})};return(0,M.jsxs)("span",{className:f,title:A,"data-resource":S??"","data-resource-name":w??"","data-mismatch":K?"true":void 0,style:{display:"inline-flex",gap:"0.35rem",alignItems:"center",verticalAlign:"middle"},children:[c("read",a.readState,v.read),c("write",a.writeState,v.write),c("delete",a.deleteState,v.delete),g&&a.readState==="partial"?(0,M.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,K?(0,M.jsxs)("span",{"data-testid":"resource-mismatch-warning",title:`expected: "${i}", actual: "${S}"`,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 (",S," \u2260 ",i,")"]}):null]})}function Xe({permission:t,resourceName:o,expectedResourceKey:i,prefixLabel:s="\u3042\u306A\u305F\u306E\u6A29\u9650",showPrefixLabel:n=!0,showResourceTooltip:g=!0,labels:f,showScopeSummary:a=!0,className:v="authz-permission-status",style:S}){let w=t?.resourceKey,A=o||w,K=g?ye(w,o):void 0;return(0,M.jsxs)("span",{className:v,title:K,"data-testid":"my-permission-status","data-resource":w??"","data-resource-name":A??"",style:{fontSize:"0.82rem",color:"#475569",display:"inline-flex",alignItems:"center",gap:"0.4rem",...S},children:[n&&(0,M.jsxs)("span",{"data-testid":"prefix-label",children:[s,":"]}),(0,M.jsx)(ue,{permission:t,resourceName:o,expectedResourceKey:i,showResourceTooltip:g,labels:f,showScopeSummary:a})]})}var $=require("react/jsx-runtime");function ge(t,o=0){let i=[];for(let s of t){let n=s.level??o;i.push({...s,level:n}),s.children&&s.children.length>0&&i.push(...ge(s.children,n+1))}return i}var Pe={"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 ke(t,o){let i=o?.noPermission??"\u6A29\u9650\u306A\u3057",s=o?.fullWrite??"\u7DE8\u96C6\u53EF",n=o?.partialRead??"\u4E00\u90E8\u95B2\u89A7",g=o?.readOnly??"\u95B2\u89A7\u306E\u307F";return t&&(t.read||t.write||t.delete)?t.write?{text:s,color:"#047857",bgColor:"#ecfdf5",borderColor:"#a7f3d0"}:t.read?t.readPartial?{text:n,color:"#b45309",bgColor:"#fffbeb",borderColor:"#fde68a"}:{text:g,color:"#1d4ed8",bgColor:"#eff6ff",borderColor:"#bfdbfe"}:{text:i,color:"#64748b",bgColor:"#f1f5f9",borderColor:"#cbd5e1"}:{text:i,color:"#64748b",bgColor:"#f1f5f9",borderColor:"#cbd5e1"}}function je({item:t,size:o="md",labels:i}){let s=ke(t.permission,i),n=t.permission?.resourceKey||t.resourceKey||t.expectedResourceKey,g=t.resourceName||n,f=!!(t.expectedResourceKey&&t.permission?.resourceKey&&t.permission.resourceKey!==t.expectedResourceKey),a=Pe[o],v=`\u5BFE\u8C61: ${g}${n?` (${n})`:""}${t.permission?` | ${i?.read??"\u95B2\u89A7"}:${t.permission.read?"\u25CB":"\xD7"} ${i?.write??"\u7DE8\u96C6"}:${t.permission.write?"\u25CB":"\xD7"} ${i?.delete??"\u524A\u9664"}:${t.permission.delete?"\u25CB":"\xD7"}`:""}`;return(0,$.jsxs)("span",{title:v,"data-testid":`permission-pill-${t.resourceName}`,"data-mismatch":f?"true":"false",style:{display:"inline-flex",alignItems:"center",gap:a.pillGap,fontSize:a.fontSize,padding:a.pillPadding,borderRadius:"9999px",backgroundColor:f?"#fee2e2":s.bgColor,color:f?"#991b1b":s.color,border:`1px solid ${f?"#fca5a5":s.borderColor}`,fontWeight:600,lineHeight:"1.2"},children:[(0,$.jsxs)("span",{children:[g,":"]}),(0,$.jsx)("span",{children:s.text}),f&&(0,$.jsx)("span",{title:`expected "${t.expectedResourceKey}", actual "${t.permission?.resourceKey}"`,children:"\u26A0\uFE0F"})]})}function he({items:t,prefixLabel:o="\u3042\u306A\u305F\u306E\u6A29\u9650",variant:i="pills",size:s="md",labels:n,className:g="authz-permission-group-status",style:f}){let[a,v]=(0,ne.useState)(!1),S=(0,ne.useRef)(null),w=Pe[s];if((0,ne.useEffect)(()=>{if(i!=="popover"||!a)return;function A(c){S.current&&!S.current.contains(c.target)&&v(!1)}function K(c){c.key==="Escape"&&v(!1)}return document.addEventListener("mousedown",A),document.addEventListener("keydown",K),()=>{document.removeEventListener("mousedown",A),document.removeEventListener("keydown",K)}},[i,a]),i==="popover"){let A=t.filter(u=>u.permission?.write).length,K=t.length,c=A===K?n?.fullWrite??"\u7DE8\u96C6\u53EF":A>0?n?.partialWrite??"\u4E00\u90E8\u7DE8\u96C6\u53EF":n?.readOnly??"\u95B2\u89A7\u306E\u307F";return(0,$.jsxs)("span",{ref:S,className:g,"data-testid":"my-permission-group-popover",style:{position:"relative",display:"inline-block",...f},children:[(0,$.jsxs)("button",{type:"button",onClick:()=>v(!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,$.jsxs)("span",{children:["\u{1F512} ",o]}),(0,$.jsxs)("span",{style:{fontSize:w.badgeFontSize,color:"#64748b"},children:["(",c,")"]}),(0,$.jsx)("span",{style:{fontSize:"0.65rem",marginLeft:"0.1rem"},children:a?"\u25B2":"\u25BE"})]}),a&&(0,$.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,$.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,$.jsxs)("span",{children:["\u{1F512} ",o]}),(0,$.jsx)("button",{type:"button",onClick:()=>v(!1),style:{border:"none",background:"none",cursor:"pointer",color:"#94a3b8",fontSize:"0.85rem",padding:"0 0.2rem"},children:"\u2715"})]}),(0,$.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:"0.4rem"},children:ge(t).map(u=>{let d=u.level??0,x=d>0;return(0,$.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"1.25rem",whiteSpace:"nowrap",paddingLeft:x?`${d*.85}rem`:"0"},children:[(0,$.jsxs)("div",{style:{display:"inline-flex",alignItems:"center",whiteSpace:"nowrap"},children:[x&&(0,$.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,$.jsxs)("span",{style:{fontWeight:x?500:600,color:x?"#64748b":"#1e293b",fontSize:x?"0.78rem":"0.82rem",whiteSpace:"nowrap"},children:[u.resourceName,":"]})]}),(0,$.jsx)(ue,{permission:u.permission,resourceName:u.resourceName,expectedResourceKey:u.expectedResourceKey,labels:n})]},u.resourceName)})})]})]})}return(0,$.jsxs)("span",{className:g,"data-testid":"my-permission-group-pills",style:{display:"inline-flex",alignItems:"center",flexWrap:"wrap",gap:w.pillGap,fontSize:w.fontSize,color:"#475569",...f},children:[o&&(0,$.jsxs)("span",{style:{fontWeight:600,color:"#334155"},children:[o,":"]}),(0,$.jsx)("span",{style:{display:"inline-flex",alignItems:"center",flexWrap:"wrap",gap:w.pillGap},children:t.map(A=>(0,$.jsx)(je,{item:A,size:s,labels:n},A.resourceName))})]})}var e=require("react/jsx-runtime"),le=t=>t?.error;function Ke({children:t,renderHeader:o}){let{myPermissions:i,labels:s,adminResourceKey:n,basePath:g}=(0,P.useLoaderData)(),f=g??"/authz",[a,v]=(0,E.useState)("pills"),S=[["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]],w=Object.entries(i||{}).map(([c,u])=>({resourceKey:c,resourceName:u?.resourceKey||c,permission:u,expectedResourceKey:c})),A=w.length>0?w:[{resourceKey:n,resourceName:n,permission:i?.[n],expectedResourceKey:n}],K=(0,e.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"0.4rem"},children:[(0,e.jsx)(he,{prefixLabel:s.myPermission,items:A,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:()=>v("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:()=>v("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:l.page,children:[o?o({title:s.title,annotation:K}):(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}),K]}),(0,e.jsx)("nav",{style:{display:"flex",gap:"0.25rem",borderBottom:"1px solid #e2e8f0",margin:"0.6rem 0 1rem"},children:S.map(([c,u])=>(0,e.jsx)(P.NavLink,{to:`${f}/${c}`,style:({isActive:d})=>({padding:"0.5rem 0.9rem",textDecoration:"none",color:d?"#2563eb":"#475569",borderBottom:d?"2px solid #2563eb":"2px solid transparent",marginBottom:-1,fontWeight:d?700:500,fontSize:"0.92rem"}),children:u},c))}),t]})}function Qe({renderHeader:t}={}){return(0,e.jsx)(Ke,{renderHeader:t,children:(0,e.jsx)(P.Outlet,{})})}function Ce(t){let o=ie(t).error;return function(){let s=(0,P.useRouteError)(),n=(0,P.isRouteErrorResponse)(s)?s:null,g=n?.status===403,f=g?o.forbiddenTitle:n?`${o.genericTitlePrefix} (${n.status})`:o.genericTitle,a=g?o.forbiddenBody:n?typeof n.data=="string"&&n.data?n.data:n.statusText:o.genericBody;return(0,e.jsx)("div",{style:l.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:f}),(0,e.jsx)("p",{style:{color:"#7f1d1d",fontSize:"0.9rem",margin:0,lineHeight:1.7},children:a})]})})}}var Je=Ce(),be=(t,o)=>i=>{t&&!window.confirm(o)&&i.preventDefault()};function we(){let{roles:t,selfAdminRoleIds:o,labels:i}=(0,P.useLoaderData)(),s=i.roles,n=i.common,g=new Set(o??[]);return(0,e.jsxs)("section",{children:[(0,e.jsx)("h2",{style:l.h2,children:s.heading}),(0,e.jsx)(te,{message:le((0,P.useActionData)())}),(0,e.jsx)("p",{style:l.note,children:s.note}),(0,e.jsx)("div",{style:l.tableContainer,children:(0,e.jsxs)("table",{style:l.table,children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{style:{...l.th,width:"20%"},children:s.roleKey}),(0,e.jsx)("th",{style:{...l.th,width:"25%"},children:s.name}),(0,e.jsx)("th",{style:{...l.th,width:"35%"},children:s.description}),(0,e.jsx)("th",{style:{...l.th,width:"10%"},children:s.activeHeader}),(0,e.jsx)("th",{style:{...l.th,width:"10%"}})]})}),(0,e.jsxs)("tbody",{children:[t.map(f=>(0,e.jsxs)("tr",{children:[(0,e.jsx)("td",{style:l.td,children:f.roleKey==="@authenticated"||f.roleKey==="@anonymous"?(0,e.jsx)("span",{style:l.code,children:f.roleKey}):(0,e.jsx)("input",{name:"roleKey",defaultValue:f.roleKey,form:`save-role-${f.id}`,"aria-label":`roleKey-${f.id}`,required:!0,style:l.input})}),(0,e.jsx)("td",{style:l.td,children:(0,e.jsx)("input",{name:"name",defaultValue:f.name,form:`save-role-${f.id}`,"aria-label":`name-${f.id}`,required:!0,style:l.input})}),(0,e.jsx)("td",{style:l.td,children:(0,e.jsx)("input",{name:"description",defaultValue:f.description??"",form:`save-role-${f.id}`,"aria-label":`description-${f.id}`,style:l.input})}),(0,e.jsx)("td",{style:l.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:f.id}),(0,e.jsx)("input",{type:"hidden",name:"isActive",value:String(!f.isActive)}),(0,e.jsx)("button",{type:"submit",style:l.button,onClick:f.isActive?be(g.has(f.id),i.warn.selfRoleDisable):void 0,children:f.isActive?n.active:n.inactive})]})}),(0,e.jsxs)("td",{style:{...l.td,whiteSpace:"nowrap"},children:[(0,e.jsxs)(P.Form,{method:"post",id:`save-role-${f.id}`,style:{display:"inline"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"save"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:f.id}),(0,e.jsx)("button",{type:"submit",style:l.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:f.id}),(0,e.jsx)("button",{type:"submit",style:l.danger,onClick:be(g.has(f.id),i.warn.selfRoleDelete),children:n.delete})]})]})]},f.id)),t.length===0?(0,e.jsx)("tr",{children:(0,e.jsx)("td",{style:l.empty,colSpan:5,children:s.empty})}):null]})]})}),(0,e.jsx)("h3",{style:l.h3,children:s.newHeading}),(0,e.jsxs)(P.Form,{method:"post",style:l.card,children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"create"}),(0,e.jsx)(W,{label:s.roleKey,hint:s.hintRoleKey,children:(0,e.jsx)("input",{name:"roleKey","aria-label":"role_key",required:!0,style:l.input})}),(0,e.jsx)(W,{label:s.name,children:(0,e.jsx)("input",{name:"name","aria-label":"name",required:!0,style:l.input})}),(0,e.jsx)(W,{label:s.description,hint:n.optional,children:(0,e.jsx)("input",{name:"description","aria-label":"description",style:l.input})}),(0,e.jsx)("button",{type:"submit",style:l.primary,children:n.add})]})]})}function $e(){let{resources:t,labels:o}=(0,P.useLoaderData)(),i=o.resources,s=o.common;return(0,e.jsxs)("section",{children:[(0,e.jsx)("h2",{style:l.h2,children:i.heading}),(0,e.jsx)(te,{message:le((0,P.useActionData)())}),(0,e.jsx)("p",{style:l.note,children:i.note}),(0,e.jsx)("div",{style:l.tableContainer,children:(0,e.jsxs)("table",{style:l.table,children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{style:{...l.th,width:"15%"},children:i.appKey}),(0,e.jsx)("th",{style:{...l.th,width:"20%"},children:i.resourceKey}),(0,e.jsx)("th",{style:{...l.th,width:"25%"},children:i.name}),(0,e.jsx)("th",{style:{...l.th,width:"30%"},children:i.description}),(0,e.jsx)("th",{style:{...l.th,width:"10%"}})]})}),(0,e.jsxs)("tbody",{children:[t.map(n=>(0,e.jsxs)("tr",{children:[(0,e.jsx)("td",{style:l.td,children:(0,e.jsx)("span",{style:l.code,children:n.appKey})}),(0,e.jsx)("td",{style:l.td,children:(0,e.jsx)("span",{style:l.code,children:n.resourceKey})}),(0,e.jsx)("td",{style:l.td,children:(0,e.jsx)("input",{name:"name",defaultValue:n.name,form:`save-res-${n.id}`,"aria-label":`name-${n.id}`,required:!0,style:l.input})}),(0,e.jsx)("td",{style:l.td,children:(0,e.jsx)("input",{name:"description",defaultValue:n.description??"",form:`save-res-${n.id}`,"aria-label":`description-${n.id}`,style:l.input})}),(0,e.jsxs)("td",{style:{...l.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:l.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:n.id}),(0,e.jsx)("button",{type:"submit",style:l.danger,children:s.delete})]})]})]},n.id)),t.length===0?(0,e.jsx)("tr",{children:(0,e.jsx)("td",{style:l.empty,colSpan:5,children:i.empty})}):null]})]})}),(0,e.jsx)("h3",{style:l.h3,children:i.newHeading}),(0,e.jsxs)(P.Form,{method:"post",style:l.card,children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"create"}),(0,e.jsx)(W,{label:i.appKey,hint:i.hintAppKey,children:(0,e.jsx)("input",{name:"appKey","aria-label":"app_key",required:!0,style:l.input})}),(0,e.jsx)(W,{label:i.resourceKey,hint:i.hintResourceKey,children:(0,e.jsx)("input",{name:"resourceKey","aria-label":"resource_key",required:!0,style:l.input})}),(0,e.jsx)(W,{label:i.name,children:(0,e.jsx)("input",{name:"name","aria-label":"name",required:!0,style:l.input})}),(0,e.jsx)(W,{label:i.description,hint:s.optional,children:(0,e.jsx)("input",{name:"description","aria-label":"description",style:l.input})}),(0,e.jsx)("button",{type:"submit",style:l.primary,children:s.add})]})]})}function Ze({g:t,labels:o}){let i=o.common,[s,n]=(0,E.useState)({label:t.action,value:t.action});return(0,e.jsxs)("tr",{children:[(0,e.jsx)("td",{style:l.td,children:(0,e.jsx)("span",{style:l.code,children:t.roleKey})}),(0,e.jsx)("td",{style:l.td,children:(0,e.jsxs)("span",{style:l.code,children:[t.appKey,":",t.resourceKey]})}),(0,e.jsx)("td",{style:l.td,children:t.roleKey==="@anonymous"?(0,e.jsx)("span",{style:l.code,children:t.action}):(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("input",{type:"hidden",name:"action",value:s.value,form:`save-grant-${t.id}`}),(0,e.jsx)(q.SelectBox,{options:ve.AUTHZ_ACTIONS.map(g=>({label:g,value:g})),value:s,onChange:g=>{g&&n(g)}})]})}),(0,e.jsx)("td",{style:l.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:l.textarea})}),(0,e.jsx)("td",{style:l.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:l.textarea})}),(0,e.jsxs)("td",{style:{...l.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:l.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:t.id}),(0,e.jsx)("button",{type:"submit",style:l.danger,children:i.delete})]})]})]})}function Ge(){let{grants:t,roles:o,resources:i,labels:s}=(0,P.useLoaderData)(),n=s.grants,g=s.common,f=o.map(d=>({label:d.roleKey,value:d.id})),a=i.map(d=>({label:`${d.appKey}:${d.resourceKey}`,value:d.id})),v=ve.AUTHZ_ACTIONS.map(d=>({label:d,value:d})),[S,w]=(0,E.useState)(void 0),[A,K]=(0,E.useState)(void 0),[c,u]=(0,E.useState)({label:"read",value:"read"});return(0,e.jsxs)("section",{children:[(0,e.jsx)("h2",{style:l.h2,children:n.heading}),(0,e.jsx)("p",{style:l.note,children:n.note}),(0,e.jsx)(te,{message:le((0,P.useActionData)())}),(0,e.jsx)("div",{style:l.tableContainer,children:(0,e.jsxs)("table",{style:l.table,children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{style:{...l.th,width:"15%"},children:n.role}),(0,e.jsx)("th",{style:{...l.th,width:"20%"},children:n.resource}),(0,e.jsx)("th",{style:{...l.th,width:"15%"},children:n.action}),(0,e.jsx)("th",{style:{...l.th,width:"20%"},children:n.rowScope}),(0,e.jsx)("th",{style:{...l.th,width:"20%"},children:n.columnScope}),(0,e.jsx)("th",{style:{...l.th,width:"10%"}})]})}),(0,e.jsxs)("tbody",{children:[t.map(d=>(0,e.jsx)(Ze,{g:d,labels:s},d.id)),t.length===0?(0,e.jsx)("tr",{children:(0,e.jsx)("td",{style:l.empty,colSpan:6,children:n.empty})}):null]})]})}),(0,e.jsx)("h3",{style:l.h3,children:n.newHeading}),(0,e.jsxs)(P.Form,{method:"post",style:l.card,children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"create"}),(0,e.jsx)("input",{type:"hidden",name:"roleId",value:S?.value??""}),(0,e.jsx)("input",{type:"hidden",name:"resourceId",value:A?.value??""}),(0,e.jsx)("input",{type:"hidden",name:"action",value:c?.value??""}),(0,e.jsx)(W,{label:n.role,children:(0,e.jsx)(q.SelectBox,{options:f,value:S,onChange:d=>w(d||void 0),placeholder:n.selectPlaceholder})}),(0,e.jsx)(W,{label:n.resource,children:(0,e.jsx)(q.SelectBox,{options:a,value:A,onChange:d=>K(d||void 0),placeholder:n.selectPlaceholder})}),(0,e.jsx)(W,{label:n.action,children:(0,e.jsx)(q.SelectBox,{options:v,value:c,onChange:d=>u(d||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:l.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:l.textarea,placeholder:'{"mode":"deny","columns":["\u91D1\u984D"]}'})}),(0,e.jsx)("button",{type:"submit",style:l.primary,children:g.grant})]})]})}function Le(){let{assignments:t,roles:o,users:i,actorUserId:s,selfAdminRoleIds:n,labels:g}=(0,P.useLoaderData)(),f=g.userRoles,a=g.common,v=new Set(n??[]),S=i.map(d=>({label:`${d.email}\uFF08${d.displayName}\uFF09`,value:d.id})),w=o.filter(d=>d.roleKey!=="@authenticated"&&d.roleKey!=="@anonymous").map(d=>({label:d.roleKey,value:d.id})),[A,K]=(0,E.useState)(void 0),[c,u]=(0,E.useState)(void 0);return(0,e.jsxs)("section",{children:[(0,e.jsx)("h2",{style:l.h2,children:f.heading}),(0,e.jsx)(te,{message:le((0,P.useActionData)())}),(0,e.jsx)("p",{style:l.note,children:f.note}),(0,e.jsx)("div",{style:l.tableContainer,children:(0,e.jsxs)("table",{style:l.table,children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{style:{...l.th,width:"45%"},children:f.user}),(0,e.jsx)("th",{style:{...l.th,width:"45%"},children:f.role}),(0,e.jsx)("th",{style:{...l.th,width:"10%"}})]})}),(0,e.jsxs)("tbody",{children:[t.map(d=>(0,e.jsxs)("tr",{children:[(0,e.jsxs)("td",{style:l.td,children:[d.email,(0,e.jsxs)("span",{style:l.muted,children:["\uFF08",d.displayName,"\uFF09"]})]}),(0,e.jsx)("td",{style:l.td,children:d.roleKey}),(0,e.jsx)("td",{style:l.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:d.userId}),(0,e.jsx)("input",{type:"hidden",name:"roleId",value:d.roleId}),(0,e.jsx)("button",{type:"submit",style:l.danger,onClick:be(d.userId===s&&v.has(d.roleId),g.warn.selfAssignmentRemove),children:a.remove})]})})]},`${d.userId}-${d.roleId}`)),t.length===0?(0,e.jsx)("tr",{children:(0,e.jsx)("td",{style:l.empty,colSpan:3,children:f.empty})}):null]})]})}),(0,e.jsx)("h3",{style:l.h3,children:f.newHeading}),(0,e.jsxs)(P.Form,{method:"post",style:l.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:c?.value??""}),(0,e.jsx)(W,{label:f.user,children:(0,e.jsx)(q.SelectBox,{options:S,value:A,onChange:d=>K(d||void 0),placeholder:f.selectPlaceholder})}),(0,e.jsx)(W,{label:f.role,children:(0,e.jsx)(q.SelectBox,{options:w,value:c,onChange:d=>u(d||void 0),placeholder:f.selectPlaceholder})}),(0,e.jsx)("button",{type:"submit",style:l.primary,children:a.assign})]})]})}function De(){let{groupRoles:t,roles:o,groups:i,labels:s}=(0,P.useLoaderData)(),n=(0,P.useActionData)(),g=le(n),f=s.groupRoles,a=s.common,v=o.filter(d=>d.isActive&&d.roleKey!=="@authenticated"&&d.roleKey!=="@anonymous"),S=i.map(d=>({label:`${d.name} (${d.groupKey})`,value:d.id})),w=v.map(d=>({label:`${d.name} (${d.roleKey})`,value:d.id})),[A,K]=(0,E.useState)(S[0]),[c,u]=(0,E.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:l.h2,children:f.heading}),(0,e.jsx)("p",{style:l.note,children:f.note})]}),g&&(0,e.jsx)(te,{message:g}),(0,e.jsxs)("table",{style:l.table,children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{style:l.th,children:f.group}),(0,e.jsx)("th",{style:l.th,children:f.role}),(0,e.jsx)("th",{style:{...l.th,width:"100px"}})]})}),(0,e.jsx)("tbody",{children:t.length===0?(0,e.jsx)("tr",{children:(0,e.jsx)("td",{colSpan:3,style:{...l.td,textAlign:"center",color:"#64748b"},children:f.empty})}):t.map(d=>(0,e.jsxs)("tr",{children:[(0,e.jsxs)("td",{style:l.td,children:[(0,e.jsx)("strong",{children:d.groupName})," ",(0,e.jsxs)("span",{style:{color:"#64748b",fontSize:"0.85rem"},children:["(",d.groupKey,")"]})]}),(0,e.jsx)("td",{style:l.td,children:(0,e.jsx)("code",{children:d.roleKey})}),(0,e.jsx)("td",{style:{...l.td,textAlign:"right"},children:(0,e.jsxs)(P.Form,{method:"post",onSubmit:x=>!confirm("\u3053\u306E\u30B0\u30EB\u30FC\u30D7\u30ED\u30FC\u30EB\u5272\u5F53\u3092\u89E3\u9664\u3057\u307E\u3059\u304B\uFF1F")&&x.preventDefault(),children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"remove"}),(0,e.jsx)("input",{type:"hidden",name:"groupId",value:d.groupId}),(0,e.jsx)("input",{type:"hidden",name:"roleId",value:d.roleId}),(0,e.jsx)("button",{type:"submit",style:l.dangerBtn,children:a.remove})]})})]},`${d.groupId}-${d.roleId}`))})]}),(0,e.jsxs)(P.Form,{method:"post",style:l.card,children:[(0,e.jsx)("h3",{style:l.h3,children:f.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:c?.value??""}),(0,e.jsx)(W,{label:f.group,children:(0,e.jsx)(q.SelectBox,{options:S,value:A,onChange:d=>K(d||void 0),placeholder:f.selectPlaceholder})}),(0,e.jsx)(W,{label:f.role,children:(0,e.jsx)(q.SelectBox,{options:w,value:c,onChange:d=>u(d||void 0),placeholder:f.selectPlaceholder})}),(0,e.jsx)("button",{type:"submit",style:l.primary,children:a.assign})]})]})}var xe={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 et({users:t,roles:o,resources:i,grants:s,assignments:n,groupRoles:g=[],groups:f=[],selectedNode:a,onNodeClick:v}){let[S,w]=(0,E.useState)(null),A=new Set(n.map(r=>r.userId)),K=new Set(g.map(r=>r.groupId)),c=new Set([...n.map(r=>r.roleId),...g.map(r=>r.roleId),...s.map(r=>r.roleId)]),u=new Set(s.map(r=>r.resourceId)),d=t.filter(r=>A.has(r.id)),x=f.filter(r=>K.has(r.id)),I=o.filter(r=>c.has(r.id)),k=i.filter(r=>u.has(r.id)),G=68,se=Math.max(d.length,x.length,I.length,k.length,1),L=Math.max(se*G+40,380),X=r=>{let y=k.length*G;return(L-y)/2+G/2+r*G},B=r=>{let y=I.length*G;return(L-y)/2+G/2+r*G},j=r=>{let y=x.length*G;return(L-y)/2+G/2+r*G},Q=r=>{let y=d.length*G;return(L-y)/2+G/2+r*G},J=140,F=400,Z=660,Y=920,h=S||a,m=r=>{if(!h)return!0;if(h.type==="user")return h.id===r;if(h.type==="role")return n.some(y=>y.userId===r&&y.roleId===h.id);if(h.type==="group")return!1;if(h.type==="resource"){let y=s.filter(p=>p.resourceId===h.id).map(p=>p.roleId);return n.some(p=>p.userId===r&&y.includes(p.roleId))}return!0},R=r=>{if(!h)return!0;if(h.type==="group")return h.id===r;if(h.type==="role")return g.some(y=>y.groupId===r&&y.roleId===h.id);if(h.type==="user")return!1;if(h.type==="resource"){let y=s.filter(p=>p.resourceId===h.id).map(p=>p.roleId);return g.some(p=>p.groupId===r&&y.includes(p.roleId))}return!0},z=r=>h?h.type==="role"?h.id===r:h.type==="user"?n.some(y=>y.userId===h.id&&y.roleId===r):h.type==="group"?g.some(y=>y.groupId===h.id&&y.roleId===r):h.type==="resource"?s.some(y=>y.resourceId===h.id&&y.roleId===r):!0:!0,T=r=>{if(!h)return!0;if(h.type==="resource")return h.id===r;if(h.type==="role")return s.some(y=>y.roleId===h.id&&y.resourceId===r);if(h.type==="group"){let y=g.filter(p=>p.groupId===h.id).map(p=>p.roleId);return s.some(p=>y.includes(p.roleId)&&p.resourceId===r)}if(h.type==="user"){let y=n.filter(p=>p.userId===h.id).map(p=>p.roleId);return s.some(p=>y.includes(p.roleId)&&p.resourceId===r)}return!0},C=(r,y)=>h?h.type==="user"?h.id===r&&n.some(p=>p.userId===r&&p.roleId===y):h.type==="role"?h.id===y&&n.some(p=>p.userId===r&&p.roleId===y):h.type==="resource"?s.filter(b=>b.resourceId===h.id).map(b=>b.roleId).includes(y)&&n.some(b=>b.userId===r&&b.roleId===y):h.type!=="group":!0,V=(r,y)=>h?h.type==="group"?h.id===r&&g.some(p=>p.groupId===r&&p.roleId===y):h.type==="role"?h.id===y&&g.some(p=>p.groupId===r&&p.roleId===y):h.type==="resource"?s.filter(b=>b.resourceId===h.id).map(b=>b.roleId).includes(y)&&g.some(b=>b.groupId===r&&b.roleId===y):h.type!=="user":!0,O=(r,y)=>h?h.type==="role"?h.id===r&&s.some(p=>p.roleId===r&&p.resourceId===y):h.type==="resource"?h.id===y&&s.some(p=>p.roleId===r&&p.resourceId===y):h.type==="group"?g.filter(b=>b.groupId===h.id).map(b=>b.roleId).includes(r)&&s.some(b=>b.roleId===r&&b.resourceId===y):h.type==="user"?n.filter(b=>b.userId===h.id).map(b=>b.roleId).includes(r)&&s.some(b=>b.roleId===r&&b.resourceId===y):!0:!0,Re=[];n.forEach(r=>{let y=d.findIndex(b=>b.id===r.userId),p=I.findIndex(b=>b.id===r.roleId);if(y!==-1&&p!==-1){let b=n.filter(_=>_.roleId===r.roleId),D=b.findIndex(_=>_.userId===r.userId&&_.roleId===r.roleId),U=b.length,H=U>1?(D-(U-1)/2)*6:0;Re.push({uIdx:y,rIdx:p,active:C(r.userId,r.roleId),key:`ur-${r.userId}-${r.roleId}`,offset:H})}});let Se=[];g.forEach(r=>{let y=x.findIndex(b=>b.id===r.groupId),p=I.findIndex(b=>b.id===r.roleId);if(y!==-1&&p!==-1){let b=g.filter(_=>_.roleId===r.roleId),D=b.findIndex(_=>_.groupId===r.groupId&&_.roleId===r.roleId),U=b.length,H=U>1?(D-(U-1)/2)*6:0;Se.push({gIdx:y,rIdx:p,active:V(r.groupId,r.roleId),key:`gr-${r.groupId}-${r.roleId}`,offset:H})}});let Ae=[];return s.forEach(r=>{let y=I.findIndex(b=>b.id===r.roleId),p=k.findIndex(b=>b.id===r.resourceId);if(y!==-1&&p!==-1){let b=s.filter(pe=>pe.resourceId===r.resourceId),D=b.findIndex(pe=>pe.id===r.id),U=b.length,H=U>1?(D-(U-1)/2)*8:0,_=xe[r.action],_e=_?_.text:"#6366f1";Ae.push({rIdx:y,resIdx:p,active:O(r.roleId,r.resourceId),key:`rr-grant-${r.id}`,action:r.action,color:_e,offset:H})}}),(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:"1080px",height:`${L}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"}),Ae.map(r=>{let y=X(r.resIdx)+r.offset,p=B(r.rIdx),b=J+130,D=F-130;return(0,e.jsx)("path",{d:`M ${J+80} ${y} C ${b} ${y}, ${D} ${p}, ${F-80} ${p}`,fill:"none",stroke:r.active?r.color:"#cbd5e1",strokeWidth:r.active&&h?3:2,strokeOpacity:r.active?h?1:.75:.1,style:{transition:"all 0.2s ease"}},r.key)}),Se.map(r=>{let y=B(r.rIdx)+r.offset,p=j(r.gIdx),b=F+130,D=Z-130;return(0,e.jsx)("path",{"data-testid":`topo-link-group-role-${r.key}`,"data-active":r.active?"true":"false",d:`M ${F+80} ${y} C ${b} ${y}, ${D} ${p}, ${Z-80} ${p}`,fill:"none",stroke:r.active?"#8b5cf6":"#cbd5e1",strokeWidth:r.active&&h?3:2,strokeDasharray:"4 2",strokeOpacity:r.active?h?1:.75:.1,style:{transition:"all 0.2s ease"}},r.key)}),Re.map(r=>{let y=B(r.rIdx)+r.offset,p=Q(r.uIdx),b=F+130,D=Y-130;return(0,e.jsx)("path",{"data-testid":`topo-link-user-role-${r.key}`,"data-active":r.active?"true":"false",d:`M ${F+80} ${y} C ${b} ${y}, ${D} ${p}, ${Y-80} ${p}`,fill:"none",stroke:r.active?"#4f46e5":"#cbd5e1",strokeWidth:r.active&&h?3:2,strokeOpacity:r.active?h?1:.75:.1,style:{transition:"all 0.2s ease"}},r.key)})]}),(0,e.jsxs)("div",{style:{position:"relative",zIndex:2,width:"100%",height:"100%"},children:[k.map((r,y)=>{let p=a?.type==="resource"&&a.id===r.id,b=T(r.id),D=X(y),U=s.filter(H=>H.resourceId===r.id);return(0,e.jsxs)("button",{type:"button",onClick:()=>v("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":p,style:{position:"absolute",left:`${J-80}px`,top:`${D-24}px`,width:"160px",minHeight:"48px",borderRadius:"8px",border:p?"2px solid #10b981":"1px solid #a7f3d0",backgroundColor:p?"#d1fae5":b?"#ffffff":"#f8fafc",opacity:b?1:.35,cursor:"pointer",display:"flex",alignItems:"center",padding:"6px 10px",gap:"8px",boxShadow:p?"0 4px 12px rgba(16, 185, 129, 0.2)":"0 1px 3px rgba(0,0,0,0.05)",transition:"all 0.15s ease",textAlign:"left"},children:[(0,e.jsx)("span",{style:{fontSize:"1.1rem"},children:"\u{1F511}"}),(0,e.jsxs)("div",{style:{flex:1,minWidth:0},children:[(0,e.jsx)("div",{style:{fontWeight:600,fontSize:"0.78rem",color:"#047857",textOverflow:"ellipsis",overflow:"hidden",whiteSpace:"nowrap"},children:r.name}),(0,e.jsxs)("div",{style:{display:"flex",flexWrap:"wrap",gap:"2px",marginTop:"3px"},children:[U.map(H=>{let _=xe[H.action]??{bg:"#ecfdf5",text:"#047857",border:"#a7f3d0"};return(0,e.jsx)("span",{style:{fontSize:"0.62rem",padding:"1px 4px",borderRadius:"3px",backgroundColor:_.bg,color:_.text,border:`1px solid ${_.border}`,fontWeight:600},children:H.action},H.id)}),U.length===0&&(0,e.jsx)("span",{style:{fontSize:"0.62rem",color:"#94a3b8"},children:"\u6A29\u9650\u306A\u3057"})]})]})]},r.id)}),I.map((r,y)=>{let p=a?.type==="role"&&a.id===r.id,b=z(r.id),D=B(y);return(0,e.jsxs)("button",{type:"button",onClick:()=>v("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":p,style:{position:"absolute",left:`${F-80}px`,top:`${D-24}px`,width:"160px",height:"48px",borderRadius:"8px",border:p?"2px solid #6366f1":"1px solid #c7d2fe",backgroundColor:p?"#e0e7ff":b?"#ffffff":"#f8fafc",opacity:b?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"},children:[(0,e.jsx)("span",{style:{fontSize:"1.1rem"},children:"\u{1F6E1}\uFE0F"}),(0,e.jsxs)("div",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",flex:1},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)}),x.map((r,y)=>{let p=a?.type==="group"&&a.id===r.id,b=R(r.id),D=j(y);return(0,e.jsxs)("button",{type:"button",onClick:()=>v("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":p,style:{position:"absolute",left:`${Z-80}px`,top:`${D-24}px`,width:"160px",height:"48px",borderRadius:"8px",border:p?"2px solid #8b5cf6":"1px solid #ddd6fe",backgroundColor:p?"#f3e8ff":b?"#ffffff":"#f8fafc",opacity:b?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"},children:[(0,e.jsx)("span",{style:{fontSize:"1.1rem"},children:"\u{1F465}"}),(0,e.jsxs)("div",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",flex:1},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)}),d.map((r,y)=>{let p=a?.type==="user"&&a.id===r.id,b=m(r.id),D=Q(y);return(0,e.jsxs)("button",{type:"button",onClick:()=>v("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":p,style:{position:"absolute",left:`${Y-80}px`,top:`${D-24}px`,width:"160px",height:"48px",borderRadius:"8px",border:p?"2px solid #0284c7":"1px solid #bae6fd",backgroundColor:p?"#e0f2fe":b?"#ffffff":"#f8fafc",opacity:b?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"},children:[(0,e.jsx)("span",{style:{fontSize:"1.1rem"},children:"\u{1F464}"}),(0,e.jsxs)("div",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",flex:1},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 Ne(){let{users:t,roles:o,resources:i,grants:s,assignments:n,groupRoles:g=[],groups:f=[]}=(0,P.useLoaderData)(),[a,v]=(0,E.useState)(null),[S,w]=(0,E.useState)(""),[A,K]=(0,E.useState)("topology"),c=new Map(o.map(m=>[m.id,m])),u=new Map(i.map(m=>[m.id,m])),d=new Map(f.map(m=>[m.id,m])),x=new Map(t.map(m=>[m.id,m])),I=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=s.filter(z=>z.resourceId===a.id).map(z=>z.roleId);return n.some(z=>z.userId===m&&R.includes(z.roleId))}return!0},k=m=>{if(!a)return!0;if(a.type==="group")return a.id===m;if(a.type==="role")return g.some(R=>R.groupId===m&&R.roleId===a.id);if(a.type==="user")return!1;if(a.type==="resource"){let R=s.filter(z=>z.resourceId===a.id).map(z=>z.roleId);return g.some(z=>z.groupId===m&&R.includes(z.roleId))}return!0},G=m=>a?a.type==="role"?a.id===m:a.type==="user"?n.some(R=>R.userId===a.id&&R.roleId===m):a.type==="group"?g.some(R=>R.groupId===a.id&&R.roleId===m):a.type==="resource"?s.some(R=>R.resourceId===a.id&&R.roleId===m):!0:!0,se=m=>{if(!a)return!0;if(a.type==="resource")return a.id===m;if(a.type==="role")return s.some(R=>R.roleId===a.id&&R.resourceId===m);if(a.type==="group"){let R=g.filter(z=>z.groupId===a.id).map(z=>z.roleId);return s.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 s.some(z=>R.includes(z.roleId)&&z.resourceId===m)}return!0},L=S.trim().toLowerCase(),X=t.filter(m=>!L||m.displayName.toLowerCase().includes(L)||m.email?.toLowerCase().includes(L)),B=f.filter(m=>!L||m.name.toLowerCase().includes(L)||m.groupKey.toLowerCase().includes(L)),j=o.filter(m=>!L||m.name.toLowerCase().includes(L)||m.roleKey.toLowerCase().includes(L)),Q=i.filter(m=>!L||m.name.toLowerCase().includes(L)||m.resourceKey.toLowerCase().includes(L)||m.appKey.toLowerCase().includes(L)),J=a?.type==="user"?x.get(a.id):null,F=a?.type==="group"?d.get(a.id):null,Z=a?.type==="role"?c.get(a.id):null,Y=a?.type==="resource"?u.get(a.id):null,h=(m,R)=>{a&&a.type===m&&a.id===R?v(null):v({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:()=>K("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:()=>K("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: ",f.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: ",i.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:S,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:[J&&`\u30E6\u30FC\u30B6\u30FC\u300C${J.displayName} (${J.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`,Z&&`\u30ED\u30FC\u30EB\u300C${Z.name} (${Z.roleKey})\u300D\u306B\u95A2\u9023\u3059\u308B\u30D1\u30B9\u3092\u8868\u793A\u4E2D`,Y&&`\u30EA\u30BD\u30FC\u30B9\u300C${Y.name} (${Y.appKey}:${Y.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:()=>v(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)(et,{users:X,roles:j,resources:Q,grants:s,assignments:n,groupRoles:g,groups:B,selectedNode:a,onNodeClick:h}):(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 (",Q.length,")"]}),(0,e.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"0.5rem",maxHeight:"480px",overflowY:"auto",paddingRight:"4px"},children:[Q.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"}),Q.map(m=>{let R=a?.type==="resource"&&a.id===m.id,z=se(m.id),T=s.filter(C=>C.resourceId===m.id);return(0,e.jsxs)("button",{type:"button",onClick:()=>h("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:[T.map(C=>{let V=c.get(C.roleId),O=xe[C.action]??{bg:"#f1f5f9",text:"#475569",border:"#cbd5e1"};return(0,e.jsxs)("span",{style:{fontSize:"0.68rem",padding:"1px 6px",borderRadius:"4px",backgroundColor:O.bg,color:O.text,border:`1px solid ${O.border}`},children:[V?.roleKey??`Role#${C.roleId}`,": ",(0,e.jsx)("strong",{children:C.action})]},C.id)}),T.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 (",j.length,")"]}),(0,e.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"0.5rem",maxHeight:"480px",overflowY:"auto",paddingRight:"4px"},children:[j.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"}),j.map(m=>{let R=a?.type==="role"&&a.id===m.id,z=G(m.id),T=s.filter(O=>O.roleId===m.id),C=n.filter(O=>O.roleId===m.id),V=g.filter(O=>O.roleId===m.id);return(0,e.jsxs)("button",{type:"button",onClick:()=>h("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: ",T.length]}),(0,e.jsxs)("span",{children:["\u30B0\u30EB\u30FC\u30D7: ",V.length]}),(0,e.jsxs)("span",{children:["\u30E6\u30FC\u30B6\u30FC: ",C.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 (",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\u30B0\u30EB\u30FC\u30D7\u304C\u3042\u308A\u307E\u305B\u3093"}),B.map(m=>{let R=a?.type==="group"&&a.id===m.id,z=k(m.id),T=g.filter(C=>C.groupId===m.id);return(0,e.jsxs)("button",{type:"button",onClick:()=>h("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:[T.map(C=>{let V=c.get(C.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 ",V?.name??C.roleKey]},`${C.groupId}-${C.roleId}`)}),T.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 (",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\u30E6\u30FC\u30B6\u30FC\u304C\u3042\u308A\u307E\u305B\u3093"}),X.map(m=>{let R=a?.type==="user"&&a.id===m.id,z=I(m.id),T=n.filter(C=>C.userId===m.id);return(0,e.jsxs)("button",{type:"button",onClick:()=>h("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:[T.map(C=>{let V=c.get(C.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 ",V?.name??C.roleKey]},`${C.userId}-${C.roleId}`)}),T.length===0&&(0,e.jsx)("span",{style:{fontSize:"0.68rem",color:"#94a3b8"},children:"\u76F4\u63A5\u30ED\u30FC\u30EB\u306A\u3057"})]})]},m.id)})]})]})]})]})}var tt={roles:we,resources:$e,role_permissions:Ge,user_roles:Le,group_roles:De,graph:Ne};function rt({renderHeader:t}={}){let{segment:o}=(0,P.useLoaderData)(),i=tt[o]??we;return(0,e.jsx)(Ke,{renderHeader:t,children:(0,e.jsx)(i,{})})}function ot(t){let o={};for(let i of Object.keys(t)){let s=t[i];o[i]={key:s.key??i,name:s.name,description:s.description}}return o}var re=require("@aiquants/authz-core"),We=require("react-router");function Me(t,o){let i=(0,re.can)(o,"read"),s=(0,re.can)(o,"create"),n=(0,re.can)(o,"update"),g=(0,re.can)(o,"delete"),f=o?.scopeByAction.read,a=i&&!!f&&(f.rowScope!==null||f.columnScope!==null);return{resourceKey:t,read:i,create:s,update:n,delete:g,write:s||n,readPartial:a,actions:o?Array.from(o.actions):[]}}function nt(t){async function o(n,g,f){let a=f?.failureRedirect?()=>{throw(0,We.redirect)(f.failureRedirect)}:t.onDeny,v=t.resolveGroupIds?await t.resolveGroupIds(n)??void 0:void 0;return(0,re.createRequirePermission)({resolveUserId:t.resolveUserId,getEffectivePermissions:w=>t.getEffectivePermissions({...w,groupIds:v}),onDeny:a})(n,{appKey:t.appKey,resourceKey:g.resourceKey,action:g.action})}async function i(n,g){let f=await t.resolveUserId(n),a=t.resolveGroupIds?await t.resolveGroupIds(n)??void 0:void 0,v={};for(let S of g.resourceKeys){let w=await t.getEffectivePermissions({userId:f??null,groupIds:a,appKey:t.appKey,resourceKey:S});v[S]=Me(S,w)}return v}async function s(n,g,f){let a=await o(n,g,f),v=await i(n,{resourceKeys:[g.resourceKey]});return{...a,permission:v[g.resourceKey]}}return{requirePermission:o,getMyPermissions:i,requireAndGetPermission:s}}0&&(module.exports={AuthzAdminAppView,AuthzErrorBoundary,AuthzGrantsView,AuthzGraphView,AuthzGroupRolesView,AuthzLayout,AuthzResourcesView,AuthzRolesView,AuthzUserRolesView,ErrorAlert,Field,MyPermissionGroupStatus,MyPermissionIndicator,MyPermissionStatus,createAuthz,createAuthzAdminApp,createAuthzAdminServer,defaultAuthzAdminLabels,defineResources,flattenGroupItems,formatResourceTooltip,getPermissionSummary,makeAuthzErrorBoundary,resolveLabels,toPermissionView,ui,usePermission});
|
|
1
|
+
"use strict";var be=Object.defineProperty;var et=Object.getOwnPropertyDescriptor;var tt=Object.getOwnPropertyNames;var rt=Object.prototype.hasOwnProperty;var ot=(r,o)=>{for(var i in o)be(r,i,{get:o[i],enumerable:!0})},nt=(r,o,i,s)=>{if(o&&typeof o=="object"||typeof o=="function")for(let n of tt(o))!rt.call(r,n)&&n!==i&&be(r,n,{get:()=>o[n],enumerable:!(s=et(o,n))||s.enumerable});return r};var st=r=>nt(be({},"__esModule",{value:!0}),r);var vt={};ot(vt,{AuthzAdminAppView:()=>ht,AuthzErrorBoundary:()=>mt,AuthzGrantsView:()=>Ee,AuthzGraphView:()=>Ue,AuthzGroupRolesView:()=>Oe,AuthzLayout:()=>ct,AuthzResourcesView:()=>Te,AuthzRolesView:()=>Pe,AuthzUserRolesView:()=>Fe,ErrorAlert:()=>re,Field:()=>N,MyPermissionGroupStatus:()=>Re,MyPermissionIndicator:()=>fe,MyPermissionStatus:()=>ut,createAuthz:()=>xt,createAuthzAdminApp:()=>at,createAuthzAdminServer:()=>xe,defaultAuthzAdminLabels:()=>Le,defineResources:()=>bt,flattenGroupItems:()=>Se,formatResourceTooltip:()=>we,getPermissionSummary:()=>We,makeAuthzErrorBoundary:()=>_e,resolveLabels:()=>le,toPermissionView:()=>Be,ui:()=>l,usePermission:()=>ve});module.exports=st(vt);var me=require("react-router");var te=require("@aiquants/authz-core"),D=require("react-router");var Le={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(r){let o=Le;return r?{title:r.title??o.title,myPermission:r.myPermission??o.myPermission,tabs:{...o.tabs,...r.tabs},common:{...o.common,...r.common},roles:{...o.roles,...r.roles},resources:{...o.resources,...r.resources},grants:{...o.grants,...r.grants},userRoles:{...o.userRoles,...r.userRoles},groupRoles:{...o.groupRoles,...r.groupRoles},error:{...o.error,...r.error},warn:{...o.warn,...r.warn}}:o}var it=r=>r instanceof Response;function de(r){if(it(r))throw r;if(r instanceof te.AuthzDeniedError)throw new Response(r.message,{status:403});return(0,D.data)({error:r instanceof Error?r.message:"\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F"},{status:400})}function xe(r){let o=r.store,i=r.resourceKey??"authz_admin",s=le(r.labels),n=async(c,p)=>{let{userId:d}=await r.requirePermission(c,p);if(d==null)throw new te.AuthzDeniedError({appKey:"",resourceKey:p.resourceKey,action:p.action,reason:"unresolved-user",userId:null});return{userId:d}};async function h(c){await r.requireUser(c);try{return await n(c,{resourceKey:i,action:"read"})}catch(p){throw p instanceof te.AuthzDeniedError?new Response(`Forbidden: ${i}`,{status:403}):p}}let f=c=>r.getMyPermissions(c,{resourceKeys:[i]}),a=async c=>{let[p,d]=await Promise.all([o.listRoles(),o.getSelfAdminContext(Number(c))]);return{roles:p,selfAdminRoleIds:d.selfAdminRoleIds,labels:s}},w=async()=>({resources:await o.listResources(),labels:s}),R=async()=>{let[c,p,d]=await Promise.all([o.listGrants(),o.listRoles(),o.listResources()]);return{grants:c,roles:p,resources:d,labels:s}},S=async c=>{let[p,d,v,z]=await Promise.all([o.listUserRoles(),o.listRoles(),o.listUsers(),o.getSelfAdminContext(Number(c))]);return{assignments:p,roles:d,users:v,actorUserId:z.actorUserId,selfAdminRoleIds:z.selfAdminRoleIds,labels:s}},A=async()=>{let[c,p,d]=await Promise.all([o.listGroupRoles(),o.listRoles(),o.listGroups()]);return{groupRoles:c,roles:p,groups:d,labels:s}},k=async()=>{let[c,p,d,v,z,C,F]=await Promise.all([o.listUsers(),o.listRoles(),o.listResources(),o.listGrants(),o.listUserRoles(),o.listGroupRoles(),o.listGroups()]);return{users:c,roles:p,resources:d,grants:v,assignments:z,groupRoles:C,groups:F,labels:s}};return{labels:s,resourceKey:i,layoutGuard:h,loadMyPermissions:f,layout:{async loader({request:c}){return await h(c),{myPermissions:await f(c),labels:s,adminResourceKey:i}}},index:{loader(){throw(0,D.redirect)("/authz/roles")}},roles:{data:a,async loader({request:c}){let{userId:p}=await n(c,{resourceKey:i,action:"read"});return a(p)},async action({request:c}){let p=await c.formData(),d=String(p.get("_action"));try{switch(d){case"create":{let{userId:v}=await n(c,{resourceKey:i,action:"create"}),z=String(p.get("roleKey")??"").trim(),C=String(p.get("name")??"").trim();return z&&C?(await o.createRole({roleKey:z,name:C,description:String(p.get("description")??"").trim()||null},String(v)),{ok:!0}):(0,D.data)({error:"role_key \u3068 name \u306F\u5FC5\u9808\u3067\u3059"},{status:400})}case"save":{let{userId:v}=await n(c,{resourceKey:i,action:"update"}),z=String(p.get("roleKey")??"").trim(),C=String(p.get("name")??"").trim();return z&&C?(await o.updateRole(Number(p.get("id")),{roleKey:z,name:C,description:String(p.get("description")??"").trim()||null},String(v)),{ok:!0}):(0,D.data)({error:"roleKey \u3068 name \u306F\u5FC5\u9808\u3067\u3059"},{status:400})}case"toggle":{let{userId:v}=await n(c,{resourceKey:i,action:"update"});return await o.setRoleActive(Number(p.get("id")),p.get("isActive")==="true",String(v)),{ok:!0}}case"delete":return await n(c,{resourceKey:i,action:"delete"}),await o.deleteRole(Number(p.get("id"))),{ok:!0};default:return(0,D.data)({error:"unknown action"},{status:400})}}catch(v){return de(v)}}},resources:{data:w,async loader({request:c}){return await n(c,{resourceKey:i,action:"read"}),w()},async action({request:c}){let p=await c.formData(),d=String(p.get("_action"));try{switch(d){case"create":{let{userId:v}=await n(c,{resourceKey:i,action:"create"}),z=String(p.get("appKey")??"").trim(),C=String(p.get("resourceKey")??"").trim(),F=String(p.get("name")??"").trim();return z&&C&&F?(await o.createResource({appKey:z,resourceKey:C,name:F,description:String(p.get("description")??"").trim()||null},String(v)),{ok:!0}):(0,D.data)({error:"app_key / resource_key / name \u306F\u5FC5\u9808\u3067\u3059"},{status:400})}case"save":{let{userId:v}=await n(c,{resourceKey:i,action:"update"}),z=String(p.get("name")??"").trim();return z?(await o.updateResource(Number(p.get("id")),{name:z,description:String(p.get("description")??"").trim()||null},String(v)),{ok:!0}):(0,D.data)({error:"name \u306F\u5FC5\u9808\u3067\u3059"},{status:400})}case"delete":return await n(c,{resourceKey:i,action:"delete"}),await o.deleteResource(Number(p.get("id"))),{ok:!0};default:return(0,D.data)({error:"unknown action"},{status:400})}}catch(v){return de(v)}}},grants:{data:R,async loader({request:c}){return await n(c,{resourceKey:i,action:"read"}),R()},async action({request:c}){let p=await c.formData(),d=String(p.get("_action"));try{switch(d){case"create":{let{userId:v}=await n(c,{resourceKey:i,action:"create"}),z=Number(p.get("roleId")),C=Number(p.get("resourceId"));if(!(z&&C))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 F=String(p.get("action")??"");if(!te.AUTHZ_ACTIONS.includes(F))return(0,D.data)({error:"\u7121\u52B9\u306A action \u3067\u3059"},{status:400});let ae=F;return await o.createGrant({roleId:z,resourceId:C,action:ae,rowScope:String(p.get("rowScope")??""),columnScope:String(p.get("columnScope")??"")},String(v)),{ok:!0}}case"save":{let{userId:v}=await n(c,{resourceKey:i,action:"update"}),z=String(p.get("action")??"");if(!te.AUTHZ_ACTIONS.includes(z))return(0,D.data)({error:"\u7121\u52B9\u306A action \u3067\u3059"},{status:400});let C=z;return await o.updateGrant(Number(p.get("id")),{action:C,rowScope:String(p.get("rowScope")??""),columnScope:String(p.get("columnScope")??"")},String(v)),{ok:!0}}case"delete":return await n(c,{resourceKey:i,action:"delete"}),await o.deleteGrant(Number(p.get("id"))),{ok:!0};default:return(0,D.data)({error:"unknown action"},{status:400})}}catch(v){return de(v)}}},userRoles:{data:S,async loader({request:c}){let{userId:p}=await n(c,{resourceKey:i,action:"read"});return S(p)},async action({request:c}){let p=await c.formData(),d=String(p.get("_action"));try{switch(d){case"assign":{let{userId:v}=await n(c,{resourceKey:i,action:"create"}),z=Number(p.get("userId")),C=Number(p.get("roleId"));return z&&C?(await o.assignUserRole(z,C,String(v)),{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(c,{resourceKey:i,action:"delete"}),await o.removeUserRole(Number(p.get("userId")),Number(p.get("roleId"))),{ok:!0};default:return(0,D.data)({error:"unknown action"},{status:400})}}catch(v){return de(v)}}},groupRoles:{data:A,async loader({request:c}){return await n(c,{resourceKey:i,action:"read"}),A()},async action({request:c}){let p=await c.formData(),d=String(p.get("_action"));try{switch(d){case"assign":{let{userId:v}=await n(c,{resourceKey:i,action:"create"}),z=Number(p.get("groupId")),C=Number(p.get("roleId"));return z&&C?(await o.assignGroupRole(z,C,String(v)),{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(c,{resourceKey:i,action:"delete"}),await o.removeGroupRole(Number(p.get("groupId")),Number(p.get("roleId"))),{ok:!0};default:return(0,D.data)({error:"unknown action"},{status:400})}}catch(v){return de(v)}}},graph:{data:k,async loader({request:c}){return await n(c,{resourceKey:i,action:"read"}),k()}}}}function De(r){return String(r["*"]??"").split("/")[0]}function at(r){let o=xe(r),i=r.basePath??"/authz",s=["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={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 f(w){let R=De(w.params);if(!s.includes(R))throw(0,me.redirect)(`${i}/roles`);let{userId:S}=await o.layoutGuard(w.request),[A,k]=await Promise.all([o.loadMyPermissions(w.request),n[R](S)]);return{segment:R,basePath:i,myPermissions:A,adminResourceKey:o.resourceKey,...k}}async function a(w){let R=De(w.params),S=h[R];return S?S(w):(0,me.data)({error:"unknown action"},{status:400})}return{loader:f,action:a,server:o}}var se=require("react/jsx-runtime"),l={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:r,hint:o,children:i}){return(0,se.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"0.3rem"},children:[(0,se.jsxs)("span",{style:{fontSize:"0.8rem",color:"#475569",fontWeight:600},children:[r,o?(0,se.jsxs)("span",{style:{fontWeight:400,color:"#94a3b8"},children:[" \u2014 ",o]}):null]}),i]})}function re({message:r}){return r?(0,se.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:r}):null}var ze=require("@aiquants/authz-core"),Y=require("@aiquants/select-box"),E=require("react"),P=require("react-router");var ie=require("react");function ve(r){let o=r?.read?r.readPartial?"partial":"full":"none",i=r?.create&&r?.update?"full":r?.create||r?.update?"partial":"none",s=r?.delete?"full":"none";return{canRead:!!r?.read,canWrite:!!r?.write,canDelete:!!r?.delete,readState:o,writeState:i,deleteState:s}}var W=require("react/jsx-runtime"),lt={full:{bg:"#ecfdf5",text:"#047857",border:"#a7f3d0"},partial:{bg:"#fffbeb",text:"#b45309",border:"#fde68a"},none:{bg:"#f8fafc",text:"#94a3b8",border:"#cbd5e1"}};function we(r,o){let i=r?.trim(),s=o?.trim();if(s&&i&&s!==i)return`\u5BFE\u8C61\u30EA\u30BD\u30FC\u30B9: ${s} (${i})`;if(s||i)return`\u5BFE\u8C61\u30EA\u30BD\u30FC\u30B9: ${s||i}`}function dt({state:r}){return r==="full"?(0,W.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,W.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 13l4 4L19 7"})}):r==="partial"?(0,W.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,W.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,W.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,W.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 fe({permission:r,resourceName:o,expectedResourceKey:i,showResourceTooltip:s=!0,labels:n,showScopeSummary:h=!0,className:f="authz-permission-indicator"}){let a=ve(r),w={read:n?.read??"\u95B2\u89A7",write:n?.write??"\u7DE8\u96C6",delete:n?.delete??"\u524A\u9664"},R=r?.resourceKey,S=o||R,A=s?we(R,o):void 0,k=!!(i&&R&&R!==i);k&&typeof console<"u"&&typeof console.error=="function"&&console.error(`[Authz Warning] Resource key mismatch in MyPermissionIndicator! Expected: "${i}", but received permission for: "${R}".`);let c=(p,d,v)=>{let z=lt[d],C=A?`${v}: ${d}
|
|
2
|
+
${A}`:`${v}: ${d}`;return(0,W.jsxs)("span",{"data-perm":p,"data-state":d,title:C,style:{display:"inline-flex",alignItems:"center",gap:"0.25rem",padding:"0.2rem 0.5rem",borderRadius:"100px",fontSize:"0.75rem",fontWeight:600,backgroundColor:z.bg,color:z.text,border:`1px solid ${z.border}`,lineHeight:1,userSelect:"none"},children:[(0,W.jsx)(dt,{state:d}),(0,W.jsx)("span",{children:v})]})};return(0,W.jsxs)("span",{className:f,title:A,"data-resource":R??"","data-resource-name":S??"","data-mismatch":k?"true":void 0,style:{display:"inline-flex",gap:"0.35rem",alignItems:"center",verticalAlign:"middle"},children:[c("read",a.readState,w.read),c("write",a.writeState,w.write),c("delete",a.deleteState,w.delete),h&&a.readState==="partial"?(0,W.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,k?(0,W.jsxs)("span",{"data-testid":"resource-mismatch-warning",title:`expected: "${i}", actual: "${R}"`,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 (",R," \u2260 ",i,")"]}):null]})}function ut({permission:r,resourceName:o,expectedResourceKey:i,prefixLabel:s="\u3042\u306A\u305F\u306E\u6A29\u9650",showPrefixLabel:n=!0,showResourceTooltip:h=!0,labels:f,showScopeSummary:a=!0,className:w="authz-permission-status",style:R}){let S=r?.resourceKey,A=o||S,k=h?we(S,o):void 0;return(0,W.jsxs)("span",{className:w,title:k,"data-testid":"my-permission-status","data-resource":S??"","data-resource-name":A??"",style:{fontSize:"0.82rem",color:"#475569",display:"inline-flex",alignItems:"center",gap:"0.4rem",...R},children:[n&&(0,W.jsxs)("span",{"data-testid":"prefix-label",children:[s,":"]}),(0,W.jsx)(fe,{permission:r,resourceName:o,expectedResourceKey:i,showResourceTooltip:h,labels:f,showScopeSummary:a})]})}var $=require("react/jsx-runtime");function Se(r,o=0){let i=[];for(let s of r){let n=s.level??o;i.push({...s,level:n}),s.children&&s.children.length>0&&i.push(...Se(s.children,n+1))}return i}var Ne={"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 We(r,o){let i=o?.noPermission??"\u6A29\u9650\u306A\u3057",s=o?.fullWrite??"\u7DE8\u96C6\u53EF",n=o?.partialRead??"\u4E00\u90E8\u95B2\u89A7",h=o?.readOnly??"\u95B2\u89A7\u306E\u307F";return r&&(r.read||r.write||r.delete)?r.write?{text:s,color:"#047857",bgColor:"#ecfdf5",borderColor:"#a7f3d0"}:r.read?r.readPartial?{text:n,color:"#b45309",bgColor:"#fffbeb",borderColor:"#fde68a"}:{text:h,color:"#1d4ed8",bgColor:"#eff6ff",borderColor:"#bfdbfe"}:{text:i,color:"#64748b",bgColor:"#f1f5f9",borderColor:"#cbd5e1"}:{text:i,color:"#64748b",bgColor:"#f1f5f9",borderColor:"#cbd5e1"}}function pt({item:r,size:o="md",labels:i}){let s=We(r.permission,i),n=r.permission?.resourceKey||r.resourceKey||r.expectedResourceKey,h=r.resourceName||n,f=!!(r.expectedResourceKey&&r.permission?.resourceKey&&r.permission.resourceKey!==r.expectedResourceKey),a=Ne[o],w=`\u5BFE\u8C61: ${h}${n?` (${n})`:""}${r.permission?` | ${i?.read??"\u95B2\u89A7"}:${r.permission.read?"\u25CB":"\xD7"} ${i?.write??"\u7DE8\u96C6"}:${r.permission.write?"\u25CB":"\xD7"} ${i?.delete??"\u524A\u9664"}:${r.permission.delete?"\u25CB":"\xD7"}`:""}`;return(0,$.jsxs)("span",{title:w,"data-testid":`permission-pill-${r.resourceName}`,"data-mismatch":f?"true":"false",style:{display:"inline-flex",alignItems:"center",gap:a.pillGap,fontSize:a.fontSize,padding:a.pillPadding,borderRadius:"9999px",backgroundColor:f?"#fee2e2":s.bgColor,color:f?"#991b1b":s.color,border:`1px solid ${f?"#fca5a5":s.borderColor}`,fontWeight:600,lineHeight:"1.2"},children:[(0,$.jsxs)("span",{children:[h,":"]}),(0,$.jsx)("span",{children:s.text}),f&&(0,$.jsx)("span",{title:`expected "${r.expectedResourceKey}", actual "${r.permission?.resourceKey}"`,children:"\u26A0\uFE0F"})]})}function Re({items:r,prefixLabel:o="\u3042\u306A\u305F\u306E\u6A29\u9650",variant:i="pills",size:s="md",labels:n,className:h="authz-permission-group-status",style:f}){let[a,w]=(0,ie.useState)(!1),R=(0,ie.useRef)(null),S=Ne[s];if((0,ie.useEffect)(()=>{if(i!=="popover"||!a)return;function A(c){R.current&&!R.current.contains(c.target)&&w(!1)}function k(c){c.key==="Escape"&&w(!1)}return document.addEventListener("mousedown",A),document.addEventListener("keydown",k),()=>{document.removeEventListener("mousedown",A),document.removeEventListener("keydown",k)}},[i,a]),i==="popover"){let A=r.filter(p=>p.permission?.write).length,k=r.length,c=A===k?n?.fullWrite??"\u7DE8\u96C6\u53EF":A>0?n?.partialWrite??"\u4E00\u90E8\u7DE8\u96C6\u53EF":n?.readOnly??"\u95B2\u89A7\u306E\u307F";return(0,$.jsxs)("span",{ref:R,className:h,"data-testid":"my-permission-group-popover",style:{position:"relative",display:"inline-block",...f},children:[(0,$.jsxs)("button",{type:"button",onClick:()=>w(!a),"data-testid":"permission-popover-trigger",style:{display:"inline-flex",alignItems:"center",gap:S.wrapperGap,fontSize:S.triggerFontSize,padding:S.triggerPadding,borderRadius:"6px",backgroundColor:"#f8fafc",color:"#334155",border:"1px solid #cbd5e1",fontWeight:600,cursor:"pointer"},children:[(0,$.jsxs)("span",{children:["\u{1F512} ",o]}),(0,$.jsxs)("span",{style:{fontSize:S.badgeFontSize,color:"#64748b"},children:["(",c,")"]}),(0,$.jsx)("span",{style:{fontSize:"0.65rem",marginLeft:"0.1rem"},children:a?"\u25B2":"\u25BE"})]}),a&&(0,$.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,$.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,$.jsxs)("span",{children:["\u{1F512} ",o]}),(0,$.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,$.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:"0.4rem"},children:Se(r).map(p=>{let d=p.level??0,v=d>0;return(0,$.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"1.25rem",whiteSpace:"nowrap",paddingLeft:v?`${d*.85}rem`:"0"},children:[(0,$.jsxs)("div",{style:{display:"inline-flex",alignItems:"center",whiteSpace:"nowrap"},children:[v&&(0,$.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,$.jsxs)("span",{style:{fontWeight:v?500:600,color:v?"#64748b":"#1e293b",fontSize:v?"0.78rem":"0.82rem",whiteSpace:"nowrap"},children:[p.resourceName,":"]})]}),(0,$.jsx)(fe,{permission:p.permission,resourceName:p.resourceName,expectedResourceKey:p.expectedResourceKey,labels:n})]},p.resourceName)})})]})]})}return(0,$.jsxs)("span",{className:h,"data-testid":"my-permission-group-pills",style:{display:"inline-flex",alignItems:"center",flexWrap:"wrap",gap:S.pillGap,fontSize:S.fontSize,color:"#475569",...f},children:[o&&(0,$.jsxs)("span",{style:{fontWeight:600,color:"#334155"},children:[o,":"]}),(0,$.jsx)("span",{style:{display:"inline-flex",alignItems:"center",flexWrap:"wrap",gap:S.pillGap},children:r.map(A=>(0,$.jsx)(pt,{item:A,size:s,labels:n},A.resourceName))})]})}var e=require("react/jsx-runtime"),ue=r=>r?.error;function Me({children:r,renderHeader:o}){let{myPermissions:i,labels:s,adminResourceKey:n,basePath:h}=(0,P.useLoaderData)(),f=h??"/authz",[a,w]=(0,E.useState)("pills"),R=[["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]],S=Object.entries(i||{}).map(([c,p])=>({resourceKey:c,resourceName:p?.resourceKey||c,permission:p,expectedResourceKey:c})),A=S.length>0?S:[{resourceKey:n,resourceName:n,permission:i?.[n],expectedResourceKey:n}],k=(0,e.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"0.4rem"},children:[(0,e.jsx)(Re,{prefixLabel:s.myPermission,items:A,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:()=>w("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:()=>w("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:l.page,children:[o?o({title:s.title,annotation:k}):(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}),k]}),(0,e.jsx)("nav",{style:{display:"flex",gap:"0.25rem",borderBottom:"1px solid #e2e8f0",margin:"0.6rem 0 1rem"},children:R.map(([c,p])=>(0,e.jsx)(P.NavLink,{to:`${f}/${c}`,style:({isActive:d})=>({padding:"0.5rem 0.9rem",textDecoration:"none",color:d?"#2563eb":"#475569",borderBottom:d?"2px solid #2563eb":"2px solid transparent",marginBottom:-1,fontWeight:d?700:500,fontSize:"0.92rem"}),children:p},c))}),r]})}function ct({renderHeader:r}={}){return(0,e.jsx)(Me,{renderHeader:r,children:(0,e.jsx)(P.Outlet,{})})}function _e(r){let o=le(r).error;return function(){let s=(0,P.useRouteError)(),n=(0,P.isRouteErrorResponse)(s)?s:null,h=n?.status===403,f=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:l.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:f}),(0,e.jsx)("p",{style:{color:"#7f1d1d",fontSize:"0.9rem",margin:0,lineHeight:1.7},children:a})]})})}}var mt=_e(),Ae=(r,o)=>i=>{r&&!window.confirm(o)&&i.preventDefault()};function Pe(){let{roles:r,selfAdminRoleIds:o,labels:i}=(0,P.useLoaderData)(),s=i.roles,n=i.common,h=new Set(o??[]);return(0,e.jsxs)("section",{children:[(0,e.jsx)("h2",{style:l.h2,children:s.heading}),(0,e.jsx)(re,{message:ue((0,P.useActionData)())}),(0,e.jsx)("p",{style:l.note,children:s.note}),(0,e.jsx)("div",{style:l.tableContainer,children:(0,e.jsxs)("table",{style:l.table,children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{style:{...l.th,width:"20%"},children:s.roleKey}),(0,e.jsx)("th",{style:{...l.th,width:"25%"},children:s.name}),(0,e.jsx)("th",{style:{...l.th,width:"35%"},children:s.description}),(0,e.jsx)("th",{style:{...l.th,width:"10%"},children:s.activeHeader}),(0,e.jsx)("th",{style:{...l.th,width:"10%"}})]})}),(0,e.jsxs)("tbody",{children:[r.map(f=>(0,e.jsxs)("tr",{children:[(0,e.jsx)("td",{style:l.td,children:f.roleKey==="@authenticated"||f.roleKey==="@anonymous"?(0,e.jsx)("span",{style:l.code,children:f.roleKey}):(0,e.jsx)("input",{name:"roleKey",defaultValue:f.roleKey,form:`save-role-${f.id}`,"aria-label":`roleKey-${f.id}`,required:!0,style:l.input})}),(0,e.jsx)("td",{style:l.td,children:(0,e.jsx)("input",{name:"name",defaultValue:f.name,form:`save-role-${f.id}`,"aria-label":`name-${f.id}`,required:!0,style:l.input})}),(0,e.jsx)("td",{style:l.td,children:(0,e.jsx)("input",{name:"description",defaultValue:f.description??"",form:`save-role-${f.id}`,"aria-label":`description-${f.id}`,style:l.input})}),(0,e.jsx)("td",{style:l.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:f.id}),(0,e.jsx)("input",{type:"hidden",name:"isActive",value:String(!f.isActive)}),(0,e.jsx)("button",{type:"submit",style:l.button,onClick:f.isActive?Ae(h.has(f.id),i.warn.selfRoleDisable):void 0,children:f.isActive?n.active:n.inactive})]})}),(0,e.jsxs)("td",{style:{...l.td,whiteSpace:"nowrap"},children:[(0,e.jsxs)(P.Form,{method:"post",id:`save-role-${f.id}`,style:{display:"inline"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"save"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:f.id}),(0,e.jsx)("button",{type:"submit",style:l.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:f.id}),(0,e.jsx)("button",{type:"submit",style:l.danger,onClick:Ae(h.has(f.id),i.warn.selfRoleDelete),children:n.delete})]})]})]},f.id)),r.length===0?(0,e.jsx)("tr",{children:(0,e.jsx)("td",{style:l.empty,colSpan:5,children:s.empty})}):null]})]})}),(0,e.jsx)("h3",{style:l.h3,children:s.newHeading}),(0,e.jsxs)(P.Form,{method:"post",style:l.card,children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"create"}),(0,e.jsx)(N,{label:s.roleKey,hint:s.hintRoleKey,children:(0,e.jsx)("input",{name:"roleKey","aria-label":"role_key",required:!0,style:l.input})}),(0,e.jsx)(N,{label:s.name,children:(0,e.jsx)("input",{name:"name","aria-label":"name",required:!0,style:l.input})}),(0,e.jsx)(N,{label:s.description,hint:n.optional,children:(0,e.jsx)("input",{name:"description","aria-label":"description",style:l.input})}),(0,e.jsx)("button",{type:"submit",style:l.primary,children:n.add})]})]})}function Te(){let{resources:r,labels:o}=(0,P.useLoaderData)(),i=o.resources,s=o.common;return(0,e.jsxs)("section",{children:[(0,e.jsx)("h2",{style:l.h2,children:i.heading}),(0,e.jsx)(re,{message:ue((0,P.useActionData)())}),(0,e.jsx)("p",{style:l.note,children:i.note}),(0,e.jsx)("div",{style:l.tableContainer,children:(0,e.jsxs)("table",{style:l.table,children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{style:{...l.th,width:"15%"},children:i.appKey}),(0,e.jsx)("th",{style:{...l.th,width:"20%"},children:i.resourceKey}),(0,e.jsx)("th",{style:{...l.th,width:"25%"},children:i.name}),(0,e.jsx)("th",{style:{...l.th,width:"30%"},children:i.description}),(0,e.jsx)("th",{style:{...l.th,width:"10%"}})]})}),(0,e.jsxs)("tbody",{children:[r.map(n=>(0,e.jsxs)("tr",{children:[(0,e.jsx)("td",{style:l.td,children:(0,e.jsx)("span",{style:l.code,children:n.appKey})}),(0,e.jsx)("td",{style:l.td,children:(0,e.jsx)("span",{style:l.code,children:n.resourceKey})}),(0,e.jsx)("td",{style:l.td,children:(0,e.jsx)("input",{name:"name",defaultValue:n.name,form:`save-res-${n.id}`,"aria-label":`name-${n.id}`,required:!0,style:l.input})}),(0,e.jsx)("td",{style:l.td,children:(0,e.jsx)("input",{name:"description",defaultValue:n.description??"",form:`save-res-${n.id}`,"aria-label":`description-${n.id}`,style:l.input})}),(0,e.jsxs)("td",{style:{...l.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:l.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:n.id}),(0,e.jsx)("button",{type:"submit",style:l.danger,children:s.delete})]})]})]},n.id)),r.length===0?(0,e.jsx)("tr",{children:(0,e.jsx)("td",{style:l.empty,colSpan:5,children:i.empty})}):null]})]})}),(0,e.jsx)("h3",{style:l.h3,children:i.newHeading}),(0,e.jsxs)(P.Form,{method:"post",style:l.card,children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"create"}),(0,e.jsx)(N,{label:i.appKey,hint:i.hintAppKey,children:(0,e.jsx)("input",{name:"appKey","aria-label":"app_key",required:!0,style:l.input})}),(0,e.jsx)(N,{label:i.resourceKey,hint:i.hintResourceKey,children:(0,e.jsx)("input",{name:"resourceKey","aria-label":"resource_key",required:!0,style:l.input})}),(0,e.jsx)(N,{label:i.name,children:(0,e.jsx)("input",{name:"name","aria-label":"name",required:!0,style:l.input})}),(0,e.jsx)(N,{label:i.description,hint:s.optional,children:(0,e.jsx)("input",{name:"description","aria-label":"description",style:l.input})}),(0,e.jsx)("button",{type:"submit",style:l.primary,children:s.add})]})]})}function ft({g:r,labels:o}){let i=o.common,[s,n]=(0,E.useState)({label:r.action,value:r.action});return(0,e.jsxs)("tr",{children:[(0,e.jsx)("td",{style:l.td,children:(0,e.jsx)("span",{style:l.code,children:r.roleKey})}),(0,e.jsx)("td",{style:l.td,children:(0,e.jsxs)("span",{style:l.code,children:[r.appKey,":",r.resourceKey]})}),(0,e.jsx)("td",{style:l.td,children:r.roleKey==="@anonymous"?(0,e.jsx)("span",{style:l.code,children:r.action}):(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("input",{type:"hidden",name:"action",value:s.value,form:`save-grant-${r.id}`}),(0,e.jsx)(Y.SelectBox,{options:ze.AUTHZ_ACTIONS.map(h=>({label:h,value:h})),value:s,onChange:h=>{h&&n(h)}})]})}),(0,e.jsx)("td",{style:l.td,children:(0,e.jsx)("textarea",{name:"rowScope",defaultValue:r.rowScope??"",form:`save-grant-${r.id}`,"aria-label":`row_scope-${r.id}`,rows:2,placeholder:o.grants.rowScopePlaceholder,style:l.textarea})}),(0,e.jsx)("td",{style:l.td,children:(0,e.jsx)("textarea",{name:"columnScope",defaultValue:r.columnScope??"",form:`save-grant-${r.id}`,"aria-label":`column_scope-${r.id}`,rows:2,placeholder:o.grants.columnScopePlaceholder,style:l.textarea})}),(0,e.jsxs)("td",{style:{...l.td,whiteSpace:"nowrap"},children:[(0,e.jsxs)(P.Form,{method:"post",id:`save-grant-${r.id}`,style:{display:"inline"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"save"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:r.id}),(0,e.jsx)("button",{type:"submit",style:l.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:r.id}),(0,e.jsx)("button",{type:"submit",style:l.danger,children:i.delete})]})]})]})}function Ee(){let{grants:r,roles:o,resources:i,labels:s}=(0,P.useLoaderData)(),n=s.grants,h=s.common,f=o.map(d=>({label:d.roleKey,value:d.id})),a=i.map(d=>({label:`${d.appKey}:${d.resourceKey}`,value:d.id})),w=ze.AUTHZ_ACTIONS.map(d=>({label:d,value:d})),[R,S]=(0,E.useState)(void 0),[A,k]=(0,E.useState)(void 0),[c,p]=(0,E.useState)({label:"read",value:"read"});return(0,e.jsxs)("section",{children:[(0,e.jsx)("h2",{style:l.h2,children:n.heading}),(0,e.jsx)("p",{style:l.note,children:n.note}),(0,e.jsx)(re,{message:ue((0,P.useActionData)())}),(0,e.jsx)("div",{style:l.tableContainer,children:(0,e.jsxs)("table",{style:l.table,children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{style:{...l.th,width:"15%"},children:n.role}),(0,e.jsx)("th",{style:{...l.th,width:"20%"},children:n.resource}),(0,e.jsx)("th",{style:{...l.th,width:"15%"},children:n.action}),(0,e.jsx)("th",{style:{...l.th,width:"20%"},children:n.rowScope}),(0,e.jsx)("th",{style:{...l.th,width:"20%"},children:n.columnScope}),(0,e.jsx)("th",{style:{...l.th,width:"10%"}})]})}),(0,e.jsxs)("tbody",{children:[r.map(d=>(0,e.jsx)(ft,{g:d,labels:s},d.id)),r.length===0?(0,e.jsx)("tr",{children:(0,e.jsx)("td",{style:l.empty,colSpan:6,children:n.empty})}):null]})]})}),(0,e.jsx)("h3",{style:l.h3,children:n.newHeading}),(0,e.jsxs)(P.Form,{method:"post",style:l.card,children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"create"}),(0,e.jsx)("input",{type:"hidden",name:"roleId",value:R?.value??""}),(0,e.jsx)("input",{type:"hidden",name:"resourceId",value:A?.value??""}),(0,e.jsx)("input",{type:"hidden",name:"action",value:c?.value??""}),(0,e.jsx)(N,{label:n.role,children:(0,e.jsx)(Y.SelectBox,{options:f,value:R,onChange:d=>S(d||void 0),placeholder:n.selectPlaceholder})}),(0,e.jsx)(N,{label:n.resource,children:(0,e.jsx)(Y.SelectBox,{options:a,value:A,onChange:d=>k(d||void 0),placeholder:n.selectPlaceholder})}),(0,e.jsx)(N,{label:n.action,children:(0,e.jsx)(Y.SelectBox,{options:w,value:c,onChange:d=>p(d||void 0)})}),(0,e.jsx)(N,{label:n.rowScope,hint:n.rowScopeHint,children:(0,e.jsx)("textarea",{name:"rowScope","aria-label":"row_scope",rows:2,style:l.textarea,placeholder:'{"filters":[{"field":"\u90E8\u9580CD","op":"in","values":["A"]}]}'})}),(0,e.jsx)(N,{label:n.columnScope,hint:n.columnScopeHint,children:(0,e.jsx)("textarea",{name:"columnScope","aria-label":"column_scope",rows:2,style:l.textarea,placeholder:'{"mode":"deny","columns":["\u91D1\u984D"]}'})}),(0,e.jsx)("button",{type:"submit",style:l.primary,children:h.grant})]})]})}function Fe(){let{assignments:r,roles:o,users:i,actorUserId:s,selfAdminRoleIds:n,labels:h}=(0,P.useLoaderData)(),f=h.userRoles,a=h.common,w=new Set(n??[]),R=i.map(d=>({label:`${d.email}\uFF08${d.displayName}\uFF09`,value:d.id})),S=o.filter(d=>d.roleKey!=="@authenticated"&&d.roleKey!=="@anonymous").map(d=>({label:d.roleKey,value:d.id})),[A,k]=(0,E.useState)(void 0),[c,p]=(0,E.useState)(void 0);return(0,e.jsxs)("section",{children:[(0,e.jsx)("h2",{style:l.h2,children:f.heading}),(0,e.jsx)(re,{message:ue((0,P.useActionData)())}),(0,e.jsx)("p",{style:l.note,children:f.note}),(0,e.jsx)("div",{style:l.tableContainer,children:(0,e.jsxs)("table",{style:l.table,children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{style:{...l.th,width:"45%"},children:f.user}),(0,e.jsx)("th",{style:{...l.th,width:"45%"},children:f.role}),(0,e.jsx)("th",{style:{...l.th,width:"10%"}})]})}),(0,e.jsxs)("tbody",{children:[r.map(d=>(0,e.jsxs)("tr",{children:[(0,e.jsxs)("td",{style:l.td,children:[d.email,(0,e.jsxs)("span",{style:l.muted,children:["\uFF08",d.displayName,"\uFF09"]})]}),(0,e.jsx)("td",{style:l.td,children:d.roleKey}),(0,e.jsx)("td",{style:l.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:d.userId}),(0,e.jsx)("input",{type:"hidden",name:"roleId",value:d.roleId}),(0,e.jsx)("button",{type:"submit",style:l.danger,onClick:Ae(d.userId===s&&w.has(d.roleId),h.warn.selfAssignmentRemove),children:a.remove})]})})]},`${d.userId}-${d.roleId}`)),r.length===0?(0,e.jsx)("tr",{children:(0,e.jsx)("td",{style:l.empty,colSpan:3,children:f.empty})}):null]})]})}),(0,e.jsx)("h3",{style:l.h3,children:f.newHeading}),(0,e.jsxs)(P.Form,{method:"post",style:l.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:c?.value??""}),(0,e.jsx)(N,{label:f.user,children:(0,e.jsx)(Y.SelectBox,{options:R,value:A,onChange:d=>k(d||void 0),placeholder:f.selectPlaceholder})}),(0,e.jsx)(N,{label:f.role,children:(0,e.jsx)(Y.SelectBox,{options:S,value:c,onChange:d=>p(d||void 0),placeholder:f.selectPlaceholder})}),(0,e.jsx)("button",{type:"submit",style:l.primary,children:a.assign})]})]})}function Oe(){let{groupRoles:r,roles:o,groups:i,labels:s}=(0,P.useLoaderData)(),n=(0,P.useActionData)(),h=ue(n),f=s.groupRoles,a=s.common,w=o.filter(d=>d.isActive&&d.roleKey!=="@authenticated"&&d.roleKey!=="@anonymous"),R=i.map(d=>({label:`${d.name} (${d.groupKey})`,value:d.id})),S=w.map(d=>({label:`${d.name} (${d.roleKey})`,value:d.id})),[A,k]=(0,E.useState)(R[0]),[c,p]=(0,E.useState)(S[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:l.h2,children:f.heading}),(0,e.jsx)("p",{style:l.note,children:f.note})]}),h&&(0,e.jsx)(re,{message:h}),(0,e.jsxs)("table",{style:l.table,children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{style:l.th,children:f.group}),(0,e.jsx)("th",{style:l.th,children:f.role}),(0,e.jsx)("th",{style:{...l.th,width:"100px"}})]})}),(0,e.jsx)("tbody",{children:r.length===0?(0,e.jsx)("tr",{children:(0,e.jsx)("td",{colSpan:3,style:{...l.td,textAlign:"center",color:"#64748b"},children:f.empty})}):r.map(d=>(0,e.jsxs)("tr",{children:[(0,e.jsxs)("td",{style:l.td,children:[(0,e.jsx)("strong",{children:d.groupName})," ",(0,e.jsxs)("span",{style:{color:"#64748b",fontSize:"0.85rem"},children:["(",d.groupKey,")"]})]}),(0,e.jsx)("td",{style:l.td,children:(0,e.jsx)("code",{children:d.roleKey})}),(0,e.jsx)("td",{style:{...l.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:d.groupId}),(0,e.jsx)("input",{type:"hidden",name:"roleId",value:d.roleId}),(0,e.jsx)("button",{type:"submit",style:l.dangerBtn,children:a.remove})]})})]},`${d.groupId}-${d.roleId}`))})]}),(0,e.jsxs)(P.Form,{method:"post",style:l.card,children:[(0,e.jsx)("h3",{style:l.h3,children:f.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:c?.value??""}),(0,e.jsx)(N,{label:f.group,children:(0,e.jsx)(Y.SelectBox,{options:R,value:A,onChange:d=>k(d||void 0),placeholder:f.selectPlaceholder})}),(0,e.jsx)(N,{label:f.role,children:(0,e.jsx)(Y.SelectBox,{options:S,value:c,onChange:d=>p(d||void 0),placeholder:f.selectPlaceholder})}),(0,e.jsx)("button",{type:"submit",style:l.primary,children:a.assign})]})]})}var Ie={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 gt({users:r,roles:o,resources:i,grants:s,assignments:n,groupRoles:h=[],groups:f=[],selectedNode:a,onNodeClick:w}){let[R,S]=(0,E.useState)(null),A=new Set(n.map(t=>t.userId)),k=new Set(h.map(t=>t.groupId)),c=new Set([...n.map(t=>t.roleId),...h.map(t=>t.roleId),...s.map(t=>t.roleId)]),p=new Set(s.map(t=>t.resourceId)),d=r.filter(t=>A.has(t.id)),v=f.filter(t=>k.has(t.id)),z=o.filter(t=>c.has(t.id)),C=i.filter(t=>p.has(t.id)),F=t=>{let g=s.filter(y=>y.resourceId===t),u=Array.from(new Set(g.map(y=>y.action)));return u.length>0?u:["none"]},ae=t=>32+F(t).length*24+6,M=16,B=0,X=new Map;C.forEach(t=>{let g=F(t.id),u=ae(t.id),y=B,G=new Map;g.forEach((_,T)=>{let L=y+8+24+T*24+12;G.set(_,L)}),X.set(t.id,{top:y,height:u,actionYMap:G}),B+=u+M});let J=B>0?B-M:0,V=52,j=18,H=V+j,ne=z.length>0?z.length*H-j:0,Z=v.length>0?v.length*H-j:0,Q=d.length>0?d.length*H-j:0,x=Math.max(J,ne,Z,Q,320)+60,I=(x-J)/2,O=(x-ne)/2,K=(x-Z)/2,q=(x-Q)/2,U=(t,g)=>{let u=X.get(t);if(!u)return x/2;let y=u.actionYMap.get(g)??u.height/2;return I+y},pe=t=>O+t*H+V/2,ke=t=>K+t*H+V/2,Ce=t=>q+t*H+V/2,ge=140,ee=420,ye=700,he=980,b=R||a,Ve=t=>{if(!b)return!0;if(b.type==="user")return b.id===t;if(b.type==="role")return n.some(g=>g.userId===t&&g.roleId===b.id);if(b.type==="group")return!1;if(b.type==="resource"){let g=s.filter(u=>u.resourceId===b.id).map(u=>u.roleId);return n.some(u=>u.userId===t&&g.includes(u.roleId))}return!0},qe=t=>{if(!b)return!0;if(b.type==="group")return b.id===t;if(b.type==="role")return h.some(g=>g.groupId===t&&g.roleId===b.id);if(b.type==="user")return!1;if(b.type==="resource"){let g=s.filter(u=>u.resourceId===b.id).map(u=>u.roleId);return h.some(u=>u.groupId===t&&g.includes(u.roleId))}return!0},Ye=t=>b?b.type==="role"?b.id===t:b.type==="user"?n.some(g=>g.userId===b.id&&g.roleId===t):b.type==="group"?h.some(g=>g.groupId===b.id&&g.roleId===t):b.type==="resource"?s.some(g=>g.resourceId===b.id&&g.roleId===t):!0:!0,Xe=t=>{if(!b)return!0;if(b.type==="resource")return b.id===t;if(b.type==="role")return s.some(g=>g.roleId===b.id&&g.resourceId===t);if(b.type==="group"){let g=h.filter(u=>u.groupId===b.id).map(u=>u.roleId);return s.some(u=>g.includes(u.roleId)&&u.resourceId===t)}if(b.type==="user"){let g=n.filter(u=>u.userId===b.id).map(u=>u.roleId);return s.some(u=>g.includes(u.roleId)&&u.resourceId===t)}return!0},je=(t,g)=>b?b.type==="user"?b.id===t&&n.some(u=>u.userId===t&&u.roleId===g):b.type==="role"?b.id===g&&n.some(u=>u.userId===t&&u.roleId===g):b.type==="resource"?s.filter(y=>y.resourceId===b.id).map(y=>y.roleId).includes(g)&&n.some(y=>y.userId===t&&y.roleId===g):b.type!=="group":!0,Qe=(t,g)=>b?b.type==="group"?b.id===t&&h.some(u=>u.groupId===t&&u.roleId===g):b.type==="role"?b.id===g&&h.some(u=>u.groupId===t&&u.roleId===g):b.type==="resource"?s.filter(y=>y.resourceId===b.id).map(y=>y.roleId).includes(g)&&h.some(y=>y.groupId===t&&y.roleId===g):b.type!=="user":!0,Je=(t,g)=>b?b.type==="role"?b.id===t&&s.some(u=>u.roleId===t&&u.resourceId===g):b.type==="resource"?b.id===g&&s.some(u=>u.roleId===t&&u.resourceId===g):b.type==="group"?h.filter(y=>y.groupId===b.id).map(y=>y.roleId).includes(t)&&s.some(y=>y.roleId===t&&y.resourceId===g):b.type==="user"?n.filter(y=>y.userId===b.id).map(y=>y.roleId).includes(t)&&s.some(y=>y.roleId===t&&y.resourceId===g):!0:!0,Ke=[];n.forEach(t=>{let g=d.findIndex(y=>y.id===t.userId),u=z.findIndex(y=>y.id===t.roleId);if(g!==-1&&u!==-1){let y=n.filter(L=>L.roleId===t.roleId),G=y.findIndex(L=>L.userId===t.userId&&L.roleId===t.roleId),_=y.length,T=_>1?Math.min(Math.max((G-(_-1)/2)*4,-16),16):0;Ke.push({uIdx:g,rIdx:u,active:je(t.userId,t.roleId),key:`ur-${t.userId}-${t.roleId}`,offset:T})}});let $e=[];h.forEach(t=>{let g=v.findIndex(y=>y.id===t.groupId),u=z.findIndex(y=>y.id===t.roleId);if(g!==-1&&u!==-1){let y=h.filter(L=>L.roleId===t.roleId),G=y.findIndex(L=>L.groupId===t.groupId&&L.roleId===t.roleId),_=y.length,T=_>1?Math.min(Math.max((G-(_-1)/2)*4,-16),16):0;$e.push({gIdx:g,rIdx:u,active:Qe(t.groupId,t.roleId),key:`gr-${t.groupId}-${t.roleId}`,offset:T})}});let Ge=[];return s.forEach(t=>{let g=z.findIndex(y=>y.id===t.roleId),u=C.findIndex(y=>y.id===t.resourceId);if(g!==-1&&u!==-1){let y=s.filter(ce=>ce.resourceId===t.resourceId&&ce.action===t.action),G=y.findIndex(ce=>ce.id===t.id),_=y.length,T=_>1?Math.min(Math.max((G-(_-1)/2)*4,-12),12):0,L=Ie[t.action],Ze=L?L.text:"#6366f1";Ge.push({rIdx:g,resIdx:u,active:Je(t.roleId,t.resourceId),key:`rr-grant-${t.id}`,action:t.action,color:Ze,offset:T})}}),(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:`${x}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"}),Ge.map(t=>{let g=s.find(T=>`rr-grant-${T.id}`===t.key);if(!g)return null;let u=U(g.resourceId,g.action)+t.offset,y=pe(t.rIdx),G=ge+135,_=ee-135;return(0,e.jsx)("path",{d:`M ${ge+90} ${u} C ${G} ${u}, ${_} ${y}, ${ee-90} ${y}`,fill:"none",stroke:t.active?t.color:"#cbd5e1",strokeWidth:t.active&&b?3:2,strokeOpacity:t.active?b?1:.75:.12,style:{transition:"all 0.2s ease"}},t.key)}),$e.map(t=>{let g=pe(t.rIdx)+t.offset,u=ke(t.gIdx),y=ee+135,G=ye-135;return(0,e.jsx)("path",{"data-testid":`topo-link-group-role-${t.key}`,"data-active":t.active?"true":"false",d:`M ${ee+90} ${g} C ${y} ${g}, ${G} ${u}, ${ye-90} ${u}`,fill:"none",stroke:t.active?"#8b5cf6":"#cbd5e1",strokeWidth:t.active&&b?3:2,strokeDasharray:"4 2",strokeOpacity:t.active?b?1:.75:.12,style:{transition:"all 0.2s ease"}},t.key)}),Ke.map(t=>{let g=pe(t.rIdx)+t.offset,u=Ce(t.uIdx),y=ee+135,G=he-135;return(0,e.jsx)("path",{"data-testid":`topo-link-user-role-${t.key}`,"data-active":t.active?"true":"false",d:`M ${ee+90} ${g} C ${y} ${g}, ${G} ${u}, ${he-90} ${u}`,fill:"none",stroke:t.active?"#4f46e5":"#cbd5e1",strokeWidth:t.active&&b?3:2,strokeOpacity:t.active?b?1:.75:.12,style:{transition:"all 0.2s ease"}},t.key)})]}),(0,e.jsxs)("div",{style:{position:"relative",zIndex:2,width:"100%",height:"100%"},children:[C.map(t=>{let g=a?.type==="resource"&&a.id===t.id,u=Xe(t.id),y=X.get(t.id);if(!y)return null;let G=I+y.top,_=F(t.id);return(0,e.jsxs)("div",{style:{position:"absolute",left:`${ge-90}px`,top:`${G}px`,width:"180px",height:`${y.height}px`,borderRadius:"8px",border:g?"2px solid #10b981":"1px solid #a7f3d0",backgroundColor:g?"#d1fae5":u?"#ffffff":"#f8fafc",opacity:u?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",t.id),onMouseEnter:()=>S({type:"resource",id:t.id}),onMouseLeave:()=>S(null),"data-testid":`topo-node-resource-${t.id}`,"aria-label":`\u30EA\u30BD\u30FC\u30B9: ${t.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:t.name})]}),(0,e.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:"2px"},children:_.map(T=>{if(T==="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=Ie[T]??{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:T}),(0,e.jsx)("span",{style:{fontSize:"0.6rem",opacity:.6},children:"\u25CF"})]},T)})})]},t.id)}),z.map((t,g)=>{let u=a?.type==="role"&&a.id===t.id,y=Ye(t.id),G=pe(g);return(0,e.jsxs)("button",{type:"button",onClick:()=>w("role",t.id),onMouseEnter:()=>S({type:"role",id:t.id}),onMouseLeave:()=>S(null),"data-testid":`topo-node-role-${t.id}`,"aria-label":`\u30ED\u30FC\u30EB: ${t.name}`,"aria-pressed":u,style:{position:"absolute",left:`${ee-90}px`,top:`${G-26}px`,width:"180px",height:"52px",borderRadius:"8px",border:u?"2px solid #6366f1":"1px solid #c7d2fe",backgroundColor:u?"#e0e7ff":y?"#ffffff":"#f8fafc",opacity:y?1:.35,cursor:"pointer",display:"flex",alignItems:"center",padding:"0 10px",gap:"8px",boxShadow:u?"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:t.name}),(0,e.jsx)("div",{style:{fontSize:"0.68rem",color:"#64748b",fontFamily:"monospace",textOverflow:"ellipsis",overflow:"hidden"},children:t.roleKey})]})]},t.id)}),v.map((t,g)=>{let u=a?.type==="group"&&a.id===t.id,y=qe(t.id),G=ke(g);return(0,e.jsxs)("button",{type:"button",onClick:()=>w("group",t.id),onMouseEnter:()=>S({type:"group",id:t.id}),onMouseLeave:()=>S(null),"data-testid":`topo-node-group-${t.id}`,"aria-label":`\u30B0\u30EB\u30FC\u30D7: ${t.name}`,"aria-pressed":u,style:{position:"absolute",left:`${ye-90}px`,top:`${G-26}px`,width:"180px",height:"52px",borderRadius:"8px",border:u?"2px solid #8b5cf6":"1px solid #ddd6fe",backgroundColor:u?"#f3e8ff":y?"#ffffff":"#f8fafc",opacity:y?1:.35,cursor:"pointer",display:"flex",alignItems:"center",padding:"0 10px",gap:"8px",boxShadow:u?"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:t.name}),(0,e.jsx)("div",{style:{fontSize:"0.68rem",color:"#64748b",fontFamily:"monospace",textOverflow:"ellipsis",overflow:"hidden"},children:t.groupKey})]})]},t.id)}),d.map((t,g)=>{let u=a?.type==="user"&&a.id===t.id,y=Ve(t.id),G=Ce(g);return(0,e.jsxs)("button",{type:"button",onClick:()=>w("user",t.id),onMouseEnter:()=>S({type:"user",id:t.id}),onMouseLeave:()=>S(null),"data-testid":`topo-node-user-${t.id}`,"aria-label":`\u30E6\u30FC\u30B6\u30FC: ${t.displayName}`,"aria-pressed":u,style:{position:"absolute",left:`${he-90}px`,top:`${G-26}px`,width:"180px",height:"52px",borderRadius:"8px",border:u?"2px solid #0284c7":"1px solid #bae6fd",backgroundColor:u?"#e0f2fe":y?"#ffffff":"#f8fafc",opacity:y?1:.35,cursor:"pointer",display:"flex",alignItems:"center",padding:"0 10px",gap:"8px",boxShadow:u?"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:t.displayName}),(0,e.jsx)("div",{style:{fontSize:"0.68rem",color:"#64748b",textOverflow:"ellipsis",overflow:"hidden"},children:t.email})]})]},t.id)})]})]})})}function Ue(){let{users:r,roles:o,resources:i,grants:s,assignments:n,groupRoles:h=[],groups:f=[]}=(0,P.useLoaderData)(),[a,w]=(0,E.useState)(null),[R,S]=(0,E.useState)(""),[A,k]=(0,E.useState)("topology"),c=new Map(o.map(m=>[m.id,m])),p=new Map(i.map(m=>[m.id,m])),d=new Map(f.map(m=>[m.id,m])),v=new Map(r.map(m=>[m.id,m])),z=m=>{if(!a)return!0;if(a.type==="user")return a.id===m;if(a.type==="role")return n.some(x=>x.userId===m&&x.roleId===a.id);if(a.type==="group")return!1;if(a.type==="resource"){let x=s.filter(I=>I.resourceId===a.id).map(I=>I.roleId);return n.some(I=>I.userId===m&&x.includes(I.roleId))}return!0},C=m=>{if(!a)return!0;if(a.type==="group")return a.id===m;if(a.type==="role")return h.some(x=>x.groupId===m&&x.roleId===a.id);if(a.type==="user")return!1;if(a.type==="resource"){let x=s.filter(I=>I.resourceId===a.id).map(I=>I.roleId);return h.some(I=>I.groupId===m&&x.includes(I.roleId))}return!0},F=m=>a?a.type==="role"?a.id===m:a.type==="user"?n.some(x=>x.userId===a.id&&x.roleId===m):a.type==="group"?h.some(x=>x.groupId===a.id&&x.roleId===m):a.type==="resource"?s.some(x=>x.resourceId===a.id&&x.roleId===m):!0:!0,ae=m=>{if(!a)return!0;if(a.type==="resource")return a.id===m;if(a.type==="role")return s.some(x=>x.roleId===a.id&&x.resourceId===m);if(a.type==="group"){let x=h.filter(I=>I.groupId===a.id).map(I=>I.roleId);return s.some(I=>x.includes(I.roleId)&&I.resourceId===m)}if(a.type==="user"){let x=n.filter(I=>I.userId===a.id).map(I=>I.roleId);return s.some(I=>x.includes(I.roleId)&&I.resourceId===m)}return!0},M=R.trim().toLowerCase(),B=r.filter(m=>!M||m.displayName.toLowerCase().includes(M)||m.email?.toLowerCase().includes(M)),X=f.filter(m=>!M||m.name.toLowerCase().includes(M)||m.groupKey.toLowerCase().includes(M)),J=o.filter(m=>!M||m.name.toLowerCase().includes(M)||m.roleKey.toLowerCase().includes(M)),V=i.filter(m=>!M||m.name.toLowerCase().includes(M)||m.resourceKey.toLowerCase().includes(M)||m.appKey.toLowerCase().includes(M)),j=a?.type==="user"?v.get(a.id):null,H=a?.type==="group"?d.get(a.id):null,ne=a?.type==="role"?c.get(a.id):null,Z=a?.type==="resource"?p.get(a.id):null,Q=(m,x)=>{a&&a.type===m&&a.id===x?w(null):w({type:m,id:x})};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:()=>k("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:()=>k("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: ",r.length]}),(0,e.jsxs)("span",{style:{backgroundColor:"#f3e8ff",color:"#6d28d9",padding:"2px 8px",borderRadius:"12px",fontWeight:600},children:["\u{1F465} \u30B0\u30EB\u30FC\u30D7: ",f.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: ",i.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:R,onChange:m=>S(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:[j&&`\u30E6\u30FC\u30B6\u30FC\u300C${j.displayName} (${j.email})\u300D\u306B\u95A2\u9023\u3059\u308B\u30D1\u30B9\u3092\u8868\u793A\u4E2D`,H&&`\u30B0\u30EB\u30FC\u30D7\u300C${H.name} (${H.groupKey})\u300D\u306B\u95A2\u9023\u3059\u308B\u30D1\u30B9\u3092\u8868\u793A\u4E2D`,ne&&`\u30ED\u30FC\u30EB\u300C${ne.name} (${ne.roleKey})\u300D\u306B\u95A2\u9023\u3059\u308B\u30D1\u30B9\u3092\u8868\u793A\u4E2D`,Z&&`\u30EA\u30BD\u30FC\u30B9\u300C${Z.name} (${Z.appKey}:${Z.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:()=>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)(gt,{users:B,roles:J,resources:V,grants:s,assignments:n,groupRoles:h,groups:X,selectedNode:a,onNodeClick:Q}):(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 x=a?.type==="resource"&&a.id===m.id,I=ae(m.id),O=s.filter(K=>K.resourceId===m.id);return(0,e.jsxs)("button",{type:"button",onClick:()=>Q("resource",m.id),"data-testid":`graph-node-resource-${m.id}`,style:{textAlign:"left",width:"100%",padding:"0.6rem",borderRadius:"6px",border:x?"2px solid #10b981":"1px solid #e2e8f0",backgroundColor:x?"#d1fae5":I?"#ffffff":"#f8fafc",opacity:I?1:.4,cursor:"pointer",transition:"all 0.15s ease",boxShadow:x?"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 q=c.get(K.roleId),U=Ie[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:[q?.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 (",J.length,")"]}),(0,e.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"0.5rem",maxHeight:"480px",overflowY:"auto",paddingRight:"4px"},children:[J.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"}),J.map(m=>{let x=a?.type==="role"&&a.id===m.id,I=F(m.id),O=s.filter(U=>U.roleId===m.id),K=n.filter(U=>U.roleId===m.id),q=h.filter(U=>U.roleId===m.id);return(0,e.jsxs)("button",{type:"button",onClick:()=>Q("role",m.id),"data-testid":`graph-node-role-${m.id}`,style:{textAlign:"left",width:"100%",padding:"0.6rem",borderRadius:"6px",border:x?"2px solid #6366f1":"1px solid #e2e8f0",backgroundColor:x?"#e0e7ff":I?"#ffffff":"#f8fafc",opacity:I?1:.4,cursor:"pointer",transition:"all 0.15s ease",boxShadow:x?"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: ",q.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 x=a?.type==="group"&&a.id===m.id,I=C(m.id),O=h.filter(K=>K.groupId===m.id);return(0,e.jsxs)("button",{type:"button",onClick:()=>Q("group",m.id),"data-testid":`graph-node-group-${m.id}`,style:{textAlign:"left",width:"100%",padding:"0.6rem",borderRadius:"6px",border:x?"2px solid #8b5cf6":"1px solid #e2e8f0",backgroundColor:x?"#f3e8ff":I?"#ffffff":"#f8fafc",opacity:I?1:.4,cursor:"pointer",transition:"all 0.15s ease",boxShadow:x?"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 q=c.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 ",q?.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 x=a?.type==="user"&&a.id===m.id,I=z(m.id),O=n.filter(K=>K.userId===m.id);return(0,e.jsxs)("button",{type:"button",onClick:()=>Q("user",m.id),"data-testid":`graph-node-user-${m.id}`,style:{textAlign:"left",width:"100%",padding:"0.6rem",borderRadius:"6px",border:x?"2px solid #0284c7":"1px solid #e2e8f0",backgroundColor:x?"#e0f2fe":I?"#ffffff":"#f8fafc",opacity:I?1:.4,cursor:"pointer",transition:"all 0.15s ease",boxShadow:x?"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 q=c.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 ",q?.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 yt={roles:Pe,resources:Te,role_permissions:Ee,user_roles:Fe,group_roles:Oe,graph:Ue};function ht({renderHeader:r}={}){let{segment:o}=(0,P.useLoaderData)(),i=yt[o]??Pe;return(0,e.jsx)(Me,{renderHeader:r,children:(0,e.jsx)(i,{})})}function bt(r){let o={};for(let i of Object.keys(r)){let s=r[i];o[i]={key:s.key??i,name:s.name,description:s.description}}return o}var oe=require("@aiquants/authz-core"),He=require("react-router");function Be(r,o){let i=(0,oe.can)(o,"read"),s=(0,oe.can)(o,"create"),n=(0,oe.can)(o,"update"),h=(0,oe.can)(o,"delete"),f=o?.scopeByAction.read,a=i&&!!f&&(f.rowScope!==null||f.columnScope!==null);return{resourceKey:r,read:i,create:s,update:n,delete:h,write:s||n,readPartial:a,actions:o?Array.from(o.actions):[]}}function xt(r){async function o(n,h,f){let a=f?.failureRedirect?()=>{throw(0,He.redirect)(f.failureRedirect)}:r.onDeny,w=r.resolveGroupIds?await r.resolveGroupIds(n)??void 0:void 0;return(0,oe.createRequirePermission)({resolveUserId:r.resolveUserId,getEffectivePermissions:S=>r.getEffectivePermissions({...S,groupIds:w}),onDeny:a})(n,{appKey:r.appKey,resourceKey:h.resourceKey,action:h.action})}async function i(n,h){let f=await r.resolveUserId(n),a=r.resolveGroupIds?await r.resolveGroupIds(n)??void 0:void 0,w={};for(let R of h.resourceKeys){let S=await r.getEffectivePermissions({userId:f??null,groupIds:a,appKey:r.appKey,resourceKey:R});w[R]=Be(R,S)}return w}async function s(n,h,f){let a=await o(n,h,f),w=await i(n,{resourceKeys:[h.resourceKey]});return{...a,permission:w[h.resourceKey]}}return{requirePermission:o,getMyPermissions:i,requireAndGetPermission:s}}0&&(module.exports={AuthzAdminAppView,AuthzErrorBoundary,AuthzGrantsView,AuthzGraphView,AuthzGroupRolesView,AuthzLayout,AuthzResourcesView,AuthzRolesView,AuthzUserRolesView,ErrorAlert,Field,MyPermissionGroupStatus,MyPermissionIndicator,MyPermissionStatus,createAuthz,createAuthzAdminApp,createAuthzAdminServer,defaultAuthzAdminLabels,defineResources,flattenGroupItems,formatResourceTooltip,getPermissionSummary,makeAuthzErrorBoundary,resolveLabels,toPermissionView,ui,usePermission});
|
|
3
3
|
//# sourceMappingURL=index.js.map
|