Teams: Use generated TS types (#60618)

* Teams: Use generated TS types

* Teams: Update types usage

* Teams: Update types import

* Teams: Move metadata to mock function

* Teams: Move TeamDTO to types

* Update kind
This commit is contained in:
Alex Khomenko 2023-01-04 14:08:03 +02:00 committed by GitHub
parent fc91baa2f8
commit c68603a573
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 44 additions and 67 deletions

View File

@ -27,7 +27,7 @@ lineage: seqs: [
// Updated indicates when the team was updated.
updated: int64 @grafanamaturity(ToMetadata="sys")
#Permission: 1 | 2 | 4 @cuetsy(kind="enum",memberNames="Viewer|Editor|Admin")
#Permission: 0 | 1 | 2 | 4 @cuetsy(kind="enum",memberNames="Member|Viewer|Editor|Admin")
},
]
},

View File

@ -1,5 +1,3 @@
import { KeyValue } from '.';
/**
* With RBAC, the backend will return additional access control metadata to objects.
* These metadata will contain user permissions associated to a given resource.
@ -10,5 +8,5 @@ import { KeyValue } from '.';
* }
*/
export interface WithAccessControlMetadata {
accessControl?: KeyValue<boolean>;
accessControl?: Record<string, boolean>;
}

View File

@ -11,6 +11,7 @@
export enum Permission {
Admin = 4,
Editor = 2,
Member = 0,
Viewer = 1,
}

View File

@ -12,6 +12,8 @@ package team
// Defines values for Permission.
const (
PermissionN0 Permission = 0
PermissionN1 Permission = 1
PermissionN2 Permission = 2

View File

@ -11,6 +11,7 @@ import TestProvider from '../../../test/helpers/TestProvider';
import { backendSrv } from '../../core/services/backend_srv';
import { configureStore } from '../../store/configureStore';
import { TeamPermissionLevel } from '../../types';
import { getMockTeam } from '../teams/__mocks__/teamMocks';
import { Props, UserProfileEditPage } from './UserProfileEditPage';
import { initialUserState } from './state/reducers';
@ -27,14 +28,13 @@ const defaultProps: Props = {
orgId: 0,
},
teams: [
{
id: 0,
getMockTeam(0, {
name: 'Team One',
email: 'team.one@test.com',
avatarUrl: '/avatar/07d881f402480a2a511a9a15b5fa82c0',
memberCount: 2000,
permission: TeamPermissionLevel.Admin,
},
}),
],
orgs: [
{

View File

@ -1,5 +1,6 @@
import { reducerTester } from '../../../../test/core/redux/reducerTester';
import { OrgRole, TeamPermissionLevel } from '../../../types';
import { getMockTeam } from '../../teams/__mocks__/teamMocks';
import {
initialUserState,
@ -89,31 +90,13 @@ describe('userReducer', () => {
.givenReducer(userReducer, { ...initialUserState, teamsAreLoading: true })
.whenActionIsDispatched(
teamsLoaded({
teams: [
{
id: 1,
email: 'team@team.com',
name: 'Team',
avatarUrl: '/avatar/12345',
memberCount: 4,
permission: TeamPermissionLevel.Admin,
},
],
teams: [getMockTeam(1, { permission: TeamPermissionLevel.Admin })],
})
)
.thenStateShouldEqual({
...initialUserState,
teamsAreLoading: false,
teams: [
{
id: 1,
email: 'team@team.com',
name: 'Team',
avatarUrl: '/avatar/12345',
memberCount: 4,
permission: TeamPermissionLevel.Admin,
},
],
teams: [getMockTeam(1, { permission: TeamPermissionLevel.Admin })],
});
});
});

View File

@ -8,12 +8,7 @@ import { TeamRolePicker } from 'app/core/components/RolePicker/TeamRolePicker';
import { updateTeamRoles } from 'app/core/components/RolePicker/api';
import { useRoleOptions } from 'app/core/components/RolePicker/hooks';
import { contextSrv } from 'app/core/core';
import { AccessControlAction, Role } from 'app/types';
interface TeamDTO {
email: string;
name: string;
}
import { AccessControlAction, Role, TeamDTO } from 'app/types';
const pageNav: NavModelItem = {
icon: 'users-alt',

View File

@ -35,11 +35,11 @@ export const TeamListRow = ({ team, roleOptions, isTeamAdmin, displayRolePicker,
</td>
<td className="link-td">
{canReadTeam ? (
<a href={teamUrl} aria-label={team.email?.length > 0 ? undefined : 'Empty email cell'}>
<a href={teamUrl} aria-label={team.email || 'Empty email cell'}>
{team.email}
</a>
) : (
<div style={{ padding: '0px 8px' }} aria-label={team.email?.length > 0 ? undefined : 'Empty email cell'}>
<div style={{ padding: '0px 8px' }} aria-label={team.email || 'Empty email cell'}>
{team.email}
</div>
)}

View File

@ -41,7 +41,7 @@ export const TeamSettings: FC<Props> = ({ team, updateTeam }) => {
if (contextSrv.licensedAccessControlEnabled() && canUpdateRoles) {
await updateTeamRoles(pendingRoles, team.id);
}
updateTeam(formTeam.name, formTeam.email);
updateTeam(formTeam.name, formTeam.email || '');
}}
disabled={!canWriteTeamSettings}
>

View File

@ -3,27 +3,25 @@ import { Team, TeamGroup, TeamMember, TeamPermissionLevel } from 'app/types';
export const getMultipleMockTeams = (numberOfTeams: number): Team[] => {
const teams: Team[] = [];
for (let i = 1; i <= numberOfTeams; i++) {
teams.push({
id: i,
name: `test-${i}`,
avatarUrl: 'some/url/',
email: `test-${i}@test.com`,
memberCount: i,
permission: TeamPermissionLevel.Member,
});
teams.push(getMockTeam(i));
}
return teams;
};
export const getMockTeam = (): Team => {
export const getMockTeam = (i = 1, overrides = {}): Team => {
return {
id: 1,
name: 'test',
id: i,
name: `test-${i}`,
avatarUrl: 'some/url/',
email: 'test@test.com',
memberCount: 1,
email: `test-${i}@test.com`,
memberCount: i,
permission: TeamPermissionLevel.Member,
accessControl: { isEditor: false },
created: 0,
orgId: 0,
updated: 0,
...overrides,
};
};

View File

@ -13,6 +13,10 @@ const loadingTeam = {
email: 'loading',
memberCount: 0,
permission: TeamPermissionLevel.Member,
accessControl: { isEditor: false },
created: 0,
orgId: 0,
updated: 0,
};
export function buildNavModel(team: Team): NavModelItem {

View File

@ -1,3 +1,8 @@
import { Permission } from '@grafana/schema';
// Alias to an existing type to reduce the number of changes
export { Permission as TeamPermissionLevel };
export enum OrgRole {
Viewer = 'Viewer',
Editor = 'Editor',
@ -111,21 +116,16 @@ export const dashboardPermissionLevels: DashboardPermissionInfo[] = [
},
];
export enum TeamPermissionLevel {
Member = 0,
Admin = 4,
}
export interface TeamPermissionInfo {
value: TeamPermissionLevel;
value: Permission;
label: string;
description: string;
}
export const teamsPermissionLevels: TeamPermissionInfo[] = [
{ value: TeamPermissionLevel.Member, label: 'Member', description: 'Is team member' },
{ value: Permission.Member, label: 'Member', description: 'Is team member' },
{
value: TeamPermissionLevel.Admin,
value: Permission.Admin,
label: 'Admin',
description: 'Can add/remove permissions, members and delete team.',
},

View File

@ -1,16 +1,12 @@
import { WithAccessControlMetadata } from '@grafana/data';
import { Team as TeamBase } from '@grafana/schema';
import { TeamPermissionLevel } from './acl';
export interface Team extends WithAccessControlMetadata {
id: number;
name: string;
avatarUrl: string;
email: string;
memberCount: number;
permission: TeamPermissionLevel;
export interface Team extends TeamBase {
id: number; // TODO switch to UUID
}
// Represents the data sent via an API to create a team
export interface TeamDTO extends Pick<TeamBase, 'name' | 'email'> {}
export interface TeamMember {
userId: number;
teamId: number;