@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.
- package/CHANGELOG.md +8 -0
- package/dist/alpha/pages.esm.js +1 -1
- package/dist/alpha.d.ts +7 -6
- package/dist/components/Auth/Authorized.esm.js +1 -1
- package/dist/components/ConfirmationDialog/ConfirmationDialog.esm.js +1 -1
- package/dist/components/DecisionDialog/ConditionalDecisionForm/AddConditionSelector.esm.js +1 -1
- package/dist/components/DecisionDialog/ConditionalDecisionForm/ConditionCard.esm.js +1 -1
- package/dist/components/DecisionDialog/ConditionalDecisionForm/ConditionTree.esm.js +1 -1
- package/dist/components/DecisionDialog/ConditionalDecisionForm/ConditionTypeSelector.esm.js +1 -1
- package/dist/components/DecisionDialog/ConditionalDecisionForm/ConditionalDecisionForm.esm.js +1 -1
- package/dist/components/DecisionDialog/ConditionalDecisionForm/CriteriaSummary/ConditionLevelSummary.esm.js +1 -1
- package/dist/components/DecisionDialog/ConditionalDecisionForm/CriteriaSummary/ConditionSummary.esm.js +1 -1
- package/dist/components/DecisionDialog/ConditionalDecisionForm/CriteriaSummary/ConditionalDecisionBox.esm.js +1 -1
- package/dist/components/DecisionDialog/ConditionalDecisionForm/CriteriaSummary/CriteriaSummary.esm.js +1 -1
- package/dist/components/DecisionDialog/ConditionalDecisionForm/CriteriaSummary/Indent.esm.js +1 -1
- package/dist/components/DecisionDialog/ConditionalDecisionForm/CriteriaSummary/MonospaceText.esm.js +1 -1
- package/dist/components/DecisionDialog/DecisionDialog.esm.js +1 -1
- package/dist/components/DecisionDialog/MatchByActions.esm.js +1 -1
- package/dist/components/DecisionDialog/MatchByName.esm.js +1 -1
- package/dist/components/DecisionDialog/MatchByResourceType.esm.js +1 -1
- package/dist/components/DecisionDialog/ParamsForm/ParamsForm.esm.js +1 -1
- package/dist/components/DecisionDialog/ParamsForm/ParamsFormArrayInput.esm.js +1 -1
- package/dist/components/DecisionDialog/ParamsForm/ParamsFormBooleanInput.esm.js +1 -1
- package/dist/components/DecisionDialog/ParamsForm/ParamsFormInput.esm.js +1 -1
- package/dist/components/DecisionDialog/ParamsForm/ParamsFormInputRouter.esm.js +1 -1
- package/dist/components/DecisionDialog/ParamsForm/ParamsFormJSONEditor.esm.js +1 -1
- package/dist/components/DecisionDialog/ParamsForm/ParamsFormStandard.esm.js +1 -1
- package/dist/components/DecisionDialog/ToggleButtonGroup.esm.js +1 -1
- package/dist/components/DecisionDialog/VerticalSelection.esm.js +1 -1
- package/dist/components/Diffing/DiffBadge.esm.js +1 -1
- package/dist/components/Diffing/DiffSummary.esm.js +1 -1
- package/dist/components/EditableInput/EditableInput.esm.js +1 -1
- package/dist/components/Home/HomePage.esm.js +1 -1
- package/dist/components/Home/HomePageContent.esm.js +1 -1
- package/dist/components/Home/HomePageEmptyState.esm.js +1 -1
- package/dist/components/Layout/Breadcrumbs.esm.js +1 -1
- package/dist/components/Layout/EmptyStateImageWrapper.esm.js +1 -1
- package/dist/components/Layout/PageWrapper.esm.js +1 -1
- package/dist/components/Layout/Title.esm.js +1 -1
- package/dist/components/Members/MemberLabel.esm.js +1 -1
- package/dist/components/Members/MemberOptionsProvider.esm.js +1 -1
- package/dist/components/Members/MembersAutocomplete.esm.js +1 -1
- package/dist/components/Members/MembersAutocompleteListBox.esm.js +1 -1
- package/dist/components/Members/MembersTable.esm.js +1 -1
- package/dist/components/Members/MembersTableBody.esm.js +1 -1
- package/dist/components/Permission/PermissionName.esm.js +1 -1
- package/dist/components/Permissions/PermissionsMetadataContext.esm.js +1 -1
- package/dist/components/Permissions/PermissionsTable.esm.js +1 -1
- package/dist/components/Policies/PoliciesProvider.esm.js +1 -1
- package/dist/components/Policies/PoliciesTable.esm.js +1 -1
- package/dist/components/Policy/EmptyRolesCard.esm.js +1 -1
- package/dist/components/Policy/PolicyCard.esm.js +1 -1
- package/dist/components/Policy/PolicyConflictDialog.esm.js +1 -1
- package/dist/components/Policy/PolicyImportButton.esm.js +1 -1
- package/dist/components/Policy/PolicyInvalidDialog.esm.js +1 -1
- package/dist/components/Policy/PolicyMenu.esm.js +1 -1
- package/dist/components/Policy/PolicyOptionCard.esm.js +1 -1
- package/dist/components/Policy/PolicyOptionsPage.esm.js +1 -1
- package/dist/components/Policy/PolicyPage.esm.js +1 -1
- package/dist/components/Policy/PolicyProvider.esm.js +1 -1
- package/dist/components/Policy/PolicyPublishButton.esm.js +1 -1
- package/dist/components/Policy/PolicyPublishConfirmationDialog.esm.js +1 -1
- package/dist/components/Policy/PolicyPublishSuccessDialog.esm.js +1 -1
- package/dist/components/Policy/PolicyStatusChip.esm.js +1 -1
- package/dist/components/Policy/useDuplicatePolicy.esm.js +1 -1
- package/dist/components/PolicyTester/DecisionBreakdownTable/CellText.esm.js +1 -1
- package/dist/components/PolicyTester/DecisionBreakdownTable/DecidingRoleCell.esm.js +1 -1
- package/dist/components/PolicyTester/DecisionBreakdownTable/DecisionBreakdownTable.esm.js +1 -1
- package/dist/components/PolicyTester/DecisionBreakdownTable/DecisionCell.esm.js +1 -1
- package/dist/components/PolicyTester/DecisionBreakdownTable/PermissionNameCell.esm.js +1 -1
- package/dist/components/PolicyTester/DecisionBreakdownTable/RoleNameCell.esm.js +1 -1
- package/dist/components/PolicyTester/DecisionBreakdownTable/TableHeaderCell.esm.js +1 -1
- package/dist/components/PolicyTester/DecisionBreakdownTable/UserIconCell.esm.js +1 -1
- package/dist/components/PolicyTester/DecisionIcon.esm.js +1 -1
- package/dist/components/PolicyTester/DecisionInfo.esm.js +1 -1
- package/dist/components/PolicyTester/PolicyTestResultDetails.esm.js +1 -1
- package/dist/components/PolicyTester/PolicyTester.esm.js +1 -1
- package/dist/components/PolicyTester/PolicyTesterFieldset.esm.js +1 -1
- package/dist/components/PolicyTester/PolicyTesterPermissionSelect.esm.js +1 -1
- package/dist/components/PolicyTester/PolicyTesterResultRow.esm.js +1 -1
- package/dist/components/PolicyTester/PolicyTesterResults.esm.js +1 -1
- package/dist/components/PolicyTester/PolicyTesterRoleSelect.esm.js +1 -1
- package/dist/components/PolicyTester/StatusChip.esm.js +1 -1
- package/dist/components/RBACSidebarItem.esm.js +1 -1
- package/dist/components/RelativeTime/RelativeTime.esm.js +1 -1
- package/dist/components/ReorderControls/ReorderControls.esm.js +1 -1
- package/dist/components/ReorderControls/ReorderInfo.esm.js +1 -1
- package/dist/components/Role/RolePage.esm.js +1 -1
- package/dist/components/Roles/RolesTable.esm.js +1 -1
- package/dist/components/Root.esm.js +1 -1
- package/dist/hooks/useFeatureFlag.esm.js +2 -0
- package/dist/index.d.ts +1 -2
- package/package.json +19 -19
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{AuthorizeResult as
|
|
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
|
|
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{
|
|
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{
|
|
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
|
|
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{
|
|
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
|
|
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{
|
|
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
|
|
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
|
|
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{
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
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
|
|
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.
|
|
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.
|
|
60
|
-
"@backstage/core-compat-api": "^0.4.
|
|
61
|
-
"@backstage/core-components": "^0.17.
|
|
62
|
-
"@backstage/core-plugin-api": "^1.10.
|
|
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.
|
|
65
|
-
"@backstage/plugin-catalog-react": "^1.
|
|
66
|
-
"@backstage/plugin-permission-common": "^0.
|
|
67
|
-
"@backstage/plugin-permission-react": "^0.4.
|
|
68
|
-
"@backstage/theme": "^0.6.
|
|
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.
|
|
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.
|
|
94
|
-
"@backstage/core-app-api": "^1.
|
|
95
|
-
"@backstage/dev-utils": "^1.1.
|
|
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.
|
|
98
|
-
"@backstage/test-utils": "^1.7.
|
|
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",
|