@backstage-community/plugin-rbac 1.35.0 → 1.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/components/Administration.esm.js +2 -2
  3. package/dist/components/Administration.esm.js.map +1 -1
  4. package/dist/components/ConditionalAccess/AddNestedConditionButton.esm.js +5 -5
  5. package/dist/components/ConditionalAccess/AddNestedConditionButton.esm.js.map +1 -1
  6. package/dist/components/ConditionalAccess/ComplexConditionRow.esm.js +5 -5
  7. package/dist/components/ConditionalAccess/ComplexConditionRow.esm.js.map +1 -1
  8. package/dist/components/ConditionalAccess/ComplexConditionRowButtons.esm.js +7 -7
  9. package/dist/components/ConditionalAccess/ComplexConditionRowButtons.esm.js.map +1 -1
  10. package/dist/components/ConditionalAccess/ConditionRule.esm.js +2 -2
  11. package/dist/components/ConditionalAccess/ConditionRule.esm.js.map +1 -1
  12. package/dist/components/ConditionalAccess/ConditionalAccessSidebar.esm.js +9 -9
  13. package/dist/components/ConditionalAccess/ConditionalAccessSidebar.esm.js.map +1 -1
  14. package/dist/components/ConditionalAccess/ConditionsForm.esm.js +14 -14
  15. package/dist/components/ConditionalAccess/ConditionsForm.esm.js.map +1 -1
  16. package/dist/components/ConditionalAccess/ConditionsFormRow.esm.js +27 -27
  17. package/dist/components/ConditionalAccess/ConditionsFormRow.esm.js.map +1 -1
  18. package/dist/components/ConditionalAccess/ConditionsFormRowFields.esm.js +6 -6
  19. package/dist/components/ConditionalAccess/ConditionsFormRowFields.esm.js.map +1 -1
  20. package/dist/components/ConditionalAccess/CriteriaToggleButton.esm.js +2 -2
  21. package/dist/components/ConditionalAccess/CriteriaToggleButton.esm.js.map +1 -1
  22. package/dist/components/ConditionalAccess/CustomArrayField.esm.js +5 -5
  23. package/dist/components/ConditionalAccess/CustomArrayField.esm.js.map +1 -1
  24. package/dist/components/ConditionalAccess/RulesDropdownOption.esm.js +4 -4
  25. package/dist/components/ConditionalAccess/RulesDropdownOption.esm.js.map +1 -1
  26. package/dist/components/CreateRole/AddMembersForm.esm.js +13 -13
  27. package/dist/components/CreateRole/AddMembersForm.esm.js.map +1 -1
  28. package/dist/components/CreateRole/AddedMembersTable.esm.js +3 -3
  29. package/dist/components/CreateRole/AddedMembersTable.esm.js.map +1 -1
  30. package/dist/components/CreateRole/AddedMembersTableColumn.esm.js +4 -4
  31. package/dist/components/CreateRole/AddedMembersTableColumn.esm.js.map +1 -1
  32. package/dist/components/CreateRole/CancelDialog.esm.js +90 -0
  33. package/dist/components/CreateRole/CancelDialog.esm.js.map +1 -0
  34. package/dist/components/CreateRole/CreateRolePage.esm.js +6 -6
  35. package/dist/components/CreateRole/CreateRolePage.esm.js.map +1 -1
  36. package/dist/components/CreateRole/EditRolePage.esm.js +9 -5
  37. package/dist/components/CreateRole/EditRolePage.esm.js.map +1 -1
  38. package/dist/components/CreateRole/MembersDropdownOption.esm.js +4 -4
  39. package/dist/components/CreateRole/MembersDropdownOption.esm.js.map +1 -1
  40. package/dist/components/CreateRole/PermissionPoliciesForm.esm.js +98 -104
  41. package/dist/components/CreateRole/PermissionPoliciesForm.esm.js.map +1 -1
  42. package/dist/components/CreateRole/PermissionPoliciesFormNestedRow.esm.js +124 -0
  43. package/dist/components/CreateRole/PermissionPoliciesFormNestedRow.esm.js.map +1 -0
  44. package/dist/components/CreateRole/PermissionPoliciesFormRow.esm.js +104 -153
  45. package/dist/components/CreateRole/PermissionPoliciesFormRow.esm.js.map +1 -1
  46. package/dist/components/CreateRole/PermissionPoliciesFormTable.esm.js +174 -0
  47. package/dist/components/CreateRole/PermissionPoliciesFormTable.esm.js.map +1 -0
  48. package/dist/components/CreateRole/PluginsDropdown.esm.js +66 -0
  49. package/dist/components/CreateRole/PluginsDropdown.esm.js.map +1 -0
  50. package/dist/components/CreateRole/PluginsDropdownOption.esm.js +52 -0
  51. package/dist/components/CreateRole/PluginsDropdownOption.esm.js.map +1 -0
  52. package/dist/components/CreateRole/ReviewStep.esm.js +5 -5
  53. package/dist/components/CreateRole/ReviewStep.esm.js.map +1 -1
  54. package/dist/components/CreateRole/ReviewStepTable.esm.js +4 -4
  55. package/dist/components/CreateRole/ReviewStepTable.esm.js.map +1 -1
  56. package/dist/components/CreateRole/RoleDetailsForm.esm.js +4 -4
  57. package/dist/components/CreateRole/RoleDetailsForm.esm.js.map +1 -1
  58. package/dist/components/CreateRole/RoleForm.esm.js +30 -37
  59. package/dist/components/CreateRole/RoleForm.esm.js.map +1 -1
  60. package/dist/components/DownloadUserStatistics.esm.js +2 -2
  61. package/dist/components/DownloadUserStatistics.esm.js.map +1 -1
  62. package/dist/components/EditRole.esm.js +3 -3
  63. package/dist/components/EditRole.esm.js.map +1 -1
  64. package/dist/components/RbacPage.esm.js +3 -3
  65. package/dist/components/RbacPage.esm.js.map +1 -1
  66. package/dist/components/RoleOverview/AboutCard.esm.js +9 -9
  67. package/dist/components/RoleOverview/AboutCard.esm.js.map +1 -1
  68. package/dist/components/RoleOverview/MembersCard.esm.js +8 -8
  69. package/dist/components/RoleOverview/MembersCard.esm.js.map +1 -1
  70. package/dist/components/RoleOverview/MembersListColumns.esm.js +2 -2
  71. package/dist/components/RoleOverview/MembersListColumns.esm.js.map +1 -1
  72. package/dist/components/RoleOverview/PermissionsCard.esm.js +8 -8
  73. package/dist/components/RoleOverview/PermissionsCard.esm.js.map +1 -1
  74. package/dist/components/RoleOverview/RoleOverviewPage.esm.js +5 -5
  75. package/dist/components/RoleOverview/RoleOverviewPage.esm.js.map +1 -1
  76. package/dist/components/RolesList/DeleteRole.esm.js +3 -3
  77. package/dist/components/RolesList/DeleteRole.esm.js.map +1 -1
  78. package/dist/components/RolesList/DeleteRoleDialog.esm.js +15 -15
  79. package/dist/components/RolesList/DeleteRoleDialog.esm.js.map +1 -1
  80. package/dist/components/RolesList/RolesList.esm.js +9 -9
  81. package/dist/components/RolesList/RolesList.esm.js.map +1 -1
  82. package/dist/components/RolesList/RolesListColumns.esm.js +5 -5
  83. package/dist/components/RolesList/RolesListColumns.esm.js.map +1 -1
  84. package/dist/components/RolesList/RolesListToolbar.esm.js +5 -5
  85. package/dist/components/RolesList/RolesListToolbar.esm.js.map +1 -1
  86. package/dist/components/Router.esm.js +8 -8
  87. package/dist/components/Router.esm.js.map +1 -1
  88. package/dist/components/SnackbarAlert.esm.js +3 -3
  89. package/dist/components/SnackbarAlert.esm.js.map +1 -1
  90. package/dist/components/ToastContext.esm.js +4 -4
  91. package/dist/components/ToastContext.esm.js.map +1 -1
  92. package/dist/hooks/useMembers.esm.js +2 -2
  93. package/dist/hooks/useMembers.esm.js.map +1 -1
  94. package/dist/hooks/usePermissionPolicies.esm.js +9 -5
  95. package/dist/hooks/usePermissionPolicies.esm.js.map +1 -1
  96. package/dist/hooks/useRoles.esm.js +7 -9
  97. package/dist/hooks/useRoles.esm.js.map +1 -1
  98. package/dist/utils/create-role-utils.esm.js +14 -9
  99. package/dist/utils/create-role-utils.esm.js.map +1 -1
  100. package/dist/utils/rbac-utils.esm.js +21 -10
  101. package/dist/utils/rbac-utils.esm.js.map +1 -1
  102. package/dist/utils/role-form-utils.esm.js +17 -1
  103. package/dist/utils/role-form-utils.esm.js.map +1 -1
  104. package/package.json +1 -1
  105. package/dist/components/CreateRole/PoliciesCheckboxGroup.esm.js +0 -76
  106. package/dist/components/CreateRole/PoliciesCheckboxGroup.esm.js.map +0 -1
  107. package/dist/components/CreateRole/const.esm.js +0 -14
  108. package/dist/components/CreateRole/const.esm.js.map +0 -1
@@ -0,0 +1,52 @@
1
+ import React__default from 'react';
2
+ import Typography from '@mui/material/Typography';
3
+ import Checkbox from '@mui/material/Checkbox';
4
+ import Box from '@mui/material/Box';
5
+ import match from 'autosuggest-highlight/match';
6
+ import parse from 'autosuggest-highlight/parse';
7
+
8
+ const PluginsDropdownOption = ({
9
+ props,
10
+ option,
11
+ state
12
+ }) => {
13
+ const { inputValue } = state;
14
+ const { label, value } = option;
15
+ const matches = match(label, inputValue, { insideWords: true });
16
+ const parts = parse(label, matches);
17
+ return /* @__PURE__ */ React__default.createElement(
18
+ "li",
19
+ {
20
+ ...props,
21
+ key: `${label}`,
22
+ style: {
23
+ ...value === "" ? { borderBottom: `1px solid #D2D2D2` } : {}
24
+ }
25
+ },
26
+ /* @__PURE__ */ React__default.createElement(
27
+ Box,
28
+ {
29
+ sx: {
30
+ display: "flex"
31
+ }
32
+ },
33
+ /* @__PURE__ */ React__default.createElement(Checkbox, { style: { marginRight: 8 }, checked: state.selected }),
34
+ /* @__PURE__ */ React__default.createElement(Typography, { component: "span", sx: { marginTop: "0.5rem" } }, parts.map((part) => /* @__PURE__ */ React__default.createElement(
35
+ Typography,
36
+ {
37
+ key: `${part.text}-${label}`,
38
+ component: "span",
39
+ sx: {
40
+ fontWeight: !inputValue || part.highlight ? 400 : 700,
41
+ color: (theme) => theme.palette.text.primary
42
+ },
43
+ "data-testid": option.label
44
+ },
45
+ part.text
46
+ )))
47
+ )
48
+ );
49
+ };
50
+
51
+ export { PluginsDropdownOption };
52
+ //# sourceMappingURL=PluginsDropdownOption.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PluginsDropdownOption.esm.js","sources":["../../../src/components/CreateRole/PluginsDropdownOption.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport { AutocompleteRenderOptionState } from '@mui/material/Autocomplete';\nimport Typography from '@mui/material/Typography';\nimport Checkbox from '@mui/material/Checkbox';\nimport Box from '@mui/material/Box';\nimport match from 'autosuggest-highlight/match';\nimport parse from 'autosuggest-highlight/parse';\n\nimport { SelectedPlugin } from '../../types';\n\ntype PluginsDropdownOptionProps = {\n option: SelectedPlugin;\n state: AutocompleteRenderOptionState;\n props: React.HTMLAttributes<HTMLLIElement>;\n};\n\nexport const PluginsDropdownOption = ({\n props,\n option,\n state,\n}: PluginsDropdownOptionProps) => {\n const { inputValue } = state;\n const { label, value } = option;\n const matches = match(label, inputValue, { insideWords: true });\n const parts = parse(label, matches);\n\n return (\n <li\n {...props}\n key={`${label}`}\n style={{\n ...(value === '' ? { borderBottom: `1px solid #D2D2D2` } : {}),\n }}\n >\n <Box\n sx={{\n display: 'flex',\n }}\n >\n <Checkbox style={{ marginRight: 8 }} checked={state.selected} />\n <Typography component=\"span\" sx={{ marginTop: '0.5rem' }}>\n {parts.map(part => (\n <Typography\n key={`${part.text}-${label}`}\n component=\"span\"\n sx={{\n fontWeight: !inputValue || part.highlight ? 400 : 700,\n color: theme => theme.palette.text.primary,\n }}\n data-testid={option.label}\n >\n {part.text}\n </Typography>\n ))}\n </Typography>\n </Box>\n </li>\n );\n};\n"],"names":["React"],"mappings":";;;;;;;AAgCO,MAAM,wBAAwB,CAAC;AAAA,EACpC,KAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAkC,KAAA;AAChC,EAAM,MAAA,EAAE,YAAe,GAAA,KAAA;AACvB,EAAM,MAAA,EAAE,KAAO,EAAA,KAAA,EAAU,GAAA,MAAA;AACzB,EAAA,MAAM,UAAU,KAAM,CAAA,KAAA,EAAO,YAAY,EAAE,WAAA,EAAa,MAAM,CAAA;AAC9D,EAAM,MAAA,KAAA,GAAQ,KAAM,CAAA,KAAA,EAAO,OAAO,CAAA;AAElC,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,GAAA,EAAK,GAAG,KAAK,CAAA,CAAA;AAAA,MACb,KAAO,EAAA;AAAA,QACL,GAAI,KAAU,KAAA,EAAA,GAAK,EAAE,YAAc,EAAA,CAAA,iBAAA,CAAA,KAAwB;AAAC;AAC9D,KAAA;AAAA,oBAEAA,cAAA,CAAA,aAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,EAAI,EAAA;AAAA,UACF,OAAS,EAAA;AAAA;AACX,OAAA;AAAA,sBAEAA,cAAA,CAAA,aAAA,CAAC,YAAS,KAAO,EAAA,EAAE,aAAa,CAAE,EAAA,EAAG,OAAS,EAAA,KAAA,CAAM,QAAU,EAAA,CAAA;AAAA,sBAC9DA,cAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,SAAA,EAAU,MAAO,EAAA,EAAA,EAAI,EAAE,SAAA,EAAW,QAAS,EAAA,EAAA,EACpD,KAAM,CAAA,GAAA,CAAI,CACT,IAAA,qBAAAA,cAAA,CAAA,aAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,GAAK,EAAA,CAAA,EAAG,IAAK,CAAA,IAAI,IAAI,KAAK,CAAA,CAAA;AAAA,UAC1B,SAAU,EAAA,MAAA;AAAA,UACV,EAAI,EAAA;AAAA,YACF,UAAY,EAAA,CAAC,UAAc,IAAA,IAAA,CAAK,YAAY,GAAM,GAAA,GAAA;AAAA,YAClD,KAAO,EAAA,CAAA,KAAA,KAAS,KAAM,CAAA,OAAA,CAAQ,IAAK,CAAA;AAAA,WACrC;AAAA,UACA,eAAa,MAAO,CAAA;AAAA,SAAA;AAAA,QAEnB,IAAK,CAAA;AAAA,OAET,CACH;AAAA;AACF,GACF;AAEJ;;;;"}
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React__default from 'react';
2
2
  import { StructuredMetadataTable } from '@backstage/core-components';
3
3
  import Typography from '@mui/material/Typography';
4
4
  import { getPermissionsNumber } from '../../utils/create-role-utils.esm.js';
@@ -13,8 +13,8 @@ const tableMetadata = (values) => {
13
13
  values
14
14
  )})`;
15
15
  return {
16
- "Name and description of role": /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Typography, { sx: { margin: "0px" } }, values.name), /* @__PURE__ */ React.createElement("br", null), /* @__PURE__ */ React.createElement(Typography, { sx: { margin: "0px" } }, values.description)),
17
- [membersKey]: /* @__PURE__ */ React.createElement(
16
+ "Name and description of role": /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(Typography, { sx: { margin: "0px" } }, values.name), /* @__PURE__ */ React__default.createElement("br", null), /* @__PURE__ */ React__default.createElement(Typography, { sx: { margin: "0px" } }, values.description)),
17
+ [membersKey]: /* @__PURE__ */ React__default.createElement(
18
18
  ReviewStepTable,
19
19
  {
20
20
  rows: values.selectedMembers,
@@ -22,7 +22,7 @@ const tableMetadata = (values) => {
22
22
  tableWrapperWidth: 550
23
23
  }
24
24
  ),
25
- [permissionPoliciesKey]: /* @__PURE__ */ React.createElement(
25
+ [permissionPoliciesKey]: /* @__PURE__ */ React__default.createElement(
26
26
  ReviewStepTable,
27
27
  {
28
28
  rows: values.permissionPoliciesRows,
@@ -36,7 +36,7 @@ const ReviewStep = ({
36
36
  values,
37
37
  isEditing
38
38
  }) => {
39
- return /* @__PURE__ */ React.createElement("div", { style: { overflow: "auto" } }, /* @__PURE__ */ React.createElement(Typography, { variant: "h6" }, isEditing ? "Review and save" : "Review and create"), /* @__PURE__ */ React.createElement(
39
+ return /* @__PURE__ */ React__default.createElement("div", { style: { overflow: "auto" } }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "h6" }, isEditing ? "Review and save" : "Review and create"), /* @__PURE__ */ React__default.createElement(
40
40
  StructuredMetadataTable,
41
41
  {
42
42
  dense: true,
@@ -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 React from 'react';\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 ? `Users and groups (${getMembers(values.selectedMembers)})`\n : 'Users and groups';\n const permissionPoliciesKey = `Permission policies (${getPermissionsNumber(\n values,\n )})`;\n return {\n 'Name and description of role': (\n <>\n <Typography sx={{ margin: '0px' }}>{values.name}</Typography>\n <br />\n <Typography sx={{ margin: '0px' }}>{values.description}</Typography>\n </>\n ),\n [membersKey]: (\n <ReviewStepTable\n rows={values.selectedMembers}\n columns={reviewStepMemebersTableColumns()}\n tableWrapperWidth={550}\n />\n ),\n [permissionPoliciesKey]: (\n <ReviewStepTable\n rows={values.permissionPoliciesRows}\n columns={selectedPermissionPoliciesColumn()}\n tableWrapperWidth={700}\n />\n ),\n };\n};\n\nexport const ReviewStep = ({\n values,\n isEditing,\n}: {\n values: RoleFormValues;\n isEditing: boolean;\n}) => {\n return (\n <div style={{ overflow: 'auto' }}>\n <Typography variant=\"h6\">\n {isEditing ? 'Review and save' : 'Review and create'}\n </Typography>\n <StructuredMetadataTable\n dense\n metadata={tableMetadata(values)}\n options={{ titleFormat: (key: string) => key }}\n />\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AA4BA,MAAM,aAAA,GAAgB,CAAC,MAA2B,KAAA;AAChD,EAAM,MAAA,UAAA,GACJ,MAAO,CAAA,eAAA,CAAgB,MAAS,GAAA,CAAA,GAC5B,qBAAqB,UAAW,CAAA,MAAA,CAAO,eAAe,CAAC,CACvD,CAAA,CAAA,GAAA,kBAAA;AACN,EAAA,MAAM,wBAAwB,CAAwB,qBAAA,EAAA,oBAAA;AAAA,IACpD;AAAA,GACD,CAAA,CAAA,CAAA;AACD,EAAO,OAAA;AAAA,IACL,8BAAA,kBAEI,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,EAAA,EAAI,EAAE,MAAQ,EAAA,KAAA,EAAU,EAAA,EAAA,MAAA,CAAO,IAAK,CAAA,sCAC/C,IAAG,EAAA,IAAA,CAAA,kBACH,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,EAAI,EAAA,EAAE,QAAQ,KAAM,EAAA,EAAA,EAAI,MAAO,CAAA,WAAY,CACzD,CAAA;AAAA,IAEF,CAAC,UAAU,mBACT,KAAA,CAAA,aAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,MAAM,MAAO,CAAA,eAAA;AAAA,QACb,SAAS,8BAA+B,EAAA;AAAA,QACxC,iBAAmB,EAAA;AAAA;AAAA,KACrB;AAAA,IAEF,CAAC,qBAAqB,mBACpB,KAAA,CAAA,aAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,MAAM,MAAO,CAAA,sBAAA;AAAA,QACb,SAAS,gCAAiC,EAAA;AAAA,QAC1C,iBAAmB,EAAA;AAAA;AAAA;AACrB,GAEJ;AACF,CAAA;AAEO,MAAM,aAAa,CAAC;AAAA,EACzB,MAAA;AAAA,EACA;AACF,CAGM,KAAA;AACJ,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAI,KAAO,EAAA,EAAE,UAAU,MAAO,EAAA,EAAA,kBAC5B,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,IAAA,EAAA,EACjB,SAAY,GAAA,iBAAA,GAAoB,mBACnC,CACA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,uBAAA;AAAA,IAAA;AAAA,MACC,KAAK,EAAA,IAAA;AAAA,MACL,QAAA,EAAU,cAAc,MAAM,CAAA;AAAA,MAC9B,OAAS,EAAA,EAAE,WAAa,EAAA,CAAC,QAAgB,GAAI;AAAA;AAAA,GAEjD,CAAA;AAEJ;;;;"}
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 React from 'react';\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 ? `Users and groups (${getMembers(values.selectedMembers)})`\n : 'Users and groups';\n const permissionPoliciesKey = `Permission policies (${getPermissionsNumber(\n values,\n )})`;\n return {\n 'Name and description of role': (\n <>\n <Typography sx={{ margin: '0px' }}>{values.name}</Typography>\n <br />\n <Typography sx={{ margin: '0px' }}>{values.description}</Typography>\n </>\n ),\n [membersKey]: (\n <ReviewStepTable\n rows={values.selectedMembers}\n columns={reviewStepMemebersTableColumns()}\n tableWrapperWidth={550}\n />\n ),\n [permissionPoliciesKey]: (\n <ReviewStepTable\n rows={values.permissionPoliciesRows}\n columns={selectedPermissionPoliciesColumn()}\n tableWrapperWidth={700}\n />\n ),\n };\n};\n\nexport const ReviewStep = ({\n values,\n isEditing,\n}: {\n values: RoleFormValues;\n isEditing: boolean;\n}) => {\n return (\n <div style={{ overflow: 'auto' }}>\n <Typography variant=\"h6\">\n {isEditing ? 'Review and save' : 'Review and create'}\n </Typography>\n <StructuredMetadataTable\n dense\n metadata={tableMetadata(values)}\n options={{ titleFormat: (key: string) => key }}\n />\n </div>\n );\n};\n"],"names":["React"],"mappings":";;;;;;;;;AA4BA,MAAM,aAAA,GAAgB,CAAC,MAA2B,KAAA;AAChD,EAAM,MAAA,UAAA,GACJ,MAAO,CAAA,eAAA,CAAgB,MAAS,GAAA,CAAA,GAC5B,qBAAqB,UAAW,CAAA,MAAA,CAAO,eAAe,CAAC,CACvD,CAAA,CAAA,GAAA,kBAAA;AACN,EAAA,MAAM,wBAAwB,CAAwB,qBAAA,EAAA,oBAAA;AAAA,IACpD;AAAA,GACD,CAAA,CAAA,CAAA;AACD,EAAO,OAAA;AAAA,IACL,8BAAA,kBAEIA,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,EAAA,EAAI,EAAE,MAAQ,EAAA,KAAA,EAAU,EAAA,EAAA,MAAA,CAAO,IAAK,CAAA,+CAC/C,IAAG,EAAA,IAAA,CAAA,kBACHA,cAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,EAAI,EAAA,EAAE,QAAQ,KAAM,EAAA,EAAA,EAAI,MAAO,CAAA,WAAY,CACzD,CAAA;AAAA,IAEF,CAAC,UAAU,mBACTA,cAAA,CAAA,aAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,MAAM,MAAO,CAAA,eAAA;AAAA,QACb,SAAS,8BAA+B,EAAA;AAAA,QACxC,iBAAmB,EAAA;AAAA;AAAA,KACrB;AAAA,IAEF,CAAC,qBAAqB,mBACpBA,cAAA,CAAA,aAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,MAAM,MAAO,CAAA,sBAAA;AAAA,QACb,SAAS,gCAAiC,EAAA;AAAA,QAC1C,iBAAmB,EAAA;AAAA;AAAA;AACrB,GAEJ;AACF,CAAA;AAEO,MAAM,aAAa,CAAC;AAAA,EACzB,MAAA;AAAA,EACA;AACF,CAGM,KAAA;AACJ,EAAA,uBACGA,cAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAI,KAAO,EAAA,EAAE,UAAU,MAAO,EAAA,EAAA,kBAC5BA,cAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,IAAA,EAAA,EACjB,SAAY,GAAA,iBAAA,GAAoB,mBACnC,CACA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,uBAAA;AAAA,IAAA;AAAA,MACC,KAAK,EAAA,IAAA;AAAA,MACL,QAAA,EAAU,cAAc,MAAM,CAAA;AAAA,MAC9B,OAAS,EAAA,EAAE,WAAa,EAAA,CAAC,QAAgB,GAAI;AAAA;AAAA,GAEjD,CAAA;AAEJ;;;;"}
@@ -1,11 +1,11 @@
1
- import React from 'react';
1
+ import React__default from 'react';
2
2
 
3
3
  const ReviewStepTable = ({
4
4
  columns,
5
5
  rows,
6
6
  tableWrapperWidth
7
7
  }) => {
8
- return /* @__PURE__ */ React.createElement(
8
+ return /* @__PURE__ */ React__default.createElement(
9
9
  "div",
10
10
  {
11
11
  style: {
@@ -14,14 +14,14 @@ const ReviewStepTable = ({
14
14
  width: `${tableWrapperWidth}px`
15
15
  }
16
16
  },
17
- /* @__PURE__ */ React.createElement("table", { style: { width: `${tableWrapperWidth - 50}px` } }, /* @__PURE__ */ React.createElement("thead", null, /* @__PURE__ */ React.createElement("tr", null, columns.map((col) => /* @__PURE__ */ React.createElement("th", { style: { width: "150px" }, key: col.title }, col.title)))), /* @__PURE__ */ React.createElement("tbody", null, rows.map((row, rowIndex) => /* @__PURE__ */ React.createElement(React.Fragment, { key: rowIndex }, /* @__PURE__ */ React.createElement("tr", null, columns.map((rowCol) => /* @__PURE__ */ React.createElement(
17
+ /* @__PURE__ */ React__default.createElement("table", { style: { width: `${tableWrapperWidth - 50}px` } }, /* @__PURE__ */ React__default.createElement("thead", null, /* @__PURE__ */ React__default.createElement("tr", null, columns.map((col) => /* @__PURE__ */ React__default.createElement("th", { style: { width: "150px" }, key: col.title }, col.title)))), /* @__PURE__ */ React__default.createElement("tbody", null, rows.map((row, rowIndex) => /* @__PURE__ */ React__default.createElement(React__default.Fragment, { key: rowIndex }, /* @__PURE__ */ React__default.createElement("tr", null, columns.map((rowCol) => /* @__PURE__ */ React__default.createElement(
18
18
  "td",
19
19
  {
20
20
  style: { width: "150px" },
21
21
  key: `${rowCol.title}-${rowCol.field}`
22
22
  },
23
23
  rowCol.render ? rowCol.render(row[rowCol.field]) : row[rowCol.field] || (rowCol.emptyValue ?? "")
24
- ))), /* @__PURE__ */ React.createElement("tr", null)))))
24
+ ))), /* @__PURE__ */ React__default.createElement("tr", null)))))
25
25
  );
26
26
  };
27
27
 
@@ -1 +1 @@
1
- {"version":3,"file":"ReviewStepTable.esm.js","sources":["../../../src/components/CreateRole/ReviewStepTable.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nexport const ReviewStepTable = ({\n columns,\n rows,\n tableWrapperWidth,\n}: {\n columns: any[];\n rows: any[];\n tableWrapperWidth: number;\n}) => {\n return (\n <div\n style={{\n maxHeight: '230px',\n overflow: 'auto',\n width: `${tableWrapperWidth}px`,\n }}\n >\n <table style={{ width: `${tableWrapperWidth - 50}px` }}>\n <thead>\n <tr>\n {columns.map(col => (\n <th style={{ width: '150px' }} key={col.title}>\n {col.title}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, rowIndex) => (\n <React.Fragment key={rowIndex}>\n <tr>\n {columns.map(rowCol => (\n <td\n style={{ width: '150px' }}\n key={`${rowCol.title}-${rowCol.field}`}\n >\n {rowCol.render\n ? rowCol.render(row[rowCol.field])\n : row[rowCol.field] || (rowCol.emptyValue ?? '')}\n </td>\n ))}\n </tr>\n <tr />\n </React.Fragment>\n ))}\n </tbody>\n </table>\n </div>\n );\n};\n"],"names":[],"mappings":";;AAiBO,MAAM,kBAAkB,CAAC;AAAA,EAC9B,OAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAIM,KAAA;AACJ,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAO,EAAA;AAAA,QACL,SAAW,EAAA,OAAA;AAAA,QACX,QAAU,EAAA,MAAA;AAAA,QACV,KAAA,EAAO,GAAG,iBAAiB,CAAA,EAAA;AAAA;AAC7B,KAAA;AAAA,oBAEA,KAAA,CAAA,aAAA,CAAC,WAAM,KAAO,EAAA,EAAE,OAAO,CAAG,EAAA,iBAAA,GAAoB,EAAE,CAAA,EAAA,CAAA,EAC9C,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,+BACE,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EACE,OAAQ,CAAA,GAAA,CAAI,CACX,GAAA,qBAAA,KAAA,CAAA,aAAA,CAAC,QAAG,KAAO,EAAA,EAAE,KAAO,EAAA,OAAA,EAAW,EAAA,GAAA,EAAK,IAAI,KACrC,EAAA,EAAA,GAAA,CAAI,KACP,CACD,CACH,CACF,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,OACE,EAAA,IAAA,EAAA,IAAA,CAAK,GAAI,CAAA,CAAC,KAAK,QACd,qBAAA,KAAA,CAAA,aAAA,CAAC,KAAM,CAAA,QAAA,EAAN,EAAe,GAAA,EAAK,4BAClB,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EACE,OAAQ,CAAA,GAAA,CAAI,CACX,MAAA,qBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,KAAA,EAAO,OAAQ,EAAA;AAAA,QACxB,KAAK,CAAG,EAAA,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,OAAO,KAAK,CAAA;AAAA,OAAA;AAAA,MAEnC,MAAO,CAAA,MAAA,GACJ,MAAO,CAAA,MAAA,CAAO,IAAI,MAAO,CAAA,KAAK,CAAC,CAAA,GAC/B,GAAI,CAAA,MAAA,CAAO,KAAK,CAAA,KAAM,OAAO,UAAc,IAAA,EAAA;AAAA,KAElD,CACH,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,UAAG,CACN,CACD,CACH,CACF;AAAA,GACF;AAEJ;;;;"}
1
+ {"version":3,"file":"ReviewStepTable.esm.js","sources":["../../../src/components/CreateRole/ReviewStepTable.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nexport const ReviewStepTable = ({\n columns,\n rows,\n tableWrapperWidth,\n}: {\n columns: any[];\n rows: any[];\n tableWrapperWidth: number;\n}) => {\n return (\n <div\n style={{\n maxHeight: '230px',\n overflow: 'auto',\n width: `${tableWrapperWidth}px`,\n }}\n >\n <table style={{ width: `${tableWrapperWidth - 50}px` }}>\n <thead>\n <tr>\n {columns.map(col => (\n <th style={{ width: '150px' }} key={col.title}>\n {col.title}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, rowIndex) => (\n <React.Fragment key={rowIndex}>\n <tr>\n {columns.map(rowCol => (\n <td\n style={{ width: '150px' }}\n key={`${rowCol.title}-${rowCol.field}`}\n >\n {rowCol.render\n ? rowCol.render(row[rowCol.field])\n : row[rowCol.field] || (rowCol.emptyValue ?? '')}\n </td>\n ))}\n </tr>\n <tr />\n </React.Fragment>\n ))}\n </tbody>\n </table>\n </div>\n );\n};\n"],"names":["React"],"mappings":";;AAiBO,MAAM,kBAAkB,CAAC;AAAA,EAC9B,OAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAIM,KAAA;AACJ,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAO,EAAA;AAAA,QACL,SAAW,EAAA,OAAA;AAAA,QACX,QAAU,EAAA,MAAA;AAAA,QACV,KAAA,EAAO,GAAG,iBAAiB,CAAA,EAAA;AAAA;AAC7B,KAAA;AAAA,oBAEAA,cAAA,CAAA,aAAA,CAAC,WAAM,KAAO,EAAA,EAAE,OAAO,CAAG,EAAA,iBAAA,GAAoB,EAAE,CAAA,EAAA,CAAA,EAC9C,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,+BACEA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EACE,OAAQ,CAAA,GAAA,CAAI,CACX,GAAA,qBAAAA,cAAA,CAAA,aAAA,CAAC,QAAG,KAAO,EAAA,EAAE,KAAO,EAAA,OAAA,EAAW,EAAA,GAAA,EAAK,IAAI,KACrC,EAAA,EAAA,GAAA,CAAI,KACP,CACD,CACH,CACF,CACA,kBAAAA,cAAA,CAAA,aAAA,CAAC,OACE,EAAA,IAAA,EAAA,IAAA,CAAK,GAAI,CAAA,CAAC,KAAK,QACd,qBAAAA,cAAA,CAAA,aAAA,CAACA,cAAM,CAAA,QAAA,EAAN,EAAe,GAAA,EAAK,4BAClBA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EACE,OAAQ,CAAA,GAAA,CAAI,CACX,MAAA,qBAAAA,cAAA,CAAA,aAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,KAAA,EAAO,OAAQ,EAAA;AAAA,QACxB,KAAK,CAAG,EAAA,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,OAAO,KAAK,CAAA;AAAA,OAAA;AAAA,MAEnC,MAAO,CAAA,MAAA,GACJ,MAAO,CAAA,MAAA,CAAO,IAAI,MAAO,CAAA,KAAK,CAAC,CAAA,GAC/B,GAAI,CAAA,MAAA,CAAO,KAAK,CAAA,KAAM,OAAO,UAAc,IAAA,EAAA;AAAA,KAElD,CACH,CACA,kBAAAA,cAAA,CAAA,aAAA,CAAC,UAAG,CACN,CACD,CACH,CACF;AAAA,GACF;AAEJ;;;;"}
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React__default from 'react';
2
2
  import TextField from '@mui/material/TextField';
3
3
 
4
4
  const RoleDetailsForm = ({
@@ -8,7 +8,7 @@ const RoleDetailsForm = ({
8
8
  handleBlur,
9
9
  handleChange
10
10
  }) => {
11
- return /* @__PURE__ */ React.createElement(
11
+ return /* @__PURE__ */ React__default.createElement(
12
12
  "div",
13
13
  {
14
14
  style: {
@@ -17,7 +17,7 @@ const RoleDetailsForm = ({
17
17
  gap: "20px"
18
18
  }
19
19
  },
20
- /* @__PURE__ */ React.createElement(
20
+ /* @__PURE__ */ React__default.createElement(
21
21
  TextField,
22
22
  {
23
23
  required: true,
@@ -34,7 +34,7 @@ const RoleDetailsForm = ({
34
34
  error: !!nameError
35
35
  }
36
36
  ),
37
- /* @__PURE__ */ React.createElement(
37
+ /* @__PURE__ */ React__default.createElement(
38
38
  TextField,
39
39
  {
40
40
  label: "Description",
@@ -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 React from 'react';\n\nimport TextField from '@mui/material/TextField';\n\ntype RoleDetailsFormProps = {\n name: string;\n description?: string;\n nameError?: string;\n handleBlur: React.FocusEventHandler<HTMLInputElement | HTMLTextAreaElement>;\n handleChange: React.ChangeEventHandler<\n HTMLTextAreaElement | HTMLInputElement\n >;\n};\n\nexport const RoleDetailsForm = ({\n name,\n description,\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=\"Name\"\n variant=\"outlined\"\n id=\"role-name\"\n data-testid=\"role-name\"\n aria-labelledby=\"name\"\n helperText={nameError ?? 'Enter name of the role'}\n value={name}\n name=\"name\"\n onChange={handleChange}\n onBlur={handleBlur}\n error={!!nameError}\n />\n <TextField\n label=\"Description\"\n variant=\"outlined\"\n helperText=\"Enter a brief description about the role (The purpose of the role)\"\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 </div>\n );\n};\n"],"names":[],"mappings":";;;AA6BO,MAAM,kBAAkB,CAAC;AAAA,EAC9B,IAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAA4B,KAAA;AAC1B,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAO,EAAA;AAAA,QACL,OAAS,EAAA,MAAA;AAAA,QACT,aAAe,EAAA,QAAA;AAAA,QACf,GAAK,EAAA;AAAA;AACP,KAAA;AAAA,oBAEA,KAAA,CAAA,aAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,QAAQ,EAAA,IAAA;AAAA,QACR,KAAM,EAAA,MAAA;AAAA,QACN,OAAQ,EAAA,UAAA;AAAA,QACR,EAAG,EAAA,WAAA;AAAA,QACH,aAAY,EAAA,WAAA;AAAA,QACZ,iBAAgB,EAAA,MAAA;AAAA,QAChB,YAAY,SAAa,IAAA,wBAAA;AAAA,QACzB,KAAO,EAAA,IAAA;AAAA,QACP,IAAK,EAAA,MAAA;AAAA,QACL,QAAU,EAAA,YAAA;AAAA,QACV,MAAQ,EAAA,UAAA;AAAA,QACR,KAAA,EAAO,CAAC,CAAC;AAAA;AAAA,KACX;AAAA,oBACA,KAAA,CAAA,aAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,KAAM,EAAA,aAAA;AAAA,QACN,OAAQ,EAAA,UAAA;AAAA,QACR,UAAW,EAAA,oEAAA;AAAA,QACX,KAAO,EAAA,WAAA;AAAA,QACP,aAAY,EAAA,kBAAA;AAAA,QACZ,EAAG,EAAA,kBAAA;AAAA,QACH,IAAK,EAAA,aAAA;AAAA,QACL,iBAAgB,EAAA,aAAA;AAAA,QAChB,QAAU,EAAA,YAAA;AAAA,QACV,MAAQ,EAAA,UAAA;AAAA,QACR,SAAS,EAAA;AAAA;AAAA;AACX,GACF;AAEJ;;;;"}
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 React from 'react';\n\nimport TextField from '@mui/material/TextField';\n\ntype RoleDetailsFormProps = {\n name: string;\n description?: string;\n nameError?: string;\n handleBlur: React.FocusEventHandler<HTMLInputElement | HTMLTextAreaElement>;\n handleChange: React.ChangeEventHandler<\n HTMLTextAreaElement | HTMLInputElement\n >;\n};\n\nexport const RoleDetailsForm = ({\n name,\n description,\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=\"Name\"\n variant=\"outlined\"\n id=\"role-name\"\n data-testid=\"role-name\"\n aria-labelledby=\"name\"\n helperText={nameError ?? 'Enter name of the role'}\n value={name}\n name=\"name\"\n onChange={handleChange}\n onBlur={handleBlur}\n error={!!nameError}\n />\n <TextField\n label=\"Description\"\n variant=\"outlined\"\n helperText=\"Enter a brief description about the role (The purpose of the role)\"\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 </div>\n );\n};\n"],"names":["React"],"mappings":";;;AA6BO,MAAM,kBAAkB,CAAC;AAAA,EAC9B,IAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAA4B,KAAA;AAC1B,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAO,EAAA;AAAA,QACL,OAAS,EAAA,MAAA;AAAA,QACT,aAAe,EAAA,QAAA;AAAA,QACf,GAAK,EAAA;AAAA;AACP,KAAA;AAAA,oBAEAA,cAAA,CAAA,aAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,QAAQ,EAAA,IAAA;AAAA,QACR,KAAM,EAAA,MAAA;AAAA,QACN,OAAQ,EAAA,UAAA;AAAA,QACR,EAAG,EAAA,WAAA;AAAA,QACH,aAAY,EAAA,WAAA;AAAA,QACZ,iBAAgB,EAAA,MAAA;AAAA,QAChB,YAAY,SAAa,IAAA,wBAAA;AAAA,QACzB,KAAO,EAAA,IAAA;AAAA,QACP,IAAK,EAAA,MAAA;AAAA,QACL,QAAU,EAAA,YAAA;AAAA,QACV,MAAQ,EAAA,UAAA;AAAA,QACR,KAAA,EAAO,CAAC,CAAC;AAAA;AAAA,KACX;AAAA,oBACAA,cAAA,CAAA,aAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,KAAM,EAAA,aAAA;AAAA,QACN,OAAQ,EAAA,UAAA;AAAA,QACR,UAAW,EAAA,oEAAA;AAAA,QACX,KAAO,EAAA,WAAA;AAAA,QACP,aAAY,EAAA,kBAAA;AAAA,QACZ,EAAG,EAAA,kBAAA;AAAA,QACH,IAAK,EAAA,aAAA;AAAA,QACL,iBAAgB,EAAA,aAAA;AAAA,QAChB,QAAU,EAAA,YAAA;AAAA,QACV,MAAQ,EAAA,UAAA;AAAA,QACR,SAAS,EAAA;AAAA;AAAA;AACX,GACF;AAEJ;;;;"}
@@ -1,6 +1,5 @@
1
- import React from 'react';
1
+ import React__default from 'react';
2
2
  import { useNavigate } from 'react-router-dom';
3
- import { parseEntityRef } from '@backstage/catalog-model';
4
3
  import { SimpleStepper, SimpleStepperStep } from '@backstage/core-components';
5
4
  import { useApi } from '@backstage/core-plugin-api';
6
5
  import Alert from '@mui/material/Alert';
@@ -15,12 +14,13 @@ import { useFormik } from 'formik';
15
14
  import { rbacApiRef } from '../../api/RBACBackendClient.esm.js';
16
15
  import { validationSchema, getRoleData, getPermissionPoliciesData, getNewConditionalPolicies, getRemovedConditionalPoliciesIds, getUpdatedConditionalPolicies, getConditionalPermissionPoliciesData } from '../../utils/create-role-utils.esm.js';
17
16
  import { onlyInLeft, isSamePermissionPolicy } from '../../utils/rbac-utils.esm.js';
18
- import { removePermissions, createPermissions, removeConditions, modifyConditions, createConditions } from '../../utils/role-form-utils.esm.js';
17
+ import { navigateTo, removePermissions, createPermissions, removeConditions, modifyConditions, createConditions } from '../../utils/role-form-utils.esm.js';
19
18
  import { AddedMembersTable } from './AddedMembersTable.esm.js';
20
19
  import { AddMembersForm } from './AddMembersForm.esm.js';
21
20
  import { PermissionPoliciesForm } from './PermissionPoliciesForm.esm.js';
22
21
  import { ReviewStep } from './ReviewStep.esm.js';
23
22
  import { RoleDetailsForm } from './RoleDetailsForm.esm.js';
23
+ import CancelDialog from './CancelDialog.esm.js';
24
24
 
25
25
  const RoleForm = ({
26
26
  roleName,
@@ -30,23 +30,10 @@ const RoleForm = ({
30
30
  submitLabel,
31
31
  initialValues
32
32
  }) => {
33
- const [activeStep, setActiveStep] = React.useState(step || 0);
33
+ const [activeStep, setActiveStep] = React__default.useState(step || 0);
34
+ const [openCancelDialog, setOpenCancelDialog] = React__default.useState(false);
34
35
  const navigate = useNavigate();
35
36
  const rbacApi = useApi(rbacApiRef);
36
- const navigateTo = (rName, action) => {
37
- const currentRoleName = rName || roleName;
38
- const stateProp = currentRoleName && action ? {
39
- state: {
40
- toastMessage: `Role ${currentRoleName} ${action} successfully`
41
- }
42
- } : undefined;
43
- if (step && currentRoleName) {
44
- const { kind, namespace, name } = parseEntityRef(currentRoleName);
45
- navigate(`../roles/${kind}/${namespace}/${name}`, stateProp);
46
- } else {
47
- navigate("..", stateProp);
48
- }
49
- };
50
37
  const updateRole = async (name, values, formikHelpers) => {
51
38
  try {
52
39
  const newData = getRoleData(values);
@@ -84,7 +71,7 @@ const RoleForm = ({
84
71
  await removeConditions(deleteConditions, rbacApi);
85
72
  await modifyConditions(updateConditions, rbacApi);
86
73
  await createConditions(newConditions, rbacApi);
87
- navigateTo(newName, "updated");
74
+ navigateTo(navigate, roleName, newName, "updated", step);
88
75
  }
89
76
  } catch (e) {
90
77
  formikHelpers.setStatus({ submitError: e });
@@ -111,7 +98,7 @@ const RoleForm = ({
111
98
  rbacApi,
112
99
  "Role created successfully but unable to add conditions to the role."
113
100
  );
114
- navigateTo(newData.name, "created");
101
+ navigateTo(navigate, roleName, newData.name, "created", step);
115
102
  } catch (e) {
116
103
  formikHelpers.setStatus({ submitError: e });
117
104
  }
@@ -158,24 +145,21 @@ const RoleForm = ({
158
145
  }
159
146
  };
160
147
  const canNextPermissionPoliciesStep = () => {
161
- return formik.values.permissionPoliciesRows.filter((pp) => !!pp.plugin).length === formik.values.permissionPoliciesRows.length && (!formik.errors.permissionPoliciesRows || formik.errors.permissionPoliciesRows?.filter((err) => !!err)?.length === 0);
148
+ return !!formik.values.selectedPlugins.length && formik.values.permissionPoliciesRows.filter((pp) => !!pp?.plugin).length === formik.values.permissionPoliciesRows.length && !formik.errors.selectedPlugins && (!formik.errors.permissionPoliciesRows || Array.isArray(formik.errors.permissionPoliciesRows) && formik.errors.permissionPoliciesRows?.filter((err) => !!err)?.length === 0);
162
149
  };
163
150
  const handleBack = () => setActiveStep(Math.max(activeStep - 1, 0));
164
- const handleCancel = () => {
165
- navigateTo();
166
- };
167
151
  const handleReset = (e) => {
168
152
  setActiveStep(0);
169
153
  formik.handleReset(e);
170
154
  };
171
- return /* @__PURE__ */ React.createElement(Card, { style: { overflow: "auto" } }, /* @__PURE__ */ React.createElement(CardHeader, { title: titles.formTitle }), /* @__PURE__ */ React.createElement(Divider, null), /* @__PURE__ */ React.createElement(
155
+ return /* @__PURE__ */ React__default.createElement(Card, { style: { overflow: "auto" } }, /* @__PURE__ */ React__default.createElement(CardHeader, { title: titles.formTitle }), /* @__PURE__ */ React__default.createElement(Divider, null), /* @__PURE__ */ React__default.createElement(
172
156
  CardContent,
173
157
  {
174
158
  component: "form",
175
159
  onSubmit: formik.handleSubmit,
176
160
  style: { position: "relative" }
177
161
  },
178
- /* @__PURE__ */ React.createElement(SimpleStepper, { activeStep }, /* @__PURE__ */ React.createElement(
162
+ /* @__PURE__ */ React__default.createElement(SimpleStepper, { activeStep }, /* @__PURE__ */ React__default.createElement(
179
163
  SimpleStepperStep,
180
164
  {
181
165
  title: titles.nameAndDescriptionTitle,
@@ -187,7 +171,7 @@ const RoleForm = ({
187
171
  onNext: () => handleNext("name")
188
172
  }
189
173
  },
190
- /* @__PURE__ */ React.createElement(
174
+ /* @__PURE__ */ React__default.createElement(
191
175
  RoleDetailsForm,
192
176
  {
193
177
  name: formik.values.name,
@@ -197,7 +181,7 @@ const RoleForm = ({
197
181
  nameError: formik.errors.name
198
182
  }
199
183
  )
200
- ), /* @__PURE__ */ React.createElement(
184
+ ), /* @__PURE__ */ React__default.createElement(
201
185
  SimpleStepperStep,
202
186
  {
203
187
  title: titles.usersAndGroupsTitle,
@@ -211,7 +195,7 @@ const RoleForm = ({
211
195
  onBack: handleBack
212
196
  }
213
197
  },
214
- /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(
198
+ /* @__PURE__ */ React__default.createElement(Box, null, /* @__PURE__ */ React__default.createElement(
215
199
  AddMembersForm,
216
200
  {
217
201
  selectedMembers: formik.values.selectedMembers,
@@ -219,14 +203,14 @@ const RoleForm = ({
219
203
  setFieldValue: formik.setFieldValue,
220
204
  membersData
221
205
  }
222
- ), /* @__PURE__ */ React.createElement("br", null), /* @__PURE__ */ React.createElement(
206
+ ), /* @__PURE__ */ React__default.createElement("br", null), /* @__PURE__ */ React__default.createElement(
223
207
  AddedMembersTable,
224
208
  {
225
209
  selectedMembers: formik.values.selectedMembers,
226
210
  setFieldValue: formik.setFieldValue
227
211
  }
228
212
  ))
229
- ), /* @__PURE__ */ React.createElement(
213
+ ), /* @__PURE__ */ React__default.createElement(
230
214
  SimpleStepperStep,
231
215
  {
232
216
  title: titles.permissionPoliciesTitle,
@@ -240,17 +224,18 @@ const RoleForm = ({
240
224
  onBack: handleBack
241
225
  }
242
226
  },
243
- /* @__PURE__ */ React.createElement(
227
+ /* @__PURE__ */ React__default.createElement(
244
228
  PermissionPoliciesForm,
245
229
  {
246
230
  permissionPoliciesRows: formik.values.permissionPoliciesRows,
247
- permissionPoliciesRowsError: formik.errors.permissionPoliciesRows,
231
+ selectedPlugins: formik.values.selectedPlugins,
232
+ selectedPluginsError: formik.errors.selectedPlugins,
248
233
  setFieldValue: formik.setFieldValue,
249
234
  setFieldError: formik.setFieldError,
250
235
  handleBlur: formik.handleBlur
251
236
  }
252
237
  )
253
- ), /* @__PURE__ */ React.createElement(SimpleStepperStep, { title: "", end: true }, /* @__PURE__ */ React.createElement(Paper, { square: true, elevation: 0 }, /* @__PURE__ */ React.createElement(ReviewStep, { values: formik.values, isEditing: !!roleName }), /* @__PURE__ */ React.createElement("br", null), /* @__PURE__ */ React.createElement(Button, { onClick: handleBack }, "Back"), /* @__PURE__ */ React.createElement(Button, { onClick: (e) => handleReset(e) }, "Reset"), /* @__PURE__ */ React.createElement(
238
+ ), /* @__PURE__ */ React__default.createElement(SimpleStepperStep, { title: "", end: true }, /* @__PURE__ */ React__default.createElement(Paper, { square: true, elevation: 0 }, /* @__PURE__ */ React__default.createElement(ReviewStep, { values: formik.values, isEditing: !!roleName }), /* @__PURE__ */ React__default.createElement("br", null), /* @__PURE__ */ React__default.createElement(Button, { onClick: handleBack }, "Back"), /* @__PURE__ */ React__default.createElement(Button, { onClick: (e) => handleReset(e) }, "Reset"), /* @__PURE__ */ React__default.createElement(
254
239
  Button,
255
240
  {
256
241
  variant: "contained",
@@ -260,16 +245,24 @@ const RoleForm = ({
260
245
  },
261
246
  submitLabel || "Create"
262
247
  )))),
263
- formik.status?.submitError && /* @__PURE__ */ React.createElement(Box, { style: { paddingBottom: "16px" } }, /* @__PURE__ */ React.createElement(Alert, { severity: "error" }, `${formik.status.submitError}`)),
264
- /* @__PURE__ */ React.createElement(
248
+ formik.status?.submitError && /* @__PURE__ */ React__default.createElement(Box, { style: { paddingBottom: "16px" } }, /* @__PURE__ */ React__default.createElement(Alert, { severity: "error" }, `${formik.status.submitError}`)),
249
+ /* @__PURE__ */ React__default.createElement(
265
250
  Button,
266
251
  {
267
252
  style: { position: "absolute", right: "2.75rem", bottom: "2.75rem" },
268
- onClick: handleCancel,
253
+ onClick: () => setOpenCancelDialog(true),
269
254
  color: "primary"
270
255
  },
271
256
  "Cancel"
272
257
  )
258
+ ), /* @__PURE__ */ React__default.createElement(
259
+ CancelDialog,
260
+ {
261
+ open: openCancelDialog,
262
+ editForm: !!roleName,
263
+ closeDialog: () => setOpenCancelDialog(false),
264
+ navigateTo: () => navigateTo(navigate, roleName, undefined, undefined, step)
265
+ }
273
266
  ));
274
267
  };
275
268
 
@@ -1 +1 @@
1
- {"version":3,"file":"RoleForm.esm.js","sources":["../../../src/components/CreateRole/RoleForm.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { parseEntityRef } from '@backstage/catalog-model';\nimport { SimpleStepper, SimpleStepperStep } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport Alert from '@mui/material/Alert';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport CardHeader from '@mui/material/CardHeader';\nimport Divider from '@mui/material/Divider';\nimport Paper from '@mui/material/Paper';\nimport { FormikErrors, FormikHelpers, useFormik } from 'formik';\n\nimport { rbacApiRef } from '../../api/RBACBackendClient';\nimport { MemberEntity, PermissionsData, RoleError } from '../../types';\nimport {\n getConditionalPermissionPoliciesData,\n getNewConditionalPolicies,\n getPermissionPoliciesData,\n getRemovedConditionalPoliciesIds,\n getRoleData,\n getUpdatedConditionalPolicies,\n validationSchema,\n} from '../../utils/create-role-utils';\nimport { isSamePermissionPolicy, onlyInLeft } from '../../utils/rbac-utils';\nimport {\n createConditions,\n createPermissions,\n modifyConditions,\n removeConditions,\n removePermissions,\n} from '../../utils/role-form-utils';\nimport { AddedMembersTable } from './AddedMembersTable';\nimport { AddMembersForm } from './AddMembersForm';\nimport { PermissionPoliciesForm } from './PermissionPoliciesForm';\nimport { ReviewStep } from './ReviewStep';\nimport { RoleDetailsForm } from './RoleDetailsForm';\nimport { RoleFormValues } from './types';\n\ntype RoleFormProps = {\n membersData: { members: MemberEntity[]; loading: boolean; error: Error };\n titles: {\n formTitle: string;\n nameAndDescriptionTitle: string;\n usersAndGroupsTitle: string;\n permissionPoliciesTitle: string;\n };\n submitLabel?: string;\n roleName?: string;\n step?: number;\n initialValues: RoleFormValues;\n};\n\nexport const RoleForm = ({\n roleName,\n step,\n titles,\n membersData,\n submitLabel,\n initialValues,\n}: RoleFormProps) => {\n const [activeStep, setActiveStep] = React.useState<number>(step || 0);\n const navigate = useNavigate();\n const rbacApi = useApi(rbacApiRef);\n\n const navigateTo = (rName?: string, action?: string) => {\n const currentRoleName = rName || roleName;\n const stateProp =\n currentRoleName && action\n ? {\n state: {\n toastMessage: `Role ${currentRoleName} ${action} successfully`,\n },\n }\n : undefined;\n if (step && currentRoleName) {\n const { kind, namespace, name } = parseEntityRef(currentRoleName);\n navigate(`../roles/${kind}/${namespace}/${name}`, stateProp);\n } else {\n navigate('..', stateProp);\n }\n };\n\n const updateRole = async (\n name: string,\n values: RoleFormValues,\n formikHelpers: FormikHelpers<RoleFormValues>,\n ) => {\n try {\n const newData = getRoleData(values);\n const newName = newData.name;\n const newPermissionsData = getPermissionPoliciesData(values);\n const newConditions = getNewConditionalPolicies(values);\n const deleteConditions = getRemovedConditionalPoliciesIds(\n values,\n initialValues,\n );\n const updateConditions = getUpdatedConditionalPolicies(\n values,\n initialValues,\n );\n\n const oldData = getRoleData(initialValues);\n const res = await rbacApi.updateRole(oldData, newData);\n if ((res as RoleError).error) {\n throw new Error(\n `${'Unable to edit the role. '}${(res as RoleError).error.message}`,\n );\n } else {\n const oldPermissionsData = getPermissionPoliciesData(initialValues);\n const newPermissions = onlyInLeft(\n newPermissionsData,\n oldPermissionsData,\n isSamePermissionPolicy,\n );\n const deletePermissions = onlyInLeft(\n oldPermissionsData,\n newPermissionsData,\n isSamePermissionPolicy,\n );\n\n await removePermissions(name, deletePermissions, rbacApi);\n await createPermissions(newPermissions, rbacApi);\n\n await removeConditions(deleteConditions, rbacApi);\n await modifyConditions(updateConditions, rbacApi);\n await createConditions(newConditions, rbacApi);\n\n navigateTo(newName, 'updated');\n }\n } catch (e) {\n formikHelpers.setStatus({ submitError: e });\n }\n };\n\n const newRole = async (\n values: RoleFormValues,\n formikHelpers: FormikHelpers<RoleFormValues>,\n ) => {\n try {\n const newData = getRoleData(values);\n const newPermissionsData = getPermissionPoliciesData(values);\n const newConditionalPermissionPoliciesData =\n getConditionalPermissionPoliciesData(values);\n\n const res = await rbacApi.createRole(newData);\n if ((res as RoleError).error) {\n throw new Error(\n `${'Unable to create role. '}${(res as RoleError).error.message}`,\n );\n }\n\n await createPermissions(\n newPermissionsData,\n rbacApi,\n 'Role was created successfully but unable to add permission policies to the role.',\n );\n\n await createConditions(\n newConditionalPermissionPoliciesData,\n rbacApi,\n 'Role created successfully but unable to add conditions to the role.',\n );\n\n navigateTo(newData.name, 'created');\n } catch (e) {\n formikHelpers.setStatus({ submitError: e });\n }\n };\n\n const formik = useFormik<RoleFormValues>({\n enableReinitialize: true,\n initialValues,\n validationSchema: validationSchema,\n onSubmit: async (\n values: RoleFormValues,\n formikHelpers: FormikHelpers<RoleFormValues>,\n ) => {\n if (roleName) {\n updateRole(roleName, values, formikHelpers);\n } else {\n newRole(values, formikHelpers);\n }\n },\n });\n\n const validateStepField = (fieldName: string) => {\n switch (fieldName) {\n case 'name': {\n formik.validateField(fieldName);\n return formik.errors.name;\n }\n case 'selectedMembers': {\n formik.validateField(fieldName);\n return formik.errors.selectedMembers;\n }\n case 'permissionPoliciesRows': {\n formik.values.permissionPoliciesRows.forEach((_pp, index) => {\n formik.validateField(`permissionPoliciesRows[${index}].plugin`);\n formik.validateField(`permissionPoliciesRows[${index}].permission`);\n });\n return formik.errors.permissionPoliciesRows;\n }\n default:\n return undefined;\n }\n };\n\n const handleNext = (fieldName?: string) => {\n const error = fieldName && validateStepField(fieldName);\n if (!fieldName || !error) {\n formik.setErrors({});\n const stepNum = Math.min(activeStep + 1, 3);\n setActiveStep(stepNum);\n }\n };\n\n const canNextPermissionPoliciesStep = () => {\n return (\n formik.values.permissionPoliciesRows.filter(pp => !!pp.plugin).length ===\n formik.values.permissionPoliciesRows.length &&\n (!formik.errors.permissionPoliciesRows ||\n (\n formik.errors.permissionPoliciesRows as unknown as FormikErrors<\n PermissionsData[]\n >[]\n )?.filter(err => !!err)?.length === 0)\n );\n };\n\n const handleBack = () => setActiveStep(Math.max(activeStep - 1, 0));\n const handleCancel = () => {\n navigateTo();\n };\n\n const handleReset = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n setActiveStep(0);\n formik.handleReset(e);\n };\n\n return (\n <Card style={{ overflow: 'auto' }}>\n <CardHeader title={titles.formTitle} />\n <Divider />\n <CardContent\n component=\"form\"\n onSubmit={formik.handleSubmit}\n style={{ position: 'relative' }}\n >\n <SimpleStepper activeStep={activeStep}>\n <SimpleStepperStep\n title={titles.nameAndDescriptionTitle}\n actions={{\n showBack: false,\n showNext: true,\n nextText: 'Next',\n canNext: () => !!formik.values.name && !formik.errors.name,\n onNext: () => handleNext('name'),\n }}\n >\n <RoleDetailsForm\n name={formik.values.name}\n description={formik.values.description}\n handleBlur={formik.handleBlur}\n handleChange={formik.handleChange}\n nameError={formik.errors.name}\n />\n </SimpleStepperStep>\n <SimpleStepperStep\n title={titles.usersAndGroupsTitle}\n actions={{\n showNext: true,\n nextText: 'Next',\n canNext: () =>\n formik.values.selectedMembers?.length > 0 &&\n !formik.errors.selectedMembers,\n onNext: () => handleNext('selectedMembers'),\n showBack: true,\n backText: 'Back',\n onBack: handleBack,\n }}\n >\n <Box>\n <AddMembersForm\n selectedMembers={formik.values.selectedMembers}\n selectedMembersError={formik.errors.selectedMembers as string}\n setFieldValue={formik.setFieldValue}\n membersData={membersData}\n />\n <br />\n <AddedMembersTable\n selectedMembers={formik.values.selectedMembers}\n setFieldValue={formik.setFieldValue}\n />\n </Box>\n </SimpleStepperStep>\n <SimpleStepperStep\n title={titles.permissionPoliciesTitle}\n actions={{\n showNext: true,\n nextText: 'Next',\n canNext: () => canNextPermissionPoliciesStep(),\n onNext: () => handleNext('permissionPoliciesRows'),\n showBack: true,\n backText: 'Back',\n onBack: handleBack,\n }}\n >\n <PermissionPoliciesForm\n permissionPoliciesRows={formik.values.permissionPoliciesRows}\n permissionPoliciesRowsError={\n formik.errors\n .permissionPoliciesRows as FormikErrors<PermissionsData>[]\n }\n setFieldValue={formik.setFieldValue}\n setFieldError={formik.setFieldError}\n handleBlur={formik.handleBlur}\n />\n </SimpleStepperStep>\n <SimpleStepperStep title=\"\" end>\n <Paper square elevation={0}>\n <ReviewStep values={formik.values} isEditing={!!roleName} />\n <br />\n <Button onClick={handleBack}>Back</Button>\n <Button onClick={e => handleReset(e)}>Reset</Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n type=\"submit\"\n disabled={\n !!formik.errors.name ||\n !!formik.errors.selectedMembers ||\n !formik.dirty\n }\n >\n {submitLabel || 'Create'}\n </Button>\n </Paper>\n </SimpleStepperStep>\n </SimpleStepper>\n {formik.status?.submitError && (\n <Box style={{ paddingBottom: '16px' }}>\n <Alert severity=\"error\">{`${formik.status.submitError}`}</Alert>\n </Box>\n )}\n <Button\n style={{ position: 'absolute', right: '2.75rem', bottom: '2.75rem' }}\n onClick={handleCancel}\n color=\"primary\"\n >\n Cancel\n </Button>\n </CardContent>\n </Card>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RoleForm.esm.js","sources":["../../../src/components/CreateRole/RoleForm.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { SimpleStepper, SimpleStepperStep } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport Alert from '@mui/material/Alert';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport CardHeader from '@mui/material/CardHeader';\nimport Divider from '@mui/material/Divider';\nimport Paper from '@mui/material/Paper';\nimport { FormikErrors, FormikHelpers, useFormik } from 'formik';\n\nimport { rbacApiRef } from '../../api/RBACBackendClient';\nimport { MemberEntity, PermissionsData, RoleError } from '../../types';\nimport {\n getConditionalPermissionPoliciesData,\n getNewConditionalPolicies,\n getPermissionPoliciesData,\n getRemovedConditionalPoliciesIds,\n getRoleData,\n getUpdatedConditionalPolicies,\n validationSchema,\n} from '../../utils/create-role-utils';\nimport { isSamePermissionPolicy, onlyInLeft } from '../../utils/rbac-utils';\nimport {\n createConditions,\n createPermissions,\n modifyConditions,\n navigateTo,\n removeConditions,\n removePermissions,\n} from '../../utils/role-form-utils';\nimport { AddedMembersTable } from './AddedMembersTable';\nimport { AddMembersForm } from './AddMembersForm';\nimport { PermissionPoliciesForm } from './PermissionPoliciesForm';\nimport { ReviewStep } from './ReviewStep';\nimport { RoleDetailsForm } from './RoleDetailsForm';\nimport { RoleFormValues } from './types';\nimport CancelDialog from './CancelDialog';\n\ntype RoleFormProps = {\n membersData: { members: MemberEntity[]; loading: boolean; error: Error };\n titles: {\n formTitle: string;\n nameAndDescriptionTitle: string;\n usersAndGroupsTitle: string;\n permissionPoliciesTitle: string;\n };\n submitLabel?: string;\n roleName?: string;\n step?: number;\n initialValues: RoleFormValues;\n};\n\nexport const RoleForm = ({\n roleName,\n step,\n titles,\n membersData,\n submitLabel,\n initialValues,\n}: RoleFormProps) => {\n const [activeStep, setActiveStep] = React.useState<number>(step || 0);\n const [openCancelDialog, setOpenCancelDialog] =\n React.useState<boolean>(false);\n const navigate = useNavigate();\n const rbacApi = useApi(rbacApiRef);\n\n const updateRole = async (\n name: string,\n values: RoleFormValues,\n formikHelpers: FormikHelpers<RoleFormValues>,\n ) => {\n try {\n const newData = getRoleData(values);\n const newName = newData.name;\n const newPermissionsData = getPermissionPoliciesData(values);\n const newConditions = getNewConditionalPolicies(values);\n const deleteConditions = getRemovedConditionalPoliciesIds(\n values,\n initialValues,\n );\n const updateConditions = getUpdatedConditionalPolicies(\n values,\n initialValues,\n );\n\n const oldData = getRoleData(initialValues);\n const res = await rbacApi.updateRole(oldData, newData);\n if ((res as RoleError).error) {\n throw new Error(\n `${'Unable to edit the role. '}${(res as RoleError).error.message}`,\n );\n } else {\n const oldPermissionsData = getPermissionPoliciesData(initialValues);\n const newPermissions = onlyInLeft(\n newPermissionsData,\n oldPermissionsData,\n isSamePermissionPolicy,\n );\n const deletePermissions = onlyInLeft(\n oldPermissionsData,\n newPermissionsData,\n isSamePermissionPolicy,\n );\n\n await removePermissions(name, deletePermissions, rbacApi);\n await createPermissions(newPermissions, rbacApi);\n\n await removeConditions(deleteConditions, rbacApi);\n await modifyConditions(updateConditions, rbacApi);\n await createConditions(newConditions, rbacApi);\n\n navigateTo(navigate, roleName, newName, 'updated', step);\n }\n } catch (e) {\n formikHelpers.setStatus({ submitError: e });\n }\n };\n\n const newRole = async (\n values: RoleFormValues,\n formikHelpers: FormikHelpers<RoleFormValues>,\n ) => {\n try {\n const newData = getRoleData(values);\n const newPermissionsData = getPermissionPoliciesData(values);\n const newConditionalPermissionPoliciesData =\n getConditionalPermissionPoliciesData(values);\n\n const res = await rbacApi.createRole(newData);\n if ((res as RoleError).error) {\n throw new Error(\n `${'Unable to create role. '}${(res as RoleError).error.message}`,\n );\n }\n\n await createPermissions(\n newPermissionsData,\n rbacApi,\n 'Role was created successfully but unable to add permission policies to the role.',\n );\n\n await createConditions(\n newConditionalPermissionPoliciesData,\n rbacApi,\n 'Role created successfully but unable to add conditions to the role.',\n );\n\n navigateTo(navigate, roleName, newData.name, 'created', step);\n } catch (e) {\n formikHelpers.setStatus({ submitError: e });\n }\n };\n\n const formik = useFormik<RoleFormValues>({\n enableReinitialize: true,\n initialValues,\n validationSchema: validationSchema,\n onSubmit: async (\n values: RoleFormValues,\n formikHelpers: FormikHelpers<RoleFormValues>,\n ) => {\n if (roleName) {\n updateRole(roleName, values, formikHelpers);\n } else {\n newRole(values, formikHelpers);\n }\n },\n });\n\n const validateStepField = (fieldName: string) => {\n switch (fieldName) {\n case 'name': {\n formik.validateField(fieldName);\n return formik.errors.name;\n }\n case 'selectedMembers': {\n formik.validateField(fieldName);\n return formik.errors.selectedMembers;\n }\n case 'permissionPoliciesRows': {\n formik.values.permissionPoliciesRows.forEach((_pp, index) => {\n formik.validateField(`permissionPoliciesRows[${index}].plugin`);\n formik.validateField(`permissionPoliciesRows[${index}].permission`);\n });\n return formik.errors.permissionPoliciesRows;\n }\n default:\n return undefined;\n }\n };\n\n const handleNext = (fieldName?: string) => {\n const error = fieldName && validateStepField(fieldName);\n if (!fieldName || !error) {\n formik.setErrors({});\n const stepNum = Math.min(activeStep + 1, 3);\n setActiveStep(stepNum);\n }\n };\n\n const canNextPermissionPoliciesStep = () => {\n return (\n !!formik.values.selectedPlugins.length &&\n formik.values.permissionPoliciesRows.filter(pp => !!pp?.plugin).length ===\n formik.values.permissionPoliciesRows.length &&\n !formik.errors.selectedPlugins &&\n (!formik.errors.permissionPoliciesRows ||\n (Array.isArray(formik.errors.permissionPoliciesRows) &&\n (\n formik.errors.permissionPoliciesRows as unknown as FormikErrors<\n PermissionsData[]\n >[]\n )?.filter(err => !!err)?.length === 0))\n );\n };\n\n const handleBack = () => setActiveStep(Math.max(activeStep - 1, 0));\n\n const handleReset = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n setActiveStep(0);\n formik.handleReset(e);\n };\n\n return (\n <Card style={{ overflow: 'auto' }}>\n <CardHeader title={titles.formTitle} />\n <Divider />\n <CardContent\n component=\"form\"\n onSubmit={formik.handleSubmit}\n style={{ position: 'relative' }}\n >\n <SimpleStepper activeStep={activeStep}>\n <SimpleStepperStep\n title={titles.nameAndDescriptionTitle}\n actions={{\n showBack: false,\n showNext: true,\n nextText: 'Next',\n canNext: () => !!formik.values.name && !formik.errors.name,\n onNext: () => handleNext('name'),\n }}\n >\n <RoleDetailsForm\n name={formik.values.name}\n description={formik.values.description}\n handleBlur={formik.handleBlur}\n handleChange={formik.handleChange}\n nameError={formik.errors.name}\n />\n </SimpleStepperStep>\n <SimpleStepperStep\n title={titles.usersAndGroupsTitle}\n actions={{\n showNext: true,\n nextText: 'Next',\n canNext: () =>\n formik.values.selectedMembers?.length > 0 &&\n !formik.errors.selectedMembers,\n onNext: () => handleNext('selectedMembers'),\n showBack: true,\n backText: 'Back',\n onBack: handleBack,\n }}\n >\n <Box>\n <AddMembersForm\n selectedMembers={formik.values.selectedMembers}\n selectedMembersError={formik.errors.selectedMembers as string}\n setFieldValue={formik.setFieldValue}\n membersData={membersData}\n />\n <br />\n <AddedMembersTable\n selectedMembers={formik.values.selectedMembers}\n setFieldValue={formik.setFieldValue}\n />\n </Box>\n </SimpleStepperStep>\n <SimpleStepperStep\n title={titles.permissionPoliciesTitle}\n actions={{\n showNext: true,\n nextText: 'Next',\n canNext: () => canNextPermissionPoliciesStep(),\n onNext: () => handleNext('permissionPoliciesRows'),\n showBack: true,\n backText: 'Back',\n onBack: handleBack,\n }}\n >\n <PermissionPoliciesForm\n permissionPoliciesRows={formik.values.permissionPoliciesRows}\n selectedPlugins={formik.values.selectedPlugins}\n selectedPluginsError={\n formik.errors.selectedPlugins as FormikErrors<string>\n }\n setFieldValue={formik.setFieldValue}\n setFieldError={formik.setFieldError}\n handleBlur={formik.handleBlur}\n />\n </SimpleStepperStep>\n <SimpleStepperStep title=\"\" end>\n <Paper square elevation={0}>\n <ReviewStep values={formik.values} isEditing={!!roleName} />\n <br />\n <Button onClick={handleBack}>Back</Button>\n <Button onClick={e => handleReset(e)}>Reset</Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n type=\"submit\"\n disabled={\n !!formik.errors.name ||\n !!formik.errors.selectedMembers ||\n !formik.dirty\n }\n >\n {submitLabel || 'Create'}\n </Button>\n </Paper>\n </SimpleStepperStep>\n </SimpleStepper>\n {formik.status?.submitError && (\n <Box style={{ paddingBottom: '16px' }}>\n <Alert severity=\"error\">{`${formik.status.submitError}`}</Alert>\n </Box>\n )}\n <Button\n style={{ position: 'absolute', right: '2.75rem', bottom: '2.75rem' }}\n onClick={() => setOpenCancelDialog(true)}\n color=\"primary\"\n >\n Cancel\n </Button>\n </CardContent>\n <CancelDialog\n open={openCancelDialog}\n editForm={!!roleName}\n closeDialog={() => setOpenCancelDialog(false)}\n navigateTo={() =>\n navigateTo(navigate, roleName, undefined, undefined, step)\n }\n />\n </Card>\n );\n};\n"],"names":["React"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React__default from 'react';
2
2
  import { useApi } from '@backstage/core-plugin-api';
3
3
  import Button from '@mui/material/Button';
4
4
  import { licensedUsersApiRef } from '../api/LicensedUsersClient.esm.js';
@@ -29,7 +29,7 @@ function DownloadCSVLink() {
29
29
  throw new Error(`Error during the download: ${error}`);
30
30
  }
31
31
  };
32
- return /* @__PURE__ */ React.createElement(
32
+ return /* @__PURE__ */ React__default.createElement(
33
33
  Button,
34
34
  {
35
35
  href: "/download-csv",
@@ -1 +1 @@
1
- {"version":3,"file":"DownloadUserStatistics.esm.js","sources":["../../src/components/DownloadUserStatistics.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport Button from '@mui/material/Button';\n\nimport { licensedUsersApiRef } from '../api/LicensedUsersClient';\n\nfunction DownloadCSVLink() {\n const licensedUsersClient = useApi(licensedUsersApiRef);\n const handleDownload = async (\n event: React.MouseEvent<HTMLAnchorElement, MouseEvent>,\n ) => {\n event.preventDefault(); // Prevent the default link behavior\n\n try {\n const response = await licensedUsersClient.downloadStatistics();\n\n if (response.ok) {\n // Get the CSV data as a string\n const csvData = await response.text();\n\n // Create a Blob from the CSV data\n const blob = new Blob([csvData], { type: 'text/csv' });\n const url = window.URL.createObjectURL(blob);\n\n // Create a temporary link to trigger the download\n const a = document.createElement('a');\n a.href = url;\n a.download = 'licensed-users.csv';\n document.body.appendChild(a);\n a.click();\n\n // Clean up the temporary link and object URL\n document.body.removeChild(a);\n window.URL.revokeObjectURL(url);\n } else {\n throw new Error(\n `Failed to download the csv file with list licensed users ${response.statusText}`,\n );\n }\n } catch (error) {\n throw new Error(`Error during the download: ${error}`);\n }\n };\n\n return (\n <Button\n href=\"/download-csv\"\n onClick={handleDownload}\n sx={{\n color: theme => theme.palette.link,\n textDecoration: 'underline',\n marginTop: '1rem',\n }}\n size=\"small\"\n >\n Download User List\n </Button>\n );\n}\n\nexport default DownloadCSVLink;\n"],"names":[],"mappings":";;;;;AAuBA,SAAS,eAAkB,GAAA;AACzB,EAAM,MAAA,mBAAA,GAAsB,OAAO,mBAAmB,CAAA;AACtD,EAAM,MAAA,cAAA,GAAiB,OACrB,KACG,KAAA;AACH,IAAA,KAAA,CAAM,cAAe,EAAA;AAErB,IAAI,IAAA;AACF,MAAM,MAAA,QAAA,GAAW,MAAM,mBAAA,CAAoB,kBAAmB,EAAA;AAE9D,MAAA,IAAI,SAAS,EAAI,EAAA;AAEf,QAAM,MAAA,OAAA,GAAU,MAAM,QAAA,CAAS,IAAK,EAAA;AAGpC,QAAM,MAAA,IAAA,GAAO,IAAI,IAAK,CAAA,CAAC,OAAO,CAAG,EAAA,EAAE,IAAM,EAAA,UAAA,EAAY,CAAA;AACrD,QAAA,MAAM,GAAM,GAAA,MAAA,CAAO,GAAI,CAAA,eAAA,CAAgB,IAAI,CAAA;AAG3C,QAAM,MAAA,CAAA,GAAI,QAAS,CAAA,aAAA,CAAc,GAAG,CAAA;AACpC,QAAA,CAAA,CAAE,IAAO,GAAA,GAAA;AACT,QAAA,CAAA,CAAE,QAAW,GAAA,oBAAA;AACb,QAAS,QAAA,CAAA,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,QAAA,CAAA,CAAE,KAAM,EAAA;AAGR,QAAS,QAAA,CAAA,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,QAAO,MAAA,CAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAAA,OACzB,MAAA;AACL,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,0DAAA,EAA6D,SAAS,UAAU,CAAA;AAAA,SAClF;AAAA;AACF,aACO,KAAO,EAAA;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAA8B,2BAAA,EAAA,KAAK,CAAE,CAAA,CAAA;AAAA;AACvD,GACF;AAEA,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,IAAK,EAAA,eAAA;AAAA,MACL,OAAS,EAAA,cAAA;AAAA,MACT,EAAI,EAAA;AAAA,QACF,KAAA,EAAO,CAAS,KAAA,KAAA,KAAA,CAAM,OAAQ,CAAA,IAAA;AAAA,QAC9B,cAAgB,EAAA,WAAA;AAAA,QAChB,SAAW,EAAA;AAAA,OACb;AAAA,MACA,IAAK,EAAA;AAAA,KAAA;AAAA,IACN;AAAA,GAED;AAEJ;;;;"}
1
+ {"version":3,"file":"DownloadUserStatistics.esm.js","sources":["../../src/components/DownloadUserStatistics.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport Button from '@mui/material/Button';\n\nimport { licensedUsersApiRef } from '../api/LicensedUsersClient';\n\nfunction DownloadCSVLink() {\n const licensedUsersClient = useApi(licensedUsersApiRef);\n const handleDownload = async (\n event: React.MouseEvent<HTMLAnchorElement, MouseEvent>,\n ) => {\n event.preventDefault(); // Prevent the default link behavior\n\n try {\n const response = await licensedUsersClient.downloadStatistics();\n\n if (response.ok) {\n // Get the CSV data as a string\n const csvData = await response.text();\n\n // Create a Blob from the CSV data\n const blob = new Blob([csvData], { type: 'text/csv' });\n const url = window.URL.createObjectURL(blob);\n\n // Create a temporary link to trigger the download\n const a = document.createElement('a');\n a.href = url;\n a.download = 'licensed-users.csv';\n document.body.appendChild(a);\n a.click();\n\n // Clean up the temporary link and object URL\n document.body.removeChild(a);\n window.URL.revokeObjectURL(url);\n } else {\n throw new Error(\n `Failed to download the csv file with list licensed users ${response.statusText}`,\n );\n }\n } catch (error) {\n throw new Error(`Error during the download: ${error}`);\n }\n };\n\n return (\n <Button\n href=\"/download-csv\"\n onClick={handleDownload}\n sx={{\n color: theme => theme.palette.link,\n textDecoration: 'underline',\n marginTop: '1rem',\n }}\n size=\"small\"\n >\n Download User List\n </Button>\n );\n}\n\nexport default DownloadCSVLink;\n"],"names":["React"],"mappings":";;;;;AAuBA,SAAS,eAAkB,GAAA;AACzB,EAAM,MAAA,mBAAA,GAAsB,OAAO,mBAAmB,CAAA;AACtD,EAAM,MAAA,cAAA,GAAiB,OACrB,KACG,KAAA;AACH,IAAA,KAAA,CAAM,cAAe,EAAA;AAErB,IAAI,IAAA;AACF,MAAM,MAAA,QAAA,GAAW,MAAM,mBAAA,CAAoB,kBAAmB,EAAA;AAE9D,MAAA,IAAI,SAAS,EAAI,EAAA;AAEf,QAAM,MAAA,OAAA,GAAU,MAAM,QAAA,CAAS,IAAK,EAAA;AAGpC,QAAM,MAAA,IAAA,GAAO,IAAI,IAAK,CAAA,CAAC,OAAO,CAAG,EAAA,EAAE,IAAM,EAAA,UAAA,EAAY,CAAA;AACrD,QAAA,MAAM,GAAM,GAAA,MAAA,CAAO,GAAI,CAAA,eAAA,CAAgB,IAAI,CAAA;AAG3C,QAAM,MAAA,CAAA,GAAI,QAAS,CAAA,aAAA,CAAc,GAAG,CAAA;AACpC,QAAA,CAAA,CAAE,IAAO,GAAA,GAAA;AACT,QAAA,CAAA,CAAE,QAAW,GAAA,oBAAA;AACb,QAAS,QAAA,CAAA,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,QAAA,CAAA,CAAE,KAAM,EAAA;AAGR,QAAS,QAAA,CAAA,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,QAAO,MAAA,CAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAAA,OACzB,MAAA;AACL,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,0DAAA,EAA6D,SAAS,UAAU,CAAA;AAAA,SAClF;AAAA;AACF,aACO,KAAO,EAAA;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAA8B,2BAAA,EAAA,KAAK,CAAE,CAAA,CAAA;AAAA;AACvD,GACF;AAEA,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,IAAK,EAAA,eAAA;AAAA,MACL,OAAS,EAAA,cAAA;AAAA,MACT,EAAI,EAAA;AAAA,QACF,KAAA,EAAO,CAAS,KAAA,KAAA,KAAA,CAAM,OAAQ,CAAA,IAAA;AAAA,QAC9B,cAAgB,EAAA,WAAA;AAAA,QAChB,SAAW,EAAA;AAAA,OACb;AAAA,MACA,IAAK,EAAA;AAAA,KAAA;AAAA,IACN;AAAA,GAED;AAEJ;;;;"}
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React__default from 'react';
2
2
  import { parseEntityRef } from '@backstage/catalog-model';
3
3
  import { Link } from '@backstage/core-components';
4
4
  import EditIcon from '@mui/icons-material/Edit';
@@ -14,7 +14,7 @@ const EditRole = ({
14
14
  to
15
15
  }) => {
16
16
  const { name, namespace, kind } = parseEntityRef(roleName);
17
- return /* @__PURE__ */ React.createElement(Tooltip, { title: tooltip ?? "" }, /* @__PURE__ */ React.createElement(Typography, { component: "span", "data-testid": dataTestId }, /* @__PURE__ */ React.createElement(
17
+ return /* @__PURE__ */ React__default.createElement(Tooltip, { title: tooltip ?? "" }, /* @__PURE__ */ React__default.createElement(Typography, { component: "span", "data-testid": dataTestId }, /* @__PURE__ */ React__default.createElement(
18
18
  IconButton,
19
19
  {
20
20
  component: Link,
@@ -25,7 +25,7 @@ const EditRole = ({
25
25
  style: { padding: "0.5rem", color: "inherit", borderRadius: "50%" },
26
26
  sx: { "&:hover": { borderRadius: "50%" } }
27
27
  },
28
- /* @__PURE__ */ React.createElement(EditIcon, null)
28
+ /* @__PURE__ */ React__default.createElement(EditIcon, null)
29
29
  )));
30
30
  };
31
31
 
@@ -1 +1 @@
1
- {"version":3,"file":"EditRole.esm.js","sources":["../../src/components/EditRole.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport { parseEntityRef } from '@backstage/catalog-model';\nimport { Link } from '@backstage/core-components';\n\nimport EditIcon from '@mui/icons-material/Edit';\nimport IconButton from '@mui/material/IconButton';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\n\ntype EditRoleProps = {\n roleName: string;\n disable: boolean;\n tooltip?: string;\n dataTestId: string;\n to?: string;\n};\n\nconst EditRole = ({\n roleName,\n tooltip,\n disable,\n dataTestId,\n to,\n}: EditRoleProps) => {\n const { name, namespace, kind } = parseEntityRef(roleName);\n return (\n <Tooltip title={tooltip ?? ''}>\n <Typography component=\"span\" data-testid={dataTestId}>\n <IconButton\n component={Link}\n aria-label=\"Update\"\n disabled={disable}\n title={tooltip ?? 'Edit Role'}\n to={to ?? `../role/${kind}/${namespace}/${name}`}\n style={{ padding: '0.5rem', color: 'inherit', borderRadius: '50%' }}\n sx={{ '&:hover': { borderRadius: '50%' } }}\n >\n <EditIcon />\n </IconButton>\n </Typography>\n </Tooltip>\n );\n};\n\nexport default EditRole;\n"],"names":[],"mappings":";;;;;;;;AAiCA,MAAM,WAAW,CAAC;AAAA,EAChB,QAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAqB,KAAA;AACnB,EAAA,MAAM,EAAE,IAAM,EAAA,SAAA,EAAW,IAAK,EAAA,GAAI,eAAe,QAAQ,CAAA;AACzD,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,OAAQ,EAAA,EAAA,KAAA,EAAO,OAAW,IAAA,EAAA,EAAA,sCACxB,UAAW,EAAA,EAAA,SAAA,EAAU,MAAO,EAAA,aAAA,EAAa,UACxC,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,SAAW,EAAA,IAAA;AAAA,MACX,YAAW,EAAA,QAAA;AAAA,MACX,QAAU,EAAA,OAAA;AAAA,MACV,OAAO,OAAW,IAAA,WAAA;AAAA,MAClB,IAAI,EAAM,IAAA,CAAA,QAAA,EAAW,IAAI,CAAI,CAAA,EAAA,SAAS,IAAI,IAAI,CAAA,CAAA;AAAA,MAC9C,OAAO,EAAE,OAAA,EAAS,UAAU,KAAO,EAAA,SAAA,EAAW,cAAc,KAAM,EAAA;AAAA,MAClE,IAAI,EAAE,SAAA,EAAW,EAAE,YAAA,EAAc,OAAQ;AAAA,KAAA;AAAA,wCAExC,QAAS,EAAA,IAAA;AAAA,GAEd,CACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"EditRole.esm.js","sources":["../../src/components/EditRole.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport { parseEntityRef } from '@backstage/catalog-model';\nimport { Link } from '@backstage/core-components';\n\nimport EditIcon from '@mui/icons-material/Edit';\nimport IconButton from '@mui/material/IconButton';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\n\ntype EditRoleProps = {\n roleName: string;\n disable: boolean;\n tooltip?: string;\n dataTestId: string;\n to?: string;\n};\n\nconst EditRole = ({\n roleName,\n tooltip,\n disable,\n dataTestId,\n to,\n}: EditRoleProps) => {\n const { name, namespace, kind } = parseEntityRef(roleName);\n return (\n <Tooltip title={tooltip ?? ''}>\n <Typography component=\"span\" data-testid={dataTestId}>\n <IconButton\n component={Link}\n aria-label=\"Update\"\n disabled={disable}\n title={tooltip ?? 'Edit Role'}\n to={to ?? `../role/${kind}/${namespace}/${name}`}\n style={{ padding: '0.5rem', color: 'inherit', borderRadius: '50%' }}\n sx={{ '&:hover': { borderRadius: '50%' } }}\n >\n <EditIcon />\n </IconButton>\n </Typography>\n </Tooltip>\n );\n};\n\nexport default EditRole;\n"],"names":["React"],"mappings":";;;;;;;;AAiCA,MAAM,WAAW,CAAC;AAAA,EAChB,QAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAqB,KAAA;AACnB,EAAA,MAAM,EAAE,IAAM,EAAA,SAAA,EAAW,IAAK,EAAA,GAAI,eAAe,QAAQ,CAAA;AACzD,EACE,uBAAAA,cAAA,CAAA,aAAA,CAAC,OAAQ,EAAA,EAAA,KAAA,EAAO,OAAW,IAAA,EAAA,EAAA,+CACxB,UAAW,EAAA,EAAA,SAAA,EAAU,MAAO,EAAA,aAAA,EAAa,UACxC,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,SAAW,EAAA,IAAA;AAAA,MACX,YAAW,EAAA,QAAA;AAAA,MACX,QAAU,EAAA,OAAA;AAAA,MACV,OAAO,OAAW,IAAA,WAAA;AAAA,MAClB,IAAI,EAAM,IAAA,CAAA,QAAA,EAAW,IAAI,CAAI,CAAA,EAAA,SAAS,IAAI,IAAI,CAAA,CAAA;AAAA,MAC9C,OAAO,EAAE,OAAA,EAAS,UAAU,KAAO,EAAA,SAAA,EAAW,cAAc,KAAM,EAAA;AAAA,MAClE,IAAI,EAAE,SAAA,EAAW,EAAE,YAAA,EAAc,OAAQ;AAAA,KAAA;AAAA,iDAExC,QAAS,EAAA,IAAA;AAAA,GAEd,CACF,CAAA;AAEJ;;;;"}