RBAC: Only display unique permissions in list (#54074) (#54383)

* PermissionList: Only display one row for each user, team or builtin role

(cherry picked from commit c9661a5be1)

Co-authored-by: Karl Persson <kalle.persson@grafana.com>
This commit is contained in:
Grot (@grafanabot)
2022-08-29 06:37:06 -04:00
committed by GitHub
co-authored by Karl Persson
parent 493c7866a2
commit 565969cfcf
2 changed files with 27 additions and 7 deletions
@@ -1,10 +1,11 @@
import React from 'react'; import React, { useMemo } from 'react';
import { PermissionListItem } from './PermissionListItem'; import { PermissionListItem } from './PermissionListItem';
import { ResourcePermission } from './types'; import { ResourcePermission } from './types';
interface Props { interface Props {
title: string; title: string;
compareKey: 'builtInRole' | 'userLogin' | 'team';
items: ResourcePermission[]; items: ResourcePermission[];
permissionLevels: string[]; permissionLevels: string[];
canSet: boolean; canSet: boolean;
@@ -12,8 +13,24 @@ interface Props {
onChange: (resourcePermission: ResourcePermission, permission: string) => void; onChange: (resourcePermission: ResourcePermission, permission: string) => void;
} }
export const PermissionList = ({ title, items, permissionLevels, canSet, onRemove, onChange }: Props) => { export const PermissionList = ({ title, items, compareKey, permissionLevels, canSet, onRemove, onChange }: Props) => {
if (items.length === 0) { 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; return null;
} }
@@ -31,7 +48,7 @@ export const PermissionList = ({ title, items, permissionLevels, canSet, onRemov
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{items.map((item, index) => ( {computed.map((item, index) => (
<PermissionListItem <PermissionListItem
item={item} item={item}
onRemove={onRemove} onRemove={onRemove}
@@ -102,7 +102,7 @@ export const Permissions = ({
() => () =>
sortBy( sortBy(
items.filter((i) => i.teamId), items.filter((i) => i.teamId),
['team'] ['team', 'isManaged']
), ),
[items] [items]
); );
@@ -110,7 +110,7 @@ export const Permissions = ({
() => () =>
sortBy( sortBy(
items.filter((i) => i.userId), items.filter((i) => i.userId),
['userLogin'] ['userLogin', 'isManaged']
), ),
[items] [items]
); );
@@ -118,7 +118,7 @@ export const Permissions = ({
() => () =>
sortBy( sortBy(
items.filter((i) => i.builtInRole), items.filter((i) => i.builtInRole),
['builtInRole'] ['builtInRole', 'isManaged']
), ),
[items] [items]
); );
@@ -148,6 +148,7 @@ export const Permissions = ({
<PermissionList <PermissionList
title="Role" title="Role"
items={builtInRoles} items={builtInRoles}
compareKey={'builtInRole'}
permissionLevels={desc.permissions} permissionLevels={desc.permissions}
onChange={onChange} onChange={onChange}
onRemove={onRemove} onRemove={onRemove}
@@ -156,6 +157,7 @@ export const Permissions = ({
<PermissionList <PermissionList
title="User" title="User"
items={users} items={users}
compareKey={'userLogin'}
permissionLevels={desc.permissions} permissionLevels={desc.permissions}
onChange={onChange} onChange={onChange}
onRemove={onRemove} onRemove={onRemove}
@@ -164,6 +166,7 @@ export const Permissions = ({
<PermissionList <PermissionList
title="Team" title="Team"
items={teams} items={teams}
compareKey={'team'}
permissionLevels={desc.permissions} permissionLevels={desc.permissions}
onChange={onChange} onChange={onChange}
onRemove={onRemove} onRemove={onRemove}