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 indicates when the team was updated.
updated: int64 @grafanamaturity(ToMetadata="sys") 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. * With RBAC, the backend will return additional access control metadata to objects.
* These metadata will contain user permissions associated to a given resource. * These metadata will contain user permissions associated to a given resource.
@ -10,5 +8,5 @@ import { KeyValue } from '.';
* } * }
*/ */
export interface WithAccessControlMetadata { export interface WithAccessControlMetadata {
accessControl?: KeyValue<boolean>; accessControl?: Record<string, boolean>;
} }

View File

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

View File

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

View File

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

View File

@ -1,5 +1,6 @@
import { reducerTester } from '../../../../test/core/redux/reducerTester'; import { reducerTester } from '../../../../test/core/redux/reducerTester';
import { OrgRole, TeamPermissionLevel } from '../../../types'; import { OrgRole, TeamPermissionLevel } from '../../../types';
import { getMockTeam } from '../../teams/__mocks__/teamMocks';
import { import {
initialUserState, initialUserState,
@ -89,31 +90,13 @@ describe('userReducer', () => {
.givenReducer(userReducer, { ...initialUserState, teamsAreLoading: true }) .givenReducer(userReducer, { ...initialUserState, teamsAreLoading: true })
.whenActionIsDispatched( .whenActionIsDispatched(
teamsLoaded({ teamsLoaded({
teams: [ teams: [getMockTeam(1, { permission: TeamPermissionLevel.Admin })],
{
id: 1,
email: 'team@team.com',
name: 'Team',
avatarUrl: '/avatar/12345',
memberCount: 4,
permission: TeamPermissionLevel.Admin,
},
],
}) })
) )
.thenStateShouldEqual({ .thenStateShouldEqual({
...initialUserState, ...initialUserState,
teamsAreLoading: false, teamsAreLoading: false,
teams: [ teams: [getMockTeam(1, { permission: TeamPermissionLevel.Admin })],
{
id: 1,
email: 'team@team.com',
name: 'Team',
avatarUrl: '/avatar/12345',
memberCount: 4,
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 { updateTeamRoles } from 'app/core/components/RolePicker/api';
import { useRoleOptions } from 'app/core/components/RolePicker/hooks'; import { useRoleOptions } from 'app/core/components/RolePicker/hooks';
import { contextSrv } from 'app/core/core'; import { contextSrv } from 'app/core/core';
import { AccessControlAction, Role } from 'app/types'; import { AccessControlAction, Role, TeamDTO } from 'app/types';
interface TeamDTO {
email: string;
name: string;
}
const pageNav: NavModelItem = { const pageNav: NavModelItem = {
icon: 'users-alt', icon: 'users-alt',

View File

@ -35,11 +35,11 @@ export const TeamListRow = ({ team, roleOptions, isTeamAdmin, displayRolePicker,
</td> </td>
<td className="link-td"> <td className="link-td">
{canReadTeam ? ( {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} {team.email}
</a> </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} {team.email}
</div> </div>
)} )}

View File

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

View File

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

View File

@ -13,6 +13,10 @@ const loadingTeam = {
email: 'loading', email: 'loading',
memberCount: 0, memberCount: 0,
permission: TeamPermissionLevel.Member, permission: TeamPermissionLevel.Member,
accessControl: { isEditor: false },
created: 0,
orgId: 0,
updated: 0,
}; };
export function buildNavModel(team: Team): NavModelItem { 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 { export enum OrgRole {
Viewer = 'Viewer', Viewer = 'Viewer',
Editor = 'Editor', Editor = 'Editor',
@ -111,21 +116,16 @@ export const dashboardPermissionLevels: DashboardPermissionInfo[] = [
}, },
]; ];
export enum TeamPermissionLevel {
Member = 0,
Admin = 4,
}
export interface TeamPermissionInfo { export interface TeamPermissionInfo {
value: TeamPermissionLevel; value: Permission;
label: string; label: string;
description: string; description: string;
} }
export const teamsPermissionLevels: TeamPermissionInfo[] = [ 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', label: 'Admin',
description: 'Can add/remove permissions, members and delete team.', 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 TeamBase {
id: number; // TODO switch to UUID
export interface Team extends WithAccessControlMetadata {
id: number;
name: string;
avatarUrl: string;
email: string;
memberCount: number;
permission: TeamPermissionLevel;
} }
// Represents the data sent via an API to create a team
export interface TeamDTO extends Pick<TeamBase, 'name' | 'email'> {}
export interface TeamMember { export interface TeamMember {
userId: number; userId: number;
teamId: number; teamId: number;