@backstage-community/plugin-rbac 1.43.0 → 1.45.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 (115) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/alpha.d.ts +179 -0
  3. package/dist/alpha.esm.js +3 -0
  4. package/dist/alpha.esm.js.map +1 -0
  5. package/dist/components/ConditionalAccess/AddNestedConditionButton.esm.js +13 -9
  6. package/dist/components/ConditionalAccess/AddNestedConditionButton.esm.js.map +1 -1
  7. package/dist/components/ConditionalAccess/ComplexConditionRow.esm.js +3 -1
  8. package/dist/components/ConditionalAccess/ComplexConditionRow.esm.js.map +1 -1
  9. package/dist/components/ConditionalAccess/ComplexConditionRowButtons.esm.js +5 -3
  10. package/dist/components/ConditionalAccess/ComplexConditionRowButtons.esm.js.map +1 -1
  11. package/dist/components/ConditionalAccess/ConditionalAccessSidebar.esm.js +5 -3
  12. package/dist/components/ConditionalAccess/ConditionalAccessSidebar.esm.js.map +1 -1
  13. package/dist/components/ConditionalAccess/ConditionsFormRow.esm.js +7 -5
  14. package/dist/components/ConditionalAccess/ConditionsFormRow.esm.js.map +1 -1
  15. package/dist/components/ConditionalAccess/ConditionsFormRowFields.esm.js +4 -2
  16. package/dist/components/ConditionalAccess/ConditionsFormRowFields.esm.js.map +1 -1
  17. package/dist/components/ConditionalAccess/const.esm.js +6 -12
  18. package/dist/components/ConditionalAccess/const.esm.js.map +1 -1
  19. package/dist/components/CreateRole/AddMembersForm.esm.js +25 -19
  20. package/dist/components/CreateRole/AddMembersForm.esm.js.map +1 -1
  21. package/dist/components/CreateRole/AddedMembersTable.esm.js +10 -4
  22. package/dist/components/CreateRole/AddedMembersTable.esm.js.map +1 -1
  23. package/dist/components/CreateRole/AddedMembersTableColumn.esm.js +30 -28
  24. package/dist/components/CreateRole/AddedMembersTableColumn.esm.js.map +1 -1
  25. package/dist/components/CreateRole/CancelDialog.esm.js +8 -9
  26. package/dist/components/CreateRole/CancelDialog.esm.js.map +1 -1
  27. package/dist/components/CreateRole/CreateRolePage.esm.js +8 -6
  28. package/dist/components/CreateRole/CreateRolePage.esm.js.map +1 -1
  29. package/dist/components/CreateRole/EditRolePage.esm.js +9 -7
  30. package/dist/components/CreateRole/EditRolePage.esm.js.map +1 -1
  31. package/dist/components/CreateRole/PermissionPoliciesForm.esm.js +9 -3
  32. package/dist/components/CreateRole/PermissionPoliciesForm.esm.js.map +1 -1
  33. package/dist/components/CreateRole/PermissionPoliciesFormNestedRow.esm.js +6 -2
  34. package/dist/components/CreateRole/PermissionPoliciesFormNestedRow.esm.js.map +1 -1
  35. package/dist/components/CreateRole/PermissionPoliciesFormRow.esm.js +8 -4
  36. package/dist/components/CreateRole/PermissionPoliciesFormRow.esm.js.map +1 -1
  37. package/dist/components/CreateRole/PermissionPoliciesFormTable.esm.js +11 -6
  38. package/dist/components/CreateRole/PermissionPoliciesFormTable.esm.js.map +1 -1
  39. package/dist/components/CreateRole/PluginsDropdown.esm.js +4 -2
  40. package/dist/components/CreateRole/PluginsDropdown.esm.js.map +1 -1
  41. package/dist/components/CreateRole/ReviewStep.esm.js +9 -7
  42. package/dist/components/CreateRole/ReviewStep.esm.js.map +1 -1
  43. package/dist/components/CreateRole/RoleDetailsForm.esm.js +8 -6
  44. package/dist/components/CreateRole/RoleDetailsForm.esm.js.map +1 -1
  45. package/dist/components/CreateRole/RoleForm.esm.js +27 -23
  46. package/dist/components/CreateRole/RoleForm.esm.js.map +1 -1
  47. package/dist/components/CreateRole/SelectedPermissionPoliciesColumn.esm.js +24 -22
  48. package/dist/components/CreateRole/SelectedPermissionPoliciesColumn.esm.js.map +1 -1
  49. package/dist/components/DownloadUserStatistics.esm.js +4 -2
  50. package/dist/components/DownloadUserStatistics.esm.js.map +1 -1
  51. package/dist/components/EditRole.esm.js +4 -2
  52. package/dist/components/EditRole.esm.js.map +1 -1
  53. package/dist/components/RbacPage.esm.js +4 -2
  54. package/dist/components/RbacPage.esm.js.map +1 -1
  55. package/dist/components/RoleOverview/AboutCard.esm.js +12 -8
  56. package/dist/components/RoleOverview/AboutCard.esm.js.map +1 -1
  57. package/dist/components/RoleOverview/MembersCard.esm.js +18 -9
  58. package/dist/components/RoleOverview/MembersCard.esm.js.map +1 -1
  59. package/dist/components/RoleOverview/MembersListColumns.esm.js +42 -40
  60. package/dist/components/RoleOverview/MembersListColumns.esm.js.map +1 -1
  61. package/dist/components/RoleOverview/PermissionsCard.esm.js +27 -10
  62. package/dist/components/RoleOverview/PermissionsCard.esm.js.map +1 -1
  63. package/dist/components/RoleOverview/PermissionsListColumns.esm.js +38 -36
  64. package/dist/components/RoleOverview/PermissionsListColumns.esm.js.map +1 -1
  65. package/dist/components/RoleOverview/RoleOverviewPage.esm.js +3 -1
  66. package/dist/components/RoleOverview/RoleOverviewPage.esm.js.map +1 -1
  67. package/dist/components/RolesList/DeleteRole.esm.js +4 -2
  68. package/dist/components/RolesList/DeleteRole.esm.js.map +1 -1
  69. package/dist/components/RolesList/DeleteRoleDialog.esm.js +23 -38
  70. package/dist/components/RolesList/DeleteRoleDialog.esm.js.map +1 -1
  71. package/dist/components/RolesList/RolesList.esm.js +19 -9
  72. package/dist/components/RolesList/RolesList.esm.js.map +1 -1
  73. package/dist/components/RolesList/RolesListColumns.esm.js +63 -61
  74. package/dist/components/RolesList/RolesListColumns.esm.js.map +1 -1
  75. package/dist/components/RolesList/RolesListToolbar.esm.js +20 -10
  76. package/dist/components/RolesList/RolesListToolbar.esm.js.map +1 -1
  77. package/dist/components/Router.esm.js +4 -2
  78. package/dist/components/Router.esm.js.map +1 -1
  79. package/dist/components/Trans.esm.js +22 -0
  80. package/dist/components/Trans.esm.js.map +1 -0
  81. package/dist/hooks/useActionPermissionTooltip.esm.js +10 -5
  82. package/dist/hooks/useActionPermissionTooltip.esm.js.map +1 -1
  83. package/dist/hooks/useLanguage.esm.js +7 -0
  84. package/dist/hooks/useLanguage.esm.js.map +1 -0
  85. package/dist/hooks/useMembers.esm.js +16 -8
  86. package/dist/hooks/useMembers.esm.js.map +1 -1
  87. package/dist/hooks/usePermissionPolicies.esm.js +20 -9
  88. package/dist/hooks/usePermissionPolicies.esm.js.map +1 -1
  89. package/dist/hooks/useTranslation.esm.js +8 -0
  90. package/dist/hooks/useTranslation.esm.js.map +1 -0
  91. package/dist/translations/de.esm.js +176 -0
  92. package/dist/translations/de.esm.js.map +1 -0
  93. package/dist/translations/es.esm.js +176 -0
  94. package/dist/translations/es.esm.js.map +1 -0
  95. package/dist/translations/fr.esm.js +176 -0
  96. package/dist/translations/fr.esm.js.map +1 -0
  97. package/dist/translations/index.esm.js +15 -0
  98. package/dist/translations/index.esm.js.map +1 -0
  99. package/dist/translations/it.esm.js +176 -0
  100. package/dist/translations/it.esm.js.map +1 -0
  101. package/dist/translations/ref.esm.js +215 -0
  102. package/dist/translations/ref.esm.js.map +1 -0
  103. package/dist/utils/conditional-access-utils.esm.js +4 -4
  104. package/dist/utils/conditional-access-utils.esm.js.map +1 -1
  105. package/dist/utils/create-role-utils.esm.js +11 -11
  106. package/dist/utils/create-role-utils.esm.js.map +1 -1
  107. package/dist/utils/filter-table-data.esm.js +4 -3
  108. package/dist/utils/filter-table-data.esm.js.map +1 -1
  109. package/dist/utils/rbac-utils.esm.js +23 -19
  110. package/dist/utils/rbac-utils.esm.js.map +1 -1
  111. package/dist/utils/role-form-utils.esm.js +17 -12
  112. package/dist/utils/role-form-utils.esm.js.map +1 -1
  113. package/dist/utils/string-utils.esm.js +2 -2
  114. package/dist/utils/string-utils.esm.js.map +1 -1
  115. package/package.json +34 -20
@@ -13,10 +13,13 @@ import DialogTitle from '@mui/material/DialogTitle';
13
13
  import IconButton from '@mui/material/IconButton';
14
14
  import TextField from '@mui/material/TextField';
15
15
  import Typography from '@mui/material/Typography';
16
+ import { MarkdownContent } from '@backstage/core-components';
16
17
  import { rbacApiRef } from '../../api/RBACBackendClient.esm.js';
17
18
  import { getMembers } from '../../utils/rbac-utils.esm.js';
18
19
  import { removePermissions, removeConditions } from '../../utils/role-form-utils.esm.js';
19
20
  import { useToast } from '../ToastContext.esm.js';
21
+ import { useTranslation } from '../../hooks/useTranslation.esm.js';
22
+ import { useLanguage } from '../../hooks/useLanguage.esm.js';
20
23
 
21
24
  const DeleteRoleDialog = ({
22
25
  open,
@@ -25,6 +28,8 @@ const DeleteRoleDialog = ({
25
28
  propOptions
26
29
  }) => {
27
30
  const { setToastMessage } = useToast();
31
+ const { t } = useTranslation();
32
+ const locale = useLanguage();
28
33
  const [deleteRoleValue, setDeleteRoleValue] = useState();
29
34
  const [disableDelete, setDisableDelete] = useState(false);
30
35
  const [error, setError] = useState("");
@@ -38,18 +43,18 @@ const DeleteRoleDialog = ({
38
43
  const allowedPolicies = policies.filter(
39
44
  (policy) => policy.effect !== "deny"
40
45
  );
41
- await removePermissions(roleName, allowedPolicies, rbacApi);
46
+ await removePermissions(roleName, allowedPolicies, rbacApi, t);
42
47
  }
43
48
  if (Array.isArray(conditionalPolicies)) {
44
49
  const conditionalPoliciesIds = conditionalPolicies.map((cp) => cp.id);
45
- await removeConditions(conditionalPoliciesIds, rbacApi);
50
+ await removeConditions(conditionalPoliciesIds, rbacApi, t);
46
51
  }
47
52
  const response = await rbacApi.deleteRole(roleName);
48
53
  if (response.status === 200 || response.status === 204) {
49
- setToastMessage(`Role ${roleName} deleted successfully`);
54
+ setToastMessage(t("deleteDialog.successMessage", { roleName }));
50
55
  closeDialog();
51
56
  } else {
52
- setError(`Unable to delete the role. ${response.statusText}`);
57
+ setError(`${t("errors.deleteRole")} ${response.statusText}`);
53
58
  }
54
59
  } catch (err) {
55
60
  setError(err instanceof Error ? err.message : `${err}`);
@@ -65,12 +70,19 @@ const DeleteRoleDialog = ({
65
70
  setDisableDelete(true);
66
71
  }
67
72
  };
73
+ const content = t("deleteDialog.confirmation", {
74
+ roleName,
75
+ members: getMembers(propOptions.memberRefs, t).toLocaleLowerCase(
76
+ locale ?? "en"
77
+ ),
78
+ permissions: propOptions.permissions.toString()
79
+ });
68
80
  return /* @__PURE__ */ jsxs(Dialog, { maxWidth: "md", open, onClose: closeDialog, children: [
69
81
  /* @__PURE__ */ jsx(
70
82
  DialogTitle,
71
83
  {
72
84
  id: "delete-role",
73
- title: "Delete Role",
85
+ title: t("deleteDialog.title"),
74
86
  sx: {
75
87
  marginBottom: "0 !important",
76
88
  backgroundColor: dialogBackgroundColor
@@ -100,7 +112,7 @@ const DeleteRoleDialog = ({
100
112
  }
101
113
  ),
102
114
  " ",
103
- "Delete this role?"
115
+ t("deleteDialog.question")
104
116
  ] }),
105
117
  /* @__PURE__ */ jsx(
106
118
  IconButton,
@@ -122,34 +134,7 @@ const DeleteRoleDialog = ({
122
134
  }
123
135
  ),
124
136
  /* @__PURE__ */ jsxs(DialogContent, { sx: { backgroundColor: dialogBackgroundColor }, children: [
125
- "Are you sure you want to delete the role",
126
- " ",
127
- /* @__PURE__ */ jsx(Typography, { component: "span", sx: { fontWeight: "bold" }, children: roleName }),
128
- " ",
129
- "?",
130
- /* @__PURE__ */ jsx("br", {}),
131
- /* @__PURE__ */ jsx("br", {}),
132
- "Deleting this role is irreversible and will remove its functionality from the system. Proceed with caution.",
133
- /* @__PURE__ */ jsx("br", {}),
134
- /* @__PURE__ */ jsx("br", {}),
135
- "The",
136
- " ",
137
- /* @__PURE__ */ jsx(Typography, { component: "span", sx: { fontWeight: "bold" }, children: `${getMembers(
138
- propOptions.memberRefs
139
- ).toLocaleLowerCase("en-US")}` }),
140
- " ",
141
- "associated with this role will lose access to all the",
142
- " ",
143
- /* @__PURE__ */ jsx(
144
- Typography,
145
- {
146
- component: "span",
147
- sx: { fontWeight: "bold" },
148
- children: `${propOptions.permissions} permission policies`
149
- }
150
- ),
151
- " ",
152
- "specified in this role.",
137
+ /* @__PURE__ */ jsx(MarkdownContent, { content }),
153
138
  /* @__PURE__ */ jsx("br", {}),
154
139
  /* @__PURE__ */ jsx(
155
140
  TextField,
@@ -162,9 +147,9 @@ const DeleteRoleDialog = ({
162
147
  },
163
148
  required: true,
164
149
  variant: "outlined",
165
- label: "Role name",
150
+ label: t("deleteDialog.roleNameLabel"),
166
151
  defaultValue: deleteRoleValue,
167
- helperText: "Type the name of the role to confirm",
152
+ helperText: t("deleteDialog.roleNameHelper"),
168
153
  onChange: ({ target: { value } }) => onTextInput(value),
169
154
  onBlur: ({ target: { value } }) => onTextInput(value)
170
155
  }
@@ -189,10 +174,10 @@ const DeleteRoleDialog = ({
189
174
  style: disableDelete || !deleteRoleValue ? {} : { background: "red", color: "white" },
190
175
  onClick: deleteRole,
191
176
  disabled: disableDelete || !deleteRoleValue,
192
- children: "Delete"
177
+ children: t("deleteDialog.deleteButton")
193
178
  }
194
179
  ),
195
- /* @__PURE__ */ jsx(Button, { variant: "outlined", onClick: closeDialog, children: "Cancel" })
180
+ /* @__PURE__ */ jsx(Button, { variant: "outlined", onClick: closeDialog, children: t("deleteDialog.cancelButton") })
196
181
  ]
197
182
  }
198
183
  )
@@ -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 { useState } 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] = useState<string>();\n const [disableDelete, setDisableDelete] = useState(false);\n const [error, setError] = 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
+ {"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 { useState } 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';\nimport { MarkdownContent } from '@backstage/core-components';\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';\nimport { useTranslation } from '../../hooks/useTranslation';\nimport { useLanguage } from '../../hooks/useLanguage';\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 { t } = useTranslation();\n const locale = useLanguage();\n const [deleteRoleValue, setDeleteRoleValue] = useState<string>();\n const [disableDelete, setDisableDelete] = useState(false);\n const [error, setError] = 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, t);\n }\n\n if (Array.isArray(conditionalPolicies)) {\n const conditionalPoliciesIds = conditionalPolicies.map(cp => cp.id);\n await removeConditions(conditionalPoliciesIds, rbacApi, t);\n }\n\n const response = await rbacApi.deleteRole(roleName);\n if (response.status === 200 || response.status === 204) {\n setToastMessage(t('deleteDialog.successMessage' as any, { roleName }));\n closeDialog();\n } else {\n setError(`${t('errors.deleteRole')} ${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 const content = t('deleteDialog.confirmation' as any, {\n roleName,\n members: getMembers(propOptions.memberRefs, t).toLocaleLowerCase(\n locale ?? 'en',\n ),\n permissions: propOptions.permissions.toString(),\n });\n\n return (\n <Dialog maxWidth=\"md\" open={open} onClose={closeDialog}>\n <DialogTitle\n id=\"delete-role\"\n title={t('deleteDialog.title')}\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 {t('deleteDialog.question')}\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 <MarkdownContent content={content} />\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={t('deleteDialog.roleNameLabel')}\n defaultValue={deleteRoleValue}\n helperText={t('deleteDialog.roleNameHelper')}\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 {t('deleteDialog.deleteButton')}\n </Button>\n <Button variant=\"outlined\" onClick={closeDialog}>\n {t('deleteDialog.cancelButton')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\nexport default DeleteRoleDialog;\n"],"names":[],"mappings":"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"}
@@ -10,13 +10,17 @@ import DownloadCSVLink from '../DownloadUserStatistics.esm.js';
10
10
  import { SnackbarAlert } from '../SnackbarAlert.esm.js';
11
11
  import { useToast } from '../ToastContext.esm.js';
12
12
  import DeleteRoleDialog from './DeleteRoleDialog.esm.js';
13
- import { columns } from './RolesListColumns.esm.js';
13
+ import { getColumns } from './RolesListColumns.esm.js';
14
14
  import { RolesListToolbar } from './RolesListToolbar.esm.js';
15
15
  import { useDeleteDialog } from '../DeleteDialogContext.esm.js';
16
+ import { useTranslation } from '../../hooks/useTranslation.esm.js';
17
+ import { useLanguage } from '../../hooks/useLanguage.esm.js';
16
18
 
17
19
  const RolesList = () => {
18
20
  const { toastMessage, setToastMessage } = useToast();
19
21
  const { openDialog, setOpenDialog, deleteComponent } = useDeleteDialog();
22
+ const { t } = useTranslation();
23
+ const locale = useLanguage();
20
24
  useLocationToast(setToastMessage);
21
25
  const [searchText, setSearchText] = useState();
22
26
  const [page, setPage] = useState(0);
@@ -30,21 +34,21 @@ const RolesList = () => {
30
34
  const onAlertClose = () => {
31
35
  setToastMessage("");
32
36
  };
37
+ const columns = getColumns(t, locale);
33
38
  const filteredRoles = useMemo(
34
- () => filterTableData({ data, columns, searchText }),
35
- [data, searchText]
39
+ () => filterTableData({ data, columns, searchText, locale }),
40
+ [data, searchText, columns, locale]
36
41
  );
37
42
  const getErrorWarning = () => {
38
- const errorTitleBase = "Something went wrong while fetching the";
39
43
  const errorWarningArr = [
40
- { message: error?.rolesError, title: `${errorTitleBase} roles` },
44
+ { message: error?.rolesError, title: t("errors.fetchRoles") },
41
45
  {
42
46
  message: error?.policiesError,
43
- title: `${errorTitleBase} permission policies`
47
+ title: t("errors.fetchPolicies")
44
48
  },
45
49
  {
46
50
  message: error?.roleConditionError,
47
- title: `${errorTitleBase} role conditions`
51
+ title: t("errors.fetchConditions")
48
52
  }
49
53
  ];
50
54
  return errorWarningArr.find(({ message }) => message) || {
@@ -77,7 +81,9 @@ const RolesList = () => {
77
81
  /* @__PURE__ */ jsx(
78
82
  Table,
79
83
  {
80
- title: !loading && data?.length ? `All roles (${filteredRoles.length})` : `All roles`,
84
+ title: !loading && data?.length ? t("table.titleWithCount", {
85
+ count: filteredRoles.length.toString()
86
+ }) : t("table.title"),
81
87
  options: { padding: "default", search: true, paging: true },
82
88
  data,
83
89
  isLoading: loading,
@@ -87,7 +93,7 @@ const RolesList = () => {
87
93
  {
88
94
  "data-testid": "roles-table-empty",
89
95
  sx: { display: "flex", justifyContent: "center", p: 2 },
90
- children: "No records found"
96
+ children: t("table.emptyContent")
91
97
  }
92
98
  ),
93
99
  onSearchChange: setSearchText,
@@ -95,6 +101,10 @@ const RolesList = () => {
95
101
  onRowsPerPageChange: (newPageSize) => {
96
102
  setPageSize(newPageSize);
97
103
  setPage(0);
104
+ },
105
+ localization: {
106
+ toolbar: { searchPlaceholder: t("table.searchPlaceholder") },
107
+ pagination: { labelRowsSelect: t("table.labelRowsSelect") }
98
108
  }
99
109
  }
100
110
  ),
@@ -1 +1 @@
1
- {"version":3,"file":"RolesList.esm.js","sources":["../../../src/components/RolesList/RolesList.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, useMemo } from 'react';\n\nimport { Progress, Table, WarningPanel } from '@backstage/core-components';\n\nimport Box from '@mui/material/Box';\n\nimport { useCheckIfLicensePluginEnabled } from '../../hooks/useCheckIfLicensePluginEnabled';\nimport { useLocationToast } from '../../hooks/useLocationToast';\nimport { useRoles } from '../../hooks/useRoles';\nimport { filterTableData } from '../../utils/filter-table-data';\nimport DownloadCSVLink from '../DownloadUserStatistics';\nimport { SnackbarAlert } from '../SnackbarAlert';\nimport { useToast } from '../ToastContext';\nimport DeleteRoleDialog from './DeleteRoleDialog';\nimport { columns } from './RolesListColumns';\nimport { RolesListToolbar } from './RolesListToolbar';\nimport { useDeleteDialog } from '../DeleteDialogContext';\n\nexport const RolesList = () => {\n const { toastMessage, setToastMessage } = useToast();\n const { openDialog, setOpenDialog, deleteComponent } = useDeleteDialog();\n useLocationToast(setToastMessage);\n const [searchText, setSearchText] = useState<string>();\n const [page, setPage] = useState(0);\n const [pageSize, setPageSize] = useState(5);\n const { loading, data, retry, createRoleAllowed, createRoleLoading, error } =\n useRoles(page, pageSize);\n\n const closeDialog = () => {\n setOpenDialog(false);\n retry.roleRetry();\n retry.policiesRetry();\n };\n\n const onAlertClose = () => {\n setToastMessage('');\n };\n const filteredRoles = useMemo(\n () => filterTableData({ data, columns, searchText }),\n [data, searchText],\n );\n\n const getErrorWarning = () => {\n const errorTitleBase = 'Something went wrong while fetching the';\n const errorWarningArr = [\n { message: error?.rolesError, title: `${errorTitleBase} roles` },\n {\n message: error?.policiesError,\n title: `${errorTitleBase} permission policies`,\n },\n {\n message: error?.roleConditionError,\n title: `${errorTitleBase} role conditions`,\n },\n ];\n\n return (\n errorWarningArr.find(({ message }) => message) || {\n message: '',\n title: '',\n }\n );\n };\n\n const errorWarning = getErrorWarning();\n\n const isLicensePluginEnabled = useCheckIfLicensePluginEnabled();\n if (isLicensePluginEnabled.loading) {\n return <Progress />;\n }\n\n return (\n <>\n <SnackbarAlert toastMessage={toastMessage} onAlertClose={onAlertClose} />\n <RolesListToolbar\n createRoleAllowed={createRoleAllowed}\n createRoleLoading={createRoleLoading}\n />\n {errorWarning.message && (\n <div style={{ paddingBottom: '16px' }}>\n <WarningPanel\n message={errorWarning.message}\n title={errorWarning.title}\n severity=\"error\"\n />\n </div>\n )}\n <Table\n title={\n !loading && data?.length\n ? `All roles (${filteredRoles.length})`\n : `All roles`\n }\n options={{ padding: 'default', search: true, paging: true }}\n data={data}\n isLoading={loading}\n columns={columns}\n emptyContent={\n <Box\n data-testid=\"roles-table-empty\"\n sx={{ display: 'flex', justifyContent: 'center', p: 2 }}\n >\n No records found\n </Box>\n }\n onSearchChange={setSearchText}\n onPageChange={setPage}\n onRowsPerPageChange={newPageSize => {\n setPageSize(newPageSize);\n setPage(0);\n }}\n />\n {isLicensePluginEnabled.isEnabled && <DownloadCSVLink />}\n {openDialog && (\n <DeleteRoleDialog\n open={openDialog}\n closeDialog={closeDialog}\n roleName={deleteComponent.roleName}\n propOptions={{\n memberRefs:\n data.find(d => d.name === deleteComponent.roleName)?.members ||\n [],\n permissions:\n data.find(d => d.name === deleteComponent.roleName)\n ?.permissions || 0,\n }}\n />\n )}\n </>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RolesList.esm.js","sources":["../../../src/components/RolesList/RolesList.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, useMemo } from 'react';\n\nimport { Progress, Table, WarningPanel } from '@backstage/core-components';\n\nimport Box from '@mui/material/Box';\n\nimport { useCheckIfLicensePluginEnabled } from '../../hooks/useCheckIfLicensePluginEnabled';\nimport { useLocationToast } from '../../hooks/useLocationToast';\nimport { useRoles } from '../../hooks/useRoles';\nimport { filterTableData } from '../../utils/filter-table-data';\nimport DownloadCSVLink from '../DownloadUserStatistics';\nimport { SnackbarAlert } from '../SnackbarAlert';\nimport { useToast } from '../ToastContext';\nimport DeleteRoleDialog from './DeleteRoleDialog';\nimport { getColumns } from './RolesListColumns';\nimport { RolesListToolbar } from './RolesListToolbar';\nimport { useDeleteDialog } from '../DeleteDialogContext';\nimport { useTranslation } from '../../hooks/useTranslation';\nimport { useLanguage } from '../../hooks/useLanguage';\n\nexport const RolesList = () => {\n const { toastMessage, setToastMessage } = useToast();\n const { openDialog, setOpenDialog, deleteComponent } = useDeleteDialog();\n const { t } = useTranslation();\n const locale = useLanguage();\n\n useLocationToast(setToastMessage);\n const [searchText, setSearchText] = useState<string>();\n const [page, setPage] = useState(0);\n const [pageSize, setPageSize] = useState(5);\n const { loading, data, retry, createRoleAllowed, createRoleLoading, error } =\n useRoles(page, pageSize);\n\n const closeDialog = () => {\n setOpenDialog(false);\n retry.roleRetry();\n retry.policiesRetry();\n };\n\n const onAlertClose = () => {\n setToastMessage('');\n };\n const columns = getColumns(t, locale);\n const filteredRoles = useMemo(\n () => filterTableData({ data, columns, searchText, locale }),\n [data, searchText, columns, locale],\n );\n\n const getErrorWarning = () => {\n const errorWarningArr = [\n { message: error?.rolesError, title: t('errors.fetchRoles') },\n {\n message: error?.policiesError,\n title: t('errors.fetchPolicies'),\n },\n {\n message: error?.roleConditionError,\n title: t('errors.fetchConditions'),\n },\n ];\n\n return (\n errorWarningArr.find(({ message }) => message) || {\n message: '',\n title: '',\n }\n );\n };\n\n const errorWarning = getErrorWarning();\n\n const isLicensePluginEnabled = useCheckIfLicensePluginEnabled();\n if (isLicensePluginEnabled.loading) {\n return <Progress />;\n }\n\n return (\n <>\n <SnackbarAlert toastMessage={toastMessage} onAlertClose={onAlertClose} />\n <RolesListToolbar\n createRoleAllowed={createRoleAllowed}\n createRoleLoading={createRoleLoading}\n />\n {errorWarning.message && (\n <div style={{ paddingBottom: '16px' }}>\n <WarningPanel\n message={errorWarning.message}\n title={errorWarning.title}\n severity=\"error\"\n />\n </div>\n )}\n <Table\n title={\n !loading && data?.length\n ? t('table.titleWithCount' as any, {\n count: filteredRoles.length.toString(),\n })\n : t('table.title')\n }\n options={{ padding: 'default', search: true, paging: true }}\n data={data}\n isLoading={loading}\n columns={columns}\n emptyContent={\n <Box\n data-testid=\"roles-table-empty\"\n sx={{ display: 'flex', justifyContent: 'center', p: 2 }}\n >\n {t('table.emptyContent')}\n </Box>\n }\n onSearchChange={setSearchText}\n onPageChange={setPage}\n onRowsPerPageChange={newPageSize => {\n setPageSize(newPageSize);\n setPage(0);\n }}\n localization={{\n toolbar: { searchPlaceholder: t('table.searchPlaceholder') },\n pagination: { labelRowsSelect: t('table.labelRowsSelect') },\n }}\n />\n {isLicensePluginEnabled.isEnabled && <DownloadCSVLink />}\n {openDialog && (\n <DeleteRoleDialog\n open={openDialog}\n closeDialog={closeDialog}\n roleName={deleteComponent.roleName}\n propOptions={{\n memberRefs:\n data.find(d => d.name === deleteComponent.roleName)?.members ||\n [],\n permissions:\n data.find(d => d.name === deleteComponent.roleName)\n ?.permissions || 0,\n }}\n />\n )}\n </>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -7,70 +7,72 @@ import { getMembers } from '../../utils/rbac-utils.esm.js';
7
7
  import EditRole from '../EditRole.esm.js';
8
8
  import DeleteRole from './DeleteRole.esm.js';
9
9
 
10
- const columns = [
11
- {
12
- title: "Name",
13
- field: "name",
14
- type: "string",
15
- render: (props) => {
16
- const { kind, namespace, name } = parseEntityRef(props.name);
17
- return /* @__PURE__ */ jsx(Link, { to: `roles/${kind}/${namespace}/${name}`, children: props.name });
18
- }
19
- },
20
- {
21
- title: "Users and groups",
22
- field: "members",
23
- type: "string",
24
- align: "left",
25
- render: (props) => getMembers(props.members),
26
- customSort: (a, b) => {
27
- if (a.members.length === 0) {
28
- return -1;
10
+ const getColumns = (t, locale) => {
11
+ return [
12
+ {
13
+ title: t("table.headers.name"),
14
+ field: "name",
15
+ type: "string",
16
+ render: (props) => {
17
+ const { kind, namespace, name } = parseEntityRef(props.name);
18
+ return /* @__PURE__ */ jsx(Link, { to: `roles/${kind}/${namespace}/${name}`, children: props.name });
29
19
  }
30
- if (b.members.length === 0) {
31
- return 1;
20
+ },
21
+ {
22
+ title: t("table.headers.usersAndGroups"),
23
+ field: "members",
24
+ type: "string",
25
+ align: "left",
26
+ render: (props) => getMembers(props.members, t),
27
+ customSort: (a, b) => {
28
+ if (a.members.length === 0) {
29
+ return -1;
30
+ }
31
+ if (b.members.length === 0) {
32
+ return 1;
33
+ }
34
+ if (a.members.length === b.members.length) {
35
+ return 0;
36
+ }
37
+ return a.members.length < b.members.length ? -1 : 1;
32
38
  }
33
- if (a.members.length === b.members.length) {
34
- return 0;
39
+ },
40
+ {
41
+ title: t("table.headers.accessiblePlugins"),
42
+ field: "accessiblePlugins",
43
+ type: "string",
44
+ align: "left",
45
+ render: (props) => {
46
+ const pls = props.accessiblePlugins.map(
47
+ (p) => p[0].toLocaleUpperCase(locale) + p.slice(1)
48
+ );
49
+ const plsTooltip = pls.join(", ");
50
+ const plsOverflowCount = pls.length > 2 ? `+ ${pls.length - 2}` : "";
51
+ return pls.length > 0 ? /* @__PURE__ */ jsx(Tooltip, { title: plsTooltip || "", placement: "top-start", children: /* @__PURE__ */ jsx(Typography, { children: pls.length === 1 ? `${pls[0]}` : `${pls[0]}, ${pls[1]} ${plsOverflowCount}` }) }) : "-";
35
52
  }
36
- return a.members.length < b.members.length ? -1 : 1;
53
+ },
54
+ {
55
+ title: t("table.headers.actions"),
56
+ sorting: false,
57
+ render: (props) => /* @__PURE__ */ jsxs(Fragment, { children: [
58
+ /* @__PURE__ */ jsx(
59
+ EditRole,
60
+ {
61
+ canEdit: props.actionsPermissionResults.edit.allowed,
62
+ roleName: props.name
63
+ }
64
+ ),
65
+ /* @__PURE__ */ jsx(
66
+ DeleteRole,
67
+ {
68
+ canEdit: props.actionsPermissionResults.edit.allowed,
69
+ roleName: props.name
70
+ }
71
+ )
72
+ ] })
37
73
  }
38
- },
39
- {
40
- title: "Accessible plugins",
41
- field: "accessiblePlugins",
42
- type: "string",
43
- align: "left",
44
- render: (props) => {
45
- const pls = props.accessiblePlugins.map(
46
- (p) => p[0].toLocaleUpperCase("en-US") + p.slice(1)
47
- );
48
- const plsTooltip = pls.join(", ");
49
- const plsOverflowCount = pls.length > 2 ? `+ ${pls.length - 2}` : "";
50
- return pls.length > 0 ? /* @__PURE__ */ jsx(Tooltip, { title: plsTooltip || "", placement: "top-start", children: /* @__PURE__ */ jsx(Typography, { children: pls.length === 1 ? `${pls[0]}` : `${pls[0]}, ${pls[1]} ${plsOverflowCount}` }) }) : "-";
51
- }
52
- },
53
- {
54
- title: "Actions",
55
- sorting: false,
56
- render: (props) => /* @__PURE__ */ jsxs(Fragment, { children: [
57
- /* @__PURE__ */ jsx(
58
- EditRole,
59
- {
60
- canEdit: props.actionsPermissionResults.edit.allowed,
61
- roleName: props.name
62
- }
63
- ),
64
- /* @__PURE__ */ jsx(
65
- DeleteRole,
66
- {
67
- canEdit: props.actionsPermissionResults.edit.allowed,
68
- roleName: props.name
69
- }
70
- )
71
- ] })
72
- }
73
- ];
74
+ ];
75
+ };
74
76
 
75
- export { columns };
77
+ export { getColumns };
76
78
  //# sourceMappingURL=RolesListColumns.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RolesListColumns.esm.js","sources":["../../../src/components/RolesList/RolesListColumns.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, TableColumn } from '@backstage/core-components';\n\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\n\nimport { RolesData } from '../../types';\nimport { getMembers } from '../../utils/rbac-utils';\nimport EditRole from '../EditRole';\nimport DeleteRole from './DeleteRole';\n\nexport const columns: TableColumn<RolesData>[] = [\n {\n title: 'Name',\n field: 'name',\n type: 'string',\n render: (props: RolesData) => {\n const { kind, namespace, name } = parseEntityRef(props.name);\n return (\n <Link to={`roles/${kind}/${namespace}/${name}`}>{props.name}</Link>\n );\n },\n },\n {\n title: 'Users and groups',\n field: 'members',\n type: 'string',\n align: 'left',\n render: props => getMembers(props.members),\n customSort: (a, b) => {\n if (a.members.length === 0) {\n return -1;\n }\n if (b.members.length === 0) {\n return 1;\n }\n if (a.members.length === b.members.length) {\n return 0;\n }\n return a.members.length < b.members.length ? -1 : 1;\n },\n },\n {\n title: 'Accessible plugins',\n field: 'accessiblePlugins',\n type: 'string',\n align: 'left',\n render: (props: RolesData) => {\n const pls = props.accessiblePlugins.map(\n p => p[0].toLocaleUpperCase('en-US') + p.slice(1),\n );\n const plsTooltip = pls.join(', ');\n const plsOverflowCount = pls.length > 2 ? `+ ${pls.length - 2}` : '';\n\n return pls.length > 0 ? (\n <Tooltip title={plsTooltip || ''} placement=\"top-start\">\n <Typography>\n {pls.length === 1\n ? `${pls[0]}`\n : `${pls[0]}, ${pls[1]} ${plsOverflowCount}`}\n </Typography>\n </Tooltip>\n ) : (\n '-'\n );\n },\n },\n {\n title: 'Actions',\n sorting: false,\n render: (props: RolesData) => (\n <>\n <EditRole\n canEdit={props.actionsPermissionResults.edit.allowed}\n roleName={props.name}\n />\n <DeleteRole\n canEdit={props.actionsPermissionResults.edit.allowed}\n roleName={props.name}\n />\n </>\n ),\n },\n];\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RolesListColumns.esm.js","sources":["../../../src/components/RolesList/RolesListColumns.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, TableColumn } from '@backstage/core-components';\n\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\n\nimport { RolesData } from '../../types';\nimport { getMembers } from '../../utils/rbac-utils';\nimport EditRole from '../EditRole';\nimport DeleteRole from './DeleteRole';\nimport { TranslationFunction } from '@backstage/core-plugin-api/alpha';\nimport { rbacTranslationRef } from '../../translations';\n\nexport const getColumns = (\n t: TranslationFunction<typeof rbacTranslationRef.T>,\n locale: string,\n): TableColumn<RolesData>[] => {\n return [\n {\n title: t('table.headers.name'),\n field: 'name',\n type: 'string',\n render: (props: RolesData) => {\n const { kind, namespace, name } = parseEntityRef(props.name);\n return (\n <Link to={`roles/${kind}/${namespace}/${name}`}>{props.name}</Link>\n );\n },\n },\n {\n title: t('table.headers.usersAndGroups'),\n field: 'members',\n type: 'string',\n align: 'left',\n render: props => getMembers(props.members, t),\n customSort: (a, b) => {\n if (a.members.length === 0) {\n return -1;\n }\n if (b.members.length === 0) {\n return 1;\n }\n if (a.members.length === b.members.length) {\n return 0;\n }\n return a.members.length < b.members.length ? -1 : 1;\n },\n },\n {\n title: t('table.headers.accessiblePlugins'),\n field: 'accessiblePlugins',\n type: 'string',\n align: 'left',\n render: (props: RolesData) => {\n const pls = props.accessiblePlugins.map(\n p => p[0].toLocaleUpperCase(locale) + p.slice(1),\n );\n const plsTooltip = pls.join(', ');\n const plsOverflowCount = pls.length > 2 ? `+ ${pls.length - 2}` : '';\n\n return pls.length > 0 ? (\n <Tooltip title={plsTooltip || ''} placement=\"top-start\">\n <Typography>\n {pls.length === 1\n ? `${pls[0]}`\n : `${pls[0]}, ${pls[1]} ${plsOverflowCount}`}\n </Typography>\n </Tooltip>\n ) : (\n '-'\n );\n },\n },\n {\n title: t('table.headers.actions'),\n sorting: false,\n render: (props: RolesData) => (\n <>\n <EditRole\n canEdit={props.actionsPermissionResults.edit.allowed}\n roleName={props.name}\n />\n <DeleteRole\n canEdit={props.actionsPermissionResults.edit.allowed}\n roleName={props.name}\n />\n </>\n ),\n },\n ];\n};\n"],"names":[],"mappings":"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"}
@@ -3,11 +3,14 @@ import { Link, LinkButton } from '@backstage/core-components';
3
3
  import Alert from '@mui/material/Alert';
4
4
  import AlertTitle from '@mui/material/AlertTitle';
5
5
  import Typography from '@mui/material/Typography';
6
+ import { useTranslation } from '../../hooks/useTranslation.esm.js';
7
+ import { Trans } from '../Trans.esm.js';
6
8
 
7
9
  const RolesListToolbar = ({
8
10
  createRoleAllowed,
9
11
  createRoleLoading
10
12
  }) => {
13
+ const { t } = useTranslation();
11
14
  return /* @__PURE__ */ jsxs("div", { children: [
12
15
  !createRoleLoading && !createRoleAllowed && /* @__PURE__ */ jsxs(Alert, { severity: "warning", "data-testid": "create-role-warning", children: [
13
16
  /* @__PURE__ */ jsx(
@@ -16,22 +19,29 @@ const RolesListToolbar = ({
16
19
  sx: {
17
20
  fontWeight: "bold"
18
21
  },
19
- children: "Unable to create role."
22
+ children: t("toolbar.warning.title")
20
23
  }
21
24
  ),
22
- "To enable create/edit role button, make sure required users/groups are available in catalog as a role cannot be created without users/groups and also the role associated with your user should have the permission policies mentioned",
23
- " ",
24
25
  /* @__PURE__ */ jsx(
25
- Link,
26
+ Trans,
26
27
  {
27
- to: "https://github.com/backstage/community-plugins/tree/main/workspaces/rbac/plugins/rbac#prerequisites",
28
- target: "_blank",
29
- children: "here"
28
+ message: "toolbar.warning.message",
29
+ params: {
30
+ link: /* @__PURE__ */ jsx(
31
+ Link,
32
+ {
33
+ to: "https://github.com/backstage/community-plugins/tree/main/workspaces/rbac/plugins/rbac#prerequisites",
34
+ target: "_blank",
35
+ children: t("toolbar.warning.linkText")
36
+ }
37
+ )
38
+ }
30
39
  }
31
40
  ),
32
41
  /* @__PURE__ */ jsxs(Typography, { sx: { mt: 1 }, fontSize: "small", children: [
33
- /* @__PURE__ */ jsx(Typography, { component: "span", fontWeight: "bold", fontSize: "small", children: "Note" }),
34
- ": Even after ingesting users/groups in catalog and applying above permissions if the create/edit button is still disabled then please contact your administrator as you might be conditionally restricted from accessing the create/edit button."
42
+ /* @__PURE__ */ jsx(Typography, { component: "span", fontWeight: "bold", fontSize: "small", children: t("toolbar.warning.note") }),
43
+ ": ",
44
+ t("toolbar.warning.noteText")
35
45
  ] })
36
46
  ] }),
37
47
  /* @__PURE__ */ jsx("br", {}),
@@ -52,7 +62,7 @@ const RolesListToolbar = ({
52
62
  variant: "contained",
53
63
  disabled: !createRoleAllowed,
54
64
  "data-testid": "create-role",
55
- children: "Create"
65
+ children: t("toolbar.createButton")
56
66
  }
57
67
  )
58
68
  }
@@ -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 { 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":";;;;;;AAqBO,MAAM,mBAAmB,CAAC;AAAA,EAC/B,iBAAA;AAAA,EACA;AACF,CAGM,KAAA;AACJ,EAAA,4BACG,KACE,EAAA,EAAA,QAAA,EAAA;AAAA,IAAC,CAAA,iBAAA,IAAqB,CAAC,iBACtB,oBAAA,IAAA,CAAC,SAAM,QAAS,EAAA,SAAA,EAAU,eAAY,qBACpC,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,EAAI,EAAA;AAAA,YACF,UAAY,EAAA;AAAA,WACd;AAAA,UACD,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,MAAa,wOAAA;AAAA,MAIM,GAAA;AAAA,sBACnB,GAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,EAAG,EAAA,qGAAA;AAAA,UACH,MAAO,EAAA,QAAA;AAAA,UACR,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,sBACA,IAAA,CAAC,cAAW,EAAI,EAAA,EAAE,IAAI,CAAE,EAAA,EAAG,UAAS,OAClC,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,cAAW,SAAU,EAAA,MAAA,EAAO,YAAW,MAAO,EAAA,QAAA,EAAS,SAAQ,QAEhE,EAAA,MAAA,EAAA,CAAA;AAAA,QAAa;AAAA,OAKf,EAAA;AAAA,KACF,EAAA,CAAA;AAAA,wBAED,IAAG,EAAA,EAAA,CAAA;AAAA,oBACJ,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,SAAU,EAAA,MAAA;AAAA,QACV,EAAI,EAAA;AAAA,UACF,OAAS,EAAA,MAAA;AAAA,UACT,cAAgB,EAAA,KAAA;AAAA,UAChB,YAAc,EAAA;AAAA,SAChB;AAAA,QAEA,QAAA,kBAAA,GAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,EAAG,EAAA,UAAA;AAAA,YACH,KAAM,EAAA,SAAA;AAAA,YACN,OAAQ,EAAA,WAAA;AAAA,YACR,UAAU,CAAC,iBAAA;AAAA,YACX,aAAY,EAAA,aAAA;AAAA,YACb,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AACF,GACF,EAAA,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 { 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\nimport { useTranslation } from '../../hooks/useTranslation';\nimport { Trans } from '../Trans';\n\nexport const RolesListToolbar = ({\n createRoleAllowed,\n createRoleLoading,\n}: {\n createRoleAllowed: boolean;\n createRoleLoading: boolean;\n}) => {\n const { t } = useTranslation();\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 {t('toolbar.warning.title')}\n </AlertTitle>\n <Trans\n message=\"toolbar.warning.message\"\n params={{\n link: (\n <Link\n to=\"https://github.com/backstage/community-plugins/tree/main/workspaces/rbac/plugins/rbac#prerequisites\"\n target=\"_blank\"\n >\n {t('toolbar.warning.linkText')}\n </Link>\n ),\n }}\n />\n <Typography sx={{ mt: 1 }} fontSize=\"small\">\n <Typography component=\"span\" fontWeight=\"bold\" fontSize=\"small\">\n {t('toolbar.warning.note')}\n </Typography>\n : {t('toolbar.warning.noteText')}\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 {t('toolbar.createButton')}\n </LinkButton>\n </Typography>\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;;AAwBO,MAAM,mBAAmB,CAAC;AAAA,EAC/B,iBAAA;AAAA,EACA;AACF,CAGM,KAAA;AACJ,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA;AAE7B,EAAA,4BACG,KACE,EAAA,EAAA,QAAA,EAAA;AAAA,IAAC,CAAA,iBAAA,IAAqB,CAAC,iBACtB,oBAAA,IAAA,CAAC,SAAM,QAAS,EAAA,SAAA,EAAU,eAAY,qBACpC,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,EAAI,EAAA;AAAA,YACF,UAAY,EAAA;AAAA,WACd;AAAA,UAEC,YAAE,uBAAuB;AAAA;AAAA,OAC5B;AAAA,sBACA,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,OAAQ,EAAA,yBAAA;AAAA,UACR,MAAQ,EAAA;AAAA,YACN,IACE,kBAAA,GAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBACC,EAAG,EAAA,qGAAA;AAAA,gBACH,MAAO,EAAA,QAAA;AAAA,gBAEN,YAAE,0BAA0B;AAAA;AAAA;AAC/B;AAEJ;AAAA,OACF;AAAA,sBACA,IAAA,CAAC,cAAW,EAAI,EAAA,EAAE,IAAI,CAAE,EAAA,EAAG,UAAS,OAClC,EAAA,QAAA,EAAA;AAAA,wBAAC,GAAA,CAAA,UAAA,EAAA,EAAW,WAAU,MAAO,EAAA,UAAA,EAAW,QAAO,QAAS,EAAA,OAAA,EACrD,QAAE,EAAA,CAAA,CAAA,sBAAsB,CAC3B,EAAA,CAAA;AAAA,QAAa,IAAA;AAAA,QACV,EAAE,0BAA0B;AAAA,OACjC,EAAA;AAAA,KACF,EAAA,CAAA;AAAA,wBAED,IAAG,EAAA,EAAA,CAAA;AAAA,oBACJ,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,SAAU,EAAA,MAAA;AAAA,QACV,EAAI,EAAA;AAAA,UACF,OAAS,EAAA,MAAA;AAAA,UACT,cAAgB,EAAA,KAAA;AAAA,UAChB,YAAc,EAAA;AAAA,SAChB;AAAA,QAEA,QAAA,kBAAA,GAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,EAAG,EAAA,UAAA;AAAA,YACH,KAAM,EAAA,SAAA;AAAA,YACN,OAAQ,EAAA,WAAA;AAAA,YACR,UAAU,CAAC,iBAAA;AAAA,YACX,aAAY,EAAA,aAAA;AAAA,YAEX,YAAE,sBAAsB;AAAA;AAAA;AAC3B;AAAA;AACF,GACF,EAAA,CAAA;AAEJ;;;;"}
@@ -10,17 +10,19 @@ import { EditRolePage } from './CreateRole/EditRolePage.esm.js';
10
10
  import { RbacPage } from './RbacPage.esm.js';
11
11
  import { RoleOverviewPage } from './RoleOverview/RoleOverviewPage.esm.js';
12
12
  import { ToastContextProvider } from './ToastContext.esm.js';
13
+ import { useTranslation } from '../hooks/useTranslation.esm.js';
13
14
 
14
15
  const Router = ({ useHeader = true }) => {
15
16
  const config = useApi(configApiRef);
17
+ const { t } = useTranslation();
16
18
  const isRBACPluginEnabled = config.getOptionalBoolean("permission.enabled");
17
19
  if (!isRBACPluginEnabled) {
18
20
  return /* @__PURE__ */ jsx(
19
21
  ErrorPage,
20
22
  {
21
23
  status: "404",
22
- statusMessage: "Enable the RBAC backend plugin to use this feature.",
23
- additionalInfo: "To enable RBAC, set `permission.enabled` to `true` in the app-config file."
24
+ statusMessage: t("errors.rbacDisabled"),
25
+ additionalInfo: t("errors.rbacDisabledInfo")
24
26
  }
25
27
  );
26
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Router.esm.js","sources":["../../src/components/Router.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 { Route, Routes } from 'react-router-dom';\n\nimport { ErrorPage } from '@backstage/core-components';\nimport { configApiRef, useApi } from '@backstage/core-plugin-api';\nimport { RequirePermission } from '@backstage/plugin-permission-react';\n\nimport { policyEntityCreatePermission } from '@backstage-community/plugin-rbac-common';\n\nimport { createRoleRouteRef, editRoleRouteRef, roleRouteRef } from '../routes';\nimport { CreateRolePage } from './CreateRole/CreateRolePage';\nimport { EditRolePage } from './CreateRole/EditRolePage';\nimport { RbacPage } from './RbacPage';\nimport { RoleOverviewPage } from './RoleOverview/RoleOverviewPage';\nimport { ToastContextProvider } from './ToastContext';\n\n/**\n *\n * @public\n */\nexport const Router = ({ useHeader = true }: { useHeader?: boolean }) => {\n const config = useApi(configApiRef);\n const isRBACPluginEnabled = config.getOptionalBoolean('permission.enabled');\n\n if (!isRBACPluginEnabled) {\n return (\n <ErrorPage\n status=\"404\"\n statusMessage=\"Enable the RBAC backend plugin to use this feature.\"\n additionalInfo=\"To enable RBAC, set `permission.enabled` to `true` in the app-config file.\"\n />\n );\n }\n\n return (\n <ToastContextProvider>\n <Routes>\n <Route path=\"/\" element={<RbacPage useHeader={useHeader} />} />\n <Route path={roleRouteRef.path} element={<RoleOverviewPage />} />\n <Route\n path={createRoleRouteRef.path}\n element={\n <RequirePermission permission={policyEntityCreatePermission}>\n <CreateRolePage />\n </RequirePermission>\n }\n />\n <Route path={editRoleRouteRef.path} element={<EditRolePage />} />\n </Routes>\n </ToastContextProvider>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;AAkCO,MAAM,MAAS,GAAA,CAAC,EAAE,SAAA,GAAY,MAAoC,KAAA;AACvE,EAAM,MAAA,MAAA,GAAS,OAAO,YAAY,CAAA;AAClC,EAAM,MAAA,mBAAA,GAAsB,MAAO,CAAA,kBAAA,CAAmB,oBAAoB,CAAA;AAE1E,EAAA,IAAI,CAAC,mBAAqB,EAAA;AACxB,IACE,uBAAA,GAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,MAAO,EAAA,KAAA;AAAA,QACP,aAAc,EAAA,qDAAA;AAAA,QACd,cAAe,EAAA;AAAA;AAAA,KACjB;AAAA;AAIJ,EACE,uBAAA,GAAA,CAAC,oBACC,EAAA,EAAA,QAAA,kBAAA,IAAA,CAAC,MACC,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,SAAM,IAAK,EAAA,GAAA,EAAI,yBAAU,GAAA,CAAA,QAAA,EAAA,EAAS,WAAsB,CAAI,EAAA,CAAA;AAAA,oBAC7D,GAAA,CAAC,SAAM,IAAM,EAAA,YAAA,CAAa,MAAM,OAAS,kBAAA,GAAA,CAAC,oBAAiB,CAAI,EAAA,CAAA;AAAA,oBAC/D,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,MAAM,kBAAmB,CAAA,IAAA;AAAA,QACzB,yBACG,GAAA,CAAA,iBAAA,EAAA,EAAkB,YAAY,4BAC7B,EAAA,QAAA,kBAAA,GAAA,CAAC,kBAAe,CAClB,EAAA;AAAA;AAAA,KAEJ;AAAA,oBACA,GAAA,CAAC,SAAM,IAAM,EAAA,gBAAA,CAAiB,MAAM,OAAS,kBAAA,GAAA,CAAC,gBAAa,CAAI,EAAA;AAAA,GAAA,EACjE,CACF,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"Router.esm.js","sources":["../../src/components/Router.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 { Route, Routes } from 'react-router-dom';\n\nimport { ErrorPage } from '@backstage/core-components';\nimport { configApiRef, useApi } from '@backstage/core-plugin-api';\nimport { RequirePermission } from '@backstage/plugin-permission-react';\n\nimport { policyEntityCreatePermission } from '@backstage-community/plugin-rbac-common';\n\nimport { createRoleRouteRef, editRoleRouteRef, roleRouteRef } from '../routes';\nimport { CreateRolePage } from './CreateRole/CreateRolePage';\nimport { EditRolePage } from './CreateRole/EditRolePage';\nimport { RbacPage } from './RbacPage';\nimport { RoleOverviewPage } from './RoleOverview/RoleOverviewPage';\nimport { ToastContextProvider } from './ToastContext';\nimport { useTranslation } from '../hooks/useTranslation';\n\n/**\n *\n * @public\n */\nexport const Router = ({ useHeader = true }: { useHeader?: boolean }) => {\n const config = useApi(configApiRef);\n const { t } = useTranslation();\n const isRBACPluginEnabled = config.getOptionalBoolean('permission.enabled');\n\n if (!isRBACPluginEnabled) {\n return (\n <ErrorPage\n status=\"404\"\n statusMessage={t('errors.rbacDisabled')}\n additionalInfo={t('errors.rbacDisabledInfo')}\n />\n );\n }\n\n return (\n <ToastContextProvider>\n <Routes>\n <Route path=\"/\" element={<RbacPage useHeader={useHeader} />} />\n <Route path={roleRouteRef.path} element={<RoleOverviewPage />} />\n <Route\n path={createRoleRouteRef.path}\n element={\n <RequirePermission permission={policyEntityCreatePermission}>\n <CreateRolePage />\n </RequirePermission>\n }\n />\n <Route path={editRoleRouteRef.path} element={<EditRolePage />} />\n </Routes>\n </ToastContextProvider>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAmCO,MAAM,MAAS,GAAA,CAAC,EAAE,SAAA,GAAY,MAAoC,KAAA;AACvE,EAAM,MAAA,MAAA,GAAS,OAAO,YAAY,CAAA;AAClC,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA;AAC7B,EAAM,MAAA,mBAAA,GAAsB,MAAO,CAAA,kBAAA,CAAmB,oBAAoB,CAAA;AAE1E,EAAA,IAAI,CAAC,mBAAqB,EAAA;AACxB,IACE,uBAAA,GAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,MAAO,EAAA,KAAA;AAAA,QACP,aAAA,EAAe,EAAE,qBAAqB,CAAA;AAAA,QACtC,cAAA,EAAgB,EAAE,yBAAyB;AAAA;AAAA,KAC7C;AAAA;AAIJ,EACE,uBAAA,GAAA,CAAC,oBACC,EAAA,EAAA,QAAA,kBAAA,IAAA,CAAC,MACC,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,SAAM,IAAK,EAAA,GAAA,EAAI,yBAAU,GAAA,CAAA,QAAA,EAAA,EAAS,WAAsB,CAAI,EAAA,CAAA;AAAA,oBAC7D,GAAA,CAAC,SAAM,IAAM,EAAA,YAAA,CAAa,MAAM,OAAS,kBAAA,GAAA,CAAC,oBAAiB,CAAI,EAAA,CAAA;AAAA,oBAC/D,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,MAAM,kBAAmB,CAAA,IAAA;AAAA,QACzB,yBACG,GAAA,CAAA,iBAAA,EAAA,EAAkB,YAAY,4BAC7B,EAAA,QAAA,kBAAA,GAAA,CAAC,kBAAe,CAClB,EAAA;AAAA;AAAA,KAEJ;AAAA,oBACA,GAAA,CAAC,SAAM,IAAM,EAAA,gBAAA,CAAiB,MAAM,OAAS,kBAAA,GAAA,CAAC,gBAAa,CAAI,EAAA;AAAA,GAAA,EACjE,CACF,EAAA,CAAA;AAEJ;;;;"}