@backstage-community/plugin-rbac 1.50.1 → 1.51.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 (34) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/alpha/translations/de.esm.js +2 -0
  3. package/dist/alpha/translations/de.esm.js.map +1 -1
  4. package/dist/alpha/translations/es.esm.js +2 -0
  5. package/dist/alpha/translations/es.esm.js.map +1 -1
  6. package/dist/alpha/translations/fr.esm.js +2 -0
  7. package/dist/alpha/translations/fr.esm.js.map +1 -1
  8. package/dist/alpha/translations/it.esm.js +2 -0
  9. package/dist/alpha/translations/it.esm.js.map +1 -1
  10. package/dist/alpha/translations/ref.esm.js +2 -0
  11. package/dist/alpha/translations/ref.esm.js.map +1 -1
  12. package/dist/alpha.d.ts +2 -0
  13. package/dist/components/CreateRole/EditRolePage.esm.js +3 -0
  14. package/dist/components/CreateRole/EditRolePage.esm.js.map +1 -1
  15. package/dist/components/EditRole.esm.js +2 -3
  16. package/dist/components/EditRole.esm.js.map +1 -1
  17. package/dist/components/RoleOverview/MembersCard.esm.js +8 -4
  18. package/dist/components/RoleOverview/MembersCard.esm.js.map +1 -1
  19. package/dist/components/RoleOverview/PermissionsCard.esm.js +18 -5
  20. package/dist/components/RoleOverview/PermissionsCard.esm.js.map +1 -1
  21. package/dist/components/RoleOverview/RoleOverviewPage.esm.js +2 -1
  22. package/dist/components/RoleOverview/RoleOverviewPage.esm.js.map +1 -1
  23. package/dist/components/RolesList/DeleteRole.esm.js +2 -3
  24. package/dist/components/RolesList/DeleteRole.esm.js.map +1 -1
  25. package/dist/components/RolesList/RolesListColumns.esm.js +23 -17
  26. package/dist/components/RolesList/RolesListColumns.esm.js.map +1 -1
  27. package/dist/hooks/useActionPermissionTooltip.esm.js +1 -1
  28. package/dist/hooks/useActionPermissionTooltip.esm.js.map +1 -1
  29. package/dist/hooks/useMembers.esm.js +3 -1
  30. package/dist/hooks/useMembers.esm.js.map +1 -1
  31. package/dist/hooks/useRoles.esm.js +2 -1
  32. package/dist/hooks/useRoles.esm.js.map +1 -1
  33. package/dist/package.json.esm.js +1 -1
  34. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"ref.esm.js","sources":["../../../src/alpha/translations/ref.ts"],"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 { createTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nexport const rbacMessages = {\n page: {\n title: 'RBAC',\n createRole: 'Create role',\n editRole: 'Edit role',\n },\n table: {\n searchPlaceholder: 'Filter',\n labelRowsSelect: 'Rows',\n title: 'All roles',\n titleWithCount: 'All roles ({{count}})',\n headers: {\n name: 'Name',\n usersAndGroups: 'Users and groups',\n accessiblePlugins: 'Accessible plugins',\n actions: 'Actions',\n },\n emptyContent: 'No records found',\n },\n toolbar: {\n createButton: 'Create',\n warning: {\n title: 'Unable to create role.',\n message:\n 'To enable create/edit role button, make sure required users/groups are available in catalog as a role cannot be created without users/groups and also the role associated with your user should have the permission policies mentioned <link>here</link>.',\n linkText: 'here',\n note: 'Note',\n noteText:\n 'Even after ingesting users/groups in catalog and applying above permissions if the create/edit button is still disabled then please contact your administrator as you might be conditionally restricted from accessing the create/edit button.',\n },\n },\n errors: {\n notFound: 'Not Found',\n notAllowed: 'Insufficient permissions to access this page',\n unauthorized: 'Unauthorized to create role',\n rbacDisabled: 'Enable the RBAC backend plugin to use this feature.',\n rbacDisabledInfo:\n 'To enable RBAC, set `permission.enabled` to `true` in the app-config file.',\n fetchRoles: 'Something went wrong while fetching the roles',\n fetchRole: 'Something went wrong while fetching the role',\n fetchPoliciesErr: 'Error fetching the policies. {{error}}',\n fetchPolicies:\n 'Something went wrong while fetching the permission policies',\n fetchPlugins: 'Error fetching the plugins. {{error}}',\n fetchConditionalPermissionPolicies:\n 'Error fetching the conditional permission policies. {{error}}',\n fetchConditions: 'Something went wrong while fetching the role conditions',\n fetchUsersAndGroups:\n 'Something went wrong while fetching the users and groups',\n createRole: 'Unable to create role.',\n editRole: 'Unable to edit the role.',\n deleteRole: 'Unable to delete the role.',\n roleCreatedSuccess:\n 'Role was created successfully but unable to add permission policies to the role.',\n roleCreatedConditionsSuccess:\n 'Role created successfully but unable to add conditions to the role.',\n },\n roleForm: {\n titles: {\n createRole: 'Create Role',\n editRole: 'Edit Role',\n nameAndDescription: 'Enter name and description of role',\n usersAndGroups: 'Add users and groups',\n permissionPolicies: 'Add permission policies',\n },\n review: {\n reviewAndCreate: 'Review and create',\n reviewAndSave: 'Review and save',\n nameDescriptionOwner: 'Name, description, and owner of role',\n permissionPoliciesWithCount: 'Permission policies ({{count}})',\n },\n steps: {\n next: 'Next',\n back: 'Back',\n cancel: 'Cancel',\n reset: 'Reset',\n create: 'Create',\n save: 'Save',\n },\n fields: {\n name: {\n label: 'Name',\n helperText: 'Enter name of the role',\n },\n description: {\n label: 'Description',\n helperText:\n 'Enter a brief description about the role (The purpose of the role)',\n },\n owner: {\n label: 'Owner',\n helperText:\n 'Optional: Enter a user or group who will have permission to edit this role and create additional roles. In the next step, specify which users they can assign to their roles and which plugins they can grant access to. If left blank, automatically assigns the author at creation.',\n },\n },\n },\n deleteDialog: {\n title: 'Delete Role',\n question: 'Delete this role?',\n confirmation:\n 'Are you sure you want to delete the role **{{roleName}}**?\\n\\nDeleting this role is irreversible and will remove its functionality from the system. Proceed with caution.\\n\\nThe **{{members}}** associated with this role will lose access to all the **{{permissions}} permission policies** specified in this role.',\n roleNameLabel: 'Role name',\n roleNameHelper: 'Type the name of the role to confirm',\n deleteButton: 'Delete',\n cancelButton: 'Cancel',\n successMessage: 'Role {{roleName}} deleted successfully',\n },\n snackbar: {\n success: 'Success',\n },\n dialog: {\n cancelRoleCreation: 'Cancel role creation',\n exitRoleCreation: 'Exit role creation?',\n exitRoleEditing: 'Exit role editing?',\n exitWarning:\n '\\n\\nExiting this page will permanently discard the information you entered.\\n\\nAre you sure you want to exit?',\n discard: 'Discard',\n cancel: 'Cancel',\n },\n conditionalAccess: {\n condition: 'Condition',\n allOf: 'AllOf',\n anyOf: 'AnyOf',\n not: 'Not',\n addNestedCondition: 'Add nested condition',\n addRule: 'Add rule',\n nestedConditionTooltip:\n 'Nested conditions are **1 layer rules within a main condition**. It lets you allow appropriate access by using detailed permissions based on various conditions. You can add multiple nested conditions.',\n nestedConditionExample:\n 'For example, you can allow access to all entity types in the main condition and use a nested condition to limit the access to entities owned by the user.',\n },\n permissionPolicies: {\n helperText:\n 'By default, users are not granted access to any plugins. To grant user access, select the plugins you want to enable. Then, select which actions you would like to give user permission to.',\n allPlugins: 'All plugins ({{count}})',\n errorFetchingPolicies: 'Error fetching the permission policies: {{error}}',\n resourceTypeTooltip: 'resource type: {{resourceType}}',\n advancedPermissionsTooltip:\n 'Use advanced customized permissions to allow access to specific parts of the selected resource type.',\n noAdvancedPermissionsTooltip:\n 'Advanced customization is not supported for this resource type.',\n pluginsSelected: '{{count}} plugins',\n noPluginsSelected: 'No plugins selected',\n search: 'Search',\n noRecordsToDisplay: 'No records to display.',\n selectedPluginsAppearHere: 'Selected plugins appear here.',\n selectPlugins: 'Select plugins',\n noPluginsFound: 'No plugins found.',\n plugin: 'Plugin',\n permission: 'Permission',\n policies: 'Policies',\n conditional: 'Conditional',\n rules: 'rules',\n rule: 'rule',\n permissionPolicies: 'Permission Policies',\n permissions: 'permissions',\n },\n common: {\n noResults: 'No results for this date range.',\n exportCSV: 'Export CSV',\n csvFilename: 'data-export.csv',\n noMembers: 'No members',\n groups: 'groups',\n group: 'group',\n users: 'users',\n user: 'user',\n use: 'Use',\n refresh: 'Refresh',\n edit: 'Edit',\n unauthorizedToEdit: 'Unauthorized to edit',\n noRecordsFound: 'No records found',\n selectUsersAndGroups: 'Select users and groups',\n clearSearch: 'clear search',\n closeDrawer: 'Close the drawer',\n remove: 'Remove',\n addRule: 'Add rule',\n selectRule: 'Select a rule',\n rule: 'Rule',\n removeNestedCondition: 'Remove nested condition',\n overview: 'Overview',\n about: 'About',\n description: 'Description',\n modifiedBy: 'Modified By',\n lastModified: 'Last Modified',\n owner: 'Owner',\n noUsersAndGroupsSelected: 'No users and groups selected',\n selectedUsersAndGroupsAppearHere: 'Selected users and groups appear here.',\n name: 'Name',\n type: 'Type',\n members: 'Members',\n actions: 'Actions',\n removeMember: 'Remove member',\n delete: 'Delete',\n deleteRole: 'Delete Role',\n update: 'Update',\n editRole: 'Edit Role',\n checkingPermissions: 'Checking permissions…',\n unauthorizedTo: 'Unauthorized to {{action}}',\n performThisAction: 'perform this action',\n unableToCreatePermissionPolicies:\n 'Unable to create the permission policies.',\n unableToDeletePermissionPolicies:\n 'Unable to delete the permission policies.',\n unableToRemoveConditions: 'Unable to remove conditions from the role.',\n unableToUpdateConditions: 'Unable to update conditions.',\n unableToAddConditions: 'Unable to add conditions to the role.',\n roleActionSuccessfully: 'Role {{roleName}} {{action}} successfully',\n unableToFetchRole: 'Unable to fetch role: {{error}}',\n unableToFetchMembers: 'Unable to fetch members: {{error}}',\n roleAction: '{{action}} role',\n membersCount: '{{count}} members',\n parentGroupCount: '{{count}} parent group',\n childGroupsCount: '{{count}} child groups',\n searchAndSelectUsersGroups:\n 'Search and select users and groups to be added. Selected users and groups will appear in the table below.',\n noUsersAndGroupsFound: 'No users and groups found.',\n errorFetchingUserGroups: 'Error fetching user and groups: {{error}}',\n nameRequired: 'Name is required',\n noMemberSelected: 'No member selected',\n noPluginSelected: 'No plugin selected',\n pluginRequired: 'Plugin is required',\n permissionRequired: 'Permission is required',\n editCell: 'Edit...',\n selectCell: 'Select...',\n expandRow: 'expand row',\n configureAccessFor: 'Configure access for the',\n defaultResourceTypeVisible:\n 'By default, the selected resource type is visible to all added users. If you want to restrict or grant permission to specific plugin rules, select them and add the parameters.',\n },\n};\n\n/**\n * Translation reference for RBAC plugin\n * @public\n */\nexport const rbacTranslationRef = createTranslationRef({\n id: 'plugin.rbac',\n messages: rbacMessages,\n});\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ref.esm.js","sources":["../../../src/alpha/translations/ref.ts"],"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 { createTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nexport const rbacMessages = {\n page: {\n title: 'RBAC',\n createRole: 'Create role',\n editRole: 'Edit role',\n },\n table: {\n searchPlaceholder: 'Filter',\n labelRowsSelect: 'Rows',\n title: 'All roles',\n titleWithCount: 'All roles ({{count}})',\n headers: {\n name: 'Name',\n usersAndGroups: 'Users and groups',\n accessiblePlugins: 'Accessible plugins',\n actions: 'Actions',\n },\n defaultRoleUsersAndGroups: 'All users and all groups',\n emptyContent: 'No records found',\n },\n toolbar: {\n createButton: 'Create',\n warning: {\n title: 'Unable to create role.',\n message:\n 'To enable create/edit role button, make sure required users/groups are available in catalog as a role cannot be created without users/groups and also the role associated with your user should have the permission policies mentioned <link>here</link>.',\n linkText: 'here',\n note: 'Note',\n noteText:\n 'Even after ingesting users/groups in catalog and applying above permissions if the create/edit button is still disabled then please contact your administrator as you might be conditionally restricted from accessing the create/edit button.',\n },\n },\n errors: {\n notFound: 'Not Found',\n notAllowed: 'Insufficient permissions to access this page',\n unauthorized: 'Unauthorized to create role',\n rbacDisabled: 'Enable the RBAC backend plugin to use this feature.',\n rbacDisabledInfo:\n 'To enable RBAC, set `permission.enabled` to `true` in the app-config file.',\n fetchRoles: 'Something went wrong while fetching the roles',\n fetchRole: 'Something went wrong while fetching the role',\n fetchPoliciesErr: 'Error fetching the policies. {{error}}',\n fetchPolicies:\n 'Something went wrong while fetching the permission policies',\n fetchPlugins: 'Error fetching the plugins. {{error}}',\n fetchConditionalPermissionPolicies:\n 'Error fetching the conditional permission policies. {{error}}',\n fetchConditions: 'Something went wrong while fetching the role conditions',\n fetchUsersAndGroups:\n 'Something went wrong while fetching the users and groups',\n createRole: 'Unable to create role.',\n editRole: 'Unable to edit the role.',\n deleteRole: 'Unable to delete the role.',\n defaultRoleReadOnly: 'Default role is read-only.',\n roleCreatedSuccess:\n 'Role was created successfully but unable to add permission policies to the role.',\n roleCreatedConditionsSuccess:\n 'Role created successfully but unable to add conditions to the role.',\n },\n roleForm: {\n titles: {\n createRole: 'Create Role',\n editRole: 'Edit Role',\n nameAndDescription: 'Enter name and description of role',\n usersAndGroups: 'Add users and groups',\n permissionPolicies: 'Add permission policies',\n },\n review: {\n reviewAndCreate: 'Review and create',\n reviewAndSave: 'Review and save',\n nameDescriptionOwner: 'Name, description, and owner of role',\n permissionPoliciesWithCount: 'Permission policies ({{count}})',\n },\n steps: {\n next: 'Next',\n back: 'Back',\n cancel: 'Cancel',\n reset: 'Reset',\n create: 'Create',\n save: 'Save',\n },\n fields: {\n name: {\n label: 'Name',\n helperText: 'Enter name of the role',\n },\n description: {\n label: 'Description',\n helperText:\n 'Enter a brief description about the role (The purpose of the role)',\n },\n owner: {\n label: 'Owner',\n helperText:\n 'Optional: Enter a user or group who will have permission to edit this role and create additional roles. In the next step, specify which users they can assign to their roles and which plugins they can grant access to. If left blank, automatically assigns the author at creation.',\n },\n },\n },\n deleteDialog: {\n title: 'Delete Role',\n question: 'Delete this role?',\n confirmation:\n 'Are you sure you want to delete the role **{{roleName}}**?\\n\\nDeleting this role is irreversible and will remove its functionality from the system. Proceed with caution.\\n\\nThe **{{members}}** associated with this role will lose access to all the **{{permissions}} permission policies** specified in this role.',\n roleNameLabel: 'Role name',\n roleNameHelper: 'Type the name of the role to confirm',\n deleteButton: 'Delete',\n cancelButton: 'Cancel',\n successMessage: 'Role {{roleName}} deleted successfully',\n },\n snackbar: {\n success: 'Success',\n },\n dialog: {\n cancelRoleCreation: 'Cancel role creation',\n exitRoleCreation: 'Exit role creation?',\n exitRoleEditing: 'Exit role editing?',\n exitWarning:\n '\\n\\nExiting this page will permanently discard the information you entered.\\n\\nAre you sure you want to exit?',\n discard: 'Discard',\n cancel: 'Cancel',\n },\n conditionalAccess: {\n condition: 'Condition',\n allOf: 'AllOf',\n anyOf: 'AnyOf',\n not: 'Not',\n addNestedCondition: 'Add nested condition',\n addRule: 'Add rule',\n nestedConditionTooltip:\n 'Nested conditions are **1 layer rules within a main condition**. It lets you allow appropriate access by using detailed permissions based on various conditions. You can add multiple nested conditions.',\n nestedConditionExample:\n 'For example, you can allow access to all entity types in the main condition and use a nested condition to limit the access to entities owned by the user.',\n },\n permissionPolicies: {\n helperText:\n 'By default, users are not granted access to any plugins. To grant user access, select the plugins you want to enable. Then, select which actions you would like to give user permission to.',\n allPlugins: 'All plugins ({{count}})',\n errorFetchingPolicies: 'Error fetching the permission policies: {{error}}',\n resourceTypeTooltip: 'resource type: {{resourceType}}',\n advancedPermissionsTooltip:\n 'Use advanced customized permissions to allow access to specific parts of the selected resource type.',\n noAdvancedPermissionsTooltip:\n 'Advanced customization is not supported for this resource type.',\n pluginsSelected: '{{count}} plugins',\n noPluginsSelected: 'No plugins selected',\n search: 'Search',\n noRecordsToDisplay: 'No records to display.',\n selectedPluginsAppearHere: 'Selected plugins appear here.',\n selectPlugins: 'Select plugins',\n noPluginsFound: 'No plugins found.',\n plugin: 'Plugin',\n permission: 'Permission',\n policies: 'Policies',\n conditional: 'Conditional',\n rules: 'rules',\n rule: 'rule',\n permissionPolicies: 'Permission Policies',\n permissions: 'permissions',\n },\n common: {\n noResults: 'No results for this date range.',\n exportCSV: 'Export CSV',\n csvFilename: 'data-export.csv',\n noMembers: 'No members',\n groups: 'groups',\n group: 'group',\n users: 'users',\n user: 'user',\n use: 'Use',\n refresh: 'Refresh',\n edit: 'Edit',\n unauthorizedToEdit: 'Unauthorized to edit',\n noRecordsFound: 'No records found',\n selectUsersAndGroups: 'Select users and groups',\n clearSearch: 'clear search',\n closeDrawer: 'Close the drawer',\n remove: 'Remove',\n addRule: 'Add rule',\n selectRule: 'Select a rule',\n rule: 'Rule',\n removeNestedCondition: 'Remove nested condition',\n overview: 'Overview',\n about: 'About',\n description: 'Description',\n modifiedBy: 'Modified By',\n lastModified: 'Last Modified',\n owner: 'Owner',\n noUsersAndGroupsSelected: 'No users and groups selected',\n selectedUsersAndGroupsAppearHere: 'Selected users and groups appear here.',\n name: 'Name',\n type: 'Type',\n members: 'Members',\n actions: 'Actions',\n removeMember: 'Remove member',\n delete: 'Delete',\n deleteRole: 'Delete Role',\n update: 'Update',\n editRole: 'Edit Role',\n checkingPermissions: 'Checking permissions…',\n unauthorizedTo: 'Unauthorized to {{action}}',\n performThisAction: 'perform this action',\n unableToCreatePermissionPolicies:\n 'Unable to create the permission policies.',\n unableToDeletePermissionPolicies:\n 'Unable to delete the permission policies.',\n unableToRemoveConditions: 'Unable to remove conditions from the role.',\n unableToUpdateConditions: 'Unable to update conditions.',\n unableToAddConditions: 'Unable to add conditions to the role.',\n roleActionSuccessfully: 'Role {{roleName}} {{action}} successfully',\n unableToFetchRole: 'Unable to fetch role: {{error}}',\n unableToFetchMembers: 'Unable to fetch members: {{error}}',\n roleAction: '{{action}} role',\n membersCount: '{{count}} members',\n parentGroupCount: '{{count}} parent group',\n childGroupsCount: '{{count}} child groups',\n searchAndSelectUsersGroups:\n 'Search and select users and groups to be added. Selected users and groups will appear in the table below.',\n noUsersAndGroupsFound: 'No users and groups found.',\n errorFetchingUserGroups: 'Error fetching user and groups: {{error}}',\n nameRequired: 'Name is required',\n noMemberSelected: 'No member selected',\n noPluginSelected: 'No plugin selected',\n pluginRequired: 'Plugin is required',\n permissionRequired: 'Permission is required',\n editCell: 'Edit...',\n selectCell: 'Select...',\n expandRow: 'expand row',\n configureAccessFor: 'Configure access for the',\n defaultResourceTypeVisible:\n 'By default, the selected resource type is visible to all added users. If you want to restrict or grant permission to specific plugin rules, select them and add the parameters.',\n },\n};\n\n/**\n * Translation reference for RBAC plugin\n * @public\n */\nexport const rbacTranslationRef = createTranslationRef({\n id: 'plugin.rbac',\n messages: rbacMessages,\n});\n"],"names":[],"mappings":"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"}
package/dist/alpha.d.ts CHANGED
@@ -22,6 +22,7 @@ declare const rbacTranslationRef: _backstage_frontend_plugin_api.TranslationRef<
22
22
  readonly "table.headers.usersAndGroups": string;
23
23
  readonly "table.headers.accessiblePlugins": string;
24
24
  readonly "table.headers.actions": string;
25
+ readonly "table.defaultRoleUsersAndGroups": string;
25
26
  readonly "table.emptyContent": string;
26
27
  readonly "page.title": string;
27
28
  readonly "page.createRole": string;
@@ -48,6 +49,7 @@ declare const rbacTranslationRef: _backstage_frontend_plugin_api.TranslationRef<
48
49
  readonly "errors.fetchConditions": string;
49
50
  readonly "errors.fetchUsersAndGroups": string;
50
51
  readonly "errors.deleteRole": string;
52
+ readonly "errors.defaultRoleReadOnly": string;
51
53
  readonly "errors.roleCreatedSuccess": string;
52
54
  readonly "errors.roleCreatedConditionsSuccess": string;
53
55
  readonly "roleForm.titles.createRole": string;
@@ -44,6 +44,9 @@ const EditRolePage = () => {
44
44
  if (roleError.name) {
45
45
  return /* @__PURE__ */ jsx(ErrorPage, { status: roleError.name, statusMessage: roleError.message });
46
46
  }
47
+ if (role?.metadata?.isDefault) {
48
+ return /* @__PURE__ */ jsx(ErrorPage, { statusMessage: t("errors.defaultRoleReadOnly") });
49
+ }
47
50
  if (!canReadUsersAndGroups) {
48
51
  return /* @__PURE__ */ jsx(ErrorPage, { statusMessage: t("errors.unauthorized") });
49
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"EditRolePage.esm.js","sources":["../../../src/components/CreateRole/EditRolePage.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useParams } from 'react-router-dom';\n\nimport {\n Content,\n ErrorPage,\n Header,\n Page,\n Progress,\n useQueryParamState,\n} from '@backstage/core-components';\n\nimport { usePermissionPolicies } from '../../hooks/usePermissionPolicies';\nimport { useSelectedMembers } from '../../hooks/useSelectedMembers';\nimport { RoleForm } from './RoleForm';\nimport { RoleFormValues } from './types';\nimport { capitalizeFirstLetter } from '../../utils/string-utils';\nimport { useTranslation } from '../../hooks/useTranslation';\n\nexport const EditRolePage = () => {\n const { roleName, roleNamespace, roleKind } = useParams();\n const { t } = useTranslation();\n const [queryParamState] = useQueryParamState<number>('activeStep');\n const {\n selectedMembers,\n members,\n role,\n loading: loadingMembers,\n roleError,\n membersError,\n canReadUsersAndGroups,\n } = useSelectedMembers(\n roleName ? `${roleKind}:${roleNamespace}/${roleName}` : '',\n );\n\n const { data, loading: loadingPolicies } = usePermissionPolicies(\n `${roleKind}:${roleNamespace}/${roleName}`,\n );\n\n const initialValues: RoleFormValues = {\n name: roleName || '',\n namespace: roleNamespace || 'default',\n kind: roleKind || 'role',\n description: role?.metadata?.description ?? '',\n owner: role?.metadata?.owner ?? '',\n selectedMembers,\n selectedPlugins: data\n .map(pp => pp.plugin)\n .filter((p, i, ar) => ar.indexOf(p) === i)\n .map(sp => ({\n label: capitalizeFirstLetter(sp),\n value: sp,\n })),\n permissionPoliciesRows: data,\n };\n\n if (loadingMembers || loadingPolicies) {\n return <Progress />;\n }\n if (roleError.name) {\n return (\n <ErrorPage status={roleError.name} statusMessage={roleError.message} />\n );\n }\n if (!canReadUsersAndGroups) {\n return <ErrorPage statusMessage={t('errors.unauthorized')} />;\n }\n\n return (\n <Page themeId=\"tool\">\n <Header title={t('page.editRole')} type=\"RBAC\" typeLink=\"..\" />\n <Content>\n <RoleForm\n initialValues={initialValues}\n titles={{\n formTitle: t('roleForm.titles.editRole'),\n nameAndDescriptionTitle: t('roleForm.titles.nameAndDescription'),\n usersAndGroupsTitle: t('roleForm.titles.usersAndGroups'),\n permissionPoliciesTitle: t('roleForm.titles.permissionPolicies'),\n }}\n roleName={roleName ? `${roleKind}:${roleNamespace}/${roleName}` : ''}\n step={Number(queryParamState)}\n membersData={{\n members,\n loading: loadingMembers,\n error: membersError,\n }}\n submitLabel={t('roleForm.steps.save')}\n />\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EditRolePage.esm.js","sources":["../../../src/components/CreateRole/EditRolePage.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useParams } from 'react-router-dom';\n\nimport {\n Content,\n ErrorPage,\n Header,\n Page,\n Progress,\n useQueryParamState,\n} from '@backstage/core-components';\n\nimport { usePermissionPolicies } from '../../hooks/usePermissionPolicies';\nimport { useSelectedMembers } from '../../hooks/useSelectedMembers';\nimport { RoleForm } from './RoleForm';\nimport { RoleFormValues } from './types';\nimport { capitalizeFirstLetter } from '../../utils/string-utils';\nimport { useTranslation } from '../../hooks/useTranslation';\n\nexport const EditRolePage = () => {\n const { roleName, roleNamespace, roleKind } = useParams();\n const { t } = useTranslation();\n const [queryParamState] = useQueryParamState<number>('activeStep');\n const {\n selectedMembers,\n members,\n role,\n loading: loadingMembers,\n roleError,\n membersError,\n canReadUsersAndGroups,\n } = useSelectedMembers(\n roleName ? `${roleKind}:${roleNamespace}/${roleName}` : '',\n );\n\n const { data, loading: loadingPolicies } = usePermissionPolicies(\n `${roleKind}:${roleNamespace}/${roleName}`,\n );\n\n const initialValues: RoleFormValues = {\n name: roleName || '',\n namespace: roleNamespace || 'default',\n kind: roleKind || 'role',\n description: role?.metadata?.description ?? '',\n owner: role?.metadata?.owner ?? '',\n selectedMembers,\n selectedPlugins: data\n .map(pp => pp.plugin)\n .filter((p, i, ar) => ar.indexOf(p) === i)\n .map(sp => ({\n label: capitalizeFirstLetter(sp),\n value: sp,\n })),\n permissionPoliciesRows: data,\n };\n\n if (loadingMembers || loadingPolicies) {\n return <Progress />;\n }\n if (roleError.name) {\n return (\n <ErrorPage status={roleError.name} statusMessage={roleError.message} />\n );\n }\n if (role?.metadata?.isDefault) {\n return <ErrorPage statusMessage={t('errors.defaultRoleReadOnly')} />;\n }\n if (!canReadUsersAndGroups) {\n return <ErrorPage statusMessage={t('errors.unauthorized')} />;\n }\n\n return (\n <Page themeId=\"tool\">\n <Header title={t('page.editRole')} type=\"RBAC\" typeLink=\"..\" />\n <Content>\n <RoleForm\n initialValues={initialValues}\n titles={{\n formTitle: t('roleForm.titles.editRole'),\n nameAndDescriptionTitle: t('roleForm.titles.nameAndDescription'),\n usersAndGroupsTitle: t('roleForm.titles.usersAndGroups'),\n permissionPoliciesTitle: t('roleForm.titles.permissionPolicies'),\n }}\n roleName={roleName ? `${roleKind}:${roleNamespace}/${roleName}` : ''}\n step={Number(queryParamState)}\n membersData={{\n members,\n loading: loadingMembers,\n error: membersError,\n }}\n submitLabel={t('roleForm.steps.save')}\n />\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -26,7 +26,7 @@ const EditRole = ({
26
26
  dataTestId,
27
27
  fallbackTooltip: tooltip
28
28
  });
29
- return /* @__PURE__ */ jsx(Tooltip, { title: tooltipText, children: /* @__PURE__ */ jsx(
29
+ return /* @__PURE__ */ jsx(Tooltip, { title: tooltipText, children: /* @__PURE__ */ jsx("span", { style: { display: "inline-flex" }, children: /* @__PURE__ */ jsx(
30
30
  IconButton,
31
31
  {
32
32
  onClick: () => {
@@ -35,7 +35,6 @@ const EditRole = ({
35
35
  "data-testid": testIdText,
36
36
  "aria-label": t("common.update"),
37
37
  disabled: disable,
38
- title: tooltip ?? t("common.editRole"),
39
38
  sx: {
40
39
  p: 1,
41
40
  borderRadius: "50%",
@@ -43,7 +42,7 @@ const EditRole = ({
43
42
  },
44
43
  children: /* @__PURE__ */ jsx(EditIcon, {})
45
44
  }
46
- ) });
45
+ ) }) });
47
46
  };
48
47
 
49
48
  export { EditRole as default };
@@ -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 { parseEntityRef } from '@backstage/catalog-model';\n\nimport EditIcon from '@mui/icons-material/Edit';\nimport IconButton from '@mui/material/IconButton';\nimport Tooltip from '@mui/material/Tooltip';\nimport { policyEntityUpdatePermission } from '@backstage-community/plugin-rbac-common';\nimport { useNavigate } from 'react-router-dom';\nimport { useActionPermissionTooltip } from '../hooks/useActionPermissionTooltip';\nimport { useTranslation } from '../hooks/useTranslation';\n\ntype EditRoleProps = {\n roleName: string;\n canEdit: boolean;\n dataTestId?: string;\n tooltip?: string;\n to?: string;\n};\n\nconst EditRole = ({\n roleName,\n canEdit,\n dataTestId,\n tooltip,\n to,\n}: EditRoleProps) => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const { name, namespace, kind } = parseEntityRef(roleName);\n\n const { disable, tooltipText, testIdText } = useActionPermissionTooltip({\n permission: policyEntityUpdatePermission,\n resourceRef: roleName,\n canAct: canEdit,\n action: 'edit',\n dataTestId: dataTestId,\n fallbackTooltip: tooltip,\n });\n\n return (\n <Tooltip title={tooltipText}>\n <IconButton\n onClick={() => {\n navigate(to ?? `../role/${kind}/${namespace}/${name}`);\n }}\n data-testid={testIdText}\n aria-label={t('common.update')}\n disabled={disable}\n title={tooltip ?? t('common.editRole')}\n sx={{\n p: 1,\n borderRadius: '50%',\n '&:hover': { borderRadius: '50%' },\n }}\n >\n <EditIcon />\n </IconButton>\n </Tooltip>\n );\n};\n\nexport default EditRole;\n"],"names":[],"mappings":";;;;;;;;;;AAiCA,MAAM,WAAW,CAAC;AAAA,EAChB,QAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAqB,KAAA;AACnB,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA;AAC7B,EAAA,MAAM,WAAW,WAAY,EAAA;AAC7B,EAAA,MAAM,EAAE,IAAM,EAAA,SAAA,EAAW,IAAK,EAAA,GAAI,eAAe,QAAQ,CAAA;AAEzD,EAAA,MAAM,EAAE,OAAA,EAAS,WAAa,EAAA,UAAA,KAAe,0BAA2B,CAAA;AAAA,IACtE,UAAY,EAAA,4BAAA;AAAA,IACZ,WAAa,EAAA,QAAA;AAAA,IACb,MAAQ,EAAA,OAAA;AAAA,IACR,MAAQ,EAAA,MAAA;AAAA,IACR,UAAA;AAAA,IACA,eAAiB,EAAA;AAAA,GAClB,CAAA;AAED,EACE,uBAAA,GAAA,CAAC,OAAQ,EAAA,EAAA,KAAA,EAAO,WACd,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,SAAS,MAAM;AACb,QAAA,QAAA,CAAS,MAAM,CAAW,QAAA,EAAA,IAAI,IAAI,SAAS,CAAA,CAAA,EAAI,IAAI,CAAE,CAAA,CAAA;AAAA,OACvD;AAAA,MACA,aAAa,EAAA,UAAA;AAAA,MACb,YAAA,EAAY,EAAE,eAAe,CAAA;AAAA,MAC7B,QAAU,EAAA,OAAA;AAAA,MACV,KAAA,EAAO,OAAW,IAAA,CAAA,CAAE,iBAAiB,CAAA;AAAA,MACrC,EAAI,EAAA;AAAA,QACF,CAAG,EAAA,CAAA;AAAA,QACH,YAAc,EAAA,KAAA;AAAA,QACd,SAAA,EAAW,EAAE,YAAA,EAAc,KAAM;AAAA,OACnC;AAAA,MAEA,8BAAC,QAAS,EAAA,EAAA;AAAA;AAAA,GAEd,EAAA,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 { parseEntityRef } from '@backstage/catalog-model';\n\nimport EditIcon from '@mui/icons-material/Edit';\nimport IconButton from '@mui/material/IconButton';\nimport Tooltip from '@mui/material/Tooltip';\nimport { policyEntityUpdatePermission } from '@backstage-community/plugin-rbac-common';\nimport { useNavigate } from 'react-router-dom';\nimport { useActionPermissionTooltip } from '../hooks/useActionPermissionTooltip';\nimport { useTranslation } from '../hooks/useTranslation';\n\ntype EditRoleProps = {\n roleName: string;\n canEdit: boolean;\n dataTestId?: string;\n tooltip?: string;\n to?: string;\n};\n\nconst EditRole = ({\n roleName,\n canEdit,\n dataTestId,\n tooltip,\n to,\n}: EditRoleProps) => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const { name, namespace, kind } = parseEntityRef(roleName);\n\n const { disable, tooltipText, testIdText } = useActionPermissionTooltip({\n permission: policyEntityUpdatePermission,\n resourceRef: roleName,\n canAct: canEdit,\n action: 'edit',\n dataTestId: dataTestId,\n fallbackTooltip: tooltip,\n });\n\n return (\n <Tooltip title={tooltipText}>\n <span style={{ display: 'inline-flex' }}>\n <IconButton\n onClick={() => {\n navigate(to ?? `../role/${kind}/${namespace}/${name}`);\n }}\n data-testid={testIdText}\n aria-label={t('common.update')}\n disabled={disable}\n sx={{\n p: 1,\n borderRadius: '50%',\n '&:hover': { borderRadius: '50%' },\n }}\n >\n <EditIcon />\n </IconButton>\n </span>\n </Tooltip>\n );\n};\n\nexport default EditRole;\n"],"names":[],"mappings":";;;;;;;;;;AAiCA,MAAM,WAAW,CAAC;AAAA,EAChB,QAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAqB,KAAA;AACnB,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA;AAC7B,EAAA,MAAM,WAAW,WAAY,EAAA;AAC7B,EAAA,MAAM,EAAE,IAAM,EAAA,SAAA,EAAW,IAAK,EAAA,GAAI,eAAe,QAAQ,CAAA;AAEzD,EAAA,MAAM,EAAE,OAAA,EAAS,WAAa,EAAA,UAAA,KAAe,0BAA2B,CAAA;AAAA,IACtE,UAAY,EAAA,4BAAA;AAAA,IACZ,WAAa,EAAA,QAAA;AAAA,IACb,MAAQ,EAAA,OAAA;AAAA,IACR,MAAQ,EAAA,MAAA;AAAA,IACR,UAAA;AAAA,IACA,eAAiB,EAAA;AAAA,GAClB,CAAA;AAED,EACE,uBAAA,GAAA,CAAC,OAAQ,EAAA,EAAA,KAAA,EAAO,WACd,EAAA,QAAA,kBAAA,GAAA,CAAC,UAAK,KAAO,EAAA,EAAE,OAAS,EAAA,aAAA,EACtB,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,SAAS,MAAM;AACb,QAAA,QAAA,CAAS,MAAM,CAAW,QAAA,EAAA,IAAI,IAAI,SAAS,CAAA,CAAA,EAAI,IAAI,CAAE,CAAA,CAAA;AAAA,OACvD;AAAA,MACA,aAAa,EAAA,UAAA;AAAA,MACb,YAAA,EAAY,EAAE,eAAe,CAAA;AAAA,MAC7B,QAAU,EAAA,OAAA;AAAA,MACV,EAAI,EAAA;AAAA,QACF,CAAG,EAAA,CAAA;AAAA,QACH,YAAc,EAAA,KAAA;AAAA,QACd,SAAA,EAAW,EAAE,YAAA,EAAc,KAAM;AAAA,OACnC;AAAA,MAEA,8BAAC,QAAS,EAAA,EAAA;AAAA;AAAA,KAEd,CACF,EAAA,CAAA;AAEJ;;;;"}
@@ -13,7 +13,7 @@ import { getColumns } from './MembersListColumns.esm.js';
13
13
  import { StyledTableWrapper } from './StyledTableWrapper.esm.js';
14
14
 
15
15
  const getRefreshIcon = () => /* @__PURE__ */ jsx(CachedIcon, {});
16
- const getEditIcon = (isAllowed, roleName) => {
16
+ const getEditIcon = (isAllowed, roleName, tooltip) => {
17
17
  const { kind, name, namespace } = parseEntityRef(roleName);
18
18
  return /* @__PURE__ */ jsx(
19
19
  EditRole,
@@ -21,7 +21,8 @@ const getEditIcon = (isAllowed, roleName) => {
21
21
  dataTestId: isAllowed ? "update-members" : "disable-update-members",
22
22
  canEdit: isAllowed,
23
23
  roleName,
24
- to: `../../role/${kind}/${namespace}/${name}?activeStep=${1}`
24
+ to: `../../role/${kind}/${namespace}/${name}?activeStep=${1}`,
25
+ tooltip
25
26
  }
26
27
  );
27
28
  };
@@ -30,6 +31,7 @@ const MembersCard = ({ roleName, membersInfo }) => {
30
31
  const locale = useLanguage();
31
32
  const { data, loading, retry, error, canReadUsersAndGroups } = membersInfo;
32
33
  const [searchText, setSearchText] = useState();
34
+ const editTooltip = canReadUsersAndGroups ? t("common.edit") : t("common.unauthorizedToEdit");
33
35
  const actions = [
34
36
  {
35
37
  icon: getRefreshIcon,
@@ -41,8 +43,7 @@ const MembersCard = ({ roleName, membersInfo }) => {
41
43
  }
42
44
  },
43
45
  {
44
- icon: () => getEditIcon(canReadUsersAndGroups, roleName),
45
- tooltip: canReadUsersAndGroups ? t("common.edit") : t("common.unauthorizedToEdit"),
46
+ icon: () => getEditIcon(canReadUsersAndGroups, roleName, editTooltip),
46
47
  isFreeAction: true,
47
48
  onClick: () => {
48
49
  }
@@ -53,6 +54,9 @@ const MembersCard = ({ roleName, membersInfo }) => {
53
54
  () => filterTableData({ data, columns, searchText, locale }),
54
55
  [data, searchText, locale, columns]
55
56
  );
57
+ if (membersInfo.isDefaultRole) {
58
+ return null;
59
+ }
56
60
  return /* @__PURE__ */ jsxs(Box, { children: [
57
61
  !loading && error && /* @__PURE__ */ jsx(Box, { style: { paddingBottom: "16px" }, children: /* @__PURE__ */ jsx(
58
62
  WarningPanel,
@@ -1 +1 @@
1
- {"version":3,"file":"MembersCard.esm.js","sources":["../../../src/components/RoleOverview/MembersCard.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useState, useMemo } from 'react';\n\nimport { parseEntityRef } from '@backstage/catalog-model';\nimport { Table, WarningPanel } from '@backstage/core-components';\n\nimport CachedIcon from '@mui/icons-material/Cached';\nimport Box from '@mui/material/Box';\n\nimport { MembersInfo } from '../../hooks/useMembers';\nimport { filterTableData } from '../../utils/filter-table-data';\nimport { getMembers } from '../../utils/rbac-utils';\nimport { useTranslation } from '../../hooks/useTranslation';\nimport { useLanguage } from '../../hooks/useLanguage';\nimport EditRole from '../EditRole';\nimport { getColumns } from './MembersListColumns';\nimport { StyledTableWrapper } from './StyledTableWrapper';\n\ntype MembersCardProps = {\n roleName: string;\n membersInfo: MembersInfo;\n};\n\nconst getRefreshIcon = () => <CachedIcon />;\nconst getEditIcon = (isAllowed: boolean, roleName: string) => {\n const { kind, name, namespace } = parseEntityRef(roleName);\n\n return (\n <EditRole\n dataTestId={isAllowed ? 'update-members' : 'disable-update-members'}\n canEdit={isAllowed}\n roleName={roleName}\n to={`../../role/${kind}/${namespace}/${name}?activeStep=${1}`}\n />\n );\n};\n\nexport const MembersCard = ({ roleName, membersInfo }: MembersCardProps) => {\n const { t } = useTranslation();\n const locale = useLanguage();\n const { data, loading, retry, error, canReadUsersAndGroups } = membersInfo;\n const [searchText, setSearchText] = useState<string>();\n\n const actions = [\n {\n icon: getRefreshIcon,\n tooltip: t('common.refresh'),\n isFreeAction: true,\n onClick: () => {\n retry.roleRetry();\n retry.membersRetry();\n },\n },\n {\n icon: () => getEditIcon(canReadUsersAndGroups, roleName),\n tooltip: canReadUsersAndGroups\n ? t('common.edit')\n : t('common.unauthorizedToEdit'),\n isFreeAction: true,\n onClick: () => {},\n },\n ];\n const columns = useMemo(() => getColumns(t), [t]);\n const filteredData = useMemo(\n () => filterTableData({ data, columns, searchText, locale }),\n [data, searchText, locale, columns],\n );\n\n return (\n <Box>\n {!loading && error && (\n <Box style={{ paddingBottom: '16px' }}>\n <WarningPanel\n message={(error as Error)?.message || (error as Error)?.name}\n title={t('errors.fetchUsersAndGroups')}\n severity=\"error\"\n />\n </Box>\n )}\n <StyledTableWrapper>\n <Table\n title={\n !loading && data?.length\n ? `${getMembers(filteredData, t)}`\n : t('table.headers.usersAndGroups')\n }\n actions={actions}\n options={{ padding: 'default', search: true, paging: true }}\n data={data ?? []}\n isLoading={loading}\n columns={getColumns(t)}\n emptyContent={\n <Box\n data-testid=\"members-table-empty\"\n sx={{ display: 'flex', justifyContent: 'center', p: 2 }}\n >\n {t('common.noRecordsFound')}\n </Box>\n }\n localization={{\n toolbar: { searchPlaceholder: t('table.searchPlaceholder') },\n pagination: { labelRowsSelect: t('table.labelRowsSelect') },\n }}\n onSearchChange={setSearchText}\n />\n </StyledTableWrapper>\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MembersCard.esm.js","sources":["../../../src/components/RoleOverview/MembersCard.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useState, useMemo } from 'react';\n\nimport { parseEntityRef } from '@backstage/catalog-model';\nimport { Table, WarningPanel } from '@backstage/core-components';\n\nimport CachedIcon from '@mui/icons-material/Cached';\nimport Box from '@mui/material/Box';\n\nimport { MembersInfo } from '../../hooks/useMembers';\nimport { filterTableData } from '../../utils/filter-table-data';\nimport { getMembers } from '../../utils/rbac-utils';\nimport { useTranslation } from '../../hooks/useTranslation';\nimport { useLanguage } from '../../hooks/useLanguage';\nimport EditRole from '../EditRole';\nimport { getColumns } from './MembersListColumns';\nimport { StyledTableWrapper } from './StyledTableWrapper';\n\ntype MembersCardProps = {\n roleName: string;\n membersInfo: MembersInfo;\n};\n\nconst getRefreshIcon = () => <CachedIcon />;\nconst getEditIcon = (\n isAllowed: boolean,\n roleName: string,\n tooltip?: string,\n) => {\n const { kind, name, namespace } = parseEntityRef(roleName);\n\n return (\n <EditRole\n dataTestId={isAllowed ? 'update-members' : 'disable-update-members'}\n canEdit={isAllowed}\n roleName={roleName}\n to={`../../role/${kind}/${namespace}/${name}?activeStep=${1}`}\n tooltip={tooltip}\n />\n );\n};\n\nexport const MembersCard = ({ roleName, membersInfo }: MembersCardProps) => {\n const { t } = useTranslation();\n const locale = useLanguage();\n const { data, loading, retry, error, canReadUsersAndGroups } = membersInfo;\n const [searchText, setSearchText] = useState<string>();\n\n const editTooltip = canReadUsersAndGroups\n ? t('common.edit')\n : t('common.unauthorizedToEdit');\n\n const actions = [\n {\n icon: getRefreshIcon,\n tooltip: t('common.refresh'),\n isFreeAction: true,\n onClick: () => {\n retry.roleRetry();\n retry.membersRetry();\n },\n },\n {\n icon: () => getEditIcon(canReadUsersAndGroups, roleName, editTooltip),\n isFreeAction: true,\n onClick: () => {},\n },\n ];\n const columns = useMemo(() => getColumns(t), [t]);\n const filteredData = useMemo(\n () => filterTableData({ data, columns, searchText, locale }),\n [data, searchText, locale, columns],\n );\n\n if (membersInfo.isDefaultRole) {\n return null;\n }\n\n return (\n <Box>\n {!loading && error && (\n <Box style={{ paddingBottom: '16px' }}>\n <WarningPanel\n message={(error as Error)?.message || (error as Error)?.name}\n title={t('errors.fetchUsersAndGroups')}\n severity=\"error\"\n />\n </Box>\n )}\n <StyledTableWrapper>\n <Table\n title={\n !loading && data?.length\n ? `${getMembers(filteredData, t)}`\n : t('table.headers.usersAndGroups')\n }\n actions={actions}\n options={{ padding: 'default', search: true, paging: true }}\n data={data ?? []}\n isLoading={loading}\n columns={getColumns(t)}\n emptyContent={\n <Box\n data-testid=\"members-table-empty\"\n sx={{ display: 'flex', justifyContent: 'center', p: 2 }}\n >\n {t('common.noRecordsFound')}\n </Box>\n }\n localization={{\n toolbar: { searchPlaceholder: t('table.searchPlaceholder') },\n pagination: { labelRowsSelect: t('table.labelRowsSelect') },\n }}\n onSearchChange={setSearchText}\n />\n </StyledTableWrapper>\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -14,7 +14,7 @@ import { useTranslation } from '../../hooks/useTranslation.esm.js';
14
14
  import { capitalizeFirstLetter } from '../../utils/string-utils.esm.js';
15
15
 
16
16
  const getRefreshIcon = () => /* @__PURE__ */ jsx(CachedIcon, {});
17
- const getEditIcon = (isAllowed, roleName) => {
17
+ const getEditIcon = (isAllowed, roleName, tooltip) => {
18
18
  const { kind, name, namespace } = parseEntityRef(roleName);
19
19
  return /* @__PURE__ */ jsx(
20
20
  EditRole,
@@ -22,13 +22,15 @@ const getEditIcon = (isAllowed, roleName) => {
22
22
  dataTestId: isAllowed ? "update-policies" : "disable-update-policies",
23
23
  canEdit: isAllowed,
24
24
  roleName,
25
- to: `../../role/${kind}/${namespace}/${name}?activeStep=${2}`
25
+ to: `../../role/${kind}/${namespace}/${name}?activeStep=${2}`,
26
+ tooltip
26
27
  }
27
28
  );
28
29
  };
29
30
  const PermissionsCard = ({
30
31
  entityReference,
31
- canReadUsersAndGroups
32
+ canReadUsersAndGroups,
33
+ isDefaultRole = false
32
34
  }) => {
33
35
  const { t } = useTranslation();
34
36
  const { data, loading, retry, error } = usePermissionPolicies(entityReference);
@@ -52,6 +54,14 @@ const PermissionsCard = ({
52
54
  });
53
55
  return policies;
54
56
  }, [data, searchText, columns, locale]);
57
+ let editTooltip;
58
+ if (isDefaultRole) {
59
+ editTooltip = t("errors.defaultRoleReadOnly");
60
+ } else if (canReadUsersAndGroups) {
61
+ editTooltip = t("common.edit");
62
+ } else {
63
+ editTooltip = t("common.unauthorizedToEdit");
64
+ }
55
65
  const actions = [
56
66
  {
57
67
  icon: getRefreshIcon,
@@ -64,8 +74,11 @@ const PermissionsCard = ({
64
74
  }
65
75
  },
66
76
  {
67
- icon: () => getEditIcon(canReadUsersAndGroups, entityReference),
68
- tooltip: canReadUsersAndGroups ? t("common.edit") : t("common.unauthorizedToEdit"),
77
+ icon: () => getEditIcon(
78
+ !isDefaultRole && canReadUsersAndGroups,
79
+ entityReference,
80
+ editTooltip
81
+ ),
69
82
  isFreeAction: true,
70
83
  onClick: () => {
71
84
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PermissionsCard.esm.js","sources":["../../../src/components/RoleOverview/PermissionsCard.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useState, useMemo } from 'react';\n\nimport { parseEntityRef } from '@backstage/catalog-model';\nimport { Table, WarningPanel } from '@backstage/core-components';\n\nimport CachedIcon from '@mui/icons-material/Cached';\nimport Box from '@mui/material/Box';\n\nimport { usePermissionPolicies } from '../../hooks/usePermissionPolicies';\nimport { filterTableData } from '../../utils/filter-table-data';\nimport EditRole from '../EditRole';\nimport { getColumns } from './PermissionsListColumns';\nimport { StyledTableWrapper } from './StyledTableWrapper';\nimport { useLanguage } from '../../hooks/useLanguage';\nimport { useTranslation } from '../../hooks/useTranslation';\nimport { capitalizeFirstLetter } from '../../utils/string-utils';\n\ntype PermissionsCardProps = {\n entityReference: string;\n canReadUsersAndGroups: boolean;\n};\n\nconst getRefreshIcon = () => <CachedIcon />;\nconst getEditIcon = (isAllowed: boolean, roleName: string) => {\n const { kind, name, namespace } = parseEntityRef(roleName);\n\n return (\n <EditRole\n dataTestId={isAllowed ? 'update-policies' : 'disable-update-policies'}\n canEdit={isAllowed}\n roleName={roleName}\n to={`../../role/${kind}/${namespace}/${name}?activeStep=${2}`}\n />\n );\n};\n\nexport const PermissionsCard = ({\n entityReference,\n canReadUsersAndGroups,\n}: PermissionsCardProps) => {\n const { t } = useTranslation();\n const { data, loading, retry, error } =\n usePermissionPolicies(entityReference);\n const locale = useLanguage();\n const [searchText, setSearchText] = useState<string>();\n\n const columns = useMemo(() => getColumns(t), [t]);\n\n const numberOfPolicies = useMemo(() => {\n const filteredPermissions = filterTableData({\n data,\n columns,\n searchText,\n locale,\n });\n let policies = 0;\n filteredPermissions.forEach(p => {\n if (p.conditions) {\n policies++;\n return;\n }\n policies += p.policies.filter(pol => pol.effect === 'allow').length;\n });\n return policies;\n }, [data, searchText, columns, locale]);\n\n const actions = [\n {\n icon: getRefreshIcon,\n tooltip: t('common.refresh'),\n isFreeAction: true,\n onClick: () => {\n retry.permissionPoliciesRetry();\n retry.policiesRetry();\n retry.conditionalPoliciesRetry();\n },\n },\n {\n icon: () => getEditIcon(canReadUsersAndGroups, entityReference),\n tooltip: canReadUsersAndGroups\n ? t('common.edit')\n : t('common.unauthorizedToEdit'),\n isFreeAction: true,\n onClick: () => {},\n },\n ];\n\n let title = t('permissionPolicies.permissionPolicies');\n if (!loading && data.length > 0) {\n title = capitalizeFirstLetter(\n `${numberOfPolicies} ${numberOfPolicies !== 1 ? t('permissionPolicies.permissions') : t('permissionPolicies.permission')}`,\n );\n }\n\n return (\n <Box>\n {error?.name && error.name !== 404 && (\n <Box style={{ paddingBottom: '16px' }}>\n <WarningPanel\n message={error?.message}\n title={t('errors.fetchPolicies')}\n severity=\"error\"\n />\n </Box>\n )}\n <StyledTableWrapper>\n <Table\n title={title}\n actions={actions}\n options={{ padding: 'default', search: true, paging: true }}\n data={data}\n columns={columns}\n isLoading={loading}\n emptyContent={\n <Box\n data-testid=\"permission-table-empty\"\n sx={{ display: 'flex', justifyContent: 'center', p: 2 }}\n >\n {t('common.noRecordsFound')}\n </Box>\n }\n onSearchChange={setSearchText}\n localization={{\n toolbar: { searchPlaceholder: t('table.searchPlaceholder') },\n pagination: { labelRowsSelect: t('table.labelRowsSelect') },\n }}\n />\n </StyledTableWrapper>\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PermissionsCard.esm.js","sources":["../../../src/components/RoleOverview/PermissionsCard.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useState, useMemo } from 'react';\n\nimport { parseEntityRef } from '@backstage/catalog-model';\nimport { Table, WarningPanel } from '@backstage/core-components';\n\nimport CachedIcon from '@mui/icons-material/Cached';\nimport Box from '@mui/material/Box';\n\nimport { usePermissionPolicies } from '../../hooks/usePermissionPolicies';\nimport { filterTableData } from '../../utils/filter-table-data';\nimport EditRole from '../EditRole';\nimport { getColumns } from './PermissionsListColumns';\nimport { StyledTableWrapper } from './StyledTableWrapper';\nimport { useLanguage } from '../../hooks/useLanguage';\nimport { useTranslation } from '../../hooks/useTranslation';\nimport { capitalizeFirstLetter } from '../../utils/string-utils';\n\ntype PermissionsCardProps = {\n entityReference: string;\n canReadUsersAndGroups: boolean;\n /** When true, the role is read-only (default role). */\n isDefaultRole?: boolean;\n};\n\nconst getRefreshIcon = () => <CachedIcon />;\nconst getEditIcon = (\n isAllowed: boolean,\n roleName: string,\n tooltip?: string,\n) => {\n const { kind, name, namespace } = parseEntityRef(roleName);\n\n return (\n <EditRole\n dataTestId={isAllowed ? 'update-policies' : 'disable-update-policies'}\n canEdit={isAllowed}\n roleName={roleName}\n to={`../../role/${kind}/${namespace}/${name}?activeStep=${2}`}\n tooltip={tooltip}\n />\n );\n};\n\nexport const PermissionsCard = ({\n entityReference,\n canReadUsersAndGroups,\n isDefaultRole = false,\n}: PermissionsCardProps) => {\n const { t } = useTranslation();\n const { data, loading, retry, error } =\n usePermissionPolicies(entityReference);\n const locale = useLanguage();\n const [searchText, setSearchText] = useState<string>();\n\n const columns = useMemo(() => getColumns(t), [t]);\n\n const numberOfPolicies = useMemo(() => {\n const filteredPermissions = filterTableData({\n data,\n columns,\n searchText,\n locale,\n });\n let policies = 0;\n filteredPermissions.forEach(p => {\n if (p.conditions) {\n policies++;\n return;\n }\n policies += p.policies.filter(pol => pol.effect === 'allow').length;\n });\n return policies;\n }, [data, searchText, columns, locale]);\n\n let editTooltip: string;\n\n if (isDefaultRole) {\n editTooltip = t('errors.defaultRoleReadOnly');\n } else if (canReadUsersAndGroups) {\n editTooltip = t('common.edit');\n } else {\n editTooltip = t('common.unauthorizedToEdit');\n }\n\n const actions = [\n {\n icon: getRefreshIcon,\n tooltip: t('common.refresh'),\n isFreeAction: true,\n onClick: () => {\n retry.permissionPoliciesRetry();\n retry.policiesRetry();\n retry.conditionalPoliciesRetry();\n },\n },\n {\n icon: () =>\n getEditIcon(\n !isDefaultRole && canReadUsersAndGroups,\n entityReference,\n editTooltip,\n ),\n isFreeAction: true,\n onClick: () => {},\n },\n ];\n\n let title = t('permissionPolicies.permissionPolicies');\n if (!loading && data.length > 0) {\n title = capitalizeFirstLetter(\n `${numberOfPolicies} ${numberOfPolicies !== 1 ? t('permissionPolicies.permissions') : t('permissionPolicies.permission')}`,\n );\n }\n\n return (\n <Box>\n {error?.name && error.name !== 404 && (\n <Box style={{ paddingBottom: '16px' }}>\n <WarningPanel\n message={error?.message}\n title={t('errors.fetchPolicies')}\n severity=\"error\"\n />\n </Box>\n )}\n <StyledTableWrapper>\n <Table\n title={title}\n actions={actions}\n options={{ padding: 'default', search: true, paging: true }}\n data={data}\n columns={columns}\n isLoading={loading}\n emptyContent={\n <Box\n data-testid=\"permission-table-empty\"\n sx={{ display: 'flex', justifyContent: 'center', p: 2 }}\n >\n {t('common.noRecordsFound')}\n </Box>\n }\n onSearchChange={setSearchText}\n localization={{\n toolbar: { searchPlaceholder: t('table.searchPlaceholder') },\n pagination: { labelRowsSelect: t('table.labelRowsSelect') },\n }}\n />\n </StyledTableWrapper>\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -56,7 +56,8 @@ const RoleOverviewPage = () => {
56
56
  PermissionsCard,
57
57
  {
58
58
  entityReference: `${roleKind}:${roleNamespace}/${roleName}`,
59
- canReadUsersAndGroups: membersInfo.canReadUsersAndGroups
59
+ canReadUsersAndGroups: membersInfo.canReadUsersAndGroups,
60
+ isDefaultRole: membersInfo.isDefaultRole
60
61
  }
61
62
  ) })
62
63
  ] }) }) })
@@ -1 +1 @@
1
- {"version":3,"file":"RoleOverviewPage.esm.js","sources":["../../../src/components/RoleOverview/RoleOverviewPage.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useParams } from 'react-router-dom';\n\nimport { Header, Page, TabbedLayout } from '@backstage/core-components';\n\nimport Grid from '@mui/material/Grid';\n\nimport { useLocationToast } from '../../hooks/useLocationToast';\nimport { useMembers } from '../../hooks/useMembers';\nimport { SnackbarAlert } from '../SnackbarAlert';\nimport { useToast } from '../ToastContext';\nimport { AboutCard } from './AboutCard';\nimport { MembersCard } from './MembersCard';\nimport { PermissionsCard } from './PermissionsCard';\nimport { useTranslation } from '../../hooks/useTranslation';\nimport { RequirePermission } from '@backstage/plugin-permission-react';\nimport { policyEntityReadPermission } from '@backstage-community/plugin-rbac-common';\n\nexport const RoleOverviewPage = () => {\n const { t } = useTranslation();\n const { roleName, roleNamespace, roleKind } = useParams();\n const { toastMessage, setToastMessage } = useToast();\n const membersInfo = useMembers(`${roleKind}:${roleNamespace}/${roleName}`);\n\n useLocationToast(setToastMessage);\n\n const onAlertClose = () => {\n setToastMessage('');\n };\n\n return (\n <RequirePermission\n permission={policyEntityReadPermission}\n resourceRef={`${roleKind}:${roleNamespace}/${roleName}`}\n >\n <SnackbarAlert toastMessage={toastMessage} onAlertClose={onAlertClose} />\n <Page themeId=\"tool\">\n <Header\n title={`${roleKind}:${roleNamespace}/${roleName}`}\n type=\"RBAC\"\n typeLink=\"..\"\n />\n <TabbedLayout>\n <TabbedLayout.Route path=\"\" title={t('common.overview')}>\n <Grid container direction=\"row\" spacing={2}>\n <Grid item lg={12} xs={12}>\n <AboutCard\n roleName={`${roleKind}:${roleNamespace}/${roleName}`}\n />\n </Grid>\n <Grid item lg={6} xs={12}>\n <MembersCard\n roleName={`${roleKind}:${roleNamespace}/${roleName}`}\n membersInfo={membersInfo}\n />\n </Grid>\n <Grid item lg={6} xs={12}>\n <PermissionsCard\n entityReference={`${roleKind}:${roleNamespace}/${roleName}`}\n canReadUsersAndGroups={membersInfo.canReadUsersAndGroups}\n />\n </Grid>\n </Grid>\n </TabbedLayout.Route>\n </TabbedLayout>\n </Page>\n </RequirePermission>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAgCO,MAAM,mBAAmB,MAAM;AACpC,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA;AAC7B,EAAA,MAAM,EAAE,QAAA,EAAU,aAAe,EAAA,QAAA,KAAa,SAAU,EAAA;AACxD,EAAA,MAAM,EAAE,YAAA,EAAc,eAAgB,EAAA,GAAI,QAAS,EAAA;AACnD,EAAM,MAAA,WAAA,GAAc,WAAW,CAAG,EAAA,QAAQ,IAAI,aAAa,CAAA,CAAA,EAAI,QAAQ,CAAE,CAAA,CAAA;AAEzE,EAAA,gBAAA,CAAiB,eAAe,CAAA;AAEhC,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,eAAA,CAAgB,EAAE,CAAA;AAAA,GACpB;AAEA,EACE,uBAAA,IAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACC,UAAY,EAAA,0BAAA;AAAA,MACZ,aAAa,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,aAAa,IAAI,QAAQ,CAAA,CAAA;AAAA,MAErD,QAAA,EAAA;AAAA,wBAAC,GAAA,CAAA,aAAA,EAAA,EAAc,cAA4B,YAA4B,EAAA,CAAA;AAAA,wBACvE,IAAA,CAAC,IAAK,EAAA,EAAA,OAAA,EAAQ,MACZ,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,OAAO,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,aAAa,IAAI,QAAQ,CAAA,CAAA;AAAA,cAC/C,IAAK,EAAA,MAAA;AAAA,cACL,QAAS,EAAA;AAAA;AAAA,WACX;AAAA,8BACC,YACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,aAAa,KAAb,EAAA,EAAmB,MAAK,EAAG,EAAA,KAAA,EAAO,EAAE,iBAAiB,CAAA,EACpD,+BAAC,IAAK,EAAA,EAAA,SAAA,EAAS,MAAC,SAAU,EAAA,KAAA,EAAM,SAAS,CACvC,EAAA,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAC,EAAI,EAAA,EAAA,EAAI,IAAI,EACrB,EAAA,QAAA,kBAAA,GAAA;AAAA,cAAC,SAAA;AAAA,cAAA;AAAA,gBACC,UAAU,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,aAAa,IAAI,QAAQ,CAAA;AAAA;AAAA,aAEtD,EAAA,CAAA;AAAA,gCACC,IAAK,EAAA,EAAA,IAAA,EAAI,MAAC,EAAI,EAAA,CAAA,EAAG,IAAI,EACpB,EAAA,QAAA,kBAAA,GAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBACC,UAAU,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,aAAa,IAAI,QAAQ,CAAA,CAAA;AAAA,gBAClD;AAAA;AAAA,aAEJ,EAAA,CAAA;AAAA,gCACC,IAAK,EAAA,EAAA,IAAA,EAAI,MAAC,EAAI,EAAA,CAAA,EAAG,IAAI,EACpB,EAAA,QAAA,kBAAA,GAAA;AAAA,cAAC,eAAA;AAAA,cAAA;AAAA,gBACC,iBAAiB,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,aAAa,IAAI,QAAQ,CAAA,CAAA;AAAA,gBACzD,uBAAuB,WAAY,CAAA;AAAA;AAAA,aAEvC,EAAA;AAAA,WAAA,EACF,GACF,CACF,EAAA;AAAA,SACF,EAAA;AAAA;AAAA;AAAA,GACF;AAEJ;;;;"}
1
+ {"version":3,"file":"RoleOverviewPage.esm.js","sources":["../../../src/components/RoleOverview/RoleOverviewPage.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useParams } from 'react-router-dom';\n\nimport { Header, Page, TabbedLayout } from '@backstage/core-components';\n\nimport Grid from '@mui/material/Grid';\n\nimport { useLocationToast } from '../../hooks/useLocationToast';\nimport { useMembers } from '../../hooks/useMembers';\nimport { SnackbarAlert } from '../SnackbarAlert';\nimport { useToast } from '../ToastContext';\nimport { AboutCard } from './AboutCard';\nimport { MembersCard } from './MembersCard';\nimport { PermissionsCard } from './PermissionsCard';\nimport { useTranslation } from '../../hooks/useTranslation';\nimport { RequirePermission } from '@backstage/plugin-permission-react';\nimport { policyEntityReadPermission } from '@backstage-community/plugin-rbac-common';\n\nexport const RoleOverviewPage = () => {\n const { t } = useTranslation();\n const { roleName, roleNamespace, roleKind } = useParams();\n const { toastMessage, setToastMessage } = useToast();\n const membersInfo = useMembers(`${roleKind}:${roleNamespace}/${roleName}`);\n\n useLocationToast(setToastMessage);\n\n const onAlertClose = () => {\n setToastMessage('');\n };\n\n return (\n <RequirePermission\n permission={policyEntityReadPermission}\n resourceRef={`${roleKind}:${roleNamespace}/${roleName}`}\n >\n <SnackbarAlert toastMessage={toastMessage} onAlertClose={onAlertClose} />\n <Page themeId=\"tool\">\n <Header\n title={`${roleKind}:${roleNamespace}/${roleName}`}\n type=\"RBAC\"\n typeLink=\"..\"\n />\n <TabbedLayout>\n <TabbedLayout.Route path=\"\" title={t('common.overview')}>\n <Grid container direction=\"row\" spacing={2}>\n <Grid item lg={12} xs={12}>\n <AboutCard\n roleName={`${roleKind}:${roleNamespace}/${roleName}`}\n />\n </Grid>\n <Grid item lg={6} xs={12}>\n <MembersCard\n roleName={`${roleKind}:${roleNamespace}/${roleName}`}\n membersInfo={membersInfo}\n />\n </Grid>\n <Grid item lg={6} xs={12}>\n <PermissionsCard\n entityReference={`${roleKind}:${roleNamespace}/${roleName}`}\n canReadUsersAndGroups={membersInfo.canReadUsersAndGroups}\n isDefaultRole={membersInfo.isDefaultRole}\n />\n </Grid>\n </Grid>\n </TabbedLayout.Route>\n </TabbedLayout>\n </Page>\n </RequirePermission>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAgCO,MAAM,mBAAmB,MAAM;AACpC,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA;AAC7B,EAAA,MAAM,EAAE,QAAA,EAAU,aAAe,EAAA,QAAA,KAAa,SAAU,EAAA;AACxD,EAAA,MAAM,EAAE,YAAA,EAAc,eAAgB,EAAA,GAAI,QAAS,EAAA;AACnD,EAAM,MAAA,WAAA,GAAc,WAAW,CAAG,EAAA,QAAQ,IAAI,aAAa,CAAA,CAAA,EAAI,QAAQ,CAAE,CAAA,CAAA;AAEzE,EAAA,gBAAA,CAAiB,eAAe,CAAA;AAEhC,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,eAAA,CAAgB,EAAE,CAAA;AAAA,GACpB;AAEA,EACE,uBAAA,IAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACC,UAAY,EAAA,0BAAA;AAAA,MACZ,aAAa,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,aAAa,IAAI,QAAQ,CAAA,CAAA;AAAA,MAErD,QAAA,EAAA;AAAA,wBAAC,GAAA,CAAA,aAAA,EAAA,EAAc,cAA4B,YAA4B,EAAA,CAAA;AAAA,wBACvE,IAAA,CAAC,IAAK,EAAA,EAAA,OAAA,EAAQ,MACZ,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,OAAO,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,aAAa,IAAI,QAAQ,CAAA,CAAA;AAAA,cAC/C,IAAK,EAAA,MAAA;AAAA,cACL,QAAS,EAAA;AAAA;AAAA,WACX;AAAA,8BACC,YACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,aAAa,KAAb,EAAA,EAAmB,MAAK,EAAG,EAAA,KAAA,EAAO,EAAE,iBAAiB,CAAA,EACpD,+BAAC,IAAK,EAAA,EAAA,SAAA,EAAS,MAAC,SAAU,EAAA,KAAA,EAAM,SAAS,CACvC,EAAA,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAC,EAAI,EAAA,EAAA,EAAI,IAAI,EACrB,EAAA,QAAA,kBAAA,GAAA;AAAA,cAAC,SAAA;AAAA,cAAA;AAAA,gBACC,UAAU,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,aAAa,IAAI,QAAQ,CAAA;AAAA;AAAA,aAEtD,EAAA,CAAA;AAAA,gCACC,IAAK,EAAA,EAAA,IAAA,EAAI,MAAC,EAAI,EAAA,CAAA,EAAG,IAAI,EACpB,EAAA,QAAA,kBAAA,GAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBACC,UAAU,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,aAAa,IAAI,QAAQ,CAAA,CAAA;AAAA,gBAClD;AAAA;AAAA,aAEJ,EAAA,CAAA;AAAA,gCACC,IAAK,EAAA,EAAA,IAAA,EAAI,MAAC,EAAI,EAAA,CAAA,EAAG,IAAI,EACpB,EAAA,QAAA,kBAAA,GAAA;AAAA,cAAC,eAAA;AAAA,cAAA;AAAA,gBACC,iBAAiB,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,aAAa,IAAI,QAAQ,CAAA,CAAA;AAAA,gBACzD,uBAAuB,WAAY,CAAA,qBAAA;AAAA,gBACnC,eAAe,WAAY,CAAA;AAAA;AAAA,aAE/B,EAAA;AAAA,WAAA,EACF,GACF,CACF,EAAA;AAAA,SACF,EAAA;AAAA;AAAA;AAAA,GACF;AAEJ;;;;"}
@@ -27,14 +27,13 @@ const DeleteRole = ({
27
27
  dataTestId,
28
28
  fallbackTooltip: tooltip
29
29
  });
30
- return /* @__PURE__ */ jsx(Tooltip, { title: tooltipText, children: /* @__PURE__ */ jsx(
30
+ return /* @__PURE__ */ jsx(Tooltip, { title: tooltipText, children: /* @__PURE__ */ jsx("span", { style: { display: "inline-flex" }, children: /* @__PURE__ */ jsx(
31
31
  IconButton,
32
32
  {
33
33
  onClick: () => openDialog(roleName),
34
34
  "data-testid": testIdText,
35
35
  "aria-label": t("common.delete"),
36
36
  disabled: disable,
37
- title: tooltip ?? t("common.deleteRole"),
38
37
  sx: {
39
38
  p: 1,
40
39
  borderRadius: "50%",
@@ -42,7 +41,7 @@ const DeleteRole = ({
42
41
  },
43
42
  children: /* @__PURE__ */ jsx(Delete, {})
44
43
  }
45
- ) });
44
+ ) }) });
46
45
  };
47
46
 
48
47
  export { DeleteRole as default };
@@ -1 +1 @@
1
- {"version":3,"file":"DeleteRole.esm.js","sources":["../../../src/components/RolesList/DeleteRole.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Delete from '@mui/icons-material/Delete';\nimport IconButton from '@mui/material/IconButton';\nimport Tooltip from '@mui/material/Tooltip';\nimport { policyEntityDeletePermission } from '@backstage-community/plugin-rbac-common';\nimport { useActionPermissionTooltip } from '../../hooks/useActionPermissionTooltip';\nimport { useDeleteDialog } from '../DeleteDialogContext';\nimport { useTranslation } from '../../hooks/useTranslation';\n\ntype DeleteRoleProps = {\n roleName: string;\n canEdit: boolean;\n dataTestId?: string;\n tooltip?: string;\n};\n\nconst DeleteRole = ({\n roleName,\n canEdit,\n dataTestId,\n tooltip,\n}: DeleteRoleProps) => {\n const { t } = useTranslation();\n const { setDeleteComponent, setOpenDialog } = useDeleteDialog();\n\n const openDialog = (name: string) => {\n setDeleteComponent({ roleName: name });\n setOpenDialog(true);\n };\n\n const { disable, tooltipText, testIdText } = useActionPermissionTooltip({\n permission: policyEntityDeletePermission,\n resourceRef: roleName,\n canAct: canEdit,\n action: 'delete',\n dataTestId: dataTestId,\n fallbackTooltip: tooltip,\n });\n\n return (\n <Tooltip title={tooltipText}>\n <IconButton\n onClick={() => openDialog(roleName)}\n data-testid={testIdText}\n aria-label={t('common.delete')}\n disabled={disable}\n title={tooltip ?? t('common.deleteRole')}\n sx={{\n p: 1,\n borderRadius: '50%',\n '&:hover': { borderRadius: '50%' },\n }}\n >\n <Delete />\n </IconButton>\n </Tooltip>\n );\n};\nexport default DeleteRole;\n"],"names":[],"mappings":";;;;;;;;;AA+BA,MAAM,aAAa,CAAC;AAAA,EAClB,QAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAuB,KAAA;AACrB,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA;AAC7B,EAAA,MAAM,EAAE,kBAAA,EAAoB,aAAc,EAAA,GAAI,eAAgB,EAAA;AAE9D,EAAM,MAAA,UAAA,GAAa,CAAC,IAAiB,KAAA;AACnC,IAAmB,kBAAA,CAAA,EAAE,QAAU,EAAA,IAAA,EAAM,CAAA;AACrC,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,GACpB;AAEA,EAAA,MAAM,EAAE,OAAA,EAAS,WAAa,EAAA,UAAA,KAAe,0BAA2B,CAAA;AAAA,IACtE,UAAY,EAAA,4BAAA;AAAA,IACZ,WAAa,EAAA,QAAA;AAAA,IACb,MAAQ,EAAA,OAAA;AAAA,IACR,MAAQ,EAAA,QAAA;AAAA,IACR,UAAA;AAAA,IACA,eAAiB,EAAA;AAAA,GAClB,CAAA;AAED,EACE,uBAAA,GAAA,CAAC,OAAQ,EAAA,EAAA,KAAA,EAAO,WACd,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,MAAM,UAAA,CAAW,QAAQ,CAAA;AAAA,MAClC,aAAa,EAAA,UAAA;AAAA,MACb,YAAA,EAAY,EAAE,eAAe,CAAA;AAAA,MAC7B,QAAU,EAAA,OAAA;AAAA,MACV,KAAA,EAAO,OAAW,IAAA,CAAA,CAAE,mBAAmB,CAAA;AAAA,MACvC,EAAI,EAAA;AAAA,QACF,CAAG,EAAA,CAAA;AAAA,QACH,YAAc,EAAA,KAAA;AAAA,QACd,SAAA,EAAW,EAAE,YAAA,EAAc,KAAM;AAAA,OACnC;AAAA,MAEA,8BAAC,MAAO,EAAA,EAAA;AAAA;AAAA,GAEZ,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"DeleteRole.esm.js","sources":["../../../src/components/RolesList/DeleteRole.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Delete from '@mui/icons-material/Delete';\nimport IconButton from '@mui/material/IconButton';\nimport Tooltip from '@mui/material/Tooltip';\nimport { policyEntityDeletePermission } from '@backstage-community/plugin-rbac-common';\nimport { useActionPermissionTooltip } from '../../hooks/useActionPermissionTooltip';\nimport { useDeleteDialog } from '../DeleteDialogContext';\nimport { useTranslation } from '../../hooks/useTranslation';\n\ntype DeleteRoleProps = {\n roleName: string;\n canEdit: boolean;\n dataTestId?: string;\n tooltip?: string;\n};\n\nconst DeleteRole = ({\n roleName,\n canEdit,\n dataTestId,\n tooltip,\n}: DeleteRoleProps) => {\n const { t } = useTranslation();\n const { setDeleteComponent, setOpenDialog } = useDeleteDialog();\n\n const openDialog = (name: string) => {\n setDeleteComponent({ roleName: name });\n setOpenDialog(true);\n };\n\n const { disable, tooltipText, testIdText } = useActionPermissionTooltip({\n permission: policyEntityDeletePermission,\n resourceRef: roleName,\n canAct: canEdit,\n action: 'delete',\n dataTestId: dataTestId,\n fallbackTooltip: tooltip,\n });\n\n return (\n <Tooltip title={tooltipText}>\n <span style={{ display: 'inline-flex' }}>\n <IconButton\n onClick={() => openDialog(roleName)}\n data-testid={testIdText}\n aria-label={t('common.delete')}\n disabled={disable}\n sx={{\n p: 1,\n borderRadius: '50%',\n '&:hover': { borderRadius: '50%' },\n }}\n >\n <Delete />\n </IconButton>\n </span>\n </Tooltip>\n );\n};\nexport default DeleteRole;\n"],"names":[],"mappings":";;;;;;;;;AA+BA,MAAM,aAAa,CAAC;AAAA,EAClB,QAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAuB,KAAA;AACrB,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA;AAC7B,EAAA,MAAM,EAAE,kBAAA,EAAoB,aAAc,EAAA,GAAI,eAAgB,EAAA;AAE9D,EAAM,MAAA,UAAA,GAAa,CAAC,IAAiB,KAAA;AACnC,IAAmB,kBAAA,CAAA,EAAE,QAAU,EAAA,IAAA,EAAM,CAAA;AACrC,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,GACpB;AAEA,EAAA,MAAM,EAAE,OAAA,EAAS,WAAa,EAAA,UAAA,KAAe,0BAA2B,CAAA;AAAA,IACtE,UAAY,EAAA,4BAAA;AAAA,IACZ,WAAa,EAAA,QAAA;AAAA,IACb,MAAQ,EAAA,OAAA;AAAA,IACR,MAAQ,EAAA,QAAA;AAAA,IACR,UAAA;AAAA,IACA,eAAiB,EAAA;AAAA,GAClB,CAAA;AAED,EACE,uBAAA,GAAA,CAAC,OAAQ,EAAA,EAAA,KAAA,EAAO,WACd,EAAA,QAAA,kBAAA,GAAA,CAAC,UAAK,KAAO,EAAA,EAAE,OAAS,EAAA,aAAA,EACtB,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,MAAM,UAAA,CAAW,QAAQ,CAAA;AAAA,MAClC,aAAa,EAAA,UAAA;AAAA,MACb,YAAA,EAAY,EAAE,eAAe,CAAA;AAAA,MAC7B,QAAU,EAAA,OAAA;AAAA,MACV,EAAI,EAAA;AAAA,QACF,CAAG,EAAA,CAAA;AAAA,QACH,YAAc,EAAA,KAAA;AAAA,QACd,SAAA,EAAW,EAAE,YAAA,EAAc,KAAM;AAAA,OACnC;AAAA,MAEA,8BAAC,MAAO,EAAA,EAAA;AAAA;AAAA,KAEZ,CACF,EAAA,CAAA;AAEJ;;;;"}
@@ -23,7 +23,7 @@ const getColumns = (t, locale) => {
23
23
  field: "members",
24
24
  type: "string",
25
25
  align: "left",
26
- render: (props) => getMembers(props.members, t),
26
+ render: (props) => props.isDefault ? t("table.defaultRoleUsersAndGroups") : getMembers(props.members, t),
27
27
  customSort: (a, b) => {
28
28
  if (a.members.length === 0) {
29
29
  return -1;
@@ -54,22 +54,28 @@ const getColumns = (t, locale) => {
54
54
  {
55
55
  title: t("table.headers.actions"),
56
56
  sorting: false,
57
- render: (props) => /* @__PURE__ */ jsxs(Fragment, { children: [
58
- /* @__PURE__ */ jsx(
59
- EditRole,
60
- {
61
- canEdit: props.actionsPermissionResults.edit.allowed,
62
- roleName: props.name
63
- }
64
- ),
65
- /* @__PURE__ */ jsx(
66
- DeleteRole,
67
- {
68
- canEdit: props.actionsPermissionResults.edit.allowed,
69
- roleName: props.name
70
- }
71
- )
72
- ] })
57
+ render: (props) => {
58
+ const canEdit = !props.isDefault && props.actionsPermissionResults.edit.allowed;
59
+ const defaultRoleTooltip = props.isDefault ? t("errors.defaultRoleReadOnly") : undefined;
60
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
61
+ /* @__PURE__ */ jsx(
62
+ EditRole,
63
+ {
64
+ canEdit,
65
+ roleName: props.name,
66
+ tooltip: defaultRoleTooltip
67
+ }
68
+ ),
69
+ /* @__PURE__ */ jsx(
70
+ DeleteRole,
71
+ {
72
+ canEdit,
73
+ roleName: props.name,
74
+ tooltip: defaultRoleTooltip
75
+ }
76
+ )
77
+ ] });
78
+ }
73
79
  }
74
80
  ];
75
81
  };
@@ -1 +1 @@
1
- {"version":3,"file":"RolesListColumns.esm.js","sources":["../../../src/components/RolesList/RolesListColumns.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { parseEntityRef } from '@backstage/catalog-model';\nimport { Link, TableColumn } from '@backstage/core-components';\n\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\n\nimport { RolesData } from '../../types';\nimport { getMembers } from '../../utils/rbac-utils';\nimport EditRole from '../EditRole';\nimport DeleteRole from './DeleteRole';\nimport { TranslationFunction } from '@backstage/core-plugin-api/alpha';\nimport { rbacTranslationRef } from '../../alpha/translations';\n\nexport const getColumns = (\n t: TranslationFunction<typeof rbacTranslationRef.T>,\n locale: string,\n): TableColumn<RolesData>[] => {\n return [\n {\n title: t('table.headers.name'),\n field: 'name',\n type: 'string',\n render: (props: RolesData) => {\n const { kind, namespace, name } = parseEntityRef(props.name);\n return (\n <Link to={`roles/${kind}/${namespace}/${name}`}>{props.name}</Link>\n );\n },\n },\n {\n title: t('table.headers.usersAndGroups'),\n field: 'members',\n type: 'string',\n align: 'left',\n render: props => getMembers(props.members, t),\n customSort: (a, b) => {\n if (a.members.length === 0) {\n return -1;\n }\n if (b.members.length === 0) {\n return 1;\n }\n if (a.members.length === b.members.length) {\n return 0;\n }\n return a.members.length < b.members.length ? -1 : 1;\n },\n },\n {\n title: t('table.headers.accessiblePlugins'),\n field: 'accessiblePlugins',\n type: 'string',\n align: 'left',\n render: (props: RolesData) => {\n const pls = props.accessiblePlugins.map(\n p => p[0].toLocaleUpperCase(locale) + p.slice(1),\n );\n const plsTooltip = pls.join(', ');\n const plsOverflowCount = pls.length > 2 ? `+ ${pls.length - 2}` : '';\n\n return pls.length > 0 ? (\n <Tooltip title={plsTooltip || ''} placement=\"top-start\">\n <Typography>\n {pls.length === 1\n ? `${pls[0]}`\n : `${pls[0]}, ${pls[1]} ${plsOverflowCount}`}\n </Typography>\n </Tooltip>\n ) : (\n '-'\n );\n },\n },\n {\n title: t('table.headers.actions'),\n sorting: false,\n render: (props: RolesData) => (\n <>\n <EditRole\n canEdit={props.actionsPermissionResults.edit.allowed}\n roleName={props.name}\n />\n <DeleteRole\n canEdit={props.actionsPermissionResults.edit.allowed}\n roleName={props.name}\n />\n </>\n ),\n },\n ];\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RolesListColumns.esm.js","sources":["../../../src/components/RolesList/RolesListColumns.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { parseEntityRef } from '@backstage/catalog-model';\nimport { Link, TableColumn } from '@backstage/core-components';\n\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\n\nimport { RolesData } from '../../types';\nimport { getMembers } from '../../utils/rbac-utils';\nimport EditRole from '../EditRole';\nimport DeleteRole from './DeleteRole';\nimport { TranslationFunction } from '@backstage/core-plugin-api/alpha';\nimport { rbacTranslationRef } from '../../alpha/translations';\n\nexport const getColumns = (\n t: TranslationFunction<typeof rbacTranslationRef.T>,\n locale: string,\n): TableColumn<RolesData>[] => {\n return [\n {\n title: t('table.headers.name'),\n field: 'name',\n type: 'string',\n render: (props: RolesData) => {\n const { kind, namespace, name } = parseEntityRef(props.name);\n return (\n <Link to={`roles/${kind}/${namespace}/${name}`}>{props.name}</Link>\n );\n },\n },\n {\n title: t('table.headers.usersAndGroups'),\n field: 'members',\n type: 'string',\n align: 'left',\n render: props =>\n props.isDefault\n ? t('table.defaultRoleUsersAndGroups')\n : getMembers(props.members, t),\n customSort: (a, b) => {\n if (a.members.length === 0) {\n return -1;\n }\n if (b.members.length === 0) {\n return 1;\n }\n if (a.members.length === b.members.length) {\n return 0;\n }\n return a.members.length < b.members.length ? -1 : 1;\n },\n },\n {\n title: t('table.headers.accessiblePlugins'),\n field: 'accessiblePlugins',\n type: 'string',\n align: 'left',\n render: (props: RolesData) => {\n const pls = props.accessiblePlugins.map(\n p => p[0].toLocaleUpperCase(locale) + p.slice(1),\n );\n const plsTooltip = pls.join(', ');\n const plsOverflowCount = pls.length > 2 ? `+ ${pls.length - 2}` : '';\n\n return pls.length > 0 ? (\n <Tooltip title={plsTooltip || ''} placement=\"top-start\">\n <Typography>\n {pls.length === 1\n ? `${pls[0]}`\n : `${pls[0]}, ${pls[1]} ${plsOverflowCount}`}\n </Typography>\n </Tooltip>\n ) : (\n '-'\n );\n },\n },\n {\n title: t('table.headers.actions'),\n sorting: false,\n render: (props: RolesData) => {\n const canEdit =\n !props.isDefault && props.actionsPermissionResults.edit.allowed;\n const defaultRoleTooltip = props.isDefault\n ? t('errors.defaultRoleReadOnly')\n : undefined;\n return (\n <>\n <EditRole\n canEdit={canEdit}\n roleName={props.name}\n tooltip={defaultRoleTooltip}\n />\n <DeleteRole\n canEdit={canEdit}\n roleName={props.name}\n tooltip={defaultRoleTooltip}\n />\n </>\n );\n },\n },\n ];\n};\n"],"names":[],"mappings":"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"}
@@ -20,7 +20,7 @@ function useActionPermissionTooltip({
20
20
  if (isLoading) {
21
21
  tooltipText = t("common.checkingPermissions");
22
22
  } else if (disable) {
23
- tooltipText = t("common.unauthorizedTo", { action: actionText });
23
+ tooltipText = fallbackTooltip ?? t("common.unauthorizedTo", { action: actionText });
24
24
  } else {
25
25
  tooltipText = fallbackTooltip ?? t("common.roleAction", {
26
26
  action: capitalizeFirstLetter(actionText)
@@ -1 +1 @@
1
- {"version":3,"file":"useActionPermissionTooltip.esm.js","sources":["../../src/hooks/useActionPermissionTooltip.ts"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport { capitalizeFirstLetter } from '../utils/string-utils';\nimport { useTranslation } from './useTranslation';\n\nexport function useActionPermissionTooltip({\n permission,\n resourceRef,\n canAct,\n action,\n dataTestId,\n fallbackTooltip,\n}: {\n permission: any;\n resourceRef: string;\n canAct: boolean;\n action?: string;\n dataTestId?: string;\n fallbackTooltip?: string;\n}) {\n const { t } = useTranslation();\n const result = usePermission({ permission, resourceRef });\n\n const isLoading = result.loading;\n const isAllowed = result.allowed;\n const disable = !(isAllowed && canAct);\n\n let tooltipText: string;\n const actionText = action || t('common.performThisAction');\n\n if (isLoading) {\n tooltipText = t('common.checkingPermissions');\n } else if (disable) {\n tooltipText = t('common.unauthorizedTo' as any, { action: actionText });\n } else {\n tooltipText =\n fallbackTooltip ??\n t('common.roleAction' as any, {\n action: capitalizeFirstLetter(actionText),\n });\n }\n const testIdText = disable\n ? `disable-${actionText}-role-${resourceRef}`\n : `${actionText}-role-${resourceRef}`;\n\n return {\n isLoading,\n isAllowed,\n disable,\n tooltipText,\n testIdText: dataTestId ?? testIdText,\n };\n}\n"],"names":[],"mappings":";;;;AAoBO,SAAS,0BAA2B,CAAA;AAAA,EACzC,UAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAOG,EAAA;AACD,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA;AAC7B,EAAA,MAAM,MAAS,GAAA,aAAA,CAAc,EAAE,UAAA,EAAY,aAAa,CAAA;AAExD,EAAA,MAAM,YAAY,MAAO,CAAA,OAAA;AACzB,EAAA,MAAM,YAAY,MAAO,CAAA,OAAA;AACzB,EAAM,MAAA,OAAA,GAAU,EAAE,SAAa,IAAA,MAAA,CAAA;AAE/B,EAAI,IAAA,WAAA;AACJ,EAAM,MAAA,UAAA,GAAa,MAAU,IAAA,CAAA,CAAE,0BAA0B,CAAA;AAEzD,EAAA,IAAI,SAAW,EAAA;AACb,IAAA,WAAA,GAAc,EAAE,4BAA4B,CAAA;AAAA,aACnC,OAAS,EAAA;AAClB,IAAA,WAAA,GAAc,CAAE,CAAA,uBAAA,EAAgC,EAAE,MAAA,EAAQ,YAAY,CAAA;AAAA,GACjE,MAAA;AACL,IACE,WAAA,GAAA,eAAA,IACA,EAAE,mBAA4B,EAAA;AAAA,MAC5B,MAAA,EAAQ,sBAAsB,UAAU;AAAA,KACzC,CAAA;AAAA;AAEL,EAAM,MAAA,UAAA,GAAa,OACf,GAAA,CAAA,QAAA,EAAW,UAAU,CAAA,MAAA,EAAS,WAAW,CACzC,CAAA,GAAA,CAAA,EAAG,UAAU,CAAA,MAAA,EAAS,WAAW,CAAA,CAAA;AAErC,EAAO,OAAA;AAAA,IACL,SAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAY,UAAc,IAAA;AAAA,GAC5B;AACF;;;;"}
1
+ {"version":3,"file":"useActionPermissionTooltip.esm.js","sources":["../../src/hooks/useActionPermissionTooltip.ts"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport { capitalizeFirstLetter } from '../utils/string-utils';\nimport { useTranslation } from './useTranslation';\n\nexport function useActionPermissionTooltip({\n permission,\n resourceRef,\n canAct,\n action,\n dataTestId,\n fallbackTooltip,\n}: {\n permission: any;\n resourceRef: string;\n canAct: boolean;\n action?: string;\n dataTestId?: string;\n fallbackTooltip?: string;\n}) {\n const { t } = useTranslation();\n const result = usePermission({ permission, resourceRef });\n\n const isLoading = result.loading;\n const isAllowed = result.allowed;\n const disable = !(isAllowed && canAct);\n\n let tooltipText: string;\n const actionText = action || t('common.performThisAction');\n\n if (isLoading) {\n tooltipText = t('common.checkingPermissions');\n } else if (disable) {\n tooltipText =\n fallbackTooltip ??\n t('common.unauthorizedTo' as any, { action: actionText });\n } else {\n tooltipText =\n fallbackTooltip ??\n t('common.roleAction' as any, {\n action: capitalizeFirstLetter(actionText),\n });\n }\n const testIdText = disable\n ? `disable-${actionText}-role-${resourceRef}`\n : `${actionText}-role-${resourceRef}`;\n\n return {\n isLoading,\n isAllowed,\n disable,\n tooltipText,\n testIdText: dataTestId ?? testIdText,\n };\n}\n"],"names":[],"mappings":";;;;AAoBO,SAAS,0BAA2B,CAAA;AAAA,EACzC,UAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAOG,EAAA;AACD,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA;AAC7B,EAAA,MAAM,MAAS,GAAA,aAAA,CAAc,EAAE,UAAA,EAAY,aAAa,CAAA;AAExD,EAAA,MAAM,YAAY,MAAO,CAAA,OAAA;AACzB,EAAA,MAAM,YAAY,MAAO,CAAA,OAAA;AACzB,EAAM,MAAA,OAAA,GAAU,EAAE,SAAa,IAAA,MAAA,CAAA;AAE/B,EAAI,IAAA,WAAA;AACJ,EAAM,MAAA,UAAA,GAAa,MAAU,IAAA,CAAA,CAAE,0BAA0B,CAAA;AAEzD,EAAA,IAAI,SAAW,EAAA;AACb,IAAA,WAAA,GAAc,EAAE,4BAA4B,CAAA;AAAA,aACnC,OAAS,EAAA;AAClB,IAAA,WAAA,GACE,mBACA,CAAE,CAAA,uBAAA,EAAgC,EAAE,MAAA,EAAQ,YAAY,CAAA;AAAA,GACrD,MAAA;AACL,IACE,WAAA,GAAA,eAAA,IACA,EAAE,mBAA4B,EAAA;AAAA,MAC5B,MAAA,EAAQ,sBAAsB,UAAU;AAAA,KACzC,CAAA;AAAA;AAEL,EAAM,MAAA,UAAA,GAAa,OACf,GAAA,CAAA,QAAA,EAAW,UAAU,CAAA,MAAA,EAAS,WAAW,CACzC,CAAA,GAAA,CAAA,EAAG,UAAU,CAAA,MAAA,EAAS,WAAW,CAAA,CAAA;AAErC,EAAO,OAAA;AAAA,IACL,SAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAY,UAAc,IAAA;AAAA,GAC5B;AACF;;;;"}
@@ -87,12 +87,14 @@ const useMembers = (roleName, pollInterval) => {
87
87
  },
88
88
  loading ? null : 1e4
89
89
  );
90
+ const isDefaultRole = Array.isArray(role) && role[0]?.metadata?.isDefault;
90
91
  return {
91
92
  loading,
92
93
  data,
93
94
  retry: { roleRetry, membersRetry },
94
95
  error: getErrorText(role, members, t) || roleError || membersError,
95
- canReadUsersAndGroups
96
+ canReadUsersAndGroups,
97
+ isDefaultRole: isDefaultRole ?? false
96
98
  };
97
99
  };
98
100