mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
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:
parent
fc91baa2f8
commit
c68603a573
@ -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")
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -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>;
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
export enum Permission {
|
export enum Permission {
|
||||||
Admin = 4,
|
Admin = 4,
|
||||||
Editor = 2,
|
Editor = 2,
|
||||||
|
Member = 0,
|
||||||
Viewer = 1,
|
Viewer = 1,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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: [
|
||||||
{
|
{
|
||||||
|
@ -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,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -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',
|
||||||
|
@ -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>
|
||||||
)}
|
)}
|
||||||
|
@ -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}
|
||||||
>
|
>
|
||||||
|
@ -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));
|
||||||
id: i,
|
|
||||||
name: `test-${i}`,
|
|
||||||
avatarUrl: 'some/url/',
|
|
||||||
email: `test-${i}@test.com`,
|
|
||||||
memberCount: i,
|
|
||||||
permission: TeamPermissionLevel.Member,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return teams;
|
return teams;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getMockTeam = (): Team => {
|
export const getMockTeam = (i = 1, overrides = {}): Team => {
|
||||||
return {
|
return {
|
||||||
id: 1,
|
id: i,
|
||||||
name: 'test',
|
name: `test-${i}`,
|
||||||
avatarUrl: 'some/url/',
|
avatarUrl: 'some/url/',
|
||||||
email: 'test@test.com',
|
email: `test-${i}@test.com`,
|
||||||
memberCount: 1,
|
memberCount: i,
|
||||||
permission: TeamPermissionLevel.Member,
|
permission: TeamPermissionLevel.Member,
|
||||||
|
accessControl: { isEditor: false },
|
||||||
|
created: 0,
|
||||||
|
orgId: 0,
|
||||||
|
updated: 0,
|
||||||
|
...overrides,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
@ -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.',
|
||||||
},
|
},
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user