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