@backstage-community/plugin-rbac 1.40.0 → 1.41.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.
Files changed (99) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/components/Administration.esm.js +2 -2
  3. package/dist/components/Administration.esm.js.map +1 -1
  4. package/dist/components/ConditionalAccess/AddNestedConditionButton.esm.js +16 -7
  5. package/dist/components/ConditionalAccess/AddNestedConditionButton.esm.js.map +1 -1
  6. package/dist/components/ConditionalAccess/ComplexConditionRow.esm.js +40 -38
  7. package/dist/components/ConditionalAccess/ComplexConditionRow.esm.js.map +1 -1
  8. package/dist/components/ConditionalAccess/ComplexConditionRowButtons.esm.js +34 -32
  9. package/dist/components/ConditionalAccess/ComplexConditionRowButtons.esm.js.map +1 -1
  10. package/dist/components/ConditionalAccess/ConditionRule.esm.js +2 -2
  11. package/dist/components/ConditionalAccess/ConditionRule.esm.js.map +1 -1
  12. package/dist/components/ConditionalAccess/ConditionalAccessSidebar.esm.js +63 -53
  13. package/dist/components/ConditionalAccess/ConditionalAccessSidebar.esm.js.map +1 -1
  14. package/dist/components/ConditionalAccess/ConditionsForm.esm.js +108 -96
  15. package/dist/components/ConditionalAccess/ConditionsForm.esm.js.map +1 -1
  16. package/dist/components/ConditionalAccess/ConditionsFormRow.esm.js +236 -215
  17. package/dist/components/ConditionalAccess/ConditionsFormRow.esm.js.map +1 -1
  18. package/dist/components/ConditionalAccess/ConditionsFormRowFields.esm.js +63 -60
  19. package/dist/components/ConditionalAccess/ConditionsFormRowFields.esm.js.map +1 -1
  20. package/dist/components/ConditionalAccess/CriteriaToggleButton.esm.js +5 -5
  21. package/dist/components/ConditionalAccess/CriteriaToggleButton.esm.js.map +1 -1
  22. package/dist/components/ConditionalAccess/CustomArrayField.esm.js +33 -31
  23. package/dist/components/ConditionalAccess/CustomArrayField.esm.js.map +1 -1
  24. package/dist/components/ConditionalAccess/RulesDropdownOption.esm.js +11 -10
  25. package/dist/components/ConditionalAccess/RulesDropdownOption.esm.js.map +1 -1
  26. package/dist/components/CreateRole/AddMembersForm.esm.js +69 -59
  27. package/dist/components/CreateRole/AddMembersForm.esm.js.map +1 -1
  28. package/dist/components/CreateRole/AddedMembersTable.esm.js +3 -3
  29. package/dist/components/CreateRole/AddedMembersTable.esm.js.map +1 -1
  30. package/dist/components/CreateRole/AddedMembersTableColumn.esm.js +7 -7
  31. package/dist/components/CreateRole/AddedMembersTableColumn.esm.js.map +1 -1
  32. package/dist/components/CreateRole/CancelDialog.esm.js +73 -59
  33. package/dist/components/CreateRole/CancelDialog.esm.js.map +1 -1
  34. package/dist/components/CreateRole/CreateRolePage.esm.js +23 -20
  35. package/dist/components/CreateRole/CreateRolePage.esm.js.map +1 -1
  36. package/dist/components/CreateRole/EditRolePage.esm.js +27 -24
  37. package/dist/components/CreateRole/EditRolePage.esm.js.map +1 -1
  38. package/dist/components/CreateRole/MembersDropdownOption.esm.js +34 -24
  39. package/dist/components/CreateRole/MembersDropdownOption.esm.js.map +1 -1
  40. package/dist/components/CreateRole/PermissionPoliciesForm.esm.js +39 -26
  41. package/dist/components/CreateRole/PermissionPoliciesForm.esm.js.map +1 -1
  42. package/dist/components/CreateRole/PermissionPoliciesFormNestedRow.esm.js +107 -90
  43. package/dist/components/CreateRole/PermissionPoliciesFormNestedRow.esm.js.map +1 -1
  44. package/dist/components/CreateRole/PermissionPoliciesFormRow.esm.js +82 -72
  45. package/dist/components/CreateRole/PermissionPoliciesFormRow.esm.js.map +1 -1
  46. package/dist/components/CreateRole/PermissionPoliciesFormTable.esm.js +127 -111
  47. package/dist/components/CreateRole/PermissionPoliciesFormTable.esm.js.map +1 -1
  48. package/dist/components/CreateRole/PluginsDropdown.esm.js +6 -5
  49. package/dist/components/CreateRole/PluginsDropdown.esm.js.map +1 -1
  50. package/dist/components/CreateRole/PluginsDropdownOption.esm.js +21 -18
  51. package/dist/components/CreateRole/PluginsDropdownOption.esm.js.map +1 -1
  52. package/dist/components/CreateRole/ReviewStep.esm.js +21 -12
  53. package/dist/components/CreateRole/ReviewStep.esm.js.map +1 -1
  54. package/dist/components/CreateRole/ReviewStepTable.esm.js +18 -11
  55. package/dist/components/CreateRole/ReviewStepTable.esm.js.map +1 -1
  56. package/dist/components/CreateRole/RoleDetailsForm.esm.js +55 -53
  57. package/dist/components/CreateRole/RoleDetailsForm.esm.js.map +1 -1
  58. package/dist/components/CreateRole/RoleForm.esm.js +136 -113
  59. package/dist/components/CreateRole/RoleForm.esm.js.map +1 -1
  60. package/dist/components/DownloadUserStatistics.esm.js +5 -5
  61. package/dist/components/DownloadUserStatistics.esm.js.map +1 -1
  62. package/dist/components/EditRole.esm.js +6 -6
  63. package/dist/components/EditRole.esm.js.map +1 -1
  64. package/dist/components/RbacPage.esm.js +6 -3
  65. package/dist/components/RbacPage.esm.js.map +1 -1
  66. package/dist/components/RoleOverview/AboutCard.esm.js +46 -39
  67. package/dist/components/RoleOverview/AboutCard.esm.js.map +1 -1
  68. package/dist/components/RoleOverview/MembersCard.esm.js +36 -32
  69. package/dist/components/RoleOverview/MembersCard.esm.js.map +1 -1
  70. package/dist/components/RoleOverview/MembersListColumns.esm.js +5 -5
  71. package/dist/components/RoleOverview/MembersListColumns.esm.js.map +1 -1
  72. package/dist/components/RoleOverview/PermissionsCard.esm.js +36 -32
  73. package/dist/components/RoleOverview/PermissionsCard.esm.js.map +1 -1
  74. package/dist/components/RoleOverview/RoleOverviewPage.esm.js +39 -30
  75. package/dist/components/RoleOverview/RoleOverviewPage.esm.js.map +1 -1
  76. package/dist/components/RolesList/DeleteRole.esm.js +6 -6
  77. package/dist/components/RolesList/DeleteRole.esm.js.map +1 -1
  78. package/dist/components/RolesList/DeleteRoleDialog.esm.js +128 -92
  79. package/dist/components/RolesList/DeleteRoleDialog.esm.js.map +1 -1
  80. package/dist/components/RolesList/RolesList.esm.js +54 -46
  81. package/dist/components/RolesList/RolesList.esm.js.map +1 -1
  82. package/dist/components/RolesList/RolesListColumns.esm.js +19 -16
  83. package/dist/components/RolesList/RolesListColumns.esm.js.map +1 -1
  84. package/dist/components/RolesList/RolesListToolbar.esm.js +49 -36
  85. package/dist/components/RolesList/RolesListToolbar.esm.js.map +1 -1
  86. package/dist/components/Router.esm.js +14 -9
  87. package/dist/components/Router.esm.js.map +1 -1
  88. package/dist/components/SnackbarAlert.esm.js +5 -5
  89. package/dist/components/SnackbarAlert.esm.js.map +1 -1
  90. package/dist/components/ToastContext.esm.js +5 -4
  91. package/dist/components/ToastContext.esm.js.map +1 -1
  92. package/dist/hooks/useMembers.esm.js +2 -2
  93. package/dist/hooks/useMembers.esm.js.map +1 -1
  94. package/dist/hooks/usePermissionPolicies.esm.js +4 -4
  95. package/dist/hooks/usePermissionPolicies.esm.js.map +1 -1
  96. package/dist/hooks/useRoles.esm.js +9 -7
  97. package/dist/hooks/useRoles.esm.js.map +1 -1
  98. package/dist/index.d.ts +3 -4
  99. package/package.json +13 -13
@@ -1,4 +1,5 @@
1
- import React__default from 'react';
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useState } from 'react';
2
3
  import { useNavigate } from 'react-router-dom';
3
4
  import { SimpleStepper, SimpleStepperStep } from '@backstage/core-components';
4
5
  import { useApi } from '@backstage/core-plugin-api';
@@ -30,8 +31,8 @@ const RoleForm = ({
30
31
  submitLabel,
31
32
  initialValues
32
33
  }) => {
33
- const [activeStep, setActiveStep] = React__default.useState(step || 0);
34
- const [openCancelDialog, setOpenCancelDialog] = React__default.useState(false);
34
+ const [activeStep, setActiveStep] = useState(step || 0);
35
+ const [openCancelDialog, setOpenCancelDialog] = useState(false);
35
36
  const navigate = useNavigate();
36
37
  const rbacApi = useApi(rbacApiRef);
37
38
  const updateRole = async (name, values, formikHelpers) => {
@@ -157,119 +158,141 @@ const RoleForm = ({
157
158
  setActiveStep(0);
158
159
  formik.handleReset(e);
159
160
  };
160
- return /* @__PURE__ */ React__default.createElement(Card, { style: { overflow: "auto" } }, /* @__PURE__ */ React__default.createElement(CardHeader, { title: titles.formTitle }), /* @__PURE__ */ React__default.createElement(Divider, null), /* @__PURE__ */ React__default.createElement(
161
- CardContent,
162
- {
163
- component: "form",
164
- onSubmit: formik.handleSubmit,
165
- style: { position: "relative" }
166
- },
167
- /* @__PURE__ */ React__default.createElement(SimpleStepper, { activeStep }, /* @__PURE__ */ React__default.createElement(
168
- SimpleStepperStep,
161
+ return /* @__PURE__ */ jsxs(Card, { style: { overflow: "auto" }, children: [
162
+ /* @__PURE__ */ jsx(CardHeader, { title: titles.formTitle }),
163
+ /* @__PURE__ */ jsx(Divider, {}),
164
+ /* @__PURE__ */ jsxs(
165
+ CardContent,
169
166
  {
170
- title: titles.nameAndDescriptionTitle,
171
- actions: {
172
- showBack: false,
173
- showNext: true,
174
- nextText: "Next",
175
- canNext: () => !!formik.values.name && !formik.errors.name,
176
- onNext: () => handleNext("name")
177
- }
178
- },
179
- /* @__PURE__ */ React__default.createElement(
180
- RoleDetailsForm,
181
- {
182
- name: formik.values.name,
183
- description: formik.values.description,
184
- owner: formik.values.owner,
185
- handleBlur: formik.handleBlur,
186
- handleChange: formik.handleChange,
187
- nameError: formik.errors.name
188
- }
189
- )
190
- ), /* @__PURE__ */ React__default.createElement(
191
- SimpleStepperStep,
192
- {
193
- title: titles.usersAndGroupsTitle,
194
- actions: {
195
- showNext: true,
196
- nextText: "Next",
197
- canNext: () => formik.values.selectedMembers?.length > 0 && !formik.errors.selectedMembers,
198
- onNext: () => handleNext("selectedMembers"),
199
- showBack: true,
200
- backText: "Back",
201
- onBack: handleBack
202
- }
203
- },
204
- /* @__PURE__ */ React__default.createElement(Box, null, /* @__PURE__ */ React__default.createElement(
205
- AddMembersForm,
206
- {
207
- selectedMembers: formik.values.selectedMembers,
208
- selectedMembersError: formik.errors.selectedMembers,
209
- setFieldValue: formik.setFieldValue,
210
- membersData
211
- }
212
- ), /* @__PURE__ */ React__default.createElement("br", null), /* @__PURE__ */ React__default.createElement(
213
- AddedMembersTable,
214
- {
215
- selectedMembers: formik.values.selectedMembers,
216
- setFieldValue: formik.setFieldValue
217
- }
218
- ))
219
- ), /* @__PURE__ */ React__default.createElement(
220
- SimpleStepperStep,
221
- {
222
- title: titles.permissionPoliciesTitle,
223
- actions: {
224
- showNext: true,
225
- nextText: "Next",
226
- canNext: () => canNextPermissionPoliciesStep(),
227
- onNext: () => handleNext("permissionPoliciesRows"),
228
- showBack: true,
229
- backText: "Back",
230
- onBack: handleBack
231
- }
232
- },
233
- /* @__PURE__ */ React__default.createElement(
234
- PermissionPoliciesForm,
235
- {
236
- permissionPoliciesRows: formik.values.permissionPoliciesRows,
237
- selectedPlugins: formik.values.selectedPlugins,
238
- selectedPluginsError: formik.errors.selectedPlugins,
239
- setFieldValue: formik.setFieldValue,
240
- setFieldError: formik.setFieldError,
241
- handleBlur: formik.handleBlur
242
- }
243
- )
244
- ), /* @__PURE__ */ React__default.createElement(SimpleStepperStep, { title: "", end: true }, /* @__PURE__ */ React__default.createElement(Paper, { square: true, elevation: 0 }, /* @__PURE__ */ React__default.createElement(ReviewStep, { values: formik.values, isEditing: !!roleName }), /* @__PURE__ */ React__default.createElement("br", null), /* @__PURE__ */ React__default.createElement(Button, { onClick: handleBack }, "Back"), /* @__PURE__ */ React__default.createElement(Button, { onClick: (e) => handleReset(e) }, "Reset"), /* @__PURE__ */ React__default.createElement(
245
- Button,
246
- {
247
- variant: "contained",
248
- color: "primary",
249
- type: "submit",
250
- disabled: !!formik.errors.name || !!formik.errors.selectedMembers || !formik.dirty
251
- },
252
- submitLabel || "Create"
253
- )))),
254
- formik.status?.submitError && /* @__PURE__ */ React__default.createElement(Box, { style: { paddingBottom: "16px" } }, /* @__PURE__ */ React__default.createElement(Alert, { severity: "error" }, `${formik.status.submitError}`)),
255
- /* @__PURE__ */ React__default.createElement(
256
- Button,
167
+ component: "form",
168
+ onSubmit: formik.handleSubmit,
169
+ style: { position: "relative" },
170
+ children: [
171
+ /* @__PURE__ */ jsxs(SimpleStepper, { activeStep, children: [
172
+ /* @__PURE__ */ jsx(
173
+ SimpleStepperStep,
174
+ {
175
+ title: titles.nameAndDescriptionTitle,
176
+ actions: {
177
+ showBack: false,
178
+ showNext: true,
179
+ nextText: "Next",
180
+ canNext: () => !!formik.values.name && !formik.errors.name,
181
+ onNext: () => handleNext("name")
182
+ },
183
+ children: /* @__PURE__ */ jsx(
184
+ RoleDetailsForm,
185
+ {
186
+ name: formik.values.name,
187
+ description: formik.values.description,
188
+ owner: formik.values.owner,
189
+ handleBlur: formik.handleBlur,
190
+ handleChange: formik.handleChange,
191
+ nameError: formik.errors.name
192
+ }
193
+ )
194
+ }
195
+ ),
196
+ /* @__PURE__ */ jsx(
197
+ SimpleStepperStep,
198
+ {
199
+ title: titles.usersAndGroupsTitle,
200
+ actions: {
201
+ showNext: true,
202
+ nextText: "Next",
203
+ canNext: () => formik.values.selectedMembers?.length > 0 && !formik.errors.selectedMembers,
204
+ onNext: () => handleNext("selectedMembers"),
205
+ showBack: true,
206
+ backText: "Back",
207
+ onBack: handleBack
208
+ },
209
+ children: /* @__PURE__ */ jsxs(Box, { children: [
210
+ /* @__PURE__ */ jsx(
211
+ AddMembersForm,
212
+ {
213
+ selectedMembers: formik.values.selectedMembers,
214
+ selectedMembersError: formik.errors.selectedMembers,
215
+ setFieldValue: formik.setFieldValue,
216
+ membersData
217
+ }
218
+ ),
219
+ /* @__PURE__ */ jsx("br", {}),
220
+ /* @__PURE__ */ jsx(
221
+ AddedMembersTable,
222
+ {
223
+ selectedMembers: formik.values.selectedMembers,
224
+ setFieldValue: formik.setFieldValue
225
+ }
226
+ )
227
+ ] })
228
+ }
229
+ ),
230
+ /* @__PURE__ */ jsx(
231
+ SimpleStepperStep,
232
+ {
233
+ title: titles.permissionPoliciesTitle,
234
+ actions: {
235
+ showNext: true,
236
+ nextText: "Next",
237
+ canNext: () => canNextPermissionPoliciesStep(),
238
+ onNext: () => handleNext("permissionPoliciesRows"),
239
+ showBack: true,
240
+ backText: "Back",
241
+ onBack: handleBack
242
+ },
243
+ children: /* @__PURE__ */ jsx(
244
+ PermissionPoliciesForm,
245
+ {
246
+ permissionPoliciesRows: formik.values.permissionPoliciesRows,
247
+ selectedPlugins: formik.values.selectedPlugins,
248
+ selectedPluginsError: formik.errors.selectedPlugins,
249
+ setFieldValue: formik.setFieldValue,
250
+ setFieldError: formik.setFieldError,
251
+ handleBlur: formik.handleBlur
252
+ }
253
+ )
254
+ }
255
+ ),
256
+ /* @__PURE__ */ jsx(SimpleStepperStep, { title: "", end: true, children: /* @__PURE__ */ jsxs(Paper, { square: true, elevation: 0, children: [
257
+ /* @__PURE__ */ jsx(ReviewStep, { values: formik.values, isEditing: !!roleName }),
258
+ /* @__PURE__ */ jsx("br", {}),
259
+ /* @__PURE__ */ jsx(Button, { onClick: handleBack, children: "Back" }),
260
+ /* @__PURE__ */ jsx(Button, { onClick: (e) => handleReset(e), children: "Reset" }),
261
+ /* @__PURE__ */ jsx(
262
+ Button,
263
+ {
264
+ variant: "contained",
265
+ color: "primary",
266
+ type: "submit",
267
+ disabled: !!formik.errors.name || !!formik.errors.selectedMembers || !formik.dirty,
268
+ children: submitLabel || "Create"
269
+ }
270
+ )
271
+ ] }) })
272
+ ] }),
273
+ formik.status?.submitError && /* @__PURE__ */ jsx(Box, { style: { paddingBottom: "16px" }, children: /* @__PURE__ */ jsx(Alert, { severity: "error", children: `${formik.status.submitError}` }) }),
274
+ /* @__PURE__ */ jsx(
275
+ Button,
276
+ {
277
+ style: { position: "absolute", right: "2.75rem", bottom: "2.75rem" },
278
+ onClick: () => setOpenCancelDialog(true),
279
+ color: "primary",
280
+ children: "Cancel"
281
+ }
282
+ )
283
+ ]
284
+ }
285
+ ),
286
+ /* @__PURE__ */ jsx(
287
+ CancelDialog,
257
288
  {
258
- style: { position: "absolute", right: "2.75rem", bottom: "2.75rem" },
259
- onClick: () => setOpenCancelDialog(true),
260
- color: "primary"
261
- },
262
- "Cancel"
289
+ open: openCancelDialog,
290
+ editForm: !!roleName,
291
+ closeDialog: () => setOpenCancelDialog(false),
292
+ navigateTo: () => navigateTo(navigate, roleName, undefined, undefined, step)
293
+ }
263
294
  )
264
- ), /* @__PURE__ */ React__default.createElement(
265
- CancelDialog,
266
- {
267
- open: openCancelDialog,
268
- editForm: !!roleName,
269
- closeDialog: () => setOpenCancelDialog(false),
270
- navigateTo: () => navigateTo(navigate, roleName, undefined, undefined, step)
271
- }
272
- ));
295
+ ] });
273
296
  };
274
297
 
275
298
  export { RoleForm };
@@ -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 { 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 navigateTo,\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';\nimport CancelDialog from './CancelDialog';\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 [openCancelDialog, setOpenCancelDialog] =\n React.useState<boolean>(false);\n const navigate = useNavigate();\n const rbacApi = useApi(rbacApiRef);\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(navigate, roleName, newName, 'updated', step);\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(navigate, roleName, newData.name, 'created', step);\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 const selectedPluginsLength = formik.values.selectedPlugins.filter(\n sp => !!sp.value,\n ).length;\n return (\n selectedPluginsLength > 0 &&\n formik.values.permissionPoliciesRows.filter(pp =>\n formik.values.selectedPlugins.find(sp => sp.value === pp.plugin),\n ).length >= selectedPluginsLength &&\n !formik.errors.selectedPlugins &&\n (!formik.errors.permissionPoliciesRows ||\n (Array.isArray(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\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 owner={formik.values.owner}\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 selectedPlugins={formik.values.selectedPlugins}\n selectedPluginsError={\n formik.errors.selectedPlugins as FormikErrors<string>\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={() => setOpenCancelDialog(true)}\n color=\"primary\"\n >\n Cancel\n </Button>\n </CardContent>\n <CancelDialog\n open={openCancelDialog}\n editForm={!!roleName}\n closeDialog={() => setOpenCancelDialog(false)}\n navigateTo={() =>\n navigateTo(navigate, roleName, undefined, undefined, step)\n }\n />\n </Card>\n );\n};\n"],"names":["React"],"mappings":"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"}
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 { useState, MouseEvent } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\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 navigateTo,\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';\nimport CancelDialog from './CancelDialog';\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] = useState<number>(step || 0);\n const [openCancelDialog, setOpenCancelDialog] = useState<boolean>(false);\n const navigate = useNavigate();\n const rbacApi = useApi(rbacApiRef);\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(navigate, roleName, newName, 'updated', step);\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(navigate, roleName, newData.name, 'created', step);\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 const selectedPluginsLength = formik.values.selectedPlugins.filter(\n sp => !!sp.value,\n ).length;\n return (\n selectedPluginsLength > 0 &&\n formik.values.permissionPoliciesRows.filter(pp =>\n formik.values.selectedPlugins.find(sp => sp.value === pp.plugin),\n ).length >= selectedPluginsLength &&\n !formik.errors.selectedPlugins &&\n (!formik.errors.permissionPoliciesRows ||\n (Array.isArray(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\n const handleReset = (\n e: MouseEvent<HTMLButtonElement, globalThis.MouseEvent>,\n ) => {\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 owner={formik.values.owner}\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 selectedPlugins={formik.values.selectedPlugins}\n selectedPluginsError={\n formik.errors.selectedPlugins as FormikErrors<string>\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={() => setOpenCancelDialog(true)}\n color=\"primary\"\n >\n Cancel\n </Button>\n </CardContent>\n <CancelDialog\n open={openCancelDialog}\n editForm={!!roleName}\n closeDialog={() => setOpenCancelDialog(false)}\n navigateTo={() =>\n navigateTo(navigate, roleName, undefined, undefined, step)\n }\n />\n </Card>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import React__default from 'react';
1
+ import { jsx } from 'react/jsx-runtime';
2
2
  import { useApi } from '@backstage/core-plugin-api';
3
3
  import Button from '@mui/material/Button';
4
4
  import { licensedUsersApiRef } from '../api/LicensedUsersClient.esm.js';
@@ -29,7 +29,7 @@ function DownloadCSVLink() {
29
29
  throw new Error(`Error during the download: ${error}`);
30
30
  }
31
31
  };
32
- return /* @__PURE__ */ React__default.createElement(
32
+ return /* @__PURE__ */ jsx(
33
33
  Button,
34
34
  {
35
35
  href: "/download-csv",
@@ -39,9 +39,9 @@ function DownloadCSVLink() {
39
39
  textDecoration: "underline",
40
40
  marginTop: "1rem"
41
41
  },
42
- size: "small"
43
- },
44
- "Download User List"
42
+ size: "small",
43
+ children: "Download User List"
44
+ }
45
45
  );
46
46
  }
47
47
 
@@ -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 marginTop: '1rem',\n }}\n size=\"small\"\n >\n Download User List\n </Button>\n );\n}\n\nexport default DownloadCSVLink;\n"],"names":["React"],"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,uBAAAA,cAAA,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;;;;"}
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 { MouseEvent } 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: MouseEvent<HTMLAnchorElement, globalThis.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,GAAA;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,OAAA;AAAA,MACN,QAAA,EAAA;AAAA;AAAA,GAED;AAEJ;;;;"}
@@ -1,4 +1,4 @@
1
- import React__default from 'react';
1
+ import { jsx } from 'react/jsx-runtime';
2
2
  import { parseEntityRef } from '@backstage/catalog-model';
3
3
  import { Link } from '@backstage/core-components';
4
4
  import EditIcon from '@mui/icons-material/Edit';
@@ -23,7 +23,7 @@ const EditRole = ({
23
23
  const disable = !(editPermissionResult.allowed && canEdit);
24
24
  const dataTestIdText = disable ? `disable-update-role-${roleName}` : `update-role-${roleName}`;
25
25
  const tooltipText = disable ? "Unauthorized to edit" : "";
26
- return /* @__PURE__ */ React__default.createElement(Tooltip, { title: tooltip ?? tooltipText }, /* @__PURE__ */ React__default.createElement(Typography, { component: "span", "data-testid": dataTestId ?? dataTestIdText }, /* @__PURE__ */ React__default.createElement(
26
+ return /* @__PURE__ */ jsx(Tooltip, { title: tooltip ?? tooltipText, children: /* @__PURE__ */ jsx(Typography, { component: "span", "data-testid": dataTestId ?? dataTestIdText, children: /* @__PURE__ */ jsx(
27
27
  IconButton,
28
28
  {
29
29
  component: Link,
@@ -32,10 +32,10 @@ const EditRole = ({
32
32
  title: tooltip ?? "Edit Role",
33
33
  to: to ?? `../role/${kind}/${namespace}/${name}`,
34
34
  style: { padding: "0.5rem", color: "inherit", borderRadius: "50%" },
35
- sx: { "&:hover": { borderRadius: "50%" } }
36
- },
37
- /* @__PURE__ */ React__default.createElement(EditIcon, null)
38
- )));
35
+ sx: { "&:hover": { borderRadius: "50%" } },
36
+ children: /* @__PURE__ */ jsx(EditIcon, {})
37
+ }
38
+ ) }) });
39
39
  };
40
40
 
41
41
  export { EditRole as default };
@@ -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';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport { policyEntityUpdatePermission } from '@backstage-community/plugin-rbac-common';\n\ntype EditRoleProps = {\n roleName: string;\n canEdit: boolean;\n dataTestId?: string;\n tooltip?: string;\n to?: string;\n};\n\nconst EditRole = ({\n roleName,\n canEdit,\n dataTestId,\n tooltip,\n to,\n}: EditRoleProps) => {\n const { name, namespace, kind } = parseEntityRef(roleName);\n\n const editPermissionResult = usePermission({\n permission: policyEntityUpdatePermission,\n resourceRef: roleName,\n });\n\n const disable = !(editPermissionResult.allowed && canEdit);\n const dataTestIdText = disable\n ? `disable-update-role-${roleName}`\n : `update-role-${roleName}`;\n const tooltipText = disable ? 'Unauthorized to edit' : '';\n\n return (\n <Tooltip title={tooltip ?? tooltipText}>\n <Typography component=\"span\" data-testid={dataTestId ?? dataTestIdText}>\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":["React"],"mappings":";;;;;;;;;;AAmCA,MAAM,WAAW,CAAC;AAAA,EAChB,QAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAqB,KAAA;AACnB,EAAA,MAAM,EAAE,IAAM,EAAA,SAAA,EAAW,IAAK,EAAA,GAAI,eAAe,QAAQ,CAAA;AAEzD,EAAA,MAAM,uBAAuB,aAAc,CAAA;AAAA,IACzC,UAAY,EAAA,4BAAA;AAAA,IACZ,WAAa,EAAA;AAAA,GACd,CAAA;AAED,EAAM,MAAA,OAAA,GAAU,EAAE,oBAAA,CAAqB,OAAW,IAAA,OAAA,CAAA;AAClD,EAAA,MAAM,iBAAiB,OACnB,GAAA,CAAA,oBAAA,EAAuB,QAAQ,CAAA,CAAA,GAC/B,eAAe,QAAQ,CAAA,CAAA;AAC3B,EAAM,MAAA,WAAA,GAAc,UAAU,sBAAyB,GAAA,EAAA;AAEvD,EACE,uBAAAA,cAAA,CAAA,aAAA,CAAC,OAAQ,EAAA,EAAA,KAAA,EAAO,OAAW,IAAA,WAAA,EAAA,kBACxBA,cAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,SAAU,EAAA,MAAA,EAAO,aAAa,EAAA,UAAA,IAAc,cACtD,EAAA,kBAAAA,cAAA,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,iDAExC,QAAS,EAAA,IAAA;AAAA,GAEd,CACF,CAAA;AAEJ;;;;"}
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 { 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';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport { policyEntityUpdatePermission } from '@backstage-community/plugin-rbac-common';\n\ntype EditRoleProps = {\n roleName: string;\n canEdit: boolean;\n dataTestId?: string;\n tooltip?: string;\n to?: string;\n};\n\nconst EditRole = ({\n roleName,\n canEdit,\n dataTestId,\n tooltip,\n to,\n}: EditRoleProps) => {\n const { name, namespace, kind } = parseEntityRef(roleName);\n\n const editPermissionResult = usePermission({\n permission: policyEntityUpdatePermission,\n resourceRef: roleName,\n });\n\n const disable = !(editPermissionResult.allowed && canEdit);\n const dataTestIdText = disable\n ? `disable-update-role-${roleName}`\n : `update-role-${roleName}`;\n const tooltipText = disable ? 'Unauthorized to edit' : '';\n\n return (\n <Tooltip title={tooltip ?? tooltipText}>\n <Typography component=\"span\" data-testid={dataTestId ?? dataTestIdText}>\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,UAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAqB,KAAA;AACnB,EAAA,MAAM,EAAE,IAAM,EAAA,SAAA,EAAW,IAAK,EAAA,GAAI,eAAe,QAAQ,CAAA;AAEzD,EAAA,MAAM,uBAAuB,aAAc,CAAA;AAAA,IACzC,UAAY,EAAA,4BAAA;AAAA,IACZ,WAAa,EAAA;AAAA,GACd,CAAA;AAED,EAAM,MAAA,OAAA,GAAU,EAAE,oBAAA,CAAqB,OAAW,IAAA,OAAA,CAAA;AAClD,EAAA,MAAM,iBAAiB,OACnB,GAAA,CAAA,oBAAA,EAAuB,QAAQ,CAAA,CAAA,GAC/B,eAAe,QAAQ,CAAA,CAAA;AAC3B,EAAM,MAAA,WAAA,GAAc,UAAU,sBAAyB,GAAA,EAAA;AAEvD,EACE,uBAAA,GAAA,CAAC,OAAQ,EAAA,EAAA,KAAA,EAAO,OAAW,IAAA,WAAA,EACzB,QAAC,kBAAA,GAAA,CAAA,UAAA,EAAA,EAAW,SAAU,EAAA,MAAA,EAAO,aAAa,EAAA,UAAA,IAAc,cACtD,EAAA,QAAA,kBAAA,GAAA;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,EAAA;AAAA,MAEzC,8BAAC,QAAS,EAAA,EAAA;AAAA;AAAA,KAEd,CACF,EAAA,CAAA;AAEJ;;;;"}
@@ -1,4 +1,4 @@
1
- import React__default from 'react';
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { Page, Header, Content, ErrorPage, Progress } from '@backstage/core-components';
3
3
  import { DeleteDialogContextProvider } from '@janus-idp/shared-react';
4
4
  import { RolesList } from './RolesList/RolesList.esm.js';
@@ -13,9 +13,12 @@ const RbacPage = ({ useHeader = true }) => {
13
13
  []
14
14
  );
15
15
  if (!isUserLoading) {
16
- return result?.status === "Authorized" ? /* @__PURE__ */ React__default.createElement(Page, { themeId: "tool" }, useHeader && /* @__PURE__ */ React__default.createElement(Header, { title: "RBAC" }), /* @__PURE__ */ React__default.createElement(Content, null, /* @__PURE__ */ React__default.createElement(DeleteDialogContextProvider, null, /* @__PURE__ */ React__default.createElement(RolesList, null)))) : /* @__PURE__ */ React__default.createElement(ErrorPage, { statusMessage: "Not Found" });
16
+ return result?.status === "Authorized" ? /* @__PURE__ */ jsxs(Page, { themeId: "tool", children: [
17
+ useHeader && /* @__PURE__ */ jsx(Header, { title: "RBAC" }),
18
+ /* @__PURE__ */ jsx(Content, { children: /* @__PURE__ */ jsx(DeleteDialogContextProvider, { children: /* @__PURE__ */ jsx(RolesList, {}) }) })
19
+ ] }) : /* @__PURE__ */ jsx(ErrorPage, { statusMessage: "Not Found" });
17
20
  }
18
- return /* @__PURE__ */ React__default.createElement(Progress, null);
21
+ return /* @__PURE__ */ jsx(Progress, {});
19
22
  };
20
23
 
21
24
  export { RbacPage };
@@ -1 +1 @@
1
- {"version":3,"file":"RbacPage.esm.js","sources":["../../src/components/RbacPage.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 { Content, Header, Page, Progress } from '@backstage/core-components';\n\nimport { DeleteDialogContextProvider } from '@janus-idp/shared-react';\n\nimport { RolesList } from './RolesList/RolesList';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { rbacApiRef } from '../api/RBACBackendClient';\nimport { useAsync } from 'react-use';\nimport { ErrorPage } from '@backstage/core-components';\n\nexport const RbacPage = ({ useHeader = true }: { useHeader?: boolean }) => {\n const rbacApi = useApi(rbacApiRef);\n const { loading: isUserLoading, value: result } = useAsync(\n async () => await rbacApi.getUserAuthorization(),\n [],\n );\n\n if (!isUserLoading) {\n return result?.status === 'Authorized' ? (\n <Page themeId=\"tool\">\n {useHeader && <Header title=\"RBAC\" />}\n <Content>\n <DeleteDialogContextProvider>\n <RolesList />\n </DeleteDialogContextProvider>\n </Content>\n </Page>\n ) : (\n <ErrorPage statusMessage=\"Not Found\" />\n );\n }\n return <Progress />;\n};\n"],"names":["React"],"mappings":";;;;;;;;AA2BO,MAAM,QAAW,GAAA,CAAC,EAAE,SAAA,GAAY,MAAoC,KAAA;AACzE,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA;AACjC,EAAA,MAAM,EAAE,OAAA,EAAS,aAAe,EAAA,KAAA,EAAO,QAAW,GAAA,QAAA;AAAA,IAChD,YAAY,MAAM,OAAA,CAAQ,oBAAqB,EAAA;AAAA,IAC/C;AAAC,GACH;AAEA,EAAA,IAAI,CAAC,aAAe,EAAA;AAClB,IAAO,OAAA,MAAA,EAAQ,MAAW,KAAA,YAAA,mBACvBA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,OAAQ,EAAA,MAAA,EAAA,EACX,SAAa,oBAAAA,cAAA,CAAA,aAAA,CAAC,MAAO,EAAA,EAAA,KAAA,EAAM,MAAO,EAAA,CAAA,+CAClC,OACC,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,2BACC,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,SAAU,EAAA,IAAA,CACb,CACF,CACF,CAEA,mBAAAA,cAAA,CAAA,aAAA,CAAC,SAAU,EAAA,EAAA,aAAA,EAAc,WAAY,EAAA,CAAA;AAAA;AAGzC,EAAA,oDAAQ,QAAS,EAAA,IAAA,CAAA;AACnB;;;;"}
1
+ {"version":3,"file":"RbacPage.esm.js","sources":["../../src/components/RbacPage.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 { Content, Header, Page, Progress } from '@backstage/core-components';\n\nimport { DeleteDialogContextProvider } from '@janus-idp/shared-react';\n\nimport { RolesList } from './RolesList/RolesList';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { rbacApiRef } from '../api/RBACBackendClient';\nimport { useAsync } from 'react-use';\nimport { ErrorPage } from '@backstage/core-components';\n\nexport const RbacPage = ({ useHeader = true }: { useHeader?: boolean }) => {\n const rbacApi = useApi(rbacApiRef);\n const { loading: isUserLoading, value: result } = useAsync(\n async () => await rbacApi.getUserAuthorization(),\n [],\n );\n\n if (!isUserLoading) {\n return result?.status === 'Authorized' ? (\n <Page themeId=\"tool\">\n {useHeader && <Header title=\"RBAC\" />}\n <Content>\n <DeleteDialogContextProvider>\n <RolesList />\n </DeleteDialogContextProvider>\n </Content>\n </Page>\n ) : (\n <ErrorPage statusMessage=\"Not Found\" />\n );\n }\n return <Progress />;\n};\n"],"names":[],"mappings":";;;;;;;;AAyBO,MAAM,QAAW,GAAA,CAAC,EAAE,SAAA,GAAY,MAAoC,KAAA;AACzE,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA;AACjC,EAAA,MAAM,EAAE,OAAA,EAAS,aAAe,EAAA,KAAA,EAAO,QAAW,GAAA,QAAA;AAAA,IAChD,YAAY,MAAM,OAAA,CAAQ,oBAAqB,EAAA;AAAA,IAC/C;AAAC,GACH;AAEA,EAAA,IAAI,CAAC,aAAe,EAAA;AAClB,IAAA,OAAO,QAAQ,MAAW,KAAA,YAAA,mBACvB,IAAA,CAAA,IAAA,EAAA,EAAK,SAAQ,MACX,EAAA,QAAA,EAAA;AAAA,MAAa,SAAA,oBAAA,GAAA,CAAC,MAAO,EAAA,EAAA,KAAA,EAAM,MAAO,EAAA,CAAA;AAAA,0BAClC,OACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,+BACC,QAAC,kBAAA,GAAA,CAAA,SAAA,EAAA,EAAU,GACb,CACF,EAAA;AAAA,KAAA,EACF,CAEA,mBAAA,GAAA,CAAC,SAAU,EAAA,EAAA,aAAA,EAAc,WAAY,EAAA,CAAA;AAAA;AAGzC,EAAA,2BAAQ,QAAS,EAAA,EAAA,CAAA;AACnB;;;;"}