2021-12-20 09:52:24 +01:00
|
|
|
import React, { useEffect, useMemo, useState } from 'react';
|
2022-04-22 14:33:13 +01:00
|
|
|
|
2023-05-17 16:15:36 +01:00
|
|
|
import { Stack } from '@grafana/experimental';
|
|
|
|
|
import { Button, Form, Select } from '@grafana/ui';
|
2021-12-20 09:52:24 +01:00
|
|
|
import { CloseButton } from 'app/core/components/CloseButton/CloseButton';
|
2022-04-22 14:33:13 +01:00
|
|
|
import { TeamPicker } from 'app/core/components/Select/TeamPicker';
|
|
|
|
|
import { UserPicker } from 'app/core/components/Select/UserPicker';
|
2023-06-29 13:43:14 +01:00
|
|
|
import { Trans, t } from 'app/core/internationalization';
|
2022-04-22 14:33:13 +01:00
|
|
|
import { OrgRole } from 'app/types/acl';
|
|
|
|
|
|
2021-12-20 09:52:24 +01:00
|
|
|
import { Assignments, PermissionTarget, SetPermission } from './types';
|
|
|
|
|
|
|
|
|
|
export interface Props {
|
2022-01-19 12:19:46 +01:00
|
|
|
title?: string;
|
2021-12-20 09:52:24 +01:00
|
|
|
permissions: string[];
|
|
|
|
|
assignments: Assignments;
|
|
|
|
|
onCancel: () => void;
|
|
|
|
|
onAdd: (state: SetPermission) => void;
|
|
|
|
|
}
|
|
|
|
|
|
2023-06-29 13:43:14 +01:00
|
|
|
export const AddPermission = ({
|
|
|
|
|
title = t('access-control.add-permission.title', 'Add permission for'),
|
|
|
|
|
permissions,
|
|
|
|
|
assignments,
|
|
|
|
|
onAdd,
|
|
|
|
|
onCancel,
|
|
|
|
|
}: Props) => {
|
2022-05-06 10:31:53 +02:00
|
|
|
const [target, setPermissionTarget] = useState<PermissionTarget>(PermissionTarget.None);
|
2021-12-20 09:52:24 +01:00
|
|
|
const [teamId, setTeamId] = useState(0);
|
|
|
|
|
const [userId, setUserId] = useState(0);
|
|
|
|
|
const [builtInRole, setBuiltinRole] = useState('');
|
|
|
|
|
const [permission, setPermission] = useState('');
|
|
|
|
|
|
|
|
|
|
const targetOptions = useMemo(() => {
|
|
|
|
|
const options = [];
|
2022-05-06 10:31:53 +02:00
|
|
|
if (assignments.users) {
|
2023-06-29 13:43:14 +01:00
|
|
|
options.push({ value: PermissionTarget.User, label: t('access-control.add-permission.user-label', 'User') });
|
2021-12-20 09:52:24 +01:00
|
|
|
}
|
|
|
|
|
if (assignments.teams) {
|
2023-06-29 13:43:14 +01:00
|
|
|
options.push({ value: PermissionTarget.Team, label: t('access-control.add-permission.team-label', 'Team') });
|
2021-12-20 09:52:24 +01:00
|
|
|
}
|
|
|
|
|
if (assignments.builtInRoles) {
|
2023-06-29 13:43:14 +01:00
|
|
|
options.push({
|
|
|
|
|
value: PermissionTarget.BuiltInRole,
|
|
|
|
|
label: t('access-control.add-permission.role-label', 'Role'),
|
|
|
|
|
});
|
2021-12-20 09:52:24 +01:00
|
|
|
}
|
|
|
|
|
return options;
|
2022-05-06 10:31:53 +02:00
|
|
|
}, [assignments]);
|
2021-12-20 09:52:24 +01:00
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
if (permissions.length > 0) {
|
|
|
|
|
setPermission(permissions[0]);
|
|
|
|
|
}
|
|
|
|
|
}, [permissions]);
|
|
|
|
|
|
|
|
|
|
const isValid = () =>
|
|
|
|
|
(target === PermissionTarget.Team && teamId > 0) ||
|
|
|
|
|
(target === PermissionTarget.User && userId > 0) ||
|
|
|
|
|
(PermissionTarget.BuiltInRole && OrgRole.hasOwnProperty(builtInRole));
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<div className="cta-form" aria-label="Permissions slider">
|
|
|
|
|
<CloseButton onClick={onCancel} />
|
2022-01-19 12:19:46 +01:00
|
|
|
<h5>{title}</h5>
|
2022-02-03 16:59:25 +01:00
|
|
|
|
2021-12-20 09:52:24 +01:00
|
|
|
<Form
|
|
|
|
|
name="addPermission"
|
|
|
|
|
maxWidth="none"
|
|
|
|
|
onSubmit={() => onAdd({ userId, teamId, builtInRole, permission, target })}
|
|
|
|
|
>
|
|
|
|
|
{() => (
|
2023-05-17 16:15:36 +01:00
|
|
|
<Stack gap={1} direction="row">
|
2021-12-20 09:52:24 +01:00
|
|
|
<Select
|
|
|
|
|
aria-label="Role to add new permission to"
|
|
|
|
|
value={target}
|
|
|
|
|
options={targetOptions}
|
|
|
|
|
onChange={(v) => setPermissionTarget(v.value!)}
|
2022-02-03 16:59:25 +01:00
|
|
|
disabled={targetOptions.length === 0}
|
2023-05-17 16:15:36 +01:00
|
|
|
width="auto"
|
2021-12-20 09:52:24 +01:00
|
|
|
/>
|
|
|
|
|
|
2023-05-17 16:15:36 +01:00
|
|
|
{target === PermissionTarget.User && <UserPicker onSelected={(u) => setUserId(u?.value || 0)} />}
|
2021-12-20 09:52:24 +01:00
|
|
|
|
2023-05-17 16:15:36 +01:00
|
|
|
{target === PermissionTarget.Team && <TeamPicker onSelected={(t) => setTeamId(t.value?.id || 0)} />}
|
2021-12-20 09:52:24 +01:00
|
|
|
|
|
|
|
|
{target === PermissionTarget.BuiltInRole && (
|
|
|
|
|
<Select
|
|
|
|
|
aria-label={'Built-in role picker'}
|
|
|
|
|
options={Object.values(OrgRole).map((r) => ({ value: r, label: r }))}
|
|
|
|
|
onChange={(r) => setBuiltinRole(r.value || '')}
|
2023-05-17 16:15:36 +01:00
|
|
|
width="auto"
|
2021-12-20 09:52:24 +01:00
|
|
|
/>
|
|
|
|
|
)}
|
|
|
|
|
|
|
|
|
|
<Select
|
2022-01-19 15:53:54 -06:00
|
|
|
aria-label="Permission Level"
|
2023-05-17 16:15:36 +01:00
|
|
|
width="auto"
|
2021-12-20 09:52:24 +01:00
|
|
|
value={permissions.find((p) => p === permission)}
|
|
|
|
|
options={permissions.map((p) => ({ label: p, value: p }))}
|
|
|
|
|
onChange={(v) => setPermission(v.value || '')}
|
|
|
|
|
/>
|
|
|
|
|
<Button type="submit" disabled={!isValid()}>
|
2023-06-29 13:43:14 +01:00
|
|
|
<Trans i18nKey="access-control.add-permissions.save">Save</Trans>
|
2021-12-20 09:52:24 +01:00
|
|
|
</Button>
|
2023-05-17 16:15:36 +01:00
|
|
|
</Stack>
|
2021-12-20 09:52:24 +01:00
|
|
|
)}
|
|
|
|
|
</Form>
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
};
|