@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 +1 @@
1
- {"version":3,"file":"DeleteRole.esm.js","sources":["../../../src/components/RolesList/DeleteRole.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport { useDeleteDialog } from '@janus-idp/shared-react';\nimport Delete from '@mui/icons-material/Delete';\nimport IconButton from '@mui/material/IconButton';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport { policyEntityDeletePermission } from '@backstage-community/plugin-rbac-common';\nimport { usePermission } from '@backstage/plugin-permission-react';\n\ntype DeleteRoleProps = {\n roleName: string;\n canEdit: boolean;\n dataTestId?: string;\n tooltip?: string;\n};\n\nconst DeleteRole = ({\n roleName,\n canEdit,\n dataTestId,\n tooltip,\n}: DeleteRoleProps) => {\n const { setDeleteComponent, setOpenDialog } = useDeleteDialog();\n\n const openDialog = (name: string) => {\n setDeleteComponent({ roleName: name });\n setOpenDialog(true);\n };\n\n const deletePermissionResult = usePermission({\n permission: policyEntityDeletePermission,\n resourceRef: roleName,\n });\n\n const disable = !(deletePermissionResult.allowed && canEdit);\n const dataTestIdText = disable\n ? `disable-delete-role-${roleName}`\n : `delete-role-${roleName}`;\n const tooltipText = disable ? 'Role cannot be deleted' : '';\n\n return (\n <Tooltip title={tooltip ?? tooltipText}>\n <Typography component=\"span\" data-testid={dataTestId ?? dataTestIdText}>\n <IconButton\n onClick={() => openDialog(roleName)}\n aria-label=\"Delete\"\n disabled={disable}\n title={tooltip ?? 'Delete Role'}\n style={{ padding: '0.5rem', borderRadius: '50%' }}\n sx={{ '&:hover': { borderRadius: '50%' } }}\n >\n <Delete />\n </IconButton>\n </Typography>\n </Tooltip>\n );\n};\nexport default DeleteRole;\n"],"names":["React"],"mappings":";;;;;;;;;AAgCA,MAAM,aAAa,CAAC;AAAA,EAClB,QAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAuB,KAAA;AACrB,EAAA,MAAM,EAAE,kBAAA,EAAoB,aAAc,EAAA,GAAI,eAAgB,EAAA;AAE9D,EAAM,MAAA,UAAA,GAAa,CAAC,IAAiB,KAAA;AACnC,IAAmB,kBAAA,CAAA,EAAE,QAAU,EAAA,IAAA,EAAM,CAAA;AACrC,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,GACpB;AAEA,EAAA,MAAM,yBAAyB,aAAc,CAAA;AAAA,IAC3C,UAAY,EAAA,4BAAA;AAAA,IACZ,WAAa,EAAA;AAAA,GACd,CAAA;AAED,EAAM,MAAA,OAAA,GAAU,EAAE,sBAAA,CAAuB,OAAW,IAAA,OAAA,CAAA;AACpD,EAAA,MAAM,iBAAiB,OACnB,GAAA,CAAA,oBAAA,EAAuB,QAAQ,CAAA,CAAA,GAC/B,eAAe,QAAQ,CAAA,CAAA;AAC3B,EAAM,MAAA,WAAA,GAAc,UAAU,wBAA2B,GAAA,EAAA;AAEzD,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,OAAA,EAAS,MAAM,UAAA,CAAW,QAAQ,CAAA;AAAA,MAClC,YAAW,EAAA,QAAA;AAAA,MACX,QAAU,EAAA,OAAA;AAAA,MACV,OAAO,OAAW,IAAA,aAAA;AAAA,MAClB,KAAO,EAAA,EAAE,OAAS,EAAA,QAAA,EAAU,cAAc,KAAM,EAAA;AAAA,MAChD,IAAI,EAAE,SAAA,EAAW,EAAE,YAAA,EAAc,OAAQ;AAAA,KAAA;AAAA,iDAExC,MAAO,EAAA,IAAA;AAAA,GAEZ,CACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"DeleteRole.esm.js","sources":["../../../src/components/RolesList/DeleteRole.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useDeleteDialog } from '@janus-idp/shared-react';\nimport Delete from '@mui/icons-material/Delete';\nimport IconButton from '@mui/material/IconButton';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport { policyEntityDeletePermission } from '@backstage-community/plugin-rbac-common';\nimport { usePermission } from '@backstage/plugin-permission-react';\n\ntype DeleteRoleProps = {\n roleName: string;\n canEdit: boolean;\n dataTestId?: string;\n tooltip?: string;\n};\n\nconst DeleteRole = ({\n roleName,\n canEdit,\n dataTestId,\n tooltip,\n}: DeleteRoleProps) => {\n const { setDeleteComponent, setOpenDialog } = useDeleteDialog();\n\n const openDialog = (name: string) => {\n setDeleteComponent({ roleName: name });\n setOpenDialog(true);\n };\n\n const deletePermissionResult = usePermission({\n permission: policyEntityDeletePermission,\n resourceRef: roleName,\n });\n\n const disable = !(deletePermissionResult.allowed && canEdit);\n const dataTestIdText = disable\n ? `disable-delete-role-${roleName}`\n : `delete-role-${roleName}`;\n const tooltipText = disable ? 'Role cannot be deleted' : '';\n\n return (\n <Tooltip title={tooltip ?? tooltipText}>\n <Typography component=\"span\" data-testid={dataTestId ?? dataTestIdText}>\n <IconButton\n onClick={() => openDialog(roleName)}\n aria-label=\"Delete\"\n disabled={disable}\n title={tooltip ?? 'Delete Role'}\n style={{ padding: '0.5rem', borderRadius: '50%' }}\n sx={{ '&:hover': { borderRadius: '50%' } }}\n >\n <Delete />\n </IconButton>\n </Typography>\n </Tooltip>\n );\n};\nexport default DeleteRole;\n"],"names":[],"mappings":";;;;;;;;;AA8BA,MAAM,aAAa,CAAC;AAAA,EAClB,QAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAuB,KAAA;AACrB,EAAA,MAAM,EAAE,kBAAA,EAAoB,aAAc,EAAA,GAAI,eAAgB,EAAA;AAE9D,EAAM,MAAA,UAAA,GAAa,CAAC,IAAiB,KAAA;AACnC,IAAmB,kBAAA,CAAA,EAAE,QAAU,EAAA,IAAA,EAAM,CAAA;AACrC,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,GACpB;AAEA,EAAA,MAAM,yBAAyB,aAAc,CAAA;AAAA,IAC3C,UAAY,EAAA,4BAAA;AAAA,IACZ,WAAa,EAAA;AAAA,GACd,CAAA;AAED,EAAM,MAAA,OAAA,GAAU,EAAE,sBAAA,CAAuB,OAAW,IAAA,OAAA,CAAA;AACpD,EAAA,MAAM,iBAAiB,OACnB,GAAA,CAAA,oBAAA,EAAuB,QAAQ,CAAA,CAAA,GAC/B,eAAe,QAAQ,CAAA,CAAA;AAC3B,EAAM,MAAA,WAAA,GAAc,UAAU,wBAA2B,GAAA,EAAA;AAEzD,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,OAAA,EAAS,MAAM,UAAA,CAAW,QAAQ,CAAA;AAAA,MAClC,YAAW,EAAA,QAAA;AAAA,MACX,QAAU,EAAA,OAAA;AAAA,MACV,OAAO,OAAW,IAAA,aAAA;AAAA,MAClB,KAAO,EAAA,EAAE,OAAS,EAAA,QAAA,EAAU,cAAc,KAAM,EAAA;AAAA,MAChD,IAAI,EAAE,SAAA,EAAW,EAAE,YAAA,EAAc,OAAQ,EAAA;AAAA,MAEzC,8BAAC,MAAO,EAAA,EAAA;AAAA;AAAA,KAEZ,CACF,EAAA,CAAA;AAEJ;;;;"}
@@ -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 { useApi } from '@backstage/core-plugin-api';
3
4
  import CloseIcon from '@mui/icons-material/Close';
4
5
  import ErrorIcon from '@mui/icons-material/Error';
@@ -24,9 +25,9 @@ const DeleteRoleDialog = ({
24
25
  propOptions
25
26
  }) => {
26
27
  const { setToastMessage } = useToast();
27
- const [deleteRoleValue, setDeleteRoleValue] = React__default.useState();
28
- const [disableDelete, setDisableDelete] = React__default.useState(false);
29
- const [error, setError] = React__default.useState("");
28
+ const [deleteRoleValue, setDeleteRoleValue] = useState();
29
+ const [disableDelete, setDisableDelete] = useState(false);
30
+ const [error, setError] = useState("");
30
31
  const rbacApi = useApi(rbacApiRef);
31
32
  const dialogBackgroundColor = (theme) => theme.palette.mode === "dark" ? "#1b1d21" : "#fff";
32
33
  const deleteRole = async () => {
@@ -64,103 +65,138 @@ const DeleteRoleDialog = ({
64
65
  setDisableDelete(true);
65
66
  }
66
67
  };
67
- return /* @__PURE__ */ React__default.createElement(Dialog, { maxWidth: "md", open, onClose: closeDialog }, /* @__PURE__ */ React__default.createElement(
68
- DialogTitle,
69
- {
70
- id: "delete-role",
71
- title: "Delete Role",
72
- sx: {
73
- marginBottom: "0 !important",
74
- backgroundColor: dialogBackgroundColor
75
- }
76
- },
77
- /* @__PURE__ */ React__default.createElement(
78
- Box,
68
+ return /* @__PURE__ */ jsxs(Dialog, { maxWidth: "md", open, onClose: closeDialog, children: [
69
+ /* @__PURE__ */ jsx(
70
+ DialogTitle,
79
71
  {
72
+ id: "delete-role",
73
+ title: "Delete Role",
80
74
  sx: {
81
- display: "flex",
82
- alignItems: "center",
83
- justifyContent: "space-between",
84
- gap: (theme) => theme.spacing(1)
85
- }
86
- },
87
- /* @__PURE__ */ React__default.createElement(Typography, { component: "span", sx: { fontWeight: "bold" } }, /* @__PURE__ */ React__default.createElement(
88
- ErrorIcon,
75
+ marginBottom: "0 !important",
76
+ backgroundColor: dialogBackgroundColor
77
+ },
78
+ children: /* @__PURE__ */ jsxs(
79
+ Box,
80
+ {
81
+ sx: {
82
+ display: "flex",
83
+ alignItems: "center",
84
+ justifyContent: "space-between",
85
+ gap: (theme) => theme.spacing(1)
86
+ },
87
+ children: [
88
+ /* @__PURE__ */ jsxs(Typography, { component: "span", sx: { fontWeight: "bold" }, children: [
89
+ /* @__PURE__ */ jsx(
90
+ ErrorIcon,
91
+ {
92
+ style: {
93
+ color: "red",
94
+ alignContent: "center",
95
+ marginTop: "7px",
96
+ marginRight: "5px",
97
+ marginBottom: "-3px"
98
+ },
99
+ fontSize: "small"
100
+ }
101
+ ),
102
+ " ",
103
+ "Delete this role?"
104
+ ] }),
105
+ /* @__PURE__ */ jsx(
106
+ IconButton,
107
+ {
108
+ "aria-label": "close",
109
+ sx: {
110
+ padding: "8px !important",
111
+ color: (theme) => theme.palette.grey[500],
112
+ borderRadius: "50%",
113
+ "&:hover": { borderRadius: "50%" }
114
+ },
115
+ onClick: closeDialog,
116
+ children: /* @__PURE__ */ jsx(CloseIcon, {})
117
+ }
118
+ )
119
+ ]
120
+ }
121
+ )
122
+ }
123
+ ),
124
+ /* @__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,
89
145
  {
90
- style: {
91
- color: "red",
92
- alignContent: "center",
93
- marginTop: "7px",
94
- marginRight: "5px",
95
- marginBottom: "-3px"
96
- },
97
- fontSize: "small"
146
+ component: "span",
147
+ sx: { fontWeight: "bold" },
148
+ children: `${propOptions.permissions} permission policies`
98
149
  }
99
- ), " ", "Delete this role?"),
100
- /* @__PURE__ */ React__default.createElement(
101
- IconButton,
150
+ ),
151
+ " ",
152
+ "specified in this role.",
153
+ /* @__PURE__ */ jsx("br", {}),
154
+ /* @__PURE__ */ jsx(
155
+ TextField,
102
156
  {
103
- "aria-label": "close",
157
+ name: "delete-role",
158
+ "data-testid": "delete-role",
104
159
  sx: {
105
- padding: "8px !important",
106
- color: (theme) => theme.palette.grey[500],
107
- borderRadius: "50%",
108
- "&:hover": { borderRadius: "50%" }
160
+ marginTop: "24px",
161
+ backgroundColor: `${dialogBackgroundColor} !important`
109
162
  },
110
- onClick: closeDialog
111
- },
112
- /* @__PURE__ */ React__default.createElement(CloseIcon, null)
163
+ required: true,
164
+ variant: "outlined",
165
+ label: "Role name",
166
+ defaultValue: deleteRoleValue,
167
+ helperText: "Type the name of the role to confirm",
168
+ onChange: ({ target: { value } }) => onTextInput(value),
169
+ onBlur: ({ target: { value } }) => onTextInput(value)
170
+ }
113
171
  )
114
- )
115
- ), /* @__PURE__ */ React__default.createElement(DialogContent, { sx: { backgroundColor: dialogBackgroundColor } }, "Are you sure you want to delete the role", " ", /* @__PURE__ */ React__default.createElement(Typography, { component: "span", sx: { fontWeight: "bold" } }, roleName), " ", "?", /* @__PURE__ */ React__default.createElement("br", null), /* @__PURE__ */ React__default.createElement("br", null), "Deleting this role is irreversible and will remove its functionality from the system. Proceed with caution.", /* @__PURE__ */ React__default.createElement("br", null), /* @__PURE__ */ React__default.createElement("br", null), "The", " ", /* @__PURE__ */ React__default.createElement(Typography, { component: "span", sx: { fontWeight: "bold" } }, `${getMembers(
116
- propOptions.memberRefs
117
- ).toLocaleLowerCase("en-US")}`), " ", "associated with this role will lose access to all the", " ", /* @__PURE__ */ React__default.createElement(
118
- Typography,
119
- {
120
- component: "span",
121
- sx: { fontWeight: "bold" }
122
- },
123
- `${propOptions.permissions} permission policies`
124
- ), " ", "specified in this role.", /* @__PURE__ */ React__default.createElement("br", null), /* @__PURE__ */ React__default.createElement(
125
- TextField,
126
- {
127
- name: "delete-role",
128
- "data-testid": "delete-role",
129
- sx: {
130
- marginTop: "24px",
131
- backgroundColor: `${dialogBackgroundColor} !important`
132
- },
133
- required: true,
134
- variant: "outlined",
135
- label: "Role name",
136
- defaultValue: deleteRoleValue,
137
- helperText: "Type the name of the role to confirm",
138
- onChange: ({ target: { value } }) => onTextInput(value),
139
- onBlur: ({ target: { value } }) => onTextInput(value)
140
- }
141
- )), error && /* @__PURE__ */ React__default.createElement(Box, { maxWidth: "650px", marginLeft: "20px" }, /* @__PURE__ */ React__default.createElement(Alert, { severity: "error" }, error)), /* @__PURE__ */ React__default.createElement(
142
- DialogActions,
143
- {
144
- sx: {
145
- paddingLeft: "25px",
146
- paddingBottom: "30px",
147
- justifyContent: "left",
148
- paddingTop: "16px",
149
- backgroundColor: dialogBackgroundColor
150
- }
151
- },
152
- /* @__PURE__ */ React__default.createElement(
153
- Button,
172
+ ] }),
173
+ error && /* @__PURE__ */ jsx(Box, { maxWidth: "650px", marginLeft: "20px", children: /* @__PURE__ */ jsx(Alert, { severity: "error", children: error }) }),
174
+ /* @__PURE__ */ jsxs(
175
+ DialogActions,
154
176
  {
155
- variant: "contained",
156
- style: disableDelete || !deleteRoleValue ? {} : { background: "red", color: "white" },
157
- onClick: deleteRole,
158
- disabled: disableDelete || !deleteRoleValue
159
- },
160
- "Delete"
161
- ),
162
- /* @__PURE__ */ React__default.createElement(Button, { variant: "outlined", onClick: closeDialog }, "Cancel")
163
- ));
177
+ sx: {
178
+ paddingLeft: "25px",
179
+ paddingBottom: "30px",
180
+ justifyContent: "left",
181
+ paddingTop: "16px",
182
+ backgroundColor: dialogBackgroundColor
183
+ },
184
+ children: [
185
+ /* @__PURE__ */ jsx(
186
+ Button,
187
+ {
188
+ variant: "contained",
189
+ style: disableDelete || !deleteRoleValue ? {} : { background: "red", color: "white" },
190
+ onClick: deleteRole,
191
+ disabled: disableDelete || !deleteRoleValue,
192
+ children: "Delete"
193
+ }
194
+ ),
195
+ /* @__PURE__ */ jsx(Button, { variant: "outlined", onClick: closeDialog, children: "Cancel" })
196
+ ]
197
+ }
198
+ )
199
+ ] });
164
200
  };
165
201
 
166
202
  export { DeleteRoleDialog as default };
@@ -1 +1 @@
1
- {"version":3,"file":"DeleteRoleDialog.esm.js","sources":["../../../src/components/RolesList/DeleteRoleDialog.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport CloseIcon from '@mui/icons-material/Close';\nimport ErrorIcon from '@mui/icons-material/Error';\nimport Alert from '@mui/material/Alert';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport IconButton from '@mui/material/IconButton';\nimport TextField from '@mui/material/TextField';\nimport Typography from '@mui/material/Typography';\n\nimport { RoleBasedPolicy } from '@backstage-community/plugin-rbac-common';\n\nimport { rbacApiRef } from '../../api/RBACBackendClient';\nimport { getMembers } from '../../utils/rbac-utils';\nimport {\n removeConditions,\n removePermissions,\n} from '../../utils/role-form-utils';\nimport { useToast } from '../ToastContext';\n\ntype DeleteRoleDialogProps = {\n open: boolean;\n closeDialog: () => void;\n roleName: string;\n propOptions: {\n memberRefs: string[];\n permissions: number;\n };\n};\n\nconst DeleteRoleDialog = ({\n open,\n closeDialog,\n roleName,\n propOptions,\n}: DeleteRoleDialogProps) => {\n const { setToastMessage } = useToast();\n const [deleteRoleValue, setDeleteRoleValue] = React.useState<string>();\n const [disableDelete, setDisableDelete] = React.useState(false);\n const [error, setError] = React.useState<string>('');\n\n const rbacApi = useApi(rbacApiRef);\n\n const 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":["React"],"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';\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,4 +1,5 @@
1
- import React__default from 'react';
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
+ import { useState, useMemo } from 'react';
2
3
  import { Progress, WarningPanel, Table } from '@backstage/core-components';
3
4
  import { useDeleteDialog } from '@janus-idp/shared-react';
4
5
  import Box from '@mui/material/Box';
@@ -17,7 +18,7 @@ const RolesList = () => {
17
18
  const { toastMessage, setToastMessage } = useToast();
18
19
  const { openDialog, setOpenDialog, deleteComponent } = useDeleteDialog();
19
20
  useLocationToast(setToastMessage);
20
- const [searchText, setSearchText] = React__default.useState();
21
+ const [searchText, setSearchText] = useState();
21
22
  const { loading, data, retry, createRoleAllowed, createRoleLoading, error } = useRoles();
22
23
  const closeDialog = () => {
23
24
  setOpenDialog(false);
@@ -27,7 +28,7 @@ const RolesList = () => {
27
28
  const onAlertClose = () => {
28
29
  setToastMessage("");
29
30
  };
30
- const filteredRoles = React__default.useMemo(
31
+ const filteredRoles = useMemo(
31
32
  () => filterTableData({ data, columns, searchText }),
32
33
  [data, searchText]
33
34
  );
@@ -52,51 +53,58 @@ const RolesList = () => {
52
53
  const errorWarning = getErrorWarning();
53
54
  const isLicensePluginEnabled = useCheckIfLicensePluginEnabled();
54
55
  if (isLicensePluginEnabled.loading) {
55
- return /* @__PURE__ */ React__default.createElement(Progress, null);
56
+ return /* @__PURE__ */ jsx(Progress, {});
56
57
  }
57
- return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(SnackbarAlert, { toastMessage, onAlertClose }), /* @__PURE__ */ React__default.createElement(
58
- RolesListToolbar,
59
- {
60
- createRoleAllowed,
61
- createRoleLoading
62
- }
63
- ), errorWarning.message && /* @__PURE__ */ React__default.createElement("div", { style: { paddingBottom: "16px" } }, /* @__PURE__ */ React__default.createElement(
64
- WarningPanel,
65
- {
66
- message: errorWarning.message,
67
- title: errorWarning.title,
68
- severity: "error"
69
- }
70
- )), /* @__PURE__ */ React__default.createElement(
71
- Table,
72
- {
73
- title: !loading && data?.length ? `All roles (${filteredRoles.length})` : `All roles`,
74
- options: { padding: "default", search: true, paging: true },
75
- data,
76
- isLoading: loading,
77
- columns,
78
- emptyContent: /* @__PURE__ */ React__default.createElement(
79
- Box,
80
- {
81
- "data-testid": "roles-table-empty",
82
- sx: { display: "flex", justifyContent: "center", p: 2 }
83
- },
84
- "No records found"
85
- ),
86
- onSearchChange: setSearchText
87
- }
88
- ), isLicensePluginEnabled.isEnabled && /* @__PURE__ */ React__default.createElement(DownloadCSVLink, null), openDialog && /* @__PURE__ */ React__default.createElement(
89
- DeleteRoleDialog,
90
- {
91
- open: openDialog,
92
- closeDialog,
93
- roleName: deleteComponent.roleName,
94
- propOptions: {
95
- memberRefs: data.find((d) => d.name === deleteComponent.roleName)?.members || [],
96
- permissions: data.find((d) => d.name === deleteComponent.roleName)?.permissions || 0
58
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
59
+ /* @__PURE__ */ jsx(SnackbarAlert, { toastMessage, onAlertClose }),
60
+ /* @__PURE__ */ jsx(
61
+ RolesListToolbar,
62
+ {
63
+ createRoleAllowed,
64
+ createRoleLoading
65
+ }
66
+ ),
67
+ errorWarning.message && /* @__PURE__ */ jsx("div", { style: { paddingBottom: "16px" }, children: /* @__PURE__ */ jsx(
68
+ WarningPanel,
69
+ {
70
+ message: errorWarning.message,
71
+ title: errorWarning.title,
72
+ severity: "error"
73
+ }
74
+ ) }),
75
+ /* @__PURE__ */ jsx(
76
+ Table,
77
+ {
78
+ title: !loading && data?.length ? `All roles (${filteredRoles.length})` : `All roles`,
79
+ options: { padding: "default", search: true, paging: true },
80
+ data,
81
+ isLoading: loading,
82
+ columns,
83
+ emptyContent: /* @__PURE__ */ jsx(
84
+ Box,
85
+ {
86
+ "data-testid": "roles-table-empty",
87
+ sx: { display: "flex", justifyContent: "center", p: 2 },
88
+ children: "No records found"
89
+ }
90
+ ),
91
+ onSearchChange: setSearchText
92
+ }
93
+ ),
94
+ isLicensePluginEnabled.isEnabled && /* @__PURE__ */ jsx(DownloadCSVLink, {}),
95
+ openDialog && /* @__PURE__ */ jsx(
96
+ DeleteRoleDialog,
97
+ {
98
+ open: openDialog,
99
+ closeDialog,
100
+ roleName: deleteComponent.roleName,
101
+ propOptions: {
102
+ memberRefs: data.find((d) => d.name === deleteComponent.roleName)?.members || [],
103
+ permissions: data.find((d) => d.name === deleteComponent.roleName)?.permissions || 0
104
+ }
97
105
  }
98
- }
99
- ));
106
+ )
107
+ ] });
100
108
  };
101
109
 
102
110
  export { RolesList };
@@ -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 React from 'react';\n\nimport { Progress, Table, WarningPanel } from '@backstage/core-components';\n\nimport { useDeleteDialog } from '@janus-idp/shared-react';\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';\n\nexport const RolesList = () => {\n const { toastMessage, setToastMessage } = useToast();\n const { openDialog, setOpenDialog, deleteComponent } = useDeleteDialog();\n useLocationToast(setToastMessage);\n const [searchText, setSearchText] = React.useState<string>();\n const { loading, data, retry, createRoleAllowed, createRoleLoading, error } =\n useRoles();\n\n const closeDialog = () => {\n setOpenDialog(false);\n retry.roleRetry();\n retry.policiesRetry();\n };\n\n const onAlertClose = () => {\n setToastMessage('');\n };\n const filteredRoles = React.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 />\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":["React"],"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 { useDeleteDialog } from '@janus-idp/shared-react';\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';\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 { loading, data, retry, createRoleAllowed, createRoleLoading, error } =\n useRoles();\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 />\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,4 +1,4 @@
1
- import React__default from 'react';
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import { parseEntityRef } from '@backstage/catalog-model';
3
3
  import { Link } from '@backstage/core-components';
4
4
  import Tooltip from '@mui/material/Tooltip';
@@ -14,7 +14,7 @@ const columns = [
14
14
  type: "string",
15
15
  render: (props) => {
16
16
  const { kind, namespace, name } = parseEntityRef(props.name);
17
- return /* @__PURE__ */ React__default.createElement(Link, { to: `roles/${kind}/${namespace}/${name}` }, props.name);
17
+ return /* @__PURE__ */ jsx(Link, { to: `roles/${kind}/${namespace}/${name}`, children: props.name });
18
18
  }
19
19
  },
20
20
  {
@@ -47,25 +47,28 @@ const columns = [
47
47
  );
48
48
  const plsTooltip = pls.join(", ");
49
49
  const plsOverflowCount = pls.length > 2 ? `+ ${pls.length - 2}` : "";
50
- return pls.length > 0 ? /* @__PURE__ */ React__default.createElement(Tooltip, { title: plsTooltip || "", placement: "top-start" }, /* @__PURE__ */ React__default.createElement(Typography, null, pls.length === 1 ? `${pls[0]}` : `${pls[0]}, ${pls[1]} ${plsOverflowCount}`)) : "-";
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
51
  }
52
52
  },
53
53
  {
54
54
  title: "Actions",
55
55
  sorting: false,
56
- render: (props) => /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(
57
- EditRole,
58
- {
59
- canEdit: props.actionsPermissionResults.edit.allowed,
60
- roleName: props.name
61
- }
62
- ), /* @__PURE__ */ React__default.createElement(
63
- DeleteRole,
64
- {
65
- canEdit: props.actionsPermissionResults.edit.allowed,
66
- roleName: props.name
67
- }
68
- ))
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
+ ] })
69
72
  }
70
73
  ];
71
74
 
@@ -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 React from 'react';\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":["React"],"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';\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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"}