diff --git a/frontend/src/component/admin/roles/RoleForm/PermissionAccordion/PermissionAccordion.tsx b/frontend/src/component/admin/roles/RoleForm/PermissionAccordion/PermissionAccordion.tsx index 5010cd3c77..ce50bb5fc0 100644 --- a/frontend/src/component/admin/roles/RoleForm/PermissionAccordion/PermissionAccordion.tsx +++ b/frontend/src/component/admin/roles/RoleForm/PermissionAccordion/PermissionAccordion.tsx @@ -139,15 +139,15 @@ export const PermissionAccordion: VFC = ({ {isAllChecked ? 'Unselect ' : 'Select '} all {context} permissions - + {permissions?.map((permission: IPermission) => ( { const rootPermissions = permissions.filter(({ name }) => name !== 'ADMIN'); - return rootPermissions - .reduce((categories: IPermissionCategory[], permission) => { + const categories = rootPermissions.reduce( + (categories: IPermissionCategory[], permission) => { const categoryLabel = ROOT_PERMISSION_CATEGORIES.find((category) => category.permissions.includes(permission.name), @@ -97,7 +97,21 @@ export const getCategorizedRootPermissions = (permissions: IPermission[]) => { } return categories; - }, []) + }, + [], + ); + + return categories + .map((category) => ({ + ...category, + permissions: [ + ...new Set( + category.permissions.sort((a, b) => + a.displayName.localeCompare(b.displayName), + ), + ), + ], + })) .sort(sortCategories); }; @@ -146,7 +160,16 @@ export const getCategorizedProjectPermissions = ( ), ); - return categories; + return categories.map((category) => ({ + ...category, + permissions: [ + ...new Set( + category.permissions.sort((a, b) => + a.displayName.localeCompare(b.displayName), + ), + ), + ], + })); }; export const flattenProjectPermissions = (