@backstage-community/plugin-rbac 1.43.0 → 1.44.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 +6 -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 +27 -13
@@ -6,8 +6,10 @@ import CachedIcon from '@mui/icons-material/Cached';
6
6
  import Box from '@mui/material/Box';
7
7
  import { filterTableData } from '../../utils/filter-table-data.esm.js';
8
8
  import { getMembers } from '../../utils/rbac-utils.esm.js';
9
+ import { useTranslation } from '../../hooks/useTranslation.esm.js';
10
+ import { useLanguage } from '../../hooks/useLanguage.esm.js';
9
11
  import EditRole from '../EditRole.esm.js';
10
- import { columns } from './MembersListColumns.esm.js';
12
+ import { getColumns } from './MembersListColumns.esm.js';
11
13
  import { StyledTableWrapper } from './StyledTableWrapper.esm.js';
12
14
 
13
15
  const getRefreshIcon = () => /* @__PURE__ */ jsx(CachedIcon, {});
@@ -24,12 +26,14 @@ const getEditIcon = (isAllowed, roleName) => {
24
26
  );
25
27
  };
26
28
  const MembersCard = ({ roleName, membersInfo }) => {
29
+ const { t } = useTranslation();
30
+ const locale = useLanguage();
27
31
  const { data, loading, retry, error, canReadUsersAndGroups } = membersInfo;
28
32
  const [searchText, setSearchText] = useState();
29
33
  const actions = [
30
34
  {
31
35
  icon: getRefreshIcon,
32
- tooltip: "Refresh",
36
+ tooltip: t("common.refresh"),
33
37
  isFreeAction: true,
34
38
  onClick: () => {
35
39
  retry.roleRetry();
@@ -38,42 +42,47 @@ const MembersCard = ({ roleName, membersInfo }) => {
38
42
  },
39
43
  {
40
44
  icon: () => getEditIcon(canReadUsersAndGroups, roleName),
41
- tooltip: canReadUsersAndGroups ? "Edit" : "Unauthorized to edit",
45
+ tooltip: canReadUsersAndGroups ? t("common.edit") : t("common.unauthorizedToEdit"),
42
46
  isFreeAction: true,
43
47
  onClick: () => {
44
48
  }
45
49
  }
46
50
  ];
51
+ const columns = useMemo(() => getColumns(t), [t]);
47
52
  const filteredData = useMemo(
48
- () => filterTableData({ data, columns, searchText }),
49
- [data, searchText]
53
+ () => filterTableData({ data, columns, searchText, locale }),
54
+ [data, searchText, locale, columns]
50
55
  );
51
56
  return /* @__PURE__ */ jsxs(Box, { children: [
52
57
  !loading && error && /* @__PURE__ */ jsx(Box, { style: { paddingBottom: "16px" }, children: /* @__PURE__ */ jsx(
53
58
  WarningPanel,
54
59
  {
55
60
  message: error?.message || error?.name,
56
- title: "Something went wrong while fetching the users and groups",
61
+ title: t("errors.fetchUsersAndGroups"),
57
62
  severity: "error"
58
63
  }
59
64
  ) }),
60
65
  /* @__PURE__ */ jsx(StyledTableWrapper, { children: /* @__PURE__ */ jsx(
61
66
  Table,
62
67
  {
63
- title: !loading && data?.length ? `${getMembers(filteredData)}` : "Users and groups",
68
+ title: !loading && data?.length ? `${getMembers(filteredData, t)}` : t("table.headers.usersAndGroups"),
64
69
  actions,
65
70
  options: { padding: "default", search: true, paging: true },
66
71
  data: data ?? [],
67
72
  isLoading: loading,
68
- columns,
73
+ columns: getColumns(t),
69
74
  emptyContent: /* @__PURE__ */ jsx(
70
75
  Box,
71
76
  {
72
77
  "data-testid": "members-table-empty",
73
78
  sx: { display: "flex", justifyContent: "center", p: 2 },
74
- children: "No records found"
79
+ children: t("common.noRecordsFound")
75
80
  }
76
81
  ),
82
+ localization: {
83
+ toolbar: { searchPlaceholder: t("table.searchPlaceholder") },
84
+ pagination: { labelRowsSelect: t("table.labelRowsSelect") }
85
+ },
77
86
  onSearchChange: setSearchText
78
87
  }
79
88
  ) })
@@ -1 +1 @@
1
- {"version":3,"file":"MembersCard.esm.js","sources":["../../../src/components/RoleOverview/MembersCard.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 { parseEntityRef } from '@backstage/catalog-model';\nimport { Table, WarningPanel } from '@backstage/core-components';\n\nimport CachedIcon from '@mui/icons-material/Cached';\nimport Box from '@mui/material/Box';\n\nimport { MembersInfo } from '../../hooks/useMembers';\nimport { filterTableData } from '../../utils/filter-table-data';\nimport { getMembers } from '../../utils/rbac-utils';\nimport EditRole from '../EditRole';\nimport { columns } from './MembersListColumns';\nimport { StyledTableWrapper } from './StyledTableWrapper';\n\ntype MembersCardProps = {\n roleName: string;\n membersInfo: MembersInfo;\n};\n\nconst getRefreshIcon = () => <CachedIcon />;\nconst getEditIcon = (isAllowed: boolean, roleName: string) => {\n const { kind, name, namespace } = parseEntityRef(roleName);\n\n return (\n <EditRole\n dataTestId={isAllowed ? 'update-members' : 'disable-update-members'}\n canEdit={isAllowed}\n roleName={roleName}\n to={`../../role/${kind}/${namespace}/${name}?activeStep=${1}`}\n />\n );\n};\n\nexport const MembersCard = ({ roleName, membersInfo }: MembersCardProps) => {\n const { data, loading, retry, error, canReadUsersAndGroups } = membersInfo;\n const [searchText, setSearchText] = useState<string>();\n\n const actions = [\n {\n icon: getRefreshIcon,\n tooltip: 'Refresh',\n isFreeAction: true,\n onClick: () => {\n retry.roleRetry();\n retry.membersRetry();\n },\n },\n {\n icon: () => getEditIcon(canReadUsersAndGroups, roleName),\n tooltip: canReadUsersAndGroups ? 'Edit' : 'Unauthorized to edit',\n isFreeAction: true,\n onClick: () => {},\n },\n ];\n\n const filteredData = useMemo(\n () => filterTableData({ data, columns, searchText }),\n [data, searchText],\n );\n\n return (\n <Box>\n {!loading && error && (\n <Box style={{ paddingBottom: '16px' }}>\n <WarningPanel\n message={(error as Error)?.message || (error as Error)?.name}\n title=\"Something went wrong while fetching the users and groups\"\n severity=\"error\"\n />\n </Box>\n )}\n <StyledTableWrapper>\n <Table\n title={\n !loading && data?.length\n ? `${getMembers(filteredData)}`\n : 'Users and groups'\n }\n actions={actions}\n options={{ padding: 'default', search: true, paging: true }}\n data={data ?? []}\n isLoading={loading}\n columns={columns}\n emptyContent={\n <Box\n data-testid=\"members-table-empty\"\n sx={{ display: 'flex', justifyContent: 'center', p: 2 }}\n >\n No records found\n </Box>\n }\n onSearchChange={setSearchText}\n />\n </StyledTableWrapper>\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MembersCard.esm.js","sources":["../../../src/components/RoleOverview/MembersCard.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 { parseEntityRef } from '@backstage/catalog-model';\nimport { Table, WarningPanel } from '@backstage/core-components';\n\nimport CachedIcon from '@mui/icons-material/Cached';\nimport Box from '@mui/material/Box';\n\nimport { MembersInfo } from '../../hooks/useMembers';\nimport { filterTableData } from '../../utils/filter-table-data';\nimport { getMembers } from '../../utils/rbac-utils';\nimport { useTranslation } from '../../hooks/useTranslation';\nimport { useLanguage } from '../../hooks/useLanguage';\nimport EditRole from '../EditRole';\nimport { getColumns } from './MembersListColumns';\nimport { StyledTableWrapper } from './StyledTableWrapper';\n\ntype MembersCardProps = {\n roleName: string;\n membersInfo: MembersInfo;\n};\n\nconst getRefreshIcon = () => <CachedIcon />;\nconst getEditIcon = (isAllowed: boolean, roleName: string) => {\n const { kind, name, namespace } = parseEntityRef(roleName);\n\n return (\n <EditRole\n dataTestId={isAllowed ? 'update-members' : 'disable-update-members'}\n canEdit={isAllowed}\n roleName={roleName}\n to={`../../role/${kind}/${namespace}/${name}?activeStep=${1}`}\n />\n );\n};\n\nexport const MembersCard = ({ roleName, membersInfo }: MembersCardProps) => {\n const { t } = useTranslation();\n const locale = useLanguage();\n const { data, loading, retry, error, canReadUsersAndGroups } = membersInfo;\n const [searchText, setSearchText] = useState<string>();\n\n const actions = [\n {\n icon: getRefreshIcon,\n tooltip: t('common.refresh'),\n isFreeAction: true,\n onClick: () => {\n retry.roleRetry();\n retry.membersRetry();\n },\n },\n {\n icon: () => getEditIcon(canReadUsersAndGroups, roleName),\n tooltip: canReadUsersAndGroups\n ? t('common.edit')\n : t('common.unauthorizedToEdit'),\n isFreeAction: true,\n onClick: () => {},\n },\n ];\n const columns = useMemo(() => getColumns(t), [t]);\n const filteredData = useMemo(\n () => filterTableData({ data, columns, searchText, locale }),\n [data, searchText, locale, columns],\n );\n\n return (\n <Box>\n {!loading && error && (\n <Box style={{ paddingBottom: '16px' }}>\n <WarningPanel\n message={(error as Error)?.message || (error as Error)?.name}\n title={t('errors.fetchUsersAndGroups')}\n severity=\"error\"\n />\n </Box>\n )}\n <StyledTableWrapper>\n <Table\n title={\n !loading && data?.length\n ? `${getMembers(filteredData, t)}`\n : t('table.headers.usersAndGroups')\n }\n actions={actions}\n options={{ padding: 'default', search: true, paging: true }}\n data={data ?? []}\n isLoading={loading}\n columns={getColumns(t)}\n emptyContent={\n <Box\n data-testid=\"members-table-empty\"\n sx={{ display: 'flex', justifyContent: 'center', p: 2 }}\n >\n {t('common.noRecordsFound')}\n </Box>\n }\n localization={{\n toolbar: { searchPlaceholder: t('table.searchPlaceholder') },\n pagination: { labelRowsSelect: t('table.labelRowsSelect') },\n }}\n onSearchChange={setSearchText}\n />\n </StyledTableWrapper>\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1,48 +1,50 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import { Link } from '@backstage/core-components';
3
3
 
4
- const columns = [
5
- {
6
- title: "Name",
7
- field: "name",
8
- type: "string",
9
- render: (props) => {
10
- return /* @__PURE__ */ jsx(
11
- Link,
12
- {
13
- to: `/catalog/${props.ref.namespace}/${props.ref.kind}/${props.ref.name}`,
14
- children: props.name
15
- }
16
- );
17
- }
18
- },
19
- {
20
- title: "Type",
21
- field: "type",
22
- type: "string"
23
- },
24
- {
25
- title: "Members",
26
- field: "members",
27
- type: "numeric",
28
- align: "left",
29
- render: (props) => {
30
- return props.type === "User" ? "-" : props.members;
31
- },
32
- customSort: (a, b) => {
33
- if (a.members === 0) {
34
- return -1;
4
+ const getColumns = (t) => {
5
+ return [
6
+ {
7
+ title: t("common.name"),
8
+ field: "name",
9
+ type: "string",
10
+ render: (props) => {
11
+ return /* @__PURE__ */ jsx(
12
+ Link,
13
+ {
14
+ to: `/catalog/${props.ref.namespace}/${props.ref.kind}/${props.ref.name}`,
15
+ children: props.name
16
+ }
17
+ );
35
18
  }
36
- if (b.members === 0) {
37
- return 1;
38
- }
39
- if (a.members === b.members) {
40
- return 0;
19
+ },
20
+ {
21
+ title: t("common.type"),
22
+ field: "type",
23
+ type: "string"
24
+ },
25
+ {
26
+ title: t("common.members"),
27
+ field: "members",
28
+ type: "numeric",
29
+ align: "left",
30
+ render: (props) => {
31
+ return props.type === "User" ? "-" : props.members;
32
+ },
33
+ customSort: (a, b) => {
34
+ if (a.members === 0) {
35
+ return -1;
36
+ }
37
+ if (b.members === 0) {
38
+ return 1;
39
+ }
40
+ if (a.members === b.members) {
41
+ return 0;
42
+ }
43
+ return a.members < b.members ? -1 : 1;
41
44
  }
42
- return a.members < b.members ? -1 : 1;
43
45
  }
44
- }
45
- ];
46
+ ];
47
+ };
46
48
 
47
- export { columns };
49
+ export { getColumns };
48
50
  //# sourceMappingURL=MembersListColumns.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MembersListColumns.esm.js","sources":["../../../src/components/RoleOverview/MembersListColumns.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, TableColumn } from '@backstage/core-components';\n\nimport { MembersData } from '../../types';\n\nexport const columns: TableColumn<MembersData>[] = [\n {\n title: 'Name',\n field: 'name',\n type: 'string',\n render: props => {\n return (\n <Link\n to={`/catalog/${props.ref.namespace}/${props.ref.kind}/${props.ref.name}`}\n >\n {props.name}\n </Link>\n );\n },\n },\n {\n title: 'Type',\n field: 'type',\n type: 'string',\n },\n {\n title: 'Members',\n field: 'members',\n type: 'numeric',\n align: 'left',\n render: (props: MembersData) => {\n return props.type === 'User' ? '-' : props.members;\n },\n customSort: (a, b) => {\n if (a.members === 0) {\n return -1;\n }\n if (b.members === 0) {\n return 1;\n }\n if (a.members === b.members) {\n return 0;\n }\n return a.members < b.members ? -1 : 1;\n },\n },\n];\n"],"names":[],"mappings":";;;AAmBO,MAAM,OAAsC,GAAA;AAAA,EACjD;AAAA,IACE,KAAO,EAAA,MAAA;AAAA,IACP,KAAO,EAAA,MAAA;AAAA,IACP,IAAM,EAAA,QAAA;AAAA,IACN,QAAQ,CAAS,KAAA,KAAA;AACf,MACE,uBAAA,GAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,EAAI,EAAA,CAAA,SAAA,EAAY,KAAM,CAAA,GAAA,CAAI,SAAS,CAAA,CAAA,EAAI,KAAM,CAAA,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,KAAM,CAAA,GAAA,CAAI,IAAI,CAAA,CAAA;AAAA,UAEtE,QAAM,EAAA,KAAA,CAAA;AAAA;AAAA,OACT;AAAA;AAEJ,GACF;AAAA,EACA;AAAA,IACE,KAAO,EAAA,MAAA;AAAA,IACP,KAAO,EAAA,MAAA;AAAA,IACP,IAAM,EAAA;AAAA,GACR;AAAA,EACA;AAAA,IACE,KAAO,EAAA,SAAA;AAAA,IACP,KAAO,EAAA,SAAA;AAAA,IACP,IAAM,EAAA,SAAA;AAAA,IACN,KAAO,EAAA,MAAA;AAAA,IACP,MAAA,EAAQ,CAAC,KAAuB,KAAA;AAC9B,MAAA,OAAO,KAAM,CAAA,IAAA,KAAS,MAAS,GAAA,GAAA,GAAM,KAAM,CAAA,OAAA;AAAA,KAC7C;AAAA,IACA,UAAA,EAAY,CAAC,CAAA,EAAG,CAAM,KAAA;AACpB,MAAI,IAAA,CAAA,CAAE,YAAY,CAAG,EAAA;AACnB,QAAO,OAAA,EAAA;AAAA;AAET,MAAI,IAAA,CAAA,CAAE,YAAY,CAAG,EAAA;AACnB,QAAO,OAAA,CAAA;AAAA;AAET,MAAI,IAAA,CAAA,CAAE,OAAY,KAAA,CAAA,CAAE,OAAS,EAAA;AAC3B,QAAO,OAAA,CAAA;AAAA;AAET,MAAA,OAAO,CAAE,CAAA,OAAA,GAAU,CAAE,CAAA,OAAA,GAAU,EAAK,GAAA,CAAA;AAAA;AACtC;AAEJ;;;;"}
1
+ {"version":3,"file":"MembersListColumns.esm.js","sources":["../../../src/components/RoleOverview/MembersListColumns.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, TableColumn } from '@backstage/core-components';\n\nimport { MembersData } from '../../types';\nimport { TranslationFunction } from '@backstage/core-plugin-api/alpha';\nimport { rbacTranslationRef } from '../../translations';\n\nexport const getColumns = (\n t: TranslationFunction<typeof rbacTranslationRef.T>,\n): TableColumn<MembersData>[] => {\n return [\n {\n title: t('common.name'),\n field: 'name',\n type: 'string',\n render: props => {\n return (\n <Link\n to={`/catalog/${props.ref.namespace}/${props.ref.kind}/${props.ref.name}`}\n >\n {props.name}\n </Link>\n );\n },\n },\n {\n title: t('common.type'),\n field: 'type',\n type: 'string',\n },\n {\n title: t('common.members'),\n field: 'members',\n type: 'numeric',\n align: 'left',\n render: (props: MembersData) => {\n return props.type === 'User' ? '-' : props.members;\n },\n customSort: (a, b) => {\n if (a.members === 0) {\n return -1;\n }\n if (b.members === 0) {\n return 1;\n }\n if (a.members === b.members) {\n return 0;\n }\n return a.members < b.members ? -1 : 1;\n },\n },\n ];\n};\n"],"names":[],"mappings":";;;AAqBa,MAAA,UAAA,GAAa,CACxB,CAC+B,KAAA;AAC/B,EAAO,OAAA;AAAA,IACL;AAAA,MACE,KAAA,EAAO,EAAE,aAAa,CAAA;AAAA,MACtB,KAAO,EAAA,MAAA;AAAA,MACP,IAAM,EAAA,QAAA;AAAA,MACN,QAAQ,CAAS,KAAA,KAAA;AACf,QACE,uBAAA,GAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,EAAI,EAAA,CAAA,SAAA,EAAY,KAAM,CAAA,GAAA,CAAI,SAAS,CAAA,CAAA,EAAI,KAAM,CAAA,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,KAAM,CAAA,GAAA,CAAI,IAAI,CAAA,CAAA;AAAA,YAEtE,QAAM,EAAA,KAAA,CAAA;AAAA;AAAA,SACT;AAAA;AAEJ,KACF;AAAA,IACA;AAAA,MACE,KAAA,EAAO,EAAE,aAAa,CAAA;AAAA,MACtB,KAAO,EAAA,MAAA;AAAA,MACP,IAAM,EAAA;AAAA,KACR;AAAA,IACA;AAAA,MACE,KAAA,EAAO,EAAE,gBAAgB,CAAA;AAAA,MACzB,KAAO,EAAA,SAAA;AAAA,MACP,IAAM,EAAA,SAAA;AAAA,MACN,KAAO,EAAA,MAAA;AAAA,MACP,MAAA,EAAQ,CAAC,KAAuB,KAAA;AAC9B,QAAA,OAAO,KAAM,CAAA,IAAA,KAAS,MAAS,GAAA,GAAA,GAAM,KAAM,CAAA,OAAA;AAAA,OAC7C;AAAA,MACA,UAAA,EAAY,CAAC,CAAA,EAAG,CAAM,KAAA;AACpB,QAAI,IAAA,CAAA,CAAE,YAAY,CAAG,EAAA;AACnB,UAAO,OAAA,EAAA;AAAA;AAET,QAAI,IAAA,CAAA,CAAE,YAAY,CAAG,EAAA;AACnB,UAAO,OAAA,CAAA;AAAA;AAET,QAAI,IAAA,CAAA,CAAE,OAAY,KAAA,CAAA,CAAE,OAAS,EAAA;AAC3B,UAAO,OAAA,CAAA;AAAA;AAET,QAAA,OAAO,CAAE,CAAA,OAAA,GAAU,CAAE,CAAA,OAAA,GAAU,EAAK,GAAA,CAAA;AAAA;AACtC;AACF,GACF;AACF;;;;"}
@@ -7,8 +7,11 @@ import Box from '@mui/material/Box';
7
7
  import { usePermissionPolicies } from '../../hooks/usePermissionPolicies.esm.js';
8
8
  import { filterTableData } from '../../utils/filter-table-data.esm.js';
9
9
  import EditRole from '../EditRole.esm.js';
10
- import { columns } from './PermissionsListColumns.esm.js';
10
+ import { getColumns } from './PermissionsListColumns.esm.js';
11
11
  import { StyledTableWrapper } from './StyledTableWrapper.esm.js';
12
+ import { useLanguage } from '../../hooks/useLanguage.esm.js';
13
+ import { useTranslation } from '../../hooks/useTranslation.esm.js';
14
+ import { capitalizeFirstLetter } from '../../utils/string-utils.esm.js';
12
15
 
13
16
  const getRefreshIcon = () => /* @__PURE__ */ jsx(CachedIcon, {});
14
17
  const getEditIcon = (isAllowed, roleName) => {
@@ -27,10 +30,18 @@ const PermissionsCard = ({
27
30
  entityReference,
28
31
  canReadUsersAndGroups
29
32
  }) => {
33
+ const { t } = useTranslation();
30
34
  const { data, loading, retry, error } = usePermissionPolicies(entityReference);
35
+ const locale = useLanguage();
31
36
  const [searchText, setSearchText] = useState();
37
+ const columns = useMemo(() => getColumns(t), [t]);
32
38
  const numberOfPolicies = useMemo(() => {
33
- const filteredPermissions = filterTableData({ data, columns, searchText });
39
+ const filteredPermissions = filterTableData({
40
+ data,
41
+ columns,
42
+ searchText,
43
+ locale
44
+ });
34
45
  let policies = 0;
35
46
  filteredPermissions.forEach((p) => {
36
47
  if (p.conditions) {
@@ -40,11 +51,11 @@ const PermissionsCard = ({
40
51
  policies += p.policies.filter((pol) => pol.effect === "allow").length;
41
52
  });
42
53
  return policies;
43
- }, [data, searchText]);
54
+ }, [data, searchText, columns, locale]);
44
55
  const actions = [
45
56
  {
46
57
  icon: getRefreshIcon,
47
- tooltip: "Refresh",
58
+ tooltip: t("common.refresh"),
48
59
  isFreeAction: true,
49
60
  onClick: () => {
50
61
  retry.permissionPoliciesRetry();
@@ -54,22 +65,24 @@ const PermissionsCard = ({
54
65
  },
55
66
  {
56
67
  icon: () => getEditIcon(canReadUsersAndGroups, entityReference),
57
- tooltip: canReadUsersAndGroups ? "Edit" : "Unauthorized to edit",
68
+ tooltip: canReadUsersAndGroups ? t("common.edit") : t("common.unauthorizedToEdit"),
58
69
  isFreeAction: true,
59
70
  onClick: () => {
60
71
  }
61
72
  }
62
73
  ];
63
- let title = "Permission Policies";
74
+ let title = t("permissionPolicies.permissionPolicies");
64
75
  if (!loading && data.length > 0) {
65
- title = `${numberOfPolicies} permission${numberOfPolicies !== 1 ? "s" : ""}`;
76
+ title = capitalizeFirstLetter(
77
+ `${numberOfPolicies} ${numberOfPolicies !== 1 ? t("permissionPolicies.permissions") : t("permissionPolicies.permission")}`
78
+ );
66
79
  }
67
80
  return /* @__PURE__ */ jsxs(Box, { children: [
68
81
  error?.name && error.name !== 404 && /* @__PURE__ */ jsx(Box, { style: { paddingBottom: "16px" }, children: /* @__PURE__ */ jsx(
69
82
  WarningPanel,
70
83
  {
71
84
  message: error?.message,
72
- title: "Something went wrong while fetching the permission policies",
85
+ title: t("errors.fetchPolicies"),
73
86
  severity: "error"
74
87
  }
75
88
  ) }),
@@ -87,10 +100,14 @@ const PermissionsCard = ({
87
100
  {
88
101
  "data-testid": "permission-table-empty",
89
102
  sx: { display: "flex", justifyContent: "center", p: 2 },
90
- children: "No records found"
103
+ children: t("common.noRecordsFound")
91
104
  }
92
105
  ),
93
- onSearchChange: setSearchText
106
+ onSearchChange: setSearchText,
107
+ localization: {
108
+ toolbar: { searchPlaceholder: t("table.searchPlaceholder") },
109
+ pagination: { labelRowsSelect: t("table.labelRowsSelect") }
110
+ }
94
111
  }
95
112
  ) })
96
113
  ] });
@@ -1 +1 @@
1
- {"version":3,"file":"PermissionsCard.esm.js","sources":["../../../src/components/RoleOverview/PermissionsCard.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 { parseEntityRef } from '@backstage/catalog-model';\nimport { Table, WarningPanel } from '@backstage/core-components';\n\nimport CachedIcon from '@mui/icons-material/Cached';\nimport Box from '@mui/material/Box';\n\nimport { usePermissionPolicies } from '../../hooks/usePermissionPolicies';\nimport { filterTableData } from '../../utils/filter-table-data';\nimport EditRole from '../EditRole';\nimport { columns } from './PermissionsListColumns';\nimport { StyledTableWrapper } from './StyledTableWrapper';\n\ntype PermissionsCardProps = {\n entityReference: string;\n canReadUsersAndGroups: boolean;\n};\n\nconst getRefreshIcon = () => <CachedIcon />;\nconst getEditIcon = (isAllowed: boolean, roleName: string) => {\n const { kind, name, namespace } = parseEntityRef(roleName);\n\n return (\n <EditRole\n dataTestId={isAllowed ? 'update-policies' : 'disable-update-policies'}\n canEdit={isAllowed}\n roleName={roleName}\n to={`../../role/${kind}/${namespace}/${name}?activeStep=${2}`}\n />\n );\n};\n\nexport const PermissionsCard = ({\n entityReference,\n canReadUsersAndGroups,\n}: PermissionsCardProps) => {\n const { data, loading, retry, error } =\n usePermissionPolicies(entityReference);\n const [searchText, setSearchText] = useState<string>();\n\n const numberOfPolicies = useMemo(() => {\n const filteredPermissions = filterTableData({ data, columns, searchText });\n let policies = 0;\n filteredPermissions.forEach(p => {\n if (p.conditions) {\n policies++;\n return;\n }\n policies += p.policies.filter(pol => pol.effect === 'allow').length;\n });\n return policies;\n }, [data, searchText]);\n\n const actions = [\n {\n icon: getRefreshIcon,\n tooltip: 'Refresh',\n isFreeAction: true,\n onClick: () => {\n retry.permissionPoliciesRetry();\n retry.policiesRetry();\n retry.conditionalPoliciesRetry();\n },\n },\n {\n icon: () => getEditIcon(canReadUsersAndGroups, entityReference),\n tooltip: canReadUsersAndGroups ? 'Edit' : 'Unauthorized to edit',\n isFreeAction: true,\n onClick: () => {},\n },\n ];\n\n let title = 'Permission Policies';\n if (!loading && data.length > 0) {\n title = `${numberOfPolicies} permission${numberOfPolicies !== 1 ? 's' : ''}`;\n }\n\n return (\n <Box>\n {error?.name && error.name !== 404 && (\n <Box style={{ paddingBottom: '16px' }}>\n <WarningPanel\n message={error?.message}\n title=\"Something went wrong while fetching the permission policies\"\n severity=\"error\"\n />\n </Box>\n )}\n <StyledTableWrapper>\n <Table\n title={title}\n actions={actions}\n options={{ padding: 'default', search: true, paging: true }}\n data={data}\n columns={columns}\n isLoading={loading}\n emptyContent={\n <Box\n data-testid=\"permission-table-empty\"\n sx={{ display: 'flex', justifyContent: 'center', p: 2 }}\n >\n No records found\n </Box>\n }\n onSearchChange={setSearchText}\n />\n </StyledTableWrapper>\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PermissionsCard.esm.js","sources":["../../../src/components/RoleOverview/PermissionsCard.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 { parseEntityRef } from '@backstage/catalog-model';\nimport { Table, WarningPanel } from '@backstage/core-components';\n\nimport CachedIcon from '@mui/icons-material/Cached';\nimport Box from '@mui/material/Box';\n\nimport { usePermissionPolicies } from '../../hooks/usePermissionPolicies';\nimport { filterTableData } from '../../utils/filter-table-data';\nimport EditRole from '../EditRole';\nimport { getColumns } from './PermissionsListColumns';\nimport { StyledTableWrapper } from './StyledTableWrapper';\nimport { useLanguage } from '../../hooks/useLanguage';\nimport { useTranslation } from '../../hooks/useTranslation';\nimport { capitalizeFirstLetter } from '../../utils/string-utils';\n\ntype PermissionsCardProps = {\n entityReference: string;\n canReadUsersAndGroups: boolean;\n};\n\nconst getRefreshIcon = () => <CachedIcon />;\nconst getEditIcon = (isAllowed: boolean, roleName: string) => {\n const { kind, name, namespace } = parseEntityRef(roleName);\n\n return (\n <EditRole\n dataTestId={isAllowed ? 'update-policies' : 'disable-update-policies'}\n canEdit={isAllowed}\n roleName={roleName}\n to={`../../role/${kind}/${namespace}/${name}?activeStep=${2}`}\n />\n );\n};\n\nexport const PermissionsCard = ({\n entityReference,\n canReadUsersAndGroups,\n}: PermissionsCardProps) => {\n const { t } = useTranslation();\n const { data, loading, retry, error } =\n usePermissionPolicies(entityReference);\n const locale = useLanguage();\n const [searchText, setSearchText] = useState<string>();\n\n const columns = useMemo(() => getColumns(t), [t]);\n\n const numberOfPolicies = useMemo(() => {\n const filteredPermissions = filterTableData({\n data,\n columns,\n searchText,\n locale,\n });\n let policies = 0;\n filteredPermissions.forEach(p => {\n if (p.conditions) {\n policies++;\n return;\n }\n policies += p.policies.filter(pol => pol.effect === 'allow').length;\n });\n return policies;\n }, [data, searchText, columns, locale]);\n\n const actions = [\n {\n icon: getRefreshIcon,\n tooltip: t('common.refresh'),\n isFreeAction: true,\n onClick: () => {\n retry.permissionPoliciesRetry();\n retry.policiesRetry();\n retry.conditionalPoliciesRetry();\n },\n },\n {\n icon: () => getEditIcon(canReadUsersAndGroups, entityReference),\n tooltip: canReadUsersAndGroups\n ? t('common.edit')\n : t('common.unauthorizedToEdit'),\n isFreeAction: true,\n onClick: () => {},\n },\n ];\n\n let title = t('permissionPolicies.permissionPolicies');\n if (!loading && data.length > 0) {\n title = capitalizeFirstLetter(\n `${numberOfPolicies} ${numberOfPolicies !== 1 ? t('permissionPolicies.permissions') : t('permissionPolicies.permission')}`,\n );\n }\n\n return (\n <Box>\n {error?.name && error.name !== 404 && (\n <Box style={{ paddingBottom: '16px' }}>\n <WarningPanel\n message={error?.message}\n title={t('errors.fetchPolicies')}\n severity=\"error\"\n />\n </Box>\n )}\n <StyledTableWrapper>\n <Table\n title={title}\n actions={actions}\n options={{ padding: 'default', search: true, paging: true }}\n data={data}\n columns={columns}\n isLoading={loading}\n emptyContent={\n <Box\n data-testid=\"permission-table-empty\"\n sx={{ display: 'flex', justifyContent: 'center', p: 2 }}\n >\n {t('common.noRecordsFound')}\n </Box>\n }\n onSearchChange={setSearchText}\n localization={{\n toolbar: { searchPlaceholder: t('table.searchPlaceholder') },\n pagination: { labelRowsSelect: t('table.labelRowsSelect') },\n }}\n />\n </StyledTableWrapper>\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1,43 +1,45 @@
1
1
  import { getRulesNumber } from '../../utils/create-role-utils.esm.js';
2
2
 
3
- const columns = [
4
- {
5
- title: "Plugin",
6
- field: "plugin",
7
- type: "string"
8
- },
9
- {
10
- title: "Permission",
11
- field: "permission",
12
- type: "string"
13
- },
14
- {
15
- title: "Policies",
16
- field: "policyString",
17
- type: "string",
18
- customSort: (a, b) => {
19
- if (a.policies.length === 0) {
20
- return -1;
3
+ const getColumns = (t) => {
4
+ return [
5
+ {
6
+ title: t("permissionPolicies.plugin"),
7
+ field: "plugin",
8
+ type: "string"
9
+ },
10
+ {
11
+ title: t("permissionPolicies.permission"),
12
+ field: "permission",
13
+ type: "string"
14
+ },
15
+ {
16
+ title: t("permissionPolicies.policies"),
17
+ field: "policyString",
18
+ type: "string",
19
+ customSort: (a, b) => {
20
+ if (a.policies.length === 0) {
21
+ return -1;
22
+ }
23
+ if (b.policies.length === 0) {
24
+ return 1;
25
+ }
26
+ if (a.policies.length === b.policies.length) {
27
+ return 0;
28
+ }
29
+ return a.policies.length < b.policies.length ? -1 : 1;
21
30
  }
22
- if (b.policies.length === 0) {
23
- return 1;
31
+ },
32
+ {
33
+ title: t("permissionPolicies.conditional"),
34
+ field: "conditions",
35
+ type: "string",
36
+ render: (permissionsData) => {
37
+ const totalRules = getRulesNumber(permissionsData.conditions);
38
+ return totalRules ? `${totalRules} ${totalRules > 1 ? t("permissionPolicies.rules") : t("permissionPolicies.rule")}` : "-";
24
39
  }
25
- if (a.policies.length === b.policies.length) {
26
- return 0;
27
- }
28
- return a.policies.length < b.policies.length ? -1 : 1;
29
- }
30
- },
31
- {
32
- title: "Conditional",
33
- field: "conditions",
34
- type: "string",
35
- render: (permissionsData) => {
36
- const totalRules = getRulesNumber(permissionsData.conditions);
37
- return totalRules ? `${totalRules} ${totalRules > 1 ? "rules" : "rule"}` : "-";
38
40
  }
39
- }
40
- ];
41
+ ];
42
+ };
41
43
 
42
- export { columns };
44
+ export { getColumns };
43
45
  //# sourceMappingURL=PermissionsListColumns.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PermissionsListColumns.esm.js","sources":["../../../src/components/RoleOverview/PermissionsListColumns.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 { TableColumn } from '@backstage/core-components';\n\nimport { PermissionsData } from '../../types';\nimport { getRulesNumber } from '../../utils/create-role-utils';\n\nexport const columns: TableColumn<PermissionsData>[] = [\n {\n title: 'Plugin',\n field: 'plugin',\n type: 'string',\n },\n {\n title: 'Permission',\n field: 'permission',\n type: 'string',\n },\n {\n title: 'Policies',\n field: 'policyString',\n type: 'string',\n customSort: (a, b) => {\n if (a.policies.length === 0) {\n return -1;\n }\n if (b.policies.length === 0) {\n return 1;\n }\n if (a.policies.length === b.policies.length) {\n return 0;\n }\n return a.policies.length < b.policies.length ? -1 : 1;\n },\n },\n {\n title: 'Conditional',\n field: 'conditions',\n type: 'string',\n render: (permissionsData: PermissionsData) => {\n const totalRules = getRulesNumber(permissionsData.conditions);\n return totalRules\n ? `${totalRules} ${totalRules > 1 ? 'rules' : 'rule'}`\n : '-';\n },\n },\n];\n"],"names":[],"mappings":";;AAoBO,MAAM,OAA0C,GAAA;AAAA,EACrD;AAAA,IACE,KAAO,EAAA,QAAA;AAAA,IACP,KAAO,EAAA,QAAA;AAAA,IACP,IAAM,EAAA;AAAA,GACR;AAAA,EACA;AAAA,IACE,KAAO,EAAA,YAAA;AAAA,IACP,KAAO,EAAA,YAAA;AAAA,IACP,IAAM,EAAA;AAAA,GACR;AAAA,EACA;AAAA,IACE,KAAO,EAAA,UAAA;AAAA,IACP,KAAO,EAAA,cAAA;AAAA,IACP,IAAM,EAAA,QAAA;AAAA,IACN,UAAA,EAAY,CAAC,CAAA,EAAG,CAAM,KAAA;AACpB,MAAI,IAAA,CAAA,CAAE,QAAS,CAAA,MAAA,KAAW,CAAG,EAAA;AAC3B,QAAO,OAAA,EAAA;AAAA;AAET,MAAI,IAAA,CAAA,CAAE,QAAS,CAAA,MAAA,KAAW,CAAG,EAAA;AAC3B,QAAO,OAAA,CAAA;AAAA;AAET,MAAA,IAAI,CAAE,CAAA,QAAA,CAAS,MAAW,KAAA,CAAA,CAAE,SAAS,MAAQ,EAAA;AAC3C,QAAO,OAAA,CAAA;AAAA;AAET,MAAA,OAAO,EAAE,QAAS,CAAA,MAAA,GAAS,CAAE,CAAA,QAAA,CAAS,SAAS,EAAK,GAAA,CAAA;AAAA;AACtD,GACF;AAAA,EACA;AAAA,IACE,KAAO,EAAA,aAAA;AAAA,IACP,KAAO,EAAA,YAAA;AAAA,IACP,IAAM,EAAA,QAAA;AAAA,IACN,MAAA,EAAQ,CAAC,eAAqC,KAAA;AAC5C,MAAM,MAAA,UAAA,GAAa,cAAe,CAAA,eAAA,CAAgB,UAAU,CAAA;AAC5D,MAAO,OAAA,UAAA,GACH,GAAG,UAAU,CAAA,CAAA,EAAI,aAAa,CAAI,GAAA,OAAA,GAAU,MAAM,CAClD,CAAA,GAAA,GAAA;AAAA;AACN;AAEJ;;;;"}
1
+ {"version":3,"file":"PermissionsListColumns.esm.js","sources":["../../../src/components/RoleOverview/PermissionsListColumns.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 { TableColumn } from '@backstage/core-components';\n\nimport { PermissionsData } from '../../types';\nimport { getRulesNumber } from '../../utils/create-role-utils';\nimport { TranslationFunction } from '@backstage/core-plugin-api/alpha';\nimport { rbacTranslationRef } from '../../translations';\n\nexport const getColumns = (\n t: TranslationFunction<typeof rbacTranslationRef.T>,\n): TableColumn<PermissionsData>[] => {\n return [\n {\n title: t('permissionPolicies.plugin'),\n field: 'plugin',\n type: 'string',\n },\n {\n title: t('permissionPolicies.permission'),\n field: 'permission',\n type: 'string',\n },\n {\n title: t('permissionPolicies.policies'),\n field: 'policyString',\n type: 'string',\n customSort: (a, b) => {\n if (a.policies.length === 0) {\n return -1;\n }\n if (b.policies.length === 0) {\n return 1;\n }\n if (a.policies.length === b.policies.length) {\n return 0;\n }\n return a.policies.length < b.policies.length ? -1 : 1;\n },\n },\n {\n title: t('permissionPolicies.conditional'),\n field: 'conditions',\n type: 'string',\n render: (permissionsData: PermissionsData) => {\n const totalRules = getRulesNumber(permissionsData.conditions);\n return totalRules\n ? `${totalRules} ${totalRules > 1 ? t('permissionPolicies.rules') : t('permissionPolicies.rule')}`\n : '-';\n },\n },\n ];\n};\n"],"names":[],"mappings":";;AAsBa,MAAA,UAAA,GAAa,CACxB,CACmC,KAAA;AACnC,EAAO,OAAA;AAAA,IACL;AAAA,MACE,KAAA,EAAO,EAAE,2BAA2B,CAAA;AAAA,MACpC,KAAO,EAAA,QAAA;AAAA,MACP,IAAM,EAAA;AAAA,KACR;AAAA,IACA;AAAA,MACE,KAAA,EAAO,EAAE,+BAA+B,CAAA;AAAA,MACxC,KAAO,EAAA,YAAA;AAAA,MACP,IAAM,EAAA;AAAA,KACR;AAAA,IACA;AAAA,MACE,KAAA,EAAO,EAAE,6BAA6B,CAAA;AAAA,MACtC,KAAO,EAAA,cAAA;AAAA,MACP,IAAM,EAAA,QAAA;AAAA,MACN,UAAA,EAAY,CAAC,CAAA,EAAG,CAAM,KAAA;AACpB,QAAI,IAAA,CAAA,CAAE,QAAS,CAAA,MAAA,KAAW,CAAG,EAAA;AAC3B,UAAO,OAAA,EAAA;AAAA;AAET,QAAI,IAAA,CAAA,CAAE,QAAS,CAAA,MAAA,KAAW,CAAG,EAAA;AAC3B,UAAO,OAAA,CAAA;AAAA;AAET,QAAA,IAAI,CAAE,CAAA,QAAA,CAAS,MAAW,KAAA,CAAA,CAAE,SAAS,MAAQ,EAAA;AAC3C,UAAO,OAAA,CAAA;AAAA;AAET,QAAA,OAAO,EAAE,QAAS,CAAA,MAAA,GAAS,CAAE,CAAA,QAAA,CAAS,SAAS,EAAK,GAAA,CAAA;AAAA;AACtD,KACF;AAAA,IACA;AAAA,MACE,KAAA,EAAO,EAAE,gCAAgC,CAAA;AAAA,MACzC,KAAO,EAAA,YAAA;AAAA,MACP,IAAM,EAAA,QAAA;AAAA,MACN,MAAA,EAAQ,CAAC,eAAqC,KAAA;AAC5C,QAAM,MAAA,UAAA,GAAa,cAAe,CAAA,eAAA,CAAgB,UAAU,CAAA;AAC5D,QAAA,OAAO,UACH,GAAA,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,UAAa,GAAA,CAAA,GAAI,CAAE,CAAA,0BAA0B,CAAI,GAAA,CAAA,CAAE,yBAAyB,CAAC,CAC9F,CAAA,GAAA,GAAA;AAAA;AACN;AACF,GACF;AACF;;;;"}
@@ -9,10 +9,12 @@ import { useToast } from '../ToastContext.esm.js';
9
9
  import { AboutCard } from './AboutCard.esm.js';
10
10
  import { MembersCard } from './MembersCard.esm.js';
11
11
  import { PermissionsCard } from './PermissionsCard.esm.js';
12
+ import { useTranslation } from '../../hooks/useTranslation.esm.js';
12
13
  import { RequirePermission } from '@backstage/plugin-permission-react';
13
14
  import { policyEntityReadPermission } from '@backstage-community/plugin-rbac-common';
14
15
 
15
16
  const RoleOverviewPage = () => {
17
+ const { t } = useTranslation();
16
18
  const { roleName, roleNamespace, roleKind } = useParams();
17
19
  const { toastMessage, setToastMessage } = useToast();
18
20
  const membersInfo = useMembers(`${roleKind}:${roleNamespace}/${roleName}`);
@@ -36,7 +38,7 @@ const RoleOverviewPage = () => {
36
38
  typeLink: ".."
37
39
  }
38
40
  ),
39
- /* @__PURE__ */ jsx(TabbedLayout, { children: /* @__PURE__ */ jsx(TabbedLayout.Route, { path: "", title: "Overview", children: /* @__PURE__ */ jsxs(Grid, { container: true, direction: "row", spacing: 2, children: [
41
+ /* @__PURE__ */ jsx(TabbedLayout, { children: /* @__PURE__ */ jsx(TabbedLayout.Route, { path: "", title: t("common.overview"), children: /* @__PURE__ */ jsxs(Grid, { container: true, direction: "row", spacing: 2, children: [
40
42
  /* @__PURE__ */ jsx(Grid, { item: true, lg: 12, xs: 12, children: /* @__PURE__ */ jsx(
41
43
  AboutCard,
42
44
  {
@@ -1 +1 @@
1
- {"version":3,"file":"RoleOverviewPage.esm.js","sources":["../../../src/components/RoleOverview/RoleOverviewPage.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 { useParams } from 'react-router-dom';\n\nimport { Header, Page, TabbedLayout } from '@backstage/core-components';\n\nimport Grid from '@mui/material/Grid';\n\nimport { useLocationToast } from '../../hooks/useLocationToast';\nimport { useMembers } from '../../hooks/useMembers';\nimport { SnackbarAlert } from '../SnackbarAlert';\nimport { useToast } from '../ToastContext';\nimport { AboutCard } from './AboutCard';\nimport { MembersCard } from './MembersCard';\nimport { PermissionsCard } from './PermissionsCard';\nimport { RequirePermission } from '@backstage/plugin-permission-react';\nimport { policyEntityReadPermission } from '@backstage-community/plugin-rbac-common';\n\nexport const RoleOverviewPage = () => {\n const { roleName, roleNamespace, roleKind } = useParams();\n const { toastMessage, setToastMessage } = useToast();\n const membersInfo = useMembers(`${roleKind}:${roleNamespace}/${roleName}`);\n\n useLocationToast(setToastMessage);\n\n const onAlertClose = () => {\n setToastMessage('');\n };\n\n return (\n <RequirePermission\n permission={policyEntityReadPermission}\n resourceRef={`${roleKind}:${roleNamespace}/${roleName}`}\n >\n <SnackbarAlert toastMessage={toastMessage} onAlertClose={onAlertClose} />\n <Page themeId=\"tool\">\n <Header\n title={`${roleKind}:${roleNamespace}/${roleName}`}\n type=\"RBAC\"\n typeLink=\"..\"\n />\n <TabbedLayout>\n <TabbedLayout.Route path=\"\" title=\"Overview\">\n <Grid container direction=\"row\" spacing={2}>\n <Grid item lg={12} xs={12}>\n <AboutCard\n roleName={`${roleKind}:${roleNamespace}/${roleName}`}\n />\n </Grid>\n <Grid item lg={6} xs={12}>\n <MembersCard\n roleName={`${roleKind}:${roleNamespace}/${roleName}`}\n membersInfo={membersInfo}\n />\n </Grid>\n <Grid item lg={6} xs={12}>\n <PermissionsCard\n entityReference={`${roleKind}:${roleNamespace}/${roleName}`}\n canReadUsersAndGroups={membersInfo.canReadUsersAndGroups}\n />\n </Grid>\n </Grid>\n </TabbedLayout.Route>\n </TabbedLayout>\n </Page>\n </RequirePermission>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;AA+BO,MAAM,mBAAmB,MAAM;AACpC,EAAA,MAAM,EAAE,QAAA,EAAU,aAAe,EAAA,QAAA,KAAa,SAAU,EAAA;AACxD,EAAA,MAAM,EAAE,YAAA,EAAc,eAAgB,EAAA,GAAI,QAAS,EAAA;AACnD,EAAM,MAAA,WAAA,GAAc,WAAW,CAAG,EAAA,QAAQ,IAAI,aAAa,CAAA,CAAA,EAAI,QAAQ,CAAE,CAAA,CAAA;AAEzE,EAAA,gBAAA,CAAiB,eAAe,CAAA;AAEhC,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,eAAA,CAAgB,EAAE,CAAA;AAAA,GACpB;AAEA,EACE,uBAAA,IAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACC,UAAY,EAAA,0BAAA;AAAA,MACZ,aAAa,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,aAAa,IAAI,QAAQ,CAAA,CAAA;AAAA,MAErD,QAAA,EAAA;AAAA,wBAAC,GAAA,CAAA,aAAA,EAAA,EAAc,cAA4B,YAA4B,EAAA,CAAA;AAAA,wBACvE,IAAA,CAAC,IAAK,EAAA,EAAA,OAAA,EAAQ,MACZ,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,OAAO,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,aAAa,IAAI,QAAQ,CAAA,CAAA;AAAA,cAC/C,IAAK,EAAA,MAAA;AAAA,cACL,QAAS,EAAA;AAAA;AAAA,WACX;AAAA,8BACC,YACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,YAAa,CAAA,KAAA,EAAb,EAAmB,IAAK,EAAA,EAAA,EAAG,KAAM,EAAA,UAAA,EAChC,+BAAC,IAAK,EAAA,EAAA,SAAA,EAAS,MAAC,SAAU,EAAA,KAAA,EAAM,SAAS,CACvC,EAAA,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAC,EAAI,EAAA,EAAA,EAAI,IAAI,EACrB,EAAA,QAAA,kBAAA,GAAA;AAAA,cAAC,SAAA;AAAA,cAAA;AAAA,gBACC,UAAU,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,aAAa,IAAI,QAAQ,CAAA;AAAA;AAAA,aAEtD,EAAA,CAAA;AAAA,gCACC,IAAK,EAAA,EAAA,IAAA,EAAI,MAAC,EAAI,EAAA,CAAA,EAAG,IAAI,EACpB,EAAA,QAAA,kBAAA,GAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBACC,UAAU,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,aAAa,IAAI,QAAQ,CAAA,CAAA;AAAA,gBAClD;AAAA;AAAA,aAEJ,EAAA,CAAA;AAAA,gCACC,IAAK,EAAA,EAAA,IAAA,EAAI,MAAC,EAAI,EAAA,CAAA,EAAG,IAAI,EACpB,EAAA,QAAA,kBAAA,GAAA;AAAA,cAAC,eAAA;AAAA,cAAA;AAAA,gBACC,iBAAiB,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,aAAa,IAAI,QAAQ,CAAA,CAAA;AAAA,gBACzD,uBAAuB,WAAY,CAAA;AAAA;AAAA,aAEvC,EAAA;AAAA,WAAA,EACF,GACF,CACF,EAAA;AAAA,SACF,EAAA;AAAA;AAAA;AAAA,GACF;AAEJ;;;;"}
1
+ {"version":3,"file":"RoleOverviewPage.esm.js","sources":["../../../src/components/RoleOverview/RoleOverviewPage.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 { useParams } from 'react-router-dom';\n\nimport { Header, Page, TabbedLayout } from '@backstage/core-components';\n\nimport Grid from '@mui/material/Grid';\n\nimport { useLocationToast } from '../../hooks/useLocationToast';\nimport { useMembers } from '../../hooks/useMembers';\nimport { SnackbarAlert } from '../SnackbarAlert';\nimport { useToast } from '../ToastContext';\nimport { AboutCard } from './AboutCard';\nimport { MembersCard } from './MembersCard';\nimport { PermissionsCard } from './PermissionsCard';\nimport { useTranslation } from '../../hooks/useTranslation';\nimport { RequirePermission } from '@backstage/plugin-permission-react';\nimport { policyEntityReadPermission } from '@backstage-community/plugin-rbac-common';\n\nexport const RoleOverviewPage = () => {\n const { t } = useTranslation();\n const { roleName, roleNamespace, roleKind } = useParams();\n const { toastMessage, setToastMessage } = useToast();\n const membersInfo = useMembers(`${roleKind}:${roleNamespace}/${roleName}`);\n\n useLocationToast(setToastMessage);\n\n const onAlertClose = () => {\n setToastMessage('');\n };\n\n return (\n <RequirePermission\n permission={policyEntityReadPermission}\n resourceRef={`${roleKind}:${roleNamespace}/${roleName}`}\n >\n <SnackbarAlert toastMessage={toastMessage} onAlertClose={onAlertClose} />\n <Page themeId=\"tool\">\n <Header\n title={`${roleKind}:${roleNamespace}/${roleName}`}\n type=\"RBAC\"\n typeLink=\"..\"\n />\n <TabbedLayout>\n <TabbedLayout.Route path=\"\" title={t('common.overview')}>\n <Grid container direction=\"row\" spacing={2}>\n <Grid item lg={12} xs={12}>\n <AboutCard\n roleName={`${roleKind}:${roleNamespace}/${roleName}`}\n />\n </Grid>\n <Grid item lg={6} xs={12}>\n <MembersCard\n roleName={`${roleKind}:${roleNamespace}/${roleName}`}\n membersInfo={membersInfo}\n />\n </Grid>\n <Grid item lg={6} xs={12}>\n <PermissionsCard\n entityReference={`${roleKind}:${roleNamespace}/${roleName}`}\n canReadUsersAndGroups={membersInfo.canReadUsersAndGroups}\n />\n </Grid>\n </Grid>\n </TabbedLayout.Route>\n </TabbedLayout>\n </Page>\n </RequirePermission>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAgCO,MAAM,mBAAmB,MAAM;AACpC,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA;AAC7B,EAAA,MAAM,EAAE,QAAA,EAAU,aAAe,EAAA,QAAA,KAAa,SAAU,EAAA;AACxD,EAAA,MAAM,EAAE,YAAA,EAAc,eAAgB,EAAA,GAAI,QAAS,EAAA;AACnD,EAAM,MAAA,WAAA,GAAc,WAAW,CAAG,EAAA,QAAQ,IAAI,aAAa,CAAA,CAAA,EAAI,QAAQ,CAAE,CAAA,CAAA;AAEzE,EAAA,gBAAA,CAAiB,eAAe,CAAA;AAEhC,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,eAAA,CAAgB,EAAE,CAAA;AAAA,GACpB;AAEA,EACE,uBAAA,IAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACC,UAAY,EAAA,0BAAA;AAAA,MACZ,aAAa,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,aAAa,IAAI,QAAQ,CAAA,CAAA;AAAA,MAErD,QAAA,EAAA;AAAA,wBAAC,GAAA,CAAA,aAAA,EAAA,EAAc,cAA4B,YAA4B,EAAA,CAAA;AAAA,wBACvE,IAAA,CAAC,IAAK,EAAA,EAAA,OAAA,EAAQ,MACZ,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,OAAO,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,aAAa,IAAI,QAAQ,CAAA,CAAA;AAAA,cAC/C,IAAK,EAAA,MAAA;AAAA,cACL,QAAS,EAAA;AAAA;AAAA,WACX;AAAA,8BACC,YACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,aAAa,KAAb,EAAA,EAAmB,MAAK,EAAG,EAAA,KAAA,EAAO,EAAE,iBAAiB,CAAA,EACpD,+BAAC,IAAK,EAAA,EAAA,SAAA,EAAS,MAAC,SAAU,EAAA,KAAA,EAAM,SAAS,CACvC,EAAA,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAC,EAAI,EAAA,EAAA,EAAI,IAAI,EACrB,EAAA,QAAA,kBAAA,GAAA;AAAA,cAAC,SAAA;AAAA,cAAA;AAAA,gBACC,UAAU,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,aAAa,IAAI,QAAQ,CAAA;AAAA;AAAA,aAEtD,EAAA,CAAA;AAAA,gCACC,IAAK,EAAA,EAAA,IAAA,EAAI,MAAC,EAAI,EAAA,CAAA,EAAG,IAAI,EACpB,EAAA,QAAA,kBAAA,GAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBACC,UAAU,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,aAAa,IAAI,QAAQ,CAAA,CAAA;AAAA,gBAClD;AAAA;AAAA,aAEJ,EAAA,CAAA;AAAA,gCACC,IAAK,EAAA,EAAA,IAAA,EAAI,MAAC,EAAI,EAAA,CAAA,EAAG,IAAI,EACpB,EAAA,QAAA,kBAAA,GAAA;AAAA,cAAC,eAAA;AAAA,cAAA;AAAA,gBACC,iBAAiB,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,aAAa,IAAI,QAAQ,CAAA,CAAA;AAAA,gBACzD,uBAAuB,WAAY,CAAA;AAAA;AAAA,aAEvC,EAAA;AAAA,WAAA,EACF,GACF,CACF,EAAA;AAAA,SACF,EAAA;AAAA;AAAA;AAAA,GACF;AAEJ;;;;"}
@@ -5,6 +5,7 @@ import Tooltip from '@mui/material/Tooltip';
5
5
  import { policyEntityDeletePermission } from '@backstage-community/plugin-rbac-common';
6
6
  import { useActionPermissionTooltip } from '../../hooks/useActionPermissionTooltip.esm.js';
7
7
  import { useDeleteDialog } from '../DeleteDialogContext.esm.js';
8
+ import { useTranslation } from '../../hooks/useTranslation.esm.js';
8
9
 
9
10
  const DeleteRole = ({
10
11
  roleName,
@@ -12,6 +13,7 @@ const DeleteRole = ({
12
13
  dataTestId,
13
14
  tooltip
14
15
  }) => {
16
+ const { t } = useTranslation();
15
17
  const { setDeleteComponent, setOpenDialog } = useDeleteDialog();
16
18
  const openDialog = (name) => {
17
19
  setDeleteComponent({ roleName: name });
@@ -30,9 +32,9 @@ const DeleteRole = ({
30
32
  {
31
33
  onClick: () => openDialog(roleName),
32
34
  "data-testid": testIdText,
33
- "aria-label": "Delete",
35
+ "aria-label": t("common.delete"),
34
36
  disabled: disable,
35
- title: tooltip ?? "Delete Role",
37
+ title: tooltip ?? t("common.deleteRole"),
36
38
  sx: {
37
39
  p: 1,
38
40
  borderRadius: "50%",
@@ -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 */\n\nimport Delete from '@mui/icons-material/Delete';\nimport IconButton from '@mui/material/IconButton';\nimport Tooltip from '@mui/material/Tooltip';\nimport { policyEntityDeletePermission } from '@backstage-community/plugin-rbac-common';\nimport { useActionPermissionTooltip } from '../../hooks/useActionPermissionTooltip';\nimport { useDeleteDialog } from '../DeleteDialogContext';\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 { disable, tooltipText, testIdText } = useActionPermissionTooltip({\n permission: policyEntityDeletePermission,\n resourceRef: roleName,\n canAct: canEdit,\n action: 'delete',\n dataTestId: dataTestId,\n fallbackTooltip: tooltip,\n });\n\n return (\n <Tooltip title={tooltipText}>\n <IconButton\n onClick={() => openDialog(roleName)}\n data-testid={testIdText}\n aria-label=\"Delete\"\n disabled={disable}\n title={tooltip ?? 'Delete Role'}\n sx={{\n p: 1,\n borderRadius: '50%',\n '&:hover': { borderRadius: '50%' },\n }}\n >\n <Delete />\n </IconButton>\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,EAAE,OAAA,EAAS,WAAa,EAAA,UAAA,KAAe,0BAA2B,CAAA;AAAA,IACtE,UAAY,EAAA,4BAAA;AAAA,IACZ,WAAa,EAAA,QAAA;AAAA,IACb,MAAQ,EAAA,OAAA;AAAA,IACR,MAAQ,EAAA,QAAA;AAAA,IACR,UAAA;AAAA,IACA,eAAiB,EAAA;AAAA,GAClB,CAAA;AAED,EACE,uBAAA,GAAA,CAAC,OAAQ,EAAA,EAAA,KAAA,EAAO,WACd,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,MAAM,UAAA,CAAW,QAAQ,CAAA;AAAA,MAClC,aAAa,EAAA,UAAA;AAAA,MACb,YAAW,EAAA,QAAA;AAAA,MACX,QAAU,EAAA,OAAA;AAAA,MACV,OAAO,OAAW,IAAA,aAAA;AAAA,MAClB,EAAI,EAAA;AAAA,QACF,CAAG,EAAA,CAAA;AAAA,QACH,YAAc,EAAA,KAAA;AAAA,QACd,SAAA,EAAW,EAAE,YAAA,EAAc,KAAM;AAAA,OACnC;AAAA,MAEA,8BAAC,MAAO,EAAA,EAAA;AAAA;AAAA,GAEZ,EAAA,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 */\n\nimport Delete from '@mui/icons-material/Delete';\nimport IconButton from '@mui/material/IconButton';\nimport Tooltip from '@mui/material/Tooltip';\nimport { policyEntityDeletePermission } from '@backstage-community/plugin-rbac-common';\nimport { useActionPermissionTooltip } from '../../hooks/useActionPermissionTooltip';\nimport { useDeleteDialog } from '../DeleteDialogContext';\nimport { useTranslation } from '../../hooks/useTranslation';\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 { t } = useTranslation();\n const { setDeleteComponent, setOpenDialog } = useDeleteDialog();\n\n const openDialog = (name: string) => {\n setDeleteComponent({ roleName: name });\n setOpenDialog(true);\n };\n\n const { disable, tooltipText, testIdText } = useActionPermissionTooltip({\n permission: policyEntityDeletePermission,\n resourceRef: roleName,\n canAct: canEdit,\n action: 'delete',\n dataTestId: dataTestId,\n fallbackTooltip: tooltip,\n });\n\n return (\n <Tooltip title={tooltipText}>\n <IconButton\n onClick={() => openDialog(roleName)}\n data-testid={testIdText}\n aria-label={t('common.delete')}\n disabled={disable}\n title={tooltip ?? t('common.deleteRole')}\n sx={{\n p: 1,\n borderRadius: '50%',\n '&:hover': { borderRadius: '50%' },\n }}\n >\n <Delete />\n </IconButton>\n </Tooltip>\n );\n};\nexport default DeleteRole;\n"],"names":[],"mappings":";;;;;;;;;AA+BA,MAAM,aAAa,CAAC;AAAA,EAClB,QAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAuB,KAAA;AACrB,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA;AAC7B,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,EAAE,OAAA,EAAS,WAAa,EAAA,UAAA,KAAe,0BAA2B,CAAA;AAAA,IACtE,UAAY,EAAA,4BAAA;AAAA,IACZ,WAAa,EAAA,QAAA;AAAA,IACb,MAAQ,EAAA,OAAA;AAAA,IACR,MAAQ,EAAA,QAAA;AAAA,IACR,UAAA;AAAA,IACA,eAAiB,EAAA;AAAA,GAClB,CAAA;AAED,EACE,uBAAA,GAAA,CAAC,OAAQ,EAAA,EAAA,KAAA,EAAO,WACd,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,MAAM,UAAA,CAAW,QAAQ,CAAA;AAAA,MAClC,aAAa,EAAA,UAAA;AAAA,MACb,YAAA,EAAY,EAAE,eAAe,CAAA;AAAA,MAC7B,QAAU,EAAA,OAAA;AAAA,MACV,KAAA,EAAO,OAAW,IAAA,CAAA,CAAE,mBAAmB,CAAA;AAAA,MACvC,EAAI,EAAA;AAAA,QACF,CAAG,EAAA,CAAA;AAAA,QACH,YAAc,EAAA,KAAA;AAAA,QACd,SAAA,EAAW,EAAE,YAAA,EAAc,KAAM;AAAA,OACnC;AAAA,MAEA,8BAAC,MAAO,EAAA,EAAA;AAAA;AAAA,GAEZ,EAAA,CAAA;AAEJ;;;;"}