@backstage-community/plugin-rbac 1.33.0 → 1.33.1
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 +6 -0
- package/dist/components/CreateRole/AddedMembersTableColumn.esm.js +3 -1
- package/dist/components/CreateRole/AddedMembersTableColumn.esm.js.map +1 -1
- package/dist/components/CreateRole/RoleForm.esm.js +1 -1
- package/dist/components/CreateRole/RoleForm.esm.js.map +1 -1
- package/dist/components/DownloadUserStatistics.esm.js +2 -1
- package/dist/components/DownloadUserStatistics.esm.js.map +1 -1
- package/dist/components/EditRole.esm.js +5 -4
- package/dist/components/EditRole.esm.js.map +1 -1
- package/dist/components/RolesList/DeleteRole.esm.js +4 -3
- package/dist/components/RolesList/DeleteRole.esm.js.map +1 -1
- package/dist/components/RolesList/DeleteRoleDialog.esm.js +48 -30
- package/dist/components/RolesList/DeleteRoleDialog.esm.js.map +1 -1
- package/dist/components/RolesList/RolesListToolbar.esm.js +1 -1
- package/dist/components/RolesList/RolesListToolbar.esm.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -65,7 +65,9 @@ const selectedMembersColumns = (selectedMembers, setFieldValue) => {
|
|
|
65
65
|
{
|
|
66
66
|
onClick: () => onRemove(mem.etag),
|
|
67
67
|
"aria-label": "Remove",
|
|
68
|
-
title: "Remove member"
|
|
68
|
+
title: "Remove member",
|
|
69
|
+
style: { padding: "0.5rem", borderRadius: "50%" },
|
|
70
|
+
sx: { "&:hover": { borderRadius: "50%" } }
|
|
69
71
|
},
|
|
70
72
|
/* @__PURE__ */ React.createElement(Delete, null)
|
|
71
73
|
));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddedMembersTableColumn.esm.js","sources":["../../../src/components/CreateRole/AddedMembersTableColumn.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 { parseEntityRef } from '@backstage/catalog-model';\nimport { Link, TableColumn } from '@backstage/core-components';\n\nimport Delete from '@mui/icons-material/Delete';\nimport Box from '@mui/material/Box';\nimport IconButton from '@mui/material/IconButton';\nimport { FormikErrors } from 'formik';\n\nimport { RoleFormValues, SelectedMember } from './types';\n\nexport const reviewStepMemebersTableColumns = () => [\n {\n title: 'Name',\n field: 'label',\n type: 'string',\n },\n {\n title: 'Type',\n field: 'type',\n type: 'string',\n },\n {\n title: 'Members',\n field: 'members',\n type: 'numeric',\n align: 'left',\n render: (mem: number) => {\n if (mem || mem === 0) return mem;\n return '-';\n },\n },\n];\n\nexport const selectedMembersColumns = (\n selectedMembers: SelectedMember[],\n setFieldValue: (\n field: string,\n value: any,\n shouldValidate?: boolean,\n ) => Promise<FormikErrors<RoleFormValues>> | Promise<void>,\n): TableColumn<SelectedMember>[] => {\n const onRemove = (etag: string) => {\n const updatedMembers = selectedMembers.filter(\n (mem: SelectedMember) => mem.etag !== etag,\n );\n setFieldValue('selectedMembers', updatedMembers);\n };\n\n return [\n {\n title: 'Name',\n field: 'label',\n type: 'string',\n render: props => {\n const { kind, namespace, name } = parseEntityRef(props.ref);\n return (\n <Link to={`/catalog/${namespace}/${kind}/${name}`} target=\"blank\">\n {props.label}\n </Link>\n );\n },\n },\n {\n title: 'Type',\n field: 'type',\n type: 'string',\n },\n {\n title: 'Members',\n field: 'members',\n type: 'numeric',\n align: 'left',\n emptyValue: '-',\n },\n {\n title: 'Actions',\n sorting: false,\n render: (mem: SelectedMember) => {\n return (\n <Box key={mem.etag}>\n <IconButton\n onClick={() => onRemove(mem.etag)}\n aria-label=\"Remove\"\n title=\"Remove member\"\n >\n <Delete />\n </IconButton>\n </Box>\n );\n },\n },\n ];\n};\n"],"names":[],"mappings":";;;;;;;AA2BO,MAAM,iCAAiC,MAAM;AAAA,EAClD;AAAA,IACE,KAAO,EAAA,MAAA;AAAA,IACP,KAAO,EAAA,OAAA;AAAA,IACP,IAAM,EAAA;AAAA,GACR;AAAA,EACA;AAAA,IACE,KAAO,EAAA,MAAA;AAAA,IACP,KAAO,EAAA,MAAA;AAAA,IACP,IAAM,EAAA;AAAA,GACR;AAAA,EACA;AAAA,IACE,KAAO,EAAA,SAAA;AAAA,IACP,KAAO,EAAA,SAAA;AAAA,IACP,IAAM,EAAA,SAAA;AAAA,IACN,KAAO,EAAA,MAAA;AAAA,IACP,MAAA,EAAQ,CAAC,GAAgB,KAAA;AACvB,MAAI,IAAA,GAAA,IAAO,GAAQ,KAAA,CAAA,EAAU,OAAA,GAAA;AAC7B,MAAO,OAAA,GAAA;AAAA;AACT;AAEJ;AAEa,MAAA,sBAAA,GAAyB,CACpC,eAAA,EACA,aAKkC,KAAA;AAClC,EAAM,MAAA,QAAA,GAAW,CAAC,IAAiB,KAAA;AACjC,IAAA,MAAM,iBAAiB,eAAgB,CAAA,MAAA;AAAA,MACrC,CAAC,GAAwB,KAAA,GAAA,CAAI,IAAS,KAAA;AAAA,KACxC;AACA,IAAA,aAAA,CAAc,mBAAmB,cAAc,CAAA;AAAA,GACjD;AAEA,EAAO,OAAA;AAAA,IACL;AAAA,MACE,KAAO,EAAA,MAAA;AAAA,MACP,KAAO,EAAA,OAAA;AAAA,MACP,IAAM,EAAA,QAAA;AAAA,MACN,QAAQ,CAAS,KAAA,KAAA;AACf,QAAA,MAAM,EAAE,IAAM,EAAA,SAAA,EAAW,MAAS,GAAA,cAAA,CAAe,MAAM,GAAG,CAAA;AAC1D,QAAA,uBACG,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,EAAI,EAAA,CAAA,SAAA,EAAY,SAAS,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,MAAO,EAAA,OAAA,EAAA,EACvD,MAAM,KACT,CAAA;AAAA;AAEJ,KACF;AAAA,IACA;AAAA,MACE,KAAO,EAAA,MAAA;AAAA,MACP,KAAO,EAAA,MAAA;AAAA,MACP,IAAM,EAAA;AAAA,KACR;AAAA,IACA;AAAA,MACE,KAAO,EAAA,SAAA;AAAA,MACP,KAAO,EAAA,SAAA;AAAA,MACP,IAAM,EAAA,SAAA;AAAA,MACN,KAAO,EAAA,MAAA;AAAA,MACP,UAAY,EAAA;AAAA,KACd;AAAA,IACA;AAAA,MACE,KAAO,EAAA,SAAA;AAAA,MACP,OAAS,EAAA,KAAA;AAAA,MACT,MAAA,EAAQ,CAAC,GAAwB,KAAA;AAC/B,QAAA,uBACG,KAAA,CAAA,aAAA,CAAA,GAAA,EAAA,EAAI,GAAK,EAAA,GAAA,CAAI,IACZ,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,OAAS,EAAA,MAAM,QAAS,CAAA,GAAA,CAAI,IAAI,CAAA;AAAA,YAChC,YAAW,EAAA,QAAA;AAAA,YACX,KAAM,EAAA;AAAA,WAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"AddedMembersTableColumn.esm.js","sources":["../../../src/components/CreateRole/AddedMembersTableColumn.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 { parseEntityRef } from '@backstage/catalog-model';\nimport { Link, TableColumn } from '@backstage/core-components';\n\nimport Delete from '@mui/icons-material/Delete';\nimport Box from '@mui/material/Box';\nimport IconButton from '@mui/material/IconButton';\nimport { FormikErrors } from 'formik';\n\nimport { RoleFormValues, SelectedMember } from './types';\n\nexport const reviewStepMemebersTableColumns = () => [\n {\n title: 'Name',\n field: 'label',\n type: 'string',\n },\n {\n title: 'Type',\n field: 'type',\n type: 'string',\n },\n {\n title: 'Members',\n field: 'members',\n type: 'numeric',\n align: 'left',\n render: (mem: number) => {\n if (mem || mem === 0) return mem;\n return '-';\n },\n },\n];\n\nexport const selectedMembersColumns = (\n selectedMembers: SelectedMember[],\n setFieldValue: (\n field: string,\n value: any,\n shouldValidate?: boolean,\n ) => Promise<FormikErrors<RoleFormValues>> | Promise<void>,\n): TableColumn<SelectedMember>[] => {\n const onRemove = (etag: string) => {\n const updatedMembers = selectedMembers.filter(\n (mem: SelectedMember) => mem.etag !== etag,\n );\n setFieldValue('selectedMembers', updatedMembers);\n };\n\n return [\n {\n title: 'Name',\n field: 'label',\n type: 'string',\n render: props => {\n const { kind, namespace, name } = parseEntityRef(props.ref);\n return (\n <Link to={`/catalog/${namespace}/${kind}/${name}`} target=\"blank\">\n {props.label}\n </Link>\n );\n },\n },\n {\n title: 'Type',\n field: 'type',\n type: 'string',\n },\n {\n title: 'Members',\n field: 'members',\n type: 'numeric',\n align: 'left',\n emptyValue: '-',\n },\n {\n title: 'Actions',\n sorting: false,\n render: (mem: SelectedMember) => {\n return (\n <Box key={mem.etag}>\n <IconButton\n onClick={() => onRemove(mem.etag)}\n aria-label=\"Remove\"\n title=\"Remove member\"\n style={{ padding: '0.5rem', borderRadius: '50%' }}\n sx={{ '&:hover': { borderRadius: '50%' } }}\n >\n <Delete />\n </IconButton>\n </Box>\n );\n },\n },\n ];\n};\n"],"names":[],"mappings":";;;;;;;AA2BO,MAAM,iCAAiC,MAAM;AAAA,EAClD;AAAA,IACE,KAAO,EAAA,MAAA;AAAA,IACP,KAAO,EAAA,OAAA;AAAA,IACP,IAAM,EAAA;AAAA,GACR;AAAA,EACA;AAAA,IACE,KAAO,EAAA,MAAA;AAAA,IACP,KAAO,EAAA,MAAA;AAAA,IACP,IAAM,EAAA;AAAA,GACR;AAAA,EACA;AAAA,IACE,KAAO,EAAA,SAAA;AAAA,IACP,KAAO,EAAA,SAAA;AAAA,IACP,IAAM,EAAA,SAAA;AAAA,IACN,KAAO,EAAA,MAAA;AAAA,IACP,MAAA,EAAQ,CAAC,GAAgB,KAAA;AACvB,MAAI,IAAA,GAAA,IAAO,GAAQ,KAAA,CAAA,EAAU,OAAA,GAAA;AAC7B,MAAO,OAAA,GAAA;AAAA;AACT;AAEJ;AAEa,MAAA,sBAAA,GAAyB,CACpC,eAAA,EACA,aAKkC,KAAA;AAClC,EAAM,MAAA,QAAA,GAAW,CAAC,IAAiB,KAAA;AACjC,IAAA,MAAM,iBAAiB,eAAgB,CAAA,MAAA;AAAA,MACrC,CAAC,GAAwB,KAAA,GAAA,CAAI,IAAS,KAAA;AAAA,KACxC;AACA,IAAA,aAAA,CAAc,mBAAmB,cAAc,CAAA;AAAA,GACjD;AAEA,EAAO,OAAA;AAAA,IACL;AAAA,MACE,KAAO,EAAA,MAAA;AAAA,MACP,KAAO,EAAA,OAAA;AAAA,MACP,IAAM,EAAA,QAAA;AAAA,MACN,QAAQ,CAAS,KAAA,KAAA;AACf,QAAA,MAAM,EAAE,IAAM,EAAA,SAAA,EAAW,MAAS,GAAA,cAAA,CAAe,MAAM,GAAG,CAAA;AAC1D,QAAA,uBACG,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,EAAI,EAAA,CAAA,SAAA,EAAY,SAAS,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,MAAO,EAAA,OAAA,EAAA,EACvD,MAAM,KACT,CAAA;AAAA;AAEJ,KACF;AAAA,IACA;AAAA,MACE,KAAO,EAAA,MAAA;AAAA,MACP,KAAO,EAAA,MAAA;AAAA,MACP,IAAM,EAAA;AAAA,KACR;AAAA,IACA;AAAA,MACE,KAAO,EAAA,SAAA;AAAA,MACP,KAAO,EAAA,SAAA;AAAA,MACP,IAAM,EAAA,SAAA;AAAA,MACN,KAAO,EAAA,MAAA;AAAA,MACP,UAAY,EAAA;AAAA,KACd;AAAA,IACA;AAAA,MACE,KAAO,EAAA,SAAA;AAAA,MACP,OAAS,EAAA,KAAA;AAAA,MACT,MAAA,EAAQ,CAAC,GAAwB,KAAA;AAC/B,QAAA,uBACG,KAAA,CAAA,aAAA,CAAA,GAAA,EAAA,EAAI,GAAK,EAAA,GAAA,CAAI,IACZ,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,OAAS,EAAA,MAAM,QAAS,CAAA,GAAA,CAAI,IAAI,CAAA;AAAA,YAChC,YAAW,EAAA,QAAA;AAAA,YACX,KAAM,EAAA,eAAA;AAAA,YACN,KAAO,EAAA,EAAE,OAAS,EAAA,QAAA,EAAU,cAAc,KAAM,EAAA;AAAA,YAChD,IAAI,EAAE,SAAA,EAAW,EAAE,YAAA,EAAc,OAAQ;AAAA,WAAA;AAAA,8CAExC,MAAO,EAAA,IAAA;AAAA,SAEZ,CAAA;AAAA;AAEJ;AACF,GACF;AACF;;;;"}
|
|
@@ -264,7 +264,7 @@ const RoleForm = ({
|
|
|
264
264
|
/* @__PURE__ */ React.createElement(
|
|
265
265
|
Button,
|
|
266
266
|
{
|
|
267
|
-
style: { position: "absolute", right: "
|
|
267
|
+
style: { position: "absolute", right: "2.75rem", bottom: "2.75rem" },
|
|
268
268
|
onClick: handleCancel,
|
|
269
269
|
color: "primary"
|
|
270
270
|
},
|
|
@@ -1 +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 Alert from '@mui/material/Alert';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport CardHeader from '@mui/material/CardHeader';\nimport Divider from '@mui/material/Divider';\nimport Paper from '@mui/material/Paper';\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":";;;;;;;;;;;;;;;;;;;;;;;;AAwEO,MAAM,WAAW,CAAC;AAAA,EACvB,QAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAqB,KAAA;AACnB,EAAA,MAAM,CAAC,UAAY,EAAA,aAAa,IAAI,KAAM,CAAA,QAAA,CAAiB,QAAQ,CAAC,CAAA;AACpE,EAAA,MAAM,WAAW,WAAY,EAAA;AAC7B,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA;AAEjC,EAAM,MAAA,UAAA,GAAa,CAAC,KAAA,EAAgB,MAAoB,KAAA;AACtD,IAAA,MAAM,kBAAkB,KAAS,IAAA,QAAA;AACjC,IAAM,MAAA,SAAA,GACJ,mBAAmB,MACf,GAAA;AAAA,MACE,KAAO,EAAA;AAAA,QACL,YAAc,EAAA,CAAA,KAAA,EAAQ,eAAe,CAAA,CAAA,EAAI,MAAM,CAAA,aAAA;AAAA;AACjD,KAEF,GAAA,KAAA,CAAA;AACN,IAAA,IAAI,QAAQ,eAAiB,EAAA;AAC3B,MAAA,MAAM,EAAE,IAAM,EAAA,SAAA,EAAW,IAAK,EAAA,GAAI,eAAe,eAAe,CAAA;AAChE,MAAA,QAAA,CAAS,YAAY,IAAI,CAAA,CAAA,EAAI,SAAS,CAAI,CAAA,EAAA,IAAI,IAAI,SAAS,CAAA;AAAA,KACtD,MAAA;AACL,MAAA,QAAA,CAAS,MAAM,SAAS,CAAA;AAAA;AAC1B,GACF;AAEA,EAAA,MAAM,UAAa,GAAA,OACjB,IACA,EAAA,MAAA,EACA,aACG,KAAA;AACH,IAAI,IAAA;AACF,MAAM,MAAA,OAAA,GAAU,YAAY,MAAM,CAAA;AAClC,MAAA,MAAM,UAAU,OAAQ,CAAA,IAAA;AACxB,MAAM,MAAA,kBAAA,GAAqB,0BAA0B,MAAM,CAAA;AAC3D,MAAM,MAAA,aAAA,GAAgB,0BAA0B,MAAM,CAAA;AACtD,MAAA,MAAM,gBAAmB,GAAA,gCAAA;AAAA,QACvB,MAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,MAAM,gBAAmB,GAAA,6BAAA;AAAA,QACvB,MAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAM,MAAA,OAAA,GAAU,YAAY,aAAa,CAAA;AACzC,MAAA,MAAM,GAAM,GAAA,MAAM,OAAQ,CAAA,UAAA,CAAW,SAAS,OAAO,CAAA;AACrD,MAAA,IAAK,IAAkB,KAAO,EAAA;AAC5B,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAG,EAAA,2BAA2B,CAAI,EAAA,GAAA,CAAkB,MAAM,OAAO,CAAA;AAAA,SACnE;AAAA,OACK,MAAA;AACL,QAAM,MAAA,kBAAA,GAAqB,0BAA0B,aAAa,CAAA;AAClE,QAAA,MAAM,cAAiB,GAAA,UAAA;AAAA,UACrB,kBAAA;AAAA,UACA,kBAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,MAAM,iBAAoB,GAAA,UAAA;AAAA,UACxB,kBAAA;AAAA,UACA,kBAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAM,MAAA,iBAAA,CAAkB,IAAM,EAAA,iBAAA,EAAmB,OAAO,CAAA;AACxD,QAAM,MAAA,iBAAA,CAAkB,gBAAgB,OAAO,CAAA;AAE/C,QAAM,MAAA,gBAAA,CAAiB,kBAAkB,OAAO,CAAA;AAChD,QAAM,MAAA,gBAAA,CAAiB,kBAAkB,OAAO,CAAA;AAChD,QAAM,MAAA,gBAAA,CAAiB,eAAe,OAAO,CAAA;AAE7C,QAAA,UAAA,CAAW,SAAS,SAAS,CAAA;AAAA;AAC/B,aACO,CAAG,EAAA;AACV,MAAA,aAAA,CAAc,SAAU,CAAA,EAAE,WAAa,EAAA,CAAA,EAAG,CAAA;AAAA;AAC5C,GACF;AAEA,EAAM,MAAA,OAAA,GAAU,OACd,MAAA,EACA,aACG,KAAA;AACH,IAAI,IAAA;AACF,MAAM,MAAA,OAAA,GAAU,YAAY,MAAM,CAAA;AAClC,MAAM,MAAA,kBAAA,GAAqB,0BAA0B,MAAM,CAAA;AAC3D,MAAM,MAAA,oCAAA,GACJ,qCAAqC,MAAM,CAAA;AAE7C,MAAA,MAAM,GAAM,GAAA,MAAM,OAAQ,CAAA,UAAA,CAAW,OAAO,CAAA;AAC5C,MAAA,IAAK,IAAkB,KAAO,EAAA;AAC5B,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAG,EAAA,yBAAyB,CAAI,EAAA,GAAA,CAAkB,MAAM,OAAO,CAAA;AAAA,SACjE;AAAA;AAGF,MAAM,MAAA,iBAAA;AAAA,QACJ,kBAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAM,MAAA,gBAAA;AAAA,QACJ,oCAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAW,UAAA,CAAA,OAAA,CAAQ,MAAM,SAAS,CAAA;AAAA,aAC3B,CAAG,EAAA;AACV,MAAA,aAAA,CAAc,SAAU,CAAA,EAAE,WAAa,EAAA,CAAA,EAAG,CAAA;AAAA;AAC5C,GACF;AAEA,EAAA,MAAM,SAAS,SAA0B,CAAA;AAAA,IACvC,kBAAoB,EAAA,IAAA;AAAA,IACpB,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,QAAA,EAAU,OACR,MAAA,EACA,aACG,KAAA;AACH,MAAA,IAAI,QAAU,EAAA;AACZ,QAAW,UAAA,CAAA,QAAA,EAAU,QAAQ,aAAa,CAAA;AAAA,OACrC,MAAA;AACL,QAAA,OAAA,CAAQ,QAAQ,aAAa,CAAA;AAAA;AAC/B;AACF,GACD,CAAA;AAED,EAAM,MAAA,iBAAA,GAAoB,CAAC,SAAsB,KAAA;AAC/C,IAAA,QAAQ,SAAW;AAAA,MACjB,KAAK,MAAQ,EAAA;AACX,QAAA,MAAA,CAAO,cAAc,SAAS,CAAA;AAC9B,QAAA,OAAO,OAAO,MAAO,CAAA,IAAA;AAAA;AACvB,MACA,KAAK,iBAAmB,EAAA;AACtB,QAAA,MAAA,CAAO,cAAc,SAAS,CAAA;AAC9B,QAAA,OAAO,OAAO,MAAO,CAAA,eAAA;AAAA;AACvB,MACA,KAAK,wBAA0B,EAAA;AAC7B,QAAA,MAAA,CAAO,MAAO,CAAA,sBAAA,CAAuB,OAAQ,CAAA,CAAC,KAAK,KAAU,KAAA;AAC3D,UAAO,MAAA,CAAA,aAAA,CAAc,CAA0B,uBAAA,EAAA,KAAK,CAAU,QAAA,CAAA,CAAA;AAC9D,UAAO,MAAA,CAAA,aAAA,CAAc,CAA0B,uBAAA,EAAA,KAAK,CAAc,YAAA,CAAA,CAAA;AAAA,SACnE,CAAA;AACD,QAAA,OAAO,OAAO,MAAO,CAAA,sBAAA;AAAA;AACvB,MACA;AACE,QAAO,OAAA,KAAA,CAAA;AAAA;AACX,GACF;AAEA,EAAM,MAAA,UAAA,GAAa,CAAC,SAAuB,KAAA;AACzC,IAAM,MAAA,KAAA,GAAQ,SAAa,IAAA,iBAAA,CAAkB,SAAS,CAAA;AACtD,IAAI,IAAA,CAAC,SAAa,IAAA,CAAC,KAAO,EAAA;AACxB,MAAO,MAAA,CAAA,SAAA,CAAU,EAAE,CAAA;AACnB,MAAA,MAAM,OAAU,GAAA,IAAA,CAAK,GAAI,CAAA,UAAA,GAAa,GAAG,CAAC,CAAA;AAC1C,MAAA,aAAA,CAAc,OAAO,CAAA;AAAA;AACvB,GACF;AAEA,EAAA,MAAM,gCAAgC,MAAM;AAC1C,IAAA,OACE,MAAO,CAAA,MAAA,CAAO,sBAAuB,CAAA,MAAA,CAAO,CAAM,EAAA,KAAA,CAAC,CAAC,EAAA,CAAG,MAAM,CAAA,CAAE,MAC7D,KAAA,MAAA,CAAO,MAAO,CAAA,sBAAA,CAAuB,MACtC,KAAA,CAAC,MAAO,CAAA,MAAA,CAAO,sBAEZ,IAAA,MAAA,CAAO,MAAO,CAAA,sBAAA,EAGb,MAAO,CAAA,CAAA,GAAA,KAAO,CAAC,CAAC,GAAG,CAAA,EAAG,MAAW,KAAA,CAAA,CAAA;AAAA,GAE1C;AAEA,EAAM,MAAA,UAAA,GAAa,MAAM,aAAc,CAAA,IAAA,CAAK,IAAI,UAAa,GAAA,CAAA,EAAG,CAAC,CAAC,CAAA;AAClE,EAAA,MAAM,eAAe,MAAM;AACzB,IAAW,UAAA,EAAA;AAAA,GACb;AAEA,EAAM,MAAA,WAAA,GAAc,CAAC,CAAuD,KAAA;AAC1E,IAAA,aAAA,CAAc,CAAC,CAAA;AACf,IAAA,MAAA,CAAO,YAAY,CAAC,CAAA;AAAA,GACtB;AAEA,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,EAAE,UAAU,MAAO,EAAA,EAAA,kBAC7B,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAO,MAAO,CAAA,SAAA,EAAW,CACrC,kBAAA,KAAA,CAAA,aAAA,CAAC,aAAQ,CACT,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,SAAU,EAAA,MAAA;AAAA,MACV,UAAU,MAAO,CAAA,YAAA;AAAA,MACjB,KAAA,EAAO,EAAE,QAAA,EAAU,UAAW;AAAA,KAAA;AAAA,oBAE9B,KAAA,CAAA,aAAA,CAAC,iBAAc,UACb,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,OAAO,MAAO,CAAA,uBAAA;AAAA,QACd,OAAS,EAAA;AAAA,UACP,QAAU,EAAA,KAAA;AAAA,UACV,QAAU,EAAA,IAAA;AAAA,UACV,QAAU,EAAA,MAAA;AAAA,UACV,OAAA,EAAS,MAAM,CAAC,CAAC,OAAO,MAAO,CAAA,IAAA,IAAQ,CAAC,MAAA,CAAO,MAAO,CAAA,IAAA;AAAA,UACtD,MAAA,EAAQ,MAAM,UAAA,CAAW,MAAM;AAAA;AACjC,OAAA;AAAA,sBAEA,KAAA,CAAA,aAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAM,OAAO,MAAO,CAAA,IAAA;AAAA,UACpB,WAAA,EAAa,OAAO,MAAO,CAAA,WAAA;AAAA,UAC3B,YAAY,MAAO,CAAA,UAAA;AAAA,UACnB,cAAc,MAAO,CAAA,YAAA;AAAA,UACrB,SAAA,EAAW,OAAO,MAAO,CAAA;AAAA;AAAA;AAC3B,KAEF,kBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,OAAO,MAAO,CAAA,mBAAA;AAAA,QACd,OAAS,EAAA;AAAA,UACP,QAAU,EAAA,IAAA;AAAA,UACV,QAAU,EAAA,MAAA;AAAA,UACV,OAAA,EAAS,MACP,MAAO,CAAA,MAAA,CAAO,iBAAiB,MAAS,GAAA,CAAA,IACxC,CAAC,MAAA,CAAO,MAAO,CAAA,eAAA;AAAA,UACjB,MAAA,EAAQ,MAAM,UAAA,CAAW,iBAAiB,CAAA;AAAA,UAC1C,QAAU,EAAA,IAAA;AAAA,UACV,QAAU,EAAA,MAAA;AAAA,UACV,MAAQ,EAAA;AAAA;AACV,OAAA;AAAA,0CAEC,GACC,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,eAAA,EAAiB,OAAO,MAAO,CAAA,eAAA;AAAA,UAC/B,oBAAA,EAAsB,OAAO,MAAO,CAAA,eAAA;AAAA,UACpC,eAAe,MAAO,CAAA,aAAA;AAAA,UACtB;AAAA;AAAA,OACF,kBACC,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAG,CACJ,kBAAA,KAAA,CAAA,aAAA;AAAA,QAAC,iBAAA;AAAA,QAAA;AAAA,UACC,eAAA,EAAiB,OAAO,MAAO,CAAA,eAAA;AAAA,UAC/B,eAAe,MAAO,CAAA;AAAA;AAAA,OAE1B;AAAA,KAEF,kBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,OAAO,MAAO,CAAA,uBAAA;AAAA,QACd,OAAS,EAAA;AAAA,UACP,QAAU,EAAA,IAAA;AAAA,UACV,QAAU,EAAA,MAAA;AAAA,UACV,OAAA,EAAS,MAAM,6BAA8B,EAAA;AAAA,UAC7C,MAAA,EAAQ,MAAM,UAAA,CAAW,wBAAwB,CAAA;AAAA,UACjD,QAAU,EAAA,IAAA;AAAA,UACV,QAAU,EAAA,MAAA;AAAA,UACV,MAAQ,EAAA;AAAA;AACV,OAAA;AAAA,sBAEA,KAAA,CAAA,aAAA;AAAA,QAAC,sBAAA;AAAA,QAAA;AAAA,UACC,sBAAA,EAAwB,OAAO,MAAO,CAAA,sBAAA;AAAA,UACtC,2BAAA,EACE,OAAO,MACJ,CAAA,sBAAA;AAAA,UAEL,eAAe,MAAO,CAAA,aAAA;AAAA,UACtB,eAAe,MAAO,CAAA,aAAA;AAAA,UACtB,YAAY,MAAO,CAAA;AAAA;AAAA;AACrB,uBAED,KAAA,CAAA,aAAA,CAAA,iBAAA,EAAA,EAAkB,OAAM,EAAG,EAAA,GAAA,EAAG,wBAC5B,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAM,MAAM,EAAA,IAAA,EAAC,WAAW,CACvB,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,cAAW,MAAQ,EAAA,MAAA,CAAO,QAAQ,SAAW,EAAA,CAAC,CAAC,QAAA,EAAU,mBACzD,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAG,mBACH,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAO,SAAS,UAAY,EAAA,EAAA,MAAI,CACjC,kBAAA,KAAA,CAAA,aAAA,CAAC,UAAO,OAAS,EAAA,CAAA,CAAA,KAAK,YAAY,CAAC,CAAA,EAAA,EAAG,OAAK,CAC3C,kBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAQ,EAAA,WAAA;AAAA,QACR,KAAM,EAAA,SAAA;AAAA,QACN,IAAK,EAAA,QAAA;AAAA,QACL,QACE,EAAA,CAAC,CAAC,MAAA,CAAO,MAAO,CAAA,IAAA,IAChB,CAAC,CAAC,MAAO,CAAA,MAAA,CAAO,eAChB,IAAA,CAAC,MAAO,CAAA;AAAA,OAAA;AAAA,MAGT,WAAe,IAAA;AAAA,KAEpB,CACF,CACF,CAAA;AAAA,IACC,OAAO,MAAQ,EAAA,WAAA,wCACb,GAAI,EAAA,EAAA,KAAA,EAAO,EAAE,aAAe,EAAA,MAAA,sBAC1B,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAM,UAAS,OAAS,EAAA,EAAA,CAAA,EAAG,OAAO,MAAO,CAAA,WAAW,EAAG,CAC1D,CAAA;AAAA,oBAEF,KAAA,CAAA,aAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAO,EAAE,QAAA,EAAU,YAAY,KAAO,EAAA,GAAA,EAAK,QAAQ,GAAI,EAAA;AAAA,QACvD,OAAS,EAAA,YAAA;AAAA,QACT,KAAM,EAAA;AAAA,OAAA;AAAA,MACP;AAAA;AAED,GAEJ,CAAA;AAEJ;;;;"}
|
|
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 Alert from '@mui/material/Alert';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport CardHeader from '@mui/material/CardHeader';\nimport Divider from '@mui/material/Divider';\nimport Paper from '@mui/material/Paper';\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: '2.75rem', bottom: '2.75rem' }}\n onClick={handleCancel}\n color=\"primary\"\n >\n Cancel\n </Button>\n </CardContent>\n </Card>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DownloadUserStatistics.esm.js","sources":["../../src/components/DownloadUserStatistics.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 { useApi } from '@backstage/core-plugin-api';\n\nimport Button from '@mui/material/Button';\n\nimport { licensedUsersApiRef } from '../api/LicensedUsersClient';\n\nfunction DownloadCSVLink() {\n const licensedUsersClient = useApi(licensedUsersApiRef);\n const handleDownload = async (\n event: React.MouseEvent<HTMLAnchorElement, MouseEvent>,\n ) => {\n event.preventDefault(); // Prevent the default link behavior\n\n try {\n const response = await licensedUsersClient.downloadStatistics();\n\n if (response.ok) {\n // Get the CSV data as a string\n const csvData = await response.text();\n\n // Create a Blob from the CSV data\n const blob = new Blob([csvData], { type: 'text/csv' });\n const url = window.URL.createObjectURL(blob);\n\n // Create a temporary link to trigger the download\n const a = document.createElement('a');\n a.href = url;\n a.download = 'licensed-users.csv';\n document.body.appendChild(a);\n a.click();\n\n // Clean up the temporary link and object URL\n document.body.removeChild(a);\n window.URL.revokeObjectURL(url);\n } else {\n throw new Error(\n `Failed to download the csv file with list licensed users ${response.statusText}`,\n );\n }\n } catch (error) {\n throw new Error(`Error during the download: ${error}`);\n }\n };\n\n return (\n <Button\n href=\"/download-csv\"\n onClick={handleDownload}\n sx={{\n color: theme => theme.palette.link,\n textDecoration: 'underline',\n }}\n size=\"small\"\n >\n Download User List\n </Button>\n );\n}\n\nexport default DownloadCSVLink;\n"],"names":[],"mappings":";;;;;AAuBA,SAAS,eAAkB,GAAA;AACzB,EAAM,MAAA,mBAAA,GAAsB,OAAO,mBAAmB,CAAA;AACtD,EAAM,MAAA,cAAA,GAAiB,OACrB,KACG,KAAA;AACH,IAAA,KAAA,CAAM,cAAe,EAAA;AAErB,IAAI,IAAA;AACF,MAAM,MAAA,QAAA,GAAW,MAAM,mBAAA,CAAoB,kBAAmB,EAAA;AAE9D,MAAA,IAAI,SAAS,EAAI,EAAA;AAEf,QAAM,MAAA,OAAA,GAAU,MAAM,QAAA,CAAS,IAAK,EAAA;AAGpC,QAAM,MAAA,IAAA,GAAO,IAAI,IAAK,CAAA,CAAC,OAAO,CAAG,EAAA,EAAE,IAAM,EAAA,UAAA,EAAY,CAAA;AACrD,QAAA,MAAM,GAAM,GAAA,MAAA,CAAO,GAAI,CAAA,eAAA,CAAgB,IAAI,CAAA;AAG3C,QAAM,MAAA,CAAA,GAAI,QAAS,CAAA,aAAA,CAAc,GAAG,CAAA;AACpC,QAAA,CAAA,CAAE,IAAO,GAAA,GAAA;AACT,QAAA,CAAA,CAAE,QAAW,GAAA,oBAAA;AACb,QAAS,QAAA,CAAA,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,QAAA,CAAA,CAAE,KAAM,EAAA;AAGR,QAAS,QAAA,CAAA,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,QAAO,MAAA,CAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAAA,OACzB,MAAA;AACL,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,0DAAA,EAA6D,SAAS,UAAU,CAAA;AAAA,SAClF;AAAA;AACF,aACO,KAAO,EAAA;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAA8B,2BAAA,EAAA,KAAK,CAAE,CAAA,CAAA;AAAA;AACvD,GACF;AAEA,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,IAAK,EAAA,eAAA;AAAA,MACL,OAAS,EAAA,cAAA;AAAA,MACT,EAAI,EAAA;AAAA,QACF,KAAA,EAAO,CAAS,KAAA,KAAA,KAAA,CAAM,OAAQ,CAAA,IAAA;AAAA,QAC9B,cAAgB,EAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"DownloadUserStatistics.esm.js","sources":["../../src/components/DownloadUserStatistics.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 { useApi } from '@backstage/core-plugin-api';\n\nimport Button from '@mui/material/Button';\n\nimport { licensedUsersApiRef } from '../api/LicensedUsersClient';\n\nfunction DownloadCSVLink() {\n const licensedUsersClient = useApi(licensedUsersApiRef);\n const handleDownload = async (\n event: React.MouseEvent<HTMLAnchorElement, MouseEvent>,\n ) => {\n event.preventDefault(); // Prevent the default link behavior\n\n try {\n const response = await licensedUsersClient.downloadStatistics();\n\n if (response.ok) {\n // Get the CSV data as a string\n const csvData = await response.text();\n\n // Create a Blob from the CSV data\n const blob = new Blob([csvData], { type: 'text/csv' });\n const url = window.URL.createObjectURL(blob);\n\n // Create a temporary link to trigger the download\n const a = document.createElement('a');\n a.href = url;\n a.download = 'licensed-users.csv';\n document.body.appendChild(a);\n a.click();\n\n // Clean up the temporary link and object URL\n document.body.removeChild(a);\n window.URL.revokeObjectURL(url);\n } else {\n throw new Error(\n `Failed to download the csv file with list licensed users ${response.statusText}`,\n );\n }\n } catch (error) {\n throw new Error(`Error during the download: ${error}`);\n }\n };\n\n return (\n <Button\n href=\"/download-csv\"\n onClick={handleDownload}\n sx={{\n color: theme => theme.palette.link,\n textDecoration: 'underline',\n marginTop: '1rem',\n }}\n size=\"small\"\n >\n Download User List\n </Button>\n );\n}\n\nexport default DownloadCSVLink;\n"],"names":[],"mappings":";;;;;AAuBA,SAAS,eAAkB,GAAA;AACzB,EAAM,MAAA,mBAAA,GAAsB,OAAO,mBAAmB,CAAA;AACtD,EAAM,MAAA,cAAA,GAAiB,OACrB,KACG,KAAA;AACH,IAAA,KAAA,CAAM,cAAe,EAAA;AAErB,IAAI,IAAA;AACF,MAAM,MAAA,QAAA,GAAW,MAAM,mBAAA,CAAoB,kBAAmB,EAAA;AAE9D,MAAA,IAAI,SAAS,EAAI,EAAA;AAEf,QAAM,MAAA,OAAA,GAAU,MAAM,QAAA,CAAS,IAAK,EAAA;AAGpC,QAAM,MAAA,IAAA,GAAO,IAAI,IAAK,CAAA,CAAC,OAAO,CAAG,EAAA,EAAE,IAAM,EAAA,UAAA,EAAY,CAAA;AACrD,QAAA,MAAM,GAAM,GAAA,MAAA,CAAO,GAAI,CAAA,eAAA,CAAgB,IAAI,CAAA;AAG3C,QAAM,MAAA,CAAA,GAAI,QAAS,CAAA,aAAA,CAAc,GAAG,CAAA;AACpC,QAAA,CAAA,CAAE,IAAO,GAAA,GAAA;AACT,QAAA,CAAA,CAAE,QAAW,GAAA,oBAAA;AACb,QAAS,QAAA,CAAA,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,QAAA,CAAA,CAAE,KAAM,EAAA;AAGR,QAAS,QAAA,CAAA,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,QAAO,MAAA,CAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAAA,OACzB,MAAA;AACL,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,0DAAA,EAA6D,SAAS,UAAU,CAAA;AAAA,SAClF;AAAA;AACF,aACO,KAAO,EAAA;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAA8B,2BAAA,EAAA,KAAK,CAAE,CAAA,CAAA;AAAA;AACvD,GACF;AAEA,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,IAAK,EAAA,eAAA;AAAA,MACL,OAAS,EAAA,cAAA;AAAA,MACT,EAAI,EAAA;AAAA,QACF,KAAA,EAAO,CAAS,KAAA,KAAA,KAAA,CAAM,OAAQ,CAAA,IAAA;AAAA,QAC9B,cAAgB,EAAA,WAAA;AAAA,QAChB,SAAW,EAAA;AAAA,OACb;AAAA,MACA,IAAK,EAAA;AAAA,KAAA;AAAA,IACN;AAAA,GAED;AAEJ;;;;"}
|
|
@@ -14,15 +14,16 @@ const EditRole = ({
|
|
|
14
14
|
to
|
|
15
15
|
}) => {
|
|
16
16
|
const { name, namespace, kind } = parseEntityRef(roleName);
|
|
17
|
-
return /* @__PURE__ */ React.createElement(Tooltip, { title: tooltip
|
|
17
|
+
return /* @__PURE__ */ React.createElement(Tooltip, { title: tooltip ?? "" }, /* @__PURE__ */ React.createElement(Typography, { component: "span", "data-testid": dataTestId }, /* @__PURE__ */ React.createElement(
|
|
18
18
|
IconButton,
|
|
19
19
|
{
|
|
20
|
-
color: "inherit",
|
|
21
20
|
component: Link,
|
|
22
21
|
"aria-label": "Update",
|
|
23
22
|
disabled: disable,
|
|
24
|
-
title: tooltip
|
|
25
|
-
to: to
|
|
23
|
+
title: tooltip ?? "Edit Role",
|
|
24
|
+
to: to ?? `../role/${kind}/${namespace}/${name}`,
|
|
25
|
+
style: { padding: "0.5rem", color: "inherit", borderRadius: "50%" },
|
|
26
|
+
sx: { "&:hover": { borderRadius: "50%" } }
|
|
26
27
|
},
|
|
27
28
|
/* @__PURE__ */ React.createElement(EditIcon, null)
|
|
28
29
|
)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditRole.esm.js","sources":["../../src/components/EditRole.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 { parseEntityRef } from '@backstage/catalog-model';\nimport { Link } from '@backstage/core-components';\n\nimport EditIcon from '@mui/icons-material/Edit';\nimport IconButton from '@mui/material/IconButton';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\n\ntype EditRoleProps = {\n roleName: string;\n disable: boolean;\n tooltip?: string;\n dataTestId: string;\n to?: string;\n};\n\nconst EditRole = ({\n roleName,\n tooltip,\n disable,\n dataTestId,\n to,\n}: EditRoleProps) => {\n const { name, namespace, kind } = parseEntityRef(roleName);\n return (\n <Tooltip title={tooltip
|
|
1
|
+
{"version":3,"file":"EditRole.esm.js","sources":["../../src/components/EditRole.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 { parseEntityRef } from '@backstage/catalog-model';\nimport { Link } from '@backstage/core-components';\n\nimport EditIcon from '@mui/icons-material/Edit';\nimport IconButton from '@mui/material/IconButton';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\n\ntype EditRoleProps = {\n roleName: string;\n disable: boolean;\n tooltip?: string;\n dataTestId: string;\n to?: string;\n};\n\nconst EditRole = ({\n roleName,\n tooltip,\n disable,\n dataTestId,\n to,\n}: EditRoleProps) => {\n const { name, namespace, kind } = parseEntityRef(roleName);\n return (\n <Tooltip title={tooltip ?? ''}>\n <Typography component=\"span\" data-testid={dataTestId}>\n <IconButton\n component={Link}\n aria-label=\"Update\"\n disabled={disable}\n title={tooltip ?? 'Edit Role'}\n to={to ?? `../role/${kind}/${namespace}/${name}`}\n style={{ padding: '0.5rem', color: 'inherit', borderRadius: '50%' }}\n sx={{ '&:hover': { borderRadius: '50%' } }}\n >\n <EditIcon />\n </IconButton>\n </Typography>\n </Tooltip>\n );\n};\n\nexport default EditRole;\n"],"names":[],"mappings":";;;;;;;;AAiCA,MAAM,WAAW,CAAC;AAAA,EAChB,QAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAqB,KAAA;AACnB,EAAA,MAAM,EAAE,IAAM,EAAA,SAAA,EAAW,IAAK,EAAA,GAAI,eAAe,QAAQ,CAAA;AACzD,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,OAAQ,EAAA,EAAA,KAAA,EAAO,OAAW,IAAA,EAAA,EAAA,sCACxB,UAAW,EAAA,EAAA,SAAA,EAAU,MAAO,EAAA,aAAA,EAAa,UACxC,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,SAAW,EAAA,IAAA;AAAA,MACX,YAAW,EAAA,QAAA;AAAA,MACX,QAAU,EAAA,OAAA;AAAA,MACV,OAAO,OAAW,IAAA,WAAA;AAAA,MAClB,IAAI,EAAM,IAAA,CAAA,QAAA,EAAW,IAAI,CAAI,CAAA,EAAA,SAAS,IAAI,IAAI,CAAA,CAAA;AAAA,MAC9C,OAAO,EAAE,OAAA,EAAS,UAAU,KAAO,EAAA,SAAA,EAAW,cAAc,KAAM,EAAA;AAAA,MAClE,IAAI,EAAE,SAAA,EAAW,EAAE,YAAA,EAAc,OAAQ;AAAA,KAAA;AAAA,wCAExC,QAAS,EAAA,IAAA;AAAA,GAEd,CACF,CAAA;AAEJ;;;;"}
|
|
@@ -16,14 +16,15 @@ const DeleteRole = ({
|
|
|
16
16
|
setDeleteComponent({ roleName: name });
|
|
17
17
|
setOpenDialog(true);
|
|
18
18
|
};
|
|
19
|
-
return /* @__PURE__ */ React.createElement(Tooltip, { title: tooltip
|
|
19
|
+
return /* @__PURE__ */ React.createElement(Tooltip, { title: tooltip ?? "" }, /* @__PURE__ */ React.createElement(Typography, { component: "span", "data-testid": dataTestId }, /* @__PURE__ */ React.createElement(
|
|
20
20
|
IconButton,
|
|
21
21
|
{
|
|
22
|
-
color: "inherit",
|
|
23
22
|
onClick: () => openDialog(roleName),
|
|
24
23
|
"aria-label": "Delete",
|
|
25
24
|
disabled: disable,
|
|
26
|
-
title: tooltip
|
|
25
|
+
title: tooltip ?? "Delete Role",
|
|
26
|
+
style: { padding: "0.5rem", borderRadius: "50%" },
|
|
27
|
+
sx: { "&:hover": { borderRadius: "50%" } }
|
|
27
28
|
},
|
|
28
29
|
/* @__PURE__ */ React.createElement(Delete, null)
|
|
29
30
|
)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeleteRole.esm.js","sources":["../../../src/components/RolesList/DeleteRole.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 { useDeleteDialog } from '@janus-idp/shared-react';\nimport Delete from '@mui/icons-material/Delete';\nimport IconButton from '@mui/material/IconButton';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\n\ntype DeleteRoleProps = {\n roleName: string;\n disable: boolean;\n tooltip?: string;\n dataTestId: string;\n};\n\nconst DeleteRole = ({\n roleName,\n tooltip,\n disable,\n dataTestId,\n}: DeleteRoleProps) => {\n const { setDeleteComponent, setOpenDialog } = useDeleteDialog();\n\n const openDialog = (name: string) => {\n setDeleteComponent({ roleName: name });\n setOpenDialog(true);\n };\n\n return (\n <Tooltip title={tooltip
|
|
1
|
+
{"version":3,"file":"DeleteRole.esm.js","sources":["../../../src/components/RolesList/DeleteRole.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 { useDeleteDialog } from '@janus-idp/shared-react';\nimport Delete from '@mui/icons-material/Delete';\nimport IconButton from '@mui/material/IconButton';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\n\ntype DeleteRoleProps = {\n roleName: string;\n disable: boolean;\n tooltip?: string;\n dataTestId: string;\n};\n\nconst DeleteRole = ({\n roleName,\n tooltip,\n disable,\n dataTestId,\n}: DeleteRoleProps) => {\n const { setDeleteComponent, setOpenDialog } = useDeleteDialog();\n\n const openDialog = (name: string) => {\n setDeleteComponent({ roleName: name });\n setOpenDialog(true);\n };\n\n return (\n <Tooltip title={tooltip ?? ''}>\n <Typography component=\"span\" data-testid={dataTestId}>\n <IconButton\n onClick={() => openDialog(roleName)}\n aria-label=\"Delete\"\n disabled={disable}\n title={tooltip ?? 'Delete Role'}\n style={{ padding: '0.5rem', borderRadius: '50%' }}\n sx={{ '&:hover': { borderRadius: '50%' } }}\n >\n <Delete />\n </IconButton>\n </Typography>\n </Tooltip>\n );\n};\nexport default DeleteRole;\n"],"names":[],"mappings":";;;;;;;AA8BA,MAAM,aAAa,CAAC;AAAA,EAClB,QAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAuB,KAAA;AACrB,EAAA,MAAM,EAAE,kBAAA,EAAoB,aAAc,EAAA,GAAI,eAAgB,EAAA;AAE9D,EAAM,MAAA,UAAA,GAAa,CAAC,IAAiB,KAAA;AACnC,IAAmB,kBAAA,CAAA,EAAE,QAAU,EAAA,IAAA,EAAM,CAAA;AACrC,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,GACpB;AAEA,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,OAAQ,EAAA,EAAA,KAAA,EAAO,OAAW,IAAA,EAAA,EAAA,sCACxB,UAAW,EAAA,EAAA,SAAA,EAAU,MAAO,EAAA,aAAA,EAAa,UACxC,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,MAAM,UAAA,CAAW,QAAQ,CAAA;AAAA,MAClC,YAAW,EAAA,QAAA;AAAA,MACX,QAAU,EAAA,OAAA;AAAA,MACV,OAAO,OAAW,IAAA,aAAA;AAAA,MAClB,KAAO,EAAA,EAAE,OAAS,EAAA,QAAA,EAAU,cAAc,KAAM,EAAA;AAAA,MAChD,IAAI,EAAE,SAAA,EAAW,EAAE,YAAA,EAAc,OAAQ;AAAA,KAAA;AAAA,wCAExC,MAAO,EAAA,IAAA;AAAA,GAEZ,CACF,CAAA;AAEJ;;;;"}
|
|
@@ -28,6 +28,7 @@ const DeleteRoleDialog = ({
|
|
|
28
28
|
const [disableDelete, setDisableDelete] = React.useState(false);
|
|
29
29
|
const [error, setError] = React.useState("");
|
|
30
30
|
const rbacApi = useApi(rbacApiRef);
|
|
31
|
+
const dialogBackgroundColor = (theme) => theme.palette.mode === "dark" ? "#1b1d21" : "#fff";
|
|
31
32
|
const deleteRole = async () => {
|
|
32
33
|
try {
|
|
33
34
|
const policies = await rbacApi.getAssociatedPolicies(roleName);
|
|
@@ -63,42 +64,55 @@ const DeleteRoleDialog = ({
|
|
|
63
64
|
setDisableDelete(true);
|
|
64
65
|
}
|
|
65
66
|
};
|
|
66
|
-
return /* @__PURE__ */ React.createElement(Dialog, { maxWidth: "md", open, onClose: closeDialog }, /* @__PURE__ */ React.createElement(
|
|
67
|
-
|
|
67
|
+
return /* @__PURE__ */ React.createElement(Dialog, { maxWidth: "md", open, onClose: closeDialog }, /* @__PURE__ */ React.createElement(
|
|
68
|
+
DialogTitle,
|
|
68
69
|
{
|
|
70
|
+
id: "delete-role",
|
|
71
|
+
title: "Delete Role",
|
|
69
72
|
sx: {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
gap: (theme) => theme.spacing(1)
|
|
73
|
+
marginBottom: "0 !important",
|
|
74
|
+
backgroundColor: dialogBackgroundColor
|
|
73
75
|
}
|
|
74
76
|
},
|
|
75
|
-
/* @__PURE__ */ React.createElement(Typography, { component: "span", sx: { fontWeight: "bold" } }, /* @__PURE__ */ React.createElement(
|
|
76
|
-
ErrorIcon,
|
|
77
|
-
{
|
|
78
|
-
style: {
|
|
79
|
-
color: "red",
|
|
80
|
-
alignContent: "center",
|
|
81
|
-
marginTop: "7px",
|
|
82
|
-
marginBottom: "-3px"
|
|
83
|
-
},
|
|
84
|
-
fontSize: "small"
|
|
85
|
-
}
|
|
86
|
-
), " ", "Delete this role?"),
|
|
87
77
|
/* @__PURE__ */ React.createElement(
|
|
88
|
-
|
|
78
|
+
Box,
|
|
89
79
|
{
|
|
90
|
-
"aria-label": "close",
|
|
91
80
|
sx: {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
}
|
|
97
|
-
onClick: closeDialog
|
|
81
|
+
display: "flex",
|
|
82
|
+
alignItems: "center",
|
|
83
|
+
justifyContent: "space-between",
|
|
84
|
+
gap: (theme) => theme.spacing(1)
|
|
85
|
+
}
|
|
98
86
|
},
|
|
99
|
-
/* @__PURE__ */ React.createElement(
|
|
87
|
+
/* @__PURE__ */ React.createElement(Typography, { component: "span", sx: { fontWeight: "bold" } }, /* @__PURE__ */ React.createElement(
|
|
88
|
+
ErrorIcon,
|
|
89
|
+
{
|
|
90
|
+
style: {
|
|
91
|
+
color: "red",
|
|
92
|
+
alignContent: "center",
|
|
93
|
+
marginTop: "7px",
|
|
94
|
+
marginRight: "5px",
|
|
95
|
+
marginBottom: "-3px"
|
|
96
|
+
},
|
|
97
|
+
fontSize: "small"
|
|
98
|
+
}
|
|
99
|
+
), " ", "Delete this role?"),
|
|
100
|
+
/* @__PURE__ */ React.createElement(
|
|
101
|
+
IconButton,
|
|
102
|
+
{
|
|
103
|
+
"aria-label": "close",
|
|
104
|
+
sx: {
|
|
105
|
+
padding: "8px !important",
|
|
106
|
+
color: (theme) => theme.palette.grey[500],
|
|
107
|
+
borderRadius: "50%",
|
|
108
|
+
"&:hover": { borderRadius: "50%" }
|
|
109
|
+
},
|
|
110
|
+
onClick: closeDialog
|
|
111
|
+
},
|
|
112
|
+
/* @__PURE__ */ React.createElement(CloseIcon, null)
|
|
113
|
+
)
|
|
100
114
|
)
|
|
101
|
-
)
|
|
115
|
+
), /* @__PURE__ */ React.createElement(DialogContent, { sx: { backgroundColor: dialogBackgroundColor } }, "Are you sure you want to delete the role", " ", /* @__PURE__ */ React.createElement(Typography, { component: "span", sx: { fontWeight: "bold" } }, roleName), " ", "?", /* @__PURE__ */ React.createElement("br", null), /* @__PURE__ */ React.createElement("br", null), "Deleting this role is irreversible and will remove its functionality from the system. Proceed with caution.", /* @__PURE__ */ React.createElement("br", null), /* @__PURE__ */ React.createElement("br", null), "The", " ", /* @__PURE__ */ React.createElement(Typography, { component: "span", sx: { fontWeight: "bold" } }, `${getMembers(
|
|
102
116
|
propOptions.memberRefs
|
|
103
117
|
).toLocaleLowerCase("en-US")}`), " ", "associated with this role will lose access to all the", " ", /* @__PURE__ */ React.createElement(
|
|
104
118
|
Typography,
|
|
@@ -112,7 +126,10 @@ const DeleteRoleDialog = ({
|
|
|
112
126
|
{
|
|
113
127
|
name: "delete-role",
|
|
114
128
|
"data-testid": "delete-role",
|
|
115
|
-
|
|
129
|
+
sx: {
|
|
130
|
+
marginTop: "24px",
|
|
131
|
+
backgroundColor: `${dialogBackgroundColor} !important`
|
|
132
|
+
},
|
|
116
133
|
required: true,
|
|
117
134
|
variant: "outlined",
|
|
118
135
|
label: "Role name",
|
|
@@ -124,11 +141,12 @@ const DeleteRoleDialog = ({
|
|
|
124
141
|
)), error && /* @__PURE__ */ React.createElement(Box, { maxWidth: "650px", marginLeft: "20px" }, /* @__PURE__ */ React.createElement(Alert, { severity: "error" }, error)), /* @__PURE__ */ React.createElement(
|
|
125
142
|
DialogActions,
|
|
126
143
|
{
|
|
127
|
-
|
|
144
|
+
sx: {
|
|
128
145
|
paddingLeft: "25px",
|
|
129
146
|
paddingBottom: "30px",
|
|
130
147
|
justifyContent: "left",
|
|
131
|
-
paddingTop: "16px"
|
|
148
|
+
paddingTop: "16px",
|
|
149
|
+
backgroundColor: dialogBackgroundColor
|
|
132
150
|
}
|
|
133
151
|
},
|
|
134
152
|
/* @__PURE__ */ React.createElement(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeleteRoleDialog.esm.js","sources":["../../../src/components/RolesList/DeleteRoleDialog.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 { useApi } from '@backstage/core-plugin-api';\n\nimport CloseIcon from '@mui/icons-material/Close';\nimport ErrorIcon from '@mui/icons-material/Error';\nimport Alert from '@mui/material/Alert';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport IconButton from '@mui/material/IconButton';\nimport TextField from '@mui/material/TextField';\nimport Typography from '@mui/material/Typography';\n\nimport { RoleBasedPolicy } from '@backstage-community/plugin-rbac-common';\n\nimport { rbacApiRef } from '../../api/RBACBackendClient';\nimport { getMembers } from '../../utils/rbac-utils';\nimport {\n removeConditions,\n removePermissions,\n} from '../../utils/role-form-utils';\nimport { useToast } from '../ToastContext';\n\ntype DeleteRoleDialogProps = {\n open: boolean;\n closeDialog: () => void;\n roleName: string;\n propOptions: {\n memberRefs: string[];\n permissions: number;\n };\n};\n\nconst DeleteRoleDialog = ({\n open,\n closeDialog,\n roleName,\n propOptions,\n}: DeleteRoleDialogProps) => {\n const { setToastMessage } = useToast();\n const [deleteRoleValue, setDeleteRoleValue] = React.useState<string>();\n const [disableDelete, setDisableDelete] = React.useState(false);\n const [error, setError] = React.useState<string>('');\n\n const rbacApi = useApi(rbacApiRef);\n\n const deleteRole = async () => {\n try {\n const policies = await rbacApi.getAssociatedPolicies(roleName);\n const conditionalPolicies = await rbacApi.getRoleConditions(roleName);\n\n if (Array.isArray(policies)) {\n const allowedPolicies = policies.filter(\n (policy: RoleBasedPolicy) => policy.effect !== 'deny',\n );\n await removePermissions(roleName, allowedPolicies, rbacApi);\n }\n\n if (Array.isArray(conditionalPolicies)) {\n const conditionalPoliciesIds = conditionalPolicies.map(cp => cp.id);\n await removeConditions(conditionalPoliciesIds, rbacApi);\n }\n\n const response = await rbacApi.deleteRole(roleName);\n if (response.status === 200 || response.status === 204) {\n setToastMessage(`Role ${roleName} deleted successfully`);\n closeDialog();\n } else {\n setError(`Unable to delete the role. ${response.statusText}`);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : `${err}`);\n }\n };\n\n const onTextInput = (value: string) => {\n setDeleteRoleValue(value);\n if (value === '') {\n setDisableDelete(true);\n } else if (value === roleName) {\n setDisableDelete(false);\n } else {\n setDisableDelete(true);\n }\n };\n\n return (\n <Dialog maxWidth=\"md\" open={open} onClose={closeDialog}>\n <DialogTitle id=\"delete-role\" title=\"Delete Role\">\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: theme => theme.spacing(1),\n }}\n >\n <Typography component=\"span\" sx={{ fontWeight: 'bold' }}>\n <ErrorIcon\n style={{\n color: 'red',\n alignContent: 'center',\n marginTop: '7px',\n marginBottom: '-3px',\n }}\n fontSize=\"small\"\n />{' '}\n Delete this role?\n </Typography>\n\n <IconButton\n aria-label=\"close\"\n sx={{\n position: 'absolute',\n right: theme => theme.spacing(1),\n top: theme => theme.spacing(1),\n color: theme => theme.palette.grey[500],\n }}\n onClick={closeDialog}\n >\n <CloseIcon />\n </IconButton>\n </Box>\n </DialogTitle>\n <DialogContent>\n Are you sure you want to delete the role{' '}\n <Typography component=\"span\" sx={{ fontWeight: 'bold' }}>\n {roleName}\n </Typography>{' '}\n ?\n <br />\n <br />\n Deleting this role is irreversible and will remove its functionality\n from the system. Proceed with caution.\n <br />\n <br />\n The{' '}\n <Typography component=\"span\" sx={{ fontWeight: 'bold' }}>{`${getMembers(\n propOptions.memberRefs,\n ).toLocaleLowerCase('en-US')}`}</Typography>{' '}\n associated with this role will lose access to all the{' '}\n <Typography\n component=\"span\"\n sx={{ fontWeight: 'bold' }}\n >{`${propOptions.permissions} permission policies`}</Typography>{' '}\n specified in this role.\n <br />\n <TextField\n name=\"delete-role\"\n data-testid=\"delete-role\"\n style={{ marginTop: '24px' }}\n required\n variant=\"outlined\"\n label=\"Role name\"\n defaultValue={deleteRoleValue}\n helperText=\"Type the name of the role to confirm\"\n onChange={({ target: { value } }) => onTextInput(value)}\n onBlur={({ target: { value } }) => onTextInput(value)}\n />\n </DialogContent>\n {error && (\n <Box maxWidth=\"650px\" marginLeft=\"20px\">\n <Alert severity=\"error\">{error}</Alert>\n </Box>\n )}\n <DialogActions\n style={{\n paddingLeft: '25px',\n paddingBottom: '30px',\n justifyContent: 'left',\n paddingTop: '16px',\n }}\n >\n <Button\n variant=\"contained\"\n style={\n disableDelete || !deleteRoleValue\n ? {}\n : { background: 'red', color: 'white' }\n }\n onClick={deleteRole}\n disabled={disableDelete || !deleteRoleValue}\n >\n Delete\n </Button>\n <Button variant=\"outlined\" onClick={closeDialog}>\n Cancel\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\nexport default DeleteRoleDialog;\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DeleteRoleDialog.esm.js","sources":["../../../src/components/RolesList/DeleteRoleDialog.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 { useApi } from '@backstage/core-plugin-api';\n\nimport CloseIcon from '@mui/icons-material/Close';\nimport ErrorIcon from '@mui/icons-material/Error';\nimport Alert from '@mui/material/Alert';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport IconButton from '@mui/material/IconButton';\nimport TextField from '@mui/material/TextField';\nimport Typography from '@mui/material/Typography';\n\nimport { RoleBasedPolicy } from '@backstage-community/plugin-rbac-common';\n\nimport { rbacApiRef } from '../../api/RBACBackendClient';\nimport { getMembers } from '../../utils/rbac-utils';\nimport {\n removeConditions,\n removePermissions,\n} from '../../utils/role-form-utils';\nimport { useToast } from '../ToastContext';\n\ntype DeleteRoleDialogProps = {\n open: boolean;\n closeDialog: () => void;\n roleName: string;\n propOptions: {\n memberRefs: string[];\n permissions: number;\n };\n};\n\nconst DeleteRoleDialog = ({\n open,\n closeDialog,\n roleName,\n propOptions,\n}: DeleteRoleDialogProps) => {\n const { setToastMessage } = useToast();\n const [deleteRoleValue, setDeleteRoleValue] = React.useState<string>();\n const [disableDelete, setDisableDelete] = React.useState(false);\n const [error, setError] = React.useState<string>('');\n\n const rbacApi = useApi(rbacApiRef);\n\n const dialogBackgroundColor = (theme: { palette: { mode: string } }) =>\n theme.palette.mode === 'dark' ? '#1b1d21' : '#fff';\n\n const deleteRole = async () => {\n try {\n const policies = await rbacApi.getAssociatedPolicies(roleName);\n const conditionalPolicies = await rbacApi.getRoleConditions(roleName);\n\n if (Array.isArray(policies)) {\n const allowedPolicies = policies.filter(\n (policy: RoleBasedPolicy) => policy.effect !== 'deny',\n );\n await removePermissions(roleName, allowedPolicies, rbacApi);\n }\n\n if (Array.isArray(conditionalPolicies)) {\n const conditionalPoliciesIds = conditionalPolicies.map(cp => cp.id);\n await removeConditions(conditionalPoliciesIds, rbacApi);\n }\n\n const response = await rbacApi.deleteRole(roleName);\n if (response.status === 200 || response.status === 204) {\n setToastMessage(`Role ${roleName} deleted successfully`);\n closeDialog();\n } else {\n setError(`Unable to delete the role. ${response.statusText}`);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : `${err}`);\n }\n };\n\n const onTextInput = (value: string) => {\n setDeleteRoleValue(value);\n if (value === '') {\n setDisableDelete(true);\n } else if (value === roleName) {\n setDisableDelete(false);\n } else {\n setDisableDelete(true);\n }\n };\n\n return (\n <Dialog maxWidth=\"md\" open={open} onClose={closeDialog}>\n <DialogTitle\n id=\"delete-role\"\n title=\"Delete Role\"\n sx={{\n marginBottom: '0 !important',\n backgroundColor: dialogBackgroundColor,\n }}\n >\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: theme => theme.spacing(1),\n }}\n >\n <Typography component=\"span\" sx={{ fontWeight: 'bold' }}>\n <ErrorIcon\n style={{\n color: 'red',\n alignContent: 'center',\n marginTop: '7px',\n marginRight: '5px',\n marginBottom: '-3px',\n }}\n fontSize=\"small\"\n />{' '}\n Delete this role?\n </Typography>\n\n <IconButton\n aria-label=\"close\"\n sx={{\n padding: '8px !important',\n color: theme => theme.palette.grey[500],\n borderRadius: '50%',\n '&:hover': { borderRadius: '50%' },\n }}\n onClick={closeDialog}\n >\n <CloseIcon />\n </IconButton>\n </Box>\n </DialogTitle>\n <DialogContent sx={{ backgroundColor: dialogBackgroundColor }}>\n Are you sure you want to delete the role{' '}\n <Typography component=\"span\" sx={{ fontWeight: 'bold' }}>\n {roleName}\n </Typography>{' '}\n ?\n <br />\n <br />\n Deleting this role is irreversible and will remove its functionality\n from the system. Proceed with caution.\n <br />\n <br />\n The{' '}\n <Typography component=\"span\" sx={{ fontWeight: 'bold' }}>{`${getMembers(\n propOptions.memberRefs,\n ).toLocaleLowerCase('en-US')}`}</Typography>{' '}\n associated with this role will lose access to all the{' '}\n <Typography\n component=\"span\"\n sx={{ fontWeight: 'bold' }}\n >{`${propOptions.permissions} permission policies`}</Typography>{' '}\n specified in this role.\n <br />\n <TextField\n name=\"delete-role\"\n data-testid=\"delete-role\"\n sx={{\n marginTop: '24px',\n backgroundColor: `${dialogBackgroundColor} !important`,\n }}\n required\n variant=\"outlined\"\n label=\"Role name\"\n defaultValue={deleteRoleValue}\n helperText=\"Type the name of the role to confirm\"\n onChange={({ target: { value } }) => onTextInput(value)}\n onBlur={({ target: { value } }) => onTextInput(value)}\n />\n </DialogContent>\n {error && (\n <Box maxWidth=\"650px\" marginLeft=\"20px\">\n <Alert severity=\"error\">{error}</Alert>\n </Box>\n )}\n <DialogActions\n sx={{\n paddingLeft: '25px',\n paddingBottom: '30px',\n justifyContent: 'left',\n paddingTop: '16px',\n backgroundColor: dialogBackgroundColor,\n }}\n >\n <Button\n variant=\"contained\"\n style={\n disableDelete || !deleteRoleValue\n ? {}\n : { background: 'red', color: 'white' }\n }\n onClick={deleteRole}\n disabled={disableDelete || !deleteRoleValue}\n >\n Delete\n </Button>\n <Button variant=\"outlined\" onClick={closeDialog}>\n Cancel\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\nexport default DeleteRoleDialog;\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RolesListToolbar.esm.js","sources":["../../../src/components/RolesList/RolesListToolbar.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 { Link, LinkButton } from '@backstage/core-components';\n\nimport Alert from '@mui/material/Alert';\nimport AlertTitle from '@mui/material/AlertTitle';\nimport Typography from '@mui/material/Typography';\n\nexport const RolesListToolbar = ({\n createRoleAllowed,\n createRoleLoading,\n}: {\n createRoleAllowed: boolean;\n createRoleLoading: boolean;\n}) => {\n return (\n <div>\n {!createRoleLoading && !createRoleAllowed && (\n <Alert severity=\"warning\" data-testid=\"create-role-warning\">\n <AlertTitle\n sx={{\n fontWeight: 'bold',\n }}\n >\n Unable to create role.\n </AlertTitle>\n To enable create/edit role button, make sure required users/groups are\n available in catalog as a role cannot be created without users/groups\n and also the role associated with your user should have the permission\n policies mentioned{' '}\n <Link\n to=\"https://github.com/backstage/community-plugins/tree/main/workspaces/rbac/plugins/rbac#prerequisites\"\n target=\"_blank\"\n >\n here\n </Link>\n <Typography sx={{ mt: 1 }} fontSize=\"small\">\n <Typography component=\"span\" fontWeight=\"bold\" fontSize=\"small\">\n Note\n </Typography>\n : Even after ingesting users/groups in catalog and applying above\n permissions if the create/edit button is still disabled then please\n contact your administrator as you might be conditionally restricted\n from accessing the create/edit button.\n </Typography>\n </Alert>\n )}\n <br />\n <Typography\n component=\"span\"\n sx={{\n display: 'flex',\n justifyContent: 'end',\n marginBottom: '24px',\n }}\n >\n <LinkButton\n to=\"role/new\"\n color=\"primary\"\n variant=\"contained\"\n disabled={!createRoleAllowed}\n data-testid=\"create-role\"\n >\n Create\n </LinkButton>\n </Typography>\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;AAuBO,MAAM,mBAAmB,CAAC;AAAA,EAC/B,iBAAA;AAAA,EACA;AACF,CAGM,KAAA;AACJ,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,KACE,EAAA,IAAA,EAAA,CAAC,iBAAqB,IAAA,CAAC,iBACtB,oBAAA,KAAA,CAAA,aAAA,CAAC,KAAM,EAAA,EAAA,QAAA,EAAS,SAAU,EAAA,aAAA,EAAY,qBACpC,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,EAAI,EAAA;AAAA,QACF,UAAY,EAAA;AAAA;AACd,KAAA;AAAA,IACD;AAAA,GAED,EAAa,0OAIM,GACnB,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,EAAG,EAAA,qGAAA;AAAA,MACH,MAAO,EAAA;AAAA,KAAA;AAAA,IACR;AAAA,GAED,kBACC,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,EAAI,EAAA,EAAE,IAAI,CAAE,EAAA,EAAG,QAAS,EAAA,OAAA,EAAA,kBACjC,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,WAAU,MAAO,EAAA,UAAA,EAAW,MAAO,EAAA,QAAA,EAAS,OAAQ,EAAA,EAAA,MAEhE,CAAa,EAAA,kPAKf,CACF,CAAA,kBAED,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAG,CACJ,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,SAAU,EAAA,MAAA;AAAA,MACV,EAAI,EAAA;AAAA,QACF,OAAS,EAAA,MAAA;AAAA,QACT,cAAgB,EAAA,KAAA;AAAA,QAChB,YAAc,EAAA;AAAA;AAChB,KAAA;AAAA,oBAEA,KAAA,CAAA,aAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,EAAG,EAAA,UAAA;AAAA,QACH,KAAM,EAAA,SAAA;AAAA,QACN,OAAQ,EAAA,WAAA;AAAA,QACR,UAAU,CAAC,iBAAA;AAAA,QACX,aAAY,EAAA;AAAA,OAAA;AAAA,MACb;AAAA;AAED,GAEJ,CAAA;AAEJ;;;;"}
|
|
1
|
+
{"version":3,"file":"RolesListToolbar.esm.js","sources":["../../../src/components/RolesList/RolesListToolbar.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 { Link, LinkButton } from '@backstage/core-components';\n\nimport Alert from '@mui/material/Alert';\nimport AlertTitle from '@mui/material/AlertTitle';\nimport Typography from '@mui/material/Typography';\n\nexport const RolesListToolbar = ({\n createRoleAllowed,\n createRoleLoading,\n}: {\n createRoleAllowed: boolean;\n createRoleLoading: boolean;\n}) => {\n return (\n <div>\n {!createRoleLoading && !createRoleAllowed && (\n <Alert severity=\"warning\" data-testid=\"create-role-warning\">\n <AlertTitle\n sx={{\n fontWeight: 'bold',\n }}\n >\n Unable to create role.\n </AlertTitle>\n To enable create/edit role button, make sure required users/groups are\n available in catalog as a role cannot be created without users/groups\n and also the role associated with your user should have the permission\n policies mentioned{' '}\n <Link\n to=\"https://github.com/backstage/community-plugins/tree/main/workspaces/rbac/plugins/rbac#prerequisites\"\n target=\"_blank\"\n >\n here\n </Link>\n <Typography sx={{ mt: 1 }} fontSize=\"small\">\n <Typography component=\"span\" fontWeight=\"bold\" fontSize=\"small\">\n Note\n </Typography>\n : Even after ingesting users/groups in catalog and applying above\n permissions if the create/edit button is still disabled then please\n contact your administrator as you might be conditionally restricted\n from accessing the create/edit button.\n </Typography>\n </Alert>\n )}\n <br />\n <Typography\n component=\"span\"\n sx={{\n display: 'flex',\n justifyContent: 'end',\n marginBottom: '24px !important',\n }}\n >\n <LinkButton\n to=\"role/new\"\n color=\"primary\"\n variant=\"contained\"\n disabled={!createRoleAllowed}\n data-testid=\"create-role\"\n >\n Create\n </LinkButton>\n </Typography>\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;AAuBO,MAAM,mBAAmB,CAAC;AAAA,EAC/B,iBAAA;AAAA,EACA;AACF,CAGM,KAAA;AACJ,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,KACE,EAAA,IAAA,EAAA,CAAC,iBAAqB,IAAA,CAAC,iBACtB,oBAAA,KAAA,CAAA,aAAA,CAAC,KAAM,EAAA,EAAA,QAAA,EAAS,SAAU,EAAA,aAAA,EAAY,qBACpC,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,EAAI,EAAA;AAAA,QACF,UAAY,EAAA;AAAA;AACd,KAAA;AAAA,IACD;AAAA,GAED,EAAa,0OAIM,GACnB,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,EAAG,EAAA,qGAAA;AAAA,MACH,MAAO,EAAA;AAAA,KAAA;AAAA,IACR;AAAA,GAED,kBACC,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,EAAI,EAAA,EAAE,IAAI,CAAE,EAAA,EAAG,QAAS,EAAA,OAAA,EAAA,kBACjC,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,WAAU,MAAO,EAAA,UAAA,EAAW,MAAO,EAAA,QAAA,EAAS,OAAQ,EAAA,EAAA,MAEhE,CAAa,EAAA,kPAKf,CACF,CAAA,kBAED,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAG,CACJ,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,SAAU,EAAA,MAAA;AAAA,MACV,EAAI,EAAA;AAAA,QACF,OAAS,EAAA,MAAA;AAAA,QACT,cAAgB,EAAA,KAAA;AAAA,QAChB,YAAc,EAAA;AAAA;AAChB,KAAA;AAAA,oBAEA,KAAA,CAAA,aAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,EAAG,EAAA,UAAA;AAAA,QACH,KAAM,EAAA,SAAA;AAAA,QACN,OAAQ,EAAA,WAAA;AAAA,QACR,UAAU,CAAC,iBAAA;AAAA,QACX,aAAY,EAAA;AAAA,OAAA;AAAA,MACb;AAAA;AAED,GAEJ,CAAA;AAEJ;;;;"}
|