@aiquants/authz-react-router 0.1.1 → 0.2.1
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/README.md +1 -1
- package/dist/index.d.mts +8 -3
- package/dist/index.d.ts +8 -3
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -43,7 +43,7 @@ export const authzTables = defineAuthzSchema("dbo_authz", { userTable: Users })
|
|
|
43
43
|
|
|
44
44
|
const authz = createAuthz({
|
|
45
45
|
appKey: "myapp",
|
|
46
|
-
// request → your user id (or null →
|
|
46
|
+
// request → your user id (or null → checked against "@anonymous" permissions)
|
|
47
47
|
resolveUserId: async (request) => (await getSessionUser(request))?.id ?? null,
|
|
48
48
|
// load + merge this user's grants for one (app, resource)
|
|
49
49
|
getEffectivePermissions: (args) => getEffectivePermissions(db, authzTables, args),
|
package/dist/index.d.mts
CHANGED
|
@@ -13,7 +13,7 @@ type AuthzConfig = {
|
|
|
13
13
|
resolveUserId: (request: Request) => Awaitable<AuthzUserId | null | undefined>;
|
|
14
14
|
/** Load effective permissions for (user, app, resource) — typically via @aiquants/authz-drizzle. */
|
|
15
15
|
getEffectivePermissions: (args: {
|
|
16
|
-
userId: AuthzUserId;
|
|
16
|
+
userId: AuthzUserId | null;
|
|
17
17
|
appKey: string;
|
|
18
18
|
resourceKey: string;
|
|
19
19
|
}) => Awaitable<EffectivePermission | null | undefined>;
|
|
@@ -227,9 +227,14 @@ type CreateAuthzAdminServerOptions = {
|
|
|
227
227
|
resourceKey?: string;
|
|
228
228
|
/** 未ログインをログインへ誘導する(例: throw redirect(...))。 */
|
|
229
229
|
requireUser: (request: Request) => Promise<unknown>;
|
|
230
|
-
/**
|
|
230
|
+
/**
|
|
231
|
+
* 認可ガード(アプリの createAuthz 由来)。allow で { userId } を返す。
|
|
232
|
+
* 0.2.0 で GuardResult.userId が nullable 化したため、戻り型も null を受ける。
|
|
233
|
+
* userId==null(未解決/万一の public 付与)は createAuthzAdminServer 内で deny する
|
|
234
|
+
* (管理経路は監査・自己権限計算に実 id が必須のため非 null を保証)。
|
|
235
|
+
*/
|
|
231
236
|
requirePermission: (request: Request, query: PermissionQuery) => Promise<{
|
|
232
|
-
userId: string | number;
|
|
237
|
+
userId: string | number | null;
|
|
233
238
|
}>;
|
|
234
239
|
/** 自己権限表示用(アプリの createAuthz 由来)。 */
|
|
235
240
|
getMyPermissions: (request: Request, args: {
|
package/dist/index.d.ts
CHANGED
|
@@ -13,7 +13,7 @@ type AuthzConfig = {
|
|
|
13
13
|
resolveUserId: (request: Request) => Awaitable<AuthzUserId | null | undefined>;
|
|
14
14
|
/** Load effective permissions for (user, app, resource) — typically via @aiquants/authz-drizzle. */
|
|
15
15
|
getEffectivePermissions: (args: {
|
|
16
|
-
userId: AuthzUserId;
|
|
16
|
+
userId: AuthzUserId | null;
|
|
17
17
|
appKey: string;
|
|
18
18
|
resourceKey: string;
|
|
19
19
|
}) => Awaitable<EffectivePermission | null | undefined>;
|
|
@@ -227,9 +227,14 @@ type CreateAuthzAdminServerOptions = {
|
|
|
227
227
|
resourceKey?: string;
|
|
228
228
|
/** 未ログインをログインへ誘導する(例: throw redirect(...))。 */
|
|
229
229
|
requireUser: (request: Request) => Promise<unknown>;
|
|
230
|
-
/**
|
|
230
|
+
/**
|
|
231
|
+
* 認可ガード(アプリの createAuthz 由来)。allow で { userId } を返す。
|
|
232
|
+
* 0.2.0 で GuardResult.userId が nullable 化したため、戻り型も null を受ける。
|
|
233
|
+
* userId==null(未解決/万一の public 付与)は createAuthzAdminServer 内で deny する
|
|
234
|
+
* (管理経路は監査・自己権限計算に実 id が必須のため非 null を保証)。
|
|
235
|
+
*/
|
|
231
236
|
requirePermission: (request: Request, query: PermissionQuery) => Promise<{
|
|
232
|
-
userId: string | number;
|
|
237
|
+
userId: string | number | null;
|
|
233
238
|
}>;
|
|
234
239
|
/** 自己権限表示用(アプリの createAuthz 由来)。 */
|
|
235
240
|
getMyPermissions: (request: Request, args: {
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var D=Object.defineProperty;var Q=Object.getOwnPropertyDescriptor;var Y=Object.getOwnPropertyNames;var Z=Object.prototype.hasOwnProperty;var X=(o,r)=>{for(var n in r)D(o,n,{get:r[n],enumerable:!0})},j=(o,r,n,l)=>{if(r&&typeof r=="object"||typeof r=="function")for(let s of Y(r))!Z.call(o,s)&&s!==n&&D(o,s,{get:()=>r[s],enumerable:!(l=Q(r,s))||l.enumerable});return o};var ee=o=>j(D({},"__esModule",{value:!0}),o);var le={};X(le,{AuthzAdminAppView:()=>ie,AuthzErrorBoundary:()=>oe,AuthzGrantsView:()=>M,AuthzLayout:()=>se,AuthzResourcesView:()=>W,AuthzRolesView:()=>F,AuthzUserRolesView:()=>B,ErrorAlert:()=>v,Field:()=>h,MyPermissionIndicator:()=>U,createAuthz:()=>ae,createAuthzAdminApp:()=>re,createAuthzAdminServer:()=>_,defaultAuthzAdminLabels:()=>$,makeAuthzErrorBoundary:()=>G,resolveLabels:()=>x,toPermissionView:()=>J,ui:()=>t,usePermission:()=>E});module.exports=ee(le);var I=require("react-router");var L=require("@aiquants/authz-core"),f=require("react-router");var $={title:"Authorization (RBAC)",myPermission:"Your permissions",tabs:{roles:"Roles",resources:"Resources",role_permissions:"Permissions",user_roles:"User assignments"},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)",user:"user",role:"role",empty:"No assignments",newHeading:"Assign a role",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 x(o){let r=$;return o?{title:o.title??r.title,myPermission:o.myPermission??r.myPermission,tabs:{...r.tabs,...o.tabs},common:{...r.common,...o.common},roles:{...r.roles,...o.roles},resources:{...r.resources,...o.resources},grants:{...r.grants,...o.grants},userRoles:{...r.userRoles,...o.userRoles},error:{...r.error,...o.error},warn:{...r.warn,...o.warn}}:r}var te=o=>o instanceof Response;function K(o){if(te(o))throw o;if(o instanceof L.AuthzDeniedError)throw new Response(o.message,{status:403});return(0,f.data)({error:o instanceof Error?o.message:"\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F"},{status:400})}function _(o){let r=o.store,n=o.resourceKey??"authz_admin",l=x(o.labels),s=o.requirePermission;async function u(d){await o.requireUser(d);try{return await s(d,{resourceKey:n,action:"read"})}catch(a){throw a instanceof L.AuthzDeniedError?new Response(`Forbidden: ${n}`,{status:403}):a}}let i=d=>o.getMyPermissions(d,{resourceKeys:[n]}),g=async d=>{let[a,A]=await Promise.all([r.listRoles(),r.getSelfAdminContext(Number(d))]);return{roles:a,selfAdminRoleIds:A.selfAdminRoleIds,labels:l}},b=async()=>({resources:await r.listResources(),labels:l}),m=async()=>{let[d,a,A]=await Promise.all([r.listGrants(),r.listRoles(),r.listResources()]);return{grants:d,roles:a,resources:A,labels:l}},R=async d=>{let[a,A,p,y]=await Promise.all([r.listUserRoles(),r.listRoles(),r.listUsers(),r.getSelfAdminContext(Number(d))]);return{assignments:a,roles:A,users:p,actorUserId:y.actorUserId,selfAdminRoleIds:y.selfAdminRoleIds,labels:l}};return{labels:l,resourceKey:n,layoutGuard:u,loadMyPermissions:i,layout:{async loader({request:d}){return await u(d),{myPermissions:await i(d),labels:l,adminResourceKey:n}}},index:{loader(){throw(0,f.redirect)("/authz/roles")}},roles:{data:g,async loader({request:d}){let{userId:a}=await s(d,{resourceKey:n,action:"read"});return g(a)},async action({request:d}){let a=await d.formData(),A=String(a.get("_action"));try{switch(A){case"create":{let{userId:p}=await s(d,{resourceKey:n,action:"create"}),y=String(a.get("roleKey")??"").trim(),w=String(a.get("name")??"").trim();return y&&w?(await r.createRole({roleKey:y,name:w,description:String(a.get("description")??"").trim()||null},String(p)),{ok:!0}):(0,f.data)({error:"role_key \u3068 name \u306F\u5FC5\u9808\u3067\u3059"},{status:400})}case"save":{let{userId:p}=await s(d,{resourceKey:n,action:"update"}),y=String(a.get("name")??"").trim();return y?(await r.updateRole(Number(a.get("id")),{name:y,description:String(a.get("description")??"").trim()||null},String(p)),{ok:!0}):(0,f.data)({error:"name \u306F\u5FC5\u9808\u3067\u3059"},{status:400})}case"toggle":{let{userId:p}=await s(d,{resourceKey:n,action:"update"});return await r.setRoleActive(Number(a.get("id")),a.get("isActive")==="true",String(p)),{ok:!0}}case"delete":return await s(d,{resourceKey:n,action:"delete"}),await r.deleteRole(Number(a.get("id"))),{ok:!0};default:return(0,f.data)({error:"unknown action"},{status:400})}}catch(p){return K(p)}}},resources:{data:b,async loader({request:d}){return await s(d,{resourceKey:n,action:"read"}),b()},async action({request:d}){let a=await d.formData(),A=String(a.get("_action"));try{switch(A){case"create":{let{userId:p}=await s(d,{resourceKey:n,action:"create"}),y=String(a.get("appKey")??"").trim(),w=String(a.get("resourceKey")??"").trim(),C=String(a.get("name")??"").trim();return y&&w&&C?(await r.createResource({appKey:y,resourceKey:w,name:C,description:String(a.get("description")??"").trim()||null},String(p)),{ok:!0}):(0,f.data)({error:"app_key / resource_key / name \u306F\u5FC5\u9808\u3067\u3059"},{status:400})}case"save":{let{userId:p}=await s(d,{resourceKey:n,action:"update"}),y=String(a.get("name")??"").trim();return y?(await r.updateResource(Number(a.get("id")),{name:y,description:String(a.get("description")??"").trim()||null},String(p)),{ok:!0}):(0,f.data)({error:"name \u306F\u5FC5\u9808\u3067\u3059"},{status:400})}case"delete":return await s(d,{resourceKey:n,action:"delete"}),await r.deleteResource(Number(a.get("id"))),{ok:!0};default:return(0,f.data)({error:"unknown action"},{status:400})}}catch(p){return K(p)}}},grants:{data:m,async loader({request:d}){return await s(d,{resourceKey:n,action:"read"}),m()},async action({request:d}){let a=await d.formData(),A=String(a.get("_action"));try{switch(A){case"create":{let{userId:p}=await s(d,{resourceKey:n,action:"create"}),y=Number(a.get("roleId")),w=Number(a.get("resourceId"));return y&&w?(await r.createGrant({roleId:y,resourceId:w,action:String(a.get("action")??""),rowScope:String(a.get("rowScope")??""),columnScope:String(a.get("columnScope")??"")},String(p)),{ok:!0}):(0,f.data)({error:"\u30ED\u30FC\u30EB\u3068\u30EA\u30BD\u30FC\u30B9\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044"},{status:400})}case"save":{let{userId:p}=await s(d,{resourceKey:n,action:"update"});return await r.updateGrant(Number(a.get("id")),{rowScope:String(a.get("rowScope")??""),columnScope:String(a.get("columnScope")??"")},String(p)),{ok:!0}}case"delete":return await s(d,{resourceKey:n,action:"delete"}),await r.deleteGrant(Number(a.get("id"))),{ok:!0};default:return(0,f.data)({error:"unknown action"},{status:400})}}catch(p){return K(p)}}},userRoles:{data:R,async loader({request:d}){let{userId:a}=await s(d,{resourceKey:n,action:"read"});return R(a)},async action({request:d}){let a=await d.formData(),A=String(a.get("_action"));try{switch(A){case"assign":{let{userId:p}=await s(d,{resourceKey:n,action:"create"}),y=Number(a.get("userId")),w=Number(a.get("roleId"));return y&&w?(await r.assignUserRole(y,w,String(p)),{ok:!0}):(0,f.data)({error:"\u30E6\u30FC\u30B6\u30FC\u3068\u30ED\u30FC\u30EB\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044"},{status:400})}case"remove":return await s(d,{resourceKey:n,action:"delete"}),await r.removeUserRole(Number(a.get("userId")),Number(a.get("roleId"))),{ok:!0};default:return(0,f.data)({error:"unknown action"},{status:400})}}catch(p){return K(p)}}}}}function T(o){return String(o["*"]??"").split("/")[0]}function re(o){let r=_(o),n=o.basePath??"/authz",l=["roles","resources","role_permissions","user_roles"],s={roles:r.roles.data,resources:r.resources.data,role_permissions:r.grants.data,user_roles:r.userRoles.data},u={roles:r.roles.action,resources:r.resources.action,role_permissions:r.grants.action,user_roles:r.userRoles.action};async function i(b){let m=T(b.params);if(!l.includes(m))throw(0,I.redirect)(`${n}/roles`);let{userId:R}=await r.layoutGuard(b.request),[d,a]=await Promise.all([r.loadMyPermissions(b.request),s[m](R)]);return{segment:m,basePath:n,myPermissions:d,adminResourceKey:r.resourceKey,...a}}async function g(b){let m=T(b.params),R=u[m];return R?R(b):(0,I.data)({error:"unknown action"},{status:400})}return{loader:i,action:g,server:r}}var z=require("react/jsx-runtime"),t={page:{padding:"1.25rem",maxWidth:1120,margin:"0 auto",color:"#0f172a"},table:{borderCollapse:"collapse",width:"100%",fontSize:"0.9rem"},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"},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 h({label:o,hint:r,children:n}){return(0,z.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"0.3rem"},children:[(0,z.jsxs)("span",{style:{fontSize:"0.8rem",color:"#475569",fontWeight:600},children:[o,r?(0,z.jsxs)("span",{style:{fontWeight:400,color:"#94a3b8"},children:[" \u2014 ",r]}):null]}),n]})}function v({message:o}){return o?(0,z.jsx)("p",{role:"alert",style:{color:"#dc2626",background:"#fef2f2",border:"1px solid #fecaca",borderRadius:8,padding:"0.55rem 0.8rem",fontSize:"0.85rem",margin:"0.25rem 0"},children:o}):null}var V=require("@aiquants/authz-core"),c=require("react-router");function E(o){let r=o?.read?o.readPartial?"partial":"full":"none",n=o?.create&&o?.update?"full":o?.create||o?.update?"partial":"none",l=o?.delete?"full":"none";return{canRead:!!o?.read,canWrite:!!o?.write,canDelete:!!o?.delete,readState:r,writeState:n,deleteState:l}}var S=require("react/jsx-runtime"),N={full:"\u25CB",partial:"\u25B3",none:"\xD7"};function U({permission:o,labels:r,showScopeSummary:n=!0,className:l="authz-permission-indicator"}){let s=E(o),u={read:r?.read??"\u8AAD",write:r?.write??"\u66F8",delete:r?.delete??"\u524A\u9664"};return(0,S.jsxs)("span",{className:l,"data-resource":o?.resourceKey??"",children:[(0,S.jsxs)("span",{"data-perm":"read",title:`${u.read}: ${s.readState}`,children:[u.read,N[s.readState]]}),(0,S.jsxs)("span",{"data-perm":"write",title:`${u.write}: ${s.writeState}`,children:[u.write,N[s.writeState]]}),(0,S.jsxs)("span",{"data-perm":"delete",title:`${u.delete}: ${s.deleteState}`,children:[u.delete,N[s.deleteState]]}),n&&s.readState==="partial"?(0,S.jsx)("span",{"data-perm":"scope",children:"\uFF08\u90E8\u5206\uFF09"}):null]})}var e=require("react/jsx-runtime"),k=o=>o?.error;function H({children:o}){let{myPermissions:r,labels:n,adminResourceKey:l,basePath:s}=(0,c.useLoaderData)(),u=s??"/authz",i=[["roles",n.tabs.roles],["resources",n.tabs.resources],["role_permissions",n.tabs.role_permissions],["user_roles",n.tabs.user_roles]];return(0,e.jsxs)("div",{className:"authz-admin",style:t.page,children:[(0,e.jsxs)("header",{style:{display:"flex",alignItems:"baseline",justifyContent:"space-between",gap:"1rem",flexWrap:"wrap"},children:[(0,e.jsx)("h1",{style:{fontSize:"1.3rem",margin:0,fontWeight:700},children:n.title}),(0,e.jsxs)("span",{style:{fontSize:"0.82rem",color:"#475569",display:"inline-flex",alignItems:"center",gap:"0.4rem"},children:[n.myPermission,": ",(0,e.jsx)(U,{permission:r[l]})]})]}),(0,e.jsx)("nav",{style:{display:"flex",gap:"0.25rem",borderBottom:"1px solid #e2e8f0",margin:"0.9rem 0 1.25rem"},children:i.map(([g,b])=>(0,e.jsx)(c.NavLink,{to:`${u}/${g}`,style:({isActive:m})=>({padding:"0.5rem 0.9rem",textDecoration:"none",color:m?"#2563eb":"#475569",borderBottom:m?"2px solid #2563eb":"2px solid transparent",marginBottom:-1,fontWeight:m?700:500,fontSize:"0.92rem"}),children:b},g))}),o]})}function se(){return(0,e.jsx)(H,{children:(0,e.jsx)(c.Outlet,{})})}function G(o){let r=x(o).error;return function(){let l=(0,c.useRouteError)(),s=(0,c.isRouteErrorResponse)(l)?l:null,u=s?.status===403,i=u?r.forbiddenTitle:s?`${r.genericTitlePrefix} (${s.status})`:r.genericTitle,g=u?r.forbiddenBody:s?typeof s.data=="string"&&s.data?s.data:s.statusText:r.genericBody;return(0,e.jsx)("div",{style:t.page,children:(0,e.jsxs)("div",{role:"alert",style:{maxWidth:480,margin:"3rem auto",padding:"1.5rem",border:"1px solid #fecaca",borderRadius:12,background:"#fef2f2"},children:[(0,e.jsx)("h1",{style:{fontSize:"1.1rem",fontWeight:700,color:"#b91c1c",margin:"0 0 0.5rem"},children:i}),(0,e.jsx)("p",{style:{color:"#7f1d1d",fontSize:"0.9rem",margin:0,lineHeight:1.7},children:g})]})})}}var oe=G(),q=(o,r)=>n=>{o&&!window.confirm(r)&&n.preventDefault()};function F(){let{roles:o,selfAdminRoleIds:r,labels:n}=(0,c.useLoaderData)(),l=n.roles,s=n.common,u=new Set(r??[]);return(0,e.jsxs)("section",{children:[(0,e.jsx)("h2",{style:t.h2,children:l.heading}),(0,e.jsx)(v,{message:k((0,c.useActionData)())}),(0,e.jsx)("p",{style:t.note,children:l.note}),(0,e.jsxs)("table",{style:t.table,children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{style:t.th,children:l.roleKey}),(0,e.jsx)("th",{style:t.th,children:l.name}),(0,e.jsx)("th",{style:t.th,children:l.description}),(0,e.jsx)("th",{style:t.th,children:l.activeHeader}),(0,e.jsx)("th",{style:t.th})]})}),(0,e.jsxs)("tbody",{children:[o.map(i=>(0,e.jsxs)("tr",{children:[(0,e.jsx)("td",{style:t.td,children:(0,e.jsx)("span",{style:t.code,children:i.roleKey})}),(0,e.jsx)("td",{style:t.td,children:(0,e.jsx)("input",{name:"name",defaultValue:i.name,form:`save-role-${i.id}`,"aria-label":`name-${i.id}`,required:!0,style:t.input})}),(0,e.jsx)("td",{style:t.td,children:(0,e.jsx)("input",{name:"description",defaultValue:i.description??"",form:`save-role-${i.id}`,"aria-label":`description-${i.id}`,style:t.input})}),(0,e.jsx)("td",{style:t.td,children:(0,e.jsxs)(c.Form,{method:"post",style:{display:"inline"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"toggle"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:i.id}),(0,e.jsx)("input",{type:"hidden",name:"isActive",value:String(!i.isActive)}),(0,e.jsx)("button",{type:"submit",style:t.button,onClick:i.isActive?q(u.has(i.id),n.warn.selfRoleDisable):void 0,children:i.isActive?s.active:s.inactive})]})}),(0,e.jsxs)("td",{style:{...t.td,whiteSpace:"nowrap"},children:[(0,e.jsxs)(c.Form,{method:"post",id:`save-role-${i.id}`,style:{display:"inline"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"save"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:i.id}),(0,e.jsx)("button",{type:"submit",style:t.save,children:s.save})]}),(0,e.jsxs)(c.Form,{method:"post",style:{display:"inline",marginLeft:"0.4rem"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"delete"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:i.id}),(0,e.jsx)("button",{type:"submit",style:t.danger,onClick:q(u.has(i.id),n.warn.selfRoleDelete),children:s.delete})]})]})]},i.id)),o.length===0?(0,e.jsx)("tr",{children:(0,e.jsx)("td",{style:t.empty,colSpan:5,children:l.empty})}):null]})]}),(0,e.jsx)("h3",{style:t.h3,children:l.newHeading}),(0,e.jsxs)(c.Form,{method:"post",style:t.card,children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"create"}),(0,e.jsx)(h,{label:l.roleKey,hint:l.hintRoleKey,children:(0,e.jsx)("input",{name:"roleKey","aria-label":"role_key",required:!0,style:t.input})}),(0,e.jsx)(h,{label:l.name,children:(0,e.jsx)("input",{name:"name","aria-label":"name",required:!0,style:t.input})}),(0,e.jsx)(h,{label:l.description,hint:s.optional,children:(0,e.jsx)("input",{name:"description","aria-label":"description",style:t.input})}),(0,e.jsx)("button",{type:"submit",style:t.primary,children:s.add})]})]})}function W(){let{resources:o,labels:r}=(0,c.useLoaderData)(),n=r.resources,l=r.common;return(0,e.jsxs)("section",{children:[(0,e.jsx)("h2",{style:t.h2,children:n.heading}),(0,e.jsx)(v,{message:k((0,c.useActionData)())}),(0,e.jsx)("p",{style:t.note,children:n.note}),(0,e.jsxs)("table",{style:t.table,children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{style:t.th,children:n.appKey}),(0,e.jsx)("th",{style:t.th,children:n.resourceKey}),(0,e.jsx)("th",{style:t.th,children:n.name}),(0,e.jsx)("th",{style:t.th,children:n.description}),(0,e.jsx)("th",{style:t.th})]})}),(0,e.jsxs)("tbody",{children:[o.map(s=>(0,e.jsxs)("tr",{children:[(0,e.jsx)("td",{style:t.td,children:(0,e.jsx)("span",{style:t.code,children:s.appKey})}),(0,e.jsx)("td",{style:t.td,children:(0,e.jsx)("span",{style:t.code,children:s.resourceKey})}),(0,e.jsx)("td",{style:t.td,children:(0,e.jsx)("input",{name:"name",defaultValue:s.name,form:`save-res-${s.id}`,"aria-label":`name-${s.id}`,required:!0,style:t.input})}),(0,e.jsx)("td",{style:t.td,children:(0,e.jsx)("input",{name:"description",defaultValue:s.description??"",form:`save-res-${s.id}`,"aria-label":`description-${s.id}`,style:t.input})}),(0,e.jsxs)("td",{style:{...t.td,whiteSpace:"nowrap"},children:[(0,e.jsxs)(c.Form,{method:"post",id:`save-res-${s.id}`,style:{display:"inline"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"save"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:s.id}),(0,e.jsx)("button",{type:"submit",style:t.save,children:l.save})]}),(0,e.jsxs)(c.Form,{method:"post",style:{display:"inline",marginLeft:"0.4rem"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"delete"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:s.id}),(0,e.jsx)("button",{type:"submit",style:t.danger,children:l.delete})]})]})]},s.id)),o.length===0?(0,e.jsx)("tr",{children:(0,e.jsx)("td",{style:t.empty,colSpan:5,children:n.empty})}):null]})]}),(0,e.jsx)("h3",{style:t.h3,children:n.newHeading}),(0,e.jsxs)(c.Form,{method:"post",style:t.card,children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"create"}),(0,e.jsx)(h,{label:n.appKey,hint:n.hintAppKey,children:(0,e.jsx)("input",{name:"appKey","aria-label":"app_key",required:!0,style:t.input})}),(0,e.jsx)(h,{label:n.resourceKey,hint:n.hintResourceKey,children:(0,e.jsx)("input",{name:"resourceKey","aria-label":"resource_key",required:!0,style:t.input})}),(0,e.jsx)(h,{label:n.name,children:(0,e.jsx)("input",{name:"name","aria-label":"name",required:!0,style:t.input})}),(0,e.jsx)(h,{label:n.description,hint:l.optional,children:(0,e.jsx)("input",{name:"description","aria-label":"description",style:t.input})}),(0,e.jsx)("button",{type:"submit",style:t.primary,children:l.add})]})]})}function M(){let{grants:o,roles:r,resources:n,labels:l}=(0,c.useLoaderData)(),s=l.grants,u=l.common;return(0,e.jsxs)("section",{children:[(0,e.jsx)("h2",{style:t.h2,children:s.heading}),(0,e.jsx)("p",{style:t.note,children:s.note}),(0,e.jsx)(v,{message:k((0,c.useActionData)())}),(0,e.jsxs)("table",{style:t.table,children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{style:t.th,children:s.role}),(0,e.jsx)("th",{style:t.th,children:s.resource}),(0,e.jsx)("th",{style:t.th,children:s.action}),(0,e.jsx)("th",{style:t.th,children:s.rowScope}),(0,e.jsx)("th",{style:t.th,children:s.columnScope}),(0,e.jsx)("th",{style:t.th})]})}),(0,e.jsxs)("tbody",{children:[o.map(i=>(0,e.jsxs)("tr",{children:[(0,e.jsx)("td",{style:t.td,children:(0,e.jsx)("span",{style:t.code,children:i.roleKey})}),(0,e.jsx)("td",{style:t.td,children:(0,e.jsxs)("span",{style:t.code,children:[i.appKey,":",i.resourceKey]})}),(0,e.jsx)("td",{style:t.td,children:i.action}),(0,e.jsx)("td",{style:t.td,children:(0,e.jsx)("textarea",{name:"rowScope",defaultValue:i.rowScope??"",form:`save-grant-${i.id}`,"aria-label":`row_scope-${i.id}`,rows:2,placeholder:s.rowScopePlaceholder,style:t.textarea})}),(0,e.jsx)("td",{style:t.td,children:(0,e.jsx)("textarea",{name:"columnScope",defaultValue:i.columnScope??"",form:`save-grant-${i.id}`,"aria-label":`column_scope-${i.id}`,rows:2,placeholder:s.columnScopePlaceholder,style:t.textarea})}),(0,e.jsxs)("td",{style:{...t.td,whiteSpace:"nowrap"},children:[(0,e.jsxs)(c.Form,{method:"post",id:`save-grant-${i.id}`,style:{display:"inline"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"save"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:i.id}),(0,e.jsx)("button",{type:"submit",style:t.save,children:u.save})]}),(0,e.jsxs)(c.Form,{method:"post",style:{display:"inline",marginLeft:"0.4rem"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"delete"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:i.id}),(0,e.jsx)("button",{type:"submit",style:t.danger,children:u.delete})]})]})]},i.id)),o.length===0?(0,e.jsx)("tr",{children:(0,e.jsx)("td",{style:t.empty,colSpan:6,children:s.empty})}):null]})]}),(0,e.jsx)("h3",{style:t.h3,children:s.newHeading}),(0,e.jsxs)(c.Form,{method:"post",style:t.card,children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"create"}),(0,e.jsx)(h,{label:s.role,children:(0,e.jsxs)("select",{name:"roleId","aria-label":"role",required:!0,style:t.select,children:[(0,e.jsx)("option",{value:"",children:s.selectPlaceholder}),r.map(i=>(0,e.jsx)("option",{value:i.id,children:i.roleKey},i.id))]})}),(0,e.jsx)(h,{label:s.resource,children:(0,e.jsxs)("select",{name:"resourceId","aria-label":"resource",required:!0,style:t.select,children:[(0,e.jsx)("option",{value:"",children:s.selectPlaceholder}),n.map(i=>(0,e.jsxs)("option",{value:i.id,children:[i.appKey,":",i.resourceKey]},i.id))]})}),(0,e.jsx)(h,{label:s.action,children:(0,e.jsx)("select",{name:"action","aria-label":"action",required:!0,style:t.select,children:V.AUTHZ_ACTIONS.map(i=>(0,e.jsx)("option",{value:i,children:i},i))})}),(0,e.jsx)(h,{label:s.rowScope,hint:s.rowScopeHint,children:(0,e.jsx)("textarea",{name:"rowScope","aria-label":"row_scope",rows:2,style:t.textarea,placeholder:'{"filters":[{"field":"\u90E8\u9580CD","op":"in","values":["A"]}]}'})}),(0,e.jsx)(h,{label:s.columnScope,hint:s.columnScopeHint,children:(0,e.jsx)("textarea",{name:"columnScope","aria-label":"column_scope",rows:2,style:t.textarea,placeholder:'{"mode":"deny","columns":["\u91D1\u984D"]}'})}),(0,e.jsx)("button",{type:"submit",style:t.primary,children:u.grant})]})]})}function B(){let{assignments:o,roles:r,users:n,actorUserId:l,selfAdminRoleIds:s,labels:u}=(0,c.useLoaderData)(),i=u.userRoles,g=u.common,b=new Set(s??[]);return(0,e.jsxs)("section",{children:[(0,e.jsx)("h2",{style:t.h2,children:i.heading}),(0,e.jsx)(v,{message:k((0,c.useActionData)())}),(0,e.jsxs)("table",{style:t.table,children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{style:t.th,children:i.user}),(0,e.jsx)("th",{style:t.th,children:i.role}),(0,e.jsx)("th",{style:t.th})]})}),(0,e.jsxs)("tbody",{children:[o.map(m=>(0,e.jsxs)("tr",{children:[(0,e.jsxs)("td",{style:t.td,children:[m.email,(0,e.jsxs)("span",{style:t.muted,children:["\uFF08",m.displayName,"\uFF09"]})]}),(0,e.jsx)("td",{style:t.td,children:m.roleKey}),(0,e.jsx)("td",{style:t.td,children:(0,e.jsxs)(c.Form,{method:"post",style:{display:"inline"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"remove"}),(0,e.jsx)("input",{type:"hidden",name:"userId",value:m.userId}),(0,e.jsx)("input",{type:"hidden",name:"roleId",value:m.roleId}),(0,e.jsx)("button",{type:"submit",style:t.danger,onClick:q(m.userId===l&&b.has(m.roleId),u.warn.selfAssignmentRemove),children:g.remove})]})})]},`${m.userId}-${m.roleId}`)),o.length===0?(0,e.jsx)("tr",{children:(0,e.jsx)("td",{style:t.empty,colSpan:3,children:i.empty})}):null]})]}),(0,e.jsx)("h3",{style:t.h3,children:i.newHeading}),(0,e.jsxs)(c.Form,{method:"post",style:t.card,children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"assign"}),(0,e.jsx)(h,{label:i.user,children:(0,e.jsxs)("select",{name:"userId","aria-label":"user",required:!0,style:t.select,children:[(0,e.jsx)("option",{value:"",children:i.selectPlaceholder}),n.map(m=>(0,e.jsx)("option",{value:m.id,children:m.email},m.id))]})}),(0,e.jsx)(h,{label:i.role,children:(0,e.jsxs)("select",{name:"roleId","aria-label":"role",required:!0,style:t.select,children:[(0,e.jsx)("option",{value:"",children:i.selectPlaceholder}),r.map(m=>(0,e.jsx)("option",{value:m.id,children:m.roleKey},m.id))]})}),(0,e.jsx)("button",{type:"submit",style:t.primary,children:g.assign})]})]})}var ne={roles:F,resources:W,role_permissions:M,user_roles:B};function ie(){let{segment:o}=(0,c.useLoaderData)(),r=ne[o]??F;return(0,e.jsx)(H,{children:(0,e.jsx)(r,{})})}var P=require("@aiquants/authz-core"),O=require("react-router");function J(o,r){let n=(0,P.can)(r,"read"),l=(0,P.can)(r,"create"),s=(0,P.can)(r,"update"),u=(0,P.can)(r,"delete"),i=r?.scopeByAction.read,g=n&&!!i&&(i.rowScope!==null||i.columnScope!==null);return{resourceKey:o,read:n,create:l,update:s,delete:u,write:l||s,readPartial:g,actions:r?Array.from(r.actions):[]}}function ae(o){async function r(l,s,u){let i=u?.failureRedirect?()=>{throw(0,O.redirect)(u.failureRedirect)}:o.onDeny;return(0,P.createRequirePermission)({resolveUserId:o.resolveUserId,getEffectivePermissions:o.getEffectivePermissions,onDeny:i})(l,{appKey:o.appKey,resourceKey:s.resourceKey,action:s.action})}async function n(l,s){let u=await o.resolveUserId(l),i={};for(let g of s.resourceKeys){let b=u==null?null:await o.getEffectivePermissions({userId:u,appKey:o.appKey,resourceKey:g});i[g]=J(g,b)}return i}return{requirePermission:r,getMyPermissions:n}}0&&(module.exports={AuthzAdminAppView,AuthzErrorBoundary,AuthzGrantsView,AuthzLayout,AuthzResourcesView,AuthzRolesView,AuthzUserRolesView,ErrorAlert,Field,MyPermissionIndicator,createAuthz,createAuthzAdminApp,createAuthzAdminServer,defaultAuthzAdminLabels,makeAuthzErrorBoundary,resolveLabels,toPermissionView,ui,usePermission});
|
|
1
|
+
"use strict";var L=Object.defineProperty;var Q=Object.getOwnPropertyDescriptor;var Y=Object.getOwnPropertyNames;var Z=Object.prototype.hasOwnProperty;var X=(o,r)=>{for(var n in r)L(o,n,{get:r[n],enumerable:!0})},j=(o,r,n,l)=>{if(r&&typeof r=="object"||typeof r=="function")for(let s of Y(r))!Z.call(o,s)&&s!==n&&L(o,s,{get:()=>r[s],enumerable:!(l=Q(r,s))||l.enumerable});return o};var ee=o=>j(L({},"__esModule",{value:!0}),o);var le={};X(le,{AuthzAdminAppView:()=>ie,AuthzErrorBoundary:()=>oe,AuthzGrantsView:()=>M,AuthzLayout:()=>se,AuthzResourcesView:()=>W,AuthzRolesView:()=>F,AuthzUserRolesView:()=>B,ErrorAlert:()=>v,Field:()=>b,MyPermissionIndicator:()=>U,createAuthz:()=>ae,createAuthzAdminApp:()=>re,createAuthzAdminServer:()=>_,defaultAuthzAdminLabels:()=>$,makeAuthzErrorBoundary:()=>G,resolveLabels:()=>K,toPermissionView:()=>J,ui:()=>t,usePermission:()=>E});module.exports=ee(le);var k=require("react-router");var I=require("@aiquants/authz-core"),A=require("react-router");var $={title:"Authorization (RBAC)",myPermission:"Your permissions",tabs:{roles:"Roles",resources:"Resources",role_permissions:"Permissions",user_roles:"User assignments"},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)",user:"user",role:"role",empty:"No assignments",newHeading:"Assign a role",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 K(o){let r=$;return o?{title:o.title??r.title,myPermission:o.myPermission??r.myPermission,tabs:{...r.tabs,...o.tabs},common:{...r.common,...o.common},roles:{...r.roles,...o.roles},resources:{...r.resources,...o.resources},grants:{...r.grants,...o.grants},userRoles:{...r.userRoles,...o.userRoles},error:{...r.error,...o.error},warn:{...r.warn,...o.warn}}:r}var te=o=>o instanceof Response;function x(o){if(te(o))throw o;if(o instanceof I.AuthzDeniedError)throw new Response(o.message,{status:403});return(0,A.data)({error:o instanceof Error?o.message:"\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F"},{status:400})}function _(o){let r=o.store,n=o.resourceKey??"authz_admin",l=K(o.labels),s=async(d,a)=>{let{userId:h}=await o.requirePermission(d,a);if(h==null)throw new I.AuthzDeniedError({appKey:"",resourceKey:a.resourceKey,action:a.action,reason:"unresolved-user",userId:null});return{userId:h}};async function u(d){await o.requireUser(d);try{return await s(d,{resourceKey:n,action:"read"})}catch(a){throw a instanceof I.AuthzDeniedError?new Response(`Forbidden: ${n}`,{status:403}):a}}let i=d=>o.getMyPermissions(d,{resourceKeys:[n]}),g=async d=>{let[a,h]=await Promise.all([r.listRoles(),r.getSelfAdminContext(Number(d))]);return{roles:a,selfAdminRoleIds:h.selfAdminRoleIds,labels:l}},f=async()=>({resources:await r.listResources(),labels:l}),c=async()=>{let[d,a,h]=await Promise.all([r.listGrants(),r.listRoles(),r.listResources()]);return{grants:d,roles:a,resources:h,labels:l}},R=async d=>{let[a,h,p,y]=await Promise.all([r.listUserRoles(),r.listRoles(),r.listUsers(),r.getSelfAdminContext(Number(d))]);return{assignments:a,roles:h,users:p,actorUserId:y.actorUserId,selfAdminRoleIds:y.selfAdminRoleIds,labels:l}};return{labels:l,resourceKey:n,layoutGuard:u,loadMyPermissions:i,layout:{async loader({request:d}){return await u(d),{myPermissions:await i(d),labels:l,adminResourceKey:n}}},index:{loader(){throw(0,A.redirect)("/authz/roles")}},roles:{data:g,async loader({request:d}){let{userId:a}=await s(d,{resourceKey:n,action:"read"});return g(a)},async action({request:d}){let a=await d.formData(),h=String(a.get("_action"));try{switch(h){case"create":{let{userId:p}=await s(d,{resourceKey:n,action:"create"}),y=String(a.get("roleKey")??"").trim(),w=String(a.get("name")??"").trim();return y&&w?(await r.createRole({roleKey:y,name:w,description:String(a.get("description")??"").trim()||null},String(p)),{ok:!0}):(0,A.data)({error:"role_key \u3068 name \u306F\u5FC5\u9808\u3067\u3059"},{status:400})}case"save":{let{userId:p}=await s(d,{resourceKey:n,action:"update"}),y=String(a.get("name")??"").trim();return y?(await r.updateRole(Number(a.get("id")),{name:y,description:String(a.get("description")??"").trim()||null},String(p)),{ok:!0}):(0,A.data)({error:"name \u306F\u5FC5\u9808\u3067\u3059"},{status:400})}case"toggle":{let{userId:p}=await s(d,{resourceKey:n,action:"update"});return await r.setRoleActive(Number(a.get("id")),a.get("isActive")==="true",String(p)),{ok:!0}}case"delete":return await s(d,{resourceKey:n,action:"delete"}),await r.deleteRole(Number(a.get("id"))),{ok:!0};default:return(0,A.data)({error:"unknown action"},{status:400})}}catch(p){return x(p)}}},resources:{data:f,async loader({request:d}){return await s(d,{resourceKey:n,action:"read"}),f()},async action({request:d}){let a=await d.formData(),h=String(a.get("_action"));try{switch(h){case"create":{let{userId:p}=await s(d,{resourceKey:n,action:"create"}),y=String(a.get("appKey")??"").trim(),w=String(a.get("resourceKey")??"").trim(),C=String(a.get("name")??"").trim();return y&&w&&C?(await r.createResource({appKey:y,resourceKey:w,name:C,description:String(a.get("description")??"").trim()||null},String(p)),{ok:!0}):(0,A.data)({error:"app_key / resource_key / name \u306F\u5FC5\u9808\u3067\u3059"},{status:400})}case"save":{let{userId:p}=await s(d,{resourceKey:n,action:"update"}),y=String(a.get("name")??"").trim();return y?(await r.updateResource(Number(a.get("id")),{name:y,description:String(a.get("description")??"").trim()||null},String(p)),{ok:!0}):(0,A.data)({error:"name \u306F\u5FC5\u9808\u3067\u3059"},{status:400})}case"delete":return await s(d,{resourceKey:n,action:"delete"}),await r.deleteResource(Number(a.get("id"))),{ok:!0};default:return(0,A.data)({error:"unknown action"},{status:400})}}catch(p){return x(p)}}},grants:{data:c,async loader({request:d}){return await s(d,{resourceKey:n,action:"read"}),c()},async action({request:d}){let a=await d.formData(),h=String(a.get("_action"));try{switch(h){case"create":{let{userId:p}=await s(d,{resourceKey:n,action:"create"}),y=Number(a.get("roleId")),w=Number(a.get("resourceId"));return y&&w?(await r.createGrant({roleId:y,resourceId:w,action:String(a.get("action")??""),rowScope:String(a.get("rowScope")??""),columnScope:String(a.get("columnScope")??"")},String(p)),{ok:!0}):(0,A.data)({error:"\u30ED\u30FC\u30EB\u3068\u30EA\u30BD\u30FC\u30B9\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044"},{status:400})}case"save":{let{userId:p}=await s(d,{resourceKey:n,action:"update"});return await r.updateGrant(Number(a.get("id")),{rowScope:String(a.get("rowScope")??""),columnScope:String(a.get("columnScope")??"")},String(p)),{ok:!0}}case"delete":return await s(d,{resourceKey:n,action:"delete"}),await r.deleteGrant(Number(a.get("id"))),{ok:!0};default:return(0,A.data)({error:"unknown action"},{status:400})}}catch(p){return x(p)}}},userRoles:{data:R,async loader({request:d}){let{userId:a}=await s(d,{resourceKey:n,action:"read"});return R(a)},async action({request:d}){let a=await d.formData(),h=String(a.get("_action"));try{switch(h){case"assign":{let{userId:p}=await s(d,{resourceKey:n,action:"create"}),y=Number(a.get("userId")),w=Number(a.get("roleId"));return y&&w?(await r.assignUserRole(y,w,String(p)),{ok:!0}):(0,A.data)({error:"\u30E6\u30FC\u30B6\u30FC\u3068\u30ED\u30FC\u30EB\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044"},{status:400})}case"remove":return await s(d,{resourceKey:n,action:"delete"}),await r.removeUserRole(Number(a.get("userId")),Number(a.get("roleId"))),{ok:!0};default:return(0,A.data)({error:"unknown action"},{status:400})}}catch(p){return x(p)}}}}}function T(o){return String(o["*"]??"").split("/")[0]}function re(o){let r=_(o),n=o.basePath??"/authz",l=["roles","resources","role_permissions","user_roles"],s={roles:r.roles.data,resources:r.resources.data,role_permissions:r.grants.data,user_roles:r.userRoles.data},u={roles:r.roles.action,resources:r.resources.action,role_permissions:r.grants.action,user_roles:r.userRoles.action};async function i(f){let c=T(f.params);if(!l.includes(c))throw(0,k.redirect)(`${n}/roles`);let{userId:R}=await r.layoutGuard(f.request),[d,a]=await Promise.all([r.loadMyPermissions(f.request),s[c](R)]);return{segment:c,basePath:n,myPermissions:d,adminResourceKey:r.resourceKey,...a}}async function g(f){let c=T(f.params),R=u[c];return R?R(f):(0,k.data)({error:"unknown action"},{status:400})}return{loader:i,action:g,server:r}}var z=require("react/jsx-runtime"),t={page:{padding:"1.25rem",maxWidth:1120,margin:"0 auto",color:"#0f172a"},table:{borderCollapse:"collapse",width:"100%",fontSize:"0.9rem"},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"},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 b({label:o,hint:r,children:n}){return(0,z.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"0.3rem"},children:[(0,z.jsxs)("span",{style:{fontSize:"0.8rem",color:"#475569",fontWeight:600},children:[o,r?(0,z.jsxs)("span",{style:{fontWeight:400,color:"#94a3b8"},children:[" \u2014 ",r]}):null]}),n]})}function v({message:o}){return o?(0,z.jsx)("p",{role:"alert",style:{color:"#dc2626",background:"#fef2f2",border:"1px solid #fecaca",borderRadius:8,padding:"0.55rem 0.8rem",fontSize:"0.85rem",margin:"0.25rem 0"},children:o}):null}var V=require("@aiquants/authz-core"),m=require("react-router");function E(o){let r=o?.read?o.readPartial?"partial":"full":"none",n=o?.create&&o?.update?"full":o?.create||o?.update?"partial":"none",l=o?.delete?"full":"none";return{canRead:!!o?.read,canWrite:!!o?.write,canDelete:!!o?.delete,readState:r,writeState:n,deleteState:l}}var S=require("react/jsx-runtime"),N={full:"\u25CB",partial:"\u25B3",none:"\xD7"};function U({permission:o,labels:r,showScopeSummary:n=!0,className:l="authz-permission-indicator"}){let s=E(o),u={read:r?.read??"\u8AAD",write:r?.write??"\u66F8",delete:r?.delete??"\u524A\u9664"};return(0,S.jsxs)("span",{className:l,"data-resource":o?.resourceKey??"",children:[(0,S.jsxs)("span",{"data-perm":"read",title:`${u.read}: ${s.readState}`,children:[u.read,N[s.readState]]}),(0,S.jsxs)("span",{"data-perm":"write",title:`${u.write}: ${s.writeState}`,children:[u.write,N[s.writeState]]}),(0,S.jsxs)("span",{"data-perm":"delete",title:`${u.delete}: ${s.deleteState}`,children:[u.delete,N[s.deleteState]]}),n&&s.readState==="partial"?(0,S.jsx)("span",{"data-perm":"scope",children:"\uFF08\u90E8\u5206\uFF09"}):null]})}var e=require("react/jsx-runtime"),D=o=>o?.error;function H({children:o}){let{myPermissions:r,labels:n,adminResourceKey:l,basePath:s}=(0,m.useLoaderData)(),u=s??"/authz",i=[["roles",n.tabs.roles],["resources",n.tabs.resources],["role_permissions",n.tabs.role_permissions],["user_roles",n.tabs.user_roles]];return(0,e.jsxs)("div",{className:"authz-admin",style:t.page,children:[(0,e.jsxs)("header",{style:{display:"flex",alignItems:"baseline",justifyContent:"space-between",gap:"1rem",flexWrap:"wrap"},children:[(0,e.jsx)("h1",{style:{fontSize:"1.3rem",margin:0,fontWeight:700},children:n.title}),(0,e.jsxs)("span",{style:{fontSize:"0.82rem",color:"#475569",display:"inline-flex",alignItems:"center",gap:"0.4rem"},children:[n.myPermission,": ",(0,e.jsx)(U,{permission:r[l]})]})]}),(0,e.jsx)("nav",{style:{display:"flex",gap:"0.25rem",borderBottom:"1px solid #e2e8f0",margin:"0.9rem 0 1.25rem"},children:i.map(([g,f])=>(0,e.jsx)(m.NavLink,{to:`${u}/${g}`,style:({isActive:c})=>({padding:"0.5rem 0.9rem",textDecoration:"none",color:c?"#2563eb":"#475569",borderBottom:c?"2px solid #2563eb":"2px solid transparent",marginBottom:-1,fontWeight:c?700:500,fontSize:"0.92rem"}),children:f},g))}),o]})}function se(){return(0,e.jsx)(H,{children:(0,e.jsx)(m.Outlet,{})})}function G(o){let r=K(o).error;return function(){let l=(0,m.useRouteError)(),s=(0,m.isRouteErrorResponse)(l)?l:null,u=s?.status===403,i=u?r.forbiddenTitle:s?`${r.genericTitlePrefix} (${s.status})`:r.genericTitle,g=u?r.forbiddenBody:s?typeof s.data=="string"&&s.data?s.data:s.statusText:r.genericBody;return(0,e.jsx)("div",{style:t.page,children:(0,e.jsxs)("div",{role:"alert",style:{maxWidth:480,margin:"3rem auto",padding:"1.5rem",border:"1px solid #fecaca",borderRadius:12,background:"#fef2f2"},children:[(0,e.jsx)("h1",{style:{fontSize:"1.1rem",fontWeight:700,color:"#b91c1c",margin:"0 0 0.5rem"},children:i}),(0,e.jsx)("p",{style:{color:"#7f1d1d",fontSize:"0.9rem",margin:0,lineHeight:1.7},children:g})]})})}}var oe=G(),q=(o,r)=>n=>{o&&!window.confirm(r)&&n.preventDefault()};function F(){let{roles:o,selfAdminRoleIds:r,labels:n}=(0,m.useLoaderData)(),l=n.roles,s=n.common,u=new Set(r??[]);return(0,e.jsxs)("section",{children:[(0,e.jsx)("h2",{style:t.h2,children:l.heading}),(0,e.jsx)(v,{message:D((0,m.useActionData)())}),(0,e.jsx)("p",{style:t.note,children:l.note}),(0,e.jsxs)("table",{style:t.table,children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{style:t.th,children:l.roleKey}),(0,e.jsx)("th",{style:t.th,children:l.name}),(0,e.jsx)("th",{style:t.th,children:l.description}),(0,e.jsx)("th",{style:t.th,children:l.activeHeader}),(0,e.jsx)("th",{style:t.th})]})}),(0,e.jsxs)("tbody",{children:[o.map(i=>(0,e.jsxs)("tr",{children:[(0,e.jsx)("td",{style:t.td,children:(0,e.jsx)("span",{style:t.code,children:i.roleKey})}),(0,e.jsx)("td",{style:t.td,children:(0,e.jsx)("input",{name:"name",defaultValue:i.name,form:`save-role-${i.id}`,"aria-label":`name-${i.id}`,required:!0,style:t.input})}),(0,e.jsx)("td",{style:t.td,children:(0,e.jsx)("input",{name:"description",defaultValue:i.description??"",form:`save-role-${i.id}`,"aria-label":`description-${i.id}`,style:t.input})}),(0,e.jsx)("td",{style:t.td,children:(0,e.jsxs)(m.Form,{method:"post",style:{display:"inline"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"toggle"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:i.id}),(0,e.jsx)("input",{type:"hidden",name:"isActive",value:String(!i.isActive)}),(0,e.jsx)("button",{type:"submit",style:t.button,onClick:i.isActive?q(u.has(i.id),n.warn.selfRoleDisable):void 0,children:i.isActive?s.active:s.inactive})]})}),(0,e.jsxs)("td",{style:{...t.td,whiteSpace:"nowrap"},children:[(0,e.jsxs)(m.Form,{method:"post",id:`save-role-${i.id}`,style:{display:"inline"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"save"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:i.id}),(0,e.jsx)("button",{type:"submit",style:t.save,children:s.save})]}),(0,e.jsxs)(m.Form,{method:"post",style:{display:"inline",marginLeft:"0.4rem"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"delete"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:i.id}),(0,e.jsx)("button",{type:"submit",style:t.danger,onClick:q(u.has(i.id),n.warn.selfRoleDelete),children:s.delete})]})]})]},i.id)),o.length===0?(0,e.jsx)("tr",{children:(0,e.jsx)("td",{style:t.empty,colSpan:5,children:l.empty})}):null]})]}),(0,e.jsx)("h3",{style:t.h3,children:l.newHeading}),(0,e.jsxs)(m.Form,{method:"post",style:t.card,children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"create"}),(0,e.jsx)(b,{label:l.roleKey,hint:l.hintRoleKey,children:(0,e.jsx)("input",{name:"roleKey","aria-label":"role_key",required:!0,style:t.input})}),(0,e.jsx)(b,{label:l.name,children:(0,e.jsx)("input",{name:"name","aria-label":"name",required:!0,style:t.input})}),(0,e.jsx)(b,{label:l.description,hint:s.optional,children:(0,e.jsx)("input",{name:"description","aria-label":"description",style:t.input})}),(0,e.jsx)("button",{type:"submit",style:t.primary,children:s.add})]})]})}function W(){let{resources:o,labels:r}=(0,m.useLoaderData)(),n=r.resources,l=r.common;return(0,e.jsxs)("section",{children:[(0,e.jsx)("h2",{style:t.h2,children:n.heading}),(0,e.jsx)(v,{message:D((0,m.useActionData)())}),(0,e.jsx)("p",{style:t.note,children:n.note}),(0,e.jsxs)("table",{style:t.table,children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{style:t.th,children:n.appKey}),(0,e.jsx)("th",{style:t.th,children:n.resourceKey}),(0,e.jsx)("th",{style:t.th,children:n.name}),(0,e.jsx)("th",{style:t.th,children:n.description}),(0,e.jsx)("th",{style:t.th})]})}),(0,e.jsxs)("tbody",{children:[o.map(s=>(0,e.jsxs)("tr",{children:[(0,e.jsx)("td",{style:t.td,children:(0,e.jsx)("span",{style:t.code,children:s.appKey})}),(0,e.jsx)("td",{style:t.td,children:(0,e.jsx)("span",{style:t.code,children:s.resourceKey})}),(0,e.jsx)("td",{style:t.td,children:(0,e.jsx)("input",{name:"name",defaultValue:s.name,form:`save-res-${s.id}`,"aria-label":`name-${s.id}`,required:!0,style:t.input})}),(0,e.jsx)("td",{style:t.td,children:(0,e.jsx)("input",{name:"description",defaultValue:s.description??"",form:`save-res-${s.id}`,"aria-label":`description-${s.id}`,style:t.input})}),(0,e.jsxs)("td",{style:{...t.td,whiteSpace:"nowrap"},children:[(0,e.jsxs)(m.Form,{method:"post",id:`save-res-${s.id}`,style:{display:"inline"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"save"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:s.id}),(0,e.jsx)("button",{type:"submit",style:t.save,children:l.save})]}),(0,e.jsxs)(m.Form,{method:"post",style:{display:"inline",marginLeft:"0.4rem"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"delete"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:s.id}),(0,e.jsx)("button",{type:"submit",style:t.danger,children:l.delete})]})]})]},s.id)),o.length===0?(0,e.jsx)("tr",{children:(0,e.jsx)("td",{style:t.empty,colSpan:5,children:n.empty})}):null]})]}),(0,e.jsx)("h3",{style:t.h3,children:n.newHeading}),(0,e.jsxs)(m.Form,{method:"post",style:t.card,children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"create"}),(0,e.jsx)(b,{label:n.appKey,hint:n.hintAppKey,children:(0,e.jsx)("input",{name:"appKey","aria-label":"app_key",required:!0,style:t.input})}),(0,e.jsx)(b,{label:n.resourceKey,hint:n.hintResourceKey,children:(0,e.jsx)("input",{name:"resourceKey","aria-label":"resource_key",required:!0,style:t.input})}),(0,e.jsx)(b,{label:n.name,children:(0,e.jsx)("input",{name:"name","aria-label":"name",required:!0,style:t.input})}),(0,e.jsx)(b,{label:n.description,hint:l.optional,children:(0,e.jsx)("input",{name:"description","aria-label":"description",style:t.input})}),(0,e.jsx)("button",{type:"submit",style:t.primary,children:l.add})]})]})}function M(){let{grants:o,roles:r,resources:n,labels:l}=(0,m.useLoaderData)(),s=l.grants,u=l.common;return(0,e.jsxs)("section",{children:[(0,e.jsx)("h2",{style:t.h2,children:s.heading}),(0,e.jsx)("p",{style:t.note,children:s.note}),(0,e.jsx)(v,{message:D((0,m.useActionData)())}),(0,e.jsxs)("table",{style:t.table,children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{style:t.th,children:s.role}),(0,e.jsx)("th",{style:t.th,children:s.resource}),(0,e.jsx)("th",{style:t.th,children:s.action}),(0,e.jsx)("th",{style:t.th,children:s.rowScope}),(0,e.jsx)("th",{style:t.th,children:s.columnScope}),(0,e.jsx)("th",{style:t.th})]})}),(0,e.jsxs)("tbody",{children:[o.map(i=>(0,e.jsxs)("tr",{children:[(0,e.jsx)("td",{style:t.td,children:(0,e.jsx)("span",{style:t.code,children:i.roleKey})}),(0,e.jsx)("td",{style:t.td,children:(0,e.jsxs)("span",{style:t.code,children:[i.appKey,":",i.resourceKey]})}),(0,e.jsx)("td",{style:t.td,children:i.action}),(0,e.jsx)("td",{style:t.td,children:(0,e.jsx)("textarea",{name:"rowScope",defaultValue:i.rowScope??"",form:`save-grant-${i.id}`,"aria-label":`row_scope-${i.id}`,rows:2,placeholder:s.rowScopePlaceholder,style:t.textarea})}),(0,e.jsx)("td",{style:t.td,children:(0,e.jsx)("textarea",{name:"columnScope",defaultValue:i.columnScope??"",form:`save-grant-${i.id}`,"aria-label":`column_scope-${i.id}`,rows:2,placeholder:s.columnScopePlaceholder,style:t.textarea})}),(0,e.jsxs)("td",{style:{...t.td,whiteSpace:"nowrap"},children:[(0,e.jsxs)(m.Form,{method:"post",id:`save-grant-${i.id}`,style:{display:"inline"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"save"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:i.id}),(0,e.jsx)("button",{type:"submit",style:t.save,children:u.save})]}),(0,e.jsxs)(m.Form,{method:"post",style:{display:"inline",marginLeft:"0.4rem"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"delete"}),(0,e.jsx)("input",{type:"hidden",name:"id",value:i.id}),(0,e.jsx)("button",{type:"submit",style:t.danger,children:u.delete})]})]})]},i.id)),o.length===0?(0,e.jsx)("tr",{children:(0,e.jsx)("td",{style:t.empty,colSpan:6,children:s.empty})}):null]})]}),(0,e.jsx)("h3",{style:t.h3,children:s.newHeading}),(0,e.jsxs)(m.Form,{method:"post",style:t.card,children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"create"}),(0,e.jsx)(b,{label:s.role,children:(0,e.jsxs)("select",{name:"roleId","aria-label":"role",required:!0,style:t.select,children:[(0,e.jsx)("option",{value:"",children:s.selectPlaceholder}),r.map(i=>(0,e.jsx)("option",{value:i.id,children:i.roleKey},i.id))]})}),(0,e.jsx)(b,{label:s.resource,children:(0,e.jsxs)("select",{name:"resourceId","aria-label":"resource",required:!0,style:t.select,children:[(0,e.jsx)("option",{value:"",children:s.selectPlaceholder}),n.map(i=>(0,e.jsxs)("option",{value:i.id,children:[i.appKey,":",i.resourceKey]},i.id))]})}),(0,e.jsx)(b,{label:s.action,children:(0,e.jsx)("select",{name:"action","aria-label":"action",required:!0,style:t.select,children:V.AUTHZ_ACTIONS.map(i=>(0,e.jsx)("option",{value:i,children:i},i))})}),(0,e.jsx)(b,{label:s.rowScope,hint:s.rowScopeHint,children:(0,e.jsx)("textarea",{name:"rowScope","aria-label":"row_scope",rows:2,style:t.textarea,placeholder:'{"filters":[{"field":"\u90E8\u9580CD","op":"in","values":["A"]}]}'})}),(0,e.jsx)(b,{label:s.columnScope,hint:s.columnScopeHint,children:(0,e.jsx)("textarea",{name:"columnScope","aria-label":"column_scope",rows:2,style:t.textarea,placeholder:'{"mode":"deny","columns":["\u91D1\u984D"]}'})}),(0,e.jsx)("button",{type:"submit",style:t.primary,children:u.grant})]})]})}function B(){let{assignments:o,roles:r,users:n,actorUserId:l,selfAdminRoleIds:s,labels:u}=(0,m.useLoaderData)(),i=u.userRoles,g=u.common,f=new Set(s??[]);return(0,e.jsxs)("section",{children:[(0,e.jsx)("h2",{style:t.h2,children:i.heading}),(0,e.jsx)(v,{message:D((0,m.useActionData)())}),(0,e.jsxs)("table",{style:t.table,children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{style:t.th,children:i.user}),(0,e.jsx)("th",{style:t.th,children:i.role}),(0,e.jsx)("th",{style:t.th})]})}),(0,e.jsxs)("tbody",{children:[o.map(c=>(0,e.jsxs)("tr",{children:[(0,e.jsxs)("td",{style:t.td,children:[c.email,(0,e.jsxs)("span",{style:t.muted,children:["\uFF08",c.displayName,"\uFF09"]})]}),(0,e.jsx)("td",{style:t.td,children:c.roleKey}),(0,e.jsx)("td",{style:t.td,children:(0,e.jsxs)(m.Form,{method:"post",style:{display:"inline"},children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"remove"}),(0,e.jsx)("input",{type:"hidden",name:"userId",value:c.userId}),(0,e.jsx)("input",{type:"hidden",name:"roleId",value:c.roleId}),(0,e.jsx)("button",{type:"submit",style:t.danger,onClick:q(c.userId===l&&f.has(c.roleId),u.warn.selfAssignmentRemove),children:g.remove})]})})]},`${c.userId}-${c.roleId}`)),o.length===0?(0,e.jsx)("tr",{children:(0,e.jsx)("td",{style:t.empty,colSpan:3,children:i.empty})}):null]})]}),(0,e.jsx)("h3",{style:t.h3,children:i.newHeading}),(0,e.jsxs)(m.Form,{method:"post",style:t.card,children:[(0,e.jsx)("input",{type:"hidden",name:"_action",value:"assign"}),(0,e.jsx)(b,{label:i.user,children:(0,e.jsxs)("select",{name:"userId","aria-label":"user",required:!0,style:t.select,children:[(0,e.jsx)("option",{value:"",children:i.selectPlaceholder}),n.map(c=>(0,e.jsx)("option",{value:c.id,children:c.email},c.id))]})}),(0,e.jsx)(b,{label:i.role,children:(0,e.jsxs)("select",{name:"roleId","aria-label":"role",required:!0,style:t.select,children:[(0,e.jsx)("option",{value:"",children:i.selectPlaceholder}),r.filter(c=>c.roleKey!=="@authenticated"&&c.roleKey!=="@anonymous").map(c=>(0,e.jsx)("option",{value:c.id,children:c.roleKey},c.id))]})}),(0,e.jsx)("button",{type:"submit",style:t.primary,children:g.assign})]})]})}var ne={roles:F,resources:W,role_permissions:M,user_roles:B};function ie(){let{segment:o}=(0,m.useLoaderData)(),r=ne[o]??F;return(0,e.jsx)(H,{children:(0,e.jsx)(r,{})})}var P=require("@aiquants/authz-core"),O=require("react-router");function J(o,r){let n=(0,P.can)(r,"read"),l=(0,P.can)(r,"create"),s=(0,P.can)(r,"update"),u=(0,P.can)(r,"delete"),i=r?.scopeByAction.read,g=n&&!!i&&(i.rowScope!==null||i.columnScope!==null);return{resourceKey:o,read:n,create:l,update:s,delete:u,write:l||s,readPartial:g,actions:r?Array.from(r.actions):[]}}function ae(o){async function r(l,s,u){let i=u?.failureRedirect?()=>{throw(0,O.redirect)(u.failureRedirect)}:o.onDeny;return(0,P.createRequirePermission)({resolveUserId:o.resolveUserId,getEffectivePermissions:o.getEffectivePermissions,onDeny:i})(l,{appKey:o.appKey,resourceKey:s.resourceKey,action:s.action})}async function n(l,s){let u=await o.resolveUserId(l),i={};for(let g of s.resourceKeys){let f=await o.getEffectivePermissions({userId:u??null,appKey:o.appKey,resourceKey:g});i[g]=J(g,f)}return i}return{requirePermission:r,getMyPermissions:n}}0&&(module.exports={AuthzAdminAppView,AuthzErrorBoundary,AuthzGrantsView,AuthzLayout,AuthzResourcesView,AuthzRolesView,AuthzUserRolesView,ErrorAlert,Field,MyPermissionIndicator,createAuthz,createAuthzAdminApp,createAuthzAdminServer,defaultAuthzAdminLabels,makeAuthzErrorBoundary,resolveLabels,toPermissionView,ui,usePermission});
|
|
2
2
|
//# sourceMappingURL=index.js.map
|