diff --git a/public/app/features/teams/TeamMembers.test.tsx b/public/app/features/teams/TeamMembers.test.tsx index 9922619adc2..f30e0c56325 100644 --- a/public/app/features/teams/TeamMembers.test.tsx +++ b/public/app/features/teams/TeamMembers.test.tsx @@ -1,8 +1,9 @@ import React from 'react'; import { shallow } from 'enzyme'; import { TeamMembers, Props, State } from './TeamMembers'; -import { TeamMember } from '../../types'; +import { TeamMember, TeamPermissionLevel } from '../../types'; import { getMockTeamMember, getMockTeamMembers } from './__mocks__/teamMocks'; +import { SelectOptionItem } from '@grafana/ui'; const setup = (propOverrides?: object) => { const props: Props = { @@ -12,6 +13,7 @@ const setup = (propOverrides?: object) => { loadTeamMembers: jest.fn(), addTeamMember: jest.fn(), removeTeamMember: jest.fn(), + updateTeamMember: jest.fn(), syncEnabled: false, }; @@ -86,4 +88,24 @@ describe('Functions', () => { expect(instance.props.addTeamMember).toHaveBeenCalledWith(1); }); + + describe('on update permision for user in team', () => { + const { instance } = setup(); + const permission = TeamPermissionLevel.Admin; + const item: SelectOptionItem = { value: permission }; + const member: TeamMember = { + userId: 3, + teamId: 2, + avatarUrl: '', + email: 'user@user.org', + labels: [], + login: 'member', + permission: TeamPermissionLevel.Member, + }; + const expectedTeamMemeber = { ...member, permission }; + + instance.onPermissionChange(item, member); + + expect(instance.props.updateTeamMember).toHaveBeenCalledWith(expectedTeamMemeber); + }); }); diff --git a/public/app/features/teams/TeamMembers.tsx b/public/app/features/teams/TeamMembers.tsx index 3054524023d..29f1e2e4947 100644 --- a/public/app/features/teams/TeamMembers.tsx +++ b/public/app/features/teams/TeamMembers.tsx @@ -2,10 +2,16 @@ import React, { PureComponent } from 'react'; import { connect } from 'react-redux'; import SlideDown from 'app/core/components/Animations/SlideDown'; import { UserPicker } from 'app/core/components/Select/UserPicker'; -import { DeleteButton, Select } from '@grafana/ui'; +import { DeleteButton, Select, SelectOptionItem } from '@grafana/ui'; import { TagBadge } from 'app/core/components/TagFilter/TagBadge'; import { TeamMember, User, teamsPermissionLevels } from 'app/types'; -import { loadTeamMembers, addTeamMember, removeTeamMember, setSearchMemberQuery } from './state/actions'; +import { + loadTeamMembers, + addTeamMember, + removeTeamMember, + setSearchMemberQuery, + updateTeamMember, +} from './state/actions'; import { getSearchMemberQuery, getTeamMembers } from './state/selectors'; import { FilterInput } from 'app/core/components/FilterInput/FilterInput'; import { WithFeatureToggle } from 'app/core/components/WithFeatureToggle'; @@ -18,6 +24,7 @@ export interface Props { addTeamMember: typeof addTeamMember; removeTeamMember: typeof removeTeamMember; setSearchMemberQuery: typeof setSearchMemberQuery; + updateTeamMember: typeof updateTeamMember; syncEnabled: boolean; } @@ -71,8 +78,14 @@ export class TeamMembers extends PureComponent { ); } + onPermissionChange = (item: SelectOptionItem, member: TeamMember) => { + const permission = item.value; + const updatedTeamMember = { ...member, permission }; + + this.props.updateTeamMember(updatedTeamMember); + }; + renderMember(member: TeamMember, syncEnabled: boolean) { - const currentPermissionLevel = teamsPermissionLevels.find(dp => dp.value === member.permission); return ( @@ -86,10 +99,9 @@ export class TeamMembers extends PureComponent {