@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
|
@@ -13,6 +13,8 @@ import ArrowRightIcon from '@mui/icons-material/KeyboardArrowRight';
|
|
|
13
13
|
import ArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';
|
|
14
14
|
import PermissionPoliciesFormNestedRow from './PermissionPoliciesFormNestedRow.esm.js';
|
|
15
15
|
import Link from '@mui/material/Link';
|
|
16
|
+
import { useTranslation } from '../../hooks/useTranslation.esm.js';
|
|
17
|
+
import { useLanguage } from '../../hooks/useLanguage.esm.js';
|
|
16
18
|
|
|
17
19
|
const PermissionPoliciesFormRow = ({
|
|
18
20
|
rowData,
|
|
@@ -25,6 +27,8 @@ const PermissionPoliciesFormRow = ({
|
|
|
25
27
|
onRemovePlugin,
|
|
26
28
|
onAddConditions
|
|
27
29
|
}) => {
|
|
30
|
+
const { t } = useTranslation();
|
|
31
|
+
const locale = useLanguage();
|
|
28
32
|
const [currentOpen, setCurrentOpen] = useState(false);
|
|
29
33
|
useEffect(() => {
|
|
30
34
|
setCurrentOpen(open);
|
|
@@ -44,9 +48,9 @@ const PermissionPoliciesFormRow = ({
|
|
|
44
48
|
};
|
|
45
49
|
const getPermissionCellLabel = (plugin) => {
|
|
46
50
|
if (permissionPoliciesRows.find((ppr) => ppr.plugin === plugin)) {
|
|
47
|
-
return "
|
|
51
|
+
return t("common.editCell");
|
|
48
52
|
}
|
|
49
|
-
return "
|
|
53
|
+
return t("common.selectCell");
|
|
50
54
|
};
|
|
51
55
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
52
56
|
/* @__PURE__ */ jsxs(TableRow, { children: [
|
|
@@ -64,7 +68,7 @@ const PermissionPoliciesFormRow = ({
|
|
|
64
68
|
/* @__PURE__ */ jsx(
|
|
65
69
|
IconButton,
|
|
66
70
|
{
|
|
67
|
-
"aria-label": "
|
|
71
|
+
"aria-label": t("common.expandRow"),
|
|
68
72
|
size: "small",
|
|
69
73
|
onClick: () => setCurrentOpen(!currentOpen),
|
|
70
74
|
"data-testid": `expand-row-${rowData.plugin}`,
|
|
@@ -90,7 +94,7 @@ const PermissionPoliciesFormRow = ({
|
|
|
90
94
|
/* @__PURE__ */ jsx(TableCell, { align: "right", sx: { borderBottom: "none" }, children: /* @__PURE__ */ jsx(
|
|
91
95
|
IconButton,
|
|
92
96
|
{
|
|
93
|
-
"aria-label": "remove",
|
|
97
|
+
"aria-label": t("common.remove").toLocaleLowerCase(locale ?? "en"),
|
|
94
98
|
size: "small",
|
|
95
99
|
onClick: () => onRemovePlugin(rowData.plugin),
|
|
96
100
|
children: /* @__PURE__ */ jsx(Delete, {})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PermissionPoliciesFormRow.esm.js","sources":["../../../src/components/CreateRole/PermissionPoliciesFormRow.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 type { SetStateAction, Dispatch } from 'react';\n\nimport { useState, useEffect } from 'react';\n\nimport IconButton from '@mui/material/IconButton';\nimport { PermissionsData } from '../../types';\nimport { getRulesNumber } from '../../utils/create-role-utils';\nimport { ConditionRulesData, ConditionsData } from '../ConditionalAccess/types';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\nimport Collapse from '@mui/material/Collapse';\nimport Box from '@mui/material/Box';\nimport Table from '@mui/material/Table';\nimport TableBody from '@mui/material/TableBody';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport ArrowRightIcon from '@mui/icons-material/KeyboardArrowRight';\nimport ArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport PermissionPoliciesFormNestedRow from './PermissionPoliciesFormNestedRow';\nimport Link from '@mui/material/Link';\n\ntype PermissionPoliciesFormRowProps = {\n rowData: any;\n conditionRulesData?: ConditionRulesData;\n permissionPoliciesRows: PermissionsData[];\n open: boolean;\n onSelectPermission: (\n plugin: string,\n permission: string,\n isResourced: boolean,\n policies: string[],\n resourceType?: string,\n ) => void;\n onSelectPolicy: (\n isChecked: boolean,\n policyIndex: number,\n pIndex: number,\n ) => void;\n onRemovePermission: (index: number) => void;\n onRemovePlugin: (plugin: string) => void;\n setOpen: Dispatch<SetStateAction<boolean>>;\n onAddConditions: (index: number, conditions?: ConditionsData) => void;\n};\n\nconst PermissionPoliciesFormRow = ({\n rowData,\n permissionPoliciesRows,\n conditionRulesData,\n open,\n onSelectPermission,\n onSelectPolicy,\n onRemovePermission,\n onRemovePlugin,\n onAddConditions,\n}: PermissionPoliciesFormRowProps) => {\n const [currentOpen, setCurrentOpen] = useState<boolean>(false);\n\n useEffect(() => {\n setCurrentOpen(open);\n }, [open]);\n\n const getTotalRules = (conditions?: ConditionsData): number => {\n const totalRules = getRulesNumber(conditions);\n return totalRules;\n };\n\n const getPprIndex = (plugin: string, permission: string) => {\n return permissionPoliciesRows.findIndex(ppr => {\n return ppr.plugin === plugin && ppr.permission === permission;\n });\n };\n\n const getPolicies = (plugin: string, pp: any) => {\n const pprIndex = getPprIndex(plugin, pp.permission);\n return (\n permissionPoliciesRows?.[pprIndex]?.policies ||\n pp.actions.map((ac: string) => ({ policy: ac, effect: 'deny' }))\n );\n };\n\n const getPermissionCellLabel = (plugin: string) => {\n if (permissionPoliciesRows.find(ppr => ppr.plugin === plugin)) {\n return 'Edit...';\n }\n\n return 'Select...';\n };\n\n return (\n <>\n <TableRow>\n <TableCell\n align=\"left\"\n sx={{\n borderBottom: 'none',\n display: 'flex',\n alignItems: 'center',\n fontWeight: theme => theme.typography.fontWeightMedium,\n }}\n >\n <IconButton\n aria-label=\"expand-row\"\n size=\"small\"\n onClick={() => setCurrentOpen(!currentOpen)}\n data-testid={`expand-row-${rowData.plugin}`}\n >\n {currentOpen ? <ArrowDownIcon /> : <ArrowRightIcon />}\n </IconButton>\n {rowData.name}\n </TableCell>\n <TableCell align=\"left\" sx={{ borderBottom: 'none' }}>\n <Link\n sx={{\n cursor: 'pointer',\n textDecoration: 'none',\n color: theme => theme.palette.primary.main,\n }}\n onClick={() => setCurrentOpen(true)}\n >\n {getPermissionCellLabel(rowData.plugin)}\n </Link>\n </TableCell>\n <TableCell align=\"right\" sx={{ borderBottom: 'none' }}>\n <IconButton\n aria-label=\"remove\"\n size=\"small\"\n onClick={() => onRemovePlugin(rowData.plugin)}\n >\n <DeleteIcon />\n </IconButton>\n </TableCell>\n </TableRow>\n <TableRow>\n <TableCell\n sx={{ p: 0 }}\n colSpan={6}\n data-testid={`nested-row-${rowData.plugin}`}\n >\n <Collapse in={currentOpen} timeout=\"auto\" unmountOnExit>\n <Box>\n <Table size=\"small\" aria-label=\"permission-policies\">\n <TableBody>\n {rowData.permissionPolicies.map((pp: any) => (\n <PermissionPoliciesFormNestedRow\n key={pp.permission}\n plugin={rowData.plugin}\n permissionPolicy={pp}\n permissionPolicyRowIndex={getPprIndex(\n rowData.plugin,\n pp.permission,\n )}\n policies={getPolicies(rowData.plugin, pp)}\n conditionRulesLength={\n conditionRulesData?.[`${rowData.plugin}`]?.[\n `${pp.resourceType}`\n ]?.rules.length\n }\n totalRulesCount={getTotalRules(\n permissionPoliciesRows[\n getPprIndex(rowData.plugin, pp.permission)\n ]?.conditions,\n )}\n conditionsData={\n permissionPoliciesRows[\n getPprIndex(rowData.plugin, pp.permission)\n ]?.conditions\n }\n conditionRulesData={conditionRulesData}\n onSelectPermission={onSelectPermission}\n onSelectPolicy={onSelectPolicy}\n onRemovePermission={onRemovePermission}\n onAddConditions={onAddConditions}\n />\n ))}\n </TableBody>\n </Table>\n </Box>\n </Collapse>\n </TableCell>\n </TableRow>\n </>\n );\n};\n\nexport default PermissionPoliciesFormRow;\n"],"names":["DeleteIcon"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PermissionPoliciesFormRow.esm.js","sources":["../../../src/components/CreateRole/PermissionPoliciesFormRow.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 type { SetStateAction, Dispatch } from 'react';\n\nimport { useState, useEffect } from 'react';\n\nimport IconButton from '@mui/material/IconButton';\nimport { PermissionsData } from '../../types';\nimport { getRulesNumber } from '../../utils/create-role-utils';\nimport { ConditionRulesData, ConditionsData } from '../ConditionalAccess/types';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\nimport Collapse from '@mui/material/Collapse';\nimport Box from '@mui/material/Box';\nimport Table from '@mui/material/Table';\nimport TableBody from '@mui/material/TableBody';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport ArrowRightIcon from '@mui/icons-material/KeyboardArrowRight';\nimport ArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport PermissionPoliciesFormNestedRow from './PermissionPoliciesFormNestedRow';\nimport Link from '@mui/material/Link';\nimport { useTranslation } from '../../hooks/useTranslation';\nimport { useLanguage } from '../../hooks/useLanguage';\n\ntype PermissionPoliciesFormRowProps = {\n rowData: any;\n conditionRulesData?: ConditionRulesData;\n permissionPoliciesRows: PermissionsData[];\n open: boolean;\n onSelectPermission: (\n plugin: string,\n permission: string,\n isResourced: boolean,\n policies: string[],\n resourceType?: string,\n ) => void;\n onSelectPolicy: (\n isChecked: boolean,\n policyIndex: number,\n pIndex: number,\n ) => void;\n onRemovePermission: (index: number) => void;\n onRemovePlugin: (plugin: string) => void;\n setOpen: Dispatch<SetStateAction<boolean>>;\n onAddConditions: (index: number, conditions?: ConditionsData) => void;\n};\n\nconst PermissionPoliciesFormRow = ({\n rowData,\n permissionPoliciesRows,\n conditionRulesData,\n open,\n onSelectPermission,\n onSelectPolicy,\n onRemovePermission,\n onRemovePlugin,\n onAddConditions,\n}: PermissionPoliciesFormRowProps) => {\n const { t } = useTranslation();\n const locale = useLanguage();\n const [currentOpen, setCurrentOpen] = useState<boolean>(false);\n\n useEffect(() => {\n setCurrentOpen(open);\n }, [open]);\n\n const getTotalRules = (conditions?: ConditionsData): number => {\n const totalRules = getRulesNumber(conditions);\n return totalRules;\n };\n\n const getPprIndex = (plugin: string, permission: string) => {\n return permissionPoliciesRows.findIndex(ppr => {\n return ppr.plugin === plugin && ppr.permission === permission;\n });\n };\n\n const getPolicies = (plugin: string, pp: any) => {\n const pprIndex = getPprIndex(plugin, pp.permission);\n return (\n permissionPoliciesRows?.[pprIndex]?.policies ||\n pp.actions.map((ac: string) => ({ policy: ac, effect: 'deny' }))\n );\n };\n\n const getPermissionCellLabel = (plugin: string) => {\n if (permissionPoliciesRows.find(ppr => ppr.plugin === plugin)) {\n return t('common.editCell');\n }\n\n return t('common.selectCell');\n };\n\n return (\n <>\n <TableRow>\n <TableCell\n align=\"left\"\n sx={{\n borderBottom: 'none',\n display: 'flex',\n alignItems: 'center',\n fontWeight: theme => theme.typography.fontWeightMedium,\n }}\n >\n <IconButton\n aria-label={t('common.expandRow')}\n size=\"small\"\n onClick={() => setCurrentOpen(!currentOpen)}\n data-testid={`expand-row-${rowData.plugin}`}\n >\n {currentOpen ? <ArrowDownIcon /> : <ArrowRightIcon />}\n </IconButton>\n {rowData.name}\n </TableCell>\n <TableCell align=\"left\" sx={{ borderBottom: 'none' }}>\n <Link\n sx={{\n cursor: 'pointer',\n textDecoration: 'none',\n color: theme => theme.palette.primary.main,\n }}\n onClick={() => setCurrentOpen(true)}\n >\n {getPermissionCellLabel(rowData.plugin)}\n </Link>\n </TableCell>\n <TableCell align=\"right\" sx={{ borderBottom: 'none' }}>\n <IconButton\n aria-label={t('common.remove').toLocaleLowerCase(locale ?? 'en')}\n size=\"small\"\n onClick={() => onRemovePlugin(rowData.plugin)}\n >\n <DeleteIcon />\n </IconButton>\n </TableCell>\n </TableRow>\n <TableRow>\n <TableCell\n sx={{ p: 0 }}\n colSpan={6}\n data-testid={`nested-row-${rowData.plugin}`}\n >\n <Collapse in={currentOpen} timeout=\"auto\" unmountOnExit>\n <Box>\n <Table size=\"small\" aria-label=\"permission-policies\">\n <TableBody>\n {rowData.permissionPolicies.map((pp: any) => (\n <PermissionPoliciesFormNestedRow\n key={pp.permission}\n plugin={rowData.plugin}\n permissionPolicy={pp}\n permissionPolicyRowIndex={getPprIndex(\n rowData.plugin,\n pp.permission,\n )}\n policies={getPolicies(rowData.plugin, pp)}\n conditionRulesLength={\n conditionRulesData?.[`${rowData.plugin}`]?.[\n `${pp.resourceType}`\n ]?.rules.length\n }\n totalRulesCount={getTotalRules(\n permissionPoliciesRows[\n getPprIndex(rowData.plugin, pp.permission)\n ]?.conditions,\n )}\n conditionsData={\n permissionPoliciesRows[\n getPprIndex(rowData.plugin, pp.permission)\n ]?.conditions\n }\n conditionRulesData={conditionRulesData}\n onSelectPermission={onSelectPermission}\n onSelectPolicy={onSelectPolicy}\n onRemovePermission={onRemovePermission}\n onAddConditions={onAddConditions}\n />\n ))}\n </TableBody>\n </Table>\n </Box>\n </Collapse>\n </TableCell>\n </TableRow>\n </>\n );\n};\n\nexport default PermissionPoliciesFormRow;\n"],"names":["DeleteIcon"],"mappings":"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"}
|
|
@@ -19,12 +19,14 @@ import PermissionPoliciesFormRow from './PermissionPoliciesFormRow.esm.js';
|
|
|
19
19
|
import Box from '@mui/material/Box';
|
|
20
20
|
import TextField from '@mui/material/TextField';
|
|
21
21
|
import InputAdornment from '@mui/material/InputAdornment';
|
|
22
|
+
import { useTranslation } from '../../hooks/useTranslation.esm.js';
|
|
22
23
|
|
|
23
24
|
const PermissionPoliciesFormTableToolbar = ({
|
|
24
25
|
numSelected,
|
|
25
26
|
search,
|
|
26
27
|
setSearch
|
|
27
28
|
}) => {
|
|
29
|
+
const { t } = useTranslation();
|
|
28
30
|
return /* @__PURE__ */ jsxs(
|
|
29
31
|
Toolbar,
|
|
30
32
|
{
|
|
@@ -42,7 +44,9 @@ const PermissionPoliciesFormTableToolbar = ({
|
|
|
42
44
|
variant: "h5",
|
|
43
45
|
id: "tableTitle",
|
|
44
46
|
component: "div",
|
|
45
|
-
children: numSelected > 0 ?
|
|
47
|
+
children: numSelected > 0 ? t("permissionPolicies.pluginsSelected", {
|
|
48
|
+
count: `${numSelected}`
|
|
49
|
+
}) : t("permissionPolicies.noPluginsSelected")
|
|
46
50
|
}
|
|
47
51
|
),
|
|
48
52
|
/* @__PURE__ */ jsx(
|
|
@@ -50,7 +54,7 @@ const PermissionPoliciesFormTableToolbar = ({
|
|
|
50
54
|
{
|
|
51
55
|
sx: { width: "30%" },
|
|
52
56
|
id: "input-with-icon-textfield",
|
|
53
|
-
placeholder: "
|
|
57
|
+
placeholder: t("permissionPolicies.search"),
|
|
54
58
|
value: search,
|
|
55
59
|
onChange: (e) => setSearch(e.target.value),
|
|
56
60
|
InputProps: {
|
|
@@ -75,6 +79,7 @@ const PermissionPoliciesFormTable = ({
|
|
|
75
79
|
onRemovePlugin,
|
|
76
80
|
onAddConditions
|
|
77
81
|
}) => {
|
|
82
|
+
const { t } = useTranslation();
|
|
78
83
|
const [page, setPage] = useState(0);
|
|
79
84
|
const [rowsPerPage, setRowsPerPage] = useState(5);
|
|
80
85
|
const [open, setOpen] = useState(false);
|
|
@@ -125,7 +130,7 @@ const PermissionPoliciesFormTable = ({
|
|
|
125
130
|
children: open ? /* @__PURE__ */ jsx(ArrowDownIcon, {}) : /* @__PURE__ */ jsx(ArrowRightIcon, {})
|
|
126
131
|
}
|
|
127
132
|
),
|
|
128
|
-
"
|
|
133
|
+
t("common.name")
|
|
129
134
|
]
|
|
130
135
|
}
|
|
131
136
|
),
|
|
@@ -137,7 +142,7 @@ const PermissionPoliciesFormTable = ({
|
|
|
137
142
|
width: "60%",
|
|
138
143
|
fontWeight: (theme) => theme.typography.fontWeightBold
|
|
139
144
|
},
|
|
140
|
-
children: "
|
|
145
|
+
children: t("permissionPolicies.permission")
|
|
141
146
|
}
|
|
142
147
|
),
|
|
143
148
|
/* @__PURE__ */ jsx(
|
|
@@ -148,7 +153,7 @@ const PermissionPoliciesFormTable = ({
|
|
|
148
153
|
width: "10%",
|
|
149
154
|
fontWeight: (theme) => theme.typography.fontWeightBold
|
|
150
155
|
},
|
|
151
|
-
children: "
|
|
156
|
+
children: t("common.actions")
|
|
152
157
|
}
|
|
153
158
|
)
|
|
154
159
|
] }) }),
|
|
@@ -167,7 +172,7 @@ const PermissionPoliciesFormTable = ({
|
|
|
167
172
|
onAddConditions
|
|
168
173
|
},
|
|
169
174
|
row.plugin
|
|
170
|
-
)) : /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(TableCell, { colSpan: 4, children: /* @__PURE__ */ jsx(Box, { sx: { display: "flex", justifyContent: "center", p: 2 }, children: search && !filteredData.length ? "
|
|
175
|
+
)) : /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(TableCell, { colSpan: 4, children: /* @__PURE__ */ jsx(Box, { sx: { display: "flex", justifyContent: "center", p: 2 }, children: search && !filteredData.length ? t("permissionPolicies.noRecordsToDisplay") : t("permissionPolicies.selectedPluginsAppearHere") }) }) }) })
|
|
171
176
|
] }) }),
|
|
172
177
|
/* @__PURE__ */ jsx(
|
|
173
178
|
TablePagination,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PermissionPoliciesFormTable.esm.js","sources":["../../../src/components/CreateRole/PermissionPoliciesFormTable.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 type { SetStateAction, Dispatch, ChangeEvent } from 'react';\n\nimport { useState, useEffect } from 'react';\nimport Table from '@mui/material/Table';\nimport TableBody from '@mui/material/TableBody';\nimport TableCell from '@mui/material/TableCell';\nimport TableContainer from '@mui/material/TableContainer';\nimport TableHead from '@mui/material/TableHead';\nimport TablePagination from '@mui/material/TablePagination';\nimport TableRow from '@mui/material/TableRow';\nimport Toolbar from '@mui/material/Toolbar';\nimport Typography from '@mui/material/Typography';\nimport Paper from '@mui/material/Paper';\nimport IconButton from '@mui/material/IconButton';\nimport SearchIcon from '@mui/icons-material/Search';\nimport ClearIcon from '@mui/icons-material/Clear';\nimport ArrowRightIcon from '@mui/icons-material/KeyboardArrowRight';\nimport ArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport { PermissionsData } from '../../types';\nimport { ConditionRulesData, ConditionsData } from '../ConditionalAccess/types';\nimport PermissionPoliciesFormRow from './PermissionPoliciesFormRow';\nimport Box from '@mui/material/Box';\nimport TextField from '@mui/material/TextField';\nimport InputAdornment from '@mui/material/InputAdornment';\n\ninterface PermissionPoliciesTableToolbarProps {\n numSelected: number;\n search: string;\n setSearch: Dispatch<SetStateAction<string>>;\n}\n\nconst PermissionPoliciesFormTableToolbar = ({\n numSelected,\n search,\n setSearch,\n}: PermissionPoliciesTableToolbarProps) => {\n return (\n <Toolbar\n sx={{\n p: [4, 0, 2, 2],\n }}\n >\n <Typography\n sx={{\n flex: '1 1 100%',\n fontWeight: theme => theme.typography.fontWeightBold,\n }}\n variant=\"h5\"\n id=\"tableTitle\"\n component=\"div\"\n >\n {numSelected > 0 ? `${numSelected} plugins` : 'No plugins selected'}\n </Typography>\n\n <TextField\n sx={{ width: '30%' }}\n id=\"input-with-icon-textfield\"\n placeholder=\"Search\"\n value={search}\n onChange={e => setSearch(e.target.value)}\n InputProps={{\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon />\n </InputAdornment>\n ),\n endAdornment: (\n <InputAdornment position=\"start\">\n <IconButton onClick={() => setSearch('')}>\n <ClearIcon />\n </IconButton>\n </InputAdornment>\n ),\n }}\n variant=\"standard\"\n />\n </Toolbar>\n );\n};\n\nconst PermissionPoliciesFormTable = ({\n selectedPluginsCount,\n data,\n permissionPoliciesRows,\n conditionRulesData,\n onSelectPermission,\n onSelectPolicy,\n onRemovePermission,\n onRemovePlugin,\n onAddConditions,\n}: {\n selectedPluginsCount: number;\n data: any;\n permissionPoliciesRows: PermissionsData[];\n conditionRulesData?: ConditionRulesData;\n onRemovePermission: (index: number) => void;\n onSelectPermission: (\n plugin: string,\n permission: string,\n isResourced: boolean,\n policies: string[],\n resourceType?: string,\n ) => void;\n onSelectPolicy: (\n isChecked: boolean,\n policyIndex: number,\n pIndex: number,\n ) => void;\n onRemovePlugin: (plugin: string) => void;\n onAddConditions: (index: number, conditions?: ConditionsData) => void;\n}) => {\n const [page, setPage] = useState(0);\n const [rowsPerPage, setRowsPerPage] = useState(5);\n const [open, setOpen] = useState<boolean>(false);\n const [search, setSearch] = useState<string>('');\n const [filteredData, setFilteredData] = useState<any>([]);\n\n useEffect(() => {\n if (search)\n setFilteredData(\n data?.filter((row: any) => row.plugin.includes(search)) ?? [],\n );\n else setFilteredData(data);\n }, [search, data]);\n\n const handleChangePage = (_event: unknown, newPage: number) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event: ChangeEvent<HTMLInputElement>) => {\n setRowsPerPage(+event.target.value);\n setPage(0);\n };\n\n return (\n <Paper sx={{ width: '100%', mb: 2, p: 2 }}>\n <PermissionPoliciesFormTableToolbar\n numSelected={selectedPluginsCount}\n search={search}\n setSearch={setSearch}\n />\n <TableContainer component={Paper} sx={{ outline: '0' }}>\n <Table aria-label=\"collapsible table\">\n <TableHead>\n <TableRow>\n <TableCell\n align=\"left\"\n sx={{\n display: 'flex',\n alignItems: 'center',\n width: '100%',\n fontWeight: theme => theme.typography.fontWeightBold,\n }}\n >\n <IconButton\n aria-label=\"expand row\"\n size=\"small\"\n onClick={() => setOpen(!open)}\n >\n {open ? <ArrowDownIcon /> : <ArrowRightIcon />}\n </IconButton>\n Name\n </TableCell>\n <TableCell\n align=\"left\"\n sx={{\n width: '60%',\n fontWeight: theme => theme.typography.fontWeightBold,\n }}\n >\n Permission\n </TableCell>\n <TableCell\n align=\"right\"\n sx={{\n width: '10%',\n fontWeight: theme => theme.typography.fontWeightBold,\n }}\n >\n Actions\n </TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {filteredData.length > 0 ? (\n filteredData\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row: any) => (\n <PermissionPoliciesFormRow\n key={row.plugin}\n rowData={row}\n conditionRulesData={conditionRulesData}\n permissionPoliciesRows={permissionPoliciesRows}\n open={open}\n onSelectPermission={onSelectPermission}\n onSelectPolicy={onSelectPolicy}\n onRemovePermission={onRemovePermission}\n onRemovePlugin={onRemovePlugin}\n setOpen={setOpen}\n onAddConditions={onAddConditions}\n />\n ))\n ) : (\n <TableRow>\n <TableCell colSpan={4}>\n <Box sx={{ display: 'flex', justifyContent: 'center', p: 2 }}>\n {search && !filteredData.length\n ? 'No records to display.'\n : 'Selected plugins appear here.'}\n </Box>\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </TableContainer>\n <TablePagination\n rowsPerPageOptions={[5, 10, 20]}\n component=\"div\"\n count={data.length}\n rowsPerPage={rowsPerPage}\n page={page}\n showFirstButton\n showLastButton\n onPageChange={handleChangePage}\n onRowsPerPageChange={handleChangeRowsPerPage}\n />\n </Paper>\n );\n};\n\nexport default PermissionPoliciesFormTable;\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PermissionPoliciesFormTable.esm.js","sources":["../../../src/components/CreateRole/PermissionPoliciesFormTable.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 type { SetStateAction, Dispatch, ChangeEvent } from 'react';\n\nimport { useState, useEffect } from 'react';\nimport Table from '@mui/material/Table';\nimport TableBody from '@mui/material/TableBody';\nimport TableCell from '@mui/material/TableCell';\nimport TableContainer from '@mui/material/TableContainer';\nimport TableHead from '@mui/material/TableHead';\nimport TablePagination from '@mui/material/TablePagination';\nimport TableRow from '@mui/material/TableRow';\nimport Toolbar from '@mui/material/Toolbar';\nimport Typography from '@mui/material/Typography';\nimport Paper from '@mui/material/Paper';\nimport IconButton from '@mui/material/IconButton';\nimport SearchIcon from '@mui/icons-material/Search';\nimport ClearIcon from '@mui/icons-material/Clear';\nimport ArrowRightIcon from '@mui/icons-material/KeyboardArrowRight';\nimport ArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport { PermissionsData } from '../../types';\nimport { ConditionRulesData, ConditionsData } from '../ConditionalAccess/types';\nimport PermissionPoliciesFormRow from './PermissionPoliciesFormRow';\nimport Box from '@mui/material/Box';\nimport TextField from '@mui/material/TextField';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport { useTranslation } from '../../hooks/useTranslation';\n\ninterface PermissionPoliciesTableToolbarProps {\n numSelected: number;\n search: string;\n setSearch: Dispatch<SetStateAction<string>>;\n}\n\nconst PermissionPoliciesFormTableToolbar = ({\n numSelected,\n search,\n setSearch,\n}: PermissionPoliciesTableToolbarProps) => {\n const { t } = useTranslation();\n\n return (\n <Toolbar\n sx={{\n p: [4, 0, 2, 2],\n }}\n >\n <Typography\n sx={{\n flex: '1 1 100%',\n fontWeight: theme => theme.typography.fontWeightBold,\n }}\n variant=\"h5\"\n id=\"tableTitle\"\n component=\"div\"\n >\n {numSelected > 0\n ? t('permissionPolicies.pluginsSelected' as any, {\n count: `${numSelected}`,\n })\n : t('permissionPolicies.noPluginsSelected')}\n </Typography>\n\n <TextField\n sx={{ width: '30%' }}\n id=\"input-with-icon-textfield\"\n placeholder={t('permissionPolicies.search')}\n value={search}\n onChange={e => setSearch(e.target.value)}\n InputProps={{\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon />\n </InputAdornment>\n ),\n endAdornment: (\n <InputAdornment position=\"start\">\n <IconButton onClick={() => setSearch('')}>\n <ClearIcon />\n </IconButton>\n </InputAdornment>\n ),\n }}\n variant=\"standard\"\n />\n </Toolbar>\n );\n};\n\nconst PermissionPoliciesFormTable = ({\n selectedPluginsCount,\n data,\n permissionPoliciesRows,\n conditionRulesData,\n onSelectPermission,\n onSelectPolicy,\n onRemovePermission,\n onRemovePlugin,\n onAddConditions,\n}: {\n selectedPluginsCount: number;\n data: any;\n permissionPoliciesRows: PermissionsData[];\n conditionRulesData?: ConditionRulesData;\n onRemovePermission: (index: number) => void;\n onSelectPermission: (\n plugin: string,\n permission: string,\n isResourced: boolean,\n policies: string[],\n resourceType?: string,\n ) => void;\n onSelectPolicy: (\n isChecked: boolean,\n policyIndex: number,\n pIndex: number,\n ) => void;\n onRemovePlugin: (plugin: string) => void;\n onAddConditions: (index: number, conditions?: ConditionsData) => void;\n}) => {\n const { t } = useTranslation();\n const [page, setPage] = useState(0);\n const [rowsPerPage, setRowsPerPage] = useState(5);\n const [open, setOpen] = useState<boolean>(false);\n const [search, setSearch] = useState<string>('');\n const [filteredData, setFilteredData] = useState<any>([]);\n\n useEffect(() => {\n if (search)\n setFilteredData(\n data?.filter((row: any) => row.plugin.includes(search)) ?? [],\n );\n else setFilteredData(data);\n }, [search, data]);\n\n const handleChangePage = (_event: unknown, newPage: number) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event: ChangeEvent<HTMLInputElement>) => {\n setRowsPerPage(+event.target.value);\n setPage(0);\n };\n\n return (\n <Paper sx={{ width: '100%', mb: 2, p: 2 }}>\n <PermissionPoliciesFormTableToolbar\n numSelected={selectedPluginsCount}\n search={search}\n setSearch={setSearch}\n />\n <TableContainer component={Paper} sx={{ outline: '0' }}>\n <Table aria-label=\"collapsible table\">\n <TableHead>\n <TableRow>\n <TableCell\n align=\"left\"\n sx={{\n display: 'flex',\n alignItems: 'center',\n width: '100%',\n fontWeight: theme => theme.typography.fontWeightBold,\n }}\n >\n <IconButton\n aria-label=\"expand row\"\n size=\"small\"\n onClick={() => setOpen(!open)}\n >\n {open ? <ArrowDownIcon /> : <ArrowRightIcon />}\n </IconButton>\n {t('common.name')}\n </TableCell>\n <TableCell\n align=\"left\"\n sx={{\n width: '60%',\n fontWeight: theme => theme.typography.fontWeightBold,\n }}\n >\n {t('permissionPolicies.permission')}\n </TableCell>\n <TableCell\n align=\"right\"\n sx={{\n width: '10%',\n fontWeight: theme => theme.typography.fontWeightBold,\n }}\n >\n {t('common.actions')}\n </TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {filteredData.length > 0 ? (\n filteredData\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row: any) => (\n <PermissionPoliciesFormRow\n key={row.plugin}\n rowData={row}\n conditionRulesData={conditionRulesData}\n permissionPoliciesRows={permissionPoliciesRows}\n open={open}\n onSelectPermission={onSelectPermission}\n onSelectPolicy={onSelectPolicy}\n onRemovePermission={onRemovePermission}\n onRemovePlugin={onRemovePlugin}\n setOpen={setOpen}\n onAddConditions={onAddConditions}\n />\n ))\n ) : (\n <TableRow>\n <TableCell colSpan={4}>\n <Box sx={{ display: 'flex', justifyContent: 'center', p: 2 }}>\n {search && !filteredData.length\n ? t('permissionPolicies.noRecordsToDisplay')\n : t('permissionPolicies.selectedPluginsAppearHere')}\n </Box>\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </TableContainer>\n <TablePagination\n rowsPerPageOptions={[5, 10, 20]}\n component=\"div\"\n count={data.length}\n rowsPerPage={rowsPerPage}\n page={page}\n showFirstButton\n showLastButton\n onPageChange={handleChangePage}\n onRowsPerPageChange={handleChangeRowsPerPage}\n />\n </Paper>\n );\n};\n\nexport default PermissionPoliciesFormTable;\n"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import Autocomplete from '@mui/material/Autocomplete';
|
|
|
3
3
|
import { useState, useEffect } from 'react';
|
|
4
4
|
import { PluginsDropdownOption } from './PluginsDropdownOption.esm.js';
|
|
5
5
|
import TextField from '@mui/material/TextField';
|
|
6
|
+
import { useTranslation } from '../../hooks/useTranslation.esm.js';
|
|
6
7
|
|
|
7
8
|
const PluginsDropdown = ({
|
|
8
9
|
allPlugins,
|
|
@@ -13,6 +14,7 @@ const PluginsDropdown = ({
|
|
|
13
14
|
onRemoveAllPlugins,
|
|
14
15
|
selectedPluginsError
|
|
15
16
|
}) => {
|
|
17
|
+
const { t } = useTranslation();
|
|
16
18
|
const [inputValue, setInputValue] = useState("");
|
|
17
19
|
useEffect(() => {
|
|
18
20
|
if (selectedPlugins.length === allPlugins.length - 1)
|
|
@@ -33,7 +35,7 @@ const PluginsDropdown = ({
|
|
|
33
35
|
multiple: true,
|
|
34
36
|
disableCloseOnSelect: true,
|
|
35
37
|
getOptionLabel: (option) => option.label,
|
|
36
|
-
noOptionsText: "
|
|
38
|
+
noOptionsText: t("permissionPolicies.noPluginsFound"),
|
|
37
39
|
style: { width: "30%", flexGrow: "1" },
|
|
38
40
|
value: selectedPlugins || null,
|
|
39
41
|
onChange: (_e, selPlugins, reason, selOption) => {
|
|
@@ -59,7 +61,7 @@ const PluginsDropdown = ({
|
|
|
59
61
|
TextField,
|
|
60
62
|
{
|
|
61
63
|
...params,
|
|
62
|
-
label: "
|
|
64
|
+
label: t("permissionPolicies.selectPlugins"),
|
|
63
65
|
variant: "outlined",
|
|
64
66
|
error: !!selectedPluginsError,
|
|
65
67
|
helperText: selectedPluginsError ?? "",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PluginsDropdown.esm.js","sources":["../../../src/components/CreateRole/PluginsDropdown.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 Autocomplete from '@mui/material/Autocomplete';\nimport type { FocusEventHandler } from 'react';\nimport { useState, useEffect } from 'react';\nimport { SelectedPlugin } from '../../types';\nimport { PluginsDropdownOption } from './PluginsDropdownOption';\nimport TextField from '@mui/material/TextField';\nimport { FormikErrors } from 'formik';\nimport { RoleFormValues } from './types';\n\ntype PluginsDropdownProps = {\n allPlugins: SelectedPlugin[];\n selectedPlugins: SelectedPlugin[];\n setFieldValue: (\n field: string,\n value: any,\n shouldValidate?: boolean,\n ) => Promise<FormikErrors<RoleFormValues>> | Promise<void>;\n handleBlur: FocusEventHandler<HTMLInputElement | HTMLTextAreaElement>;\n onRemoveAllPlugins: () => void;\n onRemovePlugin: (plugin: string) => void;\n selectedPluginsError: string;\n};\n\nconst PluginsDropdown = ({\n allPlugins,\n selectedPlugins,\n setFieldValue,\n handleBlur,\n onRemovePlugin,\n onRemoveAllPlugins,\n selectedPluginsError,\n}: PluginsDropdownProps) => {\n const [inputValue, setInputValue] = useState('');\n useEffect(() => {\n if (selectedPlugins.length === allPlugins.length - 1)\n setFieldValue(`selectedPlugins`, allPlugins, true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n return (\n <Autocomplete\n options={allPlugins}\n inputValue={inputValue}\n onInputChange={(_, newInputValue, reason) => {\n if (reason !== 'reset') {\n setInputValue(newInputValue);\n }\n }}\n renderTags={() => ''}\n isOptionEqualToValue={(option, value) => option.label === value.label}\n multiple\n disableCloseOnSelect\n getOptionLabel={option => option.label}\n noOptionsText
|
|
1
|
+
{"version":3,"file":"PluginsDropdown.esm.js","sources":["../../../src/components/CreateRole/PluginsDropdown.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 Autocomplete from '@mui/material/Autocomplete';\nimport type { FocusEventHandler } from 'react';\nimport { useState, useEffect } from 'react';\nimport { SelectedPlugin } from '../../types';\nimport { PluginsDropdownOption } from './PluginsDropdownOption';\nimport TextField from '@mui/material/TextField';\nimport { FormikErrors } from 'formik';\nimport { RoleFormValues } from './types';\nimport { useTranslation } from '../../hooks/useTranslation';\n\ntype PluginsDropdownProps = {\n allPlugins: SelectedPlugin[];\n selectedPlugins: SelectedPlugin[];\n setFieldValue: (\n field: string,\n value: any,\n shouldValidate?: boolean,\n ) => Promise<FormikErrors<RoleFormValues>> | Promise<void>;\n handleBlur: FocusEventHandler<HTMLInputElement | HTMLTextAreaElement>;\n onRemoveAllPlugins: () => void;\n onRemovePlugin: (plugin: string) => void;\n selectedPluginsError: string;\n};\n\nconst PluginsDropdown = ({\n allPlugins,\n selectedPlugins,\n setFieldValue,\n handleBlur,\n onRemovePlugin,\n onRemoveAllPlugins,\n selectedPluginsError,\n}: PluginsDropdownProps) => {\n const { t } = useTranslation();\n const [inputValue, setInputValue] = useState('');\n useEffect(() => {\n if (selectedPlugins.length === allPlugins.length - 1)\n setFieldValue(`selectedPlugins`, allPlugins, true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n return (\n <Autocomplete\n options={allPlugins}\n inputValue={inputValue}\n onInputChange={(_, newInputValue, reason) => {\n if (reason !== 'reset') {\n setInputValue(newInputValue);\n }\n }}\n renderTags={() => ''}\n isOptionEqualToValue={(option, value) => option.label === value.label}\n multiple\n disableCloseOnSelect\n getOptionLabel={option => option.label}\n noOptionsText={t('permissionPolicies.noPluginsFound')}\n style={{ width: '30%', flexGrow: '1' }}\n value={selectedPlugins || null}\n onChange={(_e, selPlugins, reason, selOption) => {\n const pVal = selOption?.option.value;\n if (pVal === '') {\n if (reason === 'selectOption') {\n setFieldValue(`selectedPlugins`, allPlugins, true);\n } else if (reason === 'removeOption') {\n onRemoveAllPlugins();\n }\n } else if (pVal) {\n if (reason === 'removeOption') {\n onRemovePlugin(pVal);\n } else if (reason === 'selectOption') {\n if (selPlugins.length === allPlugins.length - 1)\n setFieldValue(`selectedPlugins`, allPlugins, true);\n else setFieldValue(`selectedPlugins`, selPlugins, true);\n }\n }\n }}\n renderOption={(props, option: SelectedPlugin, state) => (\n <PluginsDropdownOption props={props} option={option} state={state} />\n )}\n renderInput={(params: any) => (\n <TextField\n {...params}\n label={t('permissionPolicies.selectPlugins')}\n variant=\"outlined\"\n error={!!selectedPluginsError}\n helperText={selectedPluginsError ?? ''}\n onBlur={handleBlur}\n onKeyDown={event => {\n if (event.key === 'Backspace' && params.inputProps.value === '') {\n event.stopPropagation();\n }\n }}\n required\n />\n )}\n />\n );\n};\n\nexport default PluginsDropdown;\n"],"names":[],"mappings":"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"}
|
|
@@ -6,14 +6,15 @@ import { getMembers } from '../../utils/rbac-utils.esm.js';
|
|
|
6
6
|
import { reviewStepMemebersTableColumns } from './AddedMembersTableColumn.esm.js';
|
|
7
7
|
import { ReviewStepTable } from './ReviewStepTable.esm.js';
|
|
8
8
|
import { selectedPermissionPoliciesColumn } from './SelectedPermissionPoliciesColumn.esm.js';
|
|
9
|
+
import { useTranslation } from '../../hooks/useTranslation.esm.js';
|
|
9
10
|
|
|
10
|
-
const tableMetadata = (values) => {
|
|
11
|
-
const membersKey = values.selectedMembers.length > 0 ?
|
|
11
|
+
const tableMetadata = (values, t) => {
|
|
12
|
+
const membersKey = values.selectedMembers.length > 0 ? `${t("table.headers.usersAndGroups")} (${getMembers(values.selectedMembers, t)})` : t("table.headers.usersAndGroups");
|
|
12
13
|
const permissionPoliciesKey = `Permission policies (${getPermissionsNumber(
|
|
13
14
|
values
|
|
14
15
|
)})`;
|
|
15
16
|
return {
|
|
16
|
-
"
|
|
17
|
+
[t("roleForm.review.nameDescriptionOwner")]: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
17
18
|
/* @__PURE__ */ jsx(Typography, { sx: { margin: "0px" }, children: values.name }),
|
|
18
19
|
/* @__PURE__ */ jsx("br", {}),
|
|
19
20
|
/* @__PURE__ */ jsx(Typography, { sx: { margin: "0px" }, children: values.description || "-" }),
|
|
@@ -24,7 +25,7 @@ const tableMetadata = (values) => {
|
|
|
24
25
|
ReviewStepTable,
|
|
25
26
|
{
|
|
26
27
|
rows: values.selectedMembers,
|
|
27
|
-
columns: reviewStepMemebersTableColumns(),
|
|
28
|
+
columns: reviewStepMemebersTableColumns(t),
|
|
28
29
|
tableWrapperWidth: 550
|
|
29
30
|
}
|
|
30
31
|
),
|
|
@@ -32,7 +33,7 @@ const tableMetadata = (values) => {
|
|
|
32
33
|
ReviewStepTable,
|
|
33
34
|
{
|
|
34
35
|
rows: values.permissionPoliciesRows,
|
|
35
|
-
columns: selectedPermissionPoliciesColumn(),
|
|
36
|
+
columns: selectedPermissionPoliciesColumn(t),
|
|
36
37
|
tableWrapperWidth: 700
|
|
37
38
|
}
|
|
38
39
|
)
|
|
@@ -42,13 +43,14 @@ const ReviewStep = ({
|
|
|
42
43
|
values,
|
|
43
44
|
isEditing
|
|
44
45
|
}) => {
|
|
46
|
+
const { t } = useTranslation();
|
|
45
47
|
return /* @__PURE__ */ jsxs("div", { style: { overflow: "auto" }, children: [
|
|
46
|
-
/* @__PURE__ */ jsx(Typography, { variant: "h6", children: isEditing ? "
|
|
48
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h6", children: isEditing ? t("roleForm.review.reviewAndSave") : t("roleForm.review.reviewAndCreate") }),
|
|
47
49
|
/* @__PURE__ */ jsx(
|
|
48
50
|
StructuredMetadataTable,
|
|
49
51
|
{
|
|
50
52
|
dense: true,
|
|
51
|
-
metadata: tableMetadata(values),
|
|
53
|
+
metadata: tableMetadata(values, t),
|
|
52
54
|
options: { titleFormat: (key) => key }
|
|
53
55
|
}
|
|
54
56
|
)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReviewStep.esm.js","sources":["../../../src/components/CreateRole/ReviewStep.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 { StructuredMetadataTable } from '@backstage/core-components';\n\nimport Typography from '@mui/material/Typography';\n\nimport { getPermissionsNumber } from '../../utils/create-role-utils';\nimport { getMembers } from '../../utils/rbac-utils';\nimport { reviewStepMemebersTableColumns } from './AddedMembersTableColumn';\nimport { ReviewStepTable } from './ReviewStepTable';\nimport { selectedPermissionPoliciesColumn } from './SelectedPermissionPoliciesColumn';\nimport { RoleFormValues } from './types';\n\nconst tableMetadata = (values: RoleFormValues) => {\n const membersKey =\n values.selectedMembers.length > 0\n ?
|
|
1
|
+
{"version":3,"file":"ReviewStep.esm.js","sources":["../../../src/components/CreateRole/ReviewStep.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 { StructuredMetadataTable } from '@backstage/core-components';\n\nimport Typography from '@mui/material/Typography';\n\nimport { getPermissionsNumber } from '../../utils/create-role-utils';\nimport { getMembers } from '../../utils/rbac-utils';\nimport { reviewStepMemebersTableColumns } from './AddedMembersTableColumn';\nimport { ReviewStepTable } from './ReviewStepTable';\nimport { selectedPermissionPoliciesColumn } from './SelectedPermissionPoliciesColumn';\nimport { RoleFormValues } from './types';\nimport { useTranslation } from '../../hooks/useTranslation';\nimport { TranslationFunction } from '@backstage/core-plugin-api/alpha';\nimport { rbacTranslationRef } from '../../translations';\n\nconst tableMetadata = (\n values: RoleFormValues,\n t: TranslationFunction<typeof rbacTranslationRef.T>,\n) => {\n const membersKey =\n values.selectedMembers.length > 0\n ? `${t('table.headers.usersAndGroups')} (${getMembers(values.selectedMembers, t)})`\n : t('table.headers.usersAndGroups');\n const permissionPoliciesKey = `Permission policies (${getPermissionsNumber(\n values,\n )})`;\n return {\n [t('roleForm.review.nameDescriptionOwner')]: (\n <>\n <Typography sx={{ margin: '0px' }}>{values.name}</Typography>\n <br />\n <Typography sx={{ margin: '0px' }}>\n {values.description || '-'}\n </Typography>\n <br />\n <Typography sx={{ margin: '0px' }}>{values.owner || '-'}</Typography>\n </>\n ),\n [membersKey]: (\n <ReviewStepTable\n rows={values.selectedMembers}\n columns={reviewStepMemebersTableColumns(t)}\n tableWrapperWidth={550}\n />\n ),\n [permissionPoliciesKey]: (\n <ReviewStepTable\n rows={values.permissionPoliciesRows}\n columns={selectedPermissionPoliciesColumn(t)}\n tableWrapperWidth={700}\n />\n ),\n };\n};\n\nexport const ReviewStep = ({\n values,\n isEditing,\n}: {\n values: RoleFormValues;\n isEditing: boolean;\n}) => {\n const { t } = useTranslation();\n\n return (\n <div style={{ overflow: 'auto' }}>\n <Typography variant=\"h6\">\n {isEditing\n ? t('roleForm.review.reviewAndSave')\n : t('roleForm.review.reviewAndCreate')}\n </Typography>\n <StructuredMetadataTable\n dense\n metadata={tableMetadata(values, t)}\n options={{ titleFormat: (key: string) => key }}\n />\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;AA6BA,MAAM,aAAA,GAAgB,CACpB,MAAA,EACA,CACG,KAAA;AACH,EAAA,MAAM,aACJ,MAAO,CAAA,eAAA,CAAgB,MAAS,GAAA,CAAA,GAC5B,GAAG,CAAE,CAAA,8BAA8B,CAAC,CAAA,EAAA,EAAK,WAAW,MAAO,CAAA,eAAA,EAAiB,CAAC,CAAC,CAAA,CAAA,CAAA,GAC9E,EAAE,8BAA8B,CAAA;AACtC,EAAA,MAAM,wBAAwB,CAAwB,qBAAA,EAAA,oBAAA;AAAA,IACpD;AAAA,GACD,CAAA,CAAA,CAAA;AACD,EAAO,OAAA;AAAA,IACL,CAAC,CAAA,CAAE,sCAAsC,CAAC,mBAEtC,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,cAAW,EAAI,EAAA,EAAE,QAAQ,KAAM,EAAA,EAAI,iBAAO,IAAK,EAAA,CAAA;AAAA,0BAC/C,IAAG,EAAA,EAAA,CAAA;AAAA,sBACJ,GAAA,CAAC,cAAW,EAAI,EAAA,EAAE,QAAQ,KAAM,EAAA,EAC7B,QAAO,EAAA,MAAA,CAAA,WAAA,IAAe,GACzB,EAAA,CAAA;AAAA,0BACC,IAAG,EAAA,EAAA,CAAA;AAAA,sBACJ,GAAA,CAAC,cAAW,EAAI,EAAA,EAAE,QAAQ,KAAM,EAAA,EAAI,QAAO,EAAA,MAAA,CAAA,KAAA,IAAS,GAAI,EAAA;AAAA,KAC1D,EAAA,CAAA;AAAA,IAEF,CAAC,UAAU,mBACT,GAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,MAAM,MAAO,CAAA,eAAA;AAAA,QACb,OAAA,EAAS,+BAA+B,CAAC,CAAA;AAAA,QACzC,iBAAmB,EAAA;AAAA;AAAA,KACrB;AAAA,IAEF,CAAC,qBAAqB,mBACpB,GAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,MAAM,MAAO,CAAA,sBAAA;AAAA,QACb,OAAA,EAAS,iCAAiC,CAAC,CAAA;AAAA,QAC3C,iBAAmB,EAAA;AAAA;AAAA;AACrB,GAEJ;AACF,CAAA;AAEO,MAAM,aAAa,CAAC;AAAA,EACzB,MAAA;AAAA,EACA;AACF,CAGM,KAAA;AACJ,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA;AAE7B,EAAA,4BACG,KAAI,EAAA,EAAA,KAAA,EAAO,EAAE,QAAA,EAAU,QACtB,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,UAAA,EAAA,EAAW,SAAQ,IACjB,EAAA,QAAA,EAAA,SAAA,GACG,EAAE,+BAA+B,CAAA,GACjC,CAAE,CAAA,iCAAiC,CACzC,EAAA,CAAA;AAAA,oBACA,GAAA;AAAA,MAAC,uBAAA;AAAA,MAAA;AAAA,QACC,KAAK,EAAA,IAAA;AAAA,QACL,QAAA,EAAU,aAAc,CAAA,MAAA,EAAQ,CAAC,CAAA;AAAA,QACjC,OAAS,EAAA,EAAE,WAAa,EAAA,CAAC,QAAgB,GAAI;AAAA;AAAA;AAC/C,GACF,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import TextField from '@mui/material/TextField';
|
|
3
|
+
import { useTranslation } from '../../hooks/useTranslation.esm.js';
|
|
3
4
|
|
|
4
5
|
const RoleDetailsForm = ({
|
|
5
6
|
name,
|
|
@@ -9,6 +10,7 @@ const RoleDetailsForm = ({
|
|
|
9
10
|
handleBlur,
|
|
10
11
|
handleChange
|
|
11
12
|
}) => {
|
|
13
|
+
const { t } = useTranslation();
|
|
12
14
|
return /* @__PURE__ */ jsxs(
|
|
13
15
|
"div",
|
|
14
16
|
{
|
|
@@ -22,12 +24,12 @@ const RoleDetailsForm = ({
|
|
|
22
24
|
TextField,
|
|
23
25
|
{
|
|
24
26
|
required: true,
|
|
25
|
-
label: "
|
|
27
|
+
label: t("roleForm.fields.name.label"),
|
|
26
28
|
variant: "outlined",
|
|
27
29
|
id: "role-name",
|
|
28
30
|
"data-testid": "role-name",
|
|
29
31
|
"aria-labelledby": "name",
|
|
30
|
-
helperText: nameError ?? "
|
|
32
|
+
helperText: nameError ?? t("roleForm.fields.name.helperText"),
|
|
31
33
|
value: name,
|
|
32
34
|
name: "name",
|
|
33
35
|
onChange: handleChange,
|
|
@@ -38,9 +40,9 @@ const RoleDetailsForm = ({
|
|
|
38
40
|
/* @__PURE__ */ jsx(
|
|
39
41
|
TextField,
|
|
40
42
|
{
|
|
41
|
-
label: "
|
|
43
|
+
label: t("roleForm.fields.description.label"),
|
|
42
44
|
variant: "outlined",
|
|
43
|
-
helperText: "
|
|
45
|
+
helperText: t("roleForm.fields.description.helperText"),
|
|
44
46
|
value: description,
|
|
45
47
|
"data-testid": "role-description",
|
|
46
48
|
id: "role-description",
|
|
@@ -54,9 +56,9 @@ const RoleDetailsForm = ({
|
|
|
54
56
|
/* @__PURE__ */ jsx(
|
|
55
57
|
TextField,
|
|
56
58
|
{
|
|
57
|
-
label: "
|
|
59
|
+
label: t("roleForm.fields.owner.label"),
|
|
58
60
|
variant: "outlined",
|
|
59
|
-
helperText: "
|
|
61
|
+
helperText: t("roleForm.fields.owner.helperText"),
|
|
60
62
|
value: owner,
|
|
61
63
|
"data-testid": "role-owner",
|
|
62
64
|
id: "role-owner",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RoleDetailsForm.esm.js","sources":["../../../src/components/CreateRole/RoleDetailsForm.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 type { FocusEventHandler, ChangeEventHandler } from 'react';\n\nimport TextField from '@mui/material/TextField';\n\ntype RoleDetailsFormProps = {\n name: string;\n description?: string;\n owner?: string;\n nameError?: string;\n handleBlur: FocusEventHandler<HTMLInputElement | HTMLTextAreaElement>;\n handleChange: ChangeEventHandler<HTMLTextAreaElement | HTMLInputElement>;\n};\n\nexport const RoleDetailsForm = ({\n name,\n description,\n owner,\n nameError,\n handleBlur,\n handleChange,\n}: RoleDetailsFormProps) => {\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '20px',\n }}\n >\n <TextField\n required\n label
|
|
1
|
+
{"version":3,"file":"RoleDetailsForm.esm.js","sources":["../../../src/components/CreateRole/RoleDetailsForm.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 type { FocusEventHandler, ChangeEventHandler } from 'react';\n\nimport TextField from '@mui/material/TextField';\n\nimport { useTranslation } from '../../hooks/useTranslation';\n\ntype RoleDetailsFormProps = {\n name: string;\n description?: string;\n owner?: string;\n nameError?: string;\n handleBlur: FocusEventHandler<HTMLInputElement | HTMLTextAreaElement>;\n handleChange: ChangeEventHandler<HTMLTextAreaElement | HTMLInputElement>;\n};\n\nexport const RoleDetailsForm = ({\n name,\n description,\n owner,\n nameError,\n handleBlur,\n handleChange,\n}: RoleDetailsFormProps) => {\n const { t } = useTranslation();\n\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '20px',\n }}\n >\n <TextField\n required\n label={t('roleForm.fields.name.label')}\n variant=\"outlined\"\n id=\"role-name\"\n data-testid=\"role-name\"\n aria-labelledby=\"name\"\n helperText={nameError ?? t('roleForm.fields.name.helperText')}\n value={name}\n name=\"name\"\n onChange={handleChange}\n onBlur={handleBlur}\n error={!!nameError}\n />\n <TextField\n label={t('roleForm.fields.description.label')}\n variant=\"outlined\"\n helperText={t('roleForm.fields.description.helperText')}\n value={description}\n data-testid=\"role-description\"\n id=\"role-description\"\n name=\"description\"\n aria-labelledby=\"description\"\n onChange={handleChange}\n onBlur={handleBlur}\n multiline\n />\n <TextField\n label={t('roleForm.fields.owner.label')}\n variant=\"outlined\"\n helperText={t('roleForm.fields.owner.helperText')}\n value={owner}\n data-testid=\"role-owner\"\n id=\"role-owner\"\n name=\"owner\"\n aria-labelledby=\"owner\"\n onChange={handleChange}\n onBlur={handleBlur}\n multiline\n />\n </div>\n );\n};\n"],"names":[],"mappings":";;;;AA8BO,MAAM,kBAAkB,CAAC;AAAA,EAC9B,IAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAA4B,KAAA;AAC1B,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA;AAE7B,EACE,uBAAA,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAO,EAAA;AAAA,QACL,OAAS,EAAA,MAAA;AAAA,QACT,aAAe,EAAA,QAAA;AAAA,QACf,GAAK,EAAA;AAAA,OACP;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,QAAQ,EAAA,IAAA;AAAA,YACR,KAAA,EAAO,EAAE,4BAA4B,CAAA;AAAA,YACrC,OAAQ,EAAA,UAAA;AAAA,YACR,EAAG,EAAA,WAAA;AAAA,YACH,aAAY,EAAA,WAAA;AAAA,YACZ,iBAAgB,EAAA,MAAA;AAAA,YAChB,UAAA,EAAY,SAAa,IAAA,CAAA,CAAE,iCAAiC,CAAA;AAAA,YAC5D,KAAO,EAAA,IAAA;AAAA,YACP,IAAK,EAAA,MAAA;AAAA,YACL,QAAU,EAAA,YAAA;AAAA,YACV,MAAQ,EAAA,UAAA;AAAA,YACR,KAAA,EAAO,CAAC,CAAC;AAAA;AAAA,SACX;AAAA,wBACA,GAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,EAAE,mCAAmC,CAAA;AAAA,YAC5C,OAAQ,EAAA,UAAA;AAAA,YACR,UAAA,EAAY,EAAE,wCAAwC,CAAA;AAAA,YACtD,KAAO,EAAA,WAAA;AAAA,YACP,aAAY,EAAA,kBAAA;AAAA,YACZ,EAAG,EAAA,kBAAA;AAAA,YACH,IAAK,EAAA,aAAA;AAAA,YACL,iBAAgB,EAAA,aAAA;AAAA,YAChB,QAAU,EAAA,YAAA;AAAA,YACV,MAAQ,EAAA,UAAA;AAAA,YACR,SAAS,EAAA;AAAA;AAAA,SACX;AAAA,wBACA,GAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,EAAE,6BAA6B,CAAA;AAAA,YACtC,OAAQ,EAAA,UAAA;AAAA,YACR,UAAA,EAAY,EAAE,kCAAkC,CAAA;AAAA,YAChD,KAAO,EAAA,KAAA;AAAA,YACP,aAAY,EAAA,YAAA;AAAA,YACZ,EAAG,EAAA,YAAA;AAAA,YACH,IAAK,EAAA,OAAA;AAAA,YACL,iBAAgB,EAAA,OAAA;AAAA,YAChB,QAAU,EAAA,YAAA;AAAA,YACV,MAAQ,EAAA,UAAA;AAAA,YACR,SAAS,EAAA;AAAA;AAAA;AACX;AAAA;AAAA,GACF;AAEJ;;;;"}
|