@spotify/backstage-plugin-rbac 0.7.7 → 0.7.8

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.
Files changed (93) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/alpha/pages.esm.js +1 -1
  3. package/dist/alpha.d.ts +7 -6
  4. package/dist/components/Auth/Authorized.esm.js +1 -1
  5. package/dist/components/ConfirmationDialog/ConfirmationDialog.esm.js +1 -1
  6. package/dist/components/DecisionDialog/ConditionalDecisionForm/AddConditionSelector.esm.js +1 -1
  7. package/dist/components/DecisionDialog/ConditionalDecisionForm/ConditionCard.esm.js +1 -1
  8. package/dist/components/DecisionDialog/ConditionalDecisionForm/ConditionTree.esm.js +1 -1
  9. package/dist/components/DecisionDialog/ConditionalDecisionForm/ConditionTypeSelector.esm.js +1 -1
  10. package/dist/components/DecisionDialog/ConditionalDecisionForm/ConditionalDecisionForm.esm.js +1 -1
  11. package/dist/components/DecisionDialog/ConditionalDecisionForm/CriteriaSummary/ConditionLevelSummary.esm.js +1 -1
  12. package/dist/components/DecisionDialog/ConditionalDecisionForm/CriteriaSummary/ConditionSummary.esm.js +1 -1
  13. package/dist/components/DecisionDialog/ConditionalDecisionForm/CriteriaSummary/ConditionalDecisionBox.esm.js +1 -1
  14. package/dist/components/DecisionDialog/ConditionalDecisionForm/CriteriaSummary/CriteriaSummary.esm.js +1 -1
  15. package/dist/components/DecisionDialog/ConditionalDecisionForm/CriteriaSummary/Indent.esm.js +1 -1
  16. package/dist/components/DecisionDialog/ConditionalDecisionForm/CriteriaSummary/MonospaceText.esm.js +1 -1
  17. package/dist/components/DecisionDialog/DecisionDialog.esm.js +1 -1
  18. package/dist/components/DecisionDialog/MatchByActions.esm.js +1 -1
  19. package/dist/components/DecisionDialog/MatchByName.esm.js +1 -1
  20. package/dist/components/DecisionDialog/MatchByResourceType.esm.js +1 -1
  21. package/dist/components/DecisionDialog/ParamsForm/ParamsForm.esm.js +1 -1
  22. package/dist/components/DecisionDialog/ParamsForm/ParamsFormArrayInput.esm.js +1 -1
  23. package/dist/components/DecisionDialog/ParamsForm/ParamsFormBooleanInput.esm.js +1 -1
  24. package/dist/components/DecisionDialog/ParamsForm/ParamsFormInput.esm.js +1 -1
  25. package/dist/components/DecisionDialog/ParamsForm/ParamsFormInputRouter.esm.js +1 -1
  26. package/dist/components/DecisionDialog/ParamsForm/ParamsFormJSONEditor.esm.js +1 -1
  27. package/dist/components/DecisionDialog/ParamsForm/ParamsFormStandard.esm.js +1 -1
  28. package/dist/components/DecisionDialog/ToggleButtonGroup.esm.js +1 -1
  29. package/dist/components/DecisionDialog/VerticalSelection.esm.js +1 -1
  30. package/dist/components/Diffing/DiffBadge.esm.js +1 -1
  31. package/dist/components/Diffing/DiffSummary.esm.js +1 -1
  32. package/dist/components/EditableInput/EditableInput.esm.js +1 -1
  33. package/dist/components/Home/HomePage.esm.js +1 -1
  34. package/dist/components/Home/HomePageContent.esm.js +1 -1
  35. package/dist/components/Home/HomePageEmptyState.esm.js +1 -1
  36. package/dist/components/Layout/Breadcrumbs.esm.js +1 -1
  37. package/dist/components/Layout/EmptyStateImageWrapper.esm.js +1 -1
  38. package/dist/components/Layout/PageWrapper.esm.js +1 -1
  39. package/dist/components/Layout/Title.esm.js +1 -1
  40. package/dist/components/Members/MemberLabel.esm.js +1 -1
  41. package/dist/components/Members/MemberOptionsProvider.esm.js +1 -1
  42. package/dist/components/Members/MembersAutocomplete.esm.js +1 -1
  43. package/dist/components/Members/MembersAutocompleteListBox.esm.js +1 -1
  44. package/dist/components/Members/MembersTable.esm.js +1 -1
  45. package/dist/components/Members/MembersTableBody.esm.js +1 -1
  46. package/dist/components/Permission/PermissionName.esm.js +1 -1
  47. package/dist/components/Permissions/PermissionsMetadataContext.esm.js +1 -1
  48. package/dist/components/Permissions/PermissionsTable.esm.js +1 -1
  49. package/dist/components/Policies/PoliciesProvider.esm.js +1 -1
  50. package/dist/components/Policies/PoliciesTable.esm.js +1 -1
  51. package/dist/components/Policy/EmptyRolesCard.esm.js +1 -1
  52. package/dist/components/Policy/PolicyCard.esm.js +1 -1
  53. package/dist/components/Policy/PolicyConflictDialog.esm.js +1 -1
  54. package/dist/components/Policy/PolicyImportButton.esm.js +1 -1
  55. package/dist/components/Policy/PolicyInvalidDialog.esm.js +1 -1
  56. package/dist/components/Policy/PolicyMenu.esm.js +1 -1
  57. package/dist/components/Policy/PolicyOptionCard.esm.js +1 -1
  58. package/dist/components/Policy/PolicyOptionsPage.esm.js +1 -1
  59. package/dist/components/Policy/PolicyPage.esm.js +1 -1
  60. package/dist/components/Policy/PolicyProvider.esm.js +1 -1
  61. package/dist/components/Policy/PolicyPublishButton.esm.js +1 -1
  62. package/dist/components/Policy/PolicyPublishConfirmationDialog.esm.js +1 -1
  63. package/dist/components/Policy/PolicyPublishSuccessDialog.esm.js +1 -1
  64. package/dist/components/Policy/PolicyStatusChip.esm.js +1 -1
  65. package/dist/components/Policy/useDuplicatePolicy.esm.js +1 -1
  66. package/dist/components/PolicyTester/DecisionBreakdownTable/CellText.esm.js +1 -1
  67. package/dist/components/PolicyTester/DecisionBreakdownTable/DecidingRoleCell.esm.js +1 -1
  68. package/dist/components/PolicyTester/DecisionBreakdownTable/DecisionBreakdownTable.esm.js +1 -1
  69. package/dist/components/PolicyTester/DecisionBreakdownTable/DecisionCell.esm.js +1 -1
  70. package/dist/components/PolicyTester/DecisionBreakdownTable/PermissionNameCell.esm.js +1 -1
  71. package/dist/components/PolicyTester/DecisionBreakdownTable/RoleNameCell.esm.js +1 -1
  72. package/dist/components/PolicyTester/DecisionBreakdownTable/TableHeaderCell.esm.js +1 -1
  73. package/dist/components/PolicyTester/DecisionBreakdownTable/UserIconCell.esm.js +1 -1
  74. package/dist/components/PolicyTester/DecisionIcon.esm.js +1 -1
  75. package/dist/components/PolicyTester/DecisionInfo.esm.js +1 -1
  76. package/dist/components/PolicyTester/PolicyTestResultDetails.esm.js +1 -1
  77. package/dist/components/PolicyTester/PolicyTester.esm.js +1 -1
  78. package/dist/components/PolicyTester/PolicyTesterFieldset.esm.js +1 -1
  79. package/dist/components/PolicyTester/PolicyTesterPermissionSelect.esm.js +1 -1
  80. package/dist/components/PolicyTester/PolicyTesterResultRow.esm.js +1 -1
  81. package/dist/components/PolicyTester/PolicyTesterResults.esm.js +1 -1
  82. package/dist/components/PolicyTester/PolicyTesterRoleSelect.esm.js +1 -1
  83. package/dist/components/PolicyTester/StatusChip.esm.js +1 -1
  84. package/dist/components/RBACSidebarItem.esm.js +1 -1
  85. package/dist/components/RelativeTime/RelativeTime.esm.js +1 -1
  86. package/dist/components/ReorderControls/ReorderControls.esm.js +1 -1
  87. package/dist/components/ReorderControls/ReorderInfo.esm.js +1 -1
  88. package/dist/components/Role/RolePage.esm.js +1 -1
  89. package/dist/components/Roles/RolesTable.esm.js +1 -1
  90. package/dist/components/Root.esm.js +1 -1
  91. package/dist/hooks/useFeatureFlag.esm.js +2 -0
  92. package/dist/index.d.ts +1 -2
  93. package/package.json +19 -19
@@ -1,2 +1,2 @@
1
- import{AuthorizeResult as o}from"@backstage/plugin-permission-common";import{makeStyles as n,Typography as i}from"@material-ui/core";import t from"react";import{CriteriaSummary as s}from"../DecisionDialog/ConditionalDecisionForm/CriteriaSummary/CriteriaSummary.esm.js";import{getCriteria as a}from"../DecisionDialog/decisionDataMappers.esm.js";import{DecisionBreakdownTable as m}from"./DecisionBreakdownTable/DecisionBreakdownTable.esm.js";import{DecisionInfo as l}from"./DecisionInfo.esm.js";const c=n(e=>({heading:{fontWeight:"bold"},subtitle:{color:e.palette.text.secondary},criteriaSummarySpacing:{marginBottom:e.spacing(3)}})),p=({resultRow:e})=>{const r=c();return t.createElement(t.Fragment,null,e.roles.length>0?t.createElement(t.Fragment,null,t.createElement(i,{variant:"body1",component:"h6",className:r.heading},"Decision breakdown"),t.createElement(i,{variant:"subtitle1",component:"p",className:r.subtitle},"See what role results in this decision."),t.createElement(m,{resultRow:e})):null,e.decision.result===o.CONDITIONAL?t.createElement("div",{className:r.criteriaSummarySpacing},t.createElement(s,{permissionCriteria:a(e.decision.conditions)})):null,t.createElement(l,{roles:e.roles,permission:e.permission,decision:e.decision,decisionOrigin:e.decisionOrigin}))};export{p as PolicyTestResultDetails};
1
+ import{jsxs as r,Fragment as t,jsx as e}from"react/jsx-runtime";import{AuthorizeResult as s}from"@backstage/plugin-permission-common";import{makeStyles as a,Typography as n}from"@material-ui/core";import{CriteriaSummary as l}from"../DecisionDialog/ConditionalDecisionForm/CriteriaSummary/CriteriaSummary.esm.js";import{getCriteria as c}from"../DecisionDialog/decisionDataMappers.esm.js";import{DecisionBreakdownTable as m}from"./DecisionBreakdownTable/DecisionBreakdownTable.esm.js";import{DecisionInfo as d}from"./DecisionInfo.esm.js";const p=a(i=>({heading:{fontWeight:"bold"},subtitle:{color:i.palette.text.secondary},criteriaSummarySpacing:{marginBottom:i.spacing(3)}})),u=({resultRow:i})=>{const o=p();return r(t,{children:[i.roles.length>0?r(t,{children:[e(n,{variant:"body1",component:"h6",className:o.heading,children:"Decision breakdown"}),e(n,{variant:"subtitle1",component:"p",className:o.subtitle,children:"See what role results in this decision."}),e(m,{resultRow:i})]}):null,i.decision.result===s.CONDITIONAL?e("div",{className:o.criteriaSummarySpacing,children:e(l,{permissionCriteria:c(i.decision.conditions)})}):null,e(d,{roles:i.roles,permission:i.permission,decision:i.decision,decisionOrigin:i.decisionOrigin})]})};export{u as PolicyTestResultDetails};
2
2
  //# sourceMappingURL=PolicyTestResultDetails.esm.js.map
@@ -1,2 +1,2 @@
1
- import{makeStyles as w,Card as x,CardHeader as B,CardContent as N,Typography as k,Box as p,Button as d}from"@material-ui/core";import I from"@material-ui/icons/Clear";import e,{useMemo as y,useRef as L,useState as b,useEffect as M}from"react";import{usePermissions as W}from"../Permissions/PermissionsMetadataContext.esm.js";import{usePolicyContext as q}from"../Policy/PolicyProvider.esm.js";import{PolicyTesterFieldset as f}from"./PolicyTesterFieldset.esm.js";import{PolicyTesterPermissionSelect as F}from"./PolicyTesterPermissionSelect.esm.js";import{PolicyTesterResults as G}from"./PolicyTesterResults.esm.js";import{PolicyTesterRoleSelect as H}from"./PolicyTesterRoleSelect.esm.js";import{usePolicyTesterLocalStorageStrings as h}from"./usePolicyTesterLocalStorageStrings.esm.js";import{usePolicyTestResult as U}from"./usePolicyTestResult.esm.js";const j=w(t=>({clearButton:{marginLeft:t.spacing(1)}}));function z(){const{policy:t}=q(),{permissions:n,isLoading:g}=W(),E=y(()=>t.roles.map(o=>o.id),[t.roles]),P=y(()=>n?.map(o=>o.name)||[],[n]),a=L(null),[c,m]=h("roleIds",E),[r,u]=h("permissionNames",P,g),[T,s]=b(""),[l,S,i]=U();M(()=>{i()},[t.roles,t.options,i]);const C=()=>{r.length===0?(a.current?.firstChild?.focus(),s("Please select at least one permission.")):S(c,r)},R=()=>{m([]),u([]),i(),s("")},v=j();return e.createElement(x,null,e.createElement(B,{title:"Policy Tester"}),e.createElement(N,null,e.createElement(k,{variant:"body1",component:"p"},"Use the policy tester to check if your changes will provide the access you intended for a user that has the roles you select below."),e.createElement(f,{title:"Which permissions do you want to test?"},e.createElement(F,{selectedPermissionNames:r,setSelectedPermissionNames:o=>{u(o),o.length>0&&s("")},ref:a,errorMessage:T})),e.createElement(f,{title:"Which roles should the simulated user have?"},e.createElement(H,{selectedRoleIds:c,setSelectedRoleIds:m})),e.createElement(p,{marginTop:3,component:"section"},e.createElement(d,{onClick:C,variant:"contained",color:"primary"},"Run tests"),e.createElement(d,{className:v.clearButton,color:"primary",variant:"outlined",startIcon:e.createElement(I,null),onClick:R},"Clear")),l&&l.length?e.createElement(p,{sx:{flexGrow:1},marginTop:4},e.createElement(G,{results:l,resolutionStrategy:t.options.resolutionStrategy})):null))}export{z as PolicyTester};
1
+ import{jsxs as n,jsx as e}from"react/jsx-runtime";import{useAnalytics as w}from"@backstage/core-plugin-api";import{makeStyles as B,Card as N,CardHeader as I,CardContent as _,Typography as j,Box as d,Button as h}from"@material-ui/core";import L from"@material-ui/icons/Clear";import{useMemo as y,useRef as E,useState as M,useEffect as W}from"react";import{useFeatureFlags as A}from"../../hooks/useFeatureFlag.esm.js";import{usePermissions as D}from"../Permissions/PermissionsMetadataContext.esm.js";import{usePolicyContext as G}from"../Policy/PolicyProvider.esm.js";import{PolicyTesterFieldset as f}from"./PolicyTesterFieldset.esm.js";import{PolicyTesterPermissionSelect as H}from"./PolicyTesterPermissionSelect.esm.js";import{PolicyTesterResults as J}from"./PolicyTesterResults.esm.js";import{PolicyTesterRoleSelect as U}from"./PolicyTesterRoleSelect.esm.js";import{usePolicyTesterLocalStorageStrings as g}from"./usePolicyTesterLocalStorageStrings.esm.js";import{usePolicyTestResult as q}from"./usePolicyTestResult.esm.js";const z=B(t=>({clearButton:{marginLeft:t.spacing(1)}}));function K(){const{policy:t}=G(),P=w(),T=A(),{permissions:c,isLoading:S}=D(),C=y(()=>t.roles.map(o=>o.id),[t.roles]),k=y(()=>c?.map(o=>o.name)||[],[c]),a=E(null),[m,p]=g("roleIds",C),[r,u]=g("permissionNames",k,S),[R,s]=M(""),[i,v,l]=q();W(()=>{l()},[t.roles,t.options,l]);const x=async()=>{r.length===0?(a.current?.firstChild?.focus(),s("Please select at least one permission.")):(await v(m,r),P.captureEvent("click","run_policy_tests",{attributes:{clickType:"run_policy_tests",clickDetail:t.id,rbacFeatureFlags:T.join(",")}}))},F=()=>{p([]),u([]),l(),s("")},b=z();return n(N,{children:[e(I,{title:"Policy Tester"}),n(_,{children:[e(j,{variant:"body1",component:"p",children:"Use the policy tester to check if your changes will provide the access you intended for a user that has the roles you select below."}),e(f,{title:"Which permissions do you want to test?",children:e(H,{selectedPermissionNames:r,setSelectedPermissionNames:o=>{u(o),o.length>0&&s("")},ref:a,errorMessage:R})}),e(f,{title:"Which roles should the simulated user have?",children:e(U,{selectedRoleIds:m,setSelectedRoleIds:p})}),n(d,{marginTop:3,component:"section",children:[e(h,{onClick:x,variant:"contained",color:"primary",children:"Run tests"}),e(h,{className:b.clearButton,color:"primary",variant:"outlined",startIcon:e(L,{}),onClick:F,children:"Clear"})]}),i&&i.length?e(d,{sx:{flexGrow:1},marginTop:4,children:e(J,{results:i,resolutionStrategy:t.options.resolutionStrategy})}):null]})]})}export{K as PolicyTester};
2
2
  //# sourceMappingURL=PolicyTester.esm.js.map
@@ -1,2 +1,2 @@
1
- import{makeStyles as r,Typography as i}from"@material-ui/core";import t from"react";const s=r(e=>({fieldset:{border:"none",margin:`${e.spacing(3)}px 0 ${e.spacing(3)}px`,paddingLeft:"0"}})),a=({children:e,title:n})=>{const o=s();return t.createElement("fieldset",{className:o.fieldset},t.createElement(i,{variant:"h6",component:"legend"},n),e)};export{a as PolicyTesterFieldset};
1
+ import{jsxs as r,jsx as s}from"react/jsx-runtime";import{makeStyles as i,Typography as o}from"@material-ui/core";const l=i(e=>({fieldset:{border:"none",margin:`${e.spacing(3)}px 0 ${e.spacing(3)}px`,paddingLeft:"0"}})),c=({children:e,title:t})=>{const n=l();return r("fieldset",{className:n.fieldset,children:[s(o,{variant:"h6",component:"legend",children:t}),e]})};export{c as PolicyTesterFieldset};
2
2
  //# sourceMappingURL=PolicyTesterFieldset.esm.js.map
@@ -1,2 +1,2 @@
1
- import{makeStyles as c,FormControl as o,InputLabel as p,Select as u,Input as d,Chip as y,MenuItem as E,Checkbox as f,ListItemText as b,FormHelperText as g}from"@material-ui/core";import e from"react";import{usePermissions as h}from"../Permissions/PermissionsMetadataContext.esm.js";const S=c(a=>({chipContainer:{marginTop:a.spacing(1),marginLeft:a.spacing(1),display:"flex",flexWrap:"wrap"}})),v=e.forwardRef(({selectedPermissionNames:a,setSelectedPermissionNames:m,errorMessage:l},i)=>{const s=S(),{permissions:n}=h();return e.createElement(e.Fragment,null,e.createElement(o,{fullWidth:!0,error:!!l},e.createElement(p,{id:"selectLabel"},"Select permissions"),e.createElement(u,{"data-testid":"policyTesterPermissionsSelect",ref:i,native:!1,displayEmpty:!0,multiple:!0,value:a,onChange:t=>m(t.target.value),input:e.createElement(d,null),"aria-labelledby":"selectLabel",renderValue:t=>e.createElement("div",{className:s.chipContainer,"aria-labelledby":"selectLabel"},n?.filter(r=>t.includes(r.name)).map(r=>e.createElement(y,{key:r.name,label:r.name})))},n?.map(t=>e.createElement(E,{key:t.name,value:t.name},e.createElement(f,{color:"primary",checked:a.includes(t.name),name:t.name,value:t.name,required:!0}),e.createElement(b,{primary:t.name})))),e.createElement(g,null,l)))});export{v as PolicyTesterPermissionSelect};
1
+ import{jsx as r,Fragment as c,jsxs as s}from"react/jsx-runtime";import{makeStyles as p,FormControl as d,InputLabel as u,Select as h,Input as f,Chip as b,MenuItem as y,Checkbox as g,ListItemText as x,FormHelperText as v}from"@material-ui/core";import{forwardRef as C}from"react";import{usePermissions as L}from"../Permissions/PermissionsMetadataContext.esm.js";const P=p(i=>({chipContainer:{marginTop:i.spacing(1),marginLeft:i.spacing(1),display:"flex",flexWrap:"wrap"}})),S=C(({selectedPermissionNames:i,setSelectedPermissionNames:t,errorMessage:l},m)=>{const o=P(),{permissions:n}=L();return r(c,{children:s(d,{fullWidth:!0,error:!!l,children:[r(u,{id:"selectLabel",children:"Select permissions"}),r(h,{"data-testid":"policyTesterPermissionsSelect",ref:m,native:!1,displayEmpty:!0,multiple:!0,value:i,onChange:e=>t(e.target.value),input:r(f,{}),"aria-labelledby":"selectLabel",renderValue:e=>r("div",{className:o.chipContainer,"aria-labelledby":"selectLabel",children:n?.filter(a=>e.includes(a.name)).map(a=>r(b,{label:a.name},a.name))}),children:n?.map(e=>s(y,{value:e.name,children:[r(g,{color:"primary",checked:i.includes(e.name),name:e.name,value:e.name,required:!0}),r(x,{primary:e.name})]},e.name))}),r(v,{children:l})]})})});export{S as PolicyTesterPermissionSelect};
2
2
  //# sourceMappingURL=PolicyTesterPermissionSelect.esm.js.map
@@ -1,2 +1,2 @@
1
- import{makeStyles as i,Accordion as s,AccordionSummary as l,Grid as o,Typography as n,AccordionDetails as a}from"@material-ui/core";import c from"@material-ui/icons/ExpandMore";import e from"react";import{PermissionName as m}from"../Permission/PermissionName.esm.js";import{DecisionIcon as d}from"./DecisionIcon.esm.js";import{PolicyTestResultDetails as p}from"./PolicyTestResultDetails.esm.js";import{StatusChip as u}from"./StatusChip.esm.js";function h({decision:t}){let r;switch(t.result){case"ALLOW":r={severity:"success",text:"Allow"};break;case"DENY":r={severity:"error",text:"Deny"};break;default:r={severity:"info",text:"Conditional"};break}return e.createElement(u,{text:r.text,severity:r.severity,icon:e.createElement(d,{authorizeResult:t.result}),title:`${r.text} decision chip`,size:"large"})}const E=i(t=>({permissionName:{display:"flex",alignItems:"center",height:"100%",fontWeight:"bold"},detailsContainer:{padding:`${t.spacing(2)}px ${t.spacing(1)}px 0`,borderTop:`1px solid ${t.palette.divider}`}})),x=({resultRow:t})=>{const r=E();return e.createElement(s,null,e.createElement(l,{expandIcon:e.createElement(c,null),"aria-controls":"result{$resultIndex}-content",id:t.permission.name},e.createElement(o,{container:!0},e.createElement(o,{item:!0,xs:12,md:4},e.createElement(n,{variant:"body1",className:r.permissionName,component:"h5"},e.createElement(m,{name:t.permission.name}))),e.createElement(o,{item:!0,xs:12,md:8},e.createElement(n,{variant:"body2"},t.roles.length>0?"For a user who has all the selected roles, the result will be:":"For a user with no assigned roles, the result will be:"),e.createElement(h,{decision:t.decision})))),e.createElement(a,null,e.createElement("div",{className:r.detailsContainer},e.createElement(p,{resultRow:t}))))};export{x as PolicyTesterResultRow};
1
+ import{jsxs as r,jsx as i}from"react/jsx-runtime";import{makeStyles as n,Accordion as l,AccordionSummary as a,Grid as o,Typography as s,AccordionDetails as c}from"@material-ui/core";import d from"@material-ui/icons/ExpandMore";import{PermissionName as m}from"../Permission/PermissionName.esm.js";import{DecisionIcon as p}from"./DecisionIcon.esm.js";import{PolicyTestResultDetails as h}from"./PolicyTestResultDetails.esm.js";import{StatusChip as u}from"./StatusChip.esm.js";function x({decision:e}){let t;switch(e.result){case"ALLOW":t={severity:"success",text:"Allow"};break;case"DENY":t={severity:"error",text:"Deny"};break;default:t={severity:"info",text:"Conditional"};break}return i(u,{text:t.text,severity:t.severity,icon:i(p,{authorizeResult:e.result}),title:`${t.text} decision chip`,size:"large"})}const y=n(e=>({permissionName:{display:"flex",alignItems:"center",height:"100%",fontWeight:"bold"},detailsContainer:{padding:`${e.spacing(2)}px ${e.spacing(1)}px 0`,borderTop:`1px solid ${e.palette.divider}`}})),f=({resultRow:e})=>{const t=y();return r(l,{children:[i(a,{expandIcon:i(d,{}),"aria-controls":"result{$resultIndex}-content",id:e.permission.name,children:r(o,{container:!0,children:[i(o,{item:!0,xs:12,md:4,children:i(s,{variant:"body1",className:t.permissionName,component:"h5",children:i(m,{name:e.permission.name})})}),r(o,{item:!0,xs:12,md:8,children:[i(s,{variant:"body2",children:e.roles.length>0?"For a user who has all the selected roles, the result will be:":"For a user with no assigned roles, the result will be:"}),i(x,{decision:e.decision})]})]})}),i(c,{children:i("div",{className:t.detailsContainer,children:i(h,{resultRow:e})})})]})};export{f as PolicyTesterResultRow};
2
2
  //# sourceMappingURL=PolicyTesterResultRow.esm.js.map
@@ -1,2 +1,2 @@
1
- import{makeStyles as l,Typography as a,Grid as n}from"@material-ui/core";import{Alert as o}from"@material-ui/lab";import t from"react";import{PolicyTesterResultRow as c}from"./PolicyTesterResultRow.esm.js";const m=l(e=>({header:{borderTop:`1px solid ${e.palette.divider}`,padding:`${e.spacing(3)}px ${e.spacing(1)}px`,borderBottom:`1px solid ${e.palette.divider}`},resultHeading:{marginBottom:e.spacing(1)},accordionHeader:{padding:`${e.spacing(1)}px ${e.spacing(6)}px ${e.spacing(1)}px ${e.spacing(0)}px`,margin:"0"}})),p=({results:e,resolutionStrategy:i})=>{const r=m();return e.length?t.createElement(t.Fragment,null,t.createElement("div",{className:r.header},t.createElement(a,{variant:"h5",component:"h4",color:"textPrimary",className:r.resultHeading},"Test results"),t.createElement(o,{severity:"info"},"All the tests are evaluated using"," ",t.createElement("strong",null,i),", which is the policy resolution strategy")),t.createElement(n,{container:!0,className:r.accordionHeader},t.createElement(n,{item:!0,xs:12,md:4},t.createElement(a,{variant:"body1",color:"textSecondary"},"Permission")),t.createElement(n,{item:!0,xs:12,md:8},t.createElement(a,{variant:"body1",color:"textSecondary"},"Result"))),e.map(s=>t.createElement(c,{resultRow:s,key:s.permission.name}))):null};export{p as PolicyTesterResults};
1
+ import{jsxs as t,Fragment as l,jsx as r}from"react/jsx-runtime";import{makeStyles as c,Typography as s,Grid as n}from"@material-ui/core";import{Alert as d}from"@material-ui/lab";import{PolicyTesterResultRow as p}from"./PolicyTesterResultRow.esm.js";const m=c(e=>({header:{borderTop:`1px solid ${e.palette.divider}`,padding:`${e.spacing(3)}px ${e.spacing(1)}px`,borderBottom:`1px solid ${e.palette.divider}`},resultHeading:{marginBottom:e.spacing(1)},accordionHeader:{padding:`${e.spacing(1)}px ${e.spacing(6)}px ${e.spacing(1)}px ${e.spacing(0)}px`,margin:"0"}})),g=({results:e,resolutionStrategy:o})=>{const i=m();return e.length?t(l,{children:[t("div",{className:i.header,children:[r(s,{variant:"h5",component:"h4",color:"textPrimary",className:i.resultHeading,children:"Test results"}),t(d,{severity:"info",children:["All the tests are evaluated using"," ",r("strong",{children:o}),", which is the policy resolution strategy"]})]}),t(n,{container:!0,className:i.accordionHeader,children:[r(n,{item:!0,xs:12,md:4,children:r(s,{variant:"body1",color:"textSecondary",children:"Permission"})}),r(n,{item:!0,xs:12,md:8,children:r(s,{variant:"body1",color:"textSecondary",children:"Result"})})]}),e.map(a=>r(p,{resultRow:a},a.permission.name))]}):null};export{g as PolicyTesterResults};
2
2
  //# sourceMappingURL=PolicyTesterResults.esm.js.map
@@ -1,2 +1,2 @@
1
- import{makeStyles as i,FormControl as m,InputLabel as o,Select as s,Input as p,Chip as d,MenuItem as u,Checkbox as y,ListItemText as E}from"@material-ui/core";import e from"react";import{usePolicyContext as b}from"../Policy/PolicyProvider.esm.js";const f=i(l=>({chipContainer:{marginTop:l.spacing(1),marginLeft:l.spacing(1),display:"flex",flexWrap:"wrap"}})),g=({selectedRoleIds:l,setSelectedRoleIds:n})=>{const c=f(),{policy:r}=b();return e.createElement(e.Fragment,null,e.createElement(m,{fullWidth:!0},e.createElement(o,{id:"selectLabel"},"Select roles"),e.createElement(s,{"data-testid":"policyTesterRolesSelect",native:!1,displayEmpty:!0,multiple:!0,value:l,onChange:t=>n(t.target.value),input:e.createElement(p,null),"aria-labelledby":"selectLabel",renderValue:t=>e.createElement("div",{className:c.chipContainer,"aria-labelledby":"selectLabel"},r.roles.filter(a=>t.includes(a.id)).map(a=>e.createElement(d,{key:a.name,label:a.name})))},r.roles.map(t=>e.createElement(u,{key:t.id,value:t.id},e.createElement(y,{color:"primary",checked:l.includes(t.id),name:t.name,value:t.id}),e.createElement(E,{primary:t.name}))))))};export{g as PolicyTesterRoleSelect};
1
+ import{jsx as l,Fragment as o,jsxs as r}from"react/jsx-runtime";import{makeStyles as s,FormControl as d,InputLabel as m,Select as p,Input as u,Chip as h,MenuItem as y,Checkbox as b,ListItemText as f}from"@material-ui/core";import{usePolicyContext as x}from"../Policy/PolicyProvider.esm.js";const g=s(i=>({chipContainer:{marginTop:i.spacing(1),marginLeft:i.spacing(1),display:"flex",flexWrap:"wrap"}})),C=({selectedRoleIds:i,setSelectedRoleIds:n})=>{const c=g(),{policy:t}=x();return l(o,{children:r(d,{fullWidth:!0,children:[l(m,{id:"selectLabel",children:"Select roles"}),l(p,{"data-testid":"policyTesterRolesSelect",native:!1,displayEmpty:!0,multiple:!0,value:i,onChange:e=>n(e.target.value),input:l(u,{}),"aria-labelledby":"selectLabel",renderValue:e=>l("div",{className:c.chipContainer,"aria-labelledby":"selectLabel",children:t.roles.filter(a=>e.includes(a.id)).map(a=>l(h,{label:a.name},a.name))}),children:t.roles.map(e=>r(y,{value:e.id,children:[l(b,{color:"primary",checked:i.includes(e.id),name:e.name,value:e.id}),l(f,{primary:e.name})]},e.id))})]})})};export{C as PolicyTesterRoleSelect};
2
2
  //# sourceMappingURL=PolicyTesterRoleSelect.esm.js.map
@@ -1,2 +1,2 @@
1
- import{makeStyles as n}from"@material-ui/core";import{Alert as a}from"@material-ui/lab";import o from"react";function r(t,e){switch(e){case"small":return t.typography.caption;case"medium":return t.typography.body1;case"large":return t.typography.subtitle1;default:return t.typography.caption}}function i(t){switch(t){case"small":return .2;case"medium":return .3;case"large":return 1;default:return .8}}const s=n(t=>({root:{display:"inline-flex",fontWeight:"bold",borderRadius:"1000px",margin:t.spacing(1),padding:t.spacing(0,1)},message:({size:e})=>({fontSize:r(t,e).fontSize,font:r(t,e).font,verticalAlign:"middle",padding:t.spacing(i(e),0,i(e),0)})}),{name:"MuiAlert"});function l(t){const e=s({size:t.size||"small"});return o.createElement(a,{classes:{root:e.root,message:e.message},role:"textbox",severity:t.severity,icon:t.icon??!1,variant:t.outlined?"outlined":"standard",title:t.text},t.text)}export{l as StatusChip};
1
+ import{jsx as n}from"react/jsx-runtime";import{makeStyles as a}from"@material-ui/core";import{Alert as o}from"@material-ui/lab";function e(t,r){switch(r){case"small":return t.typography.caption;case"medium":return t.typography.body1;case"large":return t.typography.subtitle1;default:return t.typography.caption}}function i(t){switch(t){case"small":return .2;case"medium":return .3;case"large":return 1;default:return .8}}const s=a(t=>({root:{display:"inline-flex",fontWeight:"bold",borderRadius:"1000px",margin:t.spacing(1),padding:t.spacing(0,1)},message:({size:r})=>({fontSize:e(t,r).fontSize,font:e(t,r).font,verticalAlign:"middle",padding:t.spacing(i(r),0,i(r),0)})}),{name:"MuiAlert"});function l(t){const r=s({size:t.size||"small"});return n(o,{classes:{root:r.root,message:r.message},role:"textbox",severity:t.severity,icon:t.icon??!1,variant:t.outlined?"outlined":"standard",title:t.text,children:t.text})}export{l as StatusChip};
2
2
  //# sourceMappingURL=StatusChip.esm.js.map
@@ -1,2 +1,2 @@
1
- import{SidebarItem as o}from"@backstage/core-components";import m from"@material-ui/icons/Lock";import t from"react";import{Authorized as i}from"./Auth/Authorized.esm.js";function n({text:e="RBAC",...r}){return t.createElement(i,null,t.createElement(o,{icon:m,to:"rbac",text:e,...r}))}export{n as RBACSidebarItem};
1
+ import{jsx as r}from"react/jsx-runtime";import{SidebarItem as e}from"@backstage/core-components";import i from"@material-ui/icons/Lock";import{Authorized as m}from"./Auth/Authorized.esm.js";function p({text:t="RBAC",...o}){return r(m,{children:r(e,{icon:i,to:"rbac",text:t,...o})})}export{p as RBACSidebarItem};
2
2
  //# sourceMappingURL=RBACSidebarItem.esm.js.map
@@ -1,2 +1,2 @@
1
- import{makeStyles as p,Tooltip as l,Typography as s}from"@material-ui/core";import{useAutoUpdatingRelativeTime as c}from"@spotify/backstage-plugin-core";import{DateTime as r}from"luxon";import e from"react";const T=p(()=>({root:{display:"inline-flex"}})),f=({timestamp:t,description:i})=>{const n=T(),m=r.fromISO(t).toLocaleString(r.DATETIME_FULL),o=c(t),a=i?`${i}${o}`:o;return e.createElement("span",{className:n.root},e.createElement(l,{title:m},e.createElement(s,{component:"span",display:"inline",variant:"inherit"},a)))};export{f as RelativeTime};
1
+ import{jsx as i}from"react/jsx-runtime";import{makeStyles as a,Tooltip as l,Typography as s}from"@material-ui/core";import{useAutoUpdatingRelativeTime as c}from"@spotify/backstage-plugin-core";import{DateTime as r}from"luxon";const d=a(()=>({root:{display:"inline-flex"}})),T=({timestamp:t,description:e})=>{const n=d(),m=r.fromISO(t).toLocaleString(r.DATETIME_FULL),o=c(t),p=e?`${e}${o}`:o;return i("span",{className:n.root,children:i(l,{title:m,children:i(s,{component:"span",display:"inline",variant:"inherit",children:p})})})};export{T as RelativeTime};
2
2
  //# sourceMappingURL=RelativeTime.esm.js.map
@@ -1,2 +1,2 @@
1
- import{Box as m,IconButton as t}from"@material-ui/core";import s from"@material-ui/icons/KeyboardArrowDown";import c from"@material-ui/icons/KeyboardArrowUp";import e from"react";import{shiftPositionInArray as a}from"./shiftPositionInArray.esm.js";const d=({array:l,index:o,onReorder:r})=>{const n=o===0,i=o===l.length-1;return e.createElement(m,{display:"flex"},e.createElement(t,{disabled:n,onClick:()=>r(a(l,o,-1)),"aria-label":"Move up",size:"small"},e.createElement(c,null)),e.createElement(t,{disabled:i,onClick:()=>r(a(l,o,1)),"aria-label":"Move down",size:"small"},e.createElement(s,null)))};export{d as ReorderControls};
1
+ import{jsxs as m,jsx as o}from"react/jsx-runtime";import{Box as t,IconButton as l}from"@material-ui/core";import d from"@material-ui/icons/KeyboardArrowDown";import p from"@material-ui/icons/KeyboardArrowUp";import{shiftPositionInArray as n}from"./shiftPositionInArray.esm.js";const c=({array:i,index:r,onReorder:e})=>{const s=r===0,a=r===i.length-1;return m(t,{display:"flex",children:[o(l,{disabled:s,onClick:()=>e(n(i,r,-1)),"aria-label":"Move up",size:"small",children:o(p,{})}),o(l,{disabled:a,onClick:()=>e(n(i,r,1)),"aria-label":"Move down",size:"small",children:o(d,{})})]})};export{c as ReorderControls};
2
2
  //# sourceMappingURL=ReorderControls.esm.js.map
@@ -1,2 +1,2 @@
1
- import{Box as t,Typography as o,Tooltip as a}from"@material-ui/core";import m from"@material-ui/icons/Info";import e from"react";const l=({helpText:r})=>e.createElement(t,{display:"flex",alignItems:"center"},e.createElement(t,{component:"span",mr:1},e.createElement(o,{variant:"body2",noWrap:!0},"Reorder")),e.createElement(a,{title:r},e.createElement(m,{color:"primary","aria-label":r})));export{l as ReorderInfo};
1
+ import{jsxs as i,jsx as r}from"react/jsx-runtime";import{Box as e,Typography as l,Tooltip as n}from"@material-ui/core";import p from"@material-ui/icons/Info";const t=({helpText:o})=>i(e,{display:"flex",alignItems:"center",children:[r(e,{component:"span",mr:1,children:r(l,{variant:"body2",noWrap:!0,children:"Reorder"})}),r(n,{title:o,children:r(p,{color:"primary","aria-label":o})})]});export{t as ReorderInfo};
2
2
  //# sourceMappingURL=ReorderInfo.esm.js.map
@@ -1,2 +1,2 @@
1
- import{ContentHeader as K}from"@backstage/core-components";import{useApi as L,alertApiRef as V,useApp as Z}from"@backstage/core-plugin-api";import{makeStyles as j,Button as q,Grid as y,Card as J,CardHeader as Q,CardContent as U,TextField as X,Box as x}from"@material-ui/core";import{invariant as h}from"@spotify/backstage-plugin-core";import{RoleParser as Y,RolesParser as _}from"@spotify/backstage-plugin-rbac-common";import o,{useState as P}from"react";import{useParams as ee,useNavigate as re}from"react-router-dom";import{getZodValidationToKeyMap as oe}from"../../utils/getZodValidationToKeyMap.esm.js";import{DecisionDialog as te}from"../DecisionDialog/DecisionDialog.esm.js";import{DiffBadge as ne}from"../Diffing/DiffBadge.esm.js";import ie from"../EditableInput/EditableInput.esm.js";import{PageWrapper as le}from"../Layout/PageWrapper.esm.js";import{Title as se}from"../Layout/Title.esm.js";import{MembersTable as me}from"../Members/MembersTable.esm.js";import ae from"../Permissions/PermissionsTable.esm.js";import{PolicyProvider as ce,usePolicyContext as pe}from"../Policy/PolicyProvider.esm.js";function de({roleId:s}){const{versionId:a,roleId:d}=ee(),t=s??d;return h(t),h(a),o.createElement(ce,{policyId:a},o.createElement(R,{roleId:t}))}const fe=j(s=>({cardContainer:{margin:s.spacing(0)}}));function R({roleId:s}){const{diff:a,updateLocalDraft:d,policy:t}=pe(),[T,I]=P(!1),A=L(V),r=t.roles.find(e=>e.id===s),f=a?.roles[s],[c,v]=P(null),[k,p]=P(!1),w=Z(),{NotFoundErrorPage:D}=w.getComponents(),N=re(),B=fe();if(!r)return o.createElement(D,null);const u=r.name,l=e=>{const n=t.roles.findIndex(g=>g.id===e.id),i=[...t.roles];i.splice(n,1,e),d({...t,roles:i})},F=e=>{let n;const i=oe(Y.safeParse({...r,name:e})).name,g=t.roles.findIndex(z=>z.id===r.id),C=[...t.roles];C.splice(g,1,{...r,name:e});const b=_.safeParse(C),E=!b.success;return E&&(n=b.error.issues[0].message),I(i||E),{result:!(i||E),helperText:n}},S=e=>{const{result:n,helperText:i}=F(e);n?l({...r,name:e}):A.post({display:"transient",severity:"error",message:i||"Please specify a valid role name."})},M=e=>{l({...r,description:e})},$=e=>{if(c===null)l({...r,permissions:[e,...r.permissions]});else{const n=[...r.permissions];n.splice(c,1,e),l({...r,permissions:n})}p(!1)},H=e=>{if(e==="*")l({...r,members:r.members==="*"?[]:"*"});else if(r.members==="*")l({...r,members:[e]});else{const n=r.members.includes(e)?r.members.filter(i=>i!==e):[...r.members,e];l({...r,members:n.length===0?"*":n})}},O=e=>{l({...r,permissions:r.permissions.filter((n,i)=>e!==i)})},W=e=>{l({...r,permissions:e})},m=t.status!=="draft",G=t.options.resolutionStrategy==="any-allow";return o.createElement(o.Fragment,null,o.createElement(le,{pages:[{title:t.name,path:`../../../${t.id}`},{title:u}],header:o.createElement(K,{titleComponent:o.createElement(se,null,t.name," \xA0\u01C0",m?o.createElement(o.Fragment,null,"\xA0",u):o.createElement(ie,{invalid:T,value:u,name:"Role name",onTextChange:S}),o.createElement(ne,{operation:f?.role.operation,size:"medium"})),description:t.description||void 0},o.createElement(q,{variant:"outlined",color:"primary",onClick:()=>N("../..",{relative:"path"})},"Back to policy"))},o.createElement(y,{container:!0,className:B.cardContainer,spacing:4,direction:"row"},o.createElement(y,{item:!0,xs:6},o.createElement(J,null,o.createElement(Q,{title:"Description"}),o.createElement(U,null,o.createElement(X,{fullWidth:!0,minRows:3,multiline:!0,variant:"outlined",value:r.description,disabled:m,placeholder:"No description",onChange:e=>M(e.target.value)})))),o.createElement(y,{item:!0,xs:12},o.createElement(x,{mb:4},o.createElement(me,{diff:f||null,role:r,policyId:t.id,onToggleMember:H,readonly:m})),o.createElement(x,{mb:4},o.createElement(ae,{diff:f||null,permissions:r.permissions,onNewPermissionClick:()=>{v(null),p(!0)},onOpenPermission:e=>{v(e),p(!0)},onReorderPermissions:W,onRemovePermissionClick:O,anyAllow:G,readonly:m}))))),k&&o.createElement(te,{rolePermission:c!==null?r.permissions[c]:void 0,onClose:()=>p(!1),onSave:$,readonly:m}))}export{de as RolePage,R as RolePageContent};
1
+ import{jsx as i,jsxs as a,Fragment as R}from"react/jsx-runtime";import{ContentHeader as V}from"@backstage/core-components";import{useApi as Z,alertApiRef as q,useAnalytics as J,useApp as Q}from"@backstage/core-plugin-api";import{makeStyles as U,Button as X,Grid as b,Card as Y,CardHeader as ee,CardContent as re,TextField as ie,Box as I}from"@material-ui/core";import{invariant as A}from"@spotify/backstage-plugin-core";import{RoleParser as oe,RolesParser as se}from"@spotify/backstage-plugin-rbac-common";import{useState as P}from"react";import{useParams as ne,useNavigate as te}from"react-router-dom";import{useFeatureFlags as le}from"../../hooks/useFeatureFlag.esm.js";import{getZodValidationToKeyMap as ae}from"../../utils/getZodValidationToKeyMap.esm.js";import{DecisionDialog as me}from"../DecisionDialog/DecisionDialog.esm.js";import{DiffBadge as de}from"../Diffing/DiffBadge.esm.js";import ce from"../EditableInput/EditableInput.esm.js";import{PageWrapper as pe}from"../Layout/PageWrapper.esm.js";import{Title as ue}from"../Layout/Title.esm.js";import{MembersTable as fe}from"../Members/MembersTable.esm.js";import ge from"../Permissions/PermissionsTable.esm.js";import{PolicyProvider as he,usePolicyContext as ye}from"../Policy/PolicyProvider.esm.js";function be({roleId:l}){const{versionId:d,roleId:u}=ne(),o=l??u;return A(o),A(d),i(he,{policyId:d,children:i(T,{roleId:o})})}const Pe=U(l=>({cardContainer:{margin:l.spacing(0)}}));function T({roleId:l}){const{diff:d,updateLocalDraft:u,policy:o}=ye(),[F,k]=P(!1),w=Z(q),D=J(),N=le(),r=o.roles.find(e=>e.id===l),f=d?.roles[l],[c,v]=P(null),[S,p]=P(!1),B=Q(),{NotFoundErrorPage:M}=B.getComponents(),j=te(),E=Pe();if(!r)return i(M,{});const g=r.name,t=e=>{const s=o.roles.findIndex(h=>h.id===e.id),n=[...o.roles];n.splice(s,1,e),u({...o,roles:n})},H=e=>{let s;const n=ae(oe.safeParse({...r,name:e})).name,h=o.roles.findIndex($=>$.id===r.id),C=[...o.roles];C.splice(h,1,{...r,name:e});const x=se.safeParse(C),y=!x.success;return y&&(s=x.error.issues[0].message),k(n||y),{result:!(n||y),helperText:s}},O=e=>{const{result:s,helperText:n}=H(e);s?t({...r,name:e}):w.post({display:"transient",severity:"error",message:n||"Please specify a valid role name."})},W=e=>{t({...r,description:e})},z=e=>{if(c===null)t({...r,permissions:[e,...r.permissions]});else{const s=[...r.permissions];s.splice(c,1,e),t({...r,permissions:s})}D.captureEvent("resource_action","update",{attributes:{resourceType:"role",resourceAction:"update",resourceId:l,subResourceType:"permission",subResourceAction:"update",subResourceId:e.id,rbacPermissionSetting:typeof e.decision=="string"?e.decision:"conditional",rbacFeatureFlags:N.join(",")}}),p(!1)},G=e=>{if(e==="*")t({...r,members:r.members==="*"?[]:"*"});else if(r.members==="*")t({...r,members:[e]});else{const s=r.members.includes(e)?r.members.filter(n=>n!==e):[...r.members,e];t({...r,members:s.length===0?"*":s})}},K=e=>{t({...r,permissions:r.permissions.filter((s,n)=>e!==n)})},L=e=>{t({...r,permissions:e})},m=o.status!=="draft",_=o.options.resolutionStrategy==="any-allow";return a(R,{children:[i(pe,{pages:[{title:o.name,path:`../../../${o.id}`},{title:g}],header:i(V,{titleComponent:a(ue,{children:[o.name," \xA0\u01C0",m?a(R,{children:["\xA0",g]}):i(ce,{invalid:F,value:g,name:"Role name",onTextChange:O}),i(de,{operation:f?.role.operation,size:"medium"})]}),description:o.description||void 0,children:i(X,{variant:"outlined",color:"primary",onClick:()=>j("../..",{relative:"path"}),children:"Back to policy"})}),children:a(b,{container:!0,className:E.cardContainer,spacing:4,direction:"row",children:[i(b,{item:!0,xs:6,children:a(Y,{children:[i(ee,{title:"Description"}),i(re,{children:i(ie,{fullWidth:!0,minRows:3,multiline:!0,variant:"outlined",value:r.description,disabled:m,placeholder:"No description",onChange:e=>W(e.target.value)})})]})}),a(b,{item:!0,xs:12,children:[i(I,{mb:4,children:i(fe,{diff:f||null,role:r,policyId:o.id,onToggleMember:G,readonly:m})}),i(I,{mb:4,children:i(ge,{diff:f||null,permissions:r.permissions,onNewPermissionClick:()=>{v(null),p(!0)},onOpenPermission:e=>{v(e),p(!0)},onReorderPermissions:L,onRemovePermissionClick:K,anyAllow:_,readonly:m})})]})]})}),S&&i(me,{rolePermission:c!==null?r.permissions[c]:void 0,onClose:()=>p(!1),onSave:z,readonly:m})]})}export{be as RolePage,T as RolePageContent};
2
2
  //# sourceMappingURL=RolePage.esm.js.map
@@ -1,2 +1,2 @@
1
- import{Link as C}from"@backstage/core-components";import{Card as T,CardHeader as w,Box as i,Button as R,CardContent as x,Table as v,TableHead as A,TableRow as u,TableCell as l,TableBody as B,Typography as d,IconButton as N}from"@material-ui/core";import k from"@material-ui/icons/Add";import I from"@material-ui/icons/Delete";import e from"react";import{useNavigate as D}from"react-router-dom";import{ConfirmationDialog as U}from"../ConfirmationDialog/ConfirmationDialog.esm.js";import{DiffBadge as W}from"../Diffing/DiffBadge.esm.js";import{usePolicyContext as G}from"../Policy/PolicyProvider.esm.js";import{ReorderControls as H}from"../ReorderControls/ReorderControls.esm.js";import{ReorderInfo as L}from"../ReorderControls/ReorderInfo.esm.js";const P="Use the arrows to change the order in which roles are evaluated.";function S({}){const{diff:o,policy:t,createNewRole:n,updateLocalDraft:s}=G(),E=D(),f=$(t),a=t.status!=="draft",c=t.options.resolutionStrategy==="any-allow",y=r=>{s({...t,roles:r})},g=r=>{s({...t,roles:t.roles.filter(({id:m})=>m!==r)})},b=()=>{E(`./roles/${n()}`)};return e.createElement(T,null,e.createElement(w,{title:"Roles",action:!a&&e.createElement(i,{m:1,mt:1.25},e.createElement(R,{color:"primary",variant:"outlined",startIcon:e.createElement(k,null),onClick:()=>b()},"New role"))}),e.createElement(x,null,e.createElement(v,{"data-testid":"rolesTable"},e.createElement(A,null,e.createElement(u,null,!a&&!c&&e.createElement(l,{style:{width:0}},e.createElement(L,{helpText:P})),e.createElement(l,null,"Name"),e.createElement(l,null,"Users"),e.createElement(l,null,"Groups"),!a&&e.createElement(l,{style:{width:0}}))),e.createElement(B,null,f.map((r,m)=>e.createElement(u,{key:m},!a&&!c&&e.createElement(l,null,e.createElement(H,{array:t.roles,index:m,onReorder:y})),e.createElement(l,null,e.createElement(i,{alignItems:"center",display:"flex",gridGap:8},e.createElement(i,null,e.createElement(C,{to:`roles/${r.id}`},e.createElement(d,{color:"textPrimary"},r.name)),r.description&&e.createElement(d,{variant:"body2",color:"textSecondary"},r.description)),e.createElement(W,{operation:o?.roles[r.id].role.operation}))),e.createElement(l,null,r.userCount),e.createElement(l,null,r.groupCount),!a&&e.createElement(l,{align:"right"},e.createElement(U,{message:"Are you sure you want to remove this role?",title:"Remove role?",onConfirm:()=>g(r.id)},h=>e.createElement(N,{...h,"aria-label":"Remove role",size:"small"},e.createElement(I,null))))))))))}function p(o){return o==="*"?"All":o}function $(o){return o.roles.map(t=>({id:t.id,name:t.name,description:t.description,userCount:Array.isArray(t.members)?t.members.filter(n=>n.startsWith("user:")).length:p(t.members),groupCount:Array.isArray(t.members)?t.members.filter(n=>n.startsWith("group:")).length:p(t.members)}))}export{S as RolesTable};
1
+ import{jsxs as l,jsx as e}from"react/jsx-runtime";import{Link as T}from"@backstage/core-components";import{Card as w,CardHeader as R,Box as s,Button as v,CardContent as A,Table as B,TableHead as I,TableRow as h,TableCell as i,TableBody as N,Typography as p,IconButton as D}from"@material-ui/core";import U from"@material-ui/icons/Add";import W from"@material-ui/icons/Delete";import{useNavigate as j}from"react-router-dom";import{ConfirmationDialog as k}from"../ConfirmationDialog/ConfirmationDialog.esm.js";import{DiffBadge as G}from"../Diffing/DiffBadge.esm.js";import{usePolicyContext as H}from"../Policy/PolicyProvider.esm.js";import{ReorderControls as L}from"../ReorderControls/ReorderControls.esm.js";import{ReorderInfo as P}from"../ReorderControls/ReorderInfo.esm.js";const S="Use the arrows to change the order in which roles are evaluated.";function $({}){const{diff:t,policy:r,createNewRole:n,updateLocalDraft:m}=H(),f=j(),y=z(r),a=r.status!=="draft",c=r.options.resolutionStrategy==="any-allow",g=o=>{m({...r,roles:o})},b=o=>{m({...r,roles:r.roles.filter(({id:d})=>d!==o)})},C=()=>{f(`./roles/${n()}`)};return l(w,{children:[e(R,{title:"Roles",action:!a&&e(s,{m:1,mt:1.25,children:e(v,{color:"primary",variant:"outlined",startIcon:e(U,{}),onClick:()=>C(),children:"New role"})})}),e(A,{children:l(B,{"data-testid":"rolesTable",children:[e(I,{children:l(h,{children:[!a&&!c&&e(i,{style:{width:0},children:e(P,{helpText:S})}),e(i,{children:"Name"}),e(i,{children:"Users"}),e(i,{children:"Groups"}),!a&&e(i,{style:{width:0}})]})}),e(N,{children:y.map((o,d)=>l(h,{children:[!a&&!c&&e(i,{children:e(L,{array:r.roles,index:d,onReorder:g})}),e(i,{children:l(s,{alignItems:"center",display:"flex",gridGap:8,children:[l(s,{children:[e(T,{to:`roles/${o.id}`,children:e(p,{color:"textPrimary",children:o.name})}),o.description&&e(p,{variant:"body2",color:"textSecondary",children:o.description})]}),e(G,{operation:t?.roles[o.id].role.operation})]})}),e(i,{children:o.userCount}),e(i,{children:o.groupCount}),!a&&e(i,{align:"right",children:e(k,{message:"Are you sure you want to remove this role?",title:"Remove role?",onConfirm:()=>b(o.id),children:x=>e(D,{...x,"aria-label":"Remove role",size:"small",children:e(W,{})})})})]},d))})]})})]})}function u(t){return t==="*"?"All":t}function z(t){return t.roles.map(r=>({id:r.id,name:r.name,description:r.description,userCount:Array.isArray(r.members)?r.members.filter(n=>n.startsWith("user:")).length:u(r.members),groupCount:Array.isArray(r.members)?r.members.filter(n=>n.startsWith("group:")).length:u(r.members)}))}export{$ as RolesTable};
2
2
  //# sourceMappingURL=RolesTable.esm.js.map
@@ -1,2 +1,2 @@
1
- import{Progress as n}from"@backstage/core-components";import{useApp as m}from"@backstage/core-plugin-api";import e from"react";import{Routes as l,Route as t}from"react-router-dom";import{Authorized as i}from"./Auth/Authorized.esm.js";import{HomePage as a}from"./Home/HomePage.esm.js";import{MemberOptionsProvider as p}from"./Members/MemberOptionsProvider.esm.js";import{PermissionMetadataProvider as s}from"./Permissions/PermissionsMetadataContext.esm.js";import{PoliciesProvider as c}from"./Policies/PoliciesProvider.esm.js";import{PolicyOptionsPage as u}from"./Policy/PolicyOptionsPage.esm.js";import{PolicyPage as E}from"./Policy/PolicyPage.esm.js";import{RolePage as f}from"./Role/RolePage.esm.js";function P(){const r=m(),{NotFoundErrorPage:o}=r.getComponents();return e.createElement(i,{loading:e.createElement(n,null),unauthorized:e.createElement(o,null)},e.createElement(c,null,e.createElement(s,null,e.createElement(p,null,e.createElement(l,null,e.createElement(t,{element:e.createElement(a,null),path:"/"}),e.createElement(t,{element:e.createElement(E,null),path:"/versions/:versionId"}),e.createElement(t,{element:e.createElement(u,null),path:"/versions/:versionId/options"}),e.createElement(t,{element:e.createElement(f,null),path:"/versions/:versionId/roles/:roleId"}))))))}export{P as RBACRoot};
1
+ import{jsx as o,jsxs as t}from"react/jsx-runtime";import{Progress as m}from"@backstage/core-components";import{useApp as n}from"@backstage/core-plugin-api";import{Routes as s,Route as r}from"react-router-dom";import{Authorized as p}from"./Auth/Authorized.esm.js";import{HomePage as d}from"./Home/HomePage.esm.js";import{MemberOptionsProvider as l}from"./Members/MemberOptionsProvider.esm.js";import{PermissionMetadataProvider as a}from"./Permissions/PermissionsMetadataContext.esm.js";import{PoliciesProvider as f}from"./Policies/PoliciesProvider.esm.js";import{PolicyOptionsPage as P}from"./Policy/PolicyOptionsPage.esm.js";import{PolicyPage as h}from"./Policy/PolicyPage.esm.js";import{RolePage as c}from"./Role/RolePage.esm.js";function u(){const e=n(),{NotFoundErrorPage:i}=e.getComponents();return o(p,{loading:o(m,{}),unauthorized:o(i,{}),children:o(f,{children:o(a,{children:o(l,{children:t(s,{children:[o(r,{element:o(d,{}),path:"/"}),o(r,{element:o(h,{}),path:"/versions/:versionId"}),o(r,{element:o(P,{}),path:"/versions/:versionId/options"}),o(r,{element:o(c,{}),path:"/versions/:versionId/roles/:roleId"})]})})})})})}export{u as RBACRoot};
2
2
  //# sourceMappingURL=Root.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useApi as n,configApiRef as i}from"@backstage/core-plugin-api";function t(r){return r.getOptionalStringArray("permission.rbac.flags")||[]}function e(){const r=n(i);return t(r)}export{e as useFeatureFlags};
2
+ //# sourceMappingURL=useFeatureFlag.esm.js.map
package/dist/index.d.ts CHANGED
@@ -1,11 +1,10 @@
1
1
  import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
2
2
  import { SidebarItem } from '@backstage/core-components';
3
- import React__default from 'react';
4
3
 
5
4
  /**
6
5
  * @public
7
6
  */
8
- type PropsFor<T> = T extends React__default.ComponentType<infer P> ? P : never;
7
+ type PropsFor<T> = T extends React.ComponentType<infer P> ? P : never;
9
8
  /**
10
9
  * @public
11
10
  */
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.7.7",
4
+ "version": "0.7.8",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "homepage": "https://backstage.spotify.com",
7
7
  "main": "./dist/index.esm.js",
@@ -37,11 +37,11 @@
37
37
  },
38
38
  "typesVersions": {
39
39
  "*": {
40
- "*": [
41
- "dist/index.d.ts"
42
- ],
43
40
  "alpha": [
44
41
  "dist/alpha.d.ts"
42
+ ],
43
+ "package.json": [
44
+ "package.json"
45
45
  ]
46
46
  }
47
47
  },
@@ -56,21 +56,21 @@
56
56
  "a11y": "yarn dlx @lhci/cli@0.13.x --config ./.lighthouserc.js autorun"
57
57
  },
58
58
  "dependencies": {
59
- "@backstage/catalog-model": "^1.7.3",
60
- "@backstage/core-compat-api": "^0.4.0",
61
- "@backstage/core-components": "^0.17.0",
62
- "@backstage/core-plugin-api": "^1.10.5",
59
+ "@backstage/catalog-model": "^1.7.4",
60
+ "@backstage/core-compat-api": "^0.4.2",
61
+ "@backstage/core-components": "^0.17.2",
62
+ "@backstage/core-plugin-api": "^1.10.7",
63
63
  "@backstage/errors": "^1.2.7",
64
- "@backstage/frontend-plugin-api": "^0.10.0",
65
- "@backstage/plugin-catalog-react": "^1.16.0",
66
- "@backstage/plugin-permission-common": "^0.8.4",
67
- "@backstage/plugin-permission-react": "^0.4.32",
68
- "@backstage/theme": "^0.6.4",
64
+ "@backstage/frontend-plugin-api": "^0.10.2",
65
+ "@backstage/plugin-catalog-react": "^1.18.0",
66
+ "@backstage/plugin-permission-common": "^0.9.0",
67
+ "@backstage/plugin-permission-react": "^0.4.34",
68
+ "@backstage/theme": "^0.6.6",
69
69
  "@backstage/types": "^1.2.1",
70
70
  "@material-ui/core": "^4.12.2",
71
71
  "@material-ui/icons": "^4.9.1",
72
72
  "@material-ui/lab": "4.0.0-alpha.61",
73
- "@spotify/backstage-plugin-core": "^0.8.7",
73
+ "@spotify/backstage-plugin-core": "^0.8.8",
74
74
  "@spotify/backstage-plugin-rbac-common": "^0.6.7",
75
75
  "ajv": "^8.11.2",
76
76
  "file-saver": "^2.0.5",
@@ -90,12 +90,12 @@
90
90
  "react-router-dom": "6.0.0-beta.0 || ^6.3.0"
91
91
  },
92
92
  "devDependencies": {
93
- "@backstage/cli": "^0.31.0",
94
- "@backstage/core-app-api": "^1.16.0",
95
- "@backstage/dev-utils": "^1.1.8",
93
+ "@backstage/cli": "^0.32.1",
94
+ "@backstage/core-app-api": "^1.17.0",
95
+ "@backstage/dev-utils": "^1.1.10",
96
96
  "@backstage/e2e-test-utils": "^0.1.1",
97
- "@backstage/frontend-test-utils": "^0.3.0",
98
- "@backstage/test-utils": "^1.7.6",
97
+ "@backstage/frontend-test-utils": "^0.3.2",
98
+ "@backstage/test-utils": "^1.7.8",
99
99
  "@playwright/test": "^1.32.3",
100
100
  "@sp4b-dev/test-utils": "^0.0.13",
101
101
  "@testing-library/jest-dom": "^6.0.0",