From c9661a5be1ea329621b8cea4f4b575edf12e9fec Mon Sep 17 00:00:00 2001 From: Karl Persson Date: Tue, 23 Aug 2022 15:34:31 +0200 Subject: [PATCH] RBAC: Only display unique permissions in list (#54074) * PermissionList: Only display one row for each user, team or builtin role --- .../AccessControl/PermissionList.tsx | 25 ++++++++++++++++--- .../components/AccessControl/Permissions.tsx | 9 ++++--- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/public/app/core/components/AccessControl/PermissionList.tsx b/public/app/core/components/AccessControl/PermissionList.tsx index a2e59d98480..95e9ca6cdbc 100644 --- a/public/app/core/components/AccessControl/PermissionList.tsx +++ b/public/app/core/components/AccessControl/PermissionList.tsx @@ -1,10 +1,11 @@ -import React from 'react'; +import React, { useMemo } from 'react'; import { PermissionListItem } from './PermissionListItem'; import { ResourcePermission } from './types'; interface Props { title: string; + compareKey: 'builtInRole' | 'userLogin' | 'team'; items: ResourcePermission[]; permissionLevels: string[]; canSet: boolean; @@ -12,8 +13,24 @@ interface Props { onChange: (resourcePermission: ResourcePermission, permission: string) => void; } -export const PermissionList = ({ title, items, permissionLevels, canSet, onRemove, onChange }: Props) => { - if (items.length === 0) { +export const PermissionList = ({ title, items, compareKey, permissionLevels, canSet, onRemove, onChange }: Props) => { + const computed = useMemo(() => { + const keep: { [key: string]: ResourcePermission } = {}; + for (let item of items) { + const key = item[compareKey]!; + if (!keep[key]) { + keep[key] = item; + continue; + } + + if (item.actions.length > keep[key].actions.length) { + keep[key] = item; + } + } + return Object.keys(keep).map((k) => keep[k]); + }, [items, compareKey]); + + if (computed.length === 0) { return null; } @@ -31,7 +48,7 @@ export const PermissionList = ({ title, items, permissionLevels, canSet, onRemov - {items.map((item, index) => ( + {computed.map((item, index) => ( sortBy( items.filter((i) => i.teamId), - ['team'] + ['team', 'isManaged'] ), [items] ); @@ -110,7 +110,7 @@ export const Permissions = ({ () => sortBy( items.filter((i) => i.userId), - ['userLogin'] + ['userLogin', 'isManaged'] ), [items] ); @@ -118,7 +118,7 @@ export const Permissions = ({ () => sortBy( items.filter((i) => i.builtInRole), - ['builtInRole'] + ['builtInRole', 'isManaged'] ), [items] ); @@ -148,6 +148,7 @@ export const Permissions = ({