@spotify/backstage-plugin-rbac 0.4.0 → 0.5.1

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