@spotify/backstage-plugin-rbac 0.5.6 → 0.5.7

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/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # @spotify/backstage-plugin-rbac
2
2
 
3
+ ## 0.5.7
4
+
5
+ ### Patch Changes
6
+
7
+ - Mark package as being free of side effects, allowing more optimized Webpack builds.
8
+ - Updated dependency `@testing-library/jest-dom` to `^6.0.0`.
9
+ - Upgraded Backstage to v1.18.1
10
+ - Updated dependencies
11
+ - Updated dependencies
12
+ - Updated dependencies
13
+ - @spotify/backstage-plugin-rbac-common@0.5.6
14
+ - @spotify/backstage-plugin-core@0.5.6
15
+
3
16
  ## 0.5.6
4
17
 
5
18
  ### Patch Changes
@@ -1,2 +1,2 @@
1
- import{useApi as i}from"@backstage/core-plugin-api";import e from"react";import u from"react-use/lib/useAsync";import{r as m}from"./index-1f39920c.esm.js";function p({children:n,loading:l=null,unauthorized:o=null}){var r;const a=i(m),t=u(()=>a.authorize(),[]);return t.loading?e.createElement(e.Fragment,null,l):(r=t.value)!=null&&r.authorized?e.createElement(e.Fragment,null,n):e.createElement(e.Fragment,null,o)}export{p as A};
2
- //# sourceMappingURL=Authorized-ac94e915.esm.js.map
1
+ import{useApi as i}from"@backstage/core-plugin-api";import e from"react";import u from"react-use/lib/useAsync";import{r as m}from"./index-72180512.esm.js";function p({children:n,loading:l=null,unauthorized:o=null}){var r;const a=i(m),t=u(()=>a.authorize(),[]);return t.loading?e.createElement(e.Fragment,null,l):(r=t.value)!=null&&r.authorized?e.createElement(e.Fragment,null,n):e.createElement(e.Fragment,null,o)}export{p as A};
2
+ //# sourceMappingURL=Authorized-051797a2.esm.js.map
@@ -1,2 +1,2 @@
1
- import t from"react";import e from"@material-ui/icons/Lock";import{SidebarItem as m}from"@backstage/core-components";import{A as i}from"./Authorized-ac94e915.esm.js";import"@backstage/core-plugin-api";import"react-use/lib/useAsync";import"./index-1f39920c.esm.js";import"@backstage/errors";function p({text:r="RBAC",...o}){return t.createElement(i,null,t.createElement(m,{icon:e,to:"rbac",text:r,...o}))}export{p as RBACSidebarItem};
2
- //# sourceMappingURL=RBACSidebarItem-a419895c.esm.js.map
1
+ import t from"react";import e from"@material-ui/icons/Lock";import{SidebarItem as m}from"@backstage/core-components";import{A as i}from"./Authorized-051797a2.esm.js";import"@backstage/core-plugin-api";import"react-use/lib/useAsync";import"./index-72180512.esm.js";import"@backstage/errors";function p({text:r="RBAC",...o}){return t.createElement(i,null,t.createElement(m,{icon:e,to:"rbac",text:r,...o}))}export{p as RBACSidebarItem};
2
+ //# sourceMappingURL=RBACSidebarItem-1be44d99.esm.js.map
@@ -0,0 +1,3 @@
1
+ import e,{createContext as Pe,useState as k,useCallback as R,useMemo as L,useContext as De,useEffect as _,Fragment as Ne,useRef as ne,Children as vt,isValidElement as we,useReducer as Rn,useLayoutEffect as $n}from"react";import{useNavigate as G,Link as In,useParams as Ve,Routes as On,Route as Ae}from"react-router-dom";import{useApi as I,configApiRef as Bn,alertApiRef as le,useRouteRef as Mn,useApp as Ue}from"@backstage/core-plugin-api";import ue from"react-use/lib/useAsync";import{isResourcePermission as _e}from"@backstage/plugin-permission-common";import{r as W,a as Ln}from"./index-72180512.esm.js";import{forEach as Fn,mapValues as jn,groupBy as Hn,uniq as Wn}from"lodash";import{Breadcrumbs as zn,Link as de,Page as Gn,Header as Vn,Content as Un,EmptyState as Te,Progress as Se,ErrorPanel as bt,Table as _n,ContentHeader as ke}from"@backstage/core-components";import Ct from"react-use/lib/useMount";import{makeStyles as N,Typography as C,Container as Yn,Grid as F,Button as w,Card as Y,CardContent as pe,Box as f,Chip as Re,Tooltip as fe,List as Jn,ListItem as xt,ListItemIcon as re,ListItemText as ae,CardActions as qn,Dialog as oe,DialogContent as K,DialogTitle as $e,TextField as Ee,DialogActions as Ye,CircularProgress as Pt,IconButton as z,Checkbox as Je,TableRow as V,TableCell as D,debounce as Kn,Table as qe,TableHead as Ke,TableBody as Qe,Tabs as Qn,Tab as Xn,FormControl as Xe,InputLabel as Ie,Select as Ze,MenuItem as U,Menu as Dt,FormControlLabel as Nt,FormHelperText as wt,Popper as Zn,Paper as el,Divider as et,DialogContentText as tl,ButtonBase as nl,CardHeader as At,ButtonGroup as ll,MenuList as tt,CardActionArea as rl,Radio as al}from"@material-ui/core";import{SpotifyLicenseBanner as ol,useAutoUpdatingRelativeTime as il,invariant as Oe}from"@spotify/backstage-plugin-core";import ie from"react-use/lib/useAsyncFn";import cl,{dump as sl}from"js-yaml";import{PolicyConfigParser as Be,isConditionalDecision as nt,isAllOfPermissionCriteria as ml,isAnyOfPermissionCriteria as ul,isNotPermissionCriteria as dl,isMatchingPermission as pl,BackstageUserPlaceholder as ye,RoleParser as fl,UpdateDraftRequestParser as El}from"@spotify/backstage-plugin-rbac-common";import{v4 as ce}from"uuid";import Tt from"lodash/keyBy";import yl from"lodash/isEqual";import St from"@material-ui/icons/ReportProblemOutlined";import gl from"@material-ui/icons/CalendarToday";import kt from"@material-ui/icons/Person";import hl from"@material-ui/icons/FiberManualRecord";import{DateTime as Me}from"luxon";import vl from"react-use/lib/useLocalStorage";import{saveAs as bl}from"file-saver";import Rt from"lodash/omit";import Cl from"lodash/pickBy";import lt from"@material-ui/icons/Close";import xl from"@material-ui/icons/Publish";import Pl from"@material-ui/icons/FilterNone";import{parseEntityRef as Q,DEFAULT_NAMESPACE as Dl}from"@backstage/catalog-model";import{humanizeEntityRef as Nl,catalogApiRef as wl}from"@backstage/plugin-catalog-react";import{Autocomplete as rt,ToggleButton as Al,ToggleButtonGroup as Tl}from"@material-ui/lab";import{List as Sl}from"react-virtualized";import ge from"@material-ui/icons/Delete";import kl from"@material-ui/icons/Group";import Rl from"@material-ui/icons/GroupWork";import $t from"@material-ui/icons/Info";import It from"ajv";import $l from"lodash/uniqBy";import{JSONEditor as Il,isTextContent as Ol,createAjvValidator as Bl,Mode as Ml}from"vanilla-jsoneditor";import at from"@material-ui/icons/Add";import Ll from"@material-ui/icons/Remove";import Fl from"@material-ui/icons/Edit";import jl from"@material-ui/icons/Check";import Hl from"@material-ui/icons/KeyboardArrowDown";import Wl from"@material-ui/icons/KeyboardArrowUp";import zl from"../images/no-permissions.svg";import Gl from"../images/no-roles.svg";import Vl from"@material-ui/icons/MoreHoriz";import Ul from"@material-ui/icons/Undo";import _l from"@material-ui/icons/Save";import Yl from"@material-ui/icons/Settings";import Jl from"@material-ui/icons/VerticalAlignTop";import{A as ql}from"./Authorized-051797a2.esm.js";import"@backstage/errors";const Ot=Pe(null),Kl=({children:t})=>{const n=I(Bn),l=I(W),a=I(le),[r,o]=k(null),i=R(async()=>{var s;if(!r){const m=await l.fetchAllPermissionMetadata((s=n.getOptionalStringArray("permission.permissionedPlugins"))!=null?s:[]),c=Xl(m.rules);Fn(c,d=>{d.length!==1&&a.post({message:`The plugin(s) ${d.slice(1).join(", ")} expose rules which are conflicting with rules exposed by the ${d[0]} plugin. These rules will not be available for use. Please contact RBAC support if you need assistance resolving this issue.`,severity:"error"})});const p=Zl(m,c);return o(p),p}return r},[a,r,l,n]);return e.createElement(Ot.Provider,{value:L(()=>({getMetadata:i}),[i])},t)};function Le(){const t=De(Ot),{value:n}=ue(async()=>t==null?void 0:t.getMetadata(),[t]);return n}function Bt(){var t;const n=Le();return(t=n==null?void 0:n.rules)!=null?t:null}function Mt(){var t;const n=Le();return(t=n==null?void 0:n.permissions)!=null?t:null}function Lt(){const t=Le();return t?[...new Set(t.permissions.filter(n=>_e(n)).map(({resourceType:n})=>n))]:null}function Ql(){const t=Le(),n=Lt();return!t||!n?null:n.reduce((l,a)=>{const r=t.rules.find(o=>o.resourceType===a);return r&&(l[a]={pluginId:r.pluginId}),l},{})}function Xl(t){return jn(Hn(t,"resourceType"),n=>Wn(n.map(({pluginId:l})=>l)))}function Zl(t,n){return{...t,rules:t.rules.filter(({resourceType:l,pluginId:a})=>{const r=n[l];return a===r[0]})}}const er=N(t=>({breadcrumbs:{marginBottom:t.spacing(4)}}));function tr({pages:t}){const n=Mn(Ln),l=er();return e.createElement(zn,{className:l.breadcrumbs},e.createElement(de,{to:n()},"Home"),t.map(({title:a,path:r},o)=>r?e.createElement(de,{to:r,key:r,relative:"path"},a):e.createElement(C,{key:`${o}`},a)))}function Fe({children:t,header:n,pages:l}){return e.createElement(Gn,{themeId:"tool"},e.createElement(ol,{backend:"rbac",invalidLicenseMessage:"Your existing policy will continue to apply, but you will be unable to make any changes until you enter a valid license."}),e.createElement(Vn,{title:"Role Based Access Control"}),e.createElement(Un,null,e.createElement(Yn,{maxWidth:"lg"},e.createElement(F,{container:!0,spacing:4},e.createElement(F,{item:!0,xs:12},l&&e.createElement(tr,{pages:l}),n),t))))}const Ft=Pe({hasDraftPolicy:!1,policies:void 0,setPolicies:()=>{},setPolicy:()=>{},getPolicy:()=>{},removePolicy:()=>{}}),je=()=>De(Ft);function nr({children:t,initialState:n={policies:void 0,cache:{}}}){const[l,a]=k(n),r=R(m=>{a(c=>({...c,policies:m,cache:jt(c.cache,m)}))},[]),o=R(m=>l.cache[m],[l.cache]),i=R(m=>a(c=>({...c,cache:{...c.cache,[m]:void 0},policies:void 0})),[]),s=R(m=>a(c=>({...c,policies:void 0,cache:jt(c.cache,[m])})),[]);return e.createElement(Ft.Provider,{value:L(()=>{var m;return{hasDraftPolicy:((m=l.policies)==null?void 0:m.some(({status:c})=>c==="draft"))||!1,policies:l.policies,setPolicies:r,setPolicy:s,getPolicy:o,removePolicy:i}},[l.policies,r,s,o,i])},t)}function jt(t,n){if(!n)return t;const l={...t};return n.forEach(a=>{l[a.id]=a}),l}const he=()=>{const t=I(W),{setPolicies:n,policies:l}=je(),[{loading:a,error:r},o]=ie(()=>t.getPolicies(),[t],l?{loading:!1,value:{items:l,totalItems:l.length}}:{loading:!0}),i=R(async()=>{const s=await o();n(s.items)},[o,n]);return{loading:a,error:r,fetchPolicies:i}};function lr(){const t=I(W),n=G(),l=I(le);function a(r){var o,i;const s=(i=(o=r.target)==null?void 0:o.files)==null?void 0:i[0],m=new FileReader;s&&(m.readAsText(s,"utf-8"),m.onload=async c=>{var p,d;const u=(d=(p=c.target)==null?void 0:p.result)==null?void 0:d.toString();if(u){let b=null;try{b=cl.load(u)}catch{l.post({message:"YAML file is invalid",severity:"error"});return}const g=Be.safeParse(b);if(!g.success){l.post({message:"Imported policy is invalid",severity:"error"});return}const E=g.data;if((await t.getPolicies()).items.some(P=>P.status==="draft")){l.post({message:"Unable to import new policy due to existing draft policy",severity:"error"});return}const y=await t.createDraft(E);n(`./versions/${y.id}`),l.post({message:"Policy imported successfully",severity:"success"})}})}return e.createElement(w,{variant:"outlined",color:"primary",component:"label"},"Import",e.createElement("input",{role:"input",type:"file",hidden:!0,onChange:a,accept:".yaml"}))}const rr=N(t=>({cardContent:{padding:t.spacing(6,3),"& > *":{background:"transparent"}}}));function ar(){const t=rr(),n=I(W),l=G(),[a,r]=ie(async()=>n.createDraft({roles:[],options:{resolutionStrategy:"any-allow"}}),[n]);return _(()=>{a.value&&l(`./versions/${a.value.id}`)},[l,a.value]),e.createElement(Y,null,e.createElement(pe,{className:t.cardContent},e.createElement(Te,{missing:"content",title:"No policy configured",description:e.createElement(e.Fragment,null,e.createElement(f,{component:"span",display:"block",pb:2},"Until you've configured your policy, authorization will be denied for all permissions."),e.createElement(f,{component:"span",display:"block"},"Click the button below to create the first version of your policy.")),action:e.createElement(w,{variant:"contained",color:"primary",disabled:a.loading,onClick:r},"New version")})))}function or(t){var n,l;return((l=(n=t==null?void 0:t.body)==null?void 0:n.response)==null?void 0:l.statusCode)===404}const ir=(t,n)=>{const l={resolutionStrategy:{operation:"UNCHANGED",before:t==null?void 0:t.resolutionStrategy,after:n==null?void 0:n.resolutionStrategy}};for(const a of Object.keys(l)){const r=a;l[r].before!==l[r].after&&(l[r].operation="CHANGED")}return l},ot=(t,n)=>{const l=Object.entries(t);for(const[,a]of l){const r=n(a);for(const[,o]of l){const i=n(o);i.operation!=="ADDED"&&i.operation!=="REMOVED"&&(r.operation==="ADDED"&&r.indexAfter<i.indexAfter?i.indexBefore+=1:r.operation==="REMOVED"&&r.indexBefore<i.indexBefore&&(i.indexBefore-=1))}}for(const[,a]of l){const r=n(a);r.operation==="UNCHANGED"&&r.indexAfter!==r.indexBefore&&(r.operation=r.indexAfter>r.indexBefore?"MOVED_DOWN":"MOVED_UP")}return t},it=(t,n)=>{if(t==="*")return n==="*"?{"*":{operation:"UNCHANGED",after:"*",before:"*",indexAfter:0,indexBefore:0}}:{"*":{operation:"REMOVED",after:null,before:"*",indexAfter:-1,indexBefore:0},...Object.fromEntries(n.map((a,r)=>[a,{operation:"ADDED",after:a,before:null,indexAfter:r,indexBefore:-1}]))};if(n==="*")return{"*":{operation:"ADDED",after:"*",before:null,indexAfter:0,indexBefore:-1},...Object.fromEntries(t.map((a,r)=>[a,{operation:"REMOVED",after:null,before:a,indexAfter:-1,indexBefore:r}]))};const l=Object.fromEntries(n.map((a,r)=>[a,{operation:"ADDED",after:a,before:null,indexAfter:r,indexBefore:-1}]));for(let a=0;a<t.length;a++){const r=t[a];l[r]?(l[r].before=r,l[r].indexBefore=a,l[r].operation="UNCHANGED"):l[r]={operation:"REMOVED",after:null,before:r,indexAfter:-1,indexBefore:a}}return ot(l,a=>a)},ct=(t,n)=>{const l=Tt(n,"id"),a=Object.fromEntries(n.map((r,o)=>[r.id,{operation:"ADDED",indexAfter:o,indexBefore:-1,after:r,before:null}]));for(let r=0;r<t.length;r++){const o=t[r];if(a[o.id]){const i=!yl(o,l[o.id]);a[o.id].before=o,a[o.id].indexBefore=r,a[o.id].operation=i?"CHANGED":"UNCHANGED"}else a[o.id]={operation:"REMOVED",after:null,before:o,indexAfter:-1,indexBefore:r}}return ot(a,r=>r)},cr=(t=[],n=[])=>{const l=Tt(n,"id"),a=Object.fromEntries(n.map((r,o)=>[r.id,{role:{operation:"ADDED",indexAfter:o,indexBefore:-1,after:r,before:null},members:it([],r.members),permissions:ct([],r.permissions)}]));for(let r=0;r<t.length;r++){const o=t[r];if(l[o.id]){const i=l[o.id],s=it(o.members,i.members),m=ct(o.permissions,i.permissions),c=Object.values(m).some(({operation:u})=>u!=="UNCHANGED"),p=Object.values(s).some(({operation:u})=>u!=="UNCHANGED"),d=o.name!==i.name||c||p;a[o.id].role.before=o,a[o.id].role.indexBefore=r,a[o.id].role.operation=d?"CHANGED":"UNCHANGED",a[o.id].members=s,a[o.id].permissions=m}else a[o.id]={role:{operation:"REMOVED",after:null,before:o,indexAfter:-1,indexBefore:r},members:it(o.members,[]),permissions:ct(o.permissions,[])}}return ot(a,({role:r})=>r)},sr=(t,n)=>{const l=cr((t==null?void 0:t.roles)||[],n.roles||[]),a=ir(t==null?void 0:t.options,n.options),r=(t==null?void 0:t.name)!==n.name,o=Object.values(a).some(({operation:i})=>i!=="UNCHANGED");return{policy:{operation:r||o?"CHANGED":"UNCHANGED",before:t,after:n},roles:l,options:a}},Ht=t=>{const n=I(W),{value:l,loading:a,error:r}=ue(()=>n.getActivePolicy(),[n]);return L(()=>t&&!a&&!r?sr(l,t):null,[l,t,a,r])},mr=N(t=>({chip:{margin:0},icon:{color:t.palette.success.main}}));function Wt(t){const n=mr();return t.status==="inactive"?null:t.status==="draft"?e.createElement(Re,{className:n.chip,label:"Draft",size:t.size}):e.createElement(Re,{className:n.chip,classes:{icon:n.icon},label:"Active",icon:e.createElement(hl,null),size:t.size})}const st=(t,n)=>{switch(n){case"ADDED":return t.palette.success.main;case"REMOVED":return t.palette.error.main;case"CHANGED":return t.palette.info.main;case"MOVED_UP":case"MOVED_DOWN":return t.palette.info.main;case"UNCHANGED":default:return t.palette.text.primary}},ur=t=>{switch(t){case"ADDED":return"New";case"REMOVED":return"Removed";case"CHANGED":return"Changed";case"MOVED_UP":return"Moved up";case"MOVED_DOWN":return"Moved down";case"UNCHANGED":default:return"No changes"}};function dr(t){var n;return nt(t.decision)?"Conditional":(n={allow:"Allow",deny:"Deny"}[t.decision])!=null?n:"Unknown"}function mt(t){var n;if(t.match==="*")return"All";if(t.match.name)return t.match.name;const l=[];return t.match.resourceType&&l.push(t.match.resourceType),(n=t.match.actions)!=null&&n.length&&l.push(t.match.actions.join(", ")),l.join(" | ")}const pr=N(t=>({root:({operation:n})=>({color:st(t,n)})})),M=t=>e.createElement(C,{...t,variant:"body2"}),x=t=>{const n=pr(t);return e.createElement(f,{...t,className:n.root,component:"span",fontWeight:"fontWeightBold"})},zt=({policy:t})=>{var n,l,a,r;const o=Ht(t),i=(o==null?void 0:o.policy.operation)==="CHANGED"||Object.values((n=o==null?void 0:o.roles)!=null?n:{}).some(d=>d.role.operation!=="UNCHANGED")||((l=o==null?void 0:o.options)==null?void 0:l.resolutionStrategy.operation)==="CHANGED";if(!o||!i)return e.createElement(f,null,"No changes");const s=!!o.policy.before&&!!o.policy.after&&o.policy.before.name!==o.policy.after.name,m=o.options.resolutionStrategy.operation==="CHANGED",c=({before:d,after:u})=>d&&u&&d.name!==u.name,p=({operation:d})=>d!=="ADDED"&&d!=="REMOVED";return e.createElement(f,null,s&&e.createElement(M,null,"Policy name ",e.createElement(x,{operation:"CHANGED"},"changed")," from"," ",e.createElement(x,null,'"',(a=o.policy.before)==null?void 0:a.name,'"')," to"," ",e.createElement(x,null,'"',(r=o.policy.after)==null?void 0:r.name,'"')),m&&e.createElement(M,null,"Resolution Strategy ",e.createElement(x,{operation:"CHANGED"},"changed")," ","from ",e.createElement(x,null,'"',o.options.resolutionStrategy.before,'"')," to"," ",e.createElement(x,null,'"',o.options.resolutionStrategy.after,'"')),Object.entries(o.roles).map(([d,{role:u,permissions:b,members:g}])=>{var E,y,P,T,$,j;return e.createElement(Ne,{key:d},u.operation==="ADDED"&&e.createElement(M,null,"Role ",e.createElement(x,null,'"',(E=u.after)==null?void 0:E.name,'"')," has been"," ",e.createElement(x,{operation:"ADDED"},"added")),u.operation==="REMOVED"&&e.createElement(M,null,"Role ",e.createElement(x,null,'"',(y=u.before)==null?void 0:y.name,'"')," has been"," ",e.createElement(x,{operation:"REMOVED"},"removed")),c(u)&&e.createElement(M,null,"Role name changed from ",e.createElement(x,null,'"',(P=u.before)==null?void 0:P.name,'"')," ","to ",e.createElement(x,null,'"',(T=u.after)==null?void 0:T.name,'"')),u.indexAfter>u.indexBefore&&u.indexBefore!==-1&&e.createElement(M,null,"Role ",e.createElement(x,null,'"',($=u.after)==null?void 0:$.name,'"')," has been"," ",e.createElement(x,{operation:"MOVED_DOWN"},"moved down")," in priority"),u.indexAfter<u.indexBefore&&u.indexAfter!==-1&&e.createElement(M,null,"Role ",e.createElement(x,null,'"',(j=u.after)==null?void 0:j.name,'"')," has been"," ",e.createElement(x,{operation:"MOVED_UP"},"moved up")," in priority"),p(u)&&e.createElement(e.Fragment,null,Object.entries(b).map(([B,v])=>{var A,h,S,O,Z;const{before:J,after:se}=v,ee=J&&mt(J),q=se&&mt(se);return e.createElement(Ne,{key:B},v.operation==="ADDED"&&v.after&&e.createElement(M,null,"Permission decision"," ",e.createElement(x,null,'"',q,'"')," has been"," ",e.createElement(x,{operation:"ADDED"},"added")," to"," ",e.createElement(x,null,'"',(A=u.after)==null?void 0:A.name,'"')),v.operation==="REMOVED"&&v.before&&e.createElement(M,null,"Permission decision"," ",e.createElement(x,null,'"',ee,'"')," has been"," ",e.createElement(x,{operation:"REMOVED"},"removed")," ","from ",e.createElement(x,null,'"',(h=u.after)==null?void 0:h.name,'"')),v.operation==="CHANGED"&&e.createElement(M,null,ee!==q?e.createElement(e.Fragment,null,"Permission decision"," ",e.createElement(x,null,'"',ee,'"')," has been"," ",e.createElement(x,{operation:"CHANGED"},"updated")," ","to ",e.createElement(x,null,'"',q,'"')):e.createElement(e.Fragment,null,"Permission decision"," ",e.createElement(x,null,'"',ee,'"')," has been"," ",e.createElement(x,{operation:"CHANGED"},"updated"))," ","in ",e.createElement(x,null,'"',(S=u.after)==null?void 0:S.name,'"')),v.indexAfter>v.indexBefore&&v.indexBefore!==-1&&e.createElement(M,null,"Permission decision"," ",e.createElement(x,null,'"',q,'"')," has been"," ",e.createElement(x,{operation:"MOVED_DOWN"},"moved down")," ","in priority in"," ",e.createElement(x,null,'"',(O=u.after)==null?void 0:O.name,'"')),v.indexAfter<v.indexBefore&&v.indexAfter!==-1&&e.createElement(M,null,"Permission decision"," ",e.createElement(x,null,'"',q,'"')," has been"," ",e.createElement(x,{operation:"MOVED_UP"},"moved up")," ","in priority in"," ",e.createElement(x,null,'"',(Z=u.after)==null?void 0:Z.name,'"')))}),Object.entries(g).map(([B,v])=>{var A,h;return e.createElement(Ne,{key:B},v.operation==="ADDED"&&v.after&&e.createElement(M,null,"Member ",e.createElement(x,null,'"',v.after,'"')," has been"," ",e.createElement(x,{operation:"ADDED"},"added")," to"," ",e.createElement(x,null,'"',(A=u.after)==null?void 0:A.name,'"')),v.operation==="REMOVED"&&v.before&&e.createElement(M,null,"Member ",e.createElement(x,null,'"',v.before,'"')," has been"," ",e.createElement(x,{operation:"REMOVED"},"removed")," from"," ",e.createElement(x,null,'"',(h=u.after)==null?void 0:h.name,'"')))})))}))},fr=N(()=>({root:{display:"inline-flex"}})),Gt=({timestamp:t,description:n})=>{const l=fr(),a=Me.fromISO(t).toLocaleString(Me.DATETIME_FULL),r=il(t),o=n?`${n}${r}`:r;return e.createElement("span",{className:l.root},e.createElement(fe,{title:a},e.createElement(C,{component:"span",display:"inline",variant:"inherit"},o)))};function Vt(t,n,l){var a,r;let o=n.created,i=t.createdBy;l!=null&&l.created&&(i=l.created+i);let s=t.createdAt;return t.status==="active"?(o=n.published,i=(a=t.lastPublishedBy)!=null?a:"",l!=null&&l.published&&(i=l.published+i),s=(r=t.lastPublishedAt)!=null?r:""):t.createdAt!==t.updatedAt&&(o=n.updated,i=t.updatedBy,l!=null&&l.updated&&(i=l.updated+i),s=t.updatedAt),{activityDateText:o,activityUser:i,timestamp:s}}const Er=N(t=>({card:n=>({backgroundImage:n.policy.status==="active"?"linear-gradient(256.15deg, #00782A 19.77%, #1DB954 100%)":"linear-gradient(256.15deg, #BDBDBD 19.77%, #EEEEEE 100%)",backgroundPosition:"top",backgroundSize:"100% 8px",backgroundRepeat:"no-repeat",paddingTop:"8px",height:"100%"}),diffSummaryContainer:{backgroundColor:t.palette.background.default,padding:t.spacing(2),borderWidth:"1px",borderStyle:"solid",borderColor:t.palette.divider,borderRadius:t.shape.borderRadius},header:{display:"flex",justifyContent:"space-between",alignItems:"center"},detailsHeader:{...t.typography.body1,paddingTop:t.spacing(2),color:t.palette.text.secondary},activityList:{color:t.palette.text.secondary},activityListItem:{padding:0},actions:{justifyContent:"flex-start"}}));function ve(t){const n=Er(t),{policy:l,to:a,withChangeSummary:r}=t,o=`${l.name} ${l.status==="draft"?"- Draft":""}`,i={created:"Created: ",published:"Published: ",updated:"Updated: "},s={created:"Created by ",published:"Published by ",updated:"Updated by "},{activityDateText:m,activityUser:c,timestamp:p}=Vt(l,i,s);return e.createElement(Y,{className:n.card},e.createElement(pe,null,e.createElement("div",{className:n.header},a?e.createElement(de,{to:`versions/${l.id}`},e.createElement(C,{variant:"h5",component:"h1"},o)):e.createElement(C,{variant:"h5",component:"h1"},o),l.status==="active"?e.createElement(Wt,{status:"active",size:"small"}):null),l.description?e.createElement(C,{variant:"body1",color:"textSecondary"},'"',l.description,'"'):null,e.createElement(C,{component:"h2",className:n.detailsHeader},"Details"),e.createElement(Jn,{className:n.activityList},e.createElement(xt,{className:n.activityListItem},e.createElement(re,null,e.createElement(gl,null)),e.createElement(ae,{primary:e.createElement(Gt,{timestamp:p,description:m})})),e.createElement(xt,{className:n.activityListItem},e.createElement(re,null,e.createElement(kt,null)),e.createElement(ae,{primary:c}))),r&&e.createElement(f,{paddingTop:2},e.createElement(C,{gutterBottom:!0,variant:"subtitle2"},"What's changed"),e.createElement(f,{className:n.diffSummaryContainer},e.createElement(zt,{policy:l})))),t.actions?e.createElement(qn,{className:n.actions},t.actions):null)}const yr=N(t=>({icon:{color:t.palette.warning.main,width:"2rem",height:"2rem"},label:{align:"center",display:"block",marginBottom:t.spacing(1),color:t.palette.text.secondary,fontSize:t.typography.caption.fontSize},policiesContainer:{display:"flex",gap:t.spacing(4),marginTop:t.spacing(4),marginBottom:t.spacing(4)},button:{marginTop:t.spacing(4)}})),gr=({localPolicy:t,onSelectLocalPolicy:n,onSelectServerPolicy:l,serverPolicy:a})=>{const r=yr();return e.createElement(oe,{open:!0,maxWidth:"md"},e.createElement(K,null,e.createElement(f,{display:"flex",flexDirection:"column",gridGap:8},e.createElement(f,{display:"flex",justifyContent:"center"},e.createElement(St,{className:r.icon})),e.createElement(C,{align:"center",variant:"h6"},"There is a conflict with your drafts"),e.createElement(f,null,e.createElement(C,{align:"center"},"A newer version of the draft you are trying to edit has been recently saved."),e.createElement(C,{align:"center"},"Please review the changes and decide on a version to keep."))),e.createElement(f,{className:r.policiesContainer},e.createElement(f,{alignItems:"center",display:"flex",flexDirection:"column",flex:"1 1 0%"},e.createElement(C,{className:r.label,variant:"button"},"Your local draft"),e.createElement(ve,{policy:t,withChangeSummary:!0}),e.createElement(w,{className:r.button,color:"primary",onClick:n,variant:"outlined"},"Keep local draft")),e.createElement(f,{alignItems:"center",display:"flex",flexDirection:"column",flex:"1 1 0%"},e.createElement(C,{className:r.label,variant:"button"},"Recently saved draft"),e.createElement(ve,{policy:a,withChangeSummary:!0}),e.createElement(w,{className:r.button,color:"primary",onClick:l,variant:"outlined"},"Keep recently saved draft")))))},hr=({serverPolicy:t,localPolicy:n})=>!n||!t?{policy:t,policyConflict:!1}:t.status!=="draft"?{policy:t,policyConflict:!1}:n.id!==t.id?{policy:t,policyConflict:!1}:n.updatedAt===t.updatedAt?{policy:n,policyConflict:!1}:{policy:n,policyConflict:!0},vr=()=>vl("@spotify/backstage-plugin-rbac:draftPolicy");function Ut(t){const n=new Blob([br(t)],{type:"text/yaml"});bl(n,`${(t.name||"policy").toLocaleLowerCase().replace(/\W/g,"-")}.yaml`)}function br(t){const{name:n,roles:l,options:a,description:r}=t;return`# this is an autogenerated file, do not edit
2
+ ${sl(Cl({name:n,description:r,options:a,roles:l.map(({permissions:o,...i})=>({...Rt(i,["id"]),permissions:o.map(s=>Rt(s,["id"]))}))},o=>o!==null||o!==void 0))}`}const Cr=N(t=>({icon:{color:t.palette.warning.main,width:"2rem",height:"2rem"}})),xr=({onConfirm:t,policy:n})=>{const l=Cr(),a=()=>{Ut(n)};return e.createElement(oe,{open:!0},e.createElement(K,null,e.createElement(f,{display:"flex",flexDirection:"column",gridGap:16},e.createElement(f,{display:"flex",flexDirection:"column",gridGap:4},e.createElement(f,{display:"flex",justifyContent:"center"},e.createElement(St,{className:l.icon})),e.createElement(C,{align:"center",variant:"h6"},"Invalid local draft")),e.createElement(f,{display:"flex",flexDirection:"column",gridGap:8},e.createElement(C,{align:"center"},"You have a local draft that is no longer compatible or has become corrupted."),e.createElement(C,{align:"center"},"Click export to download your draft. You can attempt to restore your draft by importing this file on the RBAC home page."),e.createElement(C,{align:"center"},"Clicking continue will discard your draft."," ",e.createElement(f,{component:"span",fontWeight:"fontWeightBold"},"This action cannot be undone."))),e.createElement(f,{display:"flex",justifyContent:"center",gridGap:8,marginY:3},e.createElement(w,{color:"primary",onClick:a,variant:"outlined"},"Export"),e.createElement(w,{color:"primary",onClick:t,variant:"contained"},"Discard and continue")))))};function ut(){const t=I(W),n=I(le),l=ie(async(r,o,i)=>{if(r)return await t.publishPolicy(r.id,{description:o,update:i}),t.getPolicy(r.id)},[]),[{error:a}]=l;return _(()=>{a&&n.post({message:a.message,severity:"error"})},[a,n]),l}const Pr=N(t=>({closeButton:{color:t.palette.text.secondary},diffSummaryContainer:{backgroundColor:t.palette.background.default,marginBottom:t.spacing(2)}}));function dt({open:t,onPublish:n,onClose:l,policy:a}){const[r,o]=k(!1),i=Pr(),s=ne(null),m=async()=>{var c,p;o(!0),await n((p=(c=s.current)==null?void 0:c.value)!=null?p:""),o(!1)};return e.createElement(oe,{open:t,onClose:l,fullWidth:!0},e.createElement($e,null,e.createElement(f,{display:"flex",justifyContent:"space-between",alignItems:"center"},"Ready to publish?",e.createElement(w,{startIcon:e.createElement(lt,null),onClick:l,className:i.closeButton},"Close")),e.createElement(C,null,"Double check your changes, then click Publish to activate this version of your policy. This will immediately apply the permissions defined in this version across Backstage.")),e.createElement(K,{className:i.diffSummaryContainer,dividers:!0},e.createElement(zt,{policy:a})),e.createElement(K,null,e.createElement(Ee,{variant:"outlined",fullWidth:!0,label:"Summary (optional)",placeholder:"Briefly describe this version (or changes from a previous version)",inputRef:s})),e.createElement(Ye,null,e.createElement(w,{color:"primary",onClick:m,disabled:r},r?e.createElement(Pt,{size:20}):"Publish")))}const Dr=N(t=>({paper:{padding:t.spacing(2,2,0,2)}})),pt=({isOpen:t,onClose:n,policy:l})=>{const a=Dr();return e.createElement(oe,{classes:{...a},open:t,onClose:n},e.createElement($e,{disableTypography:!0},e.createElement(f,{display:"flex",flexDirection:"row"},e.createElement(f,null,e.createElement(C,{variant:"h4",component:"h2"},"Success!"),e.createElement(C,null,l.name," has been published and is now your active policy.")),e.createElement(f,null,e.createElement(z,{onClick:n,title:"Close dialog"},e.createElement(lt,null))))),e.createElement(K,null,e.createElement(ve,{policy:l})),e.createElement(Ye,null,e.createElement(f,{display:"flex",flexDirection:"row",flexGrow:1,justifyContent:"flex-start"},e.createElement(w,{component:In,color:"primary",onClick:n,role:"link",to:"/rbac"},"View all versions"))))},Nr={canPublish:!1,diff:null,hasChanges:!1,isValid:!1,policy:void 0,createNewRole:()=>"",discardLocalDraft:()=>{},exportPolicy:()=>{},publish:()=>{},saveLocalDraftToServer:()=>Promise.reject(),saveAndPublish:()=>Promise.reject(),refetchPolicy:()=>Promise.reject(),updateLocalDraft:()=>{}},_t=Pe(Nr),X=()=>De(_t);function He({children:t,policyId:n}){const l=G(),a=I(le),r=I(W),{getPolicy:o,setPolicy:i}=je(),s=Ue(),{NotFoundErrorPage:m}=s.getComponents(),[c,p]=k({active:!1,update:!1}),[d,u]=k(!1),[{loading:b,value:g},E]=ut(),y=o(n),[P,T,$]=vr(),j=!P||Be.safeParse(P).success,B=j?P:void 0,{policy:v,policyConflict:A}=hr({serverPolicy:y,localPolicy:B}),h=Ht(v),S=Be.safeParse(v).success,O=S&&!B&&!b,[{loading:Z,error:J},se]=ie(()=>r.getPolicy(n),[r,n],y?{loading:!1,value:y}:{loading:!0}),ee=()=>{p({active:!0,update:!1})},q=()=>{p({active:!0,update:!0})},xn=R(async H=>{await E(v,H,c.update?v:void 0),p({active:!1,update:!1})},[v,c,E,p]),Pn=async()=>{u(!1)},Dn=()=>{T(H=>H&&y&&{...H,updatedAt:y.updatedAt})},te=R(async()=>{const H=await se();i(H)},[se,i]),Nn=R(async()=>{if(!v)throw new Error("No policy to save");try{await r.updateDraft(v.id,{name:v.name,roles:v.roles,options:v.options}),a.post({message:"Policy saved",severity:"success"}),$(),te==null||te()}catch(H){a.post({message:(H==null?void 0:H.message)||"An error occurred while updating the policy",severity:"error"})}},[a,r,v,te,$]),wn=R(()=>{if(!v)throw new Error("No policy to create a new role");const H=new Set(v.roles.map(kn=>kn.id));let me;do me=ce().split("-")[0];while(H.has(me));const Sn={name:`Role ${me}`,permissions:[],members:"*",id:me};return T({...v,roles:[...v.roles,Sn]}),me},[v,T]),An=()=>{$(),l("/rbac")},Tn=()=>{v&&Ut(v)};return _(()=>{y||te()},[te,y]),_(()=>{g&&u(!0)},[g]),j?v?e.createElement(_t.Provider,{value:{canPublish:O,diff:h,hasChanges:!!B,isValid:S,policy:v,createNewRole:wn,discardLocalDraft:$,exportPolicy:Tn,publish:ee,saveLocalDraftToServer:Nn,refetchPolicy:te,updateLocalDraft:T,saveAndPublish:q}},A&&B&&y&&e.createElement(gr,{localPolicy:B,onSelectLocalPolicy:Dn,onSelectServerPolicy:$,serverPolicy:y}),e.createElement(dt,{open:c.active,onClose:()=>p({active:!1,update:!1}),onPublish:xn,policy:v}),g&&e.createElement(pt,{isOpen:d,onClose:Pn,policy:g}),t):Z?e.createElement(Se,null):J?or(J)?e.createElement(m,null):e.createElement(bt,{error:J!=null?J:new Error("Unknown")}):null:e.createElement(xr,{onConfirm:An,policy:P})}function wr(t){throw new Error("Invalid state")}function ft(){const t=I(W),n=I(le),l=G(),{fetchPolicies:a}=he();return ie(async r=>{if(!r)return;const{roles:o,name:i,options:s}=r;try{const m=await t.createDraft({roles:o,options:s,name:i});return await a(),l(`/rbac/versions/${m.id}`),m}catch(m){throw m instanceof Error&&n.post({message:m.message,severity:"error"}),m}},[l,t,n,a])}const Ar=[{title:"Name",field:"name",render:t=>e.createElement(de,{to:`versions/${t.id}`},t.name)},{title:"Status",field:"status",render:t=>{switch(t.status){case"active":return"Active";case"draft":return"Draft";case"inactive":return"Inactive";default:return wr(t.status)}}},{title:"Publish date",field:"lastPublishedAt",render:t=>t.lastPublishedAt?Me.fromISO(t.lastPublishedAt).toLocaleString(Me.DATETIME_MED_WITH_SECONDS):"",type:"datetime",defaultSort:"desc"},{title:"Published by",field:"lastPublishedBy"}];function Tr(t){const n=t.data.length>3,{fetchPolicies:l}=he(),[{loading:a},r]=ft(),[{loading:o,value:i},s]=ut(),[m,c]=k(void 0),[p,d]=k(!1),u=()=>{c(void 0),l()},b=(m==null?void 0:m.id)===(i==null?void 0:i.id)?i:void 0,g=[E=>{const{tableData:y,...P}=E;return{icon:xl,tooltip:"Republish",onClick:()=>{c(P),d(!0)},disabled:o}},E=>{const{tableData:y,...P}=E;return{icon:Pl,tooltip:"Duplicate",disabled:a||!t.canDuplicate,onClick:()=>r(P)}}];return e.createElement(e.Fragment,null,e.createElement(_n,{title:"Previous Versions",columns:Ar,data:t.data,options:{paging:n,pageSize:3,pageSizeOptions:[3,5,10,20],actionsColumnIndex:-1,loadingType:"linear"},actions:g}),m&&e.createElement(dt,{open:p,onPublish:E=>{s(m,E),d(!1)},onClose:()=>{c(void 0),d(!1)},policy:m}),b&&e.createElement(pt,{isOpen:!0,policy:b,onClose:u}))}const Sr=t=>{const[n,l]=k(!1),{fetchPolicies:a}=he(),[{loading:r,value:o},i]=ut(),{policy:s,hasChanges:m}=X(),c=Be.safeParse(s).success,p=!m&&c,d=async b=>{await i(s,b),l(!1)},u=()=>{a()};return e.createElement(e.Fragment,null,e.createElement(w,{...t,onClick:()=>l(!0),disabled:!p||r},"Publish"),e.createElement(dt,{open:n,onClose:()=>l(!1),onPublish:d,policy:s}),o&&e.createElement(pt,{isOpen:!0,onClose:u,policy:o}))};function kr(t){const n=I(W),l=I(le),{fetchPolicies:a}=he();return ie(async()=>{if(t)return n.deleteDraft(t.id).then(a).catch(r=>(l.post({message:r.message,severity:"error"}),Promise.reject(r)))},[t])}function Rr({policies:t}){const n=t.find(c=>c.status==="draft"),l=t.find(c=>c.status==="active"),[a,r]=ft(),[o,i]=kr(n),s=G(),m=$r(t);return e.createElement(F,{container:!0,spacing:4},l?e.createElement(F,{item:!0,xs:12,md:6},e.createElement(ve,{policy:l,to:`./versions/${l.id}`,actions:e.createElement(w,{color:"primary",disabled:a.loading||!!n,onClick:()=>r(l)},"Duplicate")})):null,n?e.createElement(F,{item:!0,xs:12,md:6},e.createElement(ve,{policy:n,to:`./versions/${n.id}`,actions:e.createElement(e.Fragment,null,e.createElement(w,{onClick:()=>s(`versions/${n.id}`),color:"primary"},"Edit"),e.createElement(w,{color:"primary",disabled:o.loading,onClick:i},"Delete Draft"),e.createElement(He,{policyId:n.id},e.createElement(Sr,{color:"primary"})))})):null,e.createElement(F,{item:!0,xs:12},e.createElement(Tr,{data:m,canDuplicate:!n})))}function $r(t){return t.filter(({status:n})=>n==="inactive")}function Ir(){const{policies:t}=je(),{loading:n,error:l,fetchPolicies:a}=he();Ct(()=>{t||a()});let r;return n?r=e.createElement(F,{item:!0,xs:12},e.createElement(Se,null)):l?r=e.createElement(bt,{error:l}):!t||t.length===0?r=e.createElement(ar,null):r=e.createElement(Rr,{policies:t}),e.createElement(Fe,{pages:void 0,header:e.createElement(ke,{title:"RBAC Policies"},e.createElement(lr,null))},r)}const Or=N(t=>({titleWrapper:{display:"flex",alignItems:"center",gap:t.spacing(2)}}));function Yt({children:t}){const n=Or();return e.createElement(C,{noWrap:!0,variant:"h4",component:"h2",color:"textSecondary",className:n.titleWrapper},t)}const Br=e.forwardRef(function({children:t,role:n,...l},a){const r=L(()=>{const s=[];return vt.forEach(t,m=>{if(we(m)){const c=m.props.children[0];we(c)&&s.push(c);const p=m.props.children[1];if(we(p)){const d=vt.toArray(p.props.children).filter(we);s.push(...d)}}}),s},[t]),o=r.length,i=54;return e.createElement("div",{ref:a},e.createElement("ul",{...l},e.createElement(Sl,{height:250,width:250,rowHeight:i,overscanCount:5,rowCount:o,rowRenderer:s=>e.cloneElement(r[s.index],{style:{...s.style,whiteSpace:"nowrap"}}),role:n})))}),Mr=N({autocomplete:{display:"flex",flex:1}});function Lr({members:t,options:n,namespaceOptions:l,loading:a=!1,disabled:r=!1,isMultiNamespaces:o=!1,onTextChange:i,onToggleMember:s,onChange:m}){const[c,p]=k(!1),d=Mr(),[u,b]=Rn(y=>y+1,0),g=(y,P)=>{P&&(s(P),b())};_(()=>{c&&i("")},[c,i]);const E=o?l.concat((n==null?void 0:n.members)||[]):(n==null?void 0:n.members)||[];return e.createElement(f,{width:250},e.createElement(rt,{key:`${u}`,open:c,onOpen:()=>{p(!0)},onClose:()=>{p(!1)},onChange:g,getOptionLabel:be,groupBy:Fr,ListboxComponent:Br,renderOption:y=>e.createElement(e.Fragment,null,e.createElement(Je,{id:`checkbox-${y.entityRef}`,checked:t.includes(y.entityRef),color:"primary"}),e.createElement("label",{htmlFor:`checkbox-${y.entityRef}`},o?be(y,!1):be(y))),options:E,openOnFocus:!0,disabled:r,loading:a,className:d.autocomplete,renderInput:y=>e.createElement(Ee,{...y,label:o?"Select members":"Select specific users/groups",variant:"standard",onChange:m,InputProps:{...y.InputProps,endAdornment:e.createElement(e.Fragment,null,a?e.createElement(Pt,{color:"inherit",size:20}):null,y.InputProps.endAdornment)}})}))}function be(t,n=!0){var l;const a=Q(t.entityRef);return a.name==="*"?a.namespace:Nl({...a,name:(l=t.name)!=null?l:a.name},{defaultKind:a.kind,defaultNamespace:n?Dl:!1})}const Jt={user:"USERS",group:"GROUPS",namespace:"NAMESPACES"};function Fr(t){const{name:n,kind:l}=Q(t.entityRef),a=n==="*"?"namespace":l;if(!Jt[a])throw new Error(`Group '${a}' is not supported for members in a policy`);return Jt[a]}const jr=N(t=>({root:({operation:n})=>({borderRadius:100,borderColor:st(t,n),borderSize:1,borderStyle:"solid",color:st(t,n),lineHeight:1,padding:t.spacing(.5,1),whiteSpace:"nowrap"})})),Hr={small:"span",medium:"div",large:"div"},Wr={small:"caption",medium:"body1",large:"subtitle1"},Ce=({operation:t,size:n="small"})=>{const l=jr({operation:t}),a=ur(t);return!t||t==="UNCHANGED"?null:e.createElement(C,{className:l.root,variant:Wr[n],component:Hr[n]},a)},zr=N(t=>({actionCol:{width:48},typeIconCol:{paddingRight:"0.4rem"},nameCol:{paddingLeft:0},typeIcon:{color:t.palette.grey[500]}}));function Gr({diff:t,loading:n,isMultiNamespaces:l,members:a,error:r,onToggleMember:o,readonly:i=!1}){const s=zr();if(n)return e.createElement(V,null,e.createElement(D,{scope:"row",colSpan:i?4:5},e.createElement(Se,null)));if(r&&r.message!=null,a==="*")return e.createElement(V,null,e.createElement(D,{colSpan:2,height:80},"All"),e.createElement(D,{colSpan:i?2:3},e.createElement(Ce,{operation:t==null?void 0:t.members["*"].operation})));if(a.length===0)return e.createElement(V,null,e.createElement(D,{scope:"row",colSpan:i?4:5},"Select users or groups using the drop-down menu above."));const m=a.sort((c,p)=>{let d=0;l&&p.name==="*"&&c.name!=="*"?d=1:l&&c.name==="*"&&p.name!=="*"&&(d=-1);const u=c.type.localeCompare(p.type),b=Q(c.entityRef).namespace.localeCompare(Q(p.entityRef).namespace),g=Q(c.entityRef).name.localeCompare(Q(p.entityRef).name);return d||u||b||g});return e.createElement(e.Fragment,null,m.map(c=>{var p;const{name:d,type:u,entityRef:b}=c;return e.createElement(V,{key:b},e.createElement(D,{className:s.typeIconCol},u==="group"&&e.createElement(kl,{className:s.typeIcon})||l&&d==="*"&&e.createElement(Rl,{className:s.typeIcon})||e.createElement(kt,{className:s.typeIcon})),e.createElement(D,{scope:"row",className:s.nameCol},(p=l?be(c,!1):be(c))!=null?p:"Unknown"),e.createElement(D,{scope:"row"},d==="*"&&l?"namespace":u),e.createElement(D,null,d&&e.createElement(Ce,{operation:t==null?void 0:t.members[b].operation})),!i&&e.createElement(D,{scope:"row",className:s.actionCol},e.createElement(z,{"aria-label":"delete",onClick:()=>o(c),size:"small"},e.createElement(ge,null))))}))}const qt=Pe({loading:!1}),Vr=({children:t})=>{const n=I(W),l=ue(async()=>await n.searchMembers({query:""}),[n]);return e.createElement(qt.Provider,{value:l},t)},Ur=()=>De(qt),_r=N(()=>({header:{display:"flex",flexDirection:"row",justifyContent:"space-between",paddingLeft:"1rem",paddingRight:"1rem",gap:"1rem"},actionCol:{width:48},typeIconCol:{paddingRight:"0.4rem"},nameCol:{paddingLeft:0}}));function Yr({diff:t,policyId:n,role:l,onToggleMember:a,readonly:r=!1,debounceTime:o=1e3}){const i=I(W),s=I(wl),m=_r(),c=l.members==="*",[p,d]=k(""),{current:u}=ne({}),b=h=>{u[h.entityRef]=h,a(h.entityRef)},g=h=>{var S;if(u[h])return u[h];const O=Q(h);return{entityRef:h,type:O.kind.toLowerCase(),name:(S=O.name)!=null?S:h}},{value:E,loading:y}=Ur(),{loading:P,value:T}=ue(async()=>{const h=await s.getEntityFacets({facets:["metadata.namespace"]}).then(S=>S.facets["metadata.namespace"].map(O=>O.value));return Jr(h)},[s]),$=T?(T==null?void 0:T.length)>1:!1,j=T?T.filter(h=>h.entityRef.toLowerCase().includes(p)):[],B=L(()=>Kn(h=>{d(h.target.value.toLowerCase())},o),[d,o]),{loading:v,error:A}=ue(async()=>{l.members==="*"||l.members.length===0||(await i.getPolicy(n)).roles.find(h=>h.id===l.id)===void 0||l.members.forEach(h=>{const S=g(h);u[S.entityRef]=S})},[n,c]);return e.createElement(e.Fragment,null,e.createElement("div",{className:m.header},e.createElement("h2",null,"Members"),e.createElement(Lr,{onToggleMember:b,members:l.members,disabled:r,options:E,namespaceOptions:j,isMultiNamespaces:$,loading:y||P,onTextChange:d,onChange:B})),e.createElement(qe,null,e.createElement(Ke,null,e.createElement(V,null,e.createElement(D,{className:m.typeIconCol}),e.createElement(D,{className:m.nameCol},"Name"),e.createElement(D,null,"Type"),e.createElement(D,null),!r&&e.createElement(D,{className:m.actionCol}))),e.createElement(Qe,null,e.createElement(Gr,{diff:t,loading:v||P,isMultiNamespaces:$,error:A,members:Array.isArray(l.members)?l.members.map(g):l.members,onToggleMember:b,readonly:r}))))}function Jr(t){return t.map(n=>({name:"*",type:"user",entityRef:`user:${n}/*`})).sort((n,l)=>n.entityRef.toLowerCase().localeCompare(l.entityRef.toLowerCase()))}function Kt(t){return`${t.palette.primary.main}50`}const qr=N(t=>({indicator:{right:"unset"},tab:{maxWidth:"none","&.Mui-selected":{backgroundColor:Kt(t),color:t.palette.primary.main}}}));function Kr({options:t,selected:n,onChange:l,readonly:a=!1}){const r=qr();return e.createElement(Qn,{orientation:"vertical",value:t.map(({id:o})=>o).indexOf(n),onChange:(o,i)=>l(t[i].id),indicatorColor:"primary",TabIndicatorProps:{className:r.indicator}},t.map(o=>e.createElement(Xn,{key:o.id,label:o.displayText.toUpperCase(),className:r.tab,disabled:a})))}const Qr=["condition","anyOf","allOf","not"],Qt={condition:"Condition",anyOf:"Any of",allOf:"All of",not:"Not"};function Et(t){return t===null?!1:t.hasOwnProperty("id")&&t.hasOwnProperty("ruleName")&&t.hasOwnProperty("parameters")}function xe(t){return t.hasOwnProperty("levelType")}function Xr(t){return t==="anyOf"||t==="allOf"||t==="not"}function Zr(t){return t?{id:t.id,match:ea(t),decisionType:ta(t),criteria:nt(t.decision)?We(t.decision.conditions):null}:{id:ce(),match:{method:"specificPermission"},decisionType:"allow",criteria:null}}function ea(t){var n;return t.match==="*"?{method:"all"}:t.match.name?{method:"specificPermission",name:t.match.name}:t.match.resourceType||(n=t.match.actions)!=null&&n.length?{method:"filter",resourceType:t.match.resourceType,actions:t.match.actions}:{method:"specificPermission"}}function ta(t){return typeof t.decision=="string"?t.decision:"conditional"}function We(t){const n=ce();return ml(t)?{id:n,levelType:"allOf",children:t.allOf.map(l=>We(l))}:ul(t)?{id:n,levelType:"anyOf",children:t.anyOf.map(l=>We(l))}:dl(t)?{id:n,levelType:"not",children:[We(t.not)]}:{id:n,ruleName:t.rule,parameters:t.params}}function Xt(t,n){if(!t)return!1;if(xe(t))return t.children.length>0&&t.children.every(a=>Xt(a,n));if(!t.ruleName)return!1;const l=n==null?void 0:n.find(({name:a})=>a===t.ruleName);return l?l.paramsSchema?new It({allErrors:!0}).compile(l.paramsSchema)(t.parameters):!0:!1}function na(t,n,l){return{id:t,match:Zt(n,l),decision:l}}function Zt({method:t,...n},l){return t==="all"?"*":l&&nt(l)?{resourceType:l.resourceType,...n}:n}function yt(t){return Et(t)?{rule:t.ruleName,params:t.parameters}:t.levelType==="not"?{not:yt(t.children[0])}:{[t.levelType]:t.children.map(n=>yt(n))}}const la=N(t=>({toggleButton:{"&.Mui-selected":{backgroundColor:Kt(t),color:t.palette.primary.main},"&.Mui-selected:hover":{backgroundColor:"#97BBE8"},color:t.palette.primary.main,border:`1px solid ${t.palette.primary.main}`}}));function gt({className:t,...n}){const l=la();return e.createElement(Al,{className:`${l.toggleButton} ${t}`,...n})}const ra=N({fullWidth:{width:"100%","& > *":{flexGrow:1}}});function aa({className:t,fullWidth:n,...l}){const a=ra();return e.createElement(Tl,{className:`${n?a.fullWidth:""} ${t}`,...l})}function oa(t,n){const l=(t!=null?t:[]).filter(o=>pl(o,Zt(n))),a=$l(l,o=>_e(o)?o.resourceType:void 0),r=a.length===1&&_e(a[0])?a[0].resourceType:void 0;return{permissions:l,commonResourceType:r}}const ia=N(()=>({fullWidth:{width:"100%","& > *":{flexGrow:1}}})),en="Permission name";function ca({name:t="",readonly:n,onNameChange:l}){const a=ia(),r=Mt();return e.createElement(Xe,{className:a.fullWidth,variant:"outlined",disabled:n},e.createElement(Ie,{id:"match-by-name-dropdown"},en),e.createElement(Ze,{labelId:"match-by-name-dropdown",label:en,value:r?t:"",onChange:o=>l==null?void 0:l(o.target.value)},r==null?void 0:r.map(o=>e.createElement(U,{key:o.name,value:o.name},o.name))))}const sa=N(()=>({fullWidth:{width:"100%","& > *":{flexGrow:1}}})),tn="Resource type";function ma({resourceType:t="",readonly:n,onResourceTypeChange:l}){const a=sa(),r=Lt();return e.createElement(Xe,{className:a.fullWidth,variant:"outlined",disabled:n},e.createElement(Ie,{id:"match-by-resource-dropdown"},tn),e.createElement(Ze,{labelId:"match-by-resource-dropdown",label:tn,value:r?t:"",onChange:o=>l==null?void 0:l(o.target.value),displayEmpty:!0},r==null?void 0:r.map(o=>e.createElement(U,{key:o,value:o},o))))}const ua="Action";function da({actions:t,readonly:n,onActionsChange:l}){return e.createElement(rt,{multiple:!0,id:"match-by-attribute-dropdown",options:["create","read","update","delete"],getOptionLabel:a=>a,value:t!=null?t:[],onChange:(a,r)=>l==null?void 0:l(r),filterSelectedOptions:!0,renderInput:a=>e.createElement(Ee,{...a,variant:"outlined",label:ua,placeholder:"Choose attributes",margin:"normal"}),disabled:n})}const pa=N(t=>({descriptiveText:{fontWeight:500,marginBottom:t.spacing(1)}})),ze=({children:t})=>{const n=pa();return e.createElement(C,{variant:"body2",className:n.descriptiveText},t)},nn="#FF737F",fa="#E22134";function ln({condition:t}){return e.createElement(ze,null,e.createElement(f,{component:"span",color:nn},t.ruleName,"("),e.createElement(f,{component:"span",color:fa},JSON.stringify(t.parameters)),e.createElement(f,{component:"span",color:nn},")"))}const rn=({children:t})=>e.createElement(f,{pl:3},t);function an({level:t}){return e.createElement(e.Fragment,null,e.createElement(ze,null,Qt[t.levelType]),e.createElement(rn,null,t.children.map((n,l)=>xe(n)?e.createElement(an,{key:l,level:n}):e.createElement(ln,{key:l,condition:n}))))}const Ea="#4CAF50";function ya({permissionCriteria:t}){return e.createElement("div",null,e.createElement(ze,null,"If the below conditions are met"),e.createElement(rn,null,Et(t)&&e.createElement(ln,{condition:t}),xe(t)&&e.createElement(an,{level:t})),e.createElement(ze,null,"Then the action is"," ",e.createElement(f,{component:"span",color:Ea},"allowed")))}const ga=N(()=>({addButton:{paddingLeft:40,paddingRight:40}}));function on({onSelect:t}){const n=ga(),l=ne(null),[a,r]=k(!1),o=()=>{r(i=>!i)};return e.createElement("div",null,e.createElement(w,{className:n.addButton,variant:"outlined",color:"primary",onClick:o,ref:l},"Add"),e.createElement(Dt,{anchorEl:l.current,open:a,onClose:o,BackdropProps:{}},Qr.map(i=>e.createElement(U,{key:i,onClick:()=>{t==null||t(i),r(!1)}},Qt[i]))))}const ha=N(t=>({editor:{"--jse-main-border":`1px solid ${t.palette.divider}`,"--jse-panel-border":`1px solid ${t.palette.divider}`,"--jse-message-error-background":t.palette.error.main,"--jse-message-warning-background":t.palette.warning.main,"--jse-background-color":t.palette.background.default,"--jse-panel-background":t.palette.background.default,"--jse-delimiter-color":t.palette.type==="light"?"rgba(0, 0, 0, 0.38)":"rgba(255, 255, 255, 0.38)","--jse-error-color":t.palette.text.primary,"--jse-key-color":t.palette.text.primary,"--jse-value-color":t.palette.text.primary,"--jse-text-color":t.palette.text.primary,"--jse-panel-color-readonly":t.palette.text.hint,"--jse-value-color-string":t.palette.status.ok,"--jse-value-color-null":t.palette.status.warning,"--jse-value-color-number":t.palette.status.error,"--jse-value-color-boolean":t.palette.status.running,"--jse-font-family":"inherit"}})),va=t=>"parseError"in t,ba=t=>{var n;return t?va(t)?!!t.parseError:((n=t==null?void 0:t.validationErrors)==null?void 0:n.length)>0:!1};function Ca({onChange:t,schema:n,value:l}){const a=ne(null),r=ne(),o=ha();return _(()=>(a.current&&!r.current&&(r.current=new Il({target:a.current,props:{onChange:(i,s,{contentErrors:m})=>{!ba(m)&&Ol(i)&&t(JSON.parse(i.text))},validator:Bl({schema:n}),content:{json:{}},mainMenuBar:!1,mode:Ml.text}})),()=>{var i;(i=r.current)==null||i.destroy(),r.current=void 0}),[t,n]),Ct(()=>{var i;(i=r.current)==null||i.updateProps({content:{json:l}})}),e.createElement("div",{ref:a,className:o.editor,style:{height:300}})}const xa=[];function Pa(t){const{onChange:n,schema:l,name:a}=t,{description:r,items:o}=l,[i,s]=e.useState(!1),m=Array.isArray(t.value)?t.value:xa,c=m.includes(ye),p=(y,P)=>{if(!Array.isArray(P)){const T=[...m];T[y]=P||"",n(T)}},d=R(()=>{n([...m,""])},[n,m]),u=y=>{n(m.filter((P,T)=>T!==y))},b=()=>{n(c?[]:[ye])},g=()=>{c&&s(!0)},E=()=>{s(!1)};return _(()=>{m.length?c&&m.length>1&&n([ye]):d()},[d,n,m,c]),!o||!("type"in o)?null:e.createElement(e.Fragment,null,(m!=null?m:[]).map((y,P,{length:T})=>e.createElement(sn,{allowEmptyStrings:!0,key:P,onChange:$=>p(P,$),name:P===0?a:"",schema:{description:P===T-1?r:"",type:o.type},value:y,controls:e.createElement(z,{size:"small",onClick:()=>u(P)},e.createElement(Ll,null))})),!!(m!=null&&m.length)&&e.createElement(f,{alignItems:"center",display:"flex",flexDirection:"row",justifyContent:"space-between"},e.createElement(f,null,e.createElement(Nt,{control:e.createElement(Je,{checked:c,onChange:b,name:"checkedB",color:"primary"}),label:"Use the claims from the logged in users token"})),e.createElement(f,null,e.createElement(fe,{onClose:E,onOpen:g,open:i,title:"To add additional entries you must uncheck using the claims from the logged in user."},e.createElement("span",null,e.createElement(z,{disabled:c,size:"small",onClick:d},e.createElement(at,null)))))))}function Da(t){const{onChange:n,schema:l,name:a,value:r}=t,{description:o}=l;return e.createElement(f,{mb:1},e.createElement(Nt,{control:e.createElement(Je,{checked:r===!0,onChange:i=>{n(i.target.checked)},name:a,color:"primary"}),label:a}),o&&e.createElement(C,{display:"block",variant:"caption",color:"textSecondary"},o))}function Na({allowEmptyStrings:t,controls:n,name:l,onChange:a,schema:r,value:o}){const i=s=>{a(Aa({value:s.currentTarget.value,type:r.type}))};return e.createElement(f,{mb:1},e.createElement(f,{display:"flex",gridGap:6},e.createElement(Ee,{fullWidth:!0,id:l,label:l,placeholder:"Enter",variant:"outlined",size:"small",value:wa(o,t),onChange:ht(o,t)?void 0:i,disabled:ht(o,t)}),n&&e.createElement(f,{alignSelf:"center"},n)),r.description&&e.createElement(C,{variant:"caption",color:"textSecondary"},r.description,ht(o)&&!t&&e.createElement(e.Fragment,null," (switch to JSON editor to edit)")))}function ht(t,n=!1){return!n&&t===""||t===null||t===ye}function wa(t,n=!1){return!n&&t===""?"[empty string]":t===null?"[null]":t===ye?"[BackstageUserClaims]":t||""}function Aa({value:t,type:n}){switch(n){case"string":return t===""?void 0:t;case"number":case"integer":return Number.isNaN(Number(t))?void 0:Number(t);case"null":return t==="null"?null:void 0;default:return}}function cn(t){return!!t&&"type"in t&&(t.type==="array"||t.type==="boolean"||t.type==="null"||t.type==="number"||t.type==="integer"||t.type==="string")}function Ta(t){return"type"in t&&t.type==="array"}function Sa(t){return"type"in t&&t.type==="boolean"}function sn({schema:t,...n}){return cn(t)?Ta(t)?e.createElement(Pa,{...n,schema:t}):Sa(t)?e.createElement(Da,{...n,schema:t}):e.createElement(Na,{...n,schema:t}):null}const ka=new It({allErrors:!0});function Ra({onChange:t,schema:n,value:l}){var a;const r=L(()=>ka.compile(n),[n]),o=L(()=>r(l),[r,l]),i=Object.entries(n.properties),s=m=>c=>{t({...l,[m]:c})};return e.createElement(e.Fragment,null,i.map(([m,c])=>{var p;return e.createElement(sn,{isRequired:((p=n.required)==null?void 0:p.includes(m))||!1,key:m,name:m,onChange:s(m),schema:c,value:l==null?void 0:l[m]})}),e.createElement(wt,{error:!o},(a=r.errors)==null?void 0:a[0].message))}const $a=t=>!!t&&"properties"in t;function Ia({onChange:t,rule:n,value:l}){const[a,r]=k(!1),{paramsSchema:o}=n!=null?n:{},i=()=>r(p=>!p);if(!$a(o))return null;const s=!Oa(o),m=s||a,c=e.createElement(w,{size:"small",onClick:i,disabled:s},m?"Close editor":"Edit as JSON");return e.createElement(f,{marginTop:2},e.createElement("form",null,m?e.createElement(Ca,{onChange:t,schema:o,value:l}):e.createElement(e.Fragment,null,e.createElement(f,{marginBottom:2},e.createElement(Ie,null,"Parameters")),e.createElement(Ra,{onChange:t,schema:o,value:l}))),e.createElement(f,{display:"flex",flexDirection:"column",alignItems:"flex-end",marginTop:1},s?e.createElement(fe,{title:"Only JSON editing is supported for this parameter",arrow:!0},e.createElement("span",null,c)):c))}function Oa(t){return Object.values(t.properties).every(cn)}const Ba=N(t=>({conditionCard:{minWidth:t.spacing(63)},conditionCardBar:{height:t.spacing(1),backgroundImage:"linear-gradient(90deg, #007DFF 0%, #0057B2 100%)"},autocomplete:{flex:1}}));function mn({ruleName:t,parameters:n,resourceType:l,onChange:a,onDelete:r}){var o;const i=Ba(),s=Bt(),m=(o=s==null?void 0:s.filter(u=>u.resourceType===l))!=null?o:[],c=m.find(u=>u.name===t),p=u=>{a(u,{})},d=R(u=>{a(t,u)},[a,t]);return e.createElement(f,{display:"flex",alignItems:"center"},e.createElement(Y,{className:i.conditionCard},e.createElement("div",{className:i.conditionCardBar}),e.createElement(pe,null,e.createElement(f,null,e.createElement(f,null,e.createElement(rt,{className:i.autocomplete,"data-testid":"rule-select",getOptionLabel:u=>u.name,getOptionSelected:(u,b)=>u.name===b.name,options:m,onChange:(u,b)=>p(b?b.name:null),renderInput:u=>e.createElement(e.Fragment,null,e.createElement(f,{marginBottom:2},e.createElement(Ie,null,"Rule")),e.createElement(Ee,{...u,placeholder:"Select",variant:"outlined",size:"small",name:"rule"})),renderOption:u=>e.createElement(f,null,e.createElement(C,{variant:"body2"},u.name),e.createElement(C,{noWrap:!0,variant:"caption"},u.description)),value:c||null,PopperComponent:u=>e.createElement(Zn,{...u,style:{width:"auto"},placement:"bottom-start"})})),e.createElement(f,{flex:"1"},e.createElement(f,{display:"flex",flexDirection:"column"},e.createElement(Ia,{rule:c,onChange:d,value:n})))))),e.createElement(f,{ml:1},e.createElement(z,{"aria-label":"delete",onClick:r,size:"small"},e.createElement(ge,null))))}function Ge(){return{id:ce(),ruleName:null,parameters:{}}}const Ma=N(t=>({conditionTypeFormControl:{minWidth:80,marginLeft:t.spacing(1)}}));function La({level:t,onSelect:n}){const l=Ma(),a=t.children.length>1;return e.createElement(f,{display:"flex",alignItems:"center"},e.createElement(Xe,{className:l.conditionTypeFormControl},e.createElement(Ze,{value:t.levelType,onChange:r=>n==null?void 0:n(r.target.value)},e.createElement(U,{key:"anyOf",value:"anyOf"},"Any of"),e.createElement(U,{key:"allOf",value:"allOf"},"All of"),e.createElement(U,{key:"not",value:"not",disabled:a},"Not"))),e.createElement(f,{ml:1},e.createElement(z,{"aria-label":"delete",onClick:()=>n==null?void 0:n(null),size:"small"},e.createElement(ge,null))))}const Fa=N(t=>({treeVerticalSpacer:{width:t.spacing(2),borderLeft:`1px solid ${t.palette.status.aborted}`},treeHorizontalSpacer:{height:t.spacing(3),borderLeft:`1px solid ${t.palette.status.aborted}`},treeVerticalBranchHalf:{position:"absolute",height:"50%",borderLeft:`1px solid ${t.palette.status.aborted}`,alignSelf:"flex-start"},treeVerticalBranchFull:{borderLeft:`1px solid ${t.palette.status.aborted}`,alignSelf:"stretch"},treeHorizontalBranch:{width:t.spacing(2),borderTop:`1px solid ${t.palette.status.aborted}`}}));function un({level:t,resourceType:n,onChange:l,parentConditionType:a,isRoot:r=!1}){const o=Fa(),i=R((g,E)=>{const y=[...t.children];return y.splice(g,1,E),y},[t]),s=R(g=>{l({...t,children:g})},[l,t]),m=R(g=>{g===null?l(null):g==="not"&&t.children.length>1?l({...t,levelType:g,children:t.children.slice(0,1)}):l({...t,levelType:g})},[l,t]),c=R((g,E)=>{s(g===null?dn(t.children,E):i(E,g))},[t,s,i]),p=g=>{const E=ce();g==="condition"?s([...t.children,Ge()]):g==="not"?s([...t.children,{id:E,levelType:g,children:[]}]):Xr(g)&&s([...t.children,{id:E,levelType:g,children:[Ge()]}])},d=g=>{s(dn(t.children,g))},u=L(()=>t.children.map((g,E)=>(y,P)=>{s(i(E,{...g,ruleName:y,parameters:P}))}),[t.children,s,i]),b=L(()=>t.children.map((g,E)=>y=>c(y,E)),[t.children,c]);return e.createElement("div",null,!r&&e.createElement("div",{className:o.treeHorizontalSpacer}),e.createElement(f,{display:"flex",alignItems:"center",position:"relative"},!r&&e.createElement(e.Fragment,null,e.createElement("div",{className:a==="not"?o.treeVerticalBranchHalf:o.treeVerticalBranchFull}),e.createElement("div",{className:o.treeHorizontalBranch})),e.createElement(La,{level:t,onSelect:m})),e.createElement(f,{display:"flex"},r||a==="not"?e.createElement(f,{pl:2}):e.createElement("div",{className:o.treeVerticalSpacer}),!r&&e.createElement(f,{pl:2}),e.createElement("div",null,t.children.map((g,E)=>xe(g)?e.createElement(f,{key:g.id},e.createElement(un,{level:g,resourceType:n,parentConditionType:t.levelType,onChange:b[E]})):e.createElement(Ne,{key:g.id},e.createElement("div",{className:o.treeHorizontalSpacer}),e.createElement(f,{display:"flex",alignItems:"center",position:"relative"},e.createElement("div",{className:t.levelType==="not"?o.treeVerticalBranchHalf:o.treeVerticalBranchFull}),e.createElement("div",{className:o.treeHorizontalBranch}),e.createElement(mn,{ruleName:g.ruleName,parameters:g.parameters,resourceType:n,onChange:u[E],onDelete:()=>d(E)})))),!(t.levelType==="not"&&t.children.length>=1)&&e.createElement(e.Fragment,null,e.createElement("div",{className:o.treeHorizontalSpacer}),e.createElement(f,{display:"flex",alignItems:"center",position:"relative"},e.createElement("div",{className:o.treeVerticalBranchHalf}),e.createElement("div",{className:o.treeHorizontalBranch}),e.createElement(on,{onSelect:p}))))))}function dn(t,n){const l=[...t];return l.splice(n,1),l}const ja=N(t=>({paper:{backgroundColor:t.palette.background.default,padding:t.spacing(3),marginBottom:t.spacing(3),minHeight:t.spacing(48)}}));function Ha({permissionCriteria:t,resourceType:n,onUpdate:l,readonly:a=!1}){const r=ja(),o=R(p=>{l(d=>({...d,...p}))},[l]),i=R(p=>{const d=ce();o(p==="condition"?Ge():p==="not"?{id:d,levelType:p,children:[]}:{id:d,levelType:p,children:[Ge()]})},[o]),s=R((p,d)=>{l(u=>({...u,ruleName:p,parameters:d}))},[l]),m=R(()=>{l(null)},[l]);let c;return a?c=e.createElement(ya,{permissionCriteria:t}):t===null?c=e.createElement(on,{onSelect:i}):Et(t)?c=e.createElement(mn,{ruleName:t.ruleName,parameters:t.parameters,resourceType:n,onChange:s,onDelete:m}):xe(t)&&(c=e.createElement(un,{level:t,resourceType:n,onChange:l,isRoot:!0})),e.createElement(el,{variant:"outlined",className:r.paper},c)}const Wa=N(t=>({dialogTitle:{display:"flex",alignItems:"center",justifyContent:"space-between"},fullWidth:{width:"100%","& > *":{flexGrow:1}},infoIcon:{position:"absolute",right:t.spacing(3)},content:{padding:t.spacing(7)},saveButton:{paddingLeft:t.spacing(5),paddingRight:t.spacing(5)},contentContainerConditional:{display:"flex",gap:t.spacing(5),maxWidth:1480}})),za={specificPermission:"Choose a specific permission",filter:"Filter by permission properties",all:"Match all permissions"},pn="Choose the name of a resource permission or filter by resource type to set a conditional decision.";function Ga({rolePermission:t,readonly:n=!1,onClose:l,onSave:a}){const r=Wa(),o=Mt(),i=Bt(),s=Ql(),m=Zr(t),[c,p]=k(m.match),[d,u]=k(m.decisionType),[b,g]=k(m.criteria),E=L(()=>oa(o,c),[o,c]),y=d==="conditional",P=y?"xl":"sm";_(()=>{y&&o&&!E.commonResourceType&&u("allow")},[y,o,E.commonResourceType,u]);const T=A=>{A!==null&&u(A)},$=L(()=>c.method==="specificPermission"&&!c.name||c.method==="filter"&&!c.resourceType&&!c.actions,[c]),j=L(()=>E.permissions.length===0?!1:!$,[E,$]),B=L(()=>d!=="conditional"?!0:!(!E.commonResourceType||!(s!=null&&s[E.commonResourceType].pluginId)||!Xt(b,i)),[d,E,s,b,i]),v=()=>{a==null||a(na(m.id,c,d==="conditional"?{resourceType:E.commonResourceType,pluginId:s[E.commonResourceType].pluginId,conditions:yt(b)}:d))};return e.createElement(oe,{open:!0,maxWidth:P,onClose:l,fullWidth:!0},e.createElement($e,{disableTypography:!0,className:r.dialogTitle},e.createElement(C,{variant:"h4",component:"h2"},"New Permission Decision"),e.createElement(w,{startIcon:e.createElement(lt,null),onClick:l},"Close")),e.createElement(K,{dividers:!0,className:r.content},e.createElement(f,{className:y?r.contentContainerConditional:void 0},e.createElement(f,{mb:5,flex:1},e.createElement(Kr,{options:Object.entries(za).map(([A,h])=>({id:A,displayText:h})),selected:c.method,onChange:A=>p({method:A}),readonly:n})),e.createElement(f,{mb:5,height:189,flex:1},c.method==="specificPermission"&&e.createElement(ca,{name:c.name,readonly:n,onNameChange:A=>p({...c,name:A})}),c.method==="filter"&&e.createElement(e.Fragment,null,e.createElement(ma,{resourceType:c.resourceType,readonly:n,onResourceTypeChange:A=>p({...c,resourceType:A})}),e.createElement(da,{actions:c.actions,readonly:n,onActionsChange:A=>p({...c,actions:A.length?A:void 0})}),$?null:e.createElement(e.Fragment,null,e.createElement(f,{marginY:2},e.createElement(et,{variant:"middle"})),e.createElement(wt,null,`Matched ${E.permissions.length} ${E.permissions.length===1?"permission":"permissions"}`)))),e.createElement(f,{mb:5,flex:1},e.createElement(f,{display:"flex",alignItems:"center"},e.createElement(aa,{value:d,exclusive:!0,fullWidth:!0,"aria-label":"Decision result",onChange:(A,h)=>T(h)},e.createElement(gt,{value:"allow","aria-label":"Decision allowed",disabled:n},"Allow"),e.createElement(gt,{value:"deny","aria-label":"Decision denied",disabled:n},"Deny"),e.createElement(gt,{value:"conditional","aria-label":"Decision conditionally allowed",disabled:!E.commonResourceType||n},"Conditional")),!y&&!n&&e.createElement(fe,{title:pn},e.createElement($t,{className:r.infoIcon,color:"primary","aria-label":pn}))))),d==="conditional"&&!!E.commonResourceType&&e.createElement(Ha,{permissionCriteria:b,resourceType:E.commonResourceType,onUpdate:g,readonly:n}),!n&&e.createElement(f,{display:"flex",justifyContent:"flex-end"},e.createElement(w,{variant:"contained",color:"primary",className:r.saveButton,onClick:v,disabled:!j||!B},"Save"))))}const Va=N(t=>({container:{display:"flex",position:"relative",alignItems:"center",gap:t.spacing(1),flexShrink:1,maxWidth:"100%",minWidth:0},input:({invalid:n})=>({boxSizing:"content-box",display:"block",maxWidth:"100%",padding:0,borderWidth:2,borderStyle:"solid",borderColor:n?t.palette.error.main:"transparent",borderRadius:t.shape.borderRadius,backgroundColor:"transparent",color:t.palette.textContrast,fontFamily:"inherit",fontSize:"inherit",lineHeight:"inherit",fontWeight:"inherit",textOverflow:"ellipsis"}),hiddenSpan:{position:"absolute",top:0,left:0,borderWidth:1,whiteSpace:"pre",opacity:0,pointerEvents:"none"}}));function fn({invalid:t,name:n,value:l,onTextChange:a}){const r=Va({invalid:t}),[o,i]=k(!1),[s,m]=k(null),c=ne(null),[p,d]=k(l);_(()=>{d(l)},[l]),$n(()=>{c.current&&s&&c.current.style.setProperty("width",`max(${s.getBoundingClientRect().width}px, 3ch)`)},[s,p]);const u=()=>{i(!1),d(l)},b=()=>{i(!1),a==null||a(p)},g=()=>{var y;o?b():(i(!0),(y=c.current)==null||y.focus())},E=y=>{var P;y.key==="Enter"&&((P=c.current)==null||P.blur()),y.key==="Escape"&&u()};return e.createElement(e.Fragment,null,e.createElement("div",{className:r.container},e.createElement("input",{"aria-label":n,className:r.input,name:n,ref:c,onChange:y=>d(y.target.value),onFocus:g,onBlur:b,onKeyDown:E,value:p}),e.createElement("span",{"aria-hidden":"true",className:r.hiddenSpan,ref:m},p),e.createElement(z,{onClick:g,size:"small"},o?e.createElement(jl,{"aria-label":"Save title"}):e.createElement(Fl,{"aria-label":"Edit title"}))))}const En=t=>{if(t.success)return{};const n={};for(const l of t.error.issues)n[l.path.join(".")]=!0;return n},yn=({children:t,onConfirm:n,message:l,title:a})=>{const[r,o]=k(!1),i=()=>o(!1),s=()=>o(!0),m=()=>{n(),i()};return e.createElement(e.Fragment,null,t({onClick:s}),e.createElement(oe,{open:r,onClose:i},e.createElement($e,null,e.createElement(f,{display:"flex",justifyContent:"space-between",alignItems:"center"},a)),e.createElement(K,null,e.createElement(tl,null,l)),e.createElement(Ye,null,e.createElement(w,{"aria-label":"Cancel action",color:"primary",onClick:i},"Cancel"),e.createElement(w,{"aria-label":"Confirm action",color:"secondary",onClick:m,variant:"contained"},"Confirm"))))},gn=({helpText:t})=>e.createElement(f,{display:"flex",alignItems:"center"},e.createElement(f,{component:"span",mr:1},e.createElement(C,{variant:"body2",noWrap:!0},"Reorder")),e.createElement(fe,{title:t},e.createElement($t,{color:"primary","aria-label":t}))),hn=(t,n,l)=>{const a=n+l;if(a<0||a>=t.length)return t;const r=[...t];return[r[a],r[n]]=[r[n],r[a]],r},vn=({array:t,index:n,onReorder:l})=>{const a=n===0,r=n===t.length-1;return e.createElement(f,{display:"flex"},e.createElement(z,{disabled:a,onClick:()=>l(hn(t,n,-1)),"aria-label":"Move up",size:"small"},e.createElement(Wl,null)),e.createElement(z,{disabled:r,onClick:()=>l(hn(t,n,1)),"aria-label":"Move down",size:"small"},e.createElement(Hl,null)))},Ua=N(()=>({emptyStateImage:{width:"95%",zIndex:2,position:"relative",left:"50%",top:"50%",transform:"translate(-50%, 15%)"}}));function bn({src:t,alt:n}){const l=Ua();return e.createElement("img",{src:t,className:`${l.emptyStateImage} `,alt:n})}const _a="Use the arrows to change the order in which permission decisions are evaluated.";function Ya({diff:t,permissions:n,onReorderPermissions:l,onNewPermissionClick:a,onOpenPermission:r,onRemovePermissionClick:o,anyAllow:i,readonly:s=!1}){return e.createElement(e.Fragment,null,e.createElement(f,{display:"flex",justifyContent:"space-between",padding:2},e.createElement(C,{variant:"h5"},"Permission Decisions"),!s&&n.length!==0&&e.createElement(w,{color:"primary",variant:"outlined",startIcon:e.createElement(at,null),onClick:a},"New")),e.createElement(qe,null,e.createElement(Ke,null,e.createElement(V,null,!s&&!i&&e.createElement(D,{style:{width:0}},e.createElement(gn,{helpText:_a})),e.createElement(D,null,"Match by"),e.createElement(D,null,"Decision"),e.createElement(D,null),!s&&e.createElement(D,null))),e.createElement(Qe,null,n.length===0&&e.createElement(V,null,e.createElement(D,{colSpan:5},e.createElement(Te,{title:"No permission decisions set",description:"Click the button below to create your first permission.",missing:{customImage:e.createElement(bn,{src:zl,alt:"No permission placeholder"})},action:e.createElement(w,{variant:"contained",color:"primary",onClick:a},"New permission decision")}))),n.map((m,c)=>e.createElement(V,{key:c},!s&&!i&&e.createElement(D,null,e.createElement(vn,{array:n,index:c,onReorder:l})),e.createElement(D,null,e.createElement(nl,{onClick:()=>r(c)},e.createElement(C,{variant:"body2",color:"primary"},mt(m)))),e.createElement(D,null,dr(m)),e.createElement(D,null,e.createElement(Ce,{operation:t==null?void 0:t.permissions[m.id].operation})),!s&&e.createElement(D,{align:"right"},e.createElement(yn,{message:"Are you sure you want to remove this permission decision?",onConfirm:()=>o(c),title:"Remove?"},p=>e.createElement(z,{...p,"aria-label":"Remove permission decision",size:"small"},e.createElement(ge,null)))))))))}function Ja(){const{roleId:t,versionId:n}=Ve();return Oe(t),Oe(n),e.createElement(He,{policyId:n},e.createElement(qa,{roleId:t}))}function qa({roleId:t}){const{diff:n,updateLocalDraft:l,policy:a}=X(),r=a.roles.find(h=>h.id===t),o=n==null?void 0:n.roles[t],[i,s]=k(null),[m,c]=k(!1),p=Ue(),{NotFoundErrorPage:d}=p.getComponents(),u=G(),b=N(h=>({cardContainer:{margin:h.spacing(0)}}))();if(!r)return e.createElement(d,null);const g=r.name,E=h=>{const S=a.roles.findIndex(Z=>Z.id===h.id),O=[...a.roles];O.splice(S,1,h),l({...a,roles:O})},y=h=>{E({...r,name:h})},P=h=>{if(i===null)E({...r,permissions:[h,...r.permissions]});else{const S=[...r.permissions];S.splice(i,1,h),E({...r,permissions:S})}c(!1)},T=h=>{if(h==="*")E({...r,members:r.members==="*"?[]:"*"});else if(r.members==="*")E({...r,members:[h]});else{const S=r.members.includes(h)?r.members.filter(O=>O!==h):[...r.members,h];E({...r,members:S.length===0?"*":S})}},$=h=>{E({...r,permissions:r.permissions.filter((S,O)=>h!==O)})},j=h=>{E({...r,permissions:h})},B=En(fl.safeParse(r)).name,v=a.status!=="draft",A=a.options.resolutionStrategy==="any-allow";return e.createElement(e.Fragment,null,e.createElement(Fe,{pages:[{title:a.name,path:`../../../${a.id}`},{title:g}],header:e.createElement(ke,{titleComponent:e.createElement(Yt,null,a.name," \xA0\u01C0",v?e.createElement(e.Fragment,null,"\xA0",g):e.createElement(fn,{invalid:B,value:g,onTextChange:y}),e.createElement(Ce,{operation:o==null?void 0:o.role.operation,size:"large"})),description:a.description},e.createElement(w,{variant:"outlined",color:"primary",onClick:()=>u("../..",{relative:"path"})},"Back to policy"))},e.createElement(F,{container:!0,className:b.cardContainer,spacing:4,direction:"row"},e.createElement(F,{item:!0,xs:6},e.createElement(Y,null,e.createElement(Yr,{diff:o||null,role:r,policyId:a.id,onToggleMember:T,readonly:v}))),e.createElement(F,{item:!0,xs:6},e.createElement(Y,null,e.createElement(Ya,{diff:o||null,permissions:r.permissions,onNewPermissionClick:()=>{s(null),c(!0)},onOpenPermission:h=>{s(h),c(!0)},onReorderPermissions:j,onRemovePermissionClick:$,anyAllow:A,readonly:v}))))),m&&e.createElement(Ga,{rolePermission:i!==null?r.permissions[i]:void 0,onClose:()=>c(!1),onSave:P,readonly:v}))}const Ka="Use the arrows to change the order in which roles are evaluated.";function Qa({}){const{diff:t,policy:n,createNewRole:l,updateLocalDraft:a}=X(),r=G(),o=Xa(n),i=n.status!=="draft",s=n.options.resolutionStrategy==="any-allow",m=d=>{a({...n,roles:d})},c=d=>{a({...n,roles:n.roles.filter(({id:u})=>u!==d)})},p=()=>{r(`./roles/${l()}`)};return e.createElement(Y,null,e.createElement(f,{display:"flex",justifyContent:"space-between",padding:2},e.createElement(C,{variant:"h3"},"Roles"),!i&&e.createElement(w,{color:"primary",variant:"outlined",startIcon:e.createElement(at,null),onClick:()=>p()},"New role")),e.createElement(qe,null,e.createElement(Ke,null,e.createElement(V,null,!i&&!s&&e.createElement(D,{style:{width:0}},e.createElement(gn,{helpText:Ka})),e.createElement(D,null,"Name"),e.createElement(D,null,"Users"),e.createElement(D,null,"Groups"),!i&&e.createElement(D,{style:{width:0}}))),e.createElement(Qe,null,o.map((d,u)=>e.createElement(V,{key:u},!i&&!s&&e.createElement(D,null,e.createElement(vn,{array:n.roles,index:u,onReorder:m})),e.createElement(D,null,e.createElement(f,{alignItems:"center",display:"flex",gridGap:8},e.createElement(de,{to:`roles/${d.id}`},d.name),e.createElement(Ce,{operation:t==null?void 0:t.roles[d.id].role.operation}))),e.createElement(D,null,d.userCount),e.createElement(D,null,d.groupCount),!i&&e.createElement(D,{align:"right"},e.createElement(yn,{message:"Are you sure you want to remove this role?",title:"Remove role?",onConfirm:()=>c(d.id)},b=>e.createElement(z,{...b,"aria-label":"Remove role",size:"small"},e.createElement(ge,null)))))))))}function Xa(t){return t.roles.map(n=>({id:n.id,name:n.name,userCount:Array.isArray(n.members)?n.members.filter(l=>l.startsWith("user:")).length:n.members,groupCount:Array.isArray(n.members)?n.members.filter(l=>l.startsWith("group:")).length:n.members}))}const Za=N(t=>({cardHeader:{padding:t.spacing(3,3),borderBottom:`1px solid ${t.palette.border}`},cardContent:{padding:t.spacing(6,3),"& > *":{background:"transparent"}},emptyStateImage:{width:"95%",zIndex:2,position:"relative",left:"50%",top:"50%",transform:"translate(-50%, 15%)"}}));function eo({readonly:t}){const n=Za(),l=G(),{createNewRole:a}=X(),r=()=>{const o=a();l(`./roles/${o}`)};return e.createElement(Y,null,e.createElement(At,{title:"Roles",className:n.cardHeader}),e.createElement(pe,{className:n.cardContent},t?e.createElement(Te,{title:"No roles configured",missing:"content"}):e.createElement(Te,{title:"No roles yet",description:"Click the button below to create your first role.",missing:{customImage:e.createElement(bn,{src:Gl,alt:"No roles placeholder"})},action:e.createElement(w,{variant:"contained",color:"primary",onClick:()=>r()},"New role")})))}function to(){const[t,n]=k(null),{hasDraftPolicy:l}=je(),{isValid:a,discardLocalDraft:r,exportPolicy:o,hasChanges:i,policy:s,saveLocalDraftToServer:m,saveAndPublish:c,publish:p}=X(),d=G(),[u,b]=ft(),g=y=>{n(y.currentTarget)},E=()=>{n(null)};return e.createElement(e.Fragment,null,e.createElement(ll,{variant:"contained",color:"primary"},s.status==="draft"&&e.createElement(w,{disabled:!a,onClick:()=>m()},"Save"),s.status==="inactive"&&e.createElement(w,{onClick:()=>p()},"Republish"),s.status==="active"&&e.createElement(w,{disabled:l||u.loading,onClick:()=>b(s)},"Duplicate"),e.createElement(w,{color:"primary",title:"options",size:"small",onClick:g},e.createElement(Vl,null))),e.createElement(Dt,{getContentAnchorEl:null,anchorEl:t,anchorOrigin:{vertical:"bottom",horizontal:"right"},open:!!t,onClose:E,PaperProps:{style:{width:240}}},s.status==="draft"&&e.createElement(tt,null,e.createElement(U,{disabled:!a,onClick:()=>c()},e.createElement(re,null,e.createElement(_l,{fontSize:"small"})),e.createElement(ae,null,"Save & Publish")),e.createElement(U,{disabled:!i,onClick:()=>r()},e.createElement(re,null,e.createElement(Ul,{color:i?"secondary":"inherit",fontSize:"small"})),e.createElement(ae,null,e.createElement(C,{color:i?"secondary":"inherit"},"Discard changes"))),e.createElement(et,null)),e.createElement(tt,null,e.createElement(U,{onClick:()=>o()},e.createElement(re,null,e.createElement(Jl,{fontSize:"small"})),e.createElement(ae,null,"Export"))),e.createElement(et,null),e.createElement(tt,null,e.createElement(U,{disabled:!a,onClick:()=>d("./options")},e.createElement(re,null,e.createElement(Yl,{fontSize:"small"})),e.createElement(ae,null,"Options")))))}function no(){const{versionId:t}=Ve();return Oe(t),e.createElement(He,{policyId:t},e.createElement(lo,null))}function lo(){const{policy:t,updateLocalDraft:n}=X(),l=o=>{n({...t,name:o})},a=En(El.safeParse(t)).name,r=t.status!=="draft";return e.createElement(Fe,{pages:[{title:t.name}],header:e.createElement(ke,{title:t.name,titleComponent:e.createElement(e.Fragment,null,e.createElement(Yt,null,r?t.name:e.createElement(fn,{invalid:a,name:"Policy name",value:t.name,onTextChange:l}),e.createElement(Wt,{status:t.status})),ro(t))},e.createElement(to,null))},e.createElement(F,{item:!0,xs:12},t.roles.length>0?e.createElement(Qa,null):e.createElement(eo,{readonly:r})))}function ro(t){const n={created:"Created by ",published:"Last published by ",updated:"Last updated by "},{activityDateText:l,activityUser:a,timestamp:r}=Vt(t,n);return e.createElement(C,{variant:"body2"},e.createElement(C,{component:"span",display:"inline",variant:"body2"},`${l} ${a} `),e.createElement(Gt,{timestamp:r}))}const ao=N(t=>({card:n=>({marginTop:t.spacing(3),height:"100%","&:hover":n.readonly?{pointerEvents:"none"}:{}}),cardHeader:{paddingBottom:t.spacing(2),alignItems:"flex-start"},defaultChip:{marginLeft:t.spacing(1),marginBottom:0},title:{display:"flex",alignItems:"center",paddingTop:t.spacing(.5),paddingBottom:t.spacing(1)}}));function Cn(t){const n=ao(t),{title:l,description:a,active:r,changeResolutionStrategy:o,defaultOption:i,readonly:s}=t,m=()=>{s||o()};return e.createElement(Y,{className:`${n.card}`,onClick:m},e.createElement(rl,{disabled:s},e.createElement(pe,null,e.createElement(At,{className:n.cardHeader,avatar:e.createElement(al,{checked:r,color:"primary",disabled:s}),title:e.createElement("div",{className:n.title},e.createElement(C,{variant:"h6",component:"h2"},l),i?e.createElement(Re,{label:"Default",size:"small",className:n.defaultChip}):null),subheader:a}))))}const oo=N(t=>({title:{display:"flex",alignItems:"center",paddingBottom:t.spacing(2)},maxWidthWrapper:{maxWidth:"800px"},readOnlyChip:{marginLeft:t.spacing(1)},paragraph:{paddingBottom:t.spacing(1)}}));function io(){const{versionId:t}=Ve();return Oe(t),e.createElement(He,{policyId:t},e.createElement(co,null))}function co(){const t=oo(),{policy:n,updateLocalDraft:l}=X(),a=G(),r=n.status!=="draft",o=i=>{l({...n,options:{...n.options,resolutionStrategy:i}})};return e.createElement(Fe,{pages:[{title:n.name,path:".."},{title:"Options"}],header:e.createElement(ke,{title:"Options"},e.createElement(w,{variant:"outlined",color:"primary",onClick:()=>a("..",{relative:"path"})},"Back to policy"))},e.createElement(F,{item:!0,xs:12,className:t.maxWidthWrapper},e.createElement("div",null,e.createElement("div",{className:t.title},e.createElement(C,{variant:"h5",component:"h1"},"Decision resolution strategy"),r?e.createElement(Re,{label:"Read only",className:t.readOnlyChip}):null),e.createElement(C,{variant:"body2",component:"p",className:t.paragraph},"Multiple decisions from multiple roles could be applicable to a single user when authorizing a permission request. Please select the decision resolution strategy that makes sense for your policy."),e.createElement(C,{variant:"body2",component:"p",className:t.paragraph},"Please note this strategy will be applied to the whole policy and greatly affects the outcome of permission decisions."),e.createElement(Cn,{title:"Any-allow",changeResolutionStrategy:()=>o("any-allow"),readonly:r,defaultOption:!0,description:e.createElement(e.Fragment,null,e.createElement(C,{variant:"body2",color:"textSecondary",component:"p",className:t.paragraph},"The first allow decision from all of the roles and decisions is the final result. A single explicit allow or an allow as a result of a conditional decision would result in a final allow decision, otherwise the decision is deny."),e.createElement(C,{variant:"body2",color:"textSecondary",component:"p",className:t.paragraph},"With this option, the order of roles and decisions does not matter.")),active:n.options.resolutionStrategy==="any-allow"}),e.createElement(Cn,{title:"First match",changeResolutionStrategy:()=>o("first-match"),readonly:r,description:e.createElement(e.Fragment,null,e.createElement(C,{variant:"body2",color:"textSecondary",component:"p",className:t.paragraph},"The first matching decision from the first matching role that is applicable to the user is the final result, regardless if that decision is an allow, deny or conditional."),e.createElement(C,{variant:"body2",color:"textSecondary",component:"p",className:t.paragraph},"With this option, the order in which you define roles and decisions matters.")),active:n.options.resolutionStrategy==="first-match"}))))}function so(){const t=Ue(),{NotFoundErrorPage:n}=t.getComponents();return e.createElement(ql,{loading:e.createElement(Se,null),unauthorized:e.createElement(n,null)},e.createElement(nr,null,e.createElement(Kl,null,e.createElement(Vr,null,e.createElement(On,null,e.createElement(Ae,{element:e.createElement(Ir,null),path:"/"}),e.createElement(Ae,{element:e.createElement(no,null),path:"/versions/:versionId"}),e.createElement(Ae,{element:e.createElement(io,null),path:"/versions/:versionId/options"}),e.createElement(Ae,{element:e.createElement(Ja,null),path:"/versions/:versionId/roles/:roleId"}))))))}export{so as RBACRoot};
3
+ //# sourceMappingURL=Root-ce389844.esm.js.map
@@ -1,2 +1,2 @@
1
- import{createApiRef as w,createRouteRef as g,createPlugin as R,createApiFactory as B,fetchApiRef as C,discoveryApiRef as $,createRoutableExtension as P,createComponentExtension as U}from"@backstage/core-plugin-api";import{ResponseError as S}from"@backstage/errors";var T=Object.defineProperty,E=(i,t,e)=>t in i?T(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e,f=(i,t,e)=>(E(i,typeof t!="symbol"?t+"":t,e),e),k=(i,t,e)=>{if(!t.has(i))throw TypeError("Cannot "+e)},y=(i,t,e)=>{if(t.has(i))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(i):t.set(i,e)},r=(i,t,e)=>(k(i,t,"access private method"),e),h,d,a,o;const u=w({id:"plugin.rbac"});class j{constructor(t){y(this,h),y(this,a),f(this,"fetchApi"),f(this,"discoveryApi"),this.fetchApi=t.fetchApi,this.discoveryApi=t.discoveryApi}async getPolicies(){const{fetch:t}=this.fetchApi,e=await t(`${await this.discoveryApi.getBaseUrl("rbac")}/policies`);return r(this,a,o).call(this,e)}async getPolicy(t){const{fetch:e}=this.fetchApi,s=await e(`${await this.discoveryApi.getBaseUrl("rbac")}/policies/${t}`);return r(this,a,o).call(this,s)}async getActivePolicy(){const{fetch:t}=this.fetchApi,e=await t(`${await this.discoveryApi.getBaseUrl("rbac")}/policies/active`);return r(this,a,o).call(this,e)}async searchMembers(t){const{fetch:e}=this.fetchApi,s=await e(`${await this.discoveryApi.getBaseUrl("rbac")}/members?query=${encodeURIComponent(t.query)}`);return r(this,a,o).call(this,s)}async authorize(){const{fetch:t}=this.fetchApi,e=await t(`${await this.discoveryApi.getBaseUrl("rbac")}/authorize`);return r(this,a,o).call(this,e)}async createDraft(t){const{fetch:e}=this.fetchApi,s=await e(`${await this.discoveryApi.getBaseUrl("rbac")}/policies`,{method:"POST",body:JSON.stringify(t),headers:{"Content-Type":"application/json"}});return r(this,a,o).call(this,s)}async updateDraft(t,e){const{fetch:s}=this.fetchApi,c=await s(`${await this.discoveryApi.getBaseUrl("rbac")}/policies/${t}`,{method:"PATCH",body:JSON.stringify(e),headers:{"Content-Type":"application/json"}});return r(this,a,o).call(this,c)}async deleteDraft(t){const{fetch:e}=this.fetchApi,s=await e(`${await this.discoveryApi.getBaseUrl("rbac")}/policies/${t}`,{method:"DELETE"});return r(this,a,o).call(this,s)}async publishPolicy(t,e){const{fetch:s}=this.fetchApi,c=await s(`${await this.discoveryApi.getBaseUrl("rbac")}/policies/${t}/publish`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});return r(this,a,o).call(this,c)}async fetchAllPermissionMetadata(t){const e=await Promise.all(t.map(s=>r(this,h,d).call(this,s)));return{permissions:e.flatMap(({permissions:s})=>s),rules:e.flatMap(({rules:s})=>s)}}}h=new WeakSet,d=async function(i){var t,e,s,c;const m=await this.discoveryApi.getBaseUrl(i);let n;try{n=await(await this.fetchApi.fetch(`${m}/.well-known/backstage/permissions/metadata`)).json()}catch{return{permissions:[],rules:[]}}const A=(e=(t=n.permissions)==null?void 0:t.filter(Boolean))!=null?e:[],b=(c=(s=n.rules)==null?void 0:s.filter(Boolean))!=null?c:[];return{permissions:A,rules:b.map(v=>({...v,pluginId:i}))}},a=new WeakSet,o=async function(i){var t,e;if(i.ok)return i.status===204?void 0:i.json();const s=await S.fromResponse(i);throw s.message=(e=(t=s.body.error.message)!=null?t:s.message)!=null?e:"Unknown error",s};const l=g({id:"rbac"}),p=R({id:"rbac",routes:{root:l},apis:[B({api:u,deps:{fetchApi:C,discoveryApi:$},factory(i){return new j(i)}})]}),I=p.provide(P({name:"RBACRoot",component:()=>import("./Root-b43ee402.esm.js").then(i=>i.RBACRoot),mountPoint:l})),O=p.provide(U({name:"RBACSidebarItem",component:{lazy:()=>import("./RBACSidebarItem-a419895c.esm.js").then(i=>i.RBACSidebarItem)}}));export{I as R,l as a,p as b,O as c,u as r};
2
- //# sourceMappingURL=index-1f39920c.esm.js.map
1
+ import{createApiRef as w,createRouteRef as g,createPlugin as R,createApiFactory as B,fetchApiRef as C,discoveryApiRef as $,createRoutableExtension as P,createComponentExtension as U}from"@backstage/core-plugin-api";import{ResponseError as S}from"@backstage/errors";var T=Object.defineProperty,E=(i,t,e)=>t in i?T(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e,f=(i,t,e)=>(E(i,typeof t!="symbol"?t+"":t,e),e),k=(i,t,e)=>{if(!t.has(i))throw TypeError("Cannot "+e)},y=(i,t,e)=>{if(t.has(i))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(i):t.set(i,e)},r=(i,t,e)=>(k(i,t,"access private method"),e),h,d,a,o;const u=w({id:"plugin.rbac"});class j{constructor(t){y(this,h),y(this,a),f(this,"fetchApi"),f(this,"discoveryApi"),this.fetchApi=t.fetchApi,this.discoveryApi=t.discoveryApi}async getPolicies(){const{fetch:t}=this.fetchApi,e=await t(`${await this.discoveryApi.getBaseUrl("rbac")}/policies`);return r(this,a,o).call(this,e)}async getPolicy(t){const{fetch:e}=this.fetchApi,s=await e(`${await this.discoveryApi.getBaseUrl("rbac")}/policies/${t}`);return r(this,a,o).call(this,s)}async getActivePolicy(){const{fetch:t}=this.fetchApi,e=await t(`${await this.discoveryApi.getBaseUrl("rbac")}/policies/active`);return r(this,a,o).call(this,e)}async searchMembers(t){const{fetch:e}=this.fetchApi,s=await e(`${await this.discoveryApi.getBaseUrl("rbac")}/members?query=${encodeURIComponent(t.query)}`);return r(this,a,o).call(this,s)}async authorize(){const{fetch:t}=this.fetchApi,e=await t(`${await this.discoveryApi.getBaseUrl("rbac")}/authorize`);return r(this,a,o).call(this,e)}async createDraft(t){const{fetch:e}=this.fetchApi,s=await e(`${await this.discoveryApi.getBaseUrl("rbac")}/policies`,{method:"POST",body:JSON.stringify(t),headers:{"Content-Type":"application/json"}});return r(this,a,o).call(this,s)}async updateDraft(t,e){const{fetch:s}=this.fetchApi,c=await s(`${await this.discoveryApi.getBaseUrl("rbac")}/policies/${t}`,{method:"PATCH",body:JSON.stringify(e),headers:{"Content-Type":"application/json"}});return r(this,a,o).call(this,c)}async deleteDraft(t){const{fetch:e}=this.fetchApi,s=await e(`${await this.discoveryApi.getBaseUrl("rbac")}/policies/${t}`,{method:"DELETE"});return r(this,a,o).call(this,s)}async publishPolicy(t,e){const{fetch:s}=this.fetchApi,c=await s(`${await this.discoveryApi.getBaseUrl("rbac")}/policies/${t}/publish`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});return r(this,a,o).call(this,c)}async fetchAllPermissionMetadata(t){const e=await Promise.all(t.map(s=>r(this,h,d).call(this,s)));return{permissions:e.flatMap(({permissions:s})=>s),rules:e.flatMap(({rules:s})=>s)}}}h=new WeakSet,d=async function(i){var t,e,s,c;const m=await this.discoveryApi.getBaseUrl(i);let n;try{n=await(await this.fetchApi.fetch(`${m}/.well-known/backstage/permissions/metadata`)).json()}catch{return{permissions:[],rules:[]}}const A=(e=(t=n.permissions)==null?void 0:t.filter(Boolean))!=null?e:[],b=(c=(s=n.rules)==null?void 0:s.filter(Boolean))!=null?c:[];return{permissions:A,rules:b.map(v=>({...v,pluginId:i}))}},a=new WeakSet,o=async function(i){var t,e;if(i.ok)return i.status===204?void 0:i.json();const s=await S.fromResponse(i);throw s.message=(e=(t=s.body.error.message)!=null?t:s.message)!=null?e:"Unknown error",s};const l=g({id:"rbac"}),p=R({id:"rbac",routes:{root:l},apis:[B({api:u,deps:{fetchApi:C,discoveryApi:$},factory(i){return new j(i)}})]}),I=p.provide(P({name:"RBACRoot",component:()=>import("./Root-ce389844.esm.js").then(i=>i.RBACRoot),mountPoint:l})),O=p.provide(U({name:"RBACSidebarItem",component:{lazy:()=>import("./RBACSidebarItem-1be44d99.esm.js").then(i=>i.RBACSidebarItem)}}));export{I as R,l as a,p as b,O as c,u as r};
2
+ //# sourceMappingURL=index-72180512.esm.js.map
package/dist/index.esm.js CHANGED
@@ -1,2 +1,2 @@
1
- import{R as i,c as m,b as R}from"./esm/index-1f39920c.esm.js";import"@backstage/core-plugin-api";import"@backstage/errors";export{i as RBACRoot,m as RBACSidebarItem,R as rbacPlugin};
1
+ import{R as i,c as m,b as R}from"./esm/index-72180512.esm.js";import"@backstage/core-plugin-api";import"@backstage/errors";export{i as RBACRoot,m as RBACSidebarItem,R as rbacPlugin};
2
2
  //# sourceMappingURL=index.esm.js.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@spotify/backstage-plugin-rbac",
3
3
  "description": "Control access to actions and data in Backstage with ease.",
4
- "version": "0.5.6",
4
+ "version": "0.5.7",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "homepage": "https://backstage.spotify.com",
7
7
  "main": "dist/index.esm.js",
@@ -13,6 +13,7 @@
13
13
  "backstage": {
14
14
  "role": "frontend-plugin"
15
15
  },
16
+ "sideEffects": false,
16
17
  "scripts": {
17
18
  "start": "backstage-cli package start",
18
19
  "build": "backstage-cli package build --minify",
@@ -23,21 +24,21 @@
23
24
  "postpack": "backstage-cli package postpack"
24
25
  },
25
26
  "dependencies": {
26
- "@backstage/catalog-model": "^1.4.1",
27
- "@backstage/core-components": "^0.13.4",
28
- "@backstage/core-plugin-api": "^1.5.3",
29
- "@backstage/errors": "^1.2.1",
30
- "@backstage/plugin-catalog-react": "^1.8.1",
31
- "@backstage/plugin-permission-common": "^0.7.7",
32
- "@backstage/plugin-permission-node": "^0.7.11",
33
- "@backstage/plugin-permission-react": "^0.4.14",
34
- "@backstage/theme": "^0.4.1",
35
- "@backstage/types": "^1.1.0",
27
+ "@backstage/catalog-model": "^1.4.2",
28
+ "@backstage/core-components": "^0.13.5",
29
+ "@backstage/core-plugin-api": "^1.6.0",
30
+ "@backstage/errors": "^1.2.2",
31
+ "@backstage/plugin-catalog-react": "^1.8.4",
32
+ "@backstage/plugin-permission-common": "^0.7.8",
33
+ "@backstage/plugin-permission-node": "^0.7.14",
34
+ "@backstage/plugin-permission-react": "^0.4.15",
35
+ "@backstage/theme": "^0.4.2",
36
+ "@backstage/types": "^1.1.1",
36
37
  "@material-ui/core": "^4.12.2",
37
38
  "@material-ui/icons": "^4.9.1",
38
39
  "@material-ui/lab": "4.0.0-alpha.61",
39
- "@spotify/backstage-plugin-core": "^0.5.5",
40
- "@spotify/backstage-plugin-rbac-common": "^0.5.5",
40
+ "@spotify/backstage-plugin-core": "^0.5.6",
41
+ "@spotify/backstage-plugin-rbac-common": "^0.5.6",
41
42
  "ajv": "^8.11.2",
42
43
  "file-saver": "^2.0.5",
43
44
  "js-yaml": "^4.1.0",
@@ -52,18 +53,18 @@
52
53
  "zod-to-json-schema": "^3.20.2"
53
54
  },
54
55
  "peerDependencies": {
55
- "@backstage/plugin-permission-node": "^0.7.11",
56
+ "@backstage/plugin-permission-node": "^0.7.14",
56
57
  "react": "^16.13.1 || ^17.0.0",
57
58
  "react-router-dom": "6.0.0-beta.0 || ^6.3.0"
58
59
  },
59
60
  "devDependencies": {
60
- "@backstage/cli": "^0.22.10",
61
- "@backstage/core-app-api": "^1.9.1",
62
- "@backstage/dev-utils": "^1.0.18",
63
- "@backstage/test-utils": "^1.4.2",
64
- "@internal/e2e-test-utils": "^0.0.0",
61
+ "@backstage/cli": "^0.22.13",
62
+ "@backstage/core-app-api": "^1.10.0",
63
+ "@backstage/dev-utils": "^1.0.21",
64
+ "@backstage/test-utils": "^1.4.3",
65
65
  "@playwright/test": "^1.32.3",
66
- "@testing-library/jest-dom": "^5.10.1",
66
+ "@sp4b-dev/e2e-test-utils": "^0.0.0",
67
+ "@testing-library/jest-dom": "^6.0.0",
67
68
  "@testing-library/react": "^12.1.5",
68
69
  "@testing-library/react-hooks": "^8.0.1",
69
70
  "@testing-library/user-event": "^14.0.0",
@@ -1,3 +0,0 @@
1
- import e,{createContext as Pe,useState as k,useCallback as R,useMemo as L,useContext as De,useEffect as _,Fragment as Ne,useRef as ne,Children as vt,isValidElement as we,useReducer as Rn,useLayoutEffect as $n}from"react";import{useNavigate as G,Link as In,useParams as Ve,Routes as On,Route as Ae}from"react-router-dom";import{useApi as I,configApiRef as Bn,alertApiRef as le,useRouteRef as Mn,useApp as Ue}from"@backstage/core-plugin-api";import de from"react-use/lib/useAsync";import{isResourcePermission as _e}from"@backstage/plugin-permission-common";import{r as W,a as Ln}from"./index-1f39920c.esm.js";import{forEach as Fn,mapValues as jn,groupBy as Hn,uniq as Wn}from"lodash";import{Breadcrumbs as zn,Link as ue,Page as Gn,Header as Vn,Content as Un,EmptyState as Te,Progress as Se,ErrorPanel as bt,Table as _n,ContentHeader as ke}from"@backstage/core-components";import Ct from"react-use/lib/useMount";import{makeStyles as D,Typography as C,Container as Yn,Grid as F,Button as w,Card as Y,CardContent as pe,Box as f,Chip as Re,Tooltip as fe,List as Jn,ListItem as xt,ListItemIcon as re,ListItemText as ae,CardActions as qn,Dialog as oe,DialogContent as K,DialogTitle as $e,TextField as Ee,DialogActions as Ye,CircularProgress as Pt,IconButton as z,Checkbox as Je,TableRow as V,TableCell as N,debounce as Kn,Table as qe,TableHead as Ke,TableBody as Qe,Tabs as Qn,Tab as Xn,FormControl as Xe,InputLabel as Ie,Select as Ze,MenuItem as U,Menu as Dt,FormControlLabel as Nt,FormHelperText as wt,Popper as Zn,Paper as el,Divider as et,DialogContentText as tl,ButtonBase as nl,CardHeader as At,ButtonGroup as ll,MenuList as tt,ListItemSecondaryAction as rl,CardActionArea as al,Radio as ol}from"@material-ui/core";import{SpotifyLicenseBanner as il,useAutoUpdatingRelativeTime as cl,invariant as Oe}from"@spotify/backstage-plugin-core";import ie from"react-use/lib/useAsyncFn";import sl,{dump as ml}from"js-yaml";import{PolicyConfigParser as Be,isConditionalDecision as nt,isAllOfPermissionCriteria as dl,isAnyOfPermissionCriteria as ul,isNotPermissionCriteria as pl,isMatchingPermission as fl,BackstageUserPlaceholder as ye,RoleParser as El,UpdateDraftRequestParser as yl}from"@spotify/backstage-plugin-rbac-common";import{v4 as ce}from"uuid";import Tt from"lodash/keyBy";import gl from"lodash/isEqual";import St from"@material-ui/icons/ReportProblemOutlined";import hl from"@material-ui/icons/CalendarToday";import kt from"@material-ui/icons/Person";import vl from"@material-ui/icons/FiberManualRecord";import{DateTime as Me}from"luxon";import bl from"react-use/lib/useLocalStorage";import{saveAs as Cl}from"file-saver";import Rt from"lodash/omit";import xl from"lodash/pickBy";import lt from"@material-ui/icons/Close";import Pl from"@material-ui/icons/Publish";import Dl from"@material-ui/icons/FilterNone";import{parseEntityRef as Q,DEFAULT_NAMESPACE as Nl}from"@backstage/catalog-model";import{humanizeEntityRef as wl,catalogApiRef as Al}from"@backstage/plugin-catalog-react";import{Autocomplete as rt,ToggleButton as Tl,ToggleButtonGroup as Sl}from"@material-ui/lab";import{List as kl}from"react-virtualized";import ge from"@material-ui/icons/Delete";import Rl from"@material-ui/icons/Group";import $l from"@material-ui/icons/GroupWork";import $t from"@material-ui/icons/Info";import It from"ajv";import Il from"lodash/uniqBy";import{JSONEditor as Ol,isTextContent as Bl,createAjvValidator as Ml,Mode as Ll}from"vanilla-jsoneditor";import at from"@material-ui/icons/Add";import Fl from"@material-ui/icons/Remove";import jl from"@material-ui/icons/Edit";import Hl from"@material-ui/icons/Check";import Wl from"@material-ui/icons/KeyboardArrowDown";import zl from"@material-ui/icons/KeyboardArrowUp";import Gl from"../images/no-permissions.svg";import Vl from"../images/no-roles.svg";import Ul from"@material-ui/icons/MoreHoriz";import _l from"@material-ui/icons/Undo";import Yl from"@material-ui/icons/Save";import Jl from"@material-ui/icons/Settings";import ql from"@material-ui/icons/VerticalAlignTop";import{A as Kl}from"./Authorized-ac94e915.esm.js";import"@backstage/errors";const Ot=Pe(null),Ql=({children:t})=>{const n=I(Bn),l=I(W),a=I(le),[r,o]=k(null),i=R(async()=>{var s;if(!r){const m=await l.fetchAllPermissionMetadata((s=n.getOptionalStringArray("permission.permissionedPlugins"))!=null?s:[]),c=Zl(m.rules);Fn(c,u=>{u.length!==1&&a.post({message:`The plugin(s) ${u.slice(1).join(", ")} expose rules which are conflicting with rules exposed by the ${u[0]} plugin. These rules will not be available for use. Please contact RBAC support if you need assistance resolving this issue.`,severity:"error"})});const p=er(m,c);return o(p),p}return r},[a,r,l,n]);return e.createElement(Ot.Provider,{value:L(()=>({getMetadata:i}),[i])},t)};function Le(){const t=De(Ot),{value:n}=de(async()=>t==null?void 0:t.getMetadata(),[t]);return n}function Bt(){var t;const n=Le();return(t=n==null?void 0:n.rules)!=null?t:null}function Mt(){var t;const n=Le();return(t=n==null?void 0:n.permissions)!=null?t:null}function Lt(){const t=Le();return t?[...new Set(t.permissions.filter(n=>_e(n)).map(({resourceType:n})=>n))]:null}function Xl(){const t=Le(),n=Lt();return!t||!n?null:n.reduce((l,a)=>{const r=t.rules.find(o=>o.resourceType===a);return r&&(l[a]={pluginId:r.pluginId}),l},{})}function Zl(t){return jn(Hn(t,"resourceType"),n=>Wn(n.map(({pluginId:l})=>l)))}function er(t,n){return{...t,rules:t.rules.filter(({resourceType:l,pluginId:a})=>{const r=n[l];return a===r[0]})}}const tr=D(t=>({breadcrumbs:{marginBottom:t.spacing(4)}}));function nr({pages:t}){const n=Mn(Ln),l=tr();return e.createElement(zn,{className:l.breadcrumbs},e.createElement(ue,{to:n()},"Home"),t.map(({title:a,path:r},o)=>r?e.createElement(ue,{to:r,key:r,relative:"path"},a):e.createElement(C,{key:`${o}`},a)))}function Fe({children:t,header:n,pages:l}){return e.createElement(Gn,{themeId:"tool"},e.createElement(il,{backend:"rbac",invalidLicenseMessage:"Your existing policy will continue to apply, but you will be unable to make any changes until you enter a valid license."}),e.createElement(Vn,{title:"Role Based Access Control"}),e.createElement(Un,null,e.createElement(Yn,{maxWidth:"lg"},e.createElement(F,{container:!0,spacing:4},e.createElement(F,{item:!0,xs:12},l&&e.createElement(nr,{pages:l}),n),t))))}const Ft=Pe({hasDraftPolicy:!1,policies:void 0,setPolicies:()=>{},setPolicy:()=>{},getPolicy:()=>{},removePolicy:()=>{}}),je=()=>De(Ft);function lr({children:t,initialState:n={policies:void 0,cache:{}}}){const[l,a]=k(n),r=R(m=>{a(c=>({...c,policies:m,cache:jt(c.cache,m)}))},[]),o=R(m=>l.cache[m],[l.cache]),i=R(m=>a(c=>({...c,cache:{...c.cache,[m]:void 0},policies:void 0})),[]),s=R(m=>a(c=>({...c,policies:void 0,cache:jt(c.cache,[m])})),[]);return e.createElement(Ft.Provider,{value:L(()=>{var m;return{hasDraftPolicy:((m=l.policies)==null?void 0:m.some(({status:c})=>c==="draft"))||!1,policies:l.policies,setPolicies:r,setPolicy:s,getPolicy:o,removePolicy:i}},[l.policies,r,s,o,i])},t)}function jt(t,n){if(!n)return t;const l={...t};return n.forEach(a=>{l[a.id]=a}),l}const he=()=>{const t=I(W),{setPolicies:n,policies:l}=je(),[{loading:a,error:r},o]=ie(()=>t.getPolicies(),[t],l?{loading:!1,value:{items:l,totalItems:l.length}}:{loading:!0}),i=R(async()=>{const s=await o();n(s.items)},[o,n]);return{loading:a,error:r,fetchPolicies:i}};function rr(){const t=I(W),n=G(),l=I(le);function a(r){var o,i;const s=(i=(o=r.target)==null?void 0:o.files)==null?void 0:i[0],m=new FileReader;s&&(m.readAsText(s,"utf-8"),m.onload=async c=>{var p,u;const d=(u=(p=c.target)==null?void 0:p.result)==null?void 0:u.toString();if(d){let b=null;try{b=sl.load(d)}catch{l.post({message:"YAML file is invalid",severity:"error"});return}const g=Be.safeParse(b);if(!g.success){l.post({message:"Imported policy is invalid",severity:"error"});return}const E=g.data;if((await t.getPolicies()).items.some(x=>x.status==="draft")){l.post({message:"Unable to import new policy due to existing draft policy",severity:"error"});return}const y=await t.createDraft(E);n(`./versions/${y.id}`),l.post({message:"Policy imported successfully",severity:"success"})}})}return e.createElement(w,{variant:"outlined",color:"primary",component:"label"},"Import",e.createElement("input",{role:"input",type:"file",hidden:!0,onChange:a,accept:".yaml"}))}const ar=D(t=>({cardContent:{padding:t.spacing(6,3),"& > *":{background:"transparent"}}}));function or(){const t=ar(),n=I(W),l=G(),[a,r]=ie(async()=>n.createDraft({roles:[],options:{resolutionStrategy:"any-allow"}}),[n]);return _(()=>{a.value&&l(`./versions/${a.value.id}`)},[l,a.value]),e.createElement(Y,null,e.createElement(pe,{className:t.cardContent},e.createElement(Te,{missing:"content",title:"No policy configured",description:e.createElement(e.Fragment,null,e.createElement(f,{component:"span",display:"block",pb:2},"Until you've configured your policy, authorization will be denied for all permissions."),e.createElement(f,{component:"span",display:"block"},"Click the button below to create the first version of your policy.")),action:e.createElement(w,{variant:"contained",color:"primary",disabled:a.loading,onClick:r},"New version")})))}function ir(t){var n,l;return((l=(n=t==null?void 0:t.body)==null?void 0:n.response)==null?void 0:l.statusCode)===404}const cr=(t,n)=>{const l={resolutionStrategy:{operation:"UNCHANGED",before:t==null?void 0:t.resolutionStrategy,after:n==null?void 0:n.resolutionStrategy}};for(const a of Object.keys(l)){const r=a;l[r].before!==l[r].after&&(l[r].operation="CHANGED")}return l},ot=(t,n)=>{const l=Object.entries(t);for(const[,a]of l){const r=n(a);for(const[,o]of l){const i=n(o);i.operation!=="ADDED"&&i.operation!=="REMOVED"&&(r.operation==="ADDED"&&r.indexAfter<i.indexAfter?i.indexBefore+=1:r.operation==="REMOVED"&&r.indexBefore<i.indexBefore&&(i.indexBefore-=1))}}for(const[,a]of l){const r=n(a);r.operation==="UNCHANGED"&&r.indexAfter!==r.indexBefore&&(r.operation=r.indexAfter>r.indexBefore?"MOVED_DOWN":"MOVED_UP")}return t},it=(t,n)=>{if(t==="*")return n==="*"?{"*":{operation:"UNCHANGED",after:"*",before:"*",indexAfter:0,indexBefore:0}}:{"*":{operation:"REMOVED",after:null,before:"*",indexAfter:-1,indexBefore:0},...Object.fromEntries(n.map((a,r)=>[a,{operation:"ADDED",after:a,before:null,indexAfter:r,indexBefore:-1}]))};if(n==="*")return{"*":{operation:"ADDED",after:"*",before:null,indexAfter:0,indexBefore:-1},...Object.fromEntries(t.map((a,r)=>[a,{operation:"REMOVED",after:null,before:a,indexAfter:-1,indexBefore:r}]))};const l=Object.fromEntries(n.map((a,r)=>[a,{operation:"ADDED",after:a,before:null,indexAfter:r,indexBefore:-1}]));for(let a=0;a<t.length;a++){const r=t[a];l[r]?(l[r].before=r,l[r].indexBefore=a,l[r].operation="UNCHANGED"):l[r]={operation:"REMOVED",after:null,before:r,indexAfter:-1,indexBefore:a}}return ot(l,a=>a)},ct=(t,n)=>{const l=Tt(n,"id"),a=Object.fromEntries(n.map((r,o)=>[r.id,{operation:"ADDED",indexAfter:o,indexBefore:-1,after:r,before:null}]));for(let r=0;r<t.length;r++){const o=t[r];if(a[o.id]){const i=!gl(o,l[o.id]);a[o.id].before=o,a[o.id].indexBefore=r,a[o.id].operation=i?"CHANGED":"UNCHANGED"}else a[o.id]={operation:"REMOVED",after:null,before:o,indexAfter:-1,indexBefore:r}}return ot(a,r=>r)},sr=(t=[],n=[])=>{const l=Tt(n,"id"),a=Object.fromEntries(n.map((r,o)=>[r.id,{role:{operation:"ADDED",indexAfter:o,indexBefore:-1,after:r,before:null},members:it([],r.members),permissions:ct([],r.permissions)}]));for(let r=0;r<t.length;r++){const o=t[r];if(l[o.id]){const i=l[o.id],s=it(o.members,i.members),m=ct(o.permissions,i.permissions),c=Object.values(m).some(({operation:d})=>d!=="UNCHANGED"),p=Object.values(s).some(({operation:d})=>d!=="UNCHANGED"),u=o.name!==i.name||c||p;a[o.id].role.before=o,a[o.id].role.indexBefore=r,a[o.id].role.operation=u?"CHANGED":"UNCHANGED",a[o.id].members=s,a[o.id].permissions=m}else a[o.id]={role:{operation:"REMOVED",after:null,before:o,indexAfter:-1,indexBefore:r},members:it(o.members,[]),permissions:ct(o.permissions,[])}}return ot(a,({role:r})=>r)},mr=(t,n)=>{const l=sr((t==null?void 0:t.roles)||[],n.roles||[]),a=cr(t==null?void 0:t.options,n.options),r=(t==null?void 0:t.name)!==n.name,o=Object.values(a).some(({operation:i})=>i!=="UNCHANGED");return{policy:{operation:r||o?"CHANGED":"UNCHANGED",before:t,after:n},roles:l,options:a}},Ht=t=>{const n=I(W),{value:l,loading:a,error:r}=de(()=>n.getActivePolicy(),[n]);return L(()=>t&&!a&&!r?mr(l,t):null,[l,t,a,r])},dr=D(t=>({chip:{margin:0},icon:{color:t.palette.success.main}}));function Wt(t){const n=dr();return t.status==="inactive"?null:t.status==="draft"?e.createElement(Re,{className:n.chip,label:"Draft",size:t.size}):e.createElement(Re,{className:n.chip,classes:{icon:n.icon},label:"Active",icon:e.createElement(vl,null),size:t.size})}const st=(t,n)=>{switch(n){case"ADDED":return t.palette.success.main;case"REMOVED":return t.palette.error.main;case"CHANGED":return t.palette.info.main;case"MOVED_UP":case"MOVED_DOWN":return t.palette.info.main;case"UNCHANGED":default:return t.palette.text.primary}},ur=t=>{switch(t){case"ADDED":return"New";case"REMOVED":return"Removed";case"CHANGED":return"Changed";case"MOVED_UP":return"Moved up";case"MOVED_DOWN":return"Moved down";case"UNCHANGED":default:return"No changes"}};function pr(t){var n;return nt(t.decision)?"Conditional":(n={allow:"Allow",deny:"Deny"}[t.decision])!=null?n:"Unknown"}function mt(t){var n;if(t.match==="*")return"All";if(t.match.name)return t.match.name;const l=[];return t.match.resourceType&&l.push(t.match.resourceType),(n=t.match.actions)!=null&&n.length&&l.push(t.match.actions.join(", ")),l.join(" | ")}const fr=D(t=>({root:({operation:n})=>({color:st(t,n)})})),M=t=>e.createElement(C,{...t,variant:"body2"}),P=t=>{const n=fr(t);return e.createElement(f,{...t,className:n.root,component:"span",fontWeight:"fontWeightBold"})},zt=({policy:t})=>{var n,l,a,r;const o=Ht(t),i=(o==null?void 0:o.policy.operation)==="CHANGED"||Object.values((n=o==null?void 0:o.roles)!=null?n:{}).some(u=>u.role.operation!=="UNCHANGED")||((l=o==null?void 0:o.options)==null?void 0:l.resolutionStrategy.operation)==="CHANGED";if(!o||!i)return e.createElement(f,null,"No changes");const s=!!o.policy.before&&!!o.policy.after&&o.policy.before.name!==o.policy.after.name,m=o.options.resolutionStrategy.operation==="CHANGED",c=({before:u,after:d})=>u&&d&&u.name!==d.name,p=({operation:u})=>u!=="ADDED"&&u!=="REMOVED";return e.createElement(f,null,s&&e.createElement(M,null,"Policy name ",e.createElement(P,{operation:"CHANGED"},"changed")," from"," ",e.createElement(P,null,'"',(a=o.policy.before)==null?void 0:a.name,'"')," to"," ",e.createElement(P,null,'"',(r=o.policy.after)==null?void 0:r.name,'"')),m&&e.createElement(M,null,"Resolution Strategy ",e.createElement(P,{operation:"CHANGED"},"changed")," ","from ",e.createElement(P,null,'"',o.options.resolutionStrategy.before,'"')," to"," ",e.createElement(P,null,'"',o.options.resolutionStrategy.after,'"')),Object.entries(o.roles).map(([u,{role:d,permissions:b,members:g}])=>{var E,y,x,T,$,j;return e.createElement(Ne,{key:u},d.operation==="ADDED"&&e.createElement(M,null,"Role ",e.createElement(P,null,'"',(E=d.after)==null?void 0:E.name,'"')," has been"," ",e.createElement(P,{operation:"ADDED"},"added")),d.operation==="REMOVED"&&e.createElement(M,null,"Role ",e.createElement(P,null,'"',(y=d.before)==null?void 0:y.name,'"')," has been"," ",e.createElement(P,{operation:"REMOVED"},"removed")),c(d)&&e.createElement(M,null,"Role name changed from ",e.createElement(P,null,'"',(x=d.before)==null?void 0:x.name,'"')," ","to ",e.createElement(P,null,'"',(T=d.after)==null?void 0:T.name,'"')),d.indexAfter>d.indexBefore&&d.indexBefore!==-1&&e.createElement(M,null,"Role ",e.createElement(P,null,'"',($=d.after)==null?void 0:$.name,'"')," has been"," ",e.createElement(P,{operation:"MOVED_DOWN"},"moved down")," in priority"),d.indexAfter<d.indexBefore&&d.indexAfter!==-1&&e.createElement(M,null,"Role ",e.createElement(P,null,'"',(j=d.after)==null?void 0:j.name,'"')," has been"," ",e.createElement(P,{operation:"MOVED_UP"},"moved up")," in priority"),p(d)&&e.createElement(e.Fragment,null,Object.entries(b).map(([B,v])=>{var A,h,S,O,Z;const{before:J,after:se}=v,ee=J&&mt(J),q=se&&mt(se);return e.createElement(Ne,{key:B},v.operation==="ADDED"&&v.after&&e.createElement(M,null,"Permission decision"," ",e.createElement(P,null,'"',q,'"')," has been"," ",e.createElement(P,{operation:"ADDED"},"added")," to"," ",e.createElement(P,null,'"',(A=d.after)==null?void 0:A.name,'"')),v.operation==="REMOVED"&&v.before&&e.createElement(M,null,"Permission decision"," ",e.createElement(P,null,'"',ee,'"')," has been"," ",e.createElement(P,{operation:"REMOVED"},"removed")," ","from ",e.createElement(P,null,'"',(h=d.after)==null?void 0:h.name,'"')),v.operation==="CHANGED"&&e.createElement(M,null,ee!==q?e.createElement(e.Fragment,null,"Permission decision"," ",e.createElement(P,null,'"',ee,'"')," has been"," ",e.createElement(P,{operation:"CHANGED"},"updated")," ","to ",e.createElement(P,null,'"',q,'"')):e.createElement(e.Fragment,null,"Permission decision"," ",e.createElement(P,null,'"',ee,'"')," has been"," ",e.createElement(P,{operation:"CHANGED"},"updated"))," ","in ",e.createElement(P,null,'"',(S=d.after)==null?void 0:S.name,'"')),v.indexAfter>v.indexBefore&&v.indexBefore!==-1&&e.createElement(M,null,"Permission decision"," ",e.createElement(P,null,'"',q,'"')," has been"," ",e.createElement(P,{operation:"MOVED_DOWN"},"moved down")," ","in priority in"," ",e.createElement(P,null,'"',(O=d.after)==null?void 0:O.name,'"')),v.indexAfter<v.indexBefore&&v.indexAfter!==-1&&e.createElement(M,null,"Permission decision"," ",e.createElement(P,null,'"',q,'"')," has been"," ",e.createElement(P,{operation:"MOVED_UP"},"moved up")," ","in priority in"," ",e.createElement(P,null,'"',(Z=d.after)==null?void 0:Z.name,'"')))}),Object.entries(g).map(([B,v])=>{var A,h;return e.createElement(Ne,{key:B},v.operation==="ADDED"&&v.after&&e.createElement(M,null,"Member ",e.createElement(P,null,'"',v.after,'"')," has been"," ",e.createElement(P,{operation:"ADDED"},"added")," to"," ",e.createElement(P,null,'"',(A=d.after)==null?void 0:A.name,'"')),v.operation==="REMOVED"&&v.before&&e.createElement(M,null,"Member ",e.createElement(P,null,'"',v.before,'"')," has been"," ",e.createElement(P,{operation:"REMOVED"},"removed")," from"," ",e.createElement(P,null,'"',(h=d.after)==null?void 0:h.name,'"')))})))}))},Er=D(()=>({root:{display:"inline-flex"}})),Gt=({timestamp:t,description:n})=>{const l=Er(),a=Me.fromISO(t).toLocaleString(Me.DATETIME_FULL),r=cl(t),o=n?`${n}${r}`:r;return e.createElement("span",{className:l.root},e.createElement(fe,{title:a},e.createElement(C,{component:"span",display:"inline",variant:"inherit"},o)))};function Vt(t,n,l){var a,r;let o=n.created,i=t.createdBy;l!=null&&l.created&&(i=l.created+i);let s=t.createdAt;return t.status==="active"?(o=n.published,i=(a=t.lastPublishedBy)!=null?a:"",l!=null&&l.published&&(i=l.published+i),s=(r=t.lastPublishedAt)!=null?r:""):t.createdAt!==t.updatedAt&&(o=n.updated,i=t.updatedBy,l!=null&&l.updated&&(i=l.updated+i),s=t.updatedAt),{activityDateText:o,activityUser:i,timestamp:s}}const yr=D(t=>({card:n=>({backgroundImage:n.policy.status==="active"?"linear-gradient(256.15deg, #00782A 19.77%, #1DB954 100%)":"linear-gradient(256.15deg, #BDBDBD 19.77%, #EEEEEE 100%)",backgroundPosition:"top",backgroundSize:"100% 8px",backgroundRepeat:"no-repeat",paddingTop:"8px",height:"100%"}),diffSummaryContainer:{backgroundColor:t.palette.background.default,padding:t.spacing(2),borderWidth:"1px",borderStyle:"solid",borderColor:t.palette.divider,borderRadius:t.shape.borderRadius},header:{display:"flex",justifyContent:"space-between",alignItems:"center"},detailsHeader:{...t.typography.body1,paddingTop:t.spacing(2),color:t.palette.text.secondary},activityList:{color:t.palette.text.secondary},activityListItem:{padding:0},actions:{justifyContent:"flex-start"}}));function ve(t){const n=yr(t),{policy:l,to:a,withChangeSummary:r}=t,o=`${l.name} ${l.status==="draft"?"- Draft":""}`,i={created:"Created: ",published:"Published: ",updated:"Updated: "},s={created:"Created by ",published:"Published by ",updated:"Updated by "},{activityDateText:m,activityUser:c,timestamp:p}=Vt(l,i,s);return e.createElement(Y,{className:n.card},e.createElement(pe,null,e.createElement("div",{className:n.header},a?e.createElement(ue,{to:`versions/${l.id}`},e.createElement(C,{variant:"h5",component:"h1"},o)):e.createElement(C,{variant:"h5",component:"h1"},o),l.status==="active"?e.createElement(Wt,{status:"active",size:"small"}):null),l.description?e.createElement(C,{variant:"body1",color:"textSecondary"},'"',l.description,'"'):null,e.createElement(C,{component:"h2",className:n.detailsHeader},"Details"),e.createElement(Jn,{className:n.activityList},e.createElement(xt,{className:n.activityListItem},e.createElement(re,null,e.createElement(hl,null)),e.createElement(ae,{primary:e.createElement(Gt,{timestamp:p,description:m})})),e.createElement(xt,{className:n.activityListItem},e.createElement(re,null,e.createElement(kt,null)),e.createElement(ae,{primary:c}))),r&&e.createElement(f,{paddingTop:2},e.createElement(C,{gutterBottom:!0,variant:"subtitle2"},"What's changed"),e.createElement(f,{className:n.diffSummaryContainer},e.createElement(zt,{policy:l})))),t.actions?e.createElement(qn,{className:n.actions},t.actions):null)}const gr=D(t=>({icon:{color:t.palette.warning.main,width:"2rem",height:"2rem"},label:{align:"center",display:"block",marginBottom:t.spacing(1),color:t.palette.text.secondary,fontSize:t.typography.caption.fontSize},policiesContainer:{display:"flex",gap:t.spacing(4),marginTop:t.spacing(4),marginBottom:t.spacing(4)},button:{marginTop:t.spacing(4)}})),hr=({localPolicy:t,onSelectLocalPolicy:n,onSelectServerPolicy:l,serverPolicy:a})=>{const r=gr();return e.createElement(oe,{open:!0,maxWidth:"md"},e.createElement(K,null,e.createElement(f,{display:"flex",flexDirection:"column",gridGap:8},e.createElement(f,{display:"flex",justifyContent:"center"},e.createElement(St,{className:r.icon})),e.createElement(C,{align:"center",variant:"h6"},"There is a conflict with your drafts"),e.createElement(f,null,e.createElement(C,{align:"center"},"A newer version of the draft you are trying to edit has been recently saved."),e.createElement(C,{align:"center"},"Please review the changes and decide on a version to keep."))),e.createElement(f,{className:r.policiesContainer},e.createElement(f,{alignItems:"center",display:"flex",flexDirection:"column",flex:"1 1 0%"},e.createElement(C,{className:r.label,variant:"button"},"Your local draft"),e.createElement(ve,{policy:t,withChangeSummary:!0}),e.createElement(w,{className:r.button,color:"primary",onClick:n,variant:"outlined"},"Keep local draft")),e.createElement(f,{alignItems:"center",display:"flex",flexDirection:"column",flex:"1 1 0%"},e.createElement(C,{className:r.label,variant:"button"},"Recently saved draft"),e.createElement(ve,{policy:a,withChangeSummary:!0}),e.createElement(w,{className:r.button,color:"primary",onClick:l,variant:"outlined"},"Keep recently saved draft")))))},vr=({serverPolicy:t,localPolicy:n})=>!n||!t?{policy:t,policyConflict:!1}:t.status!=="draft"?{policy:t,policyConflict:!1}:n.id!==t.id?{policy:t,policyConflict:!1}:n.updatedAt===t.updatedAt?{policy:n,policyConflict:!1}:{policy:n,policyConflict:!0},br=()=>bl("@spotify/backstage-plugin-rbac:draftPolicy");function Ut(t){const n=new Blob([Cr(t)],{type:"text/yaml"});Cl(n,`${(t.name||"policy").toLocaleLowerCase().replace(/\W/g,"-")}.yaml`)}function Cr(t){const{name:n,roles:l,options:a,description:r}=t;return`# this is an autogenerated file, do not edit
2
- ${ml(xl({name:n,description:r,options:a,roles:l.map(({permissions:o,...i})=>({...Rt(i,["id"]),permissions:o.map(s=>Rt(s,["id"]))}))},o=>o!==null||o!==void 0))}`}const xr=D(t=>({icon:{color:t.palette.warning.main,width:"2rem",height:"2rem"}})),Pr=({onConfirm:t,policy:n})=>{const l=xr(),a=()=>{Ut(n)};return e.createElement(oe,{open:!0},e.createElement(K,null,e.createElement(f,{display:"flex",flexDirection:"column",gridGap:16},e.createElement(f,{display:"flex",flexDirection:"column",gridGap:4},e.createElement(f,{display:"flex",justifyContent:"center"},e.createElement(St,{className:l.icon})),e.createElement(C,{align:"center",variant:"h6"},"Invalid local draft")),e.createElement(f,{display:"flex",flexDirection:"column",gridGap:8},e.createElement(C,{align:"center"},"You have a local draft that is no longer compatible or has become corrupted."),e.createElement(C,{align:"center"},"Click export to download your draft. You can attempt to restore your draft by importing this file on the RBAC home page."),e.createElement(C,{align:"center"},"Clicking continue will discard your draft."," ",e.createElement(f,{component:"span",fontWeight:"fontWeightBold"},"This action cannot be undone."))),e.createElement(f,{display:"flex",justifyContent:"center",gridGap:8,marginY:3},e.createElement(w,{color:"primary",onClick:a,variant:"outlined"},"Export"),e.createElement(w,{color:"primary",onClick:t,variant:"contained"},"Discard and continue")))))};function dt(){const t=I(W),n=I(le),l=ie(async(r,o,i)=>{if(r)return await t.publishPolicy(r.id,{description:o,update:i}),t.getPolicy(r.id)},[]),[{error:a}]=l;return _(()=>{a&&n.post({message:a.message,severity:"error"})},[a,n]),l}const Dr=D(t=>({closeButton:{color:t.palette.text.secondary},diffSummaryContainer:{backgroundColor:t.palette.background.default,marginBottom:t.spacing(2)}}));function ut({open:t,onPublish:n,onClose:l,policy:a}){const[r,o]=k(!1),i=Dr(),s=ne(null),m=async()=>{var c,p;o(!0),await n((p=(c=s.current)==null?void 0:c.value)!=null?p:""),o(!1)};return e.createElement(oe,{open:t,onClose:l,fullWidth:!0},e.createElement($e,null,e.createElement(f,{display:"flex",justifyContent:"space-between",alignItems:"center"},"Ready to publish?",e.createElement(w,{startIcon:e.createElement(lt,null),onClick:l,className:i.closeButton},"Close")),e.createElement(C,null,"Double check your changes, then click Publish to activate this version of your policy. This will immediately apply the permissions defined in this version across Backstage.")),e.createElement(K,{className:i.diffSummaryContainer,dividers:!0},e.createElement(zt,{policy:a})),e.createElement(K,null,e.createElement(Ee,{variant:"outlined",fullWidth:!0,label:"Summary (optional)",placeholder:"Briefly describe this version (or changes from a previous version)",inputRef:s})),e.createElement(Ye,null,e.createElement(w,{color:"primary",onClick:m,disabled:r},r?e.createElement(Pt,{size:20}):"Publish")))}const Nr=D(t=>({paper:{padding:t.spacing(2,2,0,2)}})),pt=({isOpen:t,onClose:n,policy:l})=>{const a=Nr();return e.createElement(oe,{classes:{...a},open:t,onClose:n},e.createElement($e,{disableTypography:!0},e.createElement(f,{display:"flex",flexDirection:"row"},e.createElement(f,null,e.createElement(C,{variant:"h4",component:"h2"},"Success!"),e.createElement(C,null,l.name," has been published and is now your active policy.")),e.createElement(f,null,e.createElement(z,{onClick:n,title:"Close dialog"},e.createElement(lt,null))))),e.createElement(K,null,e.createElement(ve,{policy:l})),e.createElement(Ye,null,e.createElement(f,{display:"flex",flexDirection:"row",flexGrow:1,justifyContent:"flex-start"},e.createElement(w,{component:In,color:"primary",onClick:n,role:"link",to:"/rbac"},"View all versions"))))},wr={canPublish:!1,diff:null,hasChanges:!1,isValid:!1,policy:void 0,createNewRole:()=>"",discardLocalDraft:()=>{},exportPolicy:()=>{},publish:()=>{},saveLocalDraftToServer:()=>Promise.reject(),saveAndPublish:()=>Promise.reject(),refetchPolicy:()=>Promise.reject(),updateLocalDraft:()=>{}},_t=Pe(wr),X=()=>De(_t);function He({children:t,policyId:n}){const l=G(),a=I(le),r=I(W),{getPolicy:o,setPolicy:i}=je(),s=Ue(),{NotFoundErrorPage:m}=s.getComponents(),[c,p]=k({active:!1,update:!1}),[u,d]=k(!1),[{loading:b,value:g},E]=dt(),y=o(n),[x,T,$]=br(),j=!x||Be.safeParse(x).success,B=j?x:void 0,{policy:v,policyConflict:A}=vr({serverPolicy:y,localPolicy:B}),h=Ht(v),S=Be.safeParse(v).success,O=S&&!B&&!b,[{loading:Z,error:J},se]=ie(()=>r.getPolicy(n),[r,n],y?{loading:!1,value:y}:{loading:!0}),ee=()=>{p({active:!0,update:!1})},q=()=>{p({active:!0,update:!0})},xn=R(async H=>{await E(v,H,c.update?v:void 0),p({active:!1,update:!1})},[v,c,E,p]),Pn=async()=>{d(!1)},Dn=()=>{T(H=>H&&y&&{...H,updatedAt:y.updatedAt})},te=R(async()=>{const H=await se();i(H)},[se,i]),Nn=R(async()=>{if(!v)throw new Error("No policy to save");try{await r.updateDraft(v.id,{name:v.name,roles:v.roles,options:v.options}),a.post({message:"Policy saved",severity:"success"}),$(),te==null||te()}catch(H){a.post({message:(H==null?void 0:H.message)||"An error occurred while updating the policy",severity:"error"})}},[a,r,v,te,$]),wn=R(()=>{if(!v)throw new Error("No policy to create a new role");const H=new Set(v.roles.map(kn=>kn.id));let me;do me=ce().split("-")[0];while(H.has(me));const Sn={name:`Role ${me}`,permissions:[],members:"*",id:me};return T({...v,roles:[...v.roles,Sn]}),me},[v,T]),An=()=>{$(),l("/rbac")},Tn=()=>{v&&Ut(v)};return _(()=>{y||te()},[te,y]),_(()=>{g&&d(!0)},[g]),j?v?e.createElement(_t.Provider,{value:{canPublish:O,diff:h,hasChanges:!!B,isValid:S,policy:v,createNewRole:wn,discardLocalDraft:$,exportPolicy:Tn,publish:ee,saveLocalDraftToServer:Nn,refetchPolicy:te,updateLocalDraft:T,saveAndPublish:q}},A&&B&&y&&e.createElement(hr,{localPolicy:B,onSelectLocalPolicy:Dn,onSelectServerPolicy:$,serverPolicy:y}),e.createElement(ut,{open:c.active,onClose:()=>p({active:!1,update:!1}),onPublish:xn,policy:v}),g&&e.createElement(pt,{isOpen:u,onClose:Pn,policy:g}),t):Z?e.createElement(Se,null):J?ir(J)?e.createElement(m,null):e.createElement(bt,{error:J!=null?J:new Error("Unknown")}):null:e.createElement(Pr,{onConfirm:An,policy:x})}function Ar(t){throw new Error("Invalid state")}function ft(){const t=I(W),n=I(le),l=G(),{fetchPolicies:a}=he();return ie(async r=>{if(!r)return;const{roles:o,name:i,options:s}=r;try{const m=await t.createDraft({roles:o,options:s,name:i});return await a(),l(`/rbac/versions/${m.id}`),m}catch(m){throw m instanceof Error&&n.post({message:m.message,severity:"error"}),m}},[l,t,n,a])}const Tr=[{title:"Name",field:"name",render:t=>e.createElement(ue,{to:`versions/${t.id}`},t.name)},{title:"Status",field:"status",render:t=>{switch(t.status){case"active":return"Active";case"draft":return"Draft";case"inactive":return"Inactive";default:return Ar(t.status)}}},{title:"Publish date",field:"lastPublishedAt",render:t=>t.lastPublishedAt?Me.fromISO(t.lastPublishedAt).toLocaleString(Me.DATETIME_MED_WITH_SECONDS):"",type:"datetime",defaultSort:"desc"},{title:"Published by",field:"lastPublishedBy"}];function Sr(t){const n=t.data.length>3,{fetchPolicies:l}=he(),[{loading:a},r]=ft(),[{loading:o,value:i},s]=dt(),[m,c]=k(void 0),[p,u]=k(!1),d=()=>{c(void 0),l()},b=(m==null?void 0:m.id)===(i==null?void 0:i.id)?i:void 0,g=[E=>{const{tableData:y,...x}=E;return{icon:Pl,tooltip:"Republish",onClick:()=>{c(x),u(!0)},disabled:o}},E=>{const{tableData:y,...x}=E;return{icon:Dl,tooltip:"Duplicate",disabled:a||!t.canDuplicate,onClick:()=>r(x)}}];return e.createElement(e.Fragment,null,e.createElement(_n,{title:"Previous Versions",columns:Tr,data:t.data,options:{paging:n,pageSize:3,pageSizeOptions:[3,5,10,20],actionsColumnIndex:-1,loadingType:"linear"},actions:g}),m&&e.createElement(ut,{open:p,onPublish:E=>{s(m,E),u(!1)},onClose:()=>{c(void 0),u(!1)},policy:m}),b&&e.createElement(pt,{isOpen:!0,policy:b,onClose:d}))}const kr=t=>{const[n,l]=k(!1),{fetchPolicies:a}=he(),[{loading:r,value:o},i]=dt(),{policy:s,hasChanges:m}=X(),c=Be.safeParse(s).success,p=!m&&c,u=async b=>{await i(s,b),l(!1)},d=()=>{a()};return e.createElement(e.Fragment,null,e.createElement(w,{...t,onClick:()=>l(!0),disabled:!p||r},"Publish"),e.createElement(ut,{open:n,onClose:()=>l(!1),onPublish:u,policy:s}),o&&e.createElement(pt,{isOpen:!0,onClose:d,policy:o}))};function Rr(t){const n=I(W),l=I(le),{fetchPolicies:a}=he();return ie(async()=>{if(t)return n.deleteDraft(t.id).then(a).catch(r=>(l.post({message:r.message,severity:"error"}),Promise.reject(r)))},[t])}function $r({policies:t}){const n=t.find(c=>c.status==="draft"),l=t.find(c=>c.status==="active"),[a,r]=ft(),[o,i]=Rr(n),s=G(),m=Ir(t);return e.createElement(F,{container:!0,spacing:4},l?e.createElement(F,{item:!0,xs:12,md:6},e.createElement(ve,{policy:l,to:`./versions/${l.id}`,actions:e.createElement(w,{color:"primary",disabled:a.loading||!!n,onClick:()=>r(l)},"Duplicate")})):null,n?e.createElement(F,{item:!0,xs:12,md:6},e.createElement(ve,{policy:n,to:`./versions/${n.id}`,actions:e.createElement(e.Fragment,null,e.createElement(w,{onClick:()=>s(`versions/${n.id}`),color:"primary"},"Edit"),e.createElement(w,{color:"primary",disabled:o.loading,onClick:i},"Delete Draft"),e.createElement(He,{policyId:n.id},e.createElement(kr,{color:"primary"})))})):null,e.createElement(F,{item:!0,xs:12},e.createElement(Sr,{data:m,canDuplicate:!n})))}function Ir(t){return t.filter(({status:n})=>n==="inactive")}function Or(){const{policies:t}=je(),{loading:n,error:l,fetchPolicies:a}=he();Ct(()=>{t||a()});let r;return n?r=e.createElement(F,{item:!0,xs:12},e.createElement(Se,null)):l?r=e.createElement(bt,{error:l}):!t||t.length===0?r=e.createElement(or,null):r=e.createElement($r,{policies:t}),e.createElement(Fe,{pages:void 0,header:e.createElement(ke,{title:"RBAC Policies"},e.createElement(rr,null))},r)}const Br=D(t=>({titleWrapper:{display:"flex",alignItems:"center",gap:t.spacing(2)}}));function Yt({children:t}){const n=Br();return e.createElement(C,{noWrap:!0,variant:"h4",component:"h2",color:"textSecondary",className:n.titleWrapper},t)}const Mr=e.forwardRef(function({children:t,role:n,...l},a){const r=L(()=>{const s=[];return vt.forEach(t,m=>{if(we(m)){const c=m.props.children[0];we(c)&&s.push(c);const p=m.props.children[1];if(we(p)){const u=vt.toArray(p.props.children).filter(we);s.push(...u)}}}),s},[t]),o=r.length,i=54;return e.createElement("div",{ref:a},e.createElement("ul",{...l},e.createElement(kl,{height:250,width:250,rowHeight:i,overscanCount:5,rowCount:o,rowRenderer:s=>e.cloneElement(r[s.index],{style:{...s.style,whiteSpace:"nowrap"}}),role:n})))}),Lr=D({autocomplete:{display:"flex",flex:1}});function Fr({members:t,options:n,namespaceOptions:l,loading:a=!1,disabled:r=!1,isMultiNamespaces:o=!1,onTextChange:i,onToggleMember:s,onChange:m}){const[c,p]=k(!1),u=Lr(),[d,b]=Rn(y=>y+1,0),g=(y,x)=>{x&&(s(x),b())};_(()=>{c&&i("")},[c,i]);const E=o?l.concat((n==null?void 0:n.members)||[]):(n==null?void 0:n.members)||[];return e.createElement(f,{width:250},e.createElement(rt,{key:`${d}`,open:c,onOpen:()=>{p(!0)},onClose:()=>{p(!1)},onChange:g,getOptionLabel:be,groupBy:jr,ListboxComponent:Mr,renderOption:y=>e.createElement(e.Fragment,null,e.createElement(Je,{id:`checkbox-${y.entityRef}`,checked:t.includes(y.entityRef),color:"primary"}),e.createElement("label",{htmlFor:`checkbox-${y.entityRef}`},o?be(y,!1):be(y))),options:E,openOnFocus:!0,disabled:r,loading:a,className:u.autocomplete,renderInput:y=>e.createElement(Ee,{...y,label:o?"Select members":"Select specific users/groups",variant:"standard",onChange:m,InputProps:{...y.InputProps,endAdornment:e.createElement(e.Fragment,null,a?e.createElement(Pt,{color:"inherit",size:20}):null,y.InputProps.endAdornment)}})}))}function be(t,n=!0){var l;const a=Q(t.entityRef);return a.name==="*"?a.namespace:wl({...a,name:(l=t.name)!=null?l:a.name},{defaultKind:a.kind,defaultNamespace:n?Nl:!1})}const Jt={user:"USERS",group:"GROUPS",namespace:"NAMESPACES"};function jr(t){const{name:n,kind:l}=Q(t.entityRef),a=n==="*"?"namespace":l;if(!Jt[a])throw new Error(`Group '${a}' is not supported for members in a policy`);return Jt[a]}const Hr=D(t=>({root:({operation:n})=>({borderRadius:100,borderColor:st(t,n),borderSize:1,borderStyle:"solid",color:st(t,n),lineHeight:1,padding:t.spacing(.5,1),whiteSpace:"nowrap"})})),Wr={small:"span",medium:"div",large:"div"},zr={small:"caption",medium:"body1",large:"subtitle1"},Ce=({operation:t,size:n="small"})=>{const l=Hr({operation:t}),a=ur(t);return!t||t==="UNCHANGED"?null:e.createElement(C,{className:l.root,variant:zr[n],component:Wr[n]},a)},Gr=D(t=>({actionCol:{width:48},typeIconCol:{paddingRight:"0.4rem"},nameCol:{paddingLeft:0},typeIcon:{color:t.palette.grey[500]}}));function Vr({diff:t,loading:n,isMultiNamespaces:l,members:a,error:r,onToggleMember:o,readonly:i=!1}){const s=Gr();if(n)return e.createElement(V,null,e.createElement(N,{scope:"row",colSpan:i?4:5},e.createElement(Se,null)));if(r&&r.message!=null,a==="*")return e.createElement(V,null,e.createElement(N,{colSpan:2,height:80},"All"),e.createElement(N,{colSpan:i?2:3},e.createElement(Ce,{operation:t==null?void 0:t.members["*"].operation})));if(a.length===0)return e.createElement(V,null,e.createElement(N,{scope:"row",colSpan:i?4:5},"Select users or groups using the drop-down menu above."));const m=a.sort((c,p)=>{let u=0;l&&p.name==="*"&&c.name!=="*"?u=1:l&&c.name==="*"&&p.name!=="*"&&(u=-1);const d=c.type.localeCompare(p.type),b=Q(c.entityRef).namespace.localeCompare(Q(p.entityRef).namespace),g=Q(c.entityRef).name.localeCompare(Q(p.entityRef).name);return u||d||b||g});return e.createElement(e.Fragment,null,m.map(c=>{var p;const{name:u,type:d,entityRef:b}=c;return e.createElement(V,{key:b},e.createElement(N,{className:s.typeIconCol},d==="group"&&e.createElement(Rl,{className:s.typeIcon})||l&&u==="*"&&e.createElement($l,{className:s.typeIcon})||e.createElement(kt,{className:s.typeIcon})),e.createElement(N,{scope:"row",className:s.nameCol},(p=l?be(c,!1):be(c))!=null?p:"Unknown"),e.createElement(N,{scope:"row"},u==="*"&&l?"namespace":d),e.createElement(N,null,u&&e.createElement(Ce,{operation:t==null?void 0:t.members[b].operation})),!i&&e.createElement(N,{scope:"row",className:s.actionCol},e.createElement(z,{"aria-label":"delete",onClick:()=>o(c),size:"small"},e.createElement(ge,null))))}))}const qt=Pe({loading:!1}),Ur=({children:t})=>{const n=I(W),l=de(async()=>await n.searchMembers({query:""}),[n]);return e.createElement(qt.Provider,{value:l},t)},_r=()=>De(qt),Yr=D(()=>({header:{display:"flex",flexDirection:"row",justifyContent:"space-between",paddingLeft:"1rem",paddingRight:"1rem",gap:"1rem"},actionCol:{width:48},typeIconCol:{paddingRight:"0.4rem"},nameCol:{paddingLeft:0}}));function Jr({diff:t,policyId:n,role:l,onToggleMember:a,readonly:r=!1,debounceTime:o=1e3}){const i=I(W),s=I(Al),m=Yr(),c=l.members==="*",[p,u]=k(""),{current:d}=ne({}),b=h=>{d[h.entityRef]=h,a(h.entityRef)},g=h=>{var S;if(d[h])return d[h];const O=Q(h);return{entityRef:h,type:O.kind.toLowerCase(),name:(S=O.name)!=null?S:h}},{value:E,loading:y}=_r(),{loading:x,value:T}=de(async()=>{const h=await s.getEntityFacets({facets:["metadata.namespace"]}).then(S=>S.facets["metadata.namespace"].map(O=>O.value));return qr(h)},[s]),$=T?(T==null?void 0:T.length)>1:!1,j=T?T.filter(h=>h.entityRef.toLowerCase().includes(p)):[],B=L(()=>Kn(h=>{u(h.target.value.toLowerCase())},o),[u,o]),{loading:v,error:A}=de(async()=>{l.members==="*"||l.members.length===0||(await i.getPolicy(n)).roles.find(h=>h.id===l.id)===void 0||l.members.forEach(h=>{const S=g(h);d[S.entityRef]=S})},[n,c]);return e.createElement(e.Fragment,null,e.createElement("div",{className:m.header},e.createElement("h2",null,"Members"),e.createElement(Fr,{onToggleMember:b,members:l.members,disabled:r,options:E,namespaceOptions:j,isMultiNamespaces:$,loading:y||x,onTextChange:u,onChange:B})),e.createElement(qe,null,e.createElement(Ke,null,e.createElement(V,null,e.createElement(N,{className:m.typeIconCol}),e.createElement(N,{className:m.nameCol},"Name"),e.createElement(N,null,"Type"),e.createElement(N,null),!r&&e.createElement(N,{className:m.actionCol}))),e.createElement(Qe,null,e.createElement(Vr,{diff:t,loading:v||x,isMultiNamespaces:$,error:A,members:Array.isArray(l.members)?l.members.map(g):l.members,onToggleMember:b,readonly:r}))))}function qr(t){return t.map(n=>({name:"*",type:"user",entityRef:`user:${n}/*`})).sort((n,l)=>n.entityRef.toLowerCase().localeCompare(l.entityRef.toLowerCase()))}function Kt(t){return`${t.palette.primary.main}50`}const Kr=D(t=>({indicator:{right:"unset"},tab:{maxWidth:"none","&.Mui-selected":{backgroundColor:Kt(t),color:t.palette.primary.main}}}));function Qr({options:t,selected:n,onChange:l,readonly:a=!1}){const r=Kr();return e.createElement(Qn,{orientation:"vertical",value:t.map(({id:o})=>o).indexOf(n),onChange:(o,i)=>l(t[i].id),indicatorColor:"primary",TabIndicatorProps:{className:r.indicator}},t.map(o=>e.createElement(Xn,{key:o.id,label:o.displayText.toUpperCase(),className:r.tab,disabled:a})))}const Xr=["condition","anyOf","allOf","not"],Qt={condition:"Condition",anyOf:"Any of",allOf:"All of",not:"Not"};function Et(t){return t===null?!1:t.hasOwnProperty("id")&&t.hasOwnProperty("ruleName")&&t.hasOwnProperty("parameters")}function xe(t){return t.hasOwnProperty("levelType")}function Zr(t){return t==="anyOf"||t==="allOf"||t==="not"}function ea(t){return t?{id:t.id,match:ta(t),decisionType:na(t),criteria:nt(t.decision)?We(t.decision.conditions):null}:{id:ce(),match:{method:"specificPermission"},decisionType:"allow",criteria:null}}function ta(t){var n;return t.match==="*"?{method:"all"}:t.match.name?{method:"specificPermission",name:t.match.name}:t.match.resourceType||(n=t.match.actions)!=null&&n.length?{method:"filter",resourceType:t.match.resourceType,actions:t.match.actions}:{method:"specificPermission"}}function na(t){return typeof t.decision=="string"?t.decision:"conditional"}function We(t){const n=ce();return dl(t)?{id:n,levelType:"allOf",children:t.allOf.map(l=>We(l))}:ul(t)?{id:n,levelType:"anyOf",children:t.anyOf.map(l=>We(l))}:pl(t)?{id:n,levelType:"not",children:[We(t.not)]}:{id:n,ruleName:t.rule,parameters:t.params}}function Xt(t,n){if(!t)return!1;if(xe(t))return t.children.length>0&&t.children.every(a=>Xt(a,n));if(!t.ruleName)return!1;const l=n==null?void 0:n.find(({name:a})=>a===t.ruleName);return l?l.paramsSchema?new It({allErrors:!0}).compile(l.paramsSchema)(t.parameters):!0:!1}function la(t,n,l){return{id:t,match:Zt(n,l),decision:l}}function Zt({method:t,...n},l){return t==="all"?"*":l&&nt(l)?{resourceType:l.resourceType,...n}:n}function yt(t){return Et(t)?{rule:t.ruleName,params:t.parameters}:t.levelType==="not"?{not:yt(t.children[0])}:{[t.levelType]:t.children.map(n=>yt(n))}}const ra=D(t=>({toggleButton:{"&.Mui-selected":{backgroundColor:Kt(t),color:t.palette.primary.main},"&.Mui-selected:hover":{backgroundColor:"#97BBE8"},color:t.palette.primary.main,border:`1px solid ${t.palette.primary.main}`}}));function gt({className:t,...n}){const l=ra();return e.createElement(Tl,{className:`${l.toggleButton} ${t}`,...n})}const aa=D({fullWidth:{width:"100%","& > *":{flexGrow:1}}});function oa({className:t,fullWidth:n,...l}){const a=aa();return e.createElement(Sl,{className:`${n?a.fullWidth:""} ${t}`,...l})}function ia(t,n){const l=(t!=null?t:[]).filter(o=>fl(o,Zt(n))),a=Il(l,o=>_e(o)?o.resourceType:void 0),r=a.length===1&&_e(a[0])?a[0].resourceType:void 0;return{permissions:l,commonResourceType:r}}const ca=D(()=>({fullWidth:{width:"100%","& > *":{flexGrow:1}}})),en="Permission name";function sa({name:t="",readonly:n,onNameChange:l}){const a=ca(),r=Mt();return e.createElement(Xe,{className:a.fullWidth,variant:"outlined",disabled:n},e.createElement(Ie,{id:"match-by-name-dropdown"},en),e.createElement(Ze,{labelId:"match-by-name-dropdown",label:en,value:r?t:"",onChange:o=>l==null?void 0:l(o.target.value)},r==null?void 0:r.map(o=>e.createElement(U,{key:o.name,value:o.name},o.name))))}const ma=D(()=>({fullWidth:{width:"100%","& > *":{flexGrow:1}}})),tn="Resource type";function da({resourceType:t="",readonly:n,onResourceTypeChange:l}){const a=ma(),r=Lt();return e.createElement(Xe,{className:a.fullWidth,variant:"outlined",disabled:n},e.createElement(Ie,{id:"match-by-resource-dropdown"},tn),e.createElement(Ze,{labelId:"match-by-resource-dropdown",label:tn,value:r?t:"",onChange:o=>l==null?void 0:l(o.target.value),displayEmpty:!0},r==null?void 0:r.map(o=>e.createElement(U,{key:o,value:o},o))))}const ua="Action";function pa({actions:t,readonly:n,onActionsChange:l}){return e.createElement(rt,{multiple:!0,id:"match-by-attribute-dropdown",options:["create","read","update","delete"],getOptionLabel:a=>a,value:t!=null?t:[],onChange:(a,r)=>l==null?void 0:l(r),filterSelectedOptions:!0,renderInput:a=>e.createElement(Ee,{...a,variant:"outlined",label:ua,placeholder:"Choose attributes",margin:"normal"}),disabled:n})}const fa=D(t=>({descriptiveText:{fontWeight:500,marginBottom:t.spacing(1)}})),ze=({children:t})=>{const n=fa();return e.createElement(C,{variant:"body2",className:n.descriptiveText},t)},nn="#FF737F",Ea="#E22134";function ln({condition:t}){return e.createElement(ze,null,e.createElement(f,{component:"span",color:nn},t.ruleName,"("),e.createElement(f,{component:"span",color:Ea},JSON.stringify(t.parameters)),e.createElement(f,{component:"span",color:nn},")"))}const rn=({children:t})=>e.createElement(f,{pl:3},t);function an({level:t}){return e.createElement(e.Fragment,null,e.createElement(ze,null,Qt[t.levelType]),e.createElement(rn,null,t.children.map((n,l)=>xe(n)?e.createElement(an,{key:l,level:n}):e.createElement(ln,{key:l,condition:n}))))}const ya="#4CAF50";function ga({permissionCriteria:t}){return e.createElement("div",null,e.createElement(ze,null,"If the below conditions are met"),e.createElement(rn,null,Et(t)&&e.createElement(ln,{condition:t}),xe(t)&&e.createElement(an,{level:t})),e.createElement(ze,null,"Then the action is"," ",e.createElement(f,{component:"span",color:ya},"allowed")))}const ha=D(()=>({addButton:{paddingLeft:40,paddingRight:40}}));function on({onSelect:t}){const n=ha(),l=ne(null),[a,r]=k(!1),o=()=>{r(i=>!i)};return e.createElement("div",null,e.createElement(w,{className:n.addButton,variant:"outlined",color:"primary",onClick:o,ref:l},"Add"),e.createElement(Dt,{anchorEl:l.current,open:a,onClose:o,BackdropProps:{}},Xr.map(i=>e.createElement(U,{key:i,onClick:()=>{t==null||t(i),r(!1)}},Qt[i]))))}const va=D(t=>({editor:{"--jse-main-border":`1px solid ${t.palette.divider}`,"--jse-panel-border":`1px solid ${t.palette.divider}`,"--jse-message-error-background":t.palette.error.main,"--jse-message-warning-background":t.palette.warning.main,"--jse-background-color":t.palette.background.default,"--jse-panel-background":t.palette.background.default,"--jse-delimiter-color":t.palette.type==="light"?"rgba(0, 0, 0, 0.38)":"rgba(255, 255, 255, 0.38)","--jse-error-color":t.palette.text.primary,"--jse-key-color":t.palette.text.primary,"--jse-value-color":t.palette.text.primary,"--jse-text-color":t.palette.text.primary,"--jse-panel-color-readonly":t.palette.text.hint,"--jse-value-color-string":t.palette.status.ok,"--jse-value-color-null":t.palette.status.warning,"--jse-value-color-number":t.palette.status.error,"--jse-value-color-boolean":t.palette.status.running,"--jse-font-family":"inherit"}})),ba=t=>"parseError"in t,Ca=t=>{var n;return t?ba(t)?!!t.parseError:((n=t==null?void 0:t.validationErrors)==null?void 0:n.length)>0:!1};function xa({onChange:t,schema:n,value:l}){const a=ne(null),r=ne(),o=va();return _(()=>(a.current&&!r.current&&(r.current=new Ol({target:a.current,props:{onChange:(i,s,{contentErrors:m})=>{!Ca(m)&&Bl(i)&&t(JSON.parse(i.text))},validator:Ml({schema:n}),content:{json:{}},mainMenuBar:!1,mode:Ll.text}})),()=>{var i;(i=r.current)==null||i.destroy(),r.current=void 0}),[t,n]),Ct(()=>{var i;(i=r.current)==null||i.updateProps({content:{json:l}})}),e.createElement("div",{ref:a,className:o.editor,style:{height:300}})}const Pa=[];function Da(t){const{onChange:n,schema:l,name:a}=t,{description:r,items:o}=l,[i,s]=e.useState(!1),m=Array.isArray(t.value)?t.value:Pa,c=m.includes(ye),p=(y,x)=>{if(!Array.isArray(x)){const T=[...m];T[y]=x||"",n(T)}},u=R(()=>{n([...m,""])},[n,m]),d=y=>{n(m.filter((x,T)=>T!==y))},b=()=>{n(c?[]:[ye])},g=()=>{c&&s(!0)},E=()=>{s(!1)};return _(()=>{m.length?c&&m.length>1&&n([ye]):u()},[u,n,m,c]),!o||!("type"in o)?null:e.createElement(e.Fragment,null,(m!=null?m:[]).map((y,x,{length:T})=>e.createElement(sn,{allowEmptyStrings:!0,key:x,onChange:$=>p(x,$),name:x===0?a:"",schema:{description:x===T-1?r:"",type:o.type},value:y,controls:e.createElement(z,{size:"small",onClick:()=>d(x)},e.createElement(Fl,null))})),!!(m!=null&&m.length)&&e.createElement(f,{alignItems:"center",display:"flex",flexDirection:"row",justifyContent:"space-between"},e.createElement(f,null,e.createElement(Nt,{control:e.createElement(Je,{checked:c,onChange:b,name:"checkedB",color:"primary"}),label:"Use the claims from the logged in users token"})),e.createElement(f,null,e.createElement(fe,{onClose:E,onOpen:g,open:i,title:"To add additional entries you must uncheck using the claims from the logged in user."},e.createElement("span",null,e.createElement(z,{disabled:c,size:"small",onClick:u},e.createElement(at,null)))))))}function Na(t){const{onChange:n,schema:l,name:a,value:r}=t,{description:o}=l;return e.createElement(f,{mb:1},e.createElement(Nt,{control:e.createElement(Je,{checked:r===!0,onChange:i=>{n(i.target.checked)},name:a,color:"primary"}),label:a}),o&&e.createElement(C,{display:"block",variant:"caption",color:"textSecondary"},o))}function wa({allowEmptyStrings:t,controls:n,name:l,onChange:a,schema:r,value:o}){const i=s=>{a(Ta({value:s.currentTarget.value,type:r.type}))};return e.createElement(f,{mb:1},e.createElement(f,{display:"flex",gridGap:6},e.createElement(Ee,{fullWidth:!0,id:l,label:l,placeholder:"Enter",variant:"outlined",size:"small",value:Aa(o,t),onChange:ht(o,t)?void 0:i,disabled:ht(o,t)}),n&&e.createElement(f,{alignSelf:"center"},n)),r.description&&e.createElement(C,{variant:"caption",color:"textSecondary"},r.description,ht(o)&&!t&&e.createElement(e.Fragment,null," (switch to JSON editor to edit)")))}function ht(t,n=!1){return!n&&t===""||t===null||t===ye}function Aa(t,n=!1){return!n&&t===""?"[empty string]":t===null?"[null]":t===ye?"[BackstageUserClaims]":t||""}function Ta({value:t,type:n}){switch(n){case"string":return t===""?void 0:t;case"number":case"integer":return Number.isNaN(Number(t))?void 0:Number(t);case"null":return t==="null"?null:void 0;default:return}}function cn(t){return!!t&&"type"in t&&(t.type==="array"||t.type==="boolean"||t.type==="null"||t.type==="number"||t.type==="integer"||t.type==="string")}function Sa(t){return"type"in t&&t.type==="array"}function ka(t){return"type"in t&&t.type==="boolean"}function sn({schema:t,...n}){return cn(t)?Sa(t)?e.createElement(Da,{...n,schema:t}):ka(t)?e.createElement(Na,{...n,schema:t}):e.createElement(wa,{...n,schema:t}):null}const Ra=new It({allErrors:!0});function $a({onChange:t,schema:n,value:l}){var a;const r=L(()=>Ra.compile(n),[n]),o=L(()=>r(l),[r,l]),i=Object.entries(n.properties),s=m=>c=>{t({...l,[m]:c})};return e.createElement(e.Fragment,null,i.map(([m,c])=>{var p;return e.createElement(sn,{isRequired:((p=n.required)==null?void 0:p.includes(m))||!1,key:m,name:m,onChange:s(m),schema:c,value:l==null?void 0:l[m]})}),e.createElement(wt,{error:!o},(a=r.errors)==null?void 0:a[0].message))}const Ia=t=>!!t&&"properties"in t;function Oa({onChange:t,rule:n,value:l}){const[a,r]=k(!1),{paramsSchema:o}=n!=null?n:{},i=()=>r(p=>!p);if(!Ia(o))return null;const s=!Ba(o),m=s||a,c=e.createElement(w,{size:"small",onClick:i,disabled:s},m?"Close editor":"Edit as JSON");return e.createElement(f,{marginTop:2},e.createElement("form",null,m?e.createElement(xa,{onChange:t,schema:o,value:l}):e.createElement(e.Fragment,null,e.createElement(f,{marginBottom:2},e.createElement(Ie,null,"Parameters")),e.createElement($a,{onChange:t,schema:o,value:l}))),e.createElement(f,{display:"flex",flexDirection:"column",alignItems:"flex-end",marginTop:1},s?e.createElement(fe,{title:"Only JSON editing is supported for this parameter",arrow:!0},e.createElement("span",null,c)):c))}function Ba(t){return Object.values(t.properties).every(cn)}const Ma=D(t=>({conditionCard:{minWidth:t.spacing(63)},conditionCardBar:{height:t.spacing(1),backgroundImage:"linear-gradient(90deg, #007DFF 0%, #0057B2 100%)"},autocomplete:{flex:1}}));function mn({ruleName:t,parameters:n,resourceType:l,onChange:a,onDelete:r}){var o;const i=Ma(),s=Bt(),m=(o=s==null?void 0:s.filter(d=>d.resourceType===l))!=null?o:[],c=m.find(d=>d.name===t),p=d=>{a(d,{})},u=R(d=>{a(t,d)},[a,t]);return e.createElement(f,{display:"flex",alignItems:"center"},e.createElement(Y,{className:i.conditionCard},e.createElement("div",{className:i.conditionCardBar}),e.createElement(pe,null,e.createElement(f,null,e.createElement(f,null,e.createElement(rt,{className:i.autocomplete,"data-testid":"rule-select",getOptionLabel:d=>d.name,getOptionSelected:(d,b)=>d.name===b.name,options:m,onChange:(d,b)=>p(b?b.name:null),renderInput:d=>e.createElement(e.Fragment,null,e.createElement(f,{marginBottom:2},e.createElement(Ie,null,"Rule")),e.createElement(Ee,{...d,placeholder:"Select",variant:"outlined",size:"small",name:"rule"})),renderOption:d=>e.createElement(f,null,e.createElement(C,{variant:"body2"},d.name),e.createElement(C,{noWrap:!0,variant:"caption"},d.description)),value:c||null,PopperComponent:d=>e.createElement(Zn,{...d,style:{width:"auto"},placement:"bottom-start"})})),e.createElement(f,{flex:"1"},e.createElement(f,{display:"flex",flexDirection:"column"},e.createElement(Oa,{rule:c,onChange:u,value:n})))))),e.createElement(f,{ml:1},e.createElement(z,{"aria-label":"delete",onClick:r,size:"small"},e.createElement(ge,null))))}function Ge(){return{id:ce(),ruleName:null,parameters:{}}}const La=D(t=>({conditionTypeFormControl:{minWidth:80,marginLeft:t.spacing(1)}}));function Fa({level:t,onSelect:n}){const l=La(),a=t.children.length>1;return e.createElement(f,{display:"flex",alignItems:"center"},e.createElement(Xe,{className:l.conditionTypeFormControl},e.createElement(Ze,{value:t.levelType,onChange:r=>n==null?void 0:n(r.target.value)},e.createElement(U,{key:"anyOf",value:"anyOf"},"Any of"),e.createElement(U,{key:"allOf",value:"allOf"},"All of"),e.createElement(U,{key:"not",value:"not",disabled:a},"Not"))),e.createElement(f,{ml:1},e.createElement(z,{"aria-label":"delete",onClick:()=>n==null?void 0:n(null),size:"small"},e.createElement(ge,null))))}const ja=D(t=>({treeVerticalSpacer:{width:t.spacing(2),borderLeft:`1px solid ${t.palette.status.aborted}`},treeHorizontalSpacer:{height:t.spacing(3),borderLeft:`1px solid ${t.palette.status.aborted}`},treeVerticalBranchHalf:{position:"absolute",height:"50%",borderLeft:`1px solid ${t.palette.status.aborted}`,alignSelf:"flex-start"},treeVerticalBranchFull:{borderLeft:`1px solid ${t.palette.status.aborted}`,alignSelf:"stretch"},treeHorizontalBranch:{width:t.spacing(2),borderTop:`1px solid ${t.palette.status.aborted}`}}));function dn({level:t,resourceType:n,onChange:l,parentConditionType:a,isRoot:r=!1}){const o=ja(),i=R((g,E)=>{const y=[...t.children];return y.splice(g,1,E),y},[t]),s=R(g=>{l({...t,children:g})},[l,t]),m=R(g=>{g===null?l(null):g==="not"&&t.children.length>1?l({...t,levelType:g,children:t.children.slice(0,1)}):l({...t,levelType:g})},[l,t]),c=R((g,E)=>{s(g===null?un(t.children,E):i(E,g))},[t,s,i]),p=g=>{const E=ce();g==="condition"?s([...t.children,Ge()]):g==="not"?s([...t.children,{id:E,levelType:g,children:[]}]):Zr(g)&&s([...t.children,{id:E,levelType:g,children:[Ge()]}])},u=g=>{s(un(t.children,g))},d=L(()=>t.children.map((g,E)=>(y,x)=>{s(i(E,{...g,ruleName:y,parameters:x}))}),[t.children,s,i]),b=L(()=>t.children.map((g,E)=>y=>c(y,E)),[t.children,c]);return e.createElement("div",null,!r&&e.createElement("div",{className:o.treeHorizontalSpacer}),e.createElement(f,{display:"flex",alignItems:"center",position:"relative"},!r&&e.createElement(e.Fragment,null,e.createElement("div",{className:a==="not"?o.treeVerticalBranchHalf:o.treeVerticalBranchFull}),e.createElement("div",{className:o.treeHorizontalBranch})),e.createElement(Fa,{level:t,onSelect:m})),e.createElement(f,{display:"flex"},r||a==="not"?e.createElement(f,{pl:2}):e.createElement("div",{className:o.treeVerticalSpacer}),!r&&e.createElement(f,{pl:2}),e.createElement("div",null,t.children.map((g,E)=>xe(g)?e.createElement(f,{key:g.id},e.createElement(dn,{level:g,resourceType:n,parentConditionType:t.levelType,onChange:b[E]})):e.createElement(Ne,{key:g.id},e.createElement("div",{className:o.treeHorizontalSpacer}),e.createElement(f,{display:"flex",alignItems:"center",position:"relative"},e.createElement("div",{className:t.levelType==="not"?o.treeVerticalBranchHalf:o.treeVerticalBranchFull}),e.createElement("div",{className:o.treeHorizontalBranch}),e.createElement(mn,{ruleName:g.ruleName,parameters:g.parameters,resourceType:n,onChange:d[E],onDelete:()=>u(E)})))),!(t.levelType==="not"&&t.children.length>=1)&&e.createElement(e.Fragment,null,e.createElement("div",{className:o.treeHorizontalSpacer}),e.createElement(f,{display:"flex",alignItems:"center",position:"relative"},e.createElement("div",{className:o.treeVerticalBranchHalf}),e.createElement("div",{className:o.treeHorizontalBranch}),e.createElement(on,{onSelect:p}))))))}function un(t,n){const l=[...t];return l.splice(n,1),l}const Ha=D(t=>({paper:{backgroundColor:t.palette.background.default,padding:t.spacing(3),marginBottom:t.spacing(3),minHeight:t.spacing(48)}}));function Wa({permissionCriteria:t,resourceType:n,onUpdate:l,readonly:a=!1}){const r=Ha(),o=R(p=>{l(u=>({...u,...p}))},[l]),i=R(p=>{const u=ce();o(p==="condition"?Ge():p==="not"?{id:u,levelType:p,children:[]}:{id:u,levelType:p,children:[Ge()]})},[o]),s=R((p,u)=>{l(d=>({...d,ruleName:p,parameters:u}))},[l]),m=R(()=>{l(null)},[l]);let c;return a?c=e.createElement(ga,{permissionCriteria:t}):t===null?c=e.createElement(on,{onSelect:i}):Et(t)?c=e.createElement(mn,{ruleName:t.ruleName,parameters:t.parameters,resourceType:n,onChange:s,onDelete:m}):xe(t)&&(c=e.createElement(dn,{level:t,resourceType:n,onChange:l,isRoot:!0})),e.createElement(el,{variant:"outlined",className:r.paper},c)}const za=D(t=>({dialogTitle:{display:"flex",alignItems:"center",justifyContent:"space-between"},fullWidth:{width:"100%","& > *":{flexGrow:1}},infoIcon:{position:"absolute",right:t.spacing(3)},content:{padding:t.spacing(7)},saveButton:{paddingLeft:t.spacing(5),paddingRight:t.spacing(5)},contentContainerConditional:{display:"flex",gap:t.spacing(5),maxWidth:1480}})),Ga={specificPermission:"Choose a specific permission",filter:"Filter by permission properties",all:"Match all permissions"},pn="Choose the name of a resource permission or filter by resource type to set a conditional decision.";function Va({rolePermission:t,readonly:n=!1,onClose:l,onSave:a}){const r=za(),o=Mt(),i=Bt(),s=Xl(),m=ea(t),[c,p]=k(m.match),[u,d]=k(m.decisionType),[b,g]=k(m.criteria),E=L(()=>ia(o,c),[o,c]),y=u==="conditional",x=y?"xl":"sm";_(()=>{y&&o&&!E.commonResourceType&&d("allow")},[y,o,E.commonResourceType,d]);const T=A=>{A!==null&&d(A)},$=L(()=>c.method==="specificPermission"&&!c.name||c.method==="filter"&&!c.resourceType&&!c.actions,[c]),j=L(()=>E.permissions.length===0?!1:!$,[E,$]),B=L(()=>u!=="conditional"?!0:!(!E.commonResourceType||!(s!=null&&s[E.commonResourceType].pluginId)||!Xt(b,i)),[u,E,s,b,i]),v=()=>{a==null||a(la(m.id,c,u==="conditional"?{resourceType:E.commonResourceType,pluginId:s[E.commonResourceType].pluginId,conditions:yt(b)}:u))};return e.createElement(oe,{open:!0,maxWidth:x,onClose:l,fullWidth:!0},e.createElement($e,{disableTypography:!0,className:r.dialogTitle},e.createElement(C,{variant:"h4",component:"h2"},"New Permission Decision"),e.createElement(w,{startIcon:e.createElement(lt,null),onClick:l},"Close")),e.createElement(K,{dividers:!0,className:r.content},e.createElement(f,{className:y?r.contentContainerConditional:void 0},e.createElement(f,{mb:5,flex:1},e.createElement(Qr,{options:Object.entries(Ga).map(([A,h])=>({id:A,displayText:h})),selected:c.method,onChange:A=>p({method:A}),readonly:n})),e.createElement(f,{mb:5,height:189,flex:1},c.method==="specificPermission"&&e.createElement(sa,{name:c.name,readonly:n,onNameChange:A=>p({...c,name:A})}),c.method==="filter"&&e.createElement(e.Fragment,null,e.createElement(da,{resourceType:c.resourceType,readonly:n,onResourceTypeChange:A=>p({...c,resourceType:A})}),e.createElement(pa,{actions:c.actions,readonly:n,onActionsChange:A=>p({...c,actions:A.length?A:void 0})}),$?null:e.createElement(e.Fragment,null,e.createElement(f,{marginY:2},e.createElement(et,{variant:"middle"})),e.createElement(wt,null,`Matched ${E.permissions.length} ${E.permissions.length===1?"permission":"permissions"}`)))),e.createElement(f,{mb:5,flex:1},e.createElement(f,{display:"flex",alignItems:"center"},e.createElement(oa,{value:u,exclusive:!0,fullWidth:!0,"aria-label":"Decision result",onChange:(A,h)=>T(h)},e.createElement(gt,{value:"allow","aria-label":"Decision allowed",disabled:n},"Allow"),e.createElement(gt,{value:"deny","aria-label":"Decision denied",disabled:n},"Deny"),e.createElement(gt,{value:"conditional","aria-label":"Decision conditionally allowed",disabled:!E.commonResourceType||n},"Conditional")),!y&&!n&&e.createElement(fe,{title:pn},e.createElement($t,{className:r.infoIcon,color:"primary","aria-label":pn}))))),u==="conditional"&&!!E.commonResourceType&&e.createElement(Wa,{permissionCriteria:b,resourceType:E.commonResourceType,onUpdate:g,readonly:n}),!n&&e.createElement(f,{display:"flex",justifyContent:"flex-end"},e.createElement(w,{variant:"contained",color:"primary",className:r.saveButton,onClick:v,disabled:!j||!B},"Save"))))}const Ua=D(t=>({container:{display:"flex",position:"relative",alignItems:"center",gap:t.spacing(1),flexShrink:1,maxWidth:"100%",minWidth:0},input:({invalid:n})=>({boxSizing:"content-box",display:"block",maxWidth:"100%",padding:0,borderWidth:2,borderStyle:"solid",borderColor:n?t.palette.error.main:"transparent",borderRadius:t.shape.borderRadius,backgroundColor:"transparent",color:t.palette.textContrast,fontFamily:"inherit",fontSize:"inherit",lineHeight:"inherit",fontWeight:"inherit",textOverflow:"ellipsis"}),hiddenSpan:{position:"absolute",top:0,left:0,borderWidth:1,whiteSpace:"pre",opacity:0,pointerEvents:"none"}}));function fn({invalid:t,name:n,value:l,onTextChange:a}){const r=Ua({invalid:t}),[o,i]=k(!1),[s,m]=k(null),c=ne(null),[p,u]=k(l);_(()=>{u(l)},[l]),$n(()=>{c.current&&s&&c.current.style.setProperty("width",`max(${s.getBoundingClientRect().width}px, 3ch)`)},[s,p]);const d=()=>{i(!1),u(l)},b=()=>{i(!1),a==null||a(p)},g=()=>{var y;o?b():(i(!0),(y=c.current)==null||y.focus())},E=y=>{var x;y.key==="Enter"&&((x=c.current)==null||x.blur()),y.key==="Escape"&&d()};return e.createElement(e.Fragment,null,e.createElement("div",{className:r.container},e.createElement("input",{"aria-label":n,className:r.input,name:n,ref:c,onChange:y=>u(y.target.value),onFocus:g,onBlur:b,onKeyDown:E,value:p}),e.createElement("span",{"aria-hidden":"true",className:r.hiddenSpan,ref:m},p),e.createElement(z,{onClick:g,size:"small"},o?e.createElement(Hl,{"aria-label":"Save title"}):e.createElement(jl,{"aria-label":"Edit title"}))))}const En=t=>{if(t.success)return{};const n={};for(const l of t.error.issues)n[l.path.join(".")]=!0;return n},yn=({children:t,onConfirm:n,message:l,title:a})=>{const[r,o]=k(!1),i=()=>o(!1),s=()=>o(!0),m=()=>{n(),i()};return e.createElement(e.Fragment,null,t({onClick:s}),e.createElement(oe,{open:r,onClose:i},e.createElement($e,null,e.createElement(f,{display:"flex",justifyContent:"space-between",alignItems:"center"},a)),e.createElement(K,null,e.createElement(tl,null,l)),e.createElement(Ye,null,e.createElement(w,{"aria-label":"Cancel action",color:"primary",onClick:i},"Cancel"),e.createElement(w,{"aria-label":"Confirm action",color:"secondary",onClick:m,variant:"contained"},"Confirm"))))},gn=({helpText:t})=>e.createElement(f,{display:"flex",alignItems:"center"},e.createElement(f,{component:"span",mr:1},e.createElement(C,{variant:"body2",noWrap:!0},"Reorder")),e.createElement(fe,{title:t},e.createElement($t,{color:"primary","aria-label":t}))),hn=(t,n,l)=>{const a=n+l;if(a<0||a>=t.length)return t;const r=[...t];return[r[a],r[n]]=[r[n],r[a]],r},vn=({array:t,index:n,onReorder:l})=>{const a=n===0,r=n===t.length-1;return e.createElement(f,{display:"flex"},e.createElement(z,{disabled:a,onClick:()=>l(hn(t,n,-1)),"aria-label":"Move up",size:"small"},e.createElement(zl,null)),e.createElement(z,{disabled:r,onClick:()=>l(hn(t,n,1)),"aria-label":"Move down",size:"small"},e.createElement(Wl,null)))},_a=D(()=>({emptyStateImage:{width:"95%",zIndex:2,position:"relative",left:"50%",top:"50%",transform:"translate(-50%, 15%)"}}));function bn({src:t,alt:n}){const l=_a();return e.createElement("img",{src:t,className:`${l.emptyStateImage} `,alt:n})}const Ya="Use the arrows to change the order in which permission decisions are evaluated.";function Ja({diff:t,permissions:n,onReorderPermissions:l,onNewPermissionClick:a,onOpenPermission:r,onRemovePermissionClick:o,anyAllow:i,readonly:s=!1}){return e.createElement(e.Fragment,null,e.createElement(f,{display:"flex",justifyContent:"space-between",padding:2},e.createElement(C,{variant:"h5"},"Permission Decisions"),!s&&n.length!==0&&e.createElement(w,{color:"primary",variant:"outlined",startIcon:e.createElement(at,null),onClick:a},"New")),e.createElement(qe,null,e.createElement(Ke,null,e.createElement(V,null,!s&&!i&&e.createElement(N,{style:{width:0}},e.createElement(gn,{helpText:Ya})),e.createElement(N,null,"Match by"),e.createElement(N,null,"Decision"),e.createElement(N,null),!s&&e.createElement(N,null))),e.createElement(Qe,null,n.length===0&&e.createElement(V,null,e.createElement(N,{colSpan:5},e.createElement(Te,{title:"No permission decisions set",description:"Click the button below to create your first permission.",missing:{customImage:e.createElement(bn,{src:Gl,alt:"No permission placeholder"})},action:e.createElement(w,{variant:"contained",color:"primary",onClick:a},"New permission decision")}))),n.map((m,c)=>e.createElement(V,{key:c},!s&&!i&&e.createElement(N,null,e.createElement(vn,{array:n,index:c,onReorder:l})),e.createElement(N,null,e.createElement(nl,{onClick:()=>r(c)},e.createElement(C,{variant:"body2",color:"primary"},mt(m)))),e.createElement(N,null,pr(m)),e.createElement(N,null,e.createElement(Ce,{operation:t==null?void 0:t.permissions[m.id].operation})),!s&&e.createElement(N,{align:"right"},e.createElement(yn,{message:"Are you sure you want to remove this permission decision?",onConfirm:()=>o(c),title:"Remove?"},p=>e.createElement(z,{...p,"aria-label":"Remove permission decision",size:"small"},e.createElement(ge,null)))))))))}function qa(){const{roleId:t,versionId:n}=Ve();return Oe(t),Oe(n),e.createElement(He,{policyId:n},e.createElement(Ka,{roleId:t}))}function Ka({roleId:t}){const{diff:n,updateLocalDraft:l,policy:a}=X(),r=a.roles.find(h=>h.id===t),o=n==null?void 0:n.roles[t],[i,s]=k(null),[m,c]=k(!1),p=Ue(),{NotFoundErrorPage:u}=p.getComponents(),d=G(),b=D(h=>({cardContainer:{margin:h.spacing(0)}}))();if(!r)return e.createElement(u,null);const g=r.name,E=h=>{const S=a.roles.findIndex(Z=>Z.id===h.id),O=[...a.roles];O.splice(S,1,h),l({...a,roles:O})},y=h=>{E({...r,name:h})},x=h=>{if(i===null)E({...r,permissions:[h,...r.permissions]});else{const S=[...r.permissions];S.splice(i,1,h),E({...r,permissions:S})}c(!1)},T=h=>{if(h==="*")E({...r,members:r.members==="*"?[]:"*"});else if(r.members==="*")E({...r,members:[h]});else{const S=r.members.includes(h)?r.members.filter(O=>O!==h):[...r.members,h];E({...r,members:S.length===0?"*":S})}},$=h=>{E({...r,permissions:r.permissions.filter((S,O)=>h!==O)})},j=h=>{E({...r,permissions:h})},B=En(El.safeParse(r)).name,v=a.status!=="draft",A=a.options.resolutionStrategy==="any-allow";return e.createElement(e.Fragment,null,e.createElement(Fe,{pages:[{title:a.name,path:`../../../${a.id}`},{title:g}],header:e.createElement(ke,{titleComponent:e.createElement(Yt,null,a.name," \xA0\u01C0",v?e.createElement(e.Fragment,null,"\xA0",g):e.createElement(fn,{invalid:B,value:g,onTextChange:y}),e.createElement(Ce,{operation:o==null?void 0:o.role.operation,size:"large"})),description:a.description},e.createElement(w,{variant:"outlined",color:"primary",onClick:()=>d("../..",{relative:"path"})},"Back to policy"))},e.createElement(F,{container:!0,className:b.cardContainer,spacing:4,direction:"row"},e.createElement(F,{item:!0,xs:6},e.createElement(Y,null,e.createElement(Jr,{diff:o||null,role:r,policyId:a.id,onToggleMember:T,readonly:v}))),e.createElement(F,{item:!0,xs:6},e.createElement(Y,null,e.createElement(Ja,{diff:o||null,permissions:r.permissions,onNewPermissionClick:()=>{s(null),c(!0)},onOpenPermission:h=>{s(h),c(!0)},onReorderPermissions:j,onRemovePermissionClick:$,anyAllow:A,readonly:v}))))),m&&e.createElement(Va,{rolePermission:i!==null?r.permissions[i]:void 0,onClose:()=>c(!1),onSave:x,readonly:v}))}const Qa="Use the arrows to change the order in which roles are evaluated.";function Xa({}){const{diff:t,policy:n,createNewRole:l,updateLocalDraft:a}=X(),r=G(),o=Za(n),i=n.status!=="draft",s=n.options.resolutionStrategy==="any-allow",m=u=>{a({...n,roles:u})},c=u=>{a({...n,roles:n.roles.filter(({id:d})=>d!==u)})},p=()=>{r(`./roles/${l()}`)};return e.createElement(Y,null,e.createElement(f,{display:"flex",justifyContent:"space-between",padding:2},e.createElement(C,{variant:"h3"},"Roles"),!i&&e.createElement(w,{color:"primary",variant:"outlined",startIcon:e.createElement(at,null),onClick:()=>p()},"New role")),e.createElement(qe,null,e.createElement(Ke,null,e.createElement(V,null,!i&&!s&&e.createElement(N,{style:{width:0}},e.createElement(gn,{helpText:Qa})),e.createElement(N,null,"Name"),e.createElement(N,null,"Users"),e.createElement(N,null,"Groups"),!i&&e.createElement(N,{style:{width:0}}))),e.createElement(Qe,null,o.map((u,d)=>e.createElement(V,{key:d},!i&&!s&&e.createElement(N,null,e.createElement(vn,{array:n.roles,index:d,onReorder:m})),e.createElement(N,null,e.createElement(f,{alignItems:"center",display:"flex",gridGap:8},e.createElement(ue,{to:`roles/${u.id}`},u.name),e.createElement(Ce,{operation:t==null?void 0:t.roles[u.id].role.operation}))),e.createElement(N,null,u.userCount),e.createElement(N,null,u.groupCount),!i&&e.createElement(N,{align:"right"},e.createElement(yn,{message:"Are you sure you want to remove this role?",title:"Remove role?",onConfirm:()=>c(u.id)},b=>e.createElement(z,{...b,"aria-label":"Remove role",size:"small"},e.createElement(ge,null)))))))))}function Za(t){return t.roles.map(n=>({id:n.id,name:n.name,userCount:Array.isArray(n.members)?n.members.filter(l=>l.startsWith("user:")).length:n.members,groupCount:Array.isArray(n.members)?n.members.filter(l=>l.startsWith("group:")).length:n.members}))}const eo=D(t=>({cardHeader:{padding:t.spacing(3,3),borderBottom:`1px solid ${t.palette.border}`},cardContent:{padding:t.spacing(6,3),"& > *":{background:"transparent"}},emptyStateImage:{width:"95%",zIndex:2,position:"relative",left:"50%",top:"50%",transform:"translate(-50%, 15%)"}}));function to({readonly:t}){const n=eo(),l=G(),{createNewRole:a}=X(),r=()=>{const o=a();l(`./roles/${o}`)};return e.createElement(Y,null,e.createElement(At,{title:"Roles",className:n.cardHeader}),e.createElement(pe,{className:n.cardContent},t?e.createElement(Te,{title:"No roles configured",missing:"content"}):e.createElement(Te,{title:"No roles yet",description:"Click the button below to create your first role.",missing:{customImage:e.createElement(bn,{src:Vl,alt:"No roles placeholder"})},action:e.createElement(w,{variant:"contained",color:"primary",onClick:()=>r()},"New role")})))}const no=D(t=>({new:{borderRadius:100,backgroundColor:t.palette.success.main,color:t.palette.common.white,padding:t.spacing(.5,1)}}));function lo(){const[t,n]=k(null),{hasDraftPolicy:l}=je(),{isValid:a,discardLocalDraft:r,exportPolicy:o,hasChanges:i,policy:s,saveLocalDraftToServer:m,saveAndPublish:c,publish:p}=X(),u=G(),d=no(),[b,g]=ft(),E=x=>{n(x.currentTarget)},y=()=>{n(null)};return e.createElement(e.Fragment,null,e.createElement(ll,{variant:"contained",color:"primary"},s.status==="draft"&&e.createElement(w,{disabled:!a,onClick:()=>m()},"Save"),s.status==="inactive"&&e.createElement(w,{onClick:()=>p()},"Republish"),s.status==="active"&&e.createElement(w,{disabled:l||b.loading,onClick:()=>g(s)},"Duplicate"),e.createElement(w,{color:"primary",title:"options",size:"small",onClick:E},e.createElement(Ul,null))),e.createElement(Dt,{getContentAnchorEl:null,anchorEl:t,anchorOrigin:{vertical:"bottom",horizontal:"right"},open:!!t,onClose:y,PaperProps:{style:{width:240}}},s.status==="draft"&&e.createElement(tt,null,e.createElement(U,{disabled:!a,onClick:()=>c()},e.createElement(re,null,e.createElement(Yl,{fontSize:"small"})),e.createElement(ae,null,"Save & Publish")),e.createElement(U,{disabled:!i,onClick:()=>r()},e.createElement(re,null,e.createElement(_l,{color:i?"secondary":"inherit",fontSize:"small"})),e.createElement(ae,null,e.createElement(C,{color:i?"secondary":"inherit"},"Discard changes"))),e.createElement(et,null)),e.createElement(tt,null,e.createElement(U,{onClick:()=>o()},e.createElement(re,null,e.createElement(ql,{fontSize:"small"})),e.createElement(ae,null,"Export"))),e.createElement(et,null),e.createElement(tt,null,e.createElement(U,{disabled:!a,onClick:()=>u("./options")},e.createElement(re,null,e.createElement(Jl,{fontSize:"small"})),e.createElement(ae,null,"Options"),e.createElement(rl,null,e.createElement(C,{className:d.new,variant:"caption"},"New"))))))}function ro(){const{versionId:t}=Ve();return Oe(t),e.createElement(He,{policyId:t},e.createElement(ao,null))}function ao(){const{policy:t,updateLocalDraft:n}=X(),l=o=>{n({...t,name:o})},a=En(yl.safeParse(t)).name,r=t.status!=="draft";return e.createElement(Fe,{pages:[{title:t.name}],header:e.createElement(ke,{title:t.name,titleComponent:e.createElement(e.Fragment,null,e.createElement(Yt,null,r?t.name:e.createElement(fn,{invalid:a,name:"Policy name",value:t.name,onTextChange:l}),e.createElement(Wt,{status:t.status})),oo(t))},e.createElement(lo,null))},e.createElement(F,{item:!0,xs:12},t.roles.length>0?e.createElement(Xa,null):e.createElement(to,{readonly:r})))}function oo(t){const n={created:"Created by ",published:"Last published by ",updated:"Last updated by "},{activityDateText:l,activityUser:a,timestamp:r}=Vt(t,n);return e.createElement(C,{variant:"body2"},e.createElement(C,{component:"span",display:"inline",variant:"body2"},`${l} ${a} `),e.createElement(Gt,{timestamp:r}))}const io=D(t=>({card:n=>({marginTop:t.spacing(3),height:"100%","&:hover":n.readonly?{pointerEvents:"none"}:{}}),cardHeader:{paddingBottom:t.spacing(2),alignItems:"flex-start"},defaultChip:{marginLeft:t.spacing(1),marginBottom:0},title:{display:"flex",alignItems:"center",paddingTop:t.spacing(.5),paddingBottom:t.spacing(1)}}));function Cn(t){const n=io(t),{title:l,description:a,active:r,changeResolutionStrategy:o,defaultOption:i,readonly:s}=t,m=()=>{s||o()};return e.createElement(Y,{className:`${n.card}`,onClick:m},e.createElement(al,{disabled:s},e.createElement(pe,null,e.createElement(At,{className:n.cardHeader,avatar:e.createElement(ol,{checked:r,color:"primary",disabled:s}),title:e.createElement("div",{className:n.title},e.createElement(C,{variant:"h6",component:"h2"},l),i?e.createElement(Re,{label:"Default",size:"small",className:n.defaultChip}):null),subheader:a}))))}const co=D(t=>({title:{display:"flex",alignItems:"center",paddingBottom:t.spacing(2)},maxWidthWrapper:{maxWidth:"800px"},readOnlyChip:{marginLeft:t.spacing(1)},paragraph:{paddingBottom:t.spacing(1)}}));function so(){const{versionId:t}=Ve();return Oe(t),e.createElement(He,{policyId:t},e.createElement(mo,null))}function mo(){const t=co(),{policy:n,updateLocalDraft:l}=X(),a=G(),r=n.status!=="draft",o=i=>{l({...n,options:{...n.options,resolutionStrategy:i}})};return e.createElement(Fe,{pages:[{title:n.name,path:".."},{title:"Options"}],header:e.createElement(ke,{title:"Options"},e.createElement(w,{variant:"outlined",color:"primary",onClick:()=>a("..",{relative:"path"})},"Back to policy"))},e.createElement(F,{item:!0,xs:12,className:t.maxWidthWrapper},e.createElement("div",null,e.createElement("div",{className:t.title},e.createElement(C,{variant:"h5",component:"h1"},"Decision resolution strategy"),r?e.createElement(Re,{label:"Read only",className:t.readOnlyChip}):null),e.createElement(C,{variant:"body2",component:"p",className:t.paragraph},"Multiple decisions from multiple roles could be applicable to a single user when authorizing a permission request. Please select the decision resolution strategy that makes sense for your policy."),e.createElement(C,{variant:"body2",component:"p",className:t.paragraph},"Please note this strategy will be applied to the whole policy and greatly affects the outcome of permission decisions."),e.createElement(Cn,{title:"Any-allow",changeResolutionStrategy:()=>o("any-allow"),readonly:r,defaultOption:!0,description:e.createElement(e.Fragment,null,e.createElement(C,{variant:"body2",color:"textSecondary",component:"p",className:t.paragraph},"The first allow decision from all of the roles and decisions is the final result. A single explicit allow or an allow as a result of a conditional decision would result in a final allow decision, otherwise the decision is deny."),e.createElement(C,{variant:"body2",color:"textSecondary",component:"p",className:t.paragraph},"With this option, the order of roles and decisions does not matter.")),active:n.options.resolutionStrategy==="any-allow"}),e.createElement(Cn,{title:"First match",changeResolutionStrategy:()=>o("first-match"),readonly:r,description:e.createElement(e.Fragment,null,e.createElement(C,{variant:"body2",color:"textSecondary",component:"p",className:t.paragraph},"The first matching decision from the first matching role that is applicable to the user is the final result, regardless if that decision is an allow, deny or conditional."),e.createElement(C,{variant:"body2",color:"textSecondary",component:"p",className:t.paragraph},"With this option, the order in which you define roles and decisions matters.")),active:n.options.resolutionStrategy==="first-match"}))))}function uo(){const t=Ue(),{NotFoundErrorPage:n}=t.getComponents();return e.createElement(Kl,{loading:e.createElement(Se,null),unauthorized:e.createElement(n,null)},e.createElement(lr,null,e.createElement(Ql,null,e.createElement(Ur,null,e.createElement(On,null,e.createElement(Ae,{element:e.createElement(Or,null),path:"/"}),e.createElement(Ae,{element:e.createElement(ro,null),path:"/versions/:versionId"}),e.createElement(Ae,{element:e.createElement(so,null),path:"/versions/:versionId/options"}),e.createElement(Ae,{element:e.createElement(qa,null),path:"/versions/:versionId/roles/:roleId"}))))))}export{uo as RBACRoot};
3
- //# sourceMappingURL=Root-b43ee402.esm.js.map