@spotify/backstage-plugin-rbac 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,15 @@
1
+ # @spotify/backstage-plugin-rbac
2
+
3
+ ## 0.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - d72af34c: Upgrade to Backstage 1.10.0
8
+
9
+ ### Patch Changes
10
+
11
+ - 3f878b29: Minor UI tweaks and improvements
12
+ - Updated dependencies [d72af34c]
13
+ - Updated dependencies [c55842f7]
14
+ - @spotify/backstage-plugin-core@0.3.0
15
+ - @spotify/backstage-plugin-rbac-common@0.3.0
@@ -1,2 +1,2 @@
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-bb1908ac.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-296ab754.esm.js.map
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-2e23cb45.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-27622f65.esm.js.map
@@ -1,2 +1,2 @@
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-296ab754.esm.js";import"@backstage/core-plugin-api";import"react-use/lib/useAsync";import"./index-bb1908ac.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-ca7b78f0.esm.js.map
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-27622f65.esm.js";import"@backstage/core-plugin-api";import"react-use/lib/useAsync";import"./index-2e23cb45.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-9f71d4a8.esm.js.map
@@ -0,0 +1,3 @@
1
+ import e,{createContext as Ne,useState as I,useCallback as S,useMemo as L,useContext as Te,useEffect as z,Fragment as pe,useRef as X,useReducer as dn,useLayoutEffect as pn}from"react";import{Link as fn,useNavigate as U,useParams as rt,Routes as En,Route as Re}from"react-router-dom";import{useApi as B,configApiRef as yn,alertApiRef as Z,useApp as we,useRouteRef as gn}from"@backstage/core-plugin-api";import Se from"react-use/lib/useAsync";import{isResourcePermission as at}from"@backstage/plugin-permission-common";import{r as $,a as hn}from"./index-2e23cb45.esm.js";import{forEach as bn,mapValues as vn,groupBy as Cn,uniq as Dn}from"lodash";import{Link as Q,Progress as fe,ErrorPanel as lt,Table as Pn,Breadcrumbs as xn,Page as An,Header as Nn,Content as Tn,ContentHeader as ke,EmptyState as Ee}from"@backstage/core-components";import Y from"react-use/lib/useAsyncFn";import ot from"react-use/lib/useMount";import{makeStyles as N,Chip as it,Box as p,Typography as C,Tooltip as ae,Card as J,CardContent as ye,List as Rn,ListItem as ct,ListItemIcon as st,ListItemText as mt,CardActions as wn,Dialog as ee,DialogTitle as ge,IconButton as j,DialogContent as K,DialogActions as Ie,Button as x,TextField as le,CircularProgress as ut,Container as Sn,Grid as V,debounce as kn,Checkbox as Be,Table as Oe,TableHead as Me,TableRow as H,TableCell as v,TableBody as _e,FormControlLabel as dt,FormHelperText as pt,InputLabel as he,Paper as In,Popper as Bn,Menu as On,MenuItem as te,FormControl as Le,Select as Fe,Tabs as Mn,Tab as _n,Divider as Ln,DialogContentText as Fn,CardHeader as $n}from"@material-ui/core";import jn from"@material-ui/icons/Publish";import Vn from"@material-ui/icons/FilterNone";import{DateTime as be}from"luxon";import ft from"lodash/omit";import{saveAs as Hn}from"file-saver";import Wn,{dump as zn}from"js-yaml";import Gn from"lodash/pickBy";import $e from"@material-ui/icons/Close";import Un from"@material-ui/icons/CalendarToday";import Yn from"@material-ui/icons/Person";import Jn from"@material-ui/icons/FiberManualRecord";import Et from"lodash/keyBy";import Kn from"lodash/isEqual";import{isConditionalDecision as je,PolicyConfigParser as ve,BackstageUserPlaceholder as oe,isAllOfPermissionCriteria as qn,isAnyOfPermissionCriteria as Xn,isNotPermissionCriteria as Zn,isMatchingPermission as Qn,RoleParser as er,UpdateDraftRequestParser as tr}from"@spotify/backstage-plugin-rbac-common";import{useAutoUpdatingRelativeTime as nr}from"@spotify/backstage-plugin-core/src/utils/useAutoUpdatingRelativeTime";import{v4 as ne}from"uuid";import yt from"@material-ui/icons/ReportProblemOutlined";import rr from"react-use/lib/useLocalStorage";import{SpotifyLicenseBanner as ar,invariant as Ve}from"@spotify/backstage-plugin-core";import He from"@material-ui/icons/Add";import ie from"@material-ui/icons/Delete";import{parseEntityRef as We,DEFAULT_NAMESPACE as lr}from"@backstage/catalog-model";import{humanizeEntityRef as or}from"@backstage/plugin-catalog-react";import{Autocomplete as ze,ToggleButton as ir,ToggleButtonGroup as cr}from"@material-ui/lab";import sr from"lodash/uniqBy";import gt from"@material-ui/icons/Info";import mr from"@material-ui/icons/Edit";import ur from"@material-ui/icons/Check";import{JSONEditor as dr,isTextContent as pr,createAjvValidator as fr,Mode as Er}from"vanilla-jsoneditor";import ht from"ajv";import yr from"@material-ui/icons/Remove";import gr from"@material-ui/icons/KeyboardArrowDown";import hr from"@material-ui/icons/KeyboardArrowUp";import br from"../images/no-permissions.svg";import vr from"../images/no-roles.svg";import{A as Cr}from"./Authorized-27622f65.esm.js";import"@backstage/errors";const bt=Ne(null),Dr=({children:t})=>{const n=B(yn),r=B($),l=B(Z),[a,o]=I(null),i=S(async()=>{var m;if(!a){const u=await r.fetchAllPermissionMetadata((m=n.getOptionalStringArray("permission.permissionedPlugins"))!=null?m:[]),c=xr(u.rules);bn(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=Ar(u,c);return o(s),s}return a},[l,a,r,n]);return e.createElement(bt.Provider,{value:L(()=>({getMetadata:i}),[i])},t)};function Ce(){const t=Te(bt),{value:n}=Se(async()=>t?.getMetadata(),[t]);return n}function vt(){var t;const n=Ce();return(t=n?.rules)!=null?t:null}function Ct(){var t;const n=Ce();return(t=n?.permissions)!=null?t:null}function Dt(){const t=Ce();return t?[...new Set(t.permissions.filter(n=>at(n)).map(({resourceType:n})=>n))]:null}function Pr(){const t=Ce(),n=Dt();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 xr(t){return vn(Cn(t,"resourceType"),n=>Dn(n.map(({pluginId:r})=>r)))}function Ar(t,n){return{...t,rules:t.rules.filter(({resourceType:r,pluginId:l})=>{const a=n[r];return l===a[0]})}}function Nr(t){throw new Error("Invalid state")}function Tr(t){var n,r;return((r=(n=t?.body)==null?void 0:n.response)==null?void 0:r.statusCode)===404}function Pt(t){const n=new Blob([Rr(t)],{type:"text/yaml"});Hn(n,`${(t.name||"policy").toLocaleLowerCase().replace(/\W/g,"-")}.yaml`)}function Rr(t){const{name:n,roles:r,description:l}=t;return`# this is an autogenerated file, do not edit
2
+ ${zn(Gn({name:n,description:l,roles:r.map(({permissions:o,...i})=>({...ft(i,["id"]),permissions:o.map(m=>ft(m,["id"]))}))},o=>o!==null||o!==void 0))}`}const xt=Ne({policies:void 0,setPolicies:()=>{},setPolicy:()=>{},getPolicy:()=>{},removePolicy:()=>{}}),Ge=()=>Te(xt);function wr({children:t,initialState:n={policies:void 0,cache:{}}}){const[r,l]=I(n),a=S(u=>{l(c=>({...c,policies:u,cache:At(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:At(c.cache,[u])})),[]);return e.createElement(xt.Provider,{value:L(()=>({policies:r.policies,setPolicies:a,setPolicy:m,getPolicy:o,removePolicy:i}),[r.policies,a,m,o,i])},t)}function At(t,n){if(!n)return t;const r={...t};return n.forEach(l=>{r[l.id]=l}),r}const ce=()=>{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 Nt(){const t=B($),n=B(Z),{fetchPolicies:r}=ce();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 Tt(){const t=B($),n=B(Z),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 Sr=N(t=>({chip:{margin:0},icon:{color:t.palette.success.main}}));function Rt(t){const n=Sr();return t.status==="inactive"?null:t.status==="draft"?e.createElement(it,{className:n.chip,label:"Draft",size:t.size}):e.createElement(it,{className:n.chip,classes:{icon:n.icon},label:"Active",icon:e.createElement(Jn,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=Et(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=!Kn(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)},kr=(t=[],n=[])=>{const r=Et(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:h})=>h!=="UNCHANGED"),s=Object.values(m).some(({operation:h})=>h!=="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)},Ir=(t,n)=>{const r=t.name!==n.name,l=kr(t.roles||[],n.roles||[]);return{policy:{operation:r?"CHANGED":"UNCHANGED",before:t,after:n},roles:l}},wt=t=>{const n=B($),{value:r}=Se(()=>n.getActivePolicy(),[n]);return L(()=>r&&t?Ir(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 Br(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}},Or=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"}},Mr=N(t=>({root:({operation:n})=>({color:qe(t,n)})})),_=t=>e.createElement(C,{...t,variant:"body2"}),b=t=>{const n=Mr(t);return e.createElement(p,{...t,className:n.root,component:"span",fontWeight:"fontWeightBold"})},St=({policy:t})=>{var n,r,l;const a=wt(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(b,{operation:"CHANGED"},"changed")," from"," ",e.createElement(b,null,'"',(r=a.policy.before)==null?void 0:r.name,'"')," to"," ",e.createElement(b,null,'"',(l=a.policy.after)==null?void 0:l.name,'"')),Object.entries(a.roles).map(([c,{role:s,permissions:E,members:f}])=>{var h,y,d,g,P,R;return e.createElement(pe,{key:c},s.operation==="ADDED"&&e.createElement(_,null,"Role ",e.createElement(b,null,'"',(h=s.after)==null?void 0:h.name,'"')," has been"," ",e.createElement(b,{operation:"ADDED"},"added")),s.operation==="REMOVED"&&e.createElement(_,null,"Role ",e.createElement(b,null,'"',(y=s.before)==null?void 0:y.name,'"')," has been"," ",e.createElement(b,{operation:"REMOVED"},"removed")),m(s)&&e.createElement(_,null,"Role name changed from ",e.createElement(b,null,'"',(d=s.before)==null?void 0:d.name,'"')," ","to ",e.createElement(b,null,'"',(g=s.after)==null?void 0:g.name,'"')),s.indexAfter>s.indexBefore&&s.indexBefore!==-1&&e.createElement(_,null,"Role ",e.createElement(b,null,'"',(P=s.after)==null?void 0:P.name,'"')," has been"," ",e.createElement(b,{operation:"MOVED_DOWN"},"moved down")," in priority"),s.indexAfter<s.indexBefore&&s.indexAfter!==-1&&e.createElement(_,null,"Role ",e.createElement(b,null,'"',(R=s.after)==null?void 0:R.name,'"')," has been"," ",e.createElement(b,{operation:"MOVED_UP"},"moved up")," in priority"),u(s)&&e.createElement(e.Fragment,null,Object.entries(E).map(([k,A])=>{var F,O,T,D,M;const{before:w,after:W}=A,q=w&&Ke(w),G=W&&Ke(W);return e.createElement(pe,{key:k},A.operation==="ADDED"&&A.after&&e.createElement(_,null,"Permission decision"," ",e.createElement(b,null,'"',G,'"')," has been"," ",e.createElement(b,{operation:"ADDED"},"added")," to"," ",e.createElement(b,null,'"',(F=s.after)==null?void 0:F.name,'"')),A.operation==="REMOVED"&&A.before&&e.createElement(_,null,"Permission decision"," ",e.createElement(b,null,'"',q,'"')," has been"," ",e.createElement(b,{operation:"REMOVED"},"removed")," ","from ",e.createElement(b,null,'"',(O=s.after)==null?void 0:O.name,'"')),A.operation==="CHANGED"&&e.createElement(_,null,q!==G?e.createElement(e.Fragment,null,"Permission decision"," ",e.createElement(b,null,'"',q,'"')," has been"," ",e.createElement(b,{operation:"CHANGED"},"updated")," ","to ",e.createElement(b,null,'"',G,'"')):e.createElement(e.Fragment,null,"Permission decision"," ",e.createElement(b,null,'"',q,'"')," has been"," ",e.createElement(b,{operation:"CHANGED"},"updated"))," ","in ",e.createElement(b,null,'"',(T=s.after)==null?void 0:T.name,'"')),A.indexAfter>A.indexBefore&&A.indexBefore!==-1&&e.createElement(_,null,"Permission decision"," ",e.createElement(b,null,'"',G,'"')," has been"," ",e.createElement(b,{operation:"MOVED_DOWN"},"moved down")," ","in priority in"," ",e.createElement(b,null,'"',(D=s.after)==null?void 0:D.name,'"')),A.indexAfter<A.indexBefore&&A.indexAfter!==-1&&e.createElement(_,null,"Permission decision"," ",e.createElement(b,null,'"',G,'"')," has been"," ",e.createElement(b,{operation:"MOVED_UP"},"moved up")," ","in priority in"," ",e.createElement(b,null,'"',(M=s.after)==null?void 0:M.name,'"')))}),Object.entries(f).map(([k,A])=>{var F,O;return e.createElement(pe,{key:k},A.operation==="ADDED"&&A.after&&e.createElement(_,null,"Member ",e.createElement(b,null,'"',A.after,'"')," has been"," ",e.createElement(b,{operation:"ADDED"},"added")," to"," ",e.createElement(b,null,'"',(F=s.after)==null?void 0:F.name,'"')),A.operation==="REMOVED"&&A.before&&e.createElement(_,null,"Member ",e.createElement(b,null,'"',A.before,'"')," has been"," ",e.createElement(b,{operation:"REMOVED"},"removed")," from"," ",e.createElement(b,null,'"',(O=s.after)==null?void 0:O.name,'"')))})))}))},_r=N(()=>({root:{display:"inline-flex"}})),kt=({timestamp:t,description:n})=>{const r=_r(),l=be.fromISO(t).toLocaleString(be.DATETIME_FULL),a=nr(t),o=n?`${n}${a}`:a;return e.createElement("span",{className:r.root},e.createElement(ae,{title:l},e.createElement(C,{component:"span",display:"inline",variant:"inherit"},o)))};function It(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 Lr=N(t=>({card:n=>({backgroundImage:n.policy.status==="active"?"linear-gradient(256.15deg, #00782A 19.77%, #1DB954 100%)":"linear-gradient(256.15deg, #BDBDBD 19.77%, #EEEEEE 100%)",backgroundPosition:"top",backgroundSize:"100% 8px",backgroundRepeat:"no-repeat",paddingTop:"8px",height:"100%"}),diffSummaryContainer:{backgroundColor:t.palette.background.default,padding:t.spacing(2),borderWidth:"1px",borderStyle:"solid",borderColor:t.palette.divider,borderRadius:t.shape.borderRadius},header:{display:"flex",justifyContent:"space-between",alignItems:"center"},detailsHeader:{...t.typography.caption,paddingTop:t.spacing(3),color:t.palette.text.secondary},activityList:{color:t.palette.text.secondary},activityListItem:{padding:0},actions:{justifyContent:"flex-start"}}));function se(t){const n=Lr(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}=It(r,i,m);return e.createElement(J,{className:n.card},e.createElement(ye,null,e.createElement("div",{className:n.header},l?e.createElement(Q,{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(Rt,{status:"active",size:"small"}):null),r.description?e.createElement(C,{variant:"body1",color:"textSecondary"},'"',r.description,'"'):null,e.createElement(C,{component:"h4",className:n.detailsHeader},"Details"),e.createElement(Rn,{className:n.activityList},e.createElement(ct,{className:n.activityListItem},e.createElement(st,null,e.createElement(Un,null)),e.createElement(mt,{primary:e.createElement(kt,{timestamp:s,description:u})})),e.createElement(ct,{className:n.activityListItem},e.createElement(st,null,e.createElement(Yn,null)),e.createElement(mt,{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(St,{policy:r})))),t.actions?e.createElement(wn,{className:n.actions},t.actions):null)}const Fr=N(t=>({paper:{padding:t.spacing(2,2,0,2)}})),Bt=({isOpen:t,onClose:n,policy:r})=>{const l=Fr();return e.createElement(ee,{classes:{...l},open:t,onClose:n},e.createElement(ge,{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(j,{onClick:n,title:"Close dialog"},e.createElement($e,null))))),e.createElement(K,null,e.createElement(se,{policy:r})),e.createElement(Ie,null,e.createElement(p,{display:"flex",flexDirection:"row",flexGrow:1,justifyContent:"flex-start"},e.createElement(x,{component:fn,color:"primary",onClick:n,role:"link",to:"/rbac"},"View all versions"))))},$r=N(t=>({icon:{color:t.palette.warning.main,width:"2rem",height:"2rem"},label:{align:"center",display:"block",marginBottom:t.spacing(1),color:t.palette.text.secondary,fontSize:t.typography.caption.fontSize},policiesContainer:{display:"flex",gap:t.spacing(4),marginTop:t.spacing(4),marginBottom:t.spacing(4)},button:{marginTop:t.spacing(4)}})),jr=({localPolicy:t,onSelectLocalPolicy:n,onSelectServerPolicy:r,serverPolicy:l})=>{const a=$r();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(yt,{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(se,{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(se,{policy:l,withChangeSummary:!0}),e.createElement(x,{className:a.button,color:"primary",onClick:r,variant:"outlined"},"Keep recently saved draft")))))},Vr=({serverPolicy:t,localPolicy:n})=>!n||!t?{policy:t,policyConflict:!1}:t.status!=="draft"?{policy:t,policyConflict:!1}:n.id!==t.id?{policy:t,policyConflict:!1}:n.updatedAt===t.updatedAt?{policy:n,policyConflict:!1}:{policy:n,policyConflict:!0},Hr=()=>rr("@spotify/backstage-plugin-rbac:draftPolicy"),Wr=N(t=>({icon:{color:t.palette.warning.main,width:"2rem",height:"2rem"}})),zr=({onConfirm:t,policy:n})=>{const r=Wr(),l=()=>{Pt(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(yt,{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")))))},Ot=Ne({diff:null,hasChanges:!1,policy:void 0,createNewRole:()=>"",discardLocalDraft:()=>{},saveLocalDraftToServer:()=>Promise.reject(),refetchPolicy:()=>Promise.reject(),updateLocalDraft:()=>{}}),re=()=>Te(Ot);function De({children:t,policyId:n}){const r=U(),l=B(Z),a=B($),{getPolicy:o,setPolicy:i}=Ge(),m=we(),{NotFoundErrorPage:u}=m.getComponents(),c=o(n),[s,E,f]=Hr(),h=!s||ve.safeParse(s).success,y=h?s:void 0,{policy:d,policyConflict:g}=Vr({serverPolicy:c,localPolicy:y}),P=wt(d),[{loading:R,error:k},A]=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 A();i(w)},[A,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 q={name:`Role ${W}`,permissions:[],members:"*",id:W};return E({...d,roles:[...d.roles,q]}),W},[d,E]),M=()=>{f(),r("/rbac")};return z(()=>{c||O()},[O,c]),h?d?e.createElement(Ot.Provider,{value:{diff:P,hasChanges:!!y,policy:d,createNewRole:D,discardLocalDraft:f,saveLocalDraftToServer:T,refetchPolicy:O,updateLocalDraft:E}},g&&y&&c&&e.createElement(jr,{localPolicy:y,onSelectLocalPolicy:F,onSelectServerPolicy:f,serverPolicy:c}),t):R?e.createElement(fe,null):k?Tr(k)?e.createElement(u,null):e.createElement(lt,{error:k??new Error("Unknown")}):null:e.createElement(zr,{onConfirm:M,policy:s})}const Gr=N(t=>({closeButton:{color:t.palette.text.secondary},diffSummaryContainer:{backgroundColor:t.palette.background.default,marginBottom:t.spacing(2)}}));function Mt({open:t,onPublish:n,onClose:r}){const[l,a]=I(!1),{policy:o}=re(),i=Gr(),m=X(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(ge,null,e.createElement(p,{display:"flex",justifyContent:"space-between",alignItems:"center"},"Ready to publish?",e.createElement(x,{startIcon:e.createElement($e,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(St,{policy:o})),e.createElement(K,null,e.createElement(le,{variant:"outlined",fullWidth:!0,label:"Summary (optional)",placeholder:"Briefly describe this version (or changes from a previous version)",inputRef:m})),e.createElement(Ie,null,e.createElement(x,{color:"primary",onClick:u,disabled:l},l?e.createElement(ut,{size:20}):"Publish")))}const Ur=[{title:"Name",field:"name",render:t=>e.createElement(Q,{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 Nr(t.status)}}},{title:"Publish date",field:"lastPublishedAt",render:t=>t.lastPublishedAt?be.fromISO(t.lastPublishedAt).toLocaleString(be.DATETIME_MED_WITH_SECONDS):"",type:"datetime",defaultSort:"desc"},{title:"Published by",field:"lastPublishedBy"}];function Yr(t){const r=t.data.length>3,{fetchPolicies:l}=ce(),[{loading:a},o]=Nt(),[{loading:i,value:m},u]=Tt(),[c,s]=I(void 0),[E,f]=I(!1),h=()=>{s(void 0),l()},y=c?.id===m?.id?m:void 0,d=[g=>{const{tableData:P,...R}=g;return{icon:jn,tooltip:"Publish",onClick:()=>{s(R),f(!0)},disabled:i}},g=>{const{tableData:P,...R}=g;return{icon:Vn,tooltip:"Duplicate",disabled:a||!t.canDuplicate,onClick:()=>o(R)}}];return e.createElement(e.Fragment,null,e.createElement(Pn,{title:"Previous Versions",columns:Ur,data:t.data,options:{paging:r,pageSize:3,pageSizeOptions:[3,5,10,20],actionsColumnIndex:-1,loadingType:"linear"},actions:d}),c&&e.createElement(De,{policyId:c.id},e.createElement(Mt,{open:E,onPublish:g=>{u(c,g),f(!1)},onClose:()=>{s(void 0),f(!1)}})),y&&e.createElement(Bt,{isOpen:!0,policy:y,onClose:h}))}const Jr=N(t=>({breadcrumbs:{marginBottom:t.spacing(4)}}));function Kr({pages:t}){const n=gn(hn),r=Jr();return e.createElement(xn,{className:r.breadcrumbs},e.createElement(Q,{to:n()},"Home"),t.map(({title:l,path:a},o)=>a?e.createElement(Q,{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(Nn,{title:"Role Based Access Control"}),e.createElement(Tn,null,e.createElement(Sn,{maxWidth:"lg"},e.createElement(V,{container:!0,spacing:4},e.createElement(V,{item:!0,xs:12},r&&e.createElement(Kr,{pages:r}),n),t))))}const _t=t=>{const[n,r]=I(!1),{fetchPolicies:l}=ce(),[{loading:a,value:o},i]=Tt(),{policy:m,hasChanges:u}=re(),c=ve.safeParse(m).success,s=!u&&c,E=async h=>{await i(m,h),r(!1)},f=()=>{l()};return e.createElement(e.Fragment,null,e.createElement(x,{...t,onClick:()=>r(!0),disabled:!s||a},"Publish"),e.createElement(Mt,{open:n,onClose:()=>r(!1),onPublish:E}),o&&e.createElement(Bt,{isOpen:!0,onClose:f,policy:o}))};function qr(t){const n=B($),r=B(Z),{fetchPolicies:l}=ce();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 Xr(){const t=B($),n=U(),r=B(Z);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 h=null;try{h=Wn.load(f)}catch{r.post({message:"YAML file is invalid",severity:"error"});return}if(!ve.safeParse(h).success){r.post({message:"Imported policy is invalid",severity:"error"});return}if((await t.getPolicies()).items.some(k=>k.status==="draft")){r.post({message:"Unable to import new policy due to existing draft policy",severity:"error"});return}const P=h,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 Zr(){const{policies:t}=Ge(),{loading:n,error:r,fetchPolicies:l}=ce();ot(()=>{t||l()});let a;return n?a=e.createElement(V,{item:!0,xs:12},e.createElement(fe,null)):r?a=e.createElement(lt,{error:r}):!t||t.length===0?a=e.createElement(ea,null):a=e.createElement(ta,{policies:t}),e.createElement(Xe,{pages:void 0,header:e.createElement(ke,{title:"RBAC Policies"},e.createElement(Xr,null))},a)}const Qr=N(t=>({cardContent:{padding:t.spacing(6,3),"& > *":{background:"transparent"}}}));function ea(){const t=Qr(),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(ye,{className:t.cardContent},e.createElement(Ee,{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 ta({policies:t}){const n=t.find(c=>c.status==="draft"),r=t.find(c=>c.status==="active"),[l,a]=Nt(),[o,i]=qr(n),m=U(),u=na(t);return e.createElement(V,{container:!0,spacing:4},r?e.createElement(V,{item:!0,xs:12,md:6},e.createElement(se,{policy:r,to:`./versions/${r.id}`,actions:e.createElement(x,{color:"primary",disabled:l.loading||!!n,onClick:()=>a(r)},"Duplicate")})):null,n?e.createElement(V,{item:!0,xs:12,md:6},e.createElement(se,{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(De,{policyId:n.id},e.createElement(_t,{color:"primary"})))})):null,e.createElement(V,{item:!0,xs:12},e.createElement(Yr,{data:u,canDuplicate:!n})))}function na(t){return t.filter(({status:n})=>n==="inactive")}const ra=N(t=>({titleWrapper:{display:"flex",alignItems:"center",gap:t.spacing(2)}}));function Lt({children:t}){const n=ra();return e.createElement(C,{noWrap:!0,variant:"h4",component:"h2",color:"textSecondary",className:n.titleWrapper},t)}const aa=N({autocomplete:{display:"flex",flex:1}});function la({members:t,disabled:n=!1,onToggleMember:r}){var l;const a=B($),[o,i]=I(!1),m=aa(),[u,c]=dn(d=>d+1,0),[{value:s,loading:E},f]=Y((d="")=>a.searchMembers({query:d}),[a]),h=L(()=>kn(d=>{const g=d.target.value;f(g)},1e3),[f]),y=(d,g)=>{g&&(r(g),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:Ft,groupBy:oa,renderOption:d=>e.createElement(e.Fragment,null,e.createElement(Be,{id:`checkbox-${d.entityRef}`,checked:t.includes(d.entityRef),color:"primary"}),e.createElement("label",{htmlFor:`checkbox-${d.entityRef}`},Ft(d))),options:(l=s?.members)!=null?l:[],openOnFocus:!0,disabled:n,loading:E,className:m.autocomplete,renderInput:d=>e.createElement(le,{...d,label:"Select specific users/groups",variant:"standard",onChange:h,InputProps:{...d.InputProps,endAdornment:e.createElement(e.Fragment,null,E?e.createElement(ut,{color:"inherit",size:20}):null,d.InputProps.endAdornment)}})}))}function Ft(t){var n;const r=We(t.entityRef);return or({...r,name:(n=t.name)!=null?n:r.name},{defaultKind:r.kind,defaultNamespace:lr})}const $t={user:"USERS",group:"GROUPS"};function oa(t){const{kind:n}=We(t.entityRef);if(!$t[n])throw new Error(`Kind '${n}' is not supported for members in a policy`);return $t[n]}const ia=N(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"})})),me=({operation:t,size:n="small"})=>{const r=ia({operation:t}),l=Or(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=N({header:{display:"flex",flexDirection:"row",justifyContent:"space-between",paddingLeft:"1rem",paddingRight:"1rem",gap:"1rem"},actionCol:{width:48}});function ca({diff:t,policyId:n,role:r,onToggleMember:l,readonly:a=!1}){const o=B($),i=jt(),m=r.members==="*",{current:u}=X({}),c=h=>{u[h.entityRef]=h,l(h.entityRef)},{loading:s,error:E}=Se(async()=>{if(r.members==="*"||r.members.length===0||(await o.getPolicy(n)).roles.find(d=>d.id===r.id)===void 0)return;(await o.getRoleMembers({policyId:n,roleId:r.id})).forEach(d=>u[d.entityRef]=d)},[n,m]),f=h=>{var y;if(u[h])return u[h];const d=We(h);return{entityRef:h,type:d.kind.toLowerCase(),name:(y=d.name)!=null?y:h}};return e.createElement(e.Fragment,null,e.createElement("div",{className:i.header},e.createElement("h2",null,"Members"),e.createElement(la,{onToggleMember:c,members:r.members,disabled:a})),e.createElement(Oe,null,e.createElement(Me,null,e.createElement(H,null,e.createElement(v,null,"Name"),e.createElement(v,null,"Type"),e.createElement(v,null),!a&&e.createElement(v,{className:i.actionCol}))),e.createElement(_e,null,e.createElement(sa,{diff:t,loading:s,error:E,members:Array.isArray(r.members)?r.members.map(f):r.members,onToggleMember:c,readonly:a}))))}function sa({diff:t,loading:n,members:r,error:l,onToggleMember:a,readonly:o=!1}){var i;const m=jt();return n?e.createElement(H,null,e.createElement(v,{scope:"row",colSpan:4},e.createElement(fe,null))):(l&&(H,v,(i=l.message)!=null),r==="*"?e.createElement(H,null,e.createElement(v,null,"All"),e.createElement(v,{height:80},"any"),e.createElement(v,{colSpan:2},e.createElement(me,{operation:t?.members["*"].operation}))):r.length===0?e.createElement(H,null,e.createElement(v,{scope:"row",colSpan:4},"Select users or groups using the drop-down menu above.")):e.createElement(e.Fragment,null,r.map(u=>{const{name:c,type:s,entityRef:E}=u;return e.createElement(H,{key:E},e.createElement(v,{scope:"row"},c??"Unknown"),e.createElement(v,{scope:"row"},s),e.createElement(v,null,c&&e.createElement(me,{operation:t?.members[E].operation})),!o&&e.createElement(v,{scope:"row",className:m.actionCol},e.createElement(j,{"aria-label":"delete",onClick:()=>a(u),size:"small"},e.createElement(ie,null))))})))}function Vt(t){return`${t.palette.primary.main}50`}const ma=N(t=>({toggleButton:{"&.Mui-selected":{backgroundColor:Vt(t),color:t.palette.primary.main},"&.Mui-selected:hover":{backgroundColor:"#97BBE8"},color:t.palette.primary.main,border:`1px solid ${t.palette.primary.main}`}}));function Ze({className:t,...n}){const r=ma();return e.createElement(ir,{className:`${r.toggleButton} ${t}`,...n})}const ua=N({fullWidth:{width:"100%","& > *":{flexGrow:1}}});function da({className:t,fullWidth:n,...r}){const l=ua();return e.createElement(cr,{className:`${n?l.fullWidth:""} ${t}`,...r})}const pa=N(t=>({container:{display:"flex",position:"relative",alignItems:"center",gap:t.spacing(1),flexShrink:1,maxWidth:"100%",minWidth:0},input:({invalid:n})=>({boxSizing:"content-box",display:"block",maxWidth:"100%",padding:0,borderWidth:2,borderStyle:"solid",borderColor:n?t.palette.error.main:"transparent",borderRadius:t.shape.borderRadius,backgroundColor:"transparent",color:t.palette.textContrast,fontFamily:"inherit",fontSize:"inherit",lineHeight:"inherit",fontWeight:"inherit",textOverflow:"ellipsis"}),hiddenSpan:{position:"absolute",top:0,left:0,borderWidth:1,whiteSpace:"pre",opacity:0,pointerEvents:"none"}}));function Ht({invalid:t,name:n,value:r,onTextChange:l}){const a=pa({invalid:t}),[o,i]=I(!1),[m,u]=I(null),c=X(null),[s,E]=I(r);z(()=>{E(r)},[r]),pn(()=>{c.current&&m&&c.current.style.setProperty("width",`max(${m.getBoundingClientRect().width}px, 3ch)`)},[m,s]);const f=()=>{i(!1),E(r)},h=()=>{i(!1),l?.(s)},y=()=>{var g;o?h():(i(!0),(g=c.current)==null||g.focus())},d=g=>{var P;g.key==="Enter"&&((P=c.current)==null||P.blur()),g.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:g=>E(g.target.value),onFocus:y,onBlur:h,onKeyDown:d,value:s}),e.createElement("span",{"aria-hidden":"true",className:a.hiddenSpan,ref:u},s),e.createElement(j,{onClick:y,size:"small"},o?e.createElement(ur,{"aria-label":"Save title"}):e.createElement(mr,{"aria-label":"Edit title"}))))}const fa=["condition","anyOf","allOf","not"],Wt={condition:"Condition",anyOf:"Any of",allOf:"All of",not:"Not"};function Qe(t){return t===null?!1:t.hasOwnProperty("id")&&t.hasOwnProperty("ruleName")&&t.hasOwnProperty("parameters")}function ue(t){return t.hasOwnProperty("levelType")}function Ea(t){return t==="anyOf"||t==="allOf"||t==="not"}const ya=N(t=>({descriptiveText:{fontWeight:500,marginBottom:t.spacing(1)}})),Pe=({children:t})=>{const n=ya();return e.createElement(C,{variant:"body2",className:n.descriptiveText},t)},zt=({children:t})=>e.createElement(p,{pl:3},t),ga="#4CAF50";function ha({permissionCriteria:t}){return e.createElement("div",null,e.createElement(Pe,null,"If the below conditions are met"),e.createElement(zt,null,Qe(t)&&e.createElement(Yt,{condition:t}),ue(t)&&e.createElement(Gt,{level:t})),e.createElement(Pe,null,"Then the action is"," ",e.createElement(p,{component:"span",color:ga},"allowed")))}function Gt({level:t}){return e.createElement(e.Fragment,null,e.createElement(Pe,null,Wt[t.levelType]),e.createElement(zt,null,t.children.map((n,r)=>ue(n)?e.createElement(Gt,{key:r,level:n}):e.createElement(Yt,{key:r,condition:n}))))}const Ut="#FF737F",ba="#E22134";function Yt({condition:t}){return e.createElement(Pe,null,e.createElement(p,{component:"span",color:Ut},t.ruleName,"("),e.createElement(p,{component:"span",color:ba},JSON.stringify(t.parameters)),e.createElement(p,{component:"span",color:Ut},")"))}const va=N(t=>({editor:{"--jse-main-border":`1px solid ${t.palette.divider}`,"--jse-panel-border":`1px solid ${t.palette.divider}`,"--jse-message-error-background":t.palette.error.main,"--jse-message-warning-background":t.palette.warning.main,"--jse-background-color":t.palette.background.default,"--jse-panel-background":t.palette.background.default,"--jse-delimiter-color":t.palette.type==="light"?"rgba(0, 0, 0, 0.38)":"rgba(255, 255, 255, 0.38)","--jse-error-color":t.palette.text.primary,"--jse-key-color":t.palette.text.primary,"--jse-value-color":t.palette.text.primary,"--jse-text-color":t.palette.text.primary,"--jse-panel-color-readonly":t.palette.text.hint,"--jse-value-color-string":t.palette.status.ok,"--jse-value-color-null":t.palette.status.warning,"--jse-value-color-number":t.palette.status.error,"--jse-value-color-boolean":t.palette.status.running,"--jse-font-family":"inherit"}})),Ca=t=>"parseError"in t,Da=t=>{var n;return Ca(t)?!!t.parseError:((n=t?.validationErrors)==null?void 0:n.length)>0};function Pa({onChange:t,schema:n,value:r}){const l=X(null),a=X(),o=va();return z(()=>(l.current&&!a.current&&(a.current=new dr({target:l.current,props:{onChange:(i,m,{contentErrors:u})=>{!Da(u)&&pr(i)&&t(JSON.parse(i.text))},validator:fr({schema:n}),content:{json:{}},mainMenuBar:!1,mode:Er.text}})),()=>{var i;(i=a.current)==null||i.destroy(),a.current=void 0}),[t,n]),ot(()=>{var i;(i=a.current)==null||i.updateProps({content:{json:r}})}),e.createElement("div",{ref:l,className:o.editor,style:{height:300}})}const xa=[];function Aa(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:xa,c=u.includes(oe),s=(g,P)=>{if(!Array.isArray(P)){const R=[...u];R[g]=P||"",n(R)}},E=S(()=>{n([...u,""])},[n,u]),f=g=>{n(u.filter((P,R)=>R!==g))},h=()=>{n(c?[]:[oe])},y=()=>{c&&m(!0)},d=()=>{m(!1)};return z(()=>{u.length?c&&u.length>1&&n([oe]):E()},[E,n,u,c]),!o||!("type"in o)?null:e.createElement(e.Fragment,null,(u??[]).map((g,P,{length:R})=>e.createElement(Kt,{allowEmptyStrings:!0,key:P,onChange:k=>s(P,k),name:P===0?l:"",schema:{description:P===R-1?a:"",type:o.type},value:g,controls:e.createElement(j,{size:"small",onClick:()=>f(P)},e.createElement(yr,null))})),!!u?.length&&e.createElement(p,{alignItems:"center",display:"flex",flexDirection:"row",justifyContent:"space-between"},e.createElement(p,null,e.createElement(dt,{control:e.createElement(Be,{checked:c,onChange:h,name:"checkedB",color:"primary"}),label:"Use the claims from the logged in users token"})),e.createElement(p,null,e.createElement(ae,{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:E},e.createElement(He,null)))))))}function Na(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(dt,{control:e.createElement(Be,{checked:a===!0,onChange:i,name:l,color:"primary"}),label:l}),o&&e.createElement(C,{display:"block",variant:"caption",color:"textSecondary"},o))}function Ta({allowEmptyStrings:t,controls:n,name:r,onChange:l,schema:a,value:o}){const i=m=>{l(wa({value:m.currentTarget.value,type:a.type}))};return e.createElement(p,{mb:1},e.createElement(p,{display:"flex",gridGap:6},e.createElement(le,{fullWidth:!0,id:r,label:r,placeholder:"Enter",variant:"outlined",size:"small",value:Ra(o,t),onChange:et(o,t)?void 0:i,disabled:et(o,t)}),n&&e.createElement(p,{alignSelf:"center"},n)),a.description&&e.createElement(C,{variant:"caption",color:"textSecondary"},a.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===oe}function Ra(t,n=!1){return!n&&t===""?"[empty string]":t===null?"[null]":t===oe?"[BackstageUserClaims]":t||""}function wa({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 Jt(t){return!!t&&"type"in t&&(t.type==="array"||t.type==="boolean"||t.type==="null"||t.type==="number"||t.type==="integer"||t.type==="string")}function Sa(t){return"type"in t&&t.type==="array"}function ka(t){return"type"in t&&t.type==="boolean"}function Kt({schema:t,...n}){return Jt(t)?Sa(t)?e.createElement(Aa,{...n,schema:t}):ka(t)?e.createElement(Na,{...n,schema:t}):e.createElement(Ta,{...n,schema:t}):null}const Ia=new ht({allErrors:!0});function Ba({onChange:t,schema:n,value:r}){var l;const a=L(()=>Ia.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(Kt,{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(pt,{error:!o},(l=a.errors)==null?void 0:l[0].message))}const Oa=t=>!!t&&"properties"in t;function Ma({onChange:t,rule:n,value:r}){const[l,a]=I(!1),{paramsSchema:o}=n??{},i=()=>a(s=>!s);if(!Oa(o))return null;const m=!_a(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(Pa,{onChange:t,schema:o,value:r}):e.createElement(e.Fragment,null,e.createElement(p,{marginBottom:2},e.createElement(he,null,"Parameters")),e.createElement(Ba,{onChange:t,schema:o,value:r}))),e.createElement(p,{display:"flex",flexDirection:"column",alignItems:"flex-end",marginTop:1},m?e.createElement(ae,{title:"Only JSON editing is supported for this parameter",arrow:!0},e.createElement("span",null,c)):c))}function _a(t){return Object.values(t.properties).every(Jt)}const de=N(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 La({permissionCriteria:t,resourceType:n,onUpdate:r,readonly:l=!1}){const a=de(),o=S(s=>{r(E=>({...E,...s}))},[r]),i=S(s=>{const E=ne();o(s==="condition"?xe():s==="not"?{id:E,levelType:s,children:[]}:{id:E,levelType:s,children:[xe()]})},[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(ha,{permissionCriteria:t}):t===null?c=e.createElement(qt,{onSelect:i}):Qe(t)?c=e.createElement(Xt,{ruleName:t.ruleName,parameters:t.parameters,resourceType:n,onChange:m,onDelete:u}):ue(t)&&(c=e.createElement(Zt,{level:t,resourceType:n,onChange:r,isRoot:!0})),e.createElement(In,{variant:"outlined",className:a.paper},c)}function xe(){return{id:ne(),ruleName:null,parameters:{}}}function qt({onSelect:t}){const n=de(),r=X(null),[l,a]=I(!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(On,{anchorEl:r.current,open:l,onClose:o,BackdropProps:{}},fa.map(i=>e.createElement(te,{key:i,onClick:()=>{t?.(i),a(!1)}},Wt[i]))))}function Xt({ruleName:t,parameters:n,resourceType:r,onChange:l,onDelete:a}){var o;const i=de(),m=vt(),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(ye,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,h)=>f.name===h.name,options:u,onChange:(f,h)=>s(h?h.name:null),renderInput:f=>e.createElement(e.Fragment,null,e.createElement(p,{marginBottom:2},e.createElement(he,null,"Rule")),e.createElement(le,{...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(Bn,{...f,style:{width:"auto"},placement:"bottom-start"})})),e.createElement(p,{flex:"1"},e.createElement(p,{display:"flex",flexDirection:"column"},e.createElement(Ma,{rule:c,onChange:E,value:n})))))),e.createElement(p,{ml:1},e.createElement(j,{"aria-label":"delete",onClick:a,size:"small"},e.createElement(ie,null))))}function Zt({level:t,resourceType:n,onChange:r,parentConditionType:l,isRoot:a=!1}){const o=de(),i=S((y,d)=>{const g=[...t.children];return g.splice(y,1,d),g},[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?Qt(t.children,d):i(d,y))},[t,m,i]),s=y=>{const d=ne();y==="condition"?m([...t.children,xe()]):y==="not"?m([...t.children,{id:d,levelType:y,children:[]}]):Ea(y)&&m([...t.children,{id:d,levelType:y,children:[xe()]}])},E=y=>{m(Qt(t.children,y))},f=L(()=>t.children.map((y,d)=>(g,P)=>{m(i(d,{...y,ruleName:g,parameters:P}))}),[t.children,m,i]),h=L(()=>t.children.map((y,d)=>g=>c(g,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(Fa,{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)=>ue(y)?e.createElement(p,{key:y.id},e.createElement(Zt,{level:y,resourceType:n,parentConditionType:t.levelType,onChange:h[d]})):e.createElement(pe,{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(Xt,{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(qt,{onSelect:s}))))))}function Qt(t,n){const r=[...t];return r.splice(n,1),r}function Fa({level:t,onSelect:n}){const r=de(),l=t.children.length>1;return e.createElement(p,{display:"flex",alignItems:"center"},e.createElement(Le,{className:r.conditionTypeFormControl},e.createElement(Fe,{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(j,{"aria-label":"delete",onClick:()=>n?.(null),size:"small"},e.createElement(ie,null))))}const $a=N(t=>({indicator:{right:"unset"},tab:{maxWidth:"none","&.Mui-selected":{backgroundColor:Vt(t),color:t.palette.primary.main}}}));function ja({options:t,selected:n,onChange:r,readonly:l=!1}){const a=$a();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:a.indicator}},t.map(o=>e.createElement(_n,{key:o.id,label:o.displayText.toUpperCase(),className:a.tab,disabled:l})))}function Va(t){return t?{id:t.id,match:Ha(t),decisionType:Wa(t),criteria:je(t.decision)?Ae(t.decision.conditions):null}:{id:ne(),match:{method:"specificPermission"},decisionType:"allow",criteria:null}}function Ha(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 Wa(t){return typeof t.decision=="string"?t.decision:"conditional"}function Ae(t){const n=ne();return qn(t)?{id:n,levelType:"allOf",children:t.allOf.map(r=>Ae(r))}:Xn(t)?{id:n,levelType:"anyOf",children:t.anyOf.map(r=>Ae(r))}:Zn(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(ue(t))return t.children.length>0&&t.children.every(l=>en(l,n));if(!t.ruleName)return!1;const r=n?.find(({name:l})=>l===t.ruleName);return r?r.paramsSchema?new ht({allErrors:!0}).compile(r.paramsSchema)(t.parameters):!0:!1}function za(t,n,r){return{id:t,match:tn(n,r),decision:r}}function tn({method:t,...n},r){return t==="all"?"*":r&&je(r)?{resourceType:r.resourceType,...n}:n}function tt(t){return Qe(t)?{rule:t.ruleName,params:t.parameters}:t.levelType==="not"?{not:tt(t.children[0])}:{[t.levelType]:t.children.map(n=>tt(n))}}const nt=N(t=>({dialogTitle:{display:"flex",alignItems:"center",justifyContent:"space-between"},fullWidth:{width:"100%","& > *":{flexGrow:1}},infoIcon:{position:"absolute",right:t.spacing(3)},content:{padding:t.spacing(7)},saveButton:{paddingLeft:t.spacing(5),paddingRight:t.spacing(5)},contentContainerConditional:{display:"flex",gap:t.spacing(5),maxWidth:1480}})),Ga={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 Ua({rolePermission:t,readonly:n=!1,onClose:r,onSave:l}){const a=nt(),o=Ct(),i=vt(),m=Pr(),u=Va(t),[c,s]=I(u.match),[E,f]=I(u.decisionType),[h,y]=I(u.criteria),d=L(()=>Ya(o,c),[o,c]),g=E==="conditional",P=g?"xl":"sm";z(()=>{g&&o&&!d.commonResourceType&&f("allow")},[g,o,d.commonResourceType,f]);const R=T=>{T!==null&&f(T)},k=L(()=>c.method==="specificPermission"&&!c.name||c.method==="filter"&&!c.resourceType&&!c.actions,[c]),A=L(()=>d.permissions.length===0?!1:!k,[d,k]),F=L(()=>E!=="conditional"?!0:!(!d.commonResourceType||!m?.[d.commonResourceType].pluginId||!en(h,i)),[E,d,m,h,i]),O=()=>{l?.(za(u.id,c,E==="conditional"?{resourceType:d.commonResourceType,pluginId:m[d.commonResourceType].pluginId,conditions:tt(h)}:E))};return e.createElement(ee,{open:!0,maxWidth:P,onClose:r,fullWidth:!0},e.createElement(ge,{disableTypography:!0,className:a.dialogTitle},e.createElement(C,{variant:"h4",component:"h2"},"New Permission Decision"),e.createElement(x,{startIcon:e.createElement($e,null),onClick:r},"Close")),e.createElement(K,{dividers:!0,className:a.content},e.createElement(p,{className:g?a.contentContainerConditional:void 0},e.createElement(p,{mb:5,flex:1},e.createElement(ja,{options:Object.entries(Ga).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(Ja,{name:c.name,readonly:n,onNameChange:T=>s({...c,name:T})}),c.method==="filter"&&e.createElement(e.Fragment,null,e.createElement(Ka,{resourceType:c.resourceType,readonly:n,onResourceTypeChange:T=>s({...c,resourceType:T})}),e.createElement(Xa,{actions:c.actions,readonly:n,onActionsChange:T=>s({...c,actions:T.length?T:void 0})}),k?null:e.createElement(e.Fragment,null,e.createElement(p,{marginY:2},e.createElement(Ln,{variant:"middle"})),e.createElement(pt,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(da,{value:E,exclusive:!0,fullWidth:!0,"aria-label":"Decision result",onChange:(T,D)=>R(D)},e.createElement(Ze,{value:"allow","aria-label":"Decision allowed",disabled:n},"Allow"),e.createElement(Ze,{value:"deny","aria-label":"Decision denied",disabled:n},"Deny"),e.createElement(Ze,{value:"conditional","aria-label":"Decision conditionally allowed",disabled:!d.commonResourceType||n},"Conditional")),!g&&!n&&e.createElement(ae,{title:nn},e.createElement(gt,{className:a.infoIcon,color:"primary","aria-label":nn}))))),E==="conditional"&&!!d.commonResourceType&&e.createElement(La,{permissionCriteria:h,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:!A||!F},"Save"))))}function Ya(t,n){const r=(t??[]).filter(o=>Qn(o,tn(n))),l=sr(r,"resourceType"),a=l.length===1&&at(l[0])?l[0].resourceType:void 0;return{permissions:r,commonResourceType:a}}const rn="Permission name";function Ja({name:t="",readonly:n,onNameChange:r}){const l=nt(),a=Ct();return e.createElement(Le,{className:l.fullWidth,variant:"outlined",disabled:n},e.createElement(he,{id:"match-by-name-dropdown"},rn),e.createElement(Fe,{labelId:"match-by-name-dropdown",label:rn,value:a?t:"",onChange:o=>r?.(o.target.value)},a?.map(o=>e.createElement(te,{key:o.name,value:o.name},o.name))))}const an="Resource type";function Ka({resourceType:t="",readonly:n,onResourceTypeChange:r}){const l=nt(),a=Dt();return e.createElement(Le,{className:l.fullWidth,variant:"outlined",disabled:n},e.createElement(he,{id:"match-by-resource-dropdown"},an),e.createElement(Fe,{labelId:"match-by-resource-dropdown",label:an,value:a?t:"",onChange:o=>r?.(o.target.value),displayEmpty:!0},a?.map(o=>e.createElement(te,{key:o,value:o},o))))}const qa="Action";function Xa({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(le,{...a,variant:"outlined",label:qa,placeholder:"Choose attributes",margin:"normal"}),disabled:n})}const ln=({children:t,onConfirm:n,message:r,title:l})=>{const[a,o]=I(!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(ge,null,e.createElement(p,{display:"flex",justifyContent:"space-between",alignItems:"center"},l)),e.createElement(K,null,e.createElement(Fn,null,r)),e.createElement(Ie,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"))))},on=({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(ae,{title:t},e.createElement(gt,{color:"primary","aria-label":t}))),cn=(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},sn=({array:t,index:n,onReorder:r})=>{const l=n===0,a=n===t.length-1;return e.createElement(p,{display:"flex"},e.createElement(j,{disabled:l,onClick:()=>r(cn(t,n,-1)),"aria-label":"Move up",size:"small"},e.createElement(hr,null)),e.createElement(j,{disabled:a,onClick:()=>r(cn(t,n,1)),"aria-label":"Move down",size:"small"},e.createElement(gr,null)))},mn=t=>{if(t.success)return{};const n={};for(const r of t.error.issues)n[r.path.join(".")]=!0;return n},Za=N(()=>({emptyStateImage:{width:"95%",zIndex:2,position:"relative",left:"50%",top:"50%",transform:"translate(-50%, 15%)"}}));function un({src:t,alt:n}){const r=Za();return e.createElement("img",{src:t,className:`${r.emptyStateImage} `,alt:n})}const Qa="Use the arrows to change the order in which permission decisions are evaluated.";function el(){const{roleId:t,versionId:n}=rt();return Ve(t),Ve(n),e.createElement(De,{policyId:n},e.createElement(tl,{roleId:t}))}function tl({roleId:t}){const{diff:n,updateLocalDraft:r,policy:l}=re(),a=l.roles.find(D=>D.id===t),o=n?.roles[t],[i,m]=I(null),[u,c]=I(!1),s=we(),{NotFoundErrorPage:E}=s.getComponents(),f=U(),y=N(D=>({cardContainer:{margin:D.spacing(0)}}))();if(!a)return e.createElement(E,null);const d=a.name,g=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=>{g({...a,name:D})},R=D=>{if(i===null)g({...a,permissions:[D,...a.permissions]});else{const M=[...a.permissions];M.splice(i,1,D),g({...a,permissions:M})}c(!1)},k=D=>{if(D==="*")g({...a,members:a.members==="*"?[]:"*"});else if(a.members==="*")g({...a,members:[D]});else{const M=a.members.includes(D)?a.members.filter(w=>w!==D):[...a.members,D];g({...a,members:M.length===0?"*":M})}},A=D=>{g({...a,permissions:a.permissions.filter((M,w)=>D!==w)})},F=D=>{g({...a,permissions:D})},O=mn(er.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(Lt,null,l.name," \xA0\u01C0",T?e.createElement(e.Fragment,null,"\xA0",d):e.createElement(Ht,{invalid:O,value:d,onTextChange:P}),e.createElement(me,{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(V,{container:!0,className:y.cardContainer,spacing:4,direction:"row"},e.createElement(V,{item:!0,xs:6},e.createElement(J,null,e.createElement(ca,{diff:o||null,role:a,policyId:l.id,onToggleMember:k,readonly:T}))),e.createElement(V,{item:!0,xs:6},e.createElement(J,null,e.createElement(nl,{diff:o||null,permissions:a.permissions,onNewPermissionClick:()=>{m(null),c(!0)},onOpenPermission:D=>{m(D),c(!0)},onReorderPermissions:F,onRemovePermissionClick:A,readonly:T}))))),u&&e.createElement(Ua,{rolePermission:i!==null?a.permissions[i]:void 0,onClose:()=>c(!1),onSave:R,readonly:T}))}function nl({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(He,null),onClick:l},"New")),e.createElement(Oe,null,e.createElement(Me,null,e.createElement(H,null,!i&&e.createElement(v,{style:{width:0}},e.createElement(on,{helpText:Qa})),e.createElement(v,null,"Match by"),e.createElement(v,null,"Decision"),e.createElement(v,null),!i&&e.createElement(v,null))),e.createElement(_e,null,n.length===0&&e.createElement(H,null,e.createElement(v,{colSpan:5},e.createElement(Ee,{title:"No permission decisions set",description:"Click the button below to create your first permission.",missing:{customImage:e.createElement(un,{src:br,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(v,null,e.createElement(sn,{array:n,index:u,onReorder:r})),e.createElement(v,null,e.createElement(Q,{to:"#",component:"button",onClick:()=>a(u)},Ke(m))),e.createElement(v,null,Br(m)),e.createElement(v,null,e.createElement(me,{operation:t?.permissions[m.id].operation})),!i&&e.createElement(v,{align:"right"},e.createElement(ln,{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(ie,null)))))))))}const rl="Use the arrows to change the order in which roles are evaluated.";function al({}){const{diff:t,policy:n,createNewRole:r,updateLocalDraft:l}=re(),a=U(),o=ll(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:"h5"},"Roles"),!i&&e.createElement(x,{color:"primary",variant:"outlined",startIcon:e.createElement(He,null),onClick:()=>c()},"New role")),e.createElement(Oe,null,e.createElement(Me,null,e.createElement(H,null,!i&&e.createElement(v,{style:{width:0}},e.createElement(on,{helpText:rl})),e.createElement(v,null,"Name"),e.createElement(v,null,"Users"),e.createElement(v,null,"Groups"),!i&&e.createElement(v,{style:{width:0}}))),e.createElement(_e,null,o.map((s,E)=>e.createElement(H,{key:E},!i&&e.createElement(v,null,e.createElement(sn,{array:n.roles,index:E,onReorder:m})),e.createElement(v,null,e.createElement(p,{alignItems:"center",display:"flex",gridGap:8},e.createElement(Q,{to:`roles/${s.id}`},s.name),e.createElement(me,{operation:t?.roles[s.id].role.operation}))),e.createElement(v,null,s.userCount),e.createElement(v,null,s.groupCount),!i&&e.createElement(v,{align:"right"},e.createElement(ln,{message:"Are you sure you want to remove this role?",title:"Remove role?",onConfirm:()=>u(s.id)},f=>e.createElement(j,{...f,"aria-label":"Remove role",size:"small"},e.createElement(ie,null)))))))))}function ll(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 ol(){const{versionId:t}=rt();return Ve(t),e.createElement(De,{policyId:t},e.createElement(il,null))}function il(){const{policy:t,hasChanges:n,discardLocalDraft:r,saveLocalDraftToServer:l,updateLocalDraft:a}=re(),o=s=>{a({...t,name:s})},i=mn(tr.safeParse(t)).name,m=t.status!=="draft",u=ve.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(Lt,null,m?t.name:e.createElement(Ht,{invalid:i,name:"Policy name",value:t.name,onTextChange:o}),e.createElement(Rt,{status:t.status})),ml(t))},e.createElement(p,{display:"flex",gridGap:8},e.createElement(x,{variant:"outlined",color:"primary",onClick:()=>Pt(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(_t,{color:"primary",variant:"contained"})))},e.createElement(V,{item:!0,xs:12},t.roles.length>0?e.createElement(al,null):e.createElement(sl,{readonly:m})))}const cl=N(t=>({cardHeader:{padding:t.spacing(3,3),borderBottom:`1px solid ${t.palette.border}`},cardContent:{padding:t.spacing(6,3),"& > *":{background:"transparent"}},emptyStateImage:{width:"95%",zIndex:2,position:"relative",left:"50%",top:"50%",transform:"translate(-50%, 15%)"}}));function sl({readonly:t}){const n=cl(),r=U(),{createNewRole:l}=re(),a=()=>{const o=l();r(`./roles/${o}`)};return e.createElement(J,null,e.createElement($n,{title:"Roles",className:n.cardHeader}),e.createElement(ye,{className:n.cardContent},t?e.createElement(Ee,{title:"No roles configured",missing:"content"}):e.createElement(Ee,{title:"No roles yet",description:"Click the button below to create your first role.",missing:{customImage:e.createElement(un,{src:vr,alt:"No roles placeholder"})},action:e.createElement(x,{variant:"contained",color:"primary",onClick:()=>a()},"New role")})))}function ml(t){const n={created:"Created by ",published:"Last published by ",updated:"Last updated by "},{activityDateText:r,activityUser:l,timestamp:a}=It(t,n);return e.createElement(C,{variant:"body2"},e.createElement(C,{component:"span",display:"inline",variant:"body2"},`${r} ${l} `),e.createElement(kt,{timestamp:a}))}function ul(){const t=we(),{NotFoundErrorPage:n}=t.getComponents();return e.createElement(Cr,{loading:e.createElement(fe,null),unauthorized:e.createElement(n,null)},e.createElement(wr,null,e.createElement(Dr,null,e.createElement(En,null,e.createElement(Re,{element:e.createElement(Zr,null),path:"/"}),e.createElement(Re,{element:e.createElement(ol,null),path:"/versions/:versionId"}),e.createElement(Re,{element:e.createElement(el,null),path:"/versions/:versionId/roles/:roleId"})))))}export{ul as RBACRoot};
3
+ //# sourceMappingURL=Root-0589309b.esm.js.map
@@ -1,2 +1,2 @@
1
- import{createApiRef as y,createRouteRef as A,createPlugin as m,createApiFactory as u,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,s=await e(`${await this.discoveryApi.getBaseUrl("rbac")}/policies`);return this.parseResponse(s)}async getPolicy(e){const{fetch:s}=this.fetchApi,t=await s(`${await this.discoveryApi.getBaseUrl("rbac")}/policies/${e}`);return this.parseResponse(t)}async getActivePolicy(){const{fetch:e}=this.fetchApi,s=await e(`${await this.discoveryApi.getBaseUrl("rbac")}/policies/active`);return this.parseResponse(s)}async searchMembers(e){const{fetch:s}=this.fetchApi,t=await s(`${await this.discoveryApi.getBaseUrl("rbac")}/members?query=${encodeURIComponent(e.query)}`);return this.parseResponse(t)}async getRoleMembers({policyId:e,roleId:s}){const{fetch:t}=this.fetchApi,i=await t(`${await this.discoveryApi.getBaseUrl("rbac")}/policies/${e}/roles/${s}/members`);return this.parseResponse(i)}async authorize(){const{fetch:e}=this.fetchApi,s=await e(`${await this.discoveryApi.getBaseUrl("rbac")}/authorize`);return this.parseResponse(s)}async createDraft(e){const{fetch:s}=this.fetchApi,t=await s(`${await this.discoveryApi.getBaseUrl("rbac")}/policies`,{method:"POST",body:JSON.stringify(e),headers:{"Content-Type":"application/json"}});return this.parseResponse(t)}async updateDraft(e,s){const{fetch:t}=this.fetchApi,i=await t(`${await this.discoveryApi.getBaseUrl("rbac")}/policies/${e}`,{method:"PATCH",body:JSON.stringify(s),headers:{"Content-Type":"application/json"}});return this.parseResponse(i)}async deleteDraft(e){const{fetch:s}=this.fetchApi,t=await s(`${await this.discoveryApi.getBaseUrl("rbac")}/policies/${e}`,{method:"DELETE"});return this.parseResponse(t)}async publishPolicy(e,s){const{fetch:t}=this.fetchApi,i=await t(`${await this.discoveryApi.getBaseUrl("rbac")}/policies/${e}/publish`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({description:s.description})});return this.parseResponse(i)}async fetchAllPermissionMetadata(e){const s=await Promise.all(e.map(t=>this.fetchPermissionMetadata(t)));return{permissions:s.flatMap(({permissions:t})=>t),rules:s.flatMap(({rules:t})=>t)}}async fetchPermissionMetadata(e){var s,t,i,n;const h=await this.discoveryApi.getBaseUrl(e),c=await(await this.fetchApi.fetch(`${h}/.well-known/backstage/permissions/metadata`)).json(),l=(t=(s=c.permissions)==null?void 0:s.filter(Boolean))!=null?t:[],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 s,t;if(e.ok)return e.status===204?void 0:e.json();const i=await v.fromResponse(e);throw i.message=(t=(s=i.body.error.message)!=null?s:i.message)!=null?t:"Unknown error",i}}const o=A({id:"rbac"}),r=m({id:"rbac",routes:{root:o},apis:[u({api:p,deps:{fetchApi:R,discoveryApi:b},factory(a){return new B(a)}})]}),$=r.provide(w({name:"RBACRoot",component:()=>import("./Root-e3ab1bbe.esm.js").then(a=>a.RBACRoot),mountPoint:o})),P=r.provide(g({name:"RBACSidebarItem",component:{lazy:()=>import("./RBACSidebarItem-ca7b78f0.esm.js").then(a=>a.RBACSidebarItem)}}));export{$ as R,o as a,r as b,P as c,p as r};
2
- //# sourceMappingURL=index-bb1908ac.esm.js.map
1
+ import{createApiRef as y,createRouteRef as A,createPlugin as m,createApiFactory as u,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,s=await e(`${await this.discoveryApi.getBaseUrl("rbac")}/policies`);return this.parseResponse(s)}async getPolicy(e){const{fetch:s}=this.fetchApi,t=await s(`${await this.discoveryApi.getBaseUrl("rbac")}/policies/${e}`);return this.parseResponse(t)}async getActivePolicy(){const{fetch:e}=this.fetchApi,s=await e(`${await this.discoveryApi.getBaseUrl("rbac")}/policies/active`);return this.parseResponse(s)}async searchMembers(e){const{fetch:s}=this.fetchApi,t=await s(`${await this.discoveryApi.getBaseUrl("rbac")}/members?query=${encodeURIComponent(e.query)}`);return this.parseResponse(t)}async getRoleMembers({policyId:e,roleId:s}){const{fetch:t}=this.fetchApi,i=await t(`${await this.discoveryApi.getBaseUrl("rbac")}/policies/${e}/roles/${s}/members`);return this.parseResponse(i)}async authorize(){const{fetch:e}=this.fetchApi,s=await e(`${await this.discoveryApi.getBaseUrl("rbac")}/authorize`);return this.parseResponse(s)}async createDraft(e){const{fetch:s}=this.fetchApi,t=await s(`${await this.discoveryApi.getBaseUrl("rbac")}/policies`,{method:"POST",body:JSON.stringify(e),headers:{"Content-Type":"application/json"}});return this.parseResponse(t)}async updateDraft(e,s){const{fetch:t}=this.fetchApi,i=await t(`${await this.discoveryApi.getBaseUrl("rbac")}/policies/${e}`,{method:"PATCH",body:JSON.stringify(s),headers:{"Content-Type":"application/json"}});return this.parseResponse(i)}async deleteDraft(e){const{fetch:s}=this.fetchApi,t=await s(`${await this.discoveryApi.getBaseUrl("rbac")}/policies/${e}`,{method:"DELETE"});return this.parseResponse(t)}async publishPolicy(e,s){const{fetch:t}=this.fetchApi,i=await t(`${await this.discoveryApi.getBaseUrl("rbac")}/policies/${e}/publish`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({description:s.description})});return this.parseResponse(i)}async fetchAllPermissionMetadata(e){const s=await Promise.all(e.map(t=>this.fetchPermissionMetadata(t)));return{permissions:s.flatMap(({permissions:t})=>t),rules:s.flatMap(({rules:t})=>t)}}async fetchPermissionMetadata(e){var s,t,i,n;const h=await this.discoveryApi.getBaseUrl(e),c=await(await this.fetchApi.fetch(`${h}/.well-known/backstage/permissions/metadata`)).json(),l=(t=(s=c.permissions)==null?void 0:s.filter(Boolean))!=null?t:[],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 s,t;if(e.ok)return e.status===204?void 0:e.json();const i=await v.fromResponse(e);throw i.message=(t=(s=i.body.error.message)!=null?s:i.message)!=null?t:"Unknown error",i}}const o=A({id:"rbac"}),r=m({id:"rbac",routes:{root:o},apis:[u({api:p,deps:{fetchApi:R,discoveryApi:b},factory(a){return new B(a)}})]}),$=r.provide(w({name:"RBACRoot",component:()=>import("./Root-0589309b.esm.js").then(a=>a.RBACRoot),mountPoint:o})),P=r.provide(g({name:"RBACSidebarItem",component:{lazy:()=>import("./RBACSidebarItem-9f71d4a8.esm.js").then(a=>a.RBACSidebarItem)}}));export{$ as R,o as a,r as b,P as c,p as r};
2
+ //# sourceMappingURL=index-2e23cb45.esm.js.map
package/dist/index.esm.js CHANGED
@@ -1,2 +1,2 @@
1
- import{R as i,c as m,b as R}from"./esm/index-bb1908ac.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-2e23cb45.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.2.2",
4
+ "version": "0.3.0",
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.1.4",
27
- "@backstage/core-components": "^0.12.1",
28
- "@backstage/core-plugin-api": "^1.2.0",
26
+ "@backstage/catalog-model": "^1.1.5",
27
+ "@backstage/core-components": "^0.12.3",
28
+ "@backstage/core-plugin-api": "^1.3.0",
29
29
  "@backstage/errors": "^1.1.4",
30
- "@backstage/plugin-catalog-react": "^1.2.2",
31
- "@backstage/plugin-permission-common": "^0.7.2",
32
- "@backstage/plugin-permission-node": "^0.7.2",
33
- "@backstage/plugin-permission-react": "^0.4.8",
30
+ "@backstage/plugin-catalog-react": "^1.2.4",
31
+ "@backstage/plugin-permission-common": "^0.7.3",
32
+ "@backstage/plugin-permission-node": "^0.7.3",
33
+ "@backstage/plugin-permission-react": "^0.4.9",
34
34
  "@backstage/theme": "^0.2.16",
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.2.3",
40
- "@spotify/backstage-plugin-rbac-common": "^0.2.2",
39
+ "@spotify/backstage-plugin-core": "^0.3.0",
40
+ "@spotify/backstage-plugin-rbac-common": "^0.3.0",
41
41
  "ajv": "^8.11.2",
42
42
  "file-saver": "^2.0.5",
43
43
  "js-yaml": "^4.1.0",
@@ -51,15 +51,15 @@
51
51
  "zod-to-json-schema": "^3.18.1"
52
52
  },
53
53
  "peerDependencies": {
54
- "@backstage/plugin-permission-node": "^0.7.2",
54
+ "@backstage/plugin-permission-node": "^0.7.3",
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.0",
60
- "@backstage/core-app-api": "^1.3.0",
61
- "@backstage/dev-utils": "^1.0.9",
62
- "@backstage/test-utils": "^1.2.3",
59
+ "@backstage/cli": "^0.22.1",
60
+ "@backstage/core-app-api": "^1.4.0",
61
+ "@backstage/dev-utils": "^1.0.11",
62
+ "@backstage/test-utils": "^1.2.4",
63
63
  "@testing-library/jest-dom": "^5.10.1",
64
64
  "@testing-library/react": "^12.1.3",
65
65
  "@testing-library/react-hooks": "^8.0.0",
@@ -1,3 +0,0 @@
1
- import e,{createContext as Te,useState as B,useCallback as w,useMemo as $,useContext as Se,useEffect as G,Fragment as pe,useRef as Z,useReducer as sn,useLayoutEffect as mn}from"react";import{Link as un,useNavigate as Y,useParams as rt,Routes as dn,Route as Re}from"react-router-dom";import{useApi as k,configApiRef as pn,alertApiRef as Q,useApp as we,useRouteRef as fn}from"@backstage/core-plugin-api";import Ie from"react-use/lib/useAsync";import{isResourcePermission as at}from"@backstage/plugin-permission-common";import{r as j,a as En}from"./index-bb1908ac.esm.js";import{forEach as yn,mapValues as gn,groupBy as hn,uniq as bn}from"lodash";import{Link as ee,Progress as fe,ErrorPanel as lt,Table as vn,Breadcrumbs as Cn,Page as Dn,Header as Pn,Content as xn,ContentHeader as ke,EmptyState as Ee}from"@backstage/core-components";import J from"react-use/lib/useAsyncFn";import ot from"react-use/lib/useMount";import{makeStyles as N,Chip as it,Box as p,Typography as D,Card as K,CardContent as ye,List as An,ListItem as ct,ListItemIcon as st,ListItemText as mt,CardActions as Nn,Dialog as te,DialogTitle as ge,IconButton as H,DialogContent as q,DialogActions as Be,Button as x,TextField as le,Container as Tn,Grid as V,debounce as Sn,Checkbox as Oe,CircularProgress as Rn,Table as Me,TableHead as _e,TableRow as W,TableCell as v,TableBody as $e,FormControlLabel as ut,Tooltip as he,FormHelperText as dt,InputLabel as be,Paper as wn,Popper as In,Menu as kn,MenuItem as ne,FormControl as Le,Select as Fe,Tabs as Bn,Tab as On,Divider as Mn,DialogContentText as _n,CardHeader as $n}from"@material-ui/core";import Ln from"@material-ui/icons/Publish";import Fn from"@material-ui/icons/FilterNone";import{DateTime as L}from"luxon";import pt from"lodash/omit";import{saveAs as jn}from"file-saver";import Hn,{dump as Vn}from"js-yaml";import Wn from"lodash/pickBy";import ve from"@material-ui/icons/Close";import zn from"@material-ui/icons/CalendarToday";import Gn from"@material-ui/icons/Person";import Un from"@material-ui/icons/FiberManualRecord";import ft from"lodash/keyBy";import Yn from"lodash/isEqual";import{isConditionalDecision as je,PolicyConfigParser as Ce,BackstageUserPlaceholder as oe,isAllOfPermissionCriteria as Jn,isAnyOfPermissionCriteria as Kn,isNotPermissionCriteria as qn,isMatchingPermission as Xn,RoleParser as Zn,UpdateDraftRequestParser as Qn}from"@spotify/backstage-plugin-rbac-common";import{v4 as re}from"uuid";import Et from"@material-ui/icons/ReportProblemOutlined";import er from"react-use/lib/useLocalStorage";import{SpotifyLicenseBanner as tr,invariant as He}from"@spotify/backstage-plugin-core";import Ve from"@material-ui/icons/Add";import ie from"@material-ui/icons/Delete";import{parseEntityRef as We,DEFAULT_NAMESPACE as nr}from"@backstage/catalog-model";import{humanizeEntityRef as rr}from"@backstage/plugin-catalog-react";import{Autocomplete as ze,ToggleButton as ar,ToggleButtonGroup as lr}from"@material-ui/lab";import or from"lodash/uniqBy";import yt from"@material-ui/icons/Info";import ir from"@material-ui/icons/Edit";import cr from"@material-ui/icons/Check";import{JSONEditor as sr,isTextContent as mr,createAjvValidator as ur,Mode as dr}from"vanilla-jsoneditor";import gt from"ajv";import pr from"@material-ui/icons/Remove";import fr from"@material-ui/icons/KeyboardArrowDown";import Er from"@material-ui/icons/KeyboardArrowUp";import yr from"../images/no-permissions.svg";import gr from"../images/no-roles.svg";import{A as hr}from"./Authorized-296ab754.esm.js";import"@backstage/errors";const ht=Te(null),br=({children:t})=>{const n=k(pn),a=k(j),l=k(Q),[r,o]=B(null),c=w(async()=>{var m;if(!r){const u=await a.fetchAllPermissionMetadata((m=n.getOptionalStringArray("permission.permissionedPlugins"))!=null?m:[]),i=Cr(u.rules);yn(i,f=>{f.length!==1&&l.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=Dr(u,i);return o(s),s}return r},[l,r,a,n]);return e.createElement(ht.Provider,{value:$(()=>({getMetadata:c}),[c])},t)};function De(){const t=Se(ht),{value:n}=Ie(async()=>t?.getMetadata(),[t]);return n}function bt(){var t;const n=De();return(t=n?.rules)!=null?t:null}function vt(){var t;const n=De();return(t=n?.permissions)!=null?t:null}function Ct(){const t=De();return t?[...new Set(t.permissions.filter(n=>at(n)).map(({resourceType:n})=>n))]:null}function vr(){const t=De(),n=Ct();return!t||!n?null:n.reduce((a,l)=>{const r=t.rules.find(o=>o.resourceType===l);return r&&(a[l]={pluginId:r.pluginId}),a},{})}function Cr(t){return gn(hn(t,"resourceType"),n=>bn(n.map(({pluginId:a})=>a)))}function Dr(t,n){return{...t,rules:t.rules.filter(({resourceType:a,pluginId:l})=>{const r=n[a];return l===r[0]})}}function Pr(t){throw new Error("Invalid state")}function xr(t){var n,a;return((a=(n=t?.body)==null?void 0:n.response)==null?void 0:a.statusCode)===404}function Dt(t){const n=new Blob([Ar(t)],{type:"text/yaml"});jn(n,`${(t.name||"policy").toLocaleLowerCase().replace(/\W/g,"-")}.yaml`)}function Ar(t){const{name:n,roles:a,description:l}=t;return`# this is an autogenerated file, do not edit
2
- ${Vn(Wn({name:n,description:l,roles:a.map(({permissions:o,...c})=>({...pt(c,["id"]),permissions:o.map(m=>pt(m,["id"]))}))},o=>o!==null||o!==void 0))}`}const Pt=Te({policies:void 0,setPolicies:()=>{},setPolicy:()=>{},getPolicy:()=>{},removePolicy:()=>{}}),Ge=()=>Se(Pt);function Nr({children:t,initialState:n={policies:void 0,cache:{}}}){const[a,l]=B(n),r=w(u=>{l(i=>({...i,policies:u,cache:xt(i.cache,u)}))},[]),o=w(u=>a.cache[u],[a.cache]),c=w(u=>l(i=>({...i,cache:{...i.cache,[u]:void 0},policies:void 0})),[]),m=w(u=>l(i=>({...i,policies:void 0,cache:xt(i.cache,[u])})),[]);return e.createElement(Pt.Provider,{value:$(()=>({policies:a.policies,setPolicies:r,setPolicy:m,getPolicy:o,removePolicy:c}),[a.policies,r,m,o,c])},t)}function xt(t,n){if(!n)return t;const a={...t};return n.forEach(l=>{a[l.id]=l}),a}const ce=()=>{const t=k(j),{setPolicies:n,policies:a}=Ge(),[{loading:l,error:r},o]=J(()=>t.getPolicies(),[t],a?{loading:!1,value:{items:a,totalItems:a.length}}:{loading:!0}),c=w(async()=>{const m=await o();n(m.items)},[o,n]);return{loading:l,error:r,fetchPolicies:c}};function At(){const t=k(j),n=k(Q),{fetchPolicies:a}=ce();return J(async l=>{if(!l)return;const{roles:r,name:o}=l;return t.createDraft({roles:r,name:o}).then(a).catch(c=>(n.post({message:c.message,severity:"error"}),Promise.reject(c)))},[])}function Nt(){const t=k(j),n=k(Q),a=J(async(r,o)=>{if(r)return await t.publishPolicy(r.id,{description:o}),t.getPolicy(r.id)},[]),[{error:l}]=a;return G(()=>{l&&n.post({message:l.message,severity:"error"})},[l,n]),a}const Tr=N(t=>({chip:{margin:0},icon:{color:t.palette.success.main}}));function Tt(t){const n=Tr();return t.status==="inactive"?null:t.status==="draft"?e.createElement(it,{className:n.chip,label:"Draft",size:t.size}):e.createElement(it,{className:n.chip,classes:{icon:n.icon},label:"Active",icon:e.createElement(Un,null),size:t.size})}const Ue=(t,n)=>{const a=Object.entries(t);for(const[,l]of a){const r=n(l);for(const[,o]of a){const c=n(o);c.operation!=="ADDED"&&c.operation!=="REMOVED"&&(r.operation==="ADDED"&&r.indexAfter<c.indexAfter?c.indexBefore+=1:r.operation==="REMOVED"&&r.indexBefore<c.indexBefore&&(c.indexBefore-=1))}}for(const[,l]of a){const r=n(l);r.operation==="UNCHANGED"&&r.indexAfter!==r.indexBefore&&(r.operation=r.indexAfter>r.indexBefore?"MOVED_DOWN":"MOVED_UP")}return t},Ye=(t,n)=>{const a=ft(n,"id"),l=Object.fromEntries(n.map((r,o)=>[r.id,{operation:"ADDED",indexAfter:o,indexBefore:-1,after:r,before:null}]));for(let r=0;r<t.length;r++){const o=t[r];if(l[o.id]){const c=!Yn(o,a[o.id]);l[o.id].before=o,l[o.id].indexBefore=r,l[o.id].operation=c?"CHANGED":"UNCHANGED"}else l[o.id]={operation:"REMOVED",after:null,before:o,indexAfter:-1,indexBefore:r}}return Ue(l,r=>r)},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,r)=>[l,{operation:"ADDED",after:l,before:null,indexAfter:r,indexBefore:-1}]))};if(n==="*")return{"*":{operation:"ADDED",after:"*",before:null,indexAfter:0,indexBefore:-1},...Object.fromEntries(t.map((l,r)=>[l,{operation:"REMOVED",after:null,before:l,indexAfter:-1,indexBefore:r}]))};const a=Object.fromEntries(n.map((l,r)=>[l,{operation:"ADDED",after:l,before:null,indexAfter:r,indexBefore:-1}]));for(let l=0;l<t.length;l++){const r=t[l];a[r]?(a[r].before=r,a[r].indexBefore=l,a[r].operation="UNCHANGED"):a[r]={operation:"REMOVED",after:null,before:r,indexAfter:-1,indexBefore:l}}return Ue(a,l=>l)},Sr=(t=[],n=[])=>{const a=ft(n,"id"),l=Object.fromEntries(n.map((r,o)=>[r.id,{role:{operation:"ADDED",indexAfter:o,indexBefore:-1,after:r,before:null},members:Je([],r.members),permissions:Ye([],r.permissions)}]));for(let r=0;r<t.length;r++){const o=t[r];if(a[o.id]){const c=a[o.id],m=Je(o.members,c.members),u=Ye(o.permissions,c.permissions),i=Object.values(u).some(({operation:h})=>h!=="UNCHANGED"),s=Object.values(m).some(({operation:h})=>h!=="UNCHANGED"),E=o.name!==c.name||i||s;l[o.id].role.before=o,l[o.id].role.indexBefore=r,l[o.id].role.operation=E?"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:r},members:Je(o.members,[]),permissions:Ye(o.permissions,[])}}return Ue(l,({role:r})=>r)},Rr=(t,n)=>{const a=t.name!==n.name,l=Sr(t.roles||[],n.roles||[]);return{policy:{operation:a?"CHANGED":"UNCHANGED",before:t,after:n},roles:l}},St=t=>{const n=k(j),{value:a}=Ie(()=>n.getActivePolicy(),[n]);return $(()=>a&&t?Rr(a,t):null,[a,t])};function Ke(t){var n;if(t.match==="*")return"All";if(t.match.name)return t.match.name;const a=[];return t.match.resourceType&&a.push(t.match.resourceType),(n=t.match.actions)!=null&&n.length&&a.push(t.match.actions.join(", ")),a.join(" | ")}function wr(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}},Ir=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"}},kr=N(t=>({root:({operation:n})=>({color:qe(t,n)})})),_=t=>e.createElement(D,{...t,variant:"body2"}),b=t=>{const n=kr(t);return e.createElement(p,{...t,className:n.root,component:"span",fontWeight:"fontWeightBold"})},Rt=({policy:t})=>{var n,a,l;const r=St(t),o=r?.policy.operation==="CHANGED"||Object.values((n=r?.roles)!=null?n:{}).some(i=>i.role.operation!=="UNCHANGED");if(!r||!o)return e.createElement(p,null,"No changes");const c=!!r.policy.before&&!!r.policy.after&&r.policy.before.name!==r.policy.after.name,m=({before:i,after:s})=>i&&s&&i.name!==s.name,u=({operation:i})=>i!=="ADDED"&&i!=="REMOVED";return e.createElement(p,null,c&&e.createElement(_,null,"Policy name ",e.createElement(b,{operation:"CHANGED"},"changed")," from"," ",e.createElement(b,null,'"',(a=r.policy.before)==null?void 0:a.name,'"')," to"," ",e.createElement(b,null,'"',(l=r.policy.after)==null?void 0:l.name,'"')),Object.entries(r.roles).map(([i,{role:s,permissions:f,members:E}])=>{var h,y,d,g,P,S;return e.createElement(pe,{key:i},s.operation==="ADDED"&&e.createElement(_,null,"Role ",e.createElement(b,null,'"',(h=s.after)==null?void 0:h.name,'"')," has been"," ",e.createElement(b,{operation:"ADDED"},"added")),s.operation==="REMOVED"&&e.createElement(_,null,"Role ",e.createElement(b,null,'"',(y=s.before)==null?void 0:y.name,'"')," has been"," ",e.createElement(b,{operation:"REMOVED"},"removed")),m(s)&&e.createElement(_,null,"Role name changed from ",e.createElement(b,null,'"',(d=s.before)==null?void 0:d.name,'"')," ","to ",e.createElement(b,null,'"',(g=s.after)==null?void 0:g.name,'"')),s.indexAfter>s.indexBefore&&s.indexBefore!==-1&&e.createElement(_,null,"Role ",e.createElement(b,null,'"',(P=s.after)==null?void 0:P.name,'"')," has been"," ",e.createElement(b,{operation:"MOVED_DOWN"},"moved down")," in priority"),s.indexAfter<s.indexBefore&&s.indexAfter!==-1&&e.createElement(_,null,"Role ",e.createElement(b,null,'"',(S=s.after)==null?void 0:S.name,'"')," has been"," ",e.createElement(b,{operation:"MOVED_UP"},"moved up")," in priority"),u(s)&&e.createElement(e.Fragment,null,Object.entries(f).map(([I,A])=>{var F,O,T,C,M;const{before:R,after:z}=A,X=R&&Ke(R),U=z&&Ke(z);return e.createElement(pe,{key:I},A.operation==="ADDED"&&A.after&&e.createElement(_,null,"Permission decision"," ",e.createElement(b,null,'"',U,'"')," has been"," ",e.createElement(b,{operation:"ADDED"},"added")," to"," ",e.createElement(b,null,'"',(F=s.after)==null?void 0:F.name,'"')),A.operation==="REMOVED"&&A.before&&e.createElement(_,null,"Permission decision"," ",e.createElement(b,null,'"',X,'"')," has been"," ",e.createElement(b,{operation:"REMOVED"},"removed")," ","from ",e.createElement(b,null,'"',(O=s.after)==null?void 0:O.name,'"')),A.operation==="CHANGED"&&e.createElement(_,null,X!==U?e.createElement(e.Fragment,null,"Permission decision"," ",e.createElement(b,null,'"',X,'"')," has been"," ",e.createElement(b,{operation:"CHANGED"},"updated")," ","to ",e.createElement(b,null,'"',U,'"')):e.createElement(e.Fragment,null,"Permission decision"," ",e.createElement(b,null,'"',X,'"')," has been"," ",e.createElement(b,{operation:"CHANGED"},"updated"))," ","in ",e.createElement(b,null,'"',(T=s.after)==null?void 0:T.name,'"')),A.indexAfter>A.indexBefore&&A.indexBefore!==-1&&e.createElement(_,null,"Permission decision"," ",e.createElement(b,null,'"',U,'"')," has been"," ",e.createElement(b,{operation:"MOVED_DOWN"},"moved down")," ","in priority in"," ",e.createElement(b,null,'"',(C=s.after)==null?void 0:C.name,'"')),A.indexAfter<A.indexBefore&&A.indexAfter!==-1&&e.createElement(_,null,"Permission decision"," ",e.createElement(b,null,'"',U,'"')," has been"," ",e.createElement(b,{operation:"MOVED_UP"},"moved up")," ","in priority in"," ",e.createElement(b,null,'"',(M=s.after)==null?void 0:M.name,'"')))}),Object.entries(E).map(([I,A])=>{var F,O;return e.createElement(pe,{key:I},A.operation==="ADDED"&&A.after&&e.createElement(_,null,"Member ",e.createElement(b,null,'"',A.after,'"')," has been"," ",e.createElement(b,{operation:"ADDED"},"added")," to"," ",e.createElement(b,null,'"',(F=s.after)==null?void 0:F.name,'"')),A.operation==="REMOVED"&&A.before&&e.createElement(_,null,"Member ",e.createElement(b,null,'"',A.before,'"')," has been"," ",e.createElement(b,{operation:"REMOVED"},"removed")," from"," ",e.createElement(b,null,'"',(O=s.after)==null?void 0:O.name,'"')))})))}))},Br=N(t=>({card:n=>({backgroundImage:n.policy.status==="active"?"linear-gradient(256.15deg, #00782A 19.77%, #1DB954 100%)":"linear-gradient(256.15deg, #BDBDBD 19.77%, #EEEEEE 100%)",backgroundPosition:"top",backgroundSize:"100% 8px",backgroundRepeat:"no-repeat",paddingTop:"8px",height:"100%"}),diffSummaryContainer:{backgroundColor:t.palette.background.default,padding:t.spacing(2),borderWidth:"1px",borderStyle:"solid",borderColor:t.palette.divider,borderRadius:t.shape.borderRadius},header:{display:"flex",justifyContent:"space-between",alignItems:"center"},detailsHeader:{...t.typography.caption,paddingTop:t.spacing(3),color:t.palette.text.secondary},activityList:{color:t.palette.text.secondary},activityListItem:{padding:0},actions:{justifyContent:"flex-start"}}));function se(t){var n,a;const l=Br(t),{policy:r,to:o,withChangeSummary:c}=t,m=`${r.name} ${r.status==="draft"?"- Draft":""}`;let u="Created on ",i=L.fromISO(r.createdAt),s=`Created by ${r.createdBy}`;return r.status==="active"?(u="Published on ",i=L.fromISO((n=r.lastPublishedAt)!=null?n:""),s=`Published by ${r.lastPublishedBy}`):r.createdAt!==r.updatedAt&&(u="Updated on ",i=L.fromISO((a=r.updatedAt)!=null?a:""),s=`Updated by ${r.updatedBy}`),u+=i.toLocaleString(L.DATETIME_MED_WITH_SECONDS),e.createElement(K,{className:l.card},e.createElement(ye,null,e.createElement("div",{className:l.header},o?e.createElement(ee,{to:`versions/${r.id}`},e.createElement(D,{variant:"h5",component:"h1"},m)):e.createElement(D,{variant:"h5",component:"h1"},m),r.status==="active"?e.createElement(Tt,{status:"active",size:"small"}):null),r.description?e.createElement(D,{variant:"body1",color:"textSecondary"},'"',r.description,'"'):null,e.createElement(D,{component:"h4",className:l.detailsHeader},"Details"),e.createElement(An,{className:l.activityList},e.createElement(ct,{className:l.activityListItem},e.createElement(st,null,e.createElement(zn,null)),e.createElement(mt,{primary:u})),e.createElement(ct,{className:l.activityListItem},e.createElement(st,null,e.createElement(Gn,null)),e.createElement(mt,{primary:s}))),c&&e.createElement(p,{paddingTop:2},e.createElement(D,{gutterBottom:!0,variant:"subtitle2"},"What's changed"),e.createElement(p,{className:l.diffSummaryContainer},e.createElement(Rt,{policy:r})))),t.actions?e.createElement(Nn,{className:l.actions},t.actions):null)}const Or=N(t=>({paper:{padding:t.spacing(2,2,0,2)}})),wt=({isOpen:t,onClose:n,policy:a})=>{const l=Or();return e.createElement(te,{classes:{...l},open:t,onClose:n},e.createElement(ge,{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,a.name," has been published and is now your active policy.")),e.createElement(p,null,e.createElement(H,{onClick:n,title:"Close dialog"},e.createElement(ve,null))))),e.createElement(q,null,e.createElement(se,{policy:a})),e.createElement(Be,null,e.createElement(p,{display:"flex",flexDirection:"row",flexGrow:1,justifyContent:"flex-start"},e.createElement(x,{component:un,color:"primary",onClick:n,role:"link",to:"/rbac"},"View all versions"))))},Mr=N(t=>({icon:{color:t.palette.warning.main,width:"2rem",height:"2rem"},label:{align:"center",display:"block",marginBottom:t.spacing(1),color:t.palette.text.secondary,fontSize:t.typography.caption.fontSize},policiesContainer:{display:"flex",gap:t.spacing(4),marginTop:t.spacing(4),marginBottom:t.spacing(4)},button:{marginTop:t.spacing(4)}})),_r=({localPolicy:t,onSelectLocalPolicy:n,onSelectServerPolicy:a,serverPolicy:l})=>{const r=Mr();return e.createElement(te,{open:!0,maxWidth:"md"},e.createElement(q,null,e.createElement(p,{display:"flex",flexDirection:"column",gridGap:8},e.createElement(p,{display:"flex",justifyContent:"center"},e.createElement(Et,{className:r.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:r.policiesContainer},e.createElement(p,{alignItems:"center",display:"flex",flexDirection:"column",flex:"1 1 0%"},e.createElement(D,{className:r.label,variant:"button"},"Your local draft"),e.createElement(se,{policy:t,withChangeSummary:!0}),e.createElement(x,{className:r.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:r.label,variant:"button"},"Recently saved draft"),e.createElement(se,{policy:l,withChangeSummary:!0}),e.createElement(x,{className:r.button,color:"primary",onClick:a,variant:"outlined"},"Keep recently saved draft")))))},$r=({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},Lr=()=>er("@spotify/backstage-plugin-rbac:draftPolicy"),Fr=N(t=>({icon:{color:t.palette.warning.main,width:"2rem",height:"2rem"}})),jr=({onConfirm:t,policy:n})=>{const a=Fr(),l=()=>{Dt(n)};return e.createElement(te,{open:!0},e.createElement(q,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(Et,{className:a.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(x,{color:"primary",onClick:l,variant:"outlined"},"Export"),e.createElement(x,{color:"primary",onClick:t,variant:"contained"},"Discard and continue")))))},It=Te({diff:null,hasChanges:!1,policy:void 0,createNewRole:()=>"",discardLocalDraft:()=>{},saveLocalDraftToServer:()=>Promise.reject(),refetchPolicy:()=>Promise.reject(),updateLocalDraft:()=>{}}),ae=()=>Se(It);function Pe({children:t,policyId:n}){const a=Y(),l=k(Q),r=k(j),{getPolicy:o,setPolicy:c}=Ge(),m=we(),{NotFoundErrorPage:u}=m.getComponents(),i=o(n),[s,f,E]=Lr(),h=!s||Ce.safeParse(s).success,y=h?s:void 0,{policy:d,policyConflict:g}=$r({serverPolicy:i,localPolicy:y}),P=St(d),[{loading:S,error:I},A]=J(()=>r.getPolicy(n),[r,n],i?{loading:!1,value:i}:{loading:!0}),F=()=>{f(R=>R&&i&&{...R,updatedAt:i.updatedAt})},O=w(async()=>{const R=await A();c(R)},[A,c]),T=w(async()=>{if(!d)throw new Error("No policy to save");try{await r.updateDraft(d.id,{name:d.name,roles:d.roles}),l.post({message:"Policy saved",severity:"success"}),E(),O?.()}catch(R){l.post({message:R?.message||"An error occurred while updating the policy",severity:"error"})}},[l,r,d,O,E]),C=w(()=>{if(!d)throw new Error("No policy to create a new role");const R=new Set(d.roles.map(U=>U.id));let z;do z=re().split("-")[0];while(R.has(z));const X={name:`Role ${z}`,permissions:[],members:"*",id:z};return f({...d,roles:[...d.roles,X]}),z},[d,f]),M=()=>{E(),a("/rbac")};return G(()=>{i||O()},[O,i]),h?d?e.createElement(It.Provider,{value:{diff:P,hasChanges:!!y,policy:d,createNewRole:C,discardLocalDraft:E,saveLocalDraftToServer:T,refetchPolicy:O,updateLocalDraft:f}},g&&y&&i&&e.createElement(_r,{localPolicy:y,onSelectLocalPolicy:F,onSelectServerPolicy:E,serverPolicy:i}),t):S?e.createElement(fe,null):I?xr(I)?e.createElement(u,null):e.createElement(lt,{error:I??new Error("Unknown")}):null:e.createElement(jr,{onConfirm:M,policy:s})}const Hr=N(t=>({closeButton:{color:t.palette.text.secondary},diffSummaryContainer:{backgroundColor:t.palette.background.default,marginBottom:t.spacing(2)}}));function kt({open:t,onPublish:n,onClose:a}){const{policy:l}=ae(),r=Hr(),o=Z(null);return e.createElement(te,{open:t,onClose:a,fullWidth:!0},e.createElement(ge,null,e.createElement(p,{display:"flex",justifyContent:"space-between",alignItems:"center"},"Ready to publish?",e.createElement(x,{startIcon:e.createElement(ve,null),onClick:a,className:r.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(q,{className:r.diffSummaryContainer,dividers:!0},e.createElement(Rt,{policy:l})),e.createElement(q,null,e.createElement(le,{variant:"outlined",fullWidth:!0,label:"Summary (optional)",placeholder:"Briefly describe this version (or changes from a previous version)",inputRef:o})),e.createElement(Be,null,e.createElement(x,{color:"primary",onClick:()=>{var c,m;return n((m=(c=o.current)==null?void 0:c.value)!=null?m:"")}},"Publish")))}const Vr=[{title:"Name",field:"name",render:t=>e.createElement(ee,{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 Pr(t.status)}}},{title:"Publish date",field:"lastPublishedAt",render:t=>t.lastPublishedAt?L.fromISO(t.lastPublishedAt).toLocaleString(L.DATETIME_MED_WITH_SECONDS):"",type:"datetime",defaultSort:"desc"},{title:"Published by",field:"lastPublishedBy"}];function Wr(t){const a=t.data.length>3,{fetchPolicies:l}=ce(),[{loading:r},o]=At(),[{loading:c,value:m},u]=Nt(),[i,s]=B(void 0),[f,E]=B(!1),h=()=>{s(void 0),l()},y=i?.id===m?.id?m:void 0,d=[g=>{const{tableData:P,...S}=g;return{icon:Ln,tooltip:"Publish",onClick:()=>{s(S),E(!0)},disabled:c}},g=>{const{tableData:P,...S}=g;return{icon:Fn,tooltip:"Duplicate",disabled:r||!t.canDuplicate,onClick:()=>o(S)}}];return e.createElement(e.Fragment,null,e.createElement(vn,{title:"Previous Versions",columns:Vr,data:t.data,options:{paging:a,pageSize:3,pageSizeOptions:[3,5,10,20],actionsColumnIndex:-1,loadingType:"linear"},actions:d}),i&&e.createElement(Pe,{policyId:i.id},e.createElement(kt,{open:f,onPublish:g=>{u(i,g),E(!1)},onClose:()=>{s(void 0),E(!1)}})),y&&e.createElement(wt,{isOpen:!0,policy:y,onClose:h}))}const zr=N(t=>({breadcrumbs:{marginBottom:t.spacing(4)}}));function Gr({pages:t}){const n=fn(En),a=zr();return e.createElement(Cn,{className:a.breadcrumbs},e.createElement(ee,{to:n()},"Home"),t.map(({title:l,path:r},o)=>r?e.createElement(ee,{to:r,key:r,relative:"path"},l):e.createElement(D,{key:`${o}`},l)))}function Xe({children:t,header:n,pages:a}){return e.createElement(Dn,{themeId:"tool"},e.createElement(tr,{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(Pn,{title:"Role Based Access Control"}),e.createElement(xn,null,e.createElement(Tn,{maxWidth:"lg"},e.createElement(V,{container:!0,spacing:4},e.createElement(V,{item:!0,xs:12},a&&e.createElement(Gr,{pages:a}),n),t))))}const Bt=t=>{const[n,a]=B(!1),{fetchPolicies:l}=ce(),[{loading:r,value:o},c]=Nt(),{policy:m,hasChanges:u}=ae(),i=Ce.safeParse(m).success,s=!u&&i,f=h=>{c(m,h),a(!1)},E=()=>{l()};return e.createElement(e.Fragment,null,e.createElement(x,{...t,onClick:()=>a(!0),disabled:!s||r},"Publish"),e.createElement(kt,{open:n,onClose:()=>a(!1),onPublish:f}),o&&e.createElement(wt,{isOpen:!0,onClose:E,policy:o}))};function Ur(t){const n=k(j),a=k(Q),{fetchPolicies:l}=ce();return J(async()=>{if(t)return n.deleteDraft(t.id).then(l).catch(r=>(a.post({message:r.message,severity:"error"}),Promise.reject(r)))},[t])}function Yr(){const t=k(j),n=Y(),a=k(Q);function l(r){var o,c;const m=(c=(o=r.target)==null?void 0:o.files)==null?void 0:c[0],u=new FileReader;m&&(u.readAsText(m,"utf-8"),u.onload=async i=>{var s,f;const E=(f=(s=i.target)==null?void 0:s.result)==null?void 0:f.toString();if(E){let h=null;try{h=Hn.load(E)}catch{a.post({message:"YAML file is invalid",severity:"error"});return}if(!Ce.safeParse(h).success){a.post({message:"Imported policy is invalid",severity:"error"});return}if((await t.getPolicies()).items.some(I=>I.status==="draft")){a.post({message:"Unable to import new policy due to existing draft policy",severity:"error"});return}const P=h,S=await t.createDraft({name:P.name,roles:P.roles});n(`./versions/${S.id}`),a.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 Jr(){const{policies:t}=Ge(),{loading:n,error:a,fetchPolicies:l}=ce();ot(()=>{t||l()});let r;return n?r=e.createElement(V,{item:!0,xs:12},e.createElement(fe,null)):a?r=e.createElement(lt,{error:a}):!t||t.length===0?r=e.createElement(qr,null):r=e.createElement(Xr,{policies:t}),e.createElement(Xe,{pages:void 0,header:e.createElement(ke,{title:"RBAC Policies"},e.createElement(Yr,null))},r)}const Kr=N(t=>({cardContent:{padding:t.spacing(6,3),"& > *":{background:"transparent"}}}));function qr(){const t=Kr(),n=k(j),a=Y(),[l,r]=J(async()=>n.createDraft({roles:[]}),[n]);return G(()=>{l.value&&a(`./versions/${l.value.id}`)},[a,l.value]),e.createElement(K,null,e.createElement(ye,{className:t.cardContent},e.createElement(Ee,{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:r},"New version")})))}function Xr({policies:t}){const n=t.find(i=>i.status==="draft"),a=t.find(i=>i.status==="active"),[l,r]=At(),[o,c]=Ur(n),m=Y(),u=Zr(t);return e.createElement(V,{container:!0,spacing:4},a?e.createElement(V,{item:!0,xs:12,md:6},e.createElement(se,{policy:a,to:`./versions/${a.id}`,actions:e.createElement(x,{color:"primary",disabled:l.loading||!!n,onClick:()=>r(a)},"Duplicate")})):null,n?e.createElement(V,{item:!0,xs:12,md:6},e.createElement(se,{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:c},"Delete Draft"),e.createElement(Pe,{policyId:n.id},e.createElement(Bt,{color:"primary"})))})):null,e.createElement(V,{item:!0,xs:12},e.createElement(Wr,{data:u,canDuplicate:!n})))}function Zr(t){return t.filter(({status:n})=>n==="inactive")}const Qr=N(t=>({titleWrapper:{display:"flex",alignItems:"center",gap:t.spacing(2)}}));function Ot({children:t}){const n=Qr();return e.createElement(D,{noWrap:!0,variant:"h4",component:"h2",color:"textSecondary",className:n.titleWrapper},t)}const ea=N({autocomplete:{display:"flex",flex:1}});function ta({members:t,disabled:n=!1,onToggleMember:a}){var l;const r=k(j),[o,c]=B(!1),m=ea(),[u,i]=sn(d=>d+1,0),[{value:s,loading:f},E]=J((d="")=>r.searchMembers({query:d}),[r]),h=$(()=>Sn(d=>{const g=d.target.value;E(g)},1e3),[E]),y=(d,g)=>{g&&(a(g),i())};return G(()=>{o&&E("")},[o,E]),e.createElement(p,{width:250},e.createElement(ze,{key:`${u}`,open:o,onOpen:()=>{c(!0)},onClose:()=>{c(!1)},onChange:y,getOptionLabel:Mt,groupBy:na,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}`},Mt(d))),options:(l=s?.members)!=null?l:[],openOnFocus:!0,disabled:n,loading:f,className:m.autocomplete,renderInput:d=>e.createElement(le,{...d,label:"Select specific users/groups",variant:"standard",onChange:h,InputProps:{...d.InputProps,endAdornment:e.createElement(e.Fragment,null,f?e.createElement(Rn,{color:"inherit",size:20}):null,d.InputProps.endAdornment)}})}))}function Mt(t){var n;const a=We(t.entityRef);return rr({...a,name:(n=t.name)!=null?n:a.name},{defaultKind:a.kind,defaultNamespace:nr})}const _t={user:"USERS",group:"GROUPS"};function na(t){const{kind:n}=We(t.entityRef);if(!_t[n])throw new Error(`Kind '${n}' is not supported for members in a policy`);return _t[n]}const ra=N(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"})})),me=({operation:t,size:n="small"})=>{const a=ra({operation:t}),l=Ir(t),r=n==="small"&&"caption"||n==="medium"&&"body1"||n==="large"&&"subtitle1"||"inherit";return!t||t==="UNCHANGED"?null:e.createElement(D,{className:a.root,variant:r},l)},$t=N({header:{display:"flex",flexDirection:"row",justifyContent:"space-between",paddingLeft:"1rem",paddingRight:"1rem",gap:"1rem"},actionCol:{width:48}});function aa({diff:t,policyId:n,role:a,onToggleMember:l,readonly:r=!1}){const o=k(j),c=$t(),m=a.members==="*",{current:u}=Z({}),i=h=>{u[h.entityRef]=h,l(h.entityRef)},{loading:s,error:f}=Ie(async()=>{if(a.members==="*"||a.members.length===0||(await o.getPolicy(n)).roles.find(d=>d.id===a.id)===void 0)return;(await o.getRoleMembers({policyId:n,roleId:a.id})).forEach(d=>u[d.entityRef]=d)},[n,m]),E=h=>{var y;if(u[h])return u[h];const d=We(h);return{entityRef:h,type:d.kind.toLowerCase(),name:(y=d.name)!=null?y:h}};return e.createElement(e.Fragment,null,e.createElement("div",{className:c.header},e.createElement("h2",null,"Members"),e.createElement(ta,{onToggleMember:i,members:a.members,disabled:r})),e.createElement(Me,null,e.createElement(_e,null,e.createElement(W,null,e.createElement(v,null,"Name"),e.createElement(v,null,"Type"),e.createElement(v,null),!r&&e.createElement(v,{className:c.actionCol}))),e.createElement($e,null,e.createElement(la,{diff:t,loading:s,error:f,members:Array.isArray(a.members)?a.members.map(E):a.members,onToggleMember:i,readonly:r}))))}function la({diff:t,loading:n,members:a,error:l,onToggleMember:r,readonly:o=!1}){var c;const m=$t();return n?e.createElement(W,null,e.createElement(v,{scope:"row",colSpan:4},e.createElement(fe,null))):(l&&(W,v,(c=l.message)!=null),a==="*"?e.createElement(W,null,e.createElement(v,null,"All"),e.createElement(v,{height:80},"any"),e.createElement(v,{colSpan:2},e.createElement(me,{operation:t?.members["*"].operation}))):a.length===0?e.createElement(W,null,e.createElement(v,{scope:"row",colSpan:4},"Select users or groups using the drop-down menu above.")):e.createElement(e.Fragment,null,a.map(u=>{const{name:i,type:s,entityRef:f}=u;return e.createElement(W,{key:f},e.createElement(v,{scope:"row"},i??"Unknown"),e.createElement(v,{scope:"row"},s),e.createElement(v,null,i&&e.createElement(me,{operation:t?.members[f].operation})),!o&&e.createElement(v,{scope:"row",className:m.actionCol},e.createElement(H,{"aria-label":"delete",onClick:()=>r(u),size:"small"},e.createElement(ie,null))))})))}function Lt(t){return`${t.palette.primary.main}50`}const oa=N(t=>({toggleButton:{"&.Mui-selected":{backgroundColor:Lt(t),color:t.palette.primary.main},"&.Mui-selected:hover":{backgroundColor:"#97BBE8"},color:t.palette.primary.main,border:`1px solid ${t.palette.primary.main}`}}));function Ze({className:t,...n}){const a=oa();return e.createElement(ar,{className:`${a.toggleButton} ${t}`,...n})}const ia=N({fullWidth:{width:"100%","& > *":{flexGrow:1}}});function ca({className:t,fullWidth:n,...a}){const l=ia();return e.createElement(lr,{className:`${n?l.fullWidth:""} ${t}`,...a})}const sa=N(t=>({container:{display:"flex",position:"relative",alignItems:"center",gap:t.spacing(1),flexShrink:1,maxWidth:"100%",minWidth:0},input:({invalid:n})=>({boxSizing:"content-box",display:"block",maxWidth:"100%",padding:0,borderWidth:2,borderStyle:"solid",borderColor:n?t.palette.error.main:"transparent",borderRadius:t.shape.borderRadius,backgroundColor:"transparent",color:t.palette.textContrast,fontFamily:"inherit",fontSize:"inherit",lineHeight:"inherit",fontWeight:"inherit",textOverflow:"ellipsis"}),hiddenSpan:{position:"absolute",top:0,left:0,borderWidth:1,whiteSpace:"pre",opacity:0,pointerEvents:"none"}}));function Ft({invalid:t,name:n,value:a,onTextChange:l}){const r=sa({invalid:t}),[o,c]=B(!1),[m,u]=B(null),i=Z(null),[s,f]=B(a);G(()=>{f(a)},[a]),mn(()=>{i.current&&m&&i.current.style.setProperty("width",`max(${m.getBoundingClientRect().width}px, 3ch)`)},[m,s]);const E=()=>{c(!1),f(a)},h=()=>{c(!1),l?.(s)},y=()=>{var g;o?h():(c(!0),(g=i.current)==null||g.focus())},d=g=>{var P;g.key==="Enter"&&((P=i.current)==null||P.blur()),g.key==="Escape"&&E()};return e.createElement(e.Fragment,null,e.createElement("div",{className:r.container},e.createElement("input",{"aria-label":n,className:r.input,name:n,ref:i,onChange:g=>f(g.target.value),onFocus:y,onBlur:h,onKeyDown:d,value:s}),e.createElement("span",{"aria-hidden":"true",className:r.hiddenSpan,ref:u},s),e.createElement(H,{onClick:y,size:"small"},o?e.createElement(cr,{"aria-label":"Save title"}):e.createElement(ir,{"aria-label":"Edit title"}))))}const ma=["condition","anyOf","allOf","not"],jt={condition:"Condition",anyOf:"Any of",allOf:"All of",not:"Not"};function Qe(t){return t===null?!1:t.hasOwnProperty("id")&&t.hasOwnProperty("ruleName")&&t.hasOwnProperty("parameters")}function ue(t){return t.hasOwnProperty("levelType")}function ua(t){return t==="anyOf"||t==="allOf"||t==="not"}const da=N(t=>({descriptiveText:{fontWeight:500,marginBottom:t.spacing(1)}})),xe=({children:t})=>{const n=da();return e.createElement(D,{variant:"body2",className:n.descriptiveText},t)},Ht=({children:t})=>e.createElement(p,{pl:3},t),pa="#4CAF50";function fa({permissionCriteria:t}){return e.createElement("div",null,e.createElement(xe,null,"If the below conditions are met"),e.createElement(Ht,null,Qe(t)&&e.createElement(zt,{condition:t}),ue(t)&&e.createElement(Vt,{level:t})),e.createElement(xe,null,"Then the action is"," ",e.createElement(p,{component:"span",color:pa},"allowed")))}function Vt({level:t}){return e.createElement(e.Fragment,null,e.createElement(xe,null,jt[t.levelType]),e.createElement(Ht,null,t.children.map((n,a)=>ue(n)?e.createElement(Vt,{key:a,level:n}):e.createElement(zt,{key:a,condition:n}))))}const Wt="#FF737F",Ea="#E22134";function zt({condition:t}){return e.createElement(xe,null,e.createElement(p,{component:"span",color:Wt},t.ruleName,"("),e.createElement(p,{component:"span",color:Ea},JSON.stringify(t.parameters)),e.createElement(p,{component:"span",color:Wt},")"))}const ya=N(t=>({editor:{"--jse-main-border":`1px solid ${t.palette.divider}`,"--jse-panel-border":`1px solid ${t.palette.divider}`,"--jse-message-error-background":t.palette.error.main,"--jse-message-warning-background":t.palette.warning.main,"--jse-background-color":t.palette.background.default,"--jse-panel-background":t.palette.background.default,"--jse-delimiter-color":t.palette.type==="light"?"rgba(0, 0, 0, 0.38)":"rgba(255, 255, 255, 0.38)","--jse-error-color":t.palette.text.primary,"--jse-key-color":t.palette.text.primary,"--jse-value-color":t.palette.text.primary,"--jse-text-color":t.palette.text.primary,"--jse-panel-color-readonly":t.palette.text.hint,"--jse-value-color-string":t.palette.status.ok,"--jse-value-color-null":t.palette.status.warning,"--jse-value-color-number":t.palette.status.error,"--jse-value-color-boolean":t.palette.status.running,"--jse-font-family":"inherit"}})),ga=t=>"parseError"in t,ha=t=>{var n;return ga(t)?!!t.parseError:((n=t?.validationErrors)==null?void 0:n.length)>0};function ba({onChange:t,schema:n,value:a}){const l=Z(null),r=Z(),o=ya();return G(()=>(l.current&&!r.current&&(r.current=new sr({target:l.current,props:{onChange:(c,m,{contentErrors:u})=>{!ha(u)&&mr(c)&&t(JSON.parse(c.text))},validator:ur({schema:n}),content:{json:{}},mainMenuBar:!1,mode:dr.text}})),()=>{var c;(c=r.current)==null||c.destroy(),r.current=void 0}),[t,n]),ot(()=>{var c;(c=r.current)==null||c.updateProps({content:{json:a}})}),e.createElement("div",{ref:l,className:o.editor,style:{height:300}})}const va=[];function Ca(t){const{onChange:n,schema:a,name:l}=t,{description:r,items:o}=a,[c,m]=e.useState(!1),u=Array.isArray(t.value)?t.value:va,i=u.includes(oe),s=(g,P)=>{if(!Array.isArray(P)){const S=[...u];S[g]=P||"",n(S)}},f=w(()=>{n([...u,""])},[n,u]),E=g=>{n(u.filter((P,S)=>S!==g))},h=()=>{n(i?[]:[oe])},y=()=>{i&&m(!0)},d=()=>{m(!1)};return G(()=>{u.length?i&&u.length>1&&n([oe]):f()},[f,n,u,i]),!o||!("type"in o)?null:e.createElement(e.Fragment,null,(u??[]).map((g,P,{length:S})=>e.createElement(Ut,{allowEmptyStrings:!0,key:P,onChange:I=>s(P,I),name:P===0?l:"",schema:{description:P===S-1?r:"",type:o.type},value:g,controls:e.createElement(H,{size:"small",onClick:()=>E(P)},e.createElement(pr,null))})),!!u?.length&&e.createElement(p,{alignItems:"center",display:"flex",flexDirection:"row",justifyContent:"space-between"},e.createElement(p,null,e.createElement(ut,{control:e.createElement(Oe,{checked:i,onChange:h,name:"checkedB",color:"primary"}),label:"Use the claims from the logged in users token"})),e.createElement(p,null,e.createElement(he,{onClose:d,onOpen:y,open:c,title:"To add additional entries you must uncheck using the claims from the logged in user."},e.createElement("span",null,e.createElement(H,{disabled:i,size:"small",onClick:f},e.createElement(Ve,null)))))))}function Da(t){const{onChange:n,schema:a,name:l,value:r}=t,{description:o}=a,c=m=>{n(m.target.checked)};return e.createElement(p,{mb:1},e.createElement(ut,{control:e.createElement(Oe,{checked:r===!0,onChange:c,name:l,color:"primary"}),label:l}),o&&e.createElement(D,{display:"block",variant:"caption",color:"textSecondary"},o))}function Pa({allowEmptyStrings:t,controls:n,name:a,onChange:l,schema:r,value:o}){const c=m=>{l(Aa({value:m.currentTarget.value,type:r.type}))};return e.createElement(p,{mb:1},e.createElement(p,{display:"flex",gridGap:6},e.createElement(le,{fullWidth:!0,id:a,label:a,placeholder:"Enter",variant:"outlined",size:"small",value:xa(o,t),onChange:et(o,t)?void 0:c,disabled:et(o,t)}),n&&e.createElement(p,{alignSelf:"center"},n)),r.description&&e.createElement(D,{variant:"caption",color:"textSecondary"},r.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===oe}function xa(t,n=!1){return!n&&t===""?"[empty string]":t===null?"[null]":t===oe?"[BackstageUserClaims]":t||""}function Aa({value:t,type:n}){switch(n){case"string":return t===""?void 0:t;case"number":case"integer":return Number.isNaN(Number(t))?void 0:Number(t);case"null":return t==="null"?null:void 0;default:return}}function Gt(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 Na(t){return"type"in t&&t.type==="array"}function Ta(t){return"type"in t&&t.type==="boolean"}function Ut({schema:t,...n}){return Gt(t)?Na(t)?e.createElement(Ca,{...n,schema:t}):Ta(t)?e.createElement(Da,{...n,schema:t}):e.createElement(Pa,{...n,schema:t}):null}const Sa=new gt({allErrors:!0});function Ra({onChange:t,schema:n,value:a}){var l;const r=$(()=>Sa.compile(n),[n]),o=$(()=>r(a),[r,a]),c=Object.entries(n.properties),m=u=>i=>{t({...a,[u]:i})};return e.createElement(e.Fragment,null,c.map(([u,i])=>{var s;return e.createElement(Ut,{isRequired:((s=n.required)==null?void 0:s.includes(u))||!1,key:u,name:u,onChange:m(u),schema:i,value:a?.[u]})}),e.createElement(dt,{error:!o},(l=r.errors)==null?void 0:l[0].message))}const wa=t=>!!t&&"properties"in t;function Ia({onChange:t,rule:n,value:a}){const[l,r]=B(!1),{paramsSchema:o}=n??{},c=()=>r(s=>!s);if(!wa(o))return null;const m=!ka(o),u=m||l,i=e.createElement(x,{size:"small",onClick:c,disabled:m},u?"Close editor":"Edit as JSON");return e.createElement(p,{marginTop:2},e.createElement("form",null,u?e.createElement(ba,{onChange:t,schema:o,value:a}):e.createElement(e.Fragment,null,e.createElement(p,{marginBottom:2},e.createElement(be,null,"Parameters")),e.createElement(Ra,{onChange:t,schema:o,value:a}))),e.createElement(p,{display:"flex",flexDirection:"column",alignItems:"flex-end",marginTop:1},m?e.createElement(he,{title:"Only JSON editing is supported for this parameter",arrow:!0},e.createElement("span",null,i)):i))}function ka(t){return Object.values(t.properties).every(Gt)}const de=N(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 Ba({permissionCriteria:t,resourceType:n,onUpdate:a,readonly:l=!1}){const r=de(),o=w(s=>{a(f=>({...f,...s}))},[a]),c=w(s=>{const f=re();o(s==="condition"?Ae():s==="not"?{id:f,levelType:s,children:[]}:{id:f,levelType:s,children:[Ae()]})},[o]),m=w((s,f)=>{a(E=>({...E,ruleName:s,parameters:f}))},[a]),u=w(()=>{a(null)},[a]);let i;return l?i=e.createElement(fa,{permissionCriteria:t}):t===null?i=e.createElement(Yt,{onSelect:c}):Qe(t)?i=e.createElement(Jt,{ruleName:t.ruleName,parameters:t.parameters,resourceType:n,onChange:m,onDelete:u}):ue(t)&&(i=e.createElement(Kt,{level:t,resourceType:n,onChange:a,isRoot:!0})),e.createElement(wn,{variant:"outlined",className:r.paper},i)}function Ae(){return{id:re(),ruleName:null,parameters:{}}}function Yt({onSelect:t}){const n=de(),a=Z(null),[l,r]=B(!1),o=()=>{r(c=>!c)};return e.createElement("div",null,e.createElement(x,{className:n.addButton,variant:"outlined",color:"primary",onClick:o,ref:a},"Add"),e.createElement(kn,{anchorEl:a.current,open:l,onClose:o,BackdropProps:{}},ma.map(c=>e.createElement(ne,{key:c,onClick:()=>{t?.(c),r(!1)}},jt[c]))))}function Jt({ruleName:t,parameters:n,resourceType:a,onChange:l,onDelete:r}){var o;const c=de(),m=bt(),u=(o=m?.filter(E=>E.resourceType===a))!=null?o:[],i=u.find(E=>E.name===t),s=E=>{l(E,{})},f=w(E=>{l(t,E)},[l,t]);return e.createElement(p,{display:"flex",alignItems:"center"},e.createElement(K,{className:c.conditionCard},e.createElement("div",{className:c.conditionCardBar}),e.createElement(ye,null,e.createElement(p,null,e.createElement(p,null,e.createElement(ze,{className:c.autocomplete,"data-testid":"rule-select",getOptionLabel:E=>E.name,getOptionSelected:(E,h)=>E.name===h.name,options:u,onChange:(E,h)=>s(h?h.name:null),renderInput:E=>e.createElement(e.Fragment,null,e.createElement(p,{marginBottom:2},e.createElement(be,null,"Rule")),e.createElement(le,{...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:i||null,PopperComponent:E=>e.createElement(In,{...E,style:{width:"auto"},placement:"bottom-start"})})),e.createElement(p,{flex:"1"},e.createElement(p,{display:"flex",flexDirection:"column"},e.createElement(Ia,{rule:i,onChange:f,value:n})))))),e.createElement(p,{ml:1},e.createElement(H,{"aria-label":"delete",onClick:r,size:"small"},e.createElement(ie,null))))}function Kt({level:t,resourceType:n,onChange:a,parentConditionType:l,isRoot:r=!1}){const o=de(),c=w((y,d)=>{const g=[...t.children];return g.splice(y,1,d),g},[t]),m=w(y=>{a({...t,children:y})},[a,t]),u=w(y=>{y===null?a(null):y==="not"&&t.children.length>1?a({...t,levelType:y,children:t.children.slice(0,1)}):a({...t,levelType:y})},[a,t]),i=w((y,d)=>{m(y===null?qt(t.children,d):c(d,y))},[t,m,c]),s=y=>{const d=re();y==="condition"?m([...t.children,Ae()]):y==="not"?m([...t.children,{id:d,levelType:y,children:[]}]):ua(y)&&m([...t.children,{id:d,levelType:y,children:[Ae()]}])},f=y=>{m(qt(t.children,y))},E=$(()=>t.children.map((y,d)=>(g,P)=>{m(c(d,{...y,ruleName:g,parameters:P}))}),[t.children,m,c]),h=$(()=>t.children.map((y,d)=>g=>i(g,d)),[t.children,i]);return e.createElement("div",null,!r&&e.createElement("div",{className:o.treeHorizontalSpacer}),e.createElement(p,{display:"flex",alignItems:"center",position:"relative"},!r&&e.createElement(e.Fragment,null,e.createElement("div",{className:l==="not"?o.treeVerticalBranchHalf:o.treeVerticalBranchFull}),e.createElement("div",{className:o.treeHorizontalBranch})),e.createElement(Oa,{level:t,onSelect:u})),e.createElement(p,{display:"flex"},r||l==="not"?e.createElement(p,{pl:2}):e.createElement("div",{className:o.treeVerticalSpacer}),!r&&e.createElement(p,{pl:2}),e.createElement("div",null,t.children.map((y,d)=>ue(y)?e.createElement(p,{key:y.id},e.createElement(Kt,{level:y,resourceType:n,parentConditionType:t.levelType,onChange:h[d]})):e.createElement(pe,{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(Jt,{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(Yt,{onSelect:s}))))))}function qt(t,n){const a=[...t];return a.splice(n,1),a}function Oa({level:t,onSelect:n}){const a=de(),l=t.children.length>1;return e.createElement(p,{display:"flex",alignItems:"center"},e.createElement(Le,{className:a.conditionTypeFormControl},e.createElement(Fe,{value:t.levelType,onChange:r=>n?.(r.target.value)},e.createElement(ne,{key:"anyOf",value:"anyOf"},"Any of"),e.createElement(ne,{key:"allOf",value:"allOf"},"All of"),e.createElement(ne,{key:"not",value:"not",disabled:l},"Not"))),e.createElement(p,{ml:1},e.createElement(H,{"aria-label":"delete",onClick:()=>n?.(null),size:"small"},e.createElement(ie,null))))}const Ma=N(t=>({indicator:{right:"unset"},tab:{maxWidth:"none","&.Mui-selected":{backgroundColor:Lt(t),color:t.palette.primary.main}}}));function _a({options:t,selected:n,onChange:a,readonly:l=!1}){const r=Ma();return e.createElement(Bn,{orientation:"vertical",value:t.map(({id:o})=>o).indexOf(n),onChange:(o,c)=>a(t[c].id),indicatorColor:"primary",TabIndicatorProps:{className:r.indicator}},t.map(o=>e.createElement(On,{key:o.id,label:o.displayText.toUpperCase(),className:r.tab,disabled:l})))}function $a(t){return t?{id:t.id,match:La(t),decisionType:Fa(t),criteria:je(t.decision)?Ne(t.decision.conditions):null}:{id:re(),match:{method:"specificPermission"},decisionType:"allow",criteria:null}}function La(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 Fa(t){return typeof t.decision=="string"?t.decision:"conditional"}function Ne(t){const n=re();return Jn(t)?{id:n,levelType:"allOf",children:t.allOf.map(a=>Ne(a))}:Kn(t)?{id:n,levelType:"anyOf",children:t.anyOf.map(a=>Ne(a))}:qn(t)?{id:n,levelType:"not",children:[Ne(t.not)]}:{id:n,ruleName:t.rule,parameters:t.params}}function Xt(t,n){if(!t)return!1;if(ue(t))return t.children.length>0&&t.children.every(l=>Xt(l,n));if(!t.ruleName)return!1;const a=n?.find(({name:l})=>l===t.ruleName);return a?a.paramsSchema?new gt({allErrors:!0}).compile(a.paramsSchema)(t.parameters):!0:!1}function ja(t,n,a){return{id:t,match:Zt(n,a),decision:a}}function Zt({method:t,...n},a){return t==="all"?"*":a&&je(a)?{resourceType:a.resourceType,...n}:n}function tt(t){return Qe(t)?{rule:t.ruleName,params:t.parameters}:t.levelType==="not"?{not:tt(t.children[0])}:{[t.levelType]:t.children.map(n=>tt(n))}}const nt=N(t=>({dialogTitle:{display:"flex",alignItems:"center",justifyContent:"space-between"},fullWidth:{width:"100%","& > *":{flexGrow:1}},infoIcon:{position:"absolute",right:t.spacing(3)},content:{padding:t.spacing(7)},saveButton:{paddingLeft:t.spacing(5),paddingRight:t.spacing(5)},contentContainerConditional:{display:"flex",gap:t.spacing(5),maxWidth:1480}})),Ha={specificPermission:"Choose a specific permission",filter:"Filter by permission properties",all:"Match all permissions"},Qt="Choose the name of a resource permission or filter by resource type to set a conditional decision.";function Va({rolePermission:t,readonly:n=!1,onClose:a,onSave:l}){const r=nt(),o=vt(),c=bt(),m=vr(),u=$a(t),[i,s]=B(u.match),[f,E]=B(u.decisionType),[h,y]=B(u.criteria),d=$(()=>Wa(o,i),[o,i]),g=f==="conditional",P=g?"xl":"sm";G(()=>{g&&o&&!d.commonResourceType&&E("allow")},[g,o,d.commonResourceType,E]);const S=T=>{T!==null&&E(T)},I=$(()=>i.method==="specificPermission"&&!i.name||i.method==="filter"&&!i.resourceType&&!i.actions,[i]),A=$(()=>d.permissions.length===0?!1:!I,[d,I]),F=$(()=>f!=="conditional"?!0:!(!d.commonResourceType||!m?.[d.commonResourceType].pluginId||!Xt(h,c)),[f,d,m,h,c]),O=()=>{l?.(ja(u.id,i,f==="conditional"?{resourceType:d.commonResourceType,pluginId:m[d.commonResourceType].pluginId,conditions:tt(h)}:f))};return e.createElement(te,{open:!0,maxWidth:P,onClose:a,fullWidth:!0},e.createElement(ge,{disableTypography:!0,className:r.dialogTitle},e.createElement(D,{variant:"h4",component:"h2"},"New Permission Decision"),e.createElement(x,{startIcon:e.createElement(ve,null),onClick:a},"Close")),e.createElement(q,{dividers:!0,className:r.content},e.createElement(p,{className:g?r.contentContainerConditional:void 0},e.createElement(p,{mb:5,flex:1},e.createElement(_a,{options:Object.entries(Ha).map(([T,C])=>({id:T,displayText:C})),selected:i.method,onChange:T=>s({method:T}),readonly:n})),e.createElement(p,{mb:5,height:189,flex:1},i.method==="specificPermission"&&e.createElement(za,{name:i.name,readonly:n,onNameChange:T=>s({...i,name:T})}),i.method==="filter"&&e.createElement(e.Fragment,null,e.createElement(Ga,{resourceType:i.resourceType,readonly:n,onResourceTypeChange:T=>s({...i,resourceType:T})}),e.createElement(Ya,{actions:i.actions,readonly:n,onActionsChange:T=>s({...i,actions:T.length?T:void 0})}),I?null:e.createElement(e.Fragment,null,e.createElement(p,{marginY:2},e.createElement(Mn,{variant:"middle"})),e.createElement(dt,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(ca,{value:f,exclusive:!0,fullWidth:!0,"aria-label":"Decision result",onChange:(T,C)=>S(C)},e.createElement(Ze,{value:"allow","aria-label":"Decision allowed",disabled:n},"Allow"),e.createElement(Ze,{value:"deny","aria-label":"Decision denied",disabled:n},"Deny"),e.createElement(Ze,{value:"conditional","aria-label":"Decision conditionally allowed",disabled:!d.commonResourceType||n},"Conditional")),!g&&!n&&e.createElement(he,{title:Qt},e.createElement(yt,{className:r.infoIcon,color:"primary","aria-label":Qt}))))),f==="conditional"&&!!d.commonResourceType&&e.createElement(Ba,{permissionCriteria:h,resourceType:d.commonResourceType,onUpdate:y,readonly:n}),!n&&e.createElement(p,{display:"flex",justifyContent:"flex-end"},e.createElement(x,{variant:"contained",color:"primary",className:r.saveButton,onClick:O,disabled:!A||!F},"Save"))))}function Wa(t,n){const a=(t??[]).filter(o=>Xn(o,Zt(n))),l=or(a,"resourceType"),r=l.length===1&&at(l[0])?l[0].resourceType:void 0;return{permissions:a,commonResourceType:r}}const en="Permission name";function za({name:t="",readonly:n,onNameChange:a}){const l=nt(),r=vt();return e.createElement(Le,{className:l.fullWidth,variant:"outlined",disabled:n},e.createElement(be,{id:"match-by-name-dropdown"},en),e.createElement(Fe,{labelId:"match-by-name-dropdown",label:en,value:r?t:"",onChange:o=>a?.(o.target.value)},r?.map(o=>e.createElement(ne,{key:o.name,value:o.name},o.name))))}const tn="Resource type";function Ga({resourceType:t="",readonly:n,onResourceTypeChange:a}){const l=nt(),r=Ct();return e.createElement(Le,{className:l.fullWidth,variant:"outlined",disabled:n},e.createElement(be,{id:"match-by-resource-dropdown"},tn),e.createElement(Fe,{labelId:"match-by-resource-dropdown",label:tn,value:r?t:"",onChange:o=>a?.(o.target.value),displayEmpty:!0},r?.map(o=>e.createElement(ne,{key:o,value:o},o))))}const Ua="Action";function Ya({actions:t,readonly:n,onActionsChange:a}){const l=["create","read","update","delete"];return e.createElement(ze,{multiple:!0,id:"match-by-attribute-dropdown",options:l,getOptionLabel:r=>r,value:t??[],onChange:(r,o)=>a?.(o),filterSelectedOptions:!0,renderInput:r=>e.createElement(le,{...r,variant:"outlined",label:Ua,placeholder:"Choose attributes",margin:"normal"}),disabled:n})}const Ja=N(t=>({closeButton:{color:t.palette.text.secondary}})),nn=({children:t,onConfirm:n,message:a,title:l})=>{const r=Ja(),[o,c]=B(!1),m=()=>c(!1),u=()=>c(!0),i=()=>{n(),m()};return e.createElement(e.Fragment,null,t({onClick:u}),e.createElement(te,{open:o,onClose:m},e.createElement(ge,null,e.createElement(p,{display:"flex",justifyContent:"space-between",alignItems:"center"},l,e.createElement(x,{startIcon:e.createElement(ve,null),onClick:m,className:r.closeButton},"Close"))),e.createElement(q,null,e.createElement(_n,null,a)),e.createElement(Be,null,e.createElement(x,{"aria-label":"Cancel action",color:"primary",onClick:m},"Cancel"),e.createElement(x,{"aria-label":"Confirm action",color:"secondary",onClick:i,variant:"contained"},"Confirm"))))},rn=({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(he,{title:t},e.createElement(yt,{color:"primary","aria-label":t}))),an=(t,n,a)=>{const l=n+a;if(l<0||l>=t.length)return t;const r=[...t];return[r[l],r[n]]=[r[n],r[l]],r},ln=({array:t,index:n,onReorder:a})=>{const l=n===0,r=n===t.length-1;return e.createElement(p,{display:"flex"},e.createElement(H,{disabled:l,onClick:()=>a(an(t,n,-1)),"aria-label":"Move up",size:"small"},e.createElement(Er,null)),e.createElement(H,{disabled:r,onClick:()=>a(an(t,n,1)),"aria-label":"Move down",size:"small"},e.createElement(fr,null)))},on=t=>{if(t.success)return{};const n={};for(const a of t.error.issues)n[a.path.join(".")]=!0;return n},Ka=N(()=>({emptyStateImage:{width:"95%",zIndex:2,position:"relative",left:"50%",top:"50%",transform:"translate(-50%, 15%)"}}));function cn({src:t,alt:n}){const a=Ka();return e.createElement("img",{src:t,className:`${a.emptyStateImage} `,alt:n})}const qa="Use the arrows to change the order in which permission decisions are evaluated.";function Xa(){const{roleId:t,versionId:n}=rt();return He(t),He(n),e.createElement(Pe,{policyId:n},e.createElement(Za,{roleId:t}))}function Za({roleId:t}){const{diff:n,updateLocalDraft:a,policy:l}=ae(),r=l.roles.find(C=>C.id===t),o=n?.roles[t],[c,m]=B(null),[u,i]=B(!1),s=we(),{NotFoundErrorPage:f}=s.getComponents(),E=Y(),y=N(C=>({cardContainer:{margin:C.spacing(0)}}))();if(!r)return e.createElement(f,null);const d=r.name,g=C=>{const M=l.roles.findIndex(z=>z.id===C.id),R=[...l.roles];R.splice(M,1,C),a({...l,roles:R})},P=C=>{g({...r,name:C})},S=C=>{if(c===null)g({...r,permissions:[C,...r.permissions]});else{const M=[...r.permissions];M.splice(c,1,C),g({...r,permissions:M})}i(!1)},I=C=>{if(C==="*")g({...r,members:r.members==="*"?[]:"*"});else if(r.members==="*")g({...r,members:[C]});else{const M=r.members.includes(C)?r.members.filter(R=>R!==C):[...r.members,C];g({...r,members:M.length===0?"*":M})}},A=C=>{g({...r,permissions:r.permissions.filter((M,R)=>C!==R)})},F=C=>{g({...r,permissions:C})},O=on(Zn.safeParse(r)).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(Ot,null,l.name," \xA0\u01C0",T?e.createElement(e.Fragment,null,"\xA0",d):e.createElement(Ft,{invalid:O,value:d,onTextChange:P}),e.createElement(me,{operation:o?.role.operation,size:"large"})),description:l.description},e.createElement(x,{variant:"outlined",color:"primary",onClick:()=>E("../..",{relative:"path"})},"Back to policy"))},e.createElement(V,{container:!0,className:y.cardContainer,spacing:4,direction:"row"},e.createElement(V,{item:!0,xs:6},e.createElement(K,null,e.createElement(aa,{diff:o||null,role:r,policyId:l.id,onToggleMember:I,readonly:T}))),e.createElement(V,{item:!0,xs:6},e.createElement(K,null,e.createElement(Qa,{diff:o||null,permissions:r.permissions,onNewPermissionClick:()=>{m(null),i(!0)},onOpenPermission:C=>{m(C),i(!0)},onReorderPermissions:F,onRemovePermissionClick:A,readonly:T}))))),u&&e.createElement(Va,{rolePermission:c!==null?r.permissions[c]:void 0,onClose:()=>i(!1),onSave:S,readonly:T}))}function Qa({diff:t,permissions:n,onReorderPermissions:a,onNewPermissionClick:l,onOpenPermission:r,onRemovePermissionClick:o,readonly:c=!1}){return e.createElement(e.Fragment,null,e.createElement(p,{display:"flex",justifyContent:"space-between",padding:2},e.createElement(D,{variant:"h5"},"Permission Decisions"),!c&&n.length!==0&&e.createElement(x,{color:"primary",variant:"outlined",startIcon:e.createElement(Ve,null),onClick:l},"New")),e.createElement(Me,null,e.createElement(_e,null,e.createElement(W,null,!c&&e.createElement(v,{style:{width:0}},e.createElement(rn,{helpText:qa})),e.createElement(v,null,"Match by"),e.createElement(v,null,"Decision"),e.createElement(v,null),!c&&e.createElement(v,null))),e.createElement($e,null,n.length===0&&e.createElement(W,null,e.createElement(v,{colSpan:5},e.createElement(Ee,{title:"No permission decisions set",description:"Click the button below to create your first permission.",missing:{customImage:e.createElement(cn,{src:yr,alt:"No permission placeholder"})},action:e.createElement(x,{variant:"contained",color:"primary",onClick:l},"New permission decision")}))),n.map((m,u)=>e.createElement(W,{key:u},!c&&e.createElement(v,null,e.createElement(ln,{array:n,index:u,onReorder:a})),e.createElement(v,null,e.createElement(ee,{to:"#",component:"button",onClick:()=>r(u)},Ke(m))),e.createElement(v,null,wr(m)),e.createElement(v,null,e.createElement(me,{operation:t?.permissions[m.id].operation})),!c&&e.createElement(v,{align:"right"},e.createElement(nn,{message:"Are you sure you want to remove this permission decision?",onConfirm:()=>o(u),title:"Remove?"},i=>e.createElement(H,{...i,"aria-label":"Remove permission decision",size:"small"},e.createElement(ie,null)))))))))}const el="Use the arrows to change the order in which roles are evaluated.";function tl({}){const{diff:t,policy:n,createNewRole:a,updateLocalDraft:l}=ae(),r=Y(),o=nl(n),c=n.status!=="draft",m=s=>{l({...n,roles:s})},u=s=>{l({...n,roles:n.roles.filter(({id:f})=>f!==s)})},i=()=>{r(`./roles/${a()}`)};return e.createElement(K,null,e.createElement(p,{display:"flex",justifyContent:"space-between",padding:2},e.createElement(D,{variant:"h5"},"Roles"),!c&&e.createElement(x,{color:"primary",variant:"outlined",startIcon:e.createElement(Ve,null),onClick:()=>i()},"New role")),e.createElement(Me,null,e.createElement(_e,null,e.createElement(W,null,!c&&e.createElement(v,{style:{width:0}},e.createElement(rn,{helpText:el})),e.createElement(v,null,"Name"),e.createElement(v,null,"Users"),e.createElement(v,null,"Groups"),!c&&e.createElement(v,{style:{width:0}}))),e.createElement($e,null,o.map((s,f)=>e.createElement(W,{key:f},!c&&e.createElement(v,null,e.createElement(ln,{array:n.roles,index:f,onReorder:m})),e.createElement(v,null,e.createElement(p,{alignItems:"center",display:"flex",gridGap:8},e.createElement(ee,{to:`roles/${s.id}`},s.name),e.createElement(me,{operation:t?.roles[s.id].role.operation}))),e.createElement(v,null,s.userCount),e.createElement(v,null,s.groupCount),!c&&e.createElement(v,{align:"right"},e.createElement(nn,{message:"Are you sure you want to remove this role?",title:"Remove role?",onConfirm:()=>u(s.id)},E=>e.createElement(H,{...E,"aria-label":"Remove role",size:"small"},e.createElement(ie,null)))))))))}function nl(t){return t.roles.map(n=>({id:n.id,name:n.name,userCount:Array.isArray(n.members)?n.members.filter(a=>a.startsWith("user:")).length:n.members,groupCount:Array.isArray(n.members)?n.members.filter(a=>a.startsWith("group:")).length:n.members}))}function rl(){const{versionId:t}=rt();return He(t),e.createElement(Pe,{policyId:t},e.createElement(al,null))}function al(){const{policy:t,hasChanges:n,discardLocalDraft:a,saveLocalDraftToServer:l,updateLocalDraft:r}=ae(),o=s=>{r({...t,name:s})},c=on(Qn.safeParse(t)).name,m=t.status!=="draft",u=Ce.safeParse(t).success,i=n&&u;return e.createElement(Xe,{pages:[{title:t.name}],header:e.createElement(ke,{title:t.name,titleComponent:e.createElement(Ot,null,m?t.name:e.createElement(Ft,{invalid:c,name:"Policy name",value:t.name,onTextChange:o}),e.createElement(Tt,{status:t.status})),description:il(t)},e.createElement(p,{display:"flex",gridGap:8},e.createElement(x,{variant:"outlined",color:"primary",onClick:()=>Dt(t)},"Export"),t.status==="draft"&&e.createElement(e.Fragment,null,n&&e.createElement(x,{variant:"outlined",color:"secondary",onClick:a},"Discard changes"),e.createElement(x,{variant:"outlined",color:"primary",onClick:l,disabled:!i},"Save draft")),t.status!=="active"&&e.createElement(Bt,{color:"primary",variant:"contained"})))},e.createElement(V,{item:!0,xs:12},t.roles.length>0?e.createElement(tl,null):e.createElement(ol,{readonly:m})))}const ll=N(t=>({cardHeader:{padding:t.spacing(3,3),borderBottom:`1px solid ${t.palette.border}`},cardContent:{padding:t.spacing(6,3),"& > *":{background:"transparent"}},emptyStateImage:{width:"95%",zIndex:2,position:"relative",left:"50%",top:"50%",transform:"translate(-50%, 15%)"}}));function ol({readonly:t}){const n=ll(),a=Y(),{createNewRole:l}=ae(),r=()=>{const o=l();a(`./roles/${o}`)};return e.createElement(K,null,e.createElement($n,{title:"Roles",className:n.cardHeader}),e.createElement(ye,{className:n.cardContent},t?e.createElement(Ee,{title:"No roles configured",missing:"content"}):e.createElement(Ee,{title:"No roles yet",description:"Click the button below to create your first role.",missing:{customImage:e.createElement(cn,{src:gr,alt:"No roles placeholder"})},action:e.createElement(x,{variant:"contained",color:"primary",onClick:()=>r()},"New role")})))}function il(t){if(t.lastPublishedAt){const a=L.fromISO(t.lastPublishedAt);return`Last published by ${t.lastPublishedBy} on ${a.toLocaleString(L.DATETIME_MED_WITH_SECONDS)}`}if(t.createdAt!==t.updatedAt){const a=L.fromISO(t.updatedAt);return`Last updated by ${t.updatedBy} on ${a.toLocaleString(L.DATETIME_MED_WITH_SECONDS)}`}const n=L.fromISO(t.createdAt);return`Created by ${t.createdBy} on ${n.toLocaleString(L.DATETIME_MED_WITH_SECONDS)}`}function cl(){const t=we(),{NotFoundErrorPage:n}=t.getComponents();return e.createElement(hr,{loading:e.createElement(fe,null),unauthorized:e.createElement(n,null)},e.createElement(Nr,null,e.createElement(br,null,e.createElement(dn,null,e.createElement(Re,{element:e.createElement(Jr,null),path:"/"}),e.createElement(Re,{element:e.createElement(rl,null),path:"/versions/:versionId"}),e.createElement(Re,{element:e.createElement(Xa,null),path:"/versions/:versionId/roles/:roleId"})))))}export{cl as RBACRoot};
3
- //# sourceMappingURL=Root-e3ab1bbe.esm.js.map