@backstage-community/plugin-rbac 1.32.2

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 (133) hide show
  1. package/CHANGELOG.md +761 -0
  2. package/README.md +106 -0
  3. package/app-config.yaml +19 -0
  4. package/dist/api/LicensedUsersClient.esm.js +45 -0
  5. package/dist/api/LicensedUsersClient.esm.js.map +1 -0
  6. package/dist/api/RBACBackendClient.esm.js +337 -0
  7. package/dist/api/RBACBackendClient.esm.js.map +1 -0
  8. package/dist/components/Administration.esm.js +23 -0
  9. package/dist/components/Administration.esm.js.map +1 -0
  10. package/dist/components/ConditionalAccess/AddNestedConditionButton.esm.js +23 -0
  11. package/dist/components/ConditionalAccess/AddNestedConditionButton.esm.js.map +1 -0
  12. package/dist/components/ConditionalAccess/ComplexConditionRow.esm.js +149 -0
  13. package/dist/components/ConditionalAccess/ComplexConditionRow.esm.js.map +1 -0
  14. package/dist/components/ConditionalAccess/ComplexConditionRowButtons.esm.js +62 -0
  15. package/dist/components/ConditionalAccess/ComplexConditionRowButtons.esm.js.map +1 -0
  16. package/dist/components/ConditionalAccess/ConditionRule.esm.js +34 -0
  17. package/dist/components/ConditionalAccess/ConditionRule.esm.js.map +1 -0
  18. package/dist/components/ConditionalAccess/ConditionalAccessSidebar.esm.js +93 -0
  19. package/dist/components/ConditionalAccess/ConditionalAccessSidebar.esm.js.map +1 -0
  20. package/dist/components/ConditionalAccess/ConditionsForm.esm.js +204 -0
  21. package/dist/components/ConditionalAccess/ConditionsForm.esm.js.map +1 -0
  22. package/dist/components/ConditionalAccess/ConditionsFormRow.esm.js +459 -0
  23. package/dist/components/ConditionalAccess/ConditionsFormRow.esm.js.map +1 -0
  24. package/dist/components/ConditionalAccess/ConditionsFormRowFields.esm.js +209 -0
  25. package/dist/components/ConditionalAccess/ConditionsFormRowFields.esm.js.map +1 -0
  26. package/dist/components/ConditionalAccess/CriteriaToggleButton.esm.js +33 -0
  27. package/dist/components/ConditionalAccess/CriteriaToggleButton.esm.js.map +1 -0
  28. package/dist/components/ConditionalAccess/CustomArrayField.esm.js +47 -0
  29. package/dist/components/ConditionalAccess/CustomArrayField.esm.js.map +1 -0
  30. package/dist/components/ConditionalAccess/RulesDropdownOption.esm.js +24 -0
  31. package/dist/components/ConditionalAccess/RulesDropdownOption.esm.js.map +1 -0
  32. package/dist/components/ConditionalAccess/const.esm.js +21 -0
  33. package/dist/components/ConditionalAccess/const.esm.js.map +1 -0
  34. package/dist/components/ConditionalAccess/types.esm.js +8 -0
  35. package/dist/components/ConditionalAccess/types.esm.js.map +1 -0
  36. package/dist/components/CreateRole/AddMembersForm.esm.js +94 -0
  37. package/dist/components/CreateRole/AddMembersForm.esm.js.map +1 -0
  38. package/dist/components/CreateRole/AddedMembersTable.esm.js +31 -0
  39. package/dist/components/CreateRole/AddedMembersTable.esm.js.map +1 -0
  40. package/dist/components/CreateRole/AddedMembersTableColumn.esm.js +77 -0
  41. package/dist/components/CreateRole/AddedMembersTableColumn.esm.js.map +1 -0
  42. package/dist/components/CreateRole/CreateRolePage.esm.js +53 -0
  43. package/dist/components/CreateRole/CreateRolePage.esm.js.map +1 -0
  44. package/dist/components/CreateRole/EditRolePage.esm.js +65 -0
  45. package/dist/components/CreateRole/EditRolePage.esm.js.map +1 -0
  46. package/dist/components/CreateRole/MembersDropdownOption.esm.js +40 -0
  47. package/dist/components/CreateRole/MembersDropdownOption.esm.js.map +1 -0
  48. package/dist/components/CreateRole/PermissionPoliciesForm.esm.js +144 -0
  49. package/dist/components/CreateRole/PermissionPoliciesForm.esm.js.map +1 -0
  50. package/dist/components/CreateRole/PermissionPoliciesFormRow.esm.js +179 -0
  51. package/dist/components/CreateRole/PermissionPoliciesFormRow.esm.js.map +1 -0
  52. package/dist/components/CreateRole/PoliciesCheckboxGroup.esm.js +76 -0
  53. package/dist/components/CreateRole/PoliciesCheckboxGroup.esm.js.map +1 -0
  54. package/dist/components/CreateRole/ReviewStep.esm.js +50 -0
  55. package/dist/components/CreateRole/ReviewStep.esm.js.map +1 -0
  56. package/dist/components/CreateRole/ReviewStepTable.esm.js +29 -0
  57. package/dist/components/CreateRole/ReviewStepTable.esm.js.map +1 -0
  58. package/dist/components/CreateRole/RoleDetailsForm.esm.js +57 -0
  59. package/dist/components/CreateRole/RoleDetailsForm.esm.js.map +1 -0
  60. package/dist/components/CreateRole/RoleForm.esm.js +271 -0
  61. package/dist/components/CreateRole/RoleForm.esm.js.map +1 -0
  62. package/dist/components/CreateRole/SelectedPermissionPoliciesColumn.esm.js +34 -0
  63. package/dist/components/CreateRole/SelectedPermissionPoliciesColumn.esm.js.map +1 -0
  64. package/dist/components/CreateRole/const.esm.js +14 -0
  65. package/dist/components/CreateRole/const.esm.js.map +1 -0
  66. package/dist/components/DownloadUserStatistics.esm.js +51 -0
  67. package/dist/components/DownloadUserStatistics.esm.js.map +1 -0
  68. package/dist/components/EditRole.esm.js +30 -0
  69. package/dist/components/EditRole.esm.js.map +1 -0
  70. package/dist/components/RbacPage.esm.js +18 -0
  71. package/dist/components/RbacPage.esm.js.map +1 -0
  72. package/dist/components/RoleOverview/AboutCard.esm.js +89 -0
  73. package/dist/components/RoleOverview/AboutCard.esm.js.map +1 -0
  74. package/dist/components/RoleOverview/MembersCard.esm.js +87 -0
  75. package/dist/components/RoleOverview/MembersCard.esm.js.map +1 -0
  76. package/dist/components/RoleOverview/MembersListColumns.esm.js +48 -0
  77. package/dist/components/RoleOverview/MembersListColumns.esm.js.map +1 -0
  78. package/dist/components/RoleOverview/PermissionsCard.esm.js +99 -0
  79. package/dist/components/RoleOverview/PermissionsCard.esm.js.map +1 -0
  80. package/dist/components/RoleOverview/PermissionsListColumns.esm.js +43 -0
  81. package/dist/components/RoleOverview/PermissionsListColumns.esm.js.map +1 -0
  82. package/dist/components/RoleOverview/RoleOverviewPage.esm.js +49 -0
  83. package/dist/components/RoleOverview/RoleOverviewPage.esm.js.map +1 -0
  84. package/dist/components/RolesList/DeleteRole.esm.js +32 -0
  85. package/dist/components/RolesList/DeleteRole.esm.js.map +1 -0
  86. package/dist/components/RolesList/DeleteRoleDialog.esm.js +142 -0
  87. package/dist/components/RolesList/DeleteRoleDialog.esm.js.map +1 -0
  88. package/dist/components/RolesList/RolesList.esm.js +102 -0
  89. package/dist/components/RolesList/RolesList.esm.js.map +1 -0
  90. package/dist/components/RolesList/RolesListColumns.esm.js +76 -0
  91. package/dist/components/RolesList/RolesListColumns.esm.js.map +1 -0
  92. package/dist/components/RolesList/RolesListToolbar.esm.js +48 -0
  93. package/dist/components/RolesList/RolesListToolbar.esm.js.map +1 -0
  94. package/dist/components/Router.esm.js +57 -0
  95. package/dist/components/Router.esm.js.map +1 -0
  96. package/dist/components/SnackbarAlert.esm.js +23 -0
  97. package/dist/components/SnackbarAlert.esm.js.map +1 -0
  98. package/dist/components/ToastContext.esm.js +19 -0
  99. package/dist/components/ToastContext.esm.js.map +1 -0
  100. package/dist/components/index.esm.js +5 -0
  101. package/dist/components/index.esm.js.map +1 -0
  102. package/dist/hooks/useCheckIfLicensePluginEnabled.esm.js +20 -0
  103. package/dist/hooks/useCheckIfLicensePluginEnabled.esm.js.map +1 -0
  104. package/dist/hooks/useConditionRules.esm.js +64 -0
  105. package/dist/hooks/useConditionRules.esm.js.map +1 -0
  106. package/dist/hooks/useLocationToast.esm.js +15 -0
  107. package/dist/hooks/useLocationToast.esm.js.map +1 -0
  108. package/dist/hooks/useMembers.esm.js +92 -0
  109. package/dist/hooks/useMembers.esm.js.map +1 -0
  110. package/dist/hooks/usePermissionPolicies.esm.js +80 -0
  111. package/dist/hooks/usePermissionPolicies.esm.js.map +1 -0
  112. package/dist/hooks/useRole.esm.js +23 -0
  113. package/dist/hooks/useRole.esm.js.map +1 -0
  114. package/dist/hooks/useRoles.esm.js +169 -0
  115. package/dist/hooks/useRoles.esm.js.map +1 -0
  116. package/dist/hooks/useSelectedMembers.esm.js +39 -0
  117. package/dist/hooks/useSelectedMembers.esm.js.map +1 -0
  118. package/dist/index.d.ts +17 -0
  119. package/dist/index.esm.js +4 -0
  120. package/dist/index.esm.js.map +1 -0
  121. package/dist/plugin.esm.js +49 -0
  122. package/dist/plugin.esm.js.map +1 -0
  123. package/dist/routes.esm.js +23 -0
  124. package/dist/routes.esm.js.map +1 -0
  125. package/dist/utils/conditional-access-utils.esm.js +268 -0
  126. package/dist/utils/conditional-access-utils.esm.js.map +1 -0
  127. package/dist/utils/create-role-utils.esm.js +231 -0
  128. package/dist/utils/create-role-utils.esm.js.map +1 -0
  129. package/dist/utils/rbac-utils.esm.js +256 -0
  130. package/dist/utils/rbac-utils.esm.js.map +1 -0
  131. package/dist/utils/role-form-utils.esm.js +66 -0
  132. package/dist/utils/role-form-utils.esm.js.map +1 -0
  133. package/package.json +120 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PermissionPoliciesFormRow.esm.js","sources":["../../../src/components/CreateRole/PermissionPoliciesFormRow.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport { FormLabel, makeStyles } from '@material-ui/core';\nimport IconButton from '@material-ui/core/IconButton';\nimport TextField from '@material-ui/core/TextField';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport ChecklistRtlIcon from '@mui/icons-material/ChecklistRtl';\nimport HelpOutlineIcon from '@mui/icons-material/HelpOutline';\nimport RemoveIcon from '@mui/icons-material/Remove';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport { FormikErrors } from 'formik';\n\nimport { PermissionsData } from '../../types';\nimport { getRulesNumber } from '../../utils/create-role-utils';\nimport { ConditionalAccessSidebar } from '../ConditionalAccess/ConditionalAccessSidebar';\nimport { ConditionRules, ConditionsData } from '../ConditionalAccess/types';\nimport { PoliciesCheckboxGroup } from './PoliciesCheckboxGroup';\nimport { PluginsPermissionPoliciesData } from './types';\n\nconst useStyles = makeStyles(theme => ({\n removeButton: {\n color: theme.palette.grey[500],\n flexGrow: 0,\n alignSelf: 'center',\n },\n conditionalAccessButton: {\n fontSize: theme.typography.fontSize,\n },\n}));\n\ntype PermissionPoliciesFormRowProps = {\n permissionPoliciesRowData: PermissionsData;\n permissionPoliciesData?: PluginsPermissionPoliciesData;\n permissionPoliciesRowError: FormikErrors<PermissionsData>;\n rowCount: number;\n rowName: string;\n conditionRules: ConditionRules;\n onRemove: () => void;\n onChangePlugin: (plugin: string) => void;\n onChangePermission: (\n permission: string,\n isResourced: boolean,\n policies?: string[],\n ) => void;\n onChangePolicy: (isChecked: boolean, policyIndex: number) => void;\n handleBlur: React.FocusEventHandler<HTMLInputElement | HTMLTextAreaElement>;\n getPermissionDisabled: (permission: string) => boolean;\n onAddConditions: (conditions?: ConditionsData) => void;\n};\n\nexport const PermissionPoliciesFormRow = ({\n permissionPoliciesRowData,\n permissionPoliciesData,\n permissionPoliciesRowError,\n rowCount,\n rowName,\n conditionRules,\n onRemove,\n onChangePermission,\n onChangePolicy,\n onChangePlugin,\n handleBlur,\n getPermissionDisabled,\n onAddConditions,\n}: PermissionPoliciesFormRowProps) => {\n const classes = useStyles();\n const { plugin: pluginError, permission: permissionError } =\n permissionPoliciesRowError;\n const { data: conditionRulesData, error: conditionRulesError } =\n conditionRules;\n const totalRules = getRulesNumber(permissionPoliciesRowData.conditions);\n\n const [sidebarOpen, setSidebarOpen] = React.useState<boolean>(false);\n\n const tooltipTitle = () => (\n <div>\n <Typography component=\"p\" align=\"center\">\n Define access conditions for the selected resource type using Rules.\n Rules vary by resource type.{' '}\n <b>Users have access to the resource type content by default</b> unless\n configured otherwise.\n </Typography>\n </div>\n );\n\n const getTotalRules = (): string => {\n let accessMessage = 'Configure access';\n\n if (totalRules > 0) {\n accessMessage += ` (${totalRules} ${totalRules > 1 ? 'rules' : 'rule'})`;\n }\n return accessMessage;\n };\n\n return (\n <div>\n <div style={{ display: 'flex', flexFlow: 'column', gap: '15px' }}>\n <FormLabel\n style={{\n fontWeight: 800,\n fontSize: '0.8rem',\n }}\n >\n What can users/groups access?\n </FormLabel>\n <div\n style={{\n display: 'flex',\n gap: '20px',\n marginBottom: '15px',\n }}\n >\n <Autocomplete\n options={permissionPoliciesData?.plugins ?? []}\n style={{ width: '35%', flexGrow: '1' }}\n value={permissionPoliciesRowData.plugin || null}\n onChange={(_e, value) => {\n onChangePlugin(value ?? '');\n }}\n renderInput={(params: any) => (\n <TextField\n {...params}\n label=\"Plugin\"\n name={`${rowName}.plugin`}\n variant=\"outlined\"\n placeholder=\"Select a plugin\"\n error={!!pluginError}\n helperText={pluginError ?? ''}\n onBlur={handleBlur}\n required\n />\n )}\n />\n <Autocomplete\n disabled={!permissionPoliciesRowData.plugin}\n options={\n permissionPoliciesData?.pluginsPermissions?.[\n permissionPoliciesRowData.plugin\n ]?.permissions ?? []\n }\n style={{ width: '35%', flexGrow: '1' }}\n value={permissionPoliciesRowData.permission || null}\n onChange={(_e, value) =>\n onChangePermission(\n value ?? '',\n permissionPoliciesData?.pluginsPermissions?.[\n permissionPoliciesRowData.plugin\n ]?.policies[value ?? '']?.isResourced ?? false,\n value\n ? permissionPoliciesData?.pluginsPermissions?.[\n permissionPoliciesRowData.plugin\n ]?.policies?.[value].policies\n : undefined,\n )\n }\n getOptionDisabled={getPermissionDisabled}\n getOptionLabel={option => option || ''}\n renderInput={(params: any) => (\n <TextField\n {...params}\n label=\"Resource type\"\n name={`${rowName}.permission`}\n variant=\"outlined\"\n placeholder=\"Select a resource type\"\n error={!!permissionError}\n helperText={permissionError ?? ''}\n onBlur={handleBlur}\n required\n />\n )}\n />\n <div style={{ width: '23%', alignSelf: 'center', flexGrow: 1 }}>\n {permissionPoliciesRowData.isResourced &&\n !!conditionRulesData?.[`${permissionPoliciesRowData.plugin}`]?.[\n `${permissionPoliciesRowData.permission}`\n ]?.rules.length && (\n <IconButton\n title=\"\"\n color=\"primary\"\n hidden={\n !permissionPoliciesData?.pluginsPermissions[\n permissionPoliciesRowData.plugin\n ]?.policies[permissionPoliciesRowData.permission]\n ?.isResourced\n }\n aria-label=\"configure-access\"\n className={classes.conditionalAccessButton}\n onClick={() => setSidebarOpen(true)}\n disabled={!!conditionRulesError}\n >\n <ChecklistRtlIcon fontSize=\"small\" />\n {getTotalRules()}\n &nbsp;\n <Tooltip title={tooltipTitle()} placement=\"top\">\n <HelpOutlineIcon fontSize=\"inherit\" />\n </Tooltip>\n </IconButton>\n )}\n </div>\n <IconButton\n title=\"Remove\"\n className={classes.removeButton}\n onClick={() => onRemove()}\n disabled={rowCount === 1}\n data-testid={`${rowName}-remove`}\n >\n <RemoveIcon id={`${rowName}-remove`} />\n </IconButton>\n </div>\n </div>\n <PoliciesCheckboxGroup\n permissionPoliciesRowData={permissionPoliciesRowData}\n onChangePolicy={onChangePolicy}\n rowName={rowName}\n />\n <ConditionalAccessSidebar\n open={sidebarOpen}\n onClose={() => {\n setSidebarOpen(false);\n }}\n onSave={(conditions?: ConditionsData) => {\n onAddConditions(conditions);\n setSidebarOpen(false);\n }}\n conditionsFormVal={permissionPoliciesRowData.conditions}\n selPluginResourceType={permissionPoliciesRowData.permission}\n conditionRulesData={\n conditionRulesData?.[`${permissionPoliciesRowData.plugin}`]?.[\n `${permissionPoliciesRowData.permission}`\n ]\n }\n />\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import React from 'react';
2
+ import Checkbox from '@material-ui/core/Checkbox';
3
+ import FormControl from '@material-ui/core/FormControl';
4
+ import FormControlLabel from '@material-ui/core/FormControlLabel';
5
+ import FormGroup from '@material-ui/core/FormGroup';
6
+ import FormLabel from '@material-ui/core/FormLabel';
7
+
8
+ const PoliciesCheckboxGroup = ({
9
+ permissionPoliciesRowData,
10
+ rowName,
11
+ onChangePolicy
12
+ }) => {
13
+ return /* @__PURE__ */ React.createElement(
14
+ FormControl,
15
+ {
16
+ required: true,
17
+ style: {
18
+ justifyContent: "flex-start",
19
+ gap: "1px",
20
+ width: "402px",
21
+ flexGrow: "1",
22
+ marginBottom: "25px"
23
+ }
24
+ },
25
+ /* @__PURE__ */ React.createElement(
26
+ FormLabel,
27
+ {
28
+ style: {
29
+ fontWeight: 800,
30
+ fontSize: "0.8rem"
31
+ }
32
+ },
33
+ "What actions they can do?"
34
+ ),
35
+ /* @__PURE__ */ React.createElement(
36
+ FormGroup,
37
+ {
38
+ style: {
39
+ display: "flex",
40
+ gap: "7px",
41
+ flexDirection: "row",
42
+ paddingLeft: "9px"
43
+ }
44
+ },
45
+ permissionPoliciesRowData.policies.map(
46
+ (p, index, self) => {
47
+ const labelCheckedArray = self.filter(
48
+ (val) => val.effect === "allow"
49
+ );
50
+ const labelCheckedCount = labelCheckedArray.length;
51
+ return /* @__PURE__ */ React.createElement(
52
+ FormControlLabel,
53
+ {
54
+ key: p.policy,
55
+ disabled: !(permissionPoliciesRowData.plugin && permissionPoliciesRowData.permission) || permissionPoliciesRowData.policies.length === 1 || labelCheckedCount === 1 && labelCheckedArray[0].policy === p.policy,
56
+ label: p.policy,
57
+ name: `${rowName}.policies[${index}].policy`,
58
+ control: /* @__PURE__ */ React.createElement(
59
+ Checkbox,
60
+ {
61
+ checked: p.effect === "allow",
62
+ name: `${rowName}.policies[${index}].policy-${p.policy}`,
63
+ onChange: (e) => onChangePolicy(e.target.checked, index),
64
+ color: "primary"
65
+ }
66
+ )
67
+ }
68
+ );
69
+ }
70
+ )
71
+ )
72
+ );
73
+ };
74
+
75
+ export { PoliciesCheckboxGroup };
76
+ //# sourceMappingURL=PoliciesCheckboxGroup.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PoliciesCheckboxGroup.esm.js","sources":["../../../src/components/CreateRole/PoliciesCheckboxGroup.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport Checkbox from '@material-ui/core/Checkbox';\nimport FormControl from '@material-ui/core/FormControl';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport FormGroup from '@material-ui/core/FormGroup';\nimport FormLabel from '@material-ui/core/FormLabel';\n\nimport { PermissionsData } from '../../types';\nimport { RowPolicy } from './types';\n\nexport const PoliciesCheckboxGroup = ({\n permissionPoliciesRowData,\n rowName,\n onChangePolicy,\n}: {\n permissionPoliciesRowData: PermissionsData;\n rowName: string;\n\n onChangePolicy: (isChecked: boolean, policyIndex: number) => void;\n}) => {\n return (\n <FormControl\n required\n style={{\n justifyContent: 'flex-start',\n gap: '1px',\n width: '402px',\n flexGrow: '1',\n marginBottom: '25px',\n }}\n >\n <FormLabel\n style={{\n fontWeight: 800,\n fontSize: '0.8rem',\n }}\n >\n What actions they can do?\n </FormLabel>\n <FormGroup\n style={{\n display: 'flex',\n gap: '7px',\n flexDirection: 'row',\n paddingLeft: '9px',\n }}\n >\n {permissionPoliciesRowData.policies.map(\n (p: RowPolicy, index: number, self) => {\n const labelCheckedArray = self.filter(\n val => val.effect === 'allow',\n );\n const labelCheckedCount = labelCheckedArray.length;\n return (\n <FormControlLabel\n key={p.policy}\n disabled={\n !(\n permissionPoliciesRowData.plugin &&\n permissionPoliciesRowData.permission\n ) ||\n permissionPoliciesRowData.policies.length === 1 ||\n (labelCheckedCount === 1 &&\n labelCheckedArray[0].policy === p.policy)\n }\n label={p.policy}\n name={`${rowName}.policies[${index}].policy`}\n control={\n <Checkbox\n checked={p.effect === 'allow'}\n name={`${rowName}.policies[${index}].policy-${p.policy}`}\n onChange={e => onChangePolicy(e.target.checked, index)}\n color=\"primary\"\n />\n }\n />\n );\n },\n )}\n </FormGroup>\n </FormControl>\n );\n};\n"],"names":[],"mappings":";;;;;;;AA0BO,MAAM,wBAAwB,CAAC;AAAA,EACpC,yBAAA;AAAA,EACA,OAAA;AAAA,EACA,cAAA;AACF,CAKM,KAAA;AACJ,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,QAAQ,EAAA,IAAA;AAAA,MACR,KAAO,EAAA;AAAA,QACL,cAAgB,EAAA,YAAA;AAAA,QAChB,GAAK,EAAA,KAAA;AAAA,QACL,KAAO,EAAA,OAAA;AAAA,QACP,QAAU,EAAA,GAAA;AAAA,QACV,YAAc,EAAA,MAAA;AAAA,OAChB;AAAA,KAAA;AAAA,oBAEA,KAAA,CAAA,aAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,KAAO,EAAA;AAAA,UACL,UAAY,EAAA,GAAA;AAAA,UACZ,QAAU,EAAA,QAAA;AAAA,SACZ;AAAA,OAAA;AAAA,MACD,2BAAA;AAAA,KAED;AAAA,oBACA,KAAA,CAAA,aAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,KAAO,EAAA;AAAA,UACL,OAAS,EAAA,MAAA;AAAA,UACT,GAAK,EAAA,KAAA;AAAA,UACL,aAAe,EAAA,KAAA;AAAA,UACf,WAAa,EAAA,KAAA;AAAA,SACf;AAAA,OAAA;AAAA,MAEC,0BAA0B,QAAS,CAAA,GAAA;AAAA,QAClC,CAAC,CAAc,EAAA,KAAA,EAAe,IAAS,KAAA;AACrC,UAAA,MAAM,oBAAoB,IAAK,CAAA,MAAA;AAAA,YAC7B,CAAA,GAAA,KAAO,IAAI,MAAW,KAAA,OAAA;AAAA,WACxB,CAAA;AACA,UAAA,MAAM,oBAAoB,iBAAkB,CAAA,MAAA,CAAA;AAC5C,UACE,uBAAA,KAAA,CAAA,aAAA;AAAA,YAAC,gBAAA;AAAA,YAAA;AAAA,cACC,KAAK,CAAE,CAAA,MAAA;AAAA,cACP,UACE,EACE,yBAAA,CAA0B,MAC1B,IAAA,yBAAA,CAA0B,eAE5B,yBAA0B,CAAA,QAAA,CAAS,MAAW,KAAA,CAAA,IAC7C,sBAAsB,CACrB,IAAA,iBAAA,CAAkB,CAAC,CAAA,CAAE,WAAW,CAAE,CAAA,MAAA;AAAA,cAEtC,OAAO,CAAE,CAAA,MAAA;AAAA,cACT,IAAM,EAAA,CAAA,EAAG,OAAO,CAAA,UAAA,EAAa,KAAK,CAAA,QAAA,CAAA;AAAA,cAClC,OACE,kBAAA,KAAA,CAAA,aAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,EAAE,MAAW,KAAA,OAAA;AAAA,kBACtB,MAAM,CAAG,EAAA,OAAO,aAAa,KAAK,CAAA,SAAA,EAAY,EAAE,MAAM,CAAA,CAAA;AAAA,kBACtD,UAAU,CAAK,CAAA,KAAA,cAAA,CAAe,CAAE,CAAA,MAAA,CAAO,SAAS,KAAK,CAAA;AAAA,kBACrD,KAAM,EAAA,SAAA;AAAA,iBAAA;AAAA,eACR;AAAA,aAAA;AAAA,WAEJ,CAAA;AAAA,SAEJ;AAAA,OACF;AAAA,KACF;AAAA,GACF,CAAA;AAEJ;;;;"}
@@ -0,0 +1,50 @@
1
+ import React from 'react';
2
+ import { StructuredMetadataTable } from '@backstage/core-components';
3
+ import Typography from '@mui/material/Typography';
4
+ import { getPermissionsNumber } from '../../utils/create-role-utils.esm.js';
5
+ import { getMembers } from '../../utils/rbac-utils.esm.js';
6
+ import { reviewStepMemebersTableColumns } from './AddedMembersTableColumn.esm.js';
7
+ import { ReviewStepTable } from './ReviewStepTable.esm.js';
8
+ import { selectedPermissionPoliciesColumn } from './SelectedPermissionPoliciesColumn.esm.js';
9
+
10
+ const tableMetadata = (values) => {
11
+ const membersKey = values.selectedMembers.length > 0 ? `Users and groups (${getMembers(values.selectedMembers)})` : "Users and groups";
12
+ const permissionPoliciesKey = `Permission policies (${getPermissionsNumber(
13
+ values
14
+ )})`;
15
+ return {
16
+ "Name and description of role": /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Typography, { sx: { margin: "0px" } }, values.name), /* @__PURE__ */ React.createElement("br", null), /* @__PURE__ */ React.createElement(Typography, { sx: { margin: "0px" } }, values.description)),
17
+ [membersKey]: /* @__PURE__ */ React.createElement(
18
+ ReviewStepTable,
19
+ {
20
+ rows: values.selectedMembers,
21
+ columns: reviewStepMemebersTableColumns(),
22
+ tableWrapperWidth: 550
23
+ }
24
+ ),
25
+ [permissionPoliciesKey]: /* @__PURE__ */ React.createElement(
26
+ ReviewStepTable,
27
+ {
28
+ rows: values.permissionPoliciesRows,
29
+ columns: selectedPermissionPoliciesColumn(),
30
+ tableWrapperWidth: 700
31
+ }
32
+ )
33
+ };
34
+ };
35
+ const ReviewStep = ({
36
+ values,
37
+ isEditing
38
+ }) => {
39
+ return /* @__PURE__ */ React.createElement("div", { style: { overflow: "auto" } }, /* @__PURE__ */ React.createElement(Typography, { variant: "h6" }, isEditing ? "Review and save" : "Review and create"), /* @__PURE__ */ React.createElement(
40
+ StructuredMetadataTable,
41
+ {
42
+ dense: true,
43
+ metadata: tableMetadata(values),
44
+ options: { titleFormat: (key) => key }
45
+ }
46
+ ));
47
+ };
48
+
49
+ export { ReviewStep };
50
+ //# sourceMappingURL=ReviewStep.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReviewStep.esm.js","sources":["../../../src/components/CreateRole/ReviewStep.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport { StructuredMetadataTable } from '@backstage/core-components';\n\nimport Typography from '@mui/material/Typography';\n\nimport { getPermissionsNumber } from '../../utils/create-role-utils';\nimport { getMembers } from '../../utils/rbac-utils';\nimport { reviewStepMemebersTableColumns } from './AddedMembersTableColumn';\nimport { ReviewStepTable } from './ReviewStepTable';\nimport { selectedPermissionPoliciesColumn } from './SelectedPermissionPoliciesColumn';\nimport { RoleFormValues } from './types';\n\nconst tableMetadata = (values: RoleFormValues) => {\n const membersKey =\n values.selectedMembers.length > 0\n ? `Users and groups (${getMembers(values.selectedMembers)})`\n : 'Users and groups';\n const permissionPoliciesKey = `Permission policies (${getPermissionsNumber(\n values,\n )})`;\n return {\n 'Name and description of role': (\n <>\n <Typography sx={{ margin: '0px' }}>{values.name}</Typography>\n <br />\n <Typography sx={{ margin: '0px' }}>{values.description}</Typography>\n </>\n ),\n [membersKey]: (\n <ReviewStepTable\n rows={values.selectedMembers}\n columns={reviewStepMemebersTableColumns()}\n tableWrapperWidth={550}\n />\n ),\n [permissionPoliciesKey]: (\n <ReviewStepTable\n rows={values.permissionPoliciesRows}\n columns={selectedPermissionPoliciesColumn()}\n tableWrapperWidth={700}\n />\n ),\n };\n};\n\nexport const ReviewStep = ({\n values,\n isEditing,\n}: {\n values: RoleFormValues;\n isEditing: boolean;\n}) => {\n return (\n <div style={{ overflow: 'auto' }}>\n <Typography variant=\"h6\">\n {isEditing ? 'Review and save' : 'Review and create'}\n </Typography>\n <StructuredMetadataTable\n dense\n metadata={tableMetadata(values)}\n options={{ titleFormat: (key: string) => key }}\n />\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AA4BA,MAAM,aAAA,GAAgB,CAAC,MAA2B,KAAA;AAChD,EAAM,MAAA,UAAA,GACJ,MAAO,CAAA,eAAA,CAAgB,MAAS,GAAA,CAAA,GAC5B,qBAAqB,UAAW,CAAA,MAAA,CAAO,eAAe,CAAC,CACvD,CAAA,CAAA,GAAA,kBAAA,CAAA;AACN,EAAA,MAAM,wBAAwB,CAAwB,qBAAA,EAAA,oBAAA;AAAA,IACpD,MAAA;AAAA,GACD,CAAA,CAAA,CAAA,CAAA;AACD,EAAO,OAAA;AAAA,IACL,8BAAA,kBAEI,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,EAAA,EAAI,EAAE,MAAQ,EAAA,KAAA,EAAU,EAAA,EAAA,MAAA,CAAO,IAAK,CAAA,sCAC/C,IAAG,EAAA,IAAA,CAAA,kBACH,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,EAAI,EAAA,EAAE,QAAQ,KAAM,EAAA,EAAA,EAAI,MAAO,CAAA,WAAY,CACzD,CAAA;AAAA,IAEF,CAAC,UAAU,mBACT,KAAA,CAAA,aAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,MAAM,MAAO,CAAA,eAAA;AAAA,QACb,SAAS,8BAA+B,EAAA;AAAA,QACxC,iBAAmB,EAAA,GAAA;AAAA,OAAA;AAAA,KACrB;AAAA,IAEF,CAAC,qBAAqB,mBACpB,KAAA,CAAA,aAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,MAAM,MAAO,CAAA,sBAAA;AAAA,QACb,SAAS,gCAAiC,EAAA;AAAA,QAC1C,iBAAmB,EAAA,GAAA;AAAA,OAAA;AAAA,KACrB;AAAA,GAEJ,CAAA;AACF,CAAA,CAAA;AAEO,MAAM,aAAa,CAAC;AAAA,EACzB,MAAA;AAAA,EACA,SAAA;AACF,CAGM,KAAA;AACJ,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAI,KAAO,EAAA,EAAE,UAAU,MAAO,EAAA,EAAA,kBAC5B,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,IAAA,EAAA,EACjB,SAAY,GAAA,iBAAA,GAAoB,mBACnC,CACA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,uBAAA;AAAA,IAAA;AAAA,MACC,KAAK,EAAA,IAAA;AAAA,MACL,QAAA,EAAU,cAAc,MAAM,CAAA;AAAA,MAC9B,OAAS,EAAA,EAAE,WAAa,EAAA,CAAC,QAAgB,GAAI,EAAA;AAAA,KAAA;AAAA,GAEjD,CAAA,CAAA;AAEJ;;;;"}
@@ -0,0 +1,29 @@
1
+ import React from 'react';
2
+
3
+ const ReviewStepTable = ({
4
+ columns,
5
+ rows,
6
+ tableWrapperWidth
7
+ }) => {
8
+ return /* @__PURE__ */ React.createElement(
9
+ "div",
10
+ {
11
+ style: {
12
+ maxHeight: "230px",
13
+ overflow: "auto",
14
+ width: `${tableWrapperWidth}px`
15
+ }
16
+ },
17
+ /* @__PURE__ */ React.createElement("table", { style: { width: `${tableWrapperWidth - 50}px` } }, /* @__PURE__ */ React.createElement("thead", null, /* @__PURE__ */ React.createElement("tr", null, columns.map((col) => /* @__PURE__ */ React.createElement("th", { style: { width: "150px" }, key: col.title }, col.title)))), /* @__PURE__ */ React.createElement("tbody", null, rows.map((row, rowIndex) => /* @__PURE__ */ React.createElement(React.Fragment, { key: rowIndex }, /* @__PURE__ */ React.createElement("tr", null, columns.map((rowCol) => /* @__PURE__ */ React.createElement(
18
+ "td",
19
+ {
20
+ style: { width: "150px" },
21
+ key: `${rowCol.title}-${rowCol.field}`
22
+ },
23
+ rowCol.render ? rowCol.render(row[rowCol.field]) : row[rowCol.field] || (rowCol.emptyValue ?? "")
24
+ ))), /* @__PURE__ */ React.createElement("tr", null)))))
25
+ );
26
+ };
27
+
28
+ export { ReviewStepTable };
29
+ //# sourceMappingURL=ReviewStepTable.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReviewStepTable.esm.js","sources":["../../../src/components/CreateRole/ReviewStepTable.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nexport const ReviewStepTable = ({\n columns,\n rows,\n tableWrapperWidth,\n}: {\n columns: any[];\n rows: any[];\n tableWrapperWidth: number;\n}) => {\n return (\n <div\n style={{\n maxHeight: '230px',\n overflow: 'auto',\n width: `${tableWrapperWidth}px`,\n }}\n >\n <table style={{ width: `${tableWrapperWidth - 50}px` }}>\n <thead>\n <tr>\n {columns.map(col => (\n <th style={{ width: '150px' }} key={col.title}>\n {col.title}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, rowIndex) => (\n <React.Fragment key={rowIndex}>\n <tr>\n {columns.map(rowCol => (\n <td\n style={{ width: '150px' }}\n key={`${rowCol.title}-${rowCol.field}`}\n >\n {rowCol.render\n ? rowCol.render(row[rowCol.field])\n : row[rowCol.field] || (rowCol.emptyValue ?? '')}\n </td>\n ))}\n </tr>\n <tr />\n </React.Fragment>\n ))}\n </tbody>\n </table>\n </div>\n );\n};\n"],"names":[],"mappings":";;AAiBO,MAAM,kBAAkB,CAAC;AAAA,EAC9B,OAAA;AAAA,EACA,IAAA;AAAA,EACA,iBAAA;AACF,CAIM,KAAA;AACJ,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAO,EAAA;AAAA,QACL,SAAW,EAAA,OAAA;AAAA,QACX,QAAU,EAAA,MAAA;AAAA,QACV,KAAA,EAAO,GAAG,iBAAiB,CAAA,EAAA,CAAA;AAAA,OAC7B;AAAA,KAAA;AAAA,oBAEA,KAAA,CAAA,aAAA,CAAC,WAAM,KAAO,EAAA,EAAE,OAAO,CAAG,EAAA,iBAAA,GAAoB,EAAE,CAAA,EAAA,CAAA,EAC9C,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,+BACE,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EACE,OAAQ,CAAA,GAAA,CAAI,CACX,GAAA,qBAAA,KAAA,CAAA,aAAA,CAAC,QAAG,KAAO,EAAA,EAAE,KAAO,EAAA,OAAA,EAAW,EAAA,GAAA,EAAK,IAAI,KACrC,EAAA,EAAA,GAAA,CAAI,KACP,CACD,CACH,CACF,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,OACE,EAAA,IAAA,EAAA,IAAA,CAAK,GAAI,CAAA,CAAC,KAAK,QACd,qBAAA,KAAA,CAAA,aAAA,CAAC,KAAM,CAAA,QAAA,EAAN,EAAe,GAAA,EAAK,4BAClB,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EACE,OAAQ,CAAA,GAAA,CAAI,CACX,MAAA,qBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,KAAA,EAAO,OAAQ,EAAA;AAAA,QACxB,KAAK,CAAG,EAAA,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,OAAO,KAAK,CAAA,CAAA;AAAA,OAAA;AAAA,MAEnC,MAAO,CAAA,MAAA,GACJ,MAAO,CAAA,MAAA,CAAO,IAAI,MAAO,CAAA,KAAK,CAAC,CAAA,GAC/B,GAAI,CAAA,MAAA,CAAO,KAAK,CAAA,KAAM,OAAO,UAAc,IAAA,EAAA,CAAA;AAAA,KAElD,CACH,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,UAAG,CACN,CACD,CACH,CACF,CAAA;AAAA,GACF,CAAA;AAEJ;;;;"}
@@ -0,0 +1,57 @@
1
+ import React from 'react';
2
+ import { TextField } from '@material-ui/core';
3
+
4
+ const RoleDetailsForm = ({
5
+ name,
6
+ description,
7
+ nameError,
8
+ handleBlur,
9
+ handleChange
10
+ }) => {
11
+ return /* @__PURE__ */ React.createElement(
12
+ "div",
13
+ {
14
+ style: {
15
+ display: "flex",
16
+ flexDirection: "column",
17
+ gap: "20px"
18
+ }
19
+ },
20
+ /* @__PURE__ */ React.createElement(
21
+ TextField,
22
+ {
23
+ required: true,
24
+ label: "Name",
25
+ variant: "outlined",
26
+ id: "role-name",
27
+ "data-testid": "role-name",
28
+ "aria-labelledby": "name",
29
+ helperText: nameError ?? "Enter name of the role",
30
+ value: name,
31
+ name: "name",
32
+ onChange: handleChange,
33
+ onBlur: handleBlur,
34
+ error: !!nameError
35
+ }
36
+ ),
37
+ /* @__PURE__ */ React.createElement(
38
+ TextField,
39
+ {
40
+ label: "Description",
41
+ variant: "outlined",
42
+ helperText: "Enter a brief description about the role (The purpose of the role)",
43
+ value: description,
44
+ "data-testid": "role-description",
45
+ id: "role-description",
46
+ name: "description",
47
+ "aria-labelledby": "description",
48
+ onChange: handleChange,
49
+ onBlur: handleBlur,
50
+ multiline: true
51
+ }
52
+ )
53
+ );
54
+ };
55
+
56
+ export { RoleDetailsForm };
57
+ //# sourceMappingURL=RoleDetailsForm.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RoleDetailsForm.esm.js","sources":["../../../src/components/CreateRole/RoleDetailsForm.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport { TextField } from '@material-ui/core';\n\ntype RoleDetailsFormProps = {\n name: string;\n description?: string;\n nameError?: string;\n handleBlur: React.FocusEventHandler<HTMLInputElement | HTMLTextAreaElement>;\n handleChange: React.ChangeEventHandler<\n HTMLTextAreaElement | HTMLInputElement\n >;\n};\n\nexport const RoleDetailsForm = ({\n name,\n description,\n nameError,\n handleBlur,\n handleChange,\n}: RoleDetailsFormProps) => {\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '20px',\n }}\n >\n <TextField\n required\n label=\"Name\"\n variant=\"outlined\"\n id=\"role-name\"\n data-testid=\"role-name\"\n aria-labelledby=\"name\"\n helperText={nameError ?? 'Enter name of the role'}\n value={name}\n name=\"name\"\n onChange={handleChange}\n onBlur={handleBlur}\n error={!!nameError}\n />\n <TextField\n label=\"Description\"\n variant=\"outlined\"\n helperText=\"Enter a brief description about the role (The purpose of the role)\"\n value={description}\n data-testid=\"role-description\"\n id=\"role-description\"\n name=\"description\"\n aria-labelledby=\"description\"\n onChange={handleChange}\n onBlur={handleBlur}\n multiline\n />\n </div>\n );\n};\n"],"names":[],"mappings":";;;AA6BO,MAAM,kBAAkB,CAAC;AAAA,EAC9B,IAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AACF,CAA4B,KAAA;AAC1B,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAO,EAAA;AAAA,QACL,OAAS,EAAA,MAAA;AAAA,QACT,aAAe,EAAA,QAAA;AAAA,QACf,GAAK,EAAA,MAAA;AAAA,OACP;AAAA,KAAA;AAAA,oBAEA,KAAA,CAAA,aAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,QAAQ,EAAA,IAAA;AAAA,QACR,KAAM,EAAA,MAAA;AAAA,QACN,OAAQ,EAAA,UAAA;AAAA,QACR,EAAG,EAAA,WAAA;AAAA,QACH,aAAY,EAAA,WAAA;AAAA,QACZ,iBAAgB,EAAA,MAAA;AAAA,QAChB,YAAY,SAAa,IAAA,wBAAA;AAAA,QACzB,KAAO,EAAA,IAAA;AAAA,QACP,IAAK,EAAA,MAAA;AAAA,QACL,QAAU,EAAA,YAAA;AAAA,QACV,MAAQ,EAAA,UAAA;AAAA,QACR,KAAA,EAAO,CAAC,CAAC,SAAA;AAAA,OAAA;AAAA,KACX;AAAA,oBACA,KAAA,CAAA,aAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,KAAM,EAAA,aAAA;AAAA,QACN,OAAQ,EAAA,UAAA;AAAA,QACR,UAAW,EAAA,oEAAA;AAAA,QACX,KAAO,EAAA,WAAA;AAAA,QACP,aAAY,EAAA,kBAAA;AAAA,QACZ,EAAG,EAAA,kBAAA;AAAA,QACH,IAAK,EAAA,aAAA;AAAA,QACL,iBAAgB,EAAA,aAAA;AAAA,QAChB,QAAU,EAAA,YAAA;AAAA,QACV,MAAQ,EAAA,UAAA;AAAA,QACR,SAAS,EAAA,IAAA;AAAA,OAAA;AAAA,KACX;AAAA,GACF,CAAA;AAEJ;;;;"}
@@ -0,0 +1,271 @@
1
+ import React from 'react';
2
+ import { useNavigate } from 'react-router-dom';
3
+ import { parseEntityRef } from '@backstage/catalog-model';
4
+ import { SimpleStepper, SimpleStepperStep } from '@backstage/core-components';
5
+ import { useApi } from '@backstage/core-plugin-api';
6
+ import { Card, CardHeader, Divider, CardContent, Box, Paper, Button } from '@material-ui/core';
7
+ import { Alert } from '@material-ui/lab';
8
+ import { useFormik } from 'formik';
9
+ import { rbacApiRef } from '../../api/RBACBackendClient.esm.js';
10
+ import { validationSchema, getRoleData, getPermissionPoliciesData, getNewConditionalPolicies, getRemovedConditionalPoliciesIds, getUpdatedConditionalPolicies, getConditionalPermissionPoliciesData } from '../../utils/create-role-utils.esm.js';
11
+ import { onlyInLeft, isSamePermissionPolicy } from '../../utils/rbac-utils.esm.js';
12
+ import { removePermissions, createPermissions, removeConditions, modifyConditions, createConditions } from '../../utils/role-form-utils.esm.js';
13
+ import { AddedMembersTable } from './AddedMembersTable.esm.js';
14
+ import { AddMembersForm } from './AddMembersForm.esm.js';
15
+ import { PermissionPoliciesForm } from './PermissionPoliciesForm.esm.js';
16
+ import { ReviewStep } from './ReviewStep.esm.js';
17
+ import { RoleDetailsForm } from './RoleDetailsForm.esm.js';
18
+
19
+ const RoleForm = ({
20
+ roleName,
21
+ step,
22
+ titles,
23
+ membersData,
24
+ submitLabel,
25
+ initialValues
26
+ }) => {
27
+ const [activeStep, setActiveStep] = React.useState(step || 0);
28
+ const navigate = useNavigate();
29
+ const rbacApi = useApi(rbacApiRef);
30
+ const navigateTo = (rName, action) => {
31
+ const currentRoleName = rName || roleName;
32
+ const stateProp = currentRoleName && action ? {
33
+ state: {
34
+ toastMessage: `Role ${currentRoleName} ${action} successfully`
35
+ }
36
+ } : void 0;
37
+ if (step && currentRoleName) {
38
+ const { kind, namespace, name } = parseEntityRef(currentRoleName);
39
+ navigate(`../roles/${kind}/${namespace}/${name}`, stateProp);
40
+ } else {
41
+ navigate("..", stateProp);
42
+ }
43
+ };
44
+ const updateRole = async (name, values, formikHelpers) => {
45
+ try {
46
+ const newData = getRoleData(values);
47
+ const newName = newData.name;
48
+ const newPermissionsData = getPermissionPoliciesData(values);
49
+ const newConditions = getNewConditionalPolicies(values);
50
+ const deleteConditions = getRemovedConditionalPoliciesIds(
51
+ values,
52
+ initialValues
53
+ );
54
+ const updateConditions = getUpdatedConditionalPolicies(
55
+ values,
56
+ initialValues
57
+ );
58
+ const oldData = getRoleData(initialValues);
59
+ const res = await rbacApi.updateRole(oldData, newData);
60
+ if (res.error) {
61
+ throw new Error(
62
+ `${"Unable to edit the role. "}${res.error.message}`
63
+ );
64
+ } else {
65
+ const oldPermissionsData = getPermissionPoliciesData(initialValues);
66
+ const newPermissions = onlyInLeft(
67
+ newPermissionsData,
68
+ oldPermissionsData,
69
+ isSamePermissionPolicy
70
+ );
71
+ const deletePermissions = onlyInLeft(
72
+ oldPermissionsData,
73
+ newPermissionsData,
74
+ isSamePermissionPolicy
75
+ );
76
+ await removePermissions(name, deletePermissions, rbacApi);
77
+ await createPermissions(newPermissions, rbacApi);
78
+ await removeConditions(deleteConditions, rbacApi);
79
+ await modifyConditions(updateConditions, rbacApi);
80
+ await createConditions(newConditions, rbacApi);
81
+ navigateTo(newName, "updated");
82
+ }
83
+ } catch (e) {
84
+ formikHelpers.setStatus({ submitError: e });
85
+ }
86
+ };
87
+ const newRole = async (values, formikHelpers) => {
88
+ try {
89
+ const newData = getRoleData(values);
90
+ const newPermissionsData = getPermissionPoliciesData(values);
91
+ const newConditionalPermissionPoliciesData = getConditionalPermissionPoliciesData(values);
92
+ const res = await rbacApi.createRole(newData);
93
+ if (res.error) {
94
+ throw new Error(
95
+ `${"Unable to create role. "}${res.error.message}`
96
+ );
97
+ }
98
+ await createPermissions(
99
+ newPermissionsData,
100
+ rbacApi,
101
+ "Role was created successfully but unable to add permission policies to the role."
102
+ );
103
+ await createConditions(
104
+ newConditionalPermissionPoliciesData,
105
+ rbacApi,
106
+ "Role created successfully but unable to add conditions to the role."
107
+ );
108
+ navigateTo(newData.name, "created");
109
+ } catch (e) {
110
+ formikHelpers.setStatus({ submitError: e });
111
+ }
112
+ };
113
+ const formik = useFormik({
114
+ enableReinitialize: true,
115
+ initialValues,
116
+ validationSchema,
117
+ onSubmit: async (values, formikHelpers) => {
118
+ if (roleName) {
119
+ updateRole(roleName, values, formikHelpers);
120
+ } else {
121
+ newRole(values, formikHelpers);
122
+ }
123
+ }
124
+ });
125
+ const validateStepField = (fieldName) => {
126
+ switch (fieldName) {
127
+ case "name": {
128
+ formik.validateField(fieldName);
129
+ return formik.errors.name;
130
+ }
131
+ case "selectedMembers": {
132
+ formik.validateField(fieldName);
133
+ return formik.errors.selectedMembers;
134
+ }
135
+ case "permissionPoliciesRows": {
136
+ formik.values.permissionPoliciesRows.forEach((_pp, index) => {
137
+ formik.validateField(`permissionPoliciesRows[${index}].plugin`);
138
+ formik.validateField(`permissionPoliciesRows[${index}].permission`);
139
+ });
140
+ return formik.errors.permissionPoliciesRows;
141
+ }
142
+ default:
143
+ return void 0;
144
+ }
145
+ };
146
+ const handleNext = (fieldName) => {
147
+ const error = fieldName && validateStepField(fieldName);
148
+ if (!fieldName || !error) {
149
+ formik.setErrors({});
150
+ const stepNum = Math.min(activeStep + 1, 3);
151
+ setActiveStep(stepNum);
152
+ }
153
+ };
154
+ const canNextPermissionPoliciesStep = () => {
155
+ return formik.values.permissionPoliciesRows.filter((pp) => !!pp.plugin).length === formik.values.permissionPoliciesRows.length && (!formik.errors.permissionPoliciesRows || formik.errors.permissionPoliciesRows?.filter((err) => !!err)?.length === 0);
156
+ };
157
+ const handleBack = () => setActiveStep(Math.max(activeStep - 1, 0));
158
+ const handleCancel = () => {
159
+ navigateTo();
160
+ };
161
+ const handleReset = (e) => {
162
+ setActiveStep(0);
163
+ formik.handleReset(e);
164
+ };
165
+ return /* @__PURE__ */ React.createElement(Card, { style: { overflow: "auto" } }, /* @__PURE__ */ React.createElement(CardHeader, { title: titles.formTitle }), /* @__PURE__ */ React.createElement(Divider, null), /* @__PURE__ */ React.createElement(
166
+ CardContent,
167
+ {
168
+ component: "form",
169
+ onSubmit: formik.handleSubmit,
170
+ style: { position: "relative" }
171
+ },
172
+ /* @__PURE__ */ React.createElement(SimpleStepper, { activeStep }, /* @__PURE__ */ React.createElement(
173
+ SimpleStepperStep,
174
+ {
175
+ title: titles.nameAndDescriptionTitle,
176
+ actions: {
177
+ showBack: false,
178
+ showNext: true,
179
+ nextText: "Next",
180
+ canNext: () => !!formik.values.name && !formik.errors.name,
181
+ onNext: () => handleNext("name")
182
+ }
183
+ },
184
+ /* @__PURE__ */ React.createElement(
185
+ RoleDetailsForm,
186
+ {
187
+ name: formik.values.name,
188
+ description: formik.values.description,
189
+ handleBlur: formik.handleBlur,
190
+ handleChange: formik.handleChange,
191
+ nameError: formik.errors.name
192
+ }
193
+ )
194
+ ), /* @__PURE__ */ React.createElement(
195
+ SimpleStepperStep,
196
+ {
197
+ title: titles.usersAndGroupsTitle,
198
+ actions: {
199
+ showNext: true,
200
+ nextText: "Next",
201
+ canNext: () => formik.values.selectedMembers?.length > 0 && !formik.errors.selectedMembers,
202
+ onNext: () => handleNext("selectedMembers"),
203
+ showBack: true,
204
+ backText: "Back",
205
+ onBack: handleBack
206
+ }
207
+ },
208
+ /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(
209
+ AddMembersForm,
210
+ {
211
+ selectedMembers: formik.values.selectedMembers,
212
+ selectedMembersError: formik.errors.selectedMembers,
213
+ setFieldValue: formik.setFieldValue,
214
+ membersData
215
+ }
216
+ ), /* @__PURE__ */ React.createElement("br", null), /* @__PURE__ */ React.createElement(
217
+ AddedMembersTable,
218
+ {
219
+ selectedMembers: formik.values.selectedMembers,
220
+ setFieldValue: formik.setFieldValue
221
+ }
222
+ ))
223
+ ), /* @__PURE__ */ React.createElement(
224
+ SimpleStepperStep,
225
+ {
226
+ title: titles.permissionPoliciesTitle,
227
+ actions: {
228
+ showNext: true,
229
+ nextText: "Next",
230
+ canNext: () => canNextPermissionPoliciesStep(),
231
+ onNext: () => handleNext("permissionPoliciesRows"),
232
+ showBack: true,
233
+ backText: "Back",
234
+ onBack: handleBack
235
+ }
236
+ },
237
+ /* @__PURE__ */ React.createElement(
238
+ PermissionPoliciesForm,
239
+ {
240
+ permissionPoliciesRows: formik.values.permissionPoliciesRows,
241
+ permissionPoliciesRowsError: formik.errors.permissionPoliciesRows,
242
+ setFieldValue: formik.setFieldValue,
243
+ setFieldError: formik.setFieldError,
244
+ handleBlur: formik.handleBlur
245
+ }
246
+ )
247
+ ), /* @__PURE__ */ React.createElement(SimpleStepperStep, { title: "", end: true }, /* @__PURE__ */ React.createElement(Paper, { square: true, elevation: 0 }, /* @__PURE__ */ React.createElement(ReviewStep, { values: formik.values, isEditing: !!roleName }), /* @__PURE__ */ React.createElement("br", null), /* @__PURE__ */ React.createElement(Button, { onClick: handleBack }, "Back"), /* @__PURE__ */ React.createElement(Button, { onClick: (e) => handleReset(e) }, "Reset"), /* @__PURE__ */ React.createElement(
248
+ Button,
249
+ {
250
+ variant: "contained",
251
+ color: "primary",
252
+ type: "submit",
253
+ disabled: !!formik.errors.name || !!formik.errors.selectedMembers || !formik.dirty
254
+ },
255
+ submitLabel || "Create"
256
+ )))),
257
+ formik.status?.submitError && /* @__PURE__ */ React.createElement(Box, { style: { paddingBottom: "16px" } }, /* @__PURE__ */ React.createElement(Alert, { severity: "error" }, `${formik.status.submitError}`)),
258
+ /* @__PURE__ */ React.createElement(
259
+ Button,
260
+ {
261
+ style: { position: "absolute", right: "0", bottom: "0" },
262
+ onClick: handleCancel,
263
+ color: "primary"
264
+ },
265
+ "Cancel"
266
+ )
267
+ ));
268
+ };
269
+
270
+ export { RoleForm };
271
+ //# sourceMappingURL=RoleForm.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RoleForm.esm.js","sources":["../../../src/components/CreateRole/RoleForm.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { parseEntityRef } from '@backstage/catalog-model';\nimport { SimpleStepper, SimpleStepperStep } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport {\n Box,\n Button,\n Card,\n CardContent,\n CardHeader,\n Divider,\n Paper,\n} from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport { FormikErrors, FormikHelpers, useFormik } from 'formik';\n\nimport { rbacApiRef } from '../../api/RBACBackendClient';\nimport { MemberEntity, PermissionsData, RoleError } from '../../types';\nimport {\n getConditionalPermissionPoliciesData,\n getNewConditionalPolicies,\n getPermissionPoliciesData,\n getRemovedConditionalPoliciesIds,\n getRoleData,\n getUpdatedConditionalPolicies,\n validationSchema,\n} from '../../utils/create-role-utils';\nimport { isSamePermissionPolicy, onlyInLeft } from '../../utils/rbac-utils';\nimport {\n createConditions,\n createPermissions,\n modifyConditions,\n removeConditions,\n removePermissions,\n} from '../../utils/role-form-utils';\nimport { AddedMembersTable } from './AddedMembersTable';\nimport { AddMembersForm } from './AddMembersForm';\nimport { PermissionPoliciesForm } from './PermissionPoliciesForm';\nimport { ReviewStep } from './ReviewStep';\nimport { RoleDetailsForm } from './RoleDetailsForm';\nimport { RoleFormValues } from './types';\n\ntype RoleFormProps = {\n membersData: { members: MemberEntity[]; loading: boolean; error: Error };\n titles: {\n formTitle: string;\n nameAndDescriptionTitle: string;\n usersAndGroupsTitle: string;\n permissionPoliciesTitle: string;\n };\n submitLabel?: string;\n roleName?: string;\n step?: number;\n initialValues: RoleFormValues;\n};\n\nexport const RoleForm = ({\n roleName,\n step,\n titles,\n membersData,\n submitLabel,\n initialValues,\n}: RoleFormProps) => {\n const [activeStep, setActiveStep] = React.useState<number>(step || 0);\n const navigate = useNavigate();\n const rbacApi = useApi(rbacApiRef);\n\n const navigateTo = (rName?: string, action?: string) => {\n const currentRoleName = rName || roleName;\n const stateProp =\n currentRoleName && action\n ? {\n state: {\n toastMessage: `Role ${currentRoleName} ${action} successfully`,\n },\n }\n : undefined;\n if (step && currentRoleName) {\n const { kind, namespace, name } = parseEntityRef(currentRoleName);\n navigate(`../roles/${kind}/${namespace}/${name}`, stateProp);\n } else {\n navigate('..', stateProp);\n }\n };\n\n const updateRole = async (\n name: string,\n values: RoleFormValues,\n formikHelpers: FormikHelpers<RoleFormValues>,\n ) => {\n try {\n const newData = getRoleData(values);\n const newName = newData.name;\n const newPermissionsData = getPermissionPoliciesData(values);\n const newConditions = getNewConditionalPolicies(values);\n const deleteConditions = getRemovedConditionalPoliciesIds(\n values,\n initialValues,\n );\n const updateConditions = getUpdatedConditionalPolicies(\n values,\n initialValues,\n );\n\n const oldData = getRoleData(initialValues);\n const res = await rbacApi.updateRole(oldData, newData);\n if ((res as RoleError).error) {\n throw new Error(\n `${'Unable to edit the role. '}${(res as RoleError).error.message}`,\n );\n } else {\n const oldPermissionsData = getPermissionPoliciesData(initialValues);\n const newPermissions = onlyInLeft(\n newPermissionsData,\n oldPermissionsData,\n isSamePermissionPolicy,\n );\n const deletePermissions = onlyInLeft(\n oldPermissionsData,\n newPermissionsData,\n isSamePermissionPolicy,\n );\n\n await removePermissions(name, deletePermissions, rbacApi);\n await createPermissions(newPermissions, rbacApi);\n\n await removeConditions(deleteConditions, rbacApi);\n await modifyConditions(updateConditions, rbacApi);\n await createConditions(newConditions, rbacApi);\n\n navigateTo(newName, 'updated');\n }\n } catch (e) {\n formikHelpers.setStatus({ submitError: e });\n }\n };\n\n const newRole = async (\n values: RoleFormValues,\n formikHelpers: FormikHelpers<RoleFormValues>,\n ) => {\n try {\n const newData = getRoleData(values);\n const newPermissionsData = getPermissionPoliciesData(values);\n const newConditionalPermissionPoliciesData =\n getConditionalPermissionPoliciesData(values);\n\n const res = await rbacApi.createRole(newData);\n if ((res as RoleError).error) {\n throw new Error(\n `${'Unable to create role. '}${(res as RoleError).error.message}`,\n );\n }\n\n await createPermissions(\n newPermissionsData,\n rbacApi,\n 'Role was created successfully but unable to add permission policies to the role.',\n );\n\n await createConditions(\n newConditionalPermissionPoliciesData,\n rbacApi,\n 'Role created successfully but unable to add conditions to the role.',\n );\n\n navigateTo(newData.name, 'created');\n } catch (e) {\n formikHelpers.setStatus({ submitError: e });\n }\n };\n\n const formik = useFormik<RoleFormValues>({\n enableReinitialize: true,\n initialValues,\n validationSchema: validationSchema,\n onSubmit: async (\n values: RoleFormValues,\n formikHelpers: FormikHelpers<RoleFormValues>,\n ) => {\n if (roleName) {\n updateRole(roleName, values, formikHelpers);\n } else {\n newRole(values, formikHelpers);\n }\n },\n });\n\n const validateStepField = (fieldName: string) => {\n switch (fieldName) {\n case 'name': {\n formik.validateField(fieldName);\n return formik.errors.name;\n }\n case 'selectedMembers': {\n formik.validateField(fieldName);\n return formik.errors.selectedMembers;\n }\n case 'permissionPoliciesRows': {\n formik.values.permissionPoliciesRows.forEach((_pp, index) => {\n formik.validateField(`permissionPoliciesRows[${index}].plugin`);\n formik.validateField(`permissionPoliciesRows[${index}].permission`);\n });\n return formik.errors.permissionPoliciesRows;\n }\n default:\n return undefined;\n }\n };\n\n const handleNext = (fieldName?: string) => {\n const error = fieldName && validateStepField(fieldName);\n if (!fieldName || !error) {\n formik.setErrors({});\n const stepNum = Math.min(activeStep + 1, 3);\n setActiveStep(stepNum);\n }\n };\n\n const canNextPermissionPoliciesStep = () => {\n return (\n formik.values.permissionPoliciesRows.filter(pp => !!pp.plugin).length ===\n formik.values.permissionPoliciesRows.length &&\n (!formik.errors.permissionPoliciesRows ||\n (\n formik.errors.permissionPoliciesRows as unknown as FormikErrors<\n PermissionsData[]\n >[]\n )?.filter(err => !!err)?.length === 0)\n );\n };\n\n const handleBack = () => setActiveStep(Math.max(activeStep - 1, 0));\n const handleCancel = () => {\n navigateTo();\n };\n\n const handleReset = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n setActiveStep(0);\n formik.handleReset(e);\n };\n\n return (\n <Card style={{ overflow: 'auto' }}>\n <CardHeader title={titles.formTitle} />\n <Divider />\n <CardContent\n component=\"form\"\n onSubmit={formik.handleSubmit}\n style={{ position: 'relative' }}\n >\n <SimpleStepper activeStep={activeStep}>\n <SimpleStepperStep\n title={titles.nameAndDescriptionTitle}\n actions={{\n showBack: false,\n showNext: true,\n nextText: 'Next',\n canNext: () => !!formik.values.name && !formik.errors.name,\n onNext: () => handleNext('name'),\n }}\n >\n <RoleDetailsForm\n name={formik.values.name}\n description={formik.values.description}\n handleBlur={formik.handleBlur}\n handleChange={formik.handleChange}\n nameError={formik.errors.name}\n />\n </SimpleStepperStep>\n <SimpleStepperStep\n title={titles.usersAndGroupsTitle}\n actions={{\n showNext: true,\n nextText: 'Next',\n canNext: () =>\n formik.values.selectedMembers?.length > 0 &&\n !formik.errors.selectedMembers,\n onNext: () => handleNext('selectedMembers'),\n showBack: true,\n backText: 'Back',\n onBack: handleBack,\n }}\n >\n <Box>\n <AddMembersForm\n selectedMembers={formik.values.selectedMembers}\n selectedMembersError={formik.errors.selectedMembers as string}\n setFieldValue={formik.setFieldValue}\n membersData={membersData}\n />\n <br />\n <AddedMembersTable\n selectedMembers={formik.values.selectedMembers}\n setFieldValue={formik.setFieldValue}\n />\n </Box>\n </SimpleStepperStep>\n <SimpleStepperStep\n title={titles.permissionPoliciesTitle}\n actions={{\n showNext: true,\n nextText: 'Next',\n canNext: () => canNextPermissionPoliciesStep(),\n onNext: () => handleNext('permissionPoliciesRows'),\n showBack: true,\n backText: 'Back',\n onBack: handleBack,\n }}\n >\n <PermissionPoliciesForm\n permissionPoliciesRows={formik.values.permissionPoliciesRows}\n permissionPoliciesRowsError={\n formik.errors\n .permissionPoliciesRows as FormikErrors<PermissionsData>[]\n }\n setFieldValue={formik.setFieldValue}\n setFieldError={formik.setFieldError}\n handleBlur={formik.handleBlur}\n />\n </SimpleStepperStep>\n <SimpleStepperStep title=\"\" end>\n <Paper square elevation={0}>\n <ReviewStep values={formik.values} isEditing={!!roleName} />\n <br />\n <Button onClick={handleBack}>Back</Button>\n <Button onClick={e => handleReset(e)}>Reset</Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n type=\"submit\"\n disabled={\n !!formik.errors.name ||\n !!formik.errors.selectedMembers ||\n !formik.dirty\n }\n >\n {submitLabel || 'Create'}\n </Button>\n </Paper>\n </SimpleStepperStep>\n </SimpleStepper>\n {formik.status?.submitError && (\n <Box style={{ paddingBottom: '16px' }}>\n <Alert severity=\"error\">{`${formik.status.submitError}`}</Alert>\n </Box>\n )}\n <Button\n style={{ position: 'absolute', right: '0', bottom: '0' }}\n onClick={handleCancel}\n color=\"primary\"\n >\n Cancel\n </Button>\n </CardContent>\n </Card>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { getRulesNumber } from '../../utils/create-role-utils.esm.js';
2
+
3
+ const selectedPermissionPoliciesColumn = () => [
4
+ {
5
+ title: "Plugin",
6
+ field: "plugin"
7
+ },
8
+ {
9
+ title: "Permission",
10
+ field: "permission"
11
+ },
12
+ {
13
+ title: "Policies",
14
+ field: "policies",
15
+ render: (policies) => {
16
+ const policyStr = policies.reduce((acc, p) => {
17
+ if (p.effect === "allow") return acc.concat(`${p.policy}, `);
18
+ return acc;
19
+ }, "");
20
+ return policyStr.slice(0, policyStr.length - 2);
21
+ }
22
+ },
23
+ {
24
+ title: "Conditional",
25
+ field: "conditions",
26
+ render: (conditions) => {
27
+ const totalRules = getRulesNumber(conditions);
28
+ return totalRules ? `${totalRules} ${totalRules > 1 ? "rules" : "rule"}` : "-";
29
+ }
30
+ }
31
+ ];
32
+
33
+ export { selectedPermissionPoliciesColumn };
34
+ //# sourceMappingURL=SelectedPermissionPoliciesColumn.esm.js.map