* 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:
co-authored by
Karl Persson
parent
493c7866a2
commit
565969cfcf
@@ -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}
|
||||||
|
|||||||
Reference in New Issue
Block a user