@backstage-community/plugin-rbac 1.43.0 → 1.45.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/dist/alpha.d.ts +179 -0
- package/dist/alpha.esm.js +3 -0
- package/dist/alpha.esm.js.map +1 -0
- package/dist/components/ConditionalAccess/AddNestedConditionButton.esm.js +13 -9
- package/dist/components/ConditionalAccess/AddNestedConditionButton.esm.js.map +1 -1
- package/dist/components/ConditionalAccess/ComplexConditionRow.esm.js +3 -1
- package/dist/components/ConditionalAccess/ComplexConditionRow.esm.js.map +1 -1
- package/dist/components/ConditionalAccess/ComplexConditionRowButtons.esm.js +5 -3
- package/dist/components/ConditionalAccess/ComplexConditionRowButtons.esm.js.map +1 -1
- package/dist/components/ConditionalAccess/ConditionalAccessSidebar.esm.js +5 -3
- package/dist/components/ConditionalAccess/ConditionalAccessSidebar.esm.js.map +1 -1
- package/dist/components/ConditionalAccess/ConditionsFormRow.esm.js +7 -5
- package/dist/components/ConditionalAccess/ConditionsFormRow.esm.js.map +1 -1
- package/dist/components/ConditionalAccess/ConditionsFormRowFields.esm.js +4 -2
- package/dist/components/ConditionalAccess/ConditionsFormRowFields.esm.js.map +1 -1
- package/dist/components/ConditionalAccess/const.esm.js +6 -12
- package/dist/components/ConditionalAccess/const.esm.js.map +1 -1
- package/dist/components/CreateRole/AddMembersForm.esm.js +25 -19
- package/dist/components/CreateRole/AddMembersForm.esm.js.map +1 -1
- package/dist/components/CreateRole/AddedMembersTable.esm.js +10 -4
- package/dist/components/CreateRole/AddedMembersTable.esm.js.map +1 -1
- package/dist/components/CreateRole/AddedMembersTableColumn.esm.js +30 -28
- package/dist/components/CreateRole/AddedMembersTableColumn.esm.js.map +1 -1
- package/dist/components/CreateRole/CancelDialog.esm.js +8 -9
- package/dist/components/CreateRole/CancelDialog.esm.js.map +1 -1
- package/dist/components/CreateRole/CreateRolePage.esm.js +8 -6
- package/dist/components/CreateRole/CreateRolePage.esm.js.map +1 -1
- package/dist/components/CreateRole/EditRolePage.esm.js +9 -7
- package/dist/components/CreateRole/EditRolePage.esm.js.map +1 -1
- package/dist/components/CreateRole/PermissionPoliciesForm.esm.js +9 -3
- package/dist/components/CreateRole/PermissionPoliciesForm.esm.js.map +1 -1
- package/dist/components/CreateRole/PermissionPoliciesFormNestedRow.esm.js +6 -2
- package/dist/components/CreateRole/PermissionPoliciesFormNestedRow.esm.js.map +1 -1
- package/dist/components/CreateRole/PermissionPoliciesFormRow.esm.js +8 -4
- package/dist/components/CreateRole/PermissionPoliciesFormRow.esm.js.map +1 -1
- package/dist/components/CreateRole/PermissionPoliciesFormTable.esm.js +11 -6
- package/dist/components/CreateRole/PermissionPoliciesFormTable.esm.js.map +1 -1
- package/dist/components/CreateRole/PluginsDropdown.esm.js +4 -2
- package/dist/components/CreateRole/PluginsDropdown.esm.js.map +1 -1
- package/dist/components/CreateRole/ReviewStep.esm.js +9 -7
- package/dist/components/CreateRole/ReviewStep.esm.js.map +1 -1
- package/dist/components/CreateRole/RoleDetailsForm.esm.js +8 -6
- package/dist/components/CreateRole/RoleDetailsForm.esm.js.map +1 -1
- package/dist/components/CreateRole/RoleForm.esm.js +27 -23
- package/dist/components/CreateRole/RoleForm.esm.js.map +1 -1
- package/dist/components/CreateRole/SelectedPermissionPoliciesColumn.esm.js +24 -22
- package/dist/components/CreateRole/SelectedPermissionPoliciesColumn.esm.js.map +1 -1
- package/dist/components/DownloadUserStatistics.esm.js +4 -2
- package/dist/components/DownloadUserStatistics.esm.js.map +1 -1
- package/dist/components/EditRole.esm.js +4 -2
- package/dist/components/EditRole.esm.js.map +1 -1
- package/dist/components/RbacPage.esm.js +4 -2
- package/dist/components/RbacPage.esm.js.map +1 -1
- package/dist/components/RoleOverview/AboutCard.esm.js +12 -8
- package/dist/components/RoleOverview/AboutCard.esm.js.map +1 -1
- package/dist/components/RoleOverview/MembersCard.esm.js +18 -9
- package/dist/components/RoleOverview/MembersCard.esm.js.map +1 -1
- package/dist/components/RoleOverview/MembersListColumns.esm.js +42 -40
- package/dist/components/RoleOverview/MembersListColumns.esm.js.map +1 -1
- package/dist/components/RoleOverview/PermissionsCard.esm.js +27 -10
- package/dist/components/RoleOverview/PermissionsCard.esm.js.map +1 -1
- package/dist/components/RoleOverview/PermissionsListColumns.esm.js +38 -36
- package/dist/components/RoleOverview/PermissionsListColumns.esm.js.map +1 -1
- package/dist/components/RoleOverview/RoleOverviewPage.esm.js +3 -1
- package/dist/components/RoleOverview/RoleOverviewPage.esm.js.map +1 -1
- package/dist/components/RolesList/DeleteRole.esm.js +4 -2
- package/dist/components/RolesList/DeleteRole.esm.js.map +1 -1
- package/dist/components/RolesList/DeleteRoleDialog.esm.js +23 -38
- package/dist/components/RolesList/DeleteRoleDialog.esm.js.map +1 -1
- package/dist/components/RolesList/RolesList.esm.js +19 -9
- package/dist/components/RolesList/RolesList.esm.js.map +1 -1
- package/dist/components/RolesList/RolesListColumns.esm.js +63 -61
- package/dist/components/RolesList/RolesListColumns.esm.js.map +1 -1
- package/dist/components/RolesList/RolesListToolbar.esm.js +20 -10
- package/dist/components/RolesList/RolesListToolbar.esm.js.map +1 -1
- package/dist/components/Router.esm.js +4 -2
- package/dist/components/Router.esm.js.map +1 -1
- package/dist/components/Trans.esm.js +22 -0
- package/dist/components/Trans.esm.js.map +1 -0
- package/dist/hooks/useActionPermissionTooltip.esm.js +10 -5
- package/dist/hooks/useActionPermissionTooltip.esm.js.map +1 -1
- package/dist/hooks/useLanguage.esm.js +7 -0
- package/dist/hooks/useLanguage.esm.js.map +1 -0
- package/dist/hooks/useMembers.esm.js +16 -8
- package/dist/hooks/useMembers.esm.js.map +1 -1
- package/dist/hooks/usePermissionPolicies.esm.js +20 -9
- package/dist/hooks/usePermissionPolicies.esm.js.map +1 -1
- package/dist/hooks/useTranslation.esm.js +8 -0
- package/dist/hooks/useTranslation.esm.js.map +1 -0
- package/dist/translations/de.esm.js +176 -0
- package/dist/translations/de.esm.js.map +1 -0
- package/dist/translations/es.esm.js +176 -0
- package/dist/translations/es.esm.js.map +1 -0
- package/dist/translations/fr.esm.js +176 -0
- package/dist/translations/fr.esm.js.map +1 -0
- package/dist/translations/index.esm.js +15 -0
- package/dist/translations/index.esm.js.map +1 -0
- package/dist/translations/it.esm.js +176 -0
- package/dist/translations/it.esm.js.map +1 -0
- package/dist/translations/ref.esm.js +215 -0
- package/dist/translations/ref.esm.js.map +1 -0
- package/dist/utils/conditional-access-utils.esm.js +4 -4
- package/dist/utils/conditional-access-utils.esm.js.map +1 -1
- package/dist/utils/create-role-utils.esm.js +11 -11
- package/dist/utils/create-role-utils.esm.js.map +1 -1
- package/dist/utils/filter-table-data.esm.js +4 -3
- package/dist/utils/filter-table-data.esm.js.map +1 -1
- package/dist/utils/rbac-utils.esm.js +23 -19
- package/dist/utils/rbac-utils.esm.js.map +1 -1
- package/dist/utils/role-form-utils.esm.js +17 -12
- package/dist/utils/role-form-utils.esm.js.map +1 -1
- package/dist/utils/string-utils.esm.js +2 -2
- package/dist/utils/string-utils.esm.js.map +1 -1
- package/package.json +34 -20
|
@@ -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 {
|
|
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: "
|
|
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 ? "
|
|
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: "
|
|
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)}` : "
|
|
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: "
|
|
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 {
|
|
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":";;;;;;;;;;;;;;AAqCA,MAAM,cAAA,GAAiB,sBAAM,GAAA,CAAC,UAAW,EAAA,EAAA,CAAA;AACzC,MAAM,WAAA,GAAc,CAAC,SAAA,EAAoB,QAAqB,KAAA;AAC5D,EAAA,MAAM,EAAE,IAAM,EAAA,IAAA,EAAM,SAAU,EAAA,GAAI,eAAe,QAAQ,CAAA;AAEzD,EACE,uBAAA,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,UAAA,EAAY,YAAY,gBAAmB,GAAA,wBAAA;AAAA,MAC3C,OAAS,EAAA,SAAA;AAAA,MACT,QAAA;AAAA,MACA,EAAA,EAAI,cAAc,IAAI,CAAA,CAAA,EAAI,SAAS,CAAI,CAAA,EAAA,IAAI,eAAe,CAAC,CAAA;AAAA;AAAA,GAC7D;AAEJ,CAAA;AAEO,MAAM,WAAc,GAAA,CAAC,EAAE,QAAA,EAAU,aAAoC,KAAA;AAC1E,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA;AAC7B,EAAA,MAAM,SAAS,WAAY,EAAA;AAC3B,EAAA,MAAM,EAAE,IAAM,EAAA,OAAA,EAAS,KAAO,EAAA,KAAA,EAAO,uBAA0B,GAAA,WAAA;AAC/D,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,QAAiB,EAAA;AAErD,EAAA,MAAM,OAAU,GAAA;AAAA,IACd;AAAA,MACE,IAAM,EAAA,cAAA;AAAA,MACN,OAAA,EAAS,EAAE,gBAAgB,CAAA;AAAA,MAC3B,YAAc,EAAA,IAAA;AAAA,MACd,SAAS,MAAM;AACb,QAAA,KAAA,CAAM,SAAU,EAAA;AAChB,QAAA,KAAA,CAAM,YAAa,EAAA;AAAA;AACrB,KACF;AAAA,IACA;AAAA,MACE,IAAM,EAAA,MAAM,WAAY,CAAA,qBAAA,EAAuB,QAAQ,CAAA;AAAA,MACvD,SAAS,qBACL,GAAA,CAAA,CAAE,aAAa,CAAA,GACf,EAAE,2BAA2B,CAAA;AAAA,MACjC,YAAc,EAAA,IAAA;AAAA,MACd,SAAS,MAAM;AAAA;AAAC;AAClB,GACF;AACA,EAAM,MAAA,OAAA,GAAU,QAAQ,MAAM,UAAA,CAAW,CAAC,CAAG,EAAA,CAAC,CAAC,CAAC,CAAA;AAChD,EAAA,MAAM,YAAe,GAAA,OAAA;AAAA,IACnB,MAAM,eAAgB,CAAA,EAAE,MAAM,OAAS,EAAA,UAAA,EAAY,QAAQ,CAAA;AAAA,IAC3D,CAAC,IAAA,EAAM,UAAY,EAAA,MAAA,EAAQ,OAAO;AAAA,GACpC;AAEA,EAAA,4BACG,GACE,EAAA,EAAA,QAAA,EAAA;AAAA,IAAC,CAAA,OAAA,IAAW,yBACV,GAAA,CAAA,GAAA,EAAA,EAAI,OAAO,EAAE,aAAA,EAAe,QAC3B,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAU,KAAiB,EAAA,OAAA,IAAY,KAAiB,EAAA,IAAA;AAAA,QACxD,KAAA,EAAO,EAAE,4BAA4B,CAAA;AAAA,QACrC,QAAS,EAAA;AAAA;AAAA,KAEb,EAAA,CAAA;AAAA,wBAED,kBACC,EAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KACE,EAAA,CAAC,OAAW,IAAA,IAAA,EAAM,MACd,GAAA,CAAA,EAAG,UAAW,CAAA,YAAA,EAAc,CAAC,CAAC,CAC9B,CAAA,GAAA,CAAA,CAAE,8BAA8B,CAAA;AAAA,QAEtC,OAAA;AAAA,QACA,SAAS,EAAE,OAAA,EAAS,WAAW,MAAQ,EAAA,IAAA,EAAM,QAAQ,IAAK,EAAA;AAAA,QAC1D,IAAA,EAAM,QAAQ,EAAC;AAAA,QACf,SAAW,EAAA,OAAA;AAAA,QACX,OAAA,EAAS,WAAW,CAAC,CAAA;AAAA,QACrB,YACE,kBAAA,GAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,aAAY,EAAA,qBAAA;AAAA,YACZ,IAAI,EAAE,OAAA,EAAS,QAAQ,cAAgB,EAAA,QAAA,EAAU,GAAG,CAAE,EAAA;AAAA,YAErD,YAAE,uBAAuB;AAAA;AAAA,SAC5B;AAAA,QAEF,YAAc,EAAA;AAAA,UACZ,OAAS,EAAA,EAAE,iBAAmB,EAAA,CAAA,CAAE,yBAAyB,CAAE,EAAA;AAAA,UAC3D,UAAY,EAAA,EAAE,eAAiB,EAAA,CAAA,CAAE,uBAAuB,CAAE;AAAA,SAC5D;AAAA,QACA,cAAgB,EAAA;AAAA;AAAA,KAEpB,EAAA;AAAA,GACF,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1,48 +1,50 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { Link } from '@backstage/core-components';
|
|
3
3
|
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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 {
|
|
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
|
|
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 {
|
|
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({
|
|
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: "
|
|
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 ? "
|
|
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 = "
|
|
74
|
+
let title = t("permissionPolicies.permissionPolicies");
|
|
64
75
|
if (!loading && data.length > 0) {
|
|
65
|
-
title =
|
|
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: "
|
|
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: "
|
|
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 {
|
|
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
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
23
|
-
|
|
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 {
|
|
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
|
|
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: "
|
|
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
|
|
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": "
|
|
35
|
+
"aria-label": t("common.delete"),
|
|
34
36
|
disabled: disable,
|
|
35
|
-
title: tooltip ?? "
|
|
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
|
|
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;;;;"}
|