@backstage-community/plugin-rbac 1.35.0 → 1.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/dist/components/Administration.esm.js +2 -2
- package/dist/components/Administration.esm.js.map +1 -1
- package/dist/components/ConditionalAccess/AddNestedConditionButton.esm.js +5 -5
- package/dist/components/ConditionalAccess/AddNestedConditionButton.esm.js.map +1 -1
- package/dist/components/ConditionalAccess/ComplexConditionRow.esm.js +5 -5
- package/dist/components/ConditionalAccess/ComplexConditionRow.esm.js.map +1 -1
- package/dist/components/ConditionalAccess/ComplexConditionRowButtons.esm.js +7 -7
- package/dist/components/ConditionalAccess/ComplexConditionRowButtons.esm.js.map +1 -1
- package/dist/components/ConditionalAccess/ConditionRule.esm.js +2 -2
- package/dist/components/ConditionalAccess/ConditionRule.esm.js.map +1 -1
- package/dist/components/ConditionalAccess/ConditionalAccessSidebar.esm.js +9 -9
- package/dist/components/ConditionalAccess/ConditionalAccessSidebar.esm.js.map +1 -1
- package/dist/components/ConditionalAccess/ConditionsForm.esm.js +14 -14
- package/dist/components/ConditionalAccess/ConditionsForm.esm.js.map +1 -1
- package/dist/components/ConditionalAccess/ConditionsFormRow.esm.js +27 -27
- package/dist/components/ConditionalAccess/ConditionsFormRow.esm.js.map +1 -1
- package/dist/components/ConditionalAccess/ConditionsFormRowFields.esm.js +6 -6
- package/dist/components/ConditionalAccess/ConditionsFormRowFields.esm.js.map +1 -1
- package/dist/components/ConditionalAccess/CriteriaToggleButton.esm.js +2 -2
- package/dist/components/ConditionalAccess/CriteriaToggleButton.esm.js.map +1 -1
- package/dist/components/ConditionalAccess/CustomArrayField.esm.js +5 -5
- package/dist/components/ConditionalAccess/CustomArrayField.esm.js.map +1 -1
- package/dist/components/ConditionalAccess/RulesDropdownOption.esm.js +4 -4
- package/dist/components/ConditionalAccess/RulesDropdownOption.esm.js.map +1 -1
- package/dist/components/CreateRole/AddMembersForm.esm.js +13 -13
- package/dist/components/CreateRole/AddMembersForm.esm.js.map +1 -1
- package/dist/components/CreateRole/AddedMembersTable.esm.js +3 -3
- package/dist/components/CreateRole/AddedMembersTable.esm.js.map +1 -1
- package/dist/components/CreateRole/AddedMembersTableColumn.esm.js +4 -4
- package/dist/components/CreateRole/AddedMembersTableColumn.esm.js.map +1 -1
- package/dist/components/CreateRole/CancelDialog.esm.js +90 -0
- package/dist/components/CreateRole/CancelDialog.esm.js.map +1 -0
- package/dist/components/CreateRole/CreateRolePage.esm.js +6 -6
- package/dist/components/CreateRole/CreateRolePage.esm.js.map +1 -1
- package/dist/components/CreateRole/EditRolePage.esm.js +9 -5
- package/dist/components/CreateRole/EditRolePage.esm.js.map +1 -1
- package/dist/components/CreateRole/MembersDropdownOption.esm.js +4 -4
- package/dist/components/CreateRole/MembersDropdownOption.esm.js.map +1 -1
- package/dist/components/CreateRole/PermissionPoliciesForm.esm.js +98 -104
- package/dist/components/CreateRole/PermissionPoliciesForm.esm.js.map +1 -1
- package/dist/components/CreateRole/PermissionPoliciesFormNestedRow.esm.js +124 -0
- package/dist/components/CreateRole/PermissionPoliciesFormNestedRow.esm.js.map +1 -0
- package/dist/components/CreateRole/PermissionPoliciesFormRow.esm.js +104 -153
- package/dist/components/CreateRole/PermissionPoliciesFormRow.esm.js.map +1 -1
- package/dist/components/CreateRole/PermissionPoliciesFormTable.esm.js +174 -0
- package/dist/components/CreateRole/PermissionPoliciesFormTable.esm.js.map +1 -0
- package/dist/components/CreateRole/PluginsDropdown.esm.js +66 -0
- package/dist/components/CreateRole/PluginsDropdown.esm.js.map +1 -0
- package/dist/components/CreateRole/PluginsDropdownOption.esm.js +52 -0
- package/dist/components/CreateRole/PluginsDropdownOption.esm.js.map +1 -0
- package/dist/components/CreateRole/ReviewStep.esm.js +5 -5
- package/dist/components/CreateRole/ReviewStep.esm.js.map +1 -1
- package/dist/components/CreateRole/ReviewStepTable.esm.js +4 -4
- package/dist/components/CreateRole/ReviewStepTable.esm.js.map +1 -1
- package/dist/components/CreateRole/RoleDetailsForm.esm.js +4 -4
- package/dist/components/CreateRole/RoleDetailsForm.esm.js.map +1 -1
- package/dist/components/CreateRole/RoleForm.esm.js +30 -37
- package/dist/components/CreateRole/RoleForm.esm.js.map +1 -1
- package/dist/components/DownloadUserStatistics.esm.js +2 -2
- package/dist/components/DownloadUserStatistics.esm.js.map +1 -1
- package/dist/components/EditRole.esm.js +3 -3
- package/dist/components/EditRole.esm.js.map +1 -1
- package/dist/components/RbacPage.esm.js +3 -3
- package/dist/components/RbacPage.esm.js.map +1 -1
- package/dist/components/RoleOverview/AboutCard.esm.js +9 -9
- package/dist/components/RoleOverview/AboutCard.esm.js.map +1 -1
- package/dist/components/RoleOverview/MembersCard.esm.js +8 -8
- package/dist/components/RoleOverview/MembersCard.esm.js.map +1 -1
- package/dist/components/RoleOverview/MembersListColumns.esm.js +2 -2
- package/dist/components/RoleOverview/MembersListColumns.esm.js.map +1 -1
- package/dist/components/RoleOverview/PermissionsCard.esm.js +8 -8
- package/dist/components/RoleOverview/PermissionsCard.esm.js.map +1 -1
- package/dist/components/RoleOverview/RoleOverviewPage.esm.js +5 -5
- package/dist/components/RoleOverview/RoleOverviewPage.esm.js.map +1 -1
- package/dist/components/RolesList/DeleteRole.esm.js +3 -3
- package/dist/components/RolesList/DeleteRole.esm.js.map +1 -1
- package/dist/components/RolesList/DeleteRoleDialog.esm.js +15 -15
- package/dist/components/RolesList/DeleteRoleDialog.esm.js.map +1 -1
- package/dist/components/RolesList/RolesList.esm.js +9 -9
- package/dist/components/RolesList/RolesList.esm.js.map +1 -1
- package/dist/components/RolesList/RolesListColumns.esm.js +5 -5
- package/dist/components/RolesList/RolesListColumns.esm.js.map +1 -1
- package/dist/components/RolesList/RolesListToolbar.esm.js +5 -5
- package/dist/components/RolesList/RolesListToolbar.esm.js.map +1 -1
- package/dist/components/Router.esm.js +8 -8
- package/dist/components/Router.esm.js.map +1 -1
- package/dist/components/SnackbarAlert.esm.js +3 -3
- package/dist/components/SnackbarAlert.esm.js.map +1 -1
- package/dist/components/ToastContext.esm.js +4 -4
- package/dist/components/ToastContext.esm.js.map +1 -1
- package/dist/hooks/useMembers.esm.js +2 -2
- package/dist/hooks/useMembers.esm.js.map +1 -1
- package/dist/hooks/usePermissionPolicies.esm.js +9 -5
- package/dist/hooks/usePermissionPolicies.esm.js.map +1 -1
- package/dist/hooks/useRoles.esm.js +7 -9
- package/dist/hooks/useRoles.esm.js.map +1 -1
- package/dist/utils/create-role-utils.esm.js +14 -9
- package/dist/utils/create-role-utils.esm.js.map +1 -1
- package/dist/utils/rbac-utils.esm.js +21 -10
- package/dist/utils/rbac-utils.esm.js.map +1 -1
- package/dist/utils/role-form-utils.esm.js +17 -1
- package/dist/utils/role-form-utils.esm.js.map +1 -1
- package/package.json +1 -1
- package/dist/components/CreateRole/PoliciesCheckboxGroup.esm.js +0 -76
- package/dist/components/CreateRole/PoliciesCheckboxGroup.esm.js.map +0 -1
- package/dist/components/CreateRole/const.esm.js +0 -14
- package/dist/components/CreateRole/const.esm.js.map +0 -1
|
@@ -1,38 +1,26 @@
|
|
|
1
|
-
import
|
|
1
|
+
import React__default from 'react';
|
|
2
2
|
import { useAsync } from 'react-use';
|
|
3
3
|
import { Progress } from '@backstage/core-components';
|
|
4
4
|
import { useApi } from '@backstage/core-plugin-api';
|
|
5
|
-
import AddIcon from '@mui/icons-material/Add';
|
|
6
|
-
import Button from '@mui/material/Button';
|
|
7
5
|
import FormHelperText from '@mui/material/FormHelperText';
|
|
8
|
-
import { styled } from '@mui/material/styles';
|
|
9
6
|
import { rbacApiRef } from '../../api/RBACBackendClient.esm.js';
|
|
10
7
|
import { useConditionRules } from '../../hooks/useConditionRules.esm.js';
|
|
11
8
|
import { getPluginsPermissionPoliciesData } from '../../utils/create-role-utils.esm.js';
|
|
12
|
-
import
|
|
13
|
-
import
|
|
9
|
+
import PermissionPoliciesFormTable from './PermissionPoliciesFormTable.esm.js';
|
|
10
|
+
import PluginsDropdown from './PluginsDropdown.esm.js';
|
|
11
|
+
import Box from '@mui/material/Box';
|
|
14
12
|
|
|
15
|
-
const classes = {
|
|
16
|
-
permissionPoliciesForm: "permission-policies-form"
|
|
17
|
-
};
|
|
18
|
-
const PermissionPoliciesFormContainer = styled("div")(
|
|
19
|
-
({ theme }) => ({
|
|
20
|
-
[`&.${classes.permissionPoliciesForm}`]: {
|
|
21
|
-
padding: "20px",
|
|
22
|
-
border: `2px solid ${theme.palette.border}`,
|
|
23
|
-
borderRadius: "5px"
|
|
24
|
-
}
|
|
25
|
-
})
|
|
26
|
-
);
|
|
27
13
|
const PermissionPoliciesForm = ({
|
|
28
14
|
permissionPoliciesRows,
|
|
29
|
-
|
|
15
|
+
selectedPlugins,
|
|
30
16
|
setFieldValue,
|
|
31
17
|
setFieldError,
|
|
32
|
-
handleBlur
|
|
18
|
+
handleBlur,
|
|
19
|
+
selectedPluginsError
|
|
33
20
|
}) => {
|
|
34
21
|
const rbacApi = useApi(rbacApiRef);
|
|
35
22
|
const conditionRules = useConditionRules();
|
|
23
|
+
const { data: conditionRulesData } = conditionRules;
|
|
36
24
|
const {
|
|
37
25
|
value: permissionPolicies,
|
|
38
26
|
loading: permissionPoliciesLoading,
|
|
@@ -41,44 +29,28 @@ const PermissionPoliciesForm = ({
|
|
|
41
29
|
return await rbacApi.listPermissions();
|
|
42
30
|
});
|
|
43
31
|
const permissionPoliciesData = !permissionPoliciesLoading && Array.isArray(permissionPolicies) ? getPluginsPermissionPoliciesData(permissionPolicies) : undefined;
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
setFieldValue(`permissionPoliciesRows[${index}].isResourced`, false, false);
|
|
48
|
-
setFieldValue(
|
|
49
|
-
`permissionPoliciesRows[${index}].conditions`,
|
|
50
|
-
undefined,
|
|
51
|
-
false
|
|
52
|
-
);
|
|
53
|
-
setFieldValue(
|
|
54
|
-
`permissionPoliciesRows[${index}].policies`,
|
|
55
|
-
initialPermissionPolicyRowValue.policies,
|
|
56
|
-
false
|
|
57
|
-
);
|
|
58
|
-
};
|
|
59
|
-
const onChangePermission = (permission, index, isResourced, policies) => {
|
|
60
|
-
setFieldValue(
|
|
61
|
-
`permissionPoliciesRows[${index}].permission`,
|
|
32
|
+
const onSelectPermission = (plugin, permission, isResourced, policies, resourceType) => {
|
|
33
|
+
const ppr = {
|
|
34
|
+
plugin,
|
|
62
35
|
permission,
|
|
63
|
-
true
|
|
64
|
-
);
|
|
65
|
-
setFieldValue(
|
|
66
|
-
`permissionPoliciesRows[${index}].isResourced`,
|
|
67
36
|
isResourced,
|
|
68
|
-
|
|
69
|
-
|
|
37
|
+
policies: policies.map((p) => ({ policy: p, effect: "allow" })),
|
|
38
|
+
resourceType
|
|
39
|
+
};
|
|
70
40
|
setFieldValue(
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
41
|
+
"permissionPoliciesRows",
|
|
42
|
+
[...permissionPoliciesRows, ppr],
|
|
43
|
+
true
|
|
74
44
|
);
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
45
|
+
};
|
|
46
|
+
const onRemovePermission = (index) => {
|
|
47
|
+
const finalPps = permissionPoliciesRows.filter(
|
|
48
|
+
(_ppr, pIndex) => index !== pIndex
|
|
79
49
|
);
|
|
50
|
+
setFieldValue("permissionPoliciesRows", finalPps, true);
|
|
51
|
+
setFieldError(`permissionPoliciesRows[${index}]`, undefined);
|
|
80
52
|
};
|
|
81
|
-
const
|
|
53
|
+
const onSelectPolicy = (isChecked, policyIndex, index) => {
|
|
82
54
|
setFieldValue(
|
|
83
55
|
`permissionPoliciesRows[${index}].policies[${policyIndex}].effect`,
|
|
84
56
|
isChecked ? "allow" : "deny",
|
|
@@ -90,64 +62,86 @@ const PermissionPoliciesForm = ({
|
|
|
90
62
|
if (!conditions)
|
|
91
63
|
setFieldValue(`permissionPoliciesRows[${index}].id`, undefined);
|
|
92
64
|
};
|
|
93
|
-
const
|
|
65
|
+
const onRemoveAllPlugins = () => {
|
|
66
|
+
setFieldValue(`selectedPlugins`, [], true);
|
|
67
|
+
setFieldValue("permissionPoliciesRows", [], true);
|
|
68
|
+
};
|
|
69
|
+
const onRemovePlugin = (plugin) => {
|
|
70
|
+
const selPlugins = selectedPlugins.filter(
|
|
71
|
+
(sp) => sp.value && sp.value !== plugin
|
|
72
|
+
);
|
|
94
73
|
const finalPps = permissionPoliciesRows.filter(
|
|
95
|
-
(
|
|
74
|
+
(ppr) => ppr.plugin !== plugin
|
|
96
75
|
);
|
|
97
|
-
|
|
98
|
-
setFieldValue("permissionPoliciesRows", finalPps,
|
|
76
|
+
setFieldValue(`selectedPlugins`, selPlugins, true);
|
|
77
|
+
setFieldValue("permissionPoliciesRows", finalPps, true);
|
|
99
78
|
};
|
|
100
|
-
const
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
},
|
|
110
|
-
permissionPoliciesRows.map((pp, index) => /* @__PURE__ */ React.createElement(
|
|
111
|
-
PermissionPoliciesFormRow,
|
|
79
|
+
const getAllPlugins = () => {
|
|
80
|
+
let allPlugins = [];
|
|
81
|
+
if (permissionPoliciesData?.plugins) {
|
|
82
|
+
allPlugins = permissionPoliciesData.plugins.map((p) => ({
|
|
83
|
+
label: p.charAt(0).toLocaleUpperCase("en-US") + p.substring(1),
|
|
84
|
+
value: p
|
|
85
|
+
}));
|
|
86
|
+
}
|
|
87
|
+
const allPluginsItem = allPlugins.length > 0 ? [
|
|
112
88
|
{
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
(ppp) => ppp.permission === permission
|
|
132
|
-
);
|
|
133
|
-
return previouslySelectedPermission && !permissionPoliciesData?.pluginsPermissions[pp.plugin]?.policies[permission ?? ""]?.isResourced;
|
|
89
|
+
label: `All plugins (${allPlugins.length})`,
|
|
90
|
+
value: ""
|
|
91
|
+
}
|
|
92
|
+
] : [];
|
|
93
|
+
return [...allPluginsItem, ...allPlugins];
|
|
94
|
+
};
|
|
95
|
+
const getPermissionPoliciesTableData = () => {
|
|
96
|
+
return selectedPlugins.map(
|
|
97
|
+
(p) => p.value ? [
|
|
98
|
+
{
|
|
99
|
+
name: p.label,
|
|
100
|
+
plugin: p.value,
|
|
101
|
+
permissionPolicies: permissionPoliciesData?.pluginsPermissions[p.value].permissions.map((perm) => ({
|
|
102
|
+
permission: perm,
|
|
103
|
+
actions: permissionPoliciesData?.pluginsPermissions[p.value].policies[perm].policies,
|
|
104
|
+
isResourced: permissionPoliciesData?.pluginsPermissions[p.value].policies[perm].isResourced,
|
|
105
|
+
resourceType: permissionPoliciesData?.pluginsPermissions[p.value].policies[perm].resourceType
|
|
106
|
+
}))
|
|
134
107
|
}
|
|
108
|
+
] : []
|
|
109
|
+
).flat();
|
|
110
|
+
};
|
|
111
|
+
const getSelectedPluginsCount = () => {
|
|
112
|
+
if (selectedPlugins?.length > 0) {
|
|
113
|
+
if (selectedPlugins.findIndex((sp) => sp.value === "") >= 0) {
|
|
114
|
+
return selectedPlugins.length - 1;
|
|
135
115
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
116
|
+
return selectedPlugins.length;
|
|
117
|
+
}
|
|
118
|
+
return 0;
|
|
119
|
+
};
|
|
120
|
+
return /* @__PURE__ */ React__default.createElement("div", null, /* @__PURE__ */ React__default.createElement(FormHelperText, null, "By default, users are not granted access to any plugins. To grant user access, select the plugins you want to enable. Then, select which actions you would like to give user permission to."), /* @__PURE__ */ React__default.createElement("br", null), permissionPoliciesLoading ? /* @__PURE__ */ React__default.createElement(Progress, null) : /* @__PURE__ */ React__default.createElement(Box, null, /* @__PURE__ */ React__default.createElement(
|
|
121
|
+
PluginsDropdown,
|
|
122
|
+
{
|
|
123
|
+
allPlugins: getAllPlugins(),
|
|
124
|
+
selectedPlugins,
|
|
125
|
+
setFieldValue,
|
|
126
|
+
handleBlur,
|
|
127
|
+
onRemovePlugin,
|
|
128
|
+
onRemoveAllPlugins,
|
|
129
|
+
selectedPluginsError
|
|
130
|
+
}
|
|
131
|
+
), /* @__PURE__ */ React__default.createElement("br", null), /* @__PURE__ */ React__default.createElement("br", null), /* @__PURE__ */ React__default.createElement(
|
|
132
|
+
PermissionPoliciesFormTable,
|
|
133
|
+
{
|
|
134
|
+
selectedPluginsCount: getSelectedPluginsCount(),
|
|
135
|
+
data: getPermissionPoliciesTableData(),
|
|
136
|
+
permissionPoliciesRows: permissionPoliciesRows ?? [],
|
|
137
|
+
onSelectPermission,
|
|
138
|
+
onSelectPolicy,
|
|
139
|
+
conditionRulesData,
|
|
140
|
+
onRemovePermission,
|
|
141
|
+
onRemovePlugin,
|
|
142
|
+
onAddConditions
|
|
143
|
+
}
|
|
144
|
+
)), !permissionPoliciesLoading && (permissionPoliciesErr?.message || !Array.isArray(permissionPolicies)) && /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement("br", null), /* @__PURE__ */ React__default.createElement(FormHelperText, { error: true }, `Error fetching the permission policies: ${permissionPoliciesErr?.message || permissionPolicies?.statusText}`)));
|
|
151
145
|
};
|
|
152
146
|
|
|
153
147
|
export { PermissionPoliciesForm };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PermissionPoliciesForm.esm.js","sources":["../../../src/components/CreateRole/PermissionPoliciesForm.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 { useAsync } from 'react-use';\n\nimport { Progress } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport AddIcon from '@mui/icons-material/Add';\nimport Button from '@mui/material/Button';\nimport FormHelperText from '@mui/material/FormHelperText';\nimport { styled, Theme } from '@mui/material/styles';\nimport { FormikErrors } from 'formik';\n\nimport { rbacApiRef } from '../../api/RBACBackendClient';\nimport { useConditionRules } from '../../hooks/useConditionRules';\nimport { PermissionsData } from '../../types';\nimport { getPluginsPermissionPoliciesData } from '../../utils/create-role-utils';\nimport { ConditionsData } from '../ConditionalAccess/types';\nimport { initialPermissionPolicyRowValue } from './const';\nimport { PermissionPoliciesFormRow } from './PermissionPoliciesFormRow';\nimport { RoleFormValues } from './types';\n\nconst classes = {\n permissionPoliciesForm: 'permission-policies-form',\n};\n\nconst PermissionPoliciesFormContainer = styled('div')(\n ({ theme }: { theme: Theme }) => ({\n [`&.${classes.permissionPoliciesForm}`]: {\n padding: '20px',\n border: `2px solid ${theme.palette.border}`,\n borderRadius: '5px',\n },\n }),\n);\n\ntype PermissionPoliciesFormProps = {\n permissionPoliciesRows: PermissionsData[];\n permissionPoliciesRowsError: FormikErrors<PermissionsData>[];\n setFieldValue: (\n field: string,\n value: any,\n shouldValidate?: boolean,\n ) => Promise<FormikErrors<RoleFormValues>> | Promise<void>;\n setFieldError: (field: string, value: string | undefined) => void;\n handleBlur: React.FocusEventHandler<HTMLInputElement | HTMLTextAreaElement>;\n};\n\nexport const PermissionPoliciesForm = ({\n permissionPoliciesRows,\n permissionPoliciesRowsError,\n setFieldValue,\n setFieldError,\n handleBlur,\n}: PermissionPoliciesFormProps) => {\n const rbacApi = useApi(rbacApiRef);\n const conditionRules = useConditionRules();\n\n const {\n value: permissionPolicies,\n loading: permissionPoliciesLoading,\n error: permissionPoliciesErr,\n } = useAsync(async () => {\n return await rbacApi.listPermissions();\n });\n\n const permissionPoliciesData =\n !permissionPoliciesLoading && Array.isArray(permissionPolicies)\n ? getPluginsPermissionPoliciesData(permissionPolicies)\n : undefined;\n\n const onChangePlugin = (plugin: string, index: number) => {\n setFieldValue(`permissionPoliciesRows[${index}].plugin`, plugin, true);\n setFieldValue(`permissionPoliciesRows[${index}].permission`, '', false);\n setFieldValue(`permissionPoliciesRows[${index}].isResourced`, false, false);\n setFieldValue(\n `permissionPoliciesRows[${index}].conditions`,\n undefined,\n false,\n );\n setFieldValue(\n `permissionPoliciesRows[${index}].policies`,\n initialPermissionPolicyRowValue.policies,\n false,\n );\n };\n\n const onChangePermission = (\n permission: string,\n index: number,\n isResourced: boolean,\n policies?: string[],\n ) => {\n setFieldValue(\n `permissionPoliciesRows[${index}].permission`,\n permission,\n true,\n );\n setFieldValue(\n `permissionPoliciesRows[${index}].isResourced`,\n isResourced,\n false,\n );\n setFieldValue(\n `permissionPoliciesRows[${index}].conditions`,\n undefined,\n false,\n );\n setFieldValue(\n `permissionPoliciesRows[${index}].policies`,\n policies\n ? policies.map(p => ({ policy: p, effect: 'allow' }))\n : initialPermissionPolicyRowValue.policies,\n false,\n );\n };\n\n const onChangePolicy = (\n isChecked: boolean,\n policyIndex: number,\n index: number,\n ) => {\n setFieldValue(\n `permissionPoliciesRows[${index}].policies[${policyIndex}].effect`,\n isChecked ? 'allow' : 'deny',\n true,\n );\n };\n\n const onAddConditions = (index: number, conditions?: ConditionsData) => {\n setFieldValue(`permissionPoliciesRows[${index}].conditions`, conditions);\n if (!conditions)\n setFieldValue(`permissionPoliciesRows[${index}].id`, undefined);\n };\n\n const onRowRemove = (index: number) => {\n const finalPps = permissionPoliciesRows.filter(\n (_pp, ppIndex) => index !== ppIndex,\n );\n setFieldError(`permissionPoliciesRows[${index}]`, undefined);\n setFieldValue('permissionPoliciesRows', finalPps, false);\n };\n\n const onRowAdd = () =>\n setFieldValue(\n 'permissionPoliciesRows',\n [...permissionPoliciesRows, initialPermissionPolicyRowValue],\n false,\n );\n\n return (\n <div>\n <FormHelperText>\n Permission policies can be selected for each plugin. You can add\n multiple permission policies using +Add option.\n </FormHelperText>\n <br />\n {permissionPoliciesLoading ? (\n <Progress />\n ) : (\n <PermissionPoliciesFormContainer\n className={classes.permissionPoliciesForm}\n >\n {permissionPoliciesRows.map((pp, index) => (\n <PermissionPoliciesFormRow\n key={index}\n permissionPoliciesRowError={\n permissionPoliciesRowsError?.[index] ?? {}\n }\n rowName={`permissionPoliciesRows[${index}]`}\n permissionPoliciesRowData={pp}\n permissionPoliciesData={permissionPoliciesData}\n rowCount={permissionPoliciesRows.length}\n conditionRules={conditionRules}\n onChangePlugin={(plugin: string) => onChangePlugin(plugin, index)}\n onChangePermission={(\n permission: string,\n isResourced: boolean,\n policies?: string[],\n ) => onChangePermission(permission, index, isResourced, policies)}\n onChangePolicy={(isChecked: boolean, policyIndex: number) =>\n onChangePolicy(isChecked, policyIndex, index)\n }\n onAddConditions={(conditions?: ConditionsData) =>\n onAddConditions(index, conditions)\n }\n onRemove={() => onRowRemove(index)}\n handleBlur={handleBlur}\n getPermissionDisabled={(permission: string) => {\n const pluginPermissionPolicies = permissionPoliciesRows.filter(\n ppr => ppr.plugin === pp.plugin,\n );\n const previouslySelectedPermission =\n !!pluginPermissionPolicies.find(\n ppp => ppp.permission === permission,\n );\n return (\n previouslySelectedPermission &&\n !permissionPoliciesData?.pluginsPermissions[pp.plugin]\n ?.policies[permission ?? '']?.isResourced\n );\n }}\n />\n ))}\n <Button\n sx={{\n color: theme => theme.palette.primary.light,\n }}\n size=\"small\"\n onClick={onRowAdd}\n name=\"add-permission-policy\"\n >\n <AddIcon />\n Add\n </Button>\n </PermissionPoliciesFormContainer>\n )}\n {!permissionPoliciesLoading &&\n (permissionPoliciesErr?.message ||\n !Array.isArray(permissionPolicies)) && (\n <>\n <br />\n <FormHelperText error>\n {`Error fetching the permission policies: ${\n permissionPoliciesErr?.message ||\n (permissionPolicies as Response)?.statusText\n }`}\n </FormHelperText>\n </>\n )}\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PermissionPoliciesForm.esm.js","sources":["../../../src/components/CreateRole/PermissionPoliciesForm.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 { useAsync } from 'react-use';\n\nimport { Progress } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport FormHelperText from '@mui/material/FormHelperText';\nimport { FormikErrors } from 'formik';\n\nimport { rbacApiRef } from '../../api/RBACBackendClient';\nimport { useConditionRules } from '../../hooks/useConditionRules';\nimport { PermissionsData, SelectedPlugin } from '../../types';\nimport { getPluginsPermissionPoliciesData } from '../../utils/create-role-utils';\nimport { ConditionsData } from '../ConditionalAccess/types';\nimport { RoleFormValues } from './types';\nimport PermissionPoliciesFormTable from './PermissionPoliciesFormTable';\nimport PluginsDropdown from './PluginsDropdown';\nimport Box from '@mui/material/Box';\n\ntype PermissionPoliciesFormProps = {\n permissionPoliciesRows: PermissionsData[];\n selectedPlugins: SelectedPlugin[];\n setFieldValue: (\n field: string,\n value: any,\n shouldValidate?: boolean,\n ) => Promise<FormikErrors<RoleFormValues>> | Promise<void>;\n setFieldError: (field: string, value: string | undefined) => void;\n handleBlur: React.FocusEventHandler<HTMLInputElement | HTMLTextAreaElement>;\n selectedPluginsError: string;\n};\n\nexport const PermissionPoliciesForm = ({\n permissionPoliciesRows,\n selectedPlugins,\n setFieldValue,\n setFieldError,\n handleBlur,\n selectedPluginsError,\n}: PermissionPoliciesFormProps) => {\n const rbacApi = useApi(rbacApiRef);\n const conditionRules = useConditionRules();\n\n const { data: conditionRulesData } = conditionRules;\n\n const {\n value: permissionPolicies,\n loading: permissionPoliciesLoading,\n error: permissionPoliciesErr,\n } = useAsync(async () => {\n return await rbacApi.listPermissions();\n });\n\n const permissionPoliciesData =\n !permissionPoliciesLoading && Array.isArray(permissionPolicies)\n ? getPluginsPermissionPoliciesData(permissionPolicies)\n : undefined;\n\n const onSelectPermission = (\n plugin: string,\n permission: string,\n isResourced: boolean,\n policies: string[],\n resourceType?: string,\n ) => {\n const ppr = {\n plugin,\n permission,\n isResourced,\n policies: policies.map(p => ({ policy: p, effect: 'allow' })),\n resourceType,\n };\n setFieldValue(\n 'permissionPoliciesRows',\n [...permissionPoliciesRows, ppr],\n true,\n );\n };\n\n const onRemovePermission = (index: number) => {\n const finalPps = permissionPoliciesRows.filter(\n (_ppr, pIndex) => index !== pIndex,\n );\n setFieldValue('permissionPoliciesRows', finalPps, true);\n setFieldError(`permissionPoliciesRows[${index}]`, undefined);\n };\n\n const onSelectPolicy = (\n isChecked: boolean,\n policyIndex: number,\n index: number,\n ) => {\n setFieldValue(\n `permissionPoliciesRows[${index}].policies[${policyIndex}].effect`,\n isChecked ? 'allow' : 'deny',\n true,\n );\n };\n\n const onAddConditions = (index: number, conditions?: ConditionsData) => {\n setFieldValue(`permissionPoliciesRows[${index}].conditions`, conditions);\n if (!conditions)\n setFieldValue(`permissionPoliciesRows[${index}].id`, undefined);\n };\n\n const onRemoveAllPlugins = () => {\n setFieldValue(`selectedPlugins`, [], true);\n setFieldValue('permissionPoliciesRows', [], true);\n };\n\n const onRemovePlugin = (plugin: string) => {\n const selPlugins = selectedPlugins.filter(\n sp => sp.value && sp.value !== plugin,\n );\n const finalPps = permissionPoliciesRows.filter(\n ppr => ppr.plugin !== plugin,\n );\n setFieldValue(`selectedPlugins`, selPlugins, true);\n setFieldValue('permissionPoliciesRows', finalPps, true);\n };\n\n const getAllPlugins = () => {\n let allPlugins: SelectedPlugin[] = [];\n if (permissionPoliciesData?.plugins) {\n allPlugins = permissionPoliciesData.plugins.map(p => ({\n label: p.charAt(0).toLocaleUpperCase('en-US') + p.substring(1),\n value: p,\n }));\n }\n const allPluginsItem =\n allPlugins.length > 0\n ? [\n {\n label: `All plugins (${allPlugins.length})`,\n value: '',\n },\n ]\n : [];\n return [...allPluginsItem, ...allPlugins];\n };\n\n const getPermissionPoliciesTableData = () => {\n return selectedPlugins\n .map(p =>\n p.value\n ? [\n {\n name: p.label,\n plugin: p.value,\n permissionPolicies: permissionPoliciesData?.pluginsPermissions[\n p.value\n ].permissions.map(perm => ({\n permission: perm,\n actions:\n permissionPoliciesData?.pluginsPermissions[p.value]\n .policies[perm].policies,\n isResourced:\n permissionPoliciesData?.pluginsPermissions[p.value]\n .policies[perm].isResourced,\n resourceType:\n permissionPoliciesData?.pluginsPermissions[p.value]\n .policies[perm].resourceType,\n })),\n },\n ]\n : [],\n )\n .flat();\n };\n\n const getSelectedPluginsCount = () => {\n if (selectedPlugins?.length > 0) {\n if (selectedPlugins.findIndex(sp => sp.value === '') >= 0) {\n return selectedPlugins.length - 1;\n }\n return selectedPlugins.length;\n }\n return 0;\n };\n\n return (\n <div>\n <FormHelperText>\n By default, users are not granted access to any plugins. To grant user\n access, select the plugins you want to enable. Then, select which\n actions you would like to give user permission to.\n </FormHelperText>\n <br />\n {permissionPoliciesLoading ? (\n <Progress />\n ) : (\n <Box>\n <PluginsDropdown\n allPlugins={getAllPlugins()}\n selectedPlugins={selectedPlugins}\n setFieldValue={setFieldValue}\n handleBlur={handleBlur}\n onRemovePlugin={onRemovePlugin}\n onRemoveAllPlugins={onRemoveAllPlugins}\n selectedPluginsError={selectedPluginsError}\n />\n <br />\n <br />\n <PermissionPoliciesFormTable\n selectedPluginsCount={getSelectedPluginsCount()}\n data={getPermissionPoliciesTableData()}\n permissionPoliciesRows={permissionPoliciesRows ?? []}\n onSelectPermission={onSelectPermission}\n onSelectPolicy={onSelectPolicy}\n conditionRulesData={conditionRulesData}\n onRemovePermission={onRemovePermission}\n onRemovePlugin={onRemovePlugin}\n onAddConditions={onAddConditions}\n />\n </Box>\n )}\n {!permissionPoliciesLoading &&\n (permissionPoliciesErr?.message ||\n !Array.isArray(permissionPolicies)) && (\n <>\n <br />\n <FormHelperText error>\n {`Error fetching the permission policies: ${\n permissionPoliciesErr?.message ||\n (permissionPolicies as Response)?.statusText\n }`}\n </FormHelperText>\n </>\n )}\n </div>\n );\n};\n"],"names":["React"],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import Box from '@mui/material/Box';
|
|
2
|
+
import Checkbox from '@mui/material/Checkbox';
|
|
3
|
+
import TableCell from '@mui/material/TableCell';
|
|
4
|
+
import TableRow from '@mui/material/TableRow';
|
|
5
|
+
import Typography from '@mui/material/Typography';
|
|
6
|
+
import React__default from 'react';
|
|
7
|
+
import Tooltip from '@mui/material/Tooltip';
|
|
8
|
+
import IconButton from '@mui/material/IconButton';
|
|
9
|
+
import ChecklistRtlIcon from '@mui/icons-material/ChecklistRtl';
|
|
10
|
+
import Badge from '@mui/material/Badge';
|
|
11
|
+
import { ConditionalAccessSidebar } from '../ConditionalAccess/ConditionalAccessSidebar.esm.js';
|
|
12
|
+
import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined';
|
|
13
|
+
|
|
14
|
+
const PermissionPoliciesFormNestedRow = ({
|
|
15
|
+
plugin,
|
|
16
|
+
permissionPolicy,
|
|
17
|
+
permissionPolicyRowIndex,
|
|
18
|
+
onSelectPermission,
|
|
19
|
+
policies,
|
|
20
|
+
onSelectPolicy,
|
|
21
|
+
conditionRulesLength,
|
|
22
|
+
totalRulesCount,
|
|
23
|
+
onRemovePermission,
|
|
24
|
+
conditionRulesData,
|
|
25
|
+
conditionsData,
|
|
26
|
+
onAddConditions
|
|
27
|
+
}) => {
|
|
28
|
+
const [sidebarOpen, setSidebarOpen] = React__default.useState(false);
|
|
29
|
+
const tooltipTitle = () => /* @__PURE__ */ React__default.createElement("div", null, /* @__PURE__ */ React__default.createElement(Typography, { component: "p", align: "center" }, "Use advanced customized permissions to allow access to specific parts of the selected resource type."));
|
|
30
|
+
return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(TableRow, null, /* @__PURE__ */ React__default.createElement(TableCell, { align: "left", sx: { borderBottom: "none", width: "30%" } }, /* @__PURE__ */ React__default.createElement(
|
|
31
|
+
Box,
|
|
32
|
+
{
|
|
33
|
+
sx: {
|
|
34
|
+
display: "flex",
|
|
35
|
+
alignItems: "center"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
/* @__PURE__ */ React__default.createElement(
|
|
39
|
+
Checkbox,
|
|
40
|
+
{
|
|
41
|
+
onChange: (e) => {
|
|
42
|
+
if (e.target.checked) {
|
|
43
|
+
onSelectPermission(
|
|
44
|
+
plugin,
|
|
45
|
+
permissionPolicy.permission,
|
|
46
|
+
permissionPolicy.isResourced,
|
|
47
|
+
permissionPolicy.actions,
|
|
48
|
+
permissionPolicy.resourceType
|
|
49
|
+
);
|
|
50
|
+
} else {
|
|
51
|
+
onRemovePermission(permissionPolicyRowIndex);
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
checked: permissionPolicyRowIndex >= 0
|
|
55
|
+
}
|
|
56
|
+
),
|
|
57
|
+
permissionPolicy.permission,
|
|
58
|
+
permissionPolicy.resourceType ? /* @__PURE__ */ React__default.createElement(
|
|
59
|
+
Tooltip,
|
|
60
|
+
{
|
|
61
|
+
title: `resource type: ${permissionPolicy.resourceType}`,
|
|
62
|
+
placement: "top"
|
|
63
|
+
},
|
|
64
|
+
/* @__PURE__ */ React__default.createElement(IconButton, { "aria-label": "info", size: "small" }, /* @__PURE__ */ React__default.createElement(InfoOutlinedIcon, { fontSize: "small" }), "\xA0")
|
|
65
|
+
) : null
|
|
66
|
+
)), /* @__PURE__ */ React__default.createElement(
|
|
67
|
+
TableCell,
|
|
68
|
+
{
|
|
69
|
+
align: "left",
|
|
70
|
+
sx: {
|
|
71
|
+
display: "flex",
|
|
72
|
+
borderBottom: "none",
|
|
73
|
+
width: "100%"
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
policies.map((p, pIndex) => /* @__PURE__ */ React__default.createElement(
|
|
77
|
+
Box,
|
|
78
|
+
{
|
|
79
|
+
sx: { display: "flex", alignItems: "center" },
|
|
80
|
+
key: `${permissionPolicy.permission}-${p.policy}`
|
|
81
|
+
},
|
|
82
|
+
/* @__PURE__ */ React__default.createElement(
|
|
83
|
+
Checkbox,
|
|
84
|
+
{
|
|
85
|
+
onChange: (_e, checked) => onSelectPolicy(checked, pIndex, permissionPolicyRowIndex),
|
|
86
|
+
checked: p.effect === "allow",
|
|
87
|
+
disabled: permissionPolicyRowIndex < 0
|
|
88
|
+
}
|
|
89
|
+
),
|
|
90
|
+
p.policy
|
|
91
|
+
))
|
|
92
|
+
), /* @__PURE__ */ React__default.createElement(TableCell, { align: "right", sx: { borderBottom: "none", width: "10%" } }, /* @__PURE__ */ React__default.createElement(Tooltip, { title: tooltipTitle(), placement: "top" }, /* @__PURE__ */ React__default.createElement(Typography, { component: "span" }, /* @__PURE__ */ React__default.createElement(
|
|
93
|
+
IconButton,
|
|
94
|
+
{
|
|
95
|
+
"aria-label": "remove",
|
|
96
|
+
size: "small",
|
|
97
|
+
onClick: () => setSidebarOpen(true),
|
|
98
|
+
disabled: permissionPolicyRowIndex < 0 || !permissionPolicy.isResourced || !conditionRulesLength,
|
|
99
|
+
sx: {
|
|
100
|
+
":disabled": { color: (theme) => theme.palette.grey[400] }
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
/* @__PURE__ */ React__default.createElement(Badge, { badgeContent: totalRulesCount, color: "success" }, /* @__PURE__ */ React__default.createElement(ChecklistRtlIcon, null)),
|
|
104
|
+
"\xA0"
|
|
105
|
+
))))), /* @__PURE__ */ React__default.createElement(
|
|
106
|
+
ConditionalAccessSidebar,
|
|
107
|
+
{
|
|
108
|
+
open: sidebarOpen,
|
|
109
|
+
onClose: () => {
|
|
110
|
+
setSidebarOpen(false);
|
|
111
|
+
},
|
|
112
|
+
onSave: (conditions) => {
|
|
113
|
+
onAddConditions(permissionPolicyRowIndex, conditions);
|
|
114
|
+
setSidebarOpen(false);
|
|
115
|
+
},
|
|
116
|
+
conditionsFormVal: conditionsData,
|
|
117
|
+
selPluginResourceType: permissionPolicy.resourceType,
|
|
118
|
+
conditionRulesData: conditionRulesData?.[`${plugin}`]?.[`${permissionPolicy.resourceType}`]
|
|
119
|
+
}
|
|
120
|
+
));
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
export { PermissionPoliciesFormNestedRow as default };
|
|
124
|
+
//# sourceMappingURL=PermissionPoliciesFormNestedRow.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PermissionPoliciesFormNestedRow.esm.js","sources":["../../../src/components/CreateRole/PermissionPoliciesFormNestedRow.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 Box from '@mui/material/Box';\nimport Checkbox from '@mui/material/Checkbox';\nimport TableCell from '@mui/material/TableCell';\nimport TableRow from '@mui/material/TableRow';\nimport Typography from '@mui/material/Typography';\nimport React from 'react';\nimport { RowPolicy } from './types';\nimport Tooltip from '@mui/material/Tooltip';\nimport IconButton from '@mui/material/IconButton';\nimport ChecklistRtlIcon from '@mui/icons-material/ChecklistRtl';\nimport Badge from '@mui/material/Badge';\nimport { ConditionRulesData, ConditionsData } from '../ConditionalAccess/types';\nimport { ConditionalAccessSidebar } from '../ConditionalAccess/ConditionalAccessSidebar';\nimport InfoOutlinedIcon from '@mui/icons-material/InfoOutlined';\n\nconst PermissionPoliciesFormNestedRow = ({\n plugin,\n permissionPolicy,\n permissionPolicyRowIndex,\n onSelectPermission,\n policies,\n onSelectPolicy,\n conditionRulesLength,\n totalRulesCount,\n onRemovePermission,\n conditionRulesData,\n conditionsData,\n onAddConditions,\n}: {\n plugin: string;\n permissionPolicy: any;\n permissionPolicyRowIndex: number;\n policies: RowPolicy[];\n conditionRulesLength?: number;\n totalRulesCount: number;\n conditionRulesData?: ConditionRulesData;\n conditionsData?: ConditionsData;\n onSelectPermission: (\n plugin: string,\n permission: string,\n isResourced: boolean,\n policies: string[],\n resourceType?: string,\n ) => void;\n onSelectPolicy: (\n isChecked: boolean,\n policyIndex: number,\n pIndex: number,\n ) => void;\n onRemovePermission: (index: number) => void;\n onAddConditions: (index: number, conditions?: ConditionsData) => void;\n}) => {\n const [sidebarOpen, setSidebarOpen] = React.useState(false);\n const tooltipTitle = () => (\n <div>\n <Typography component=\"p\" align=\"center\">\n Use advanced customized permissions to allow access to specific parts of\n the selected resource type.\n </Typography>\n </div>\n );\n return (\n <>\n <TableRow>\n <TableCell align=\"left\" sx={{ borderBottom: 'none', width: '30%' }}>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n }}\n >\n <Checkbox\n onChange={e => {\n if (e.target.checked) {\n onSelectPermission(\n plugin,\n permissionPolicy.permission,\n permissionPolicy.isResourced,\n permissionPolicy.actions,\n permissionPolicy.resourceType,\n );\n } else {\n onRemovePermission(permissionPolicyRowIndex);\n }\n }}\n checked={permissionPolicyRowIndex >= 0}\n />\n {permissionPolicy.permission}\n {permissionPolicy.resourceType ? (\n <Tooltip\n title={`resource type: ${permissionPolicy.resourceType}`}\n placement=\"top\"\n >\n <IconButton aria-label=\"info\" size=\"small\">\n <InfoOutlinedIcon fontSize=\"small\" />\n \n </IconButton>\n </Tooltip>\n ) : null}\n </Box>\n </TableCell>\n <TableCell\n align=\"left\"\n sx={{\n display: 'flex',\n borderBottom: 'none',\n width: '100%',\n }}\n >\n {policies.map((p: RowPolicy, pIndex: number) => (\n <Box\n sx={{ display: 'flex', alignItems: 'center' }}\n key={`${permissionPolicy.permission}-${p.policy}`}\n >\n <Checkbox\n onChange={(_e, checked) =>\n onSelectPolicy(checked, pIndex, permissionPolicyRowIndex)\n }\n checked={p.effect === 'allow'}\n disabled={permissionPolicyRowIndex < 0}\n />\n {p.policy}\n </Box>\n ))}\n </TableCell>\n <TableCell align=\"right\" sx={{ borderBottom: 'none', width: '10%' }}>\n <Tooltip title={tooltipTitle()} placement=\"top\">\n <Typography component=\"span\">\n <IconButton\n aria-label=\"remove\"\n size=\"small\"\n onClick={() => setSidebarOpen(true)}\n disabled={\n permissionPolicyRowIndex < 0 ||\n !permissionPolicy.isResourced ||\n !conditionRulesLength\n }\n sx={{\n ':disabled': { color: theme => theme.palette.grey[400] },\n }}\n >\n <Badge badgeContent={totalRulesCount} color=\"success\">\n <ChecklistRtlIcon />\n </Badge>\n \n </IconButton>\n </Typography>\n </Tooltip>\n </TableCell>\n </TableRow>\n <ConditionalAccessSidebar\n open={sidebarOpen}\n onClose={() => {\n setSidebarOpen(false);\n }}\n onSave={(conditions?: ConditionsData) => {\n onAddConditions(permissionPolicyRowIndex, conditions);\n setSidebarOpen(false);\n }}\n conditionsFormVal={conditionsData}\n selPluginResourceType={permissionPolicy.resourceType}\n conditionRulesData={\n conditionRulesData?.[`${plugin}`]?.[\n `${permissionPolicy.resourceType}`\n ]\n }\n />\n </>\n );\n};\n\nexport default PermissionPoliciesFormNestedRow;\n"],"names":["React"],"mappings":"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"}
|