From 178d637b4e5fa21fb89ed102de6e6a6c022fe065 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=A4ggmark?= Date: Thu, 14 Mar 2019 07:53:31 +0100 Subject: [PATCH] refactor: splitted TeamMembers to TeamMemberRow --- .../app/features/teams/TeamMemberRow.test.tsx | 82 + public/app/features/teams/TeamMemberRow.tsx | 106 + .../app/features/teams/TeamMembers.test.tsx | 206 +- public/app/features/teams/TeamMembers.tsx | 95 +- .../__snapshots__/TeamMemberRow.test.tsx.snap | 191 ++ .../__snapshots__/TeamMembers.test.tsx.snap | 2430 ++--------------- 6 files changed, 677 insertions(+), 2433 deletions(-) create mode 100644 public/app/features/teams/TeamMemberRow.test.tsx create mode 100644 public/app/features/teams/TeamMemberRow.tsx create mode 100644 public/app/features/teams/__snapshots__/TeamMemberRow.test.tsx.snap diff --git a/public/app/features/teams/TeamMemberRow.test.tsx b/public/app/features/teams/TeamMemberRow.test.tsx new file mode 100644 index 00000000000..87f771cc833 --- /dev/null +++ b/public/app/features/teams/TeamMemberRow.test.tsx @@ -0,0 +1,82 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import { TeamMember, TeamPermissionLevel } from '../../types'; +import { getMockTeamMember } from './__mocks__/teamMocks'; +import { TeamMemberRow, Props } from './TeamMemberRow'; +import { SelectOptionItem } from '@grafana/ui'; + +const setup = (propOverrides?: object) => { + const props: Props = { + member: getMockTeamMember(), + syncEnabled: false, + editorsCanAdmin: false, + signedInUserIsTeamAdmin: false, + updateTeamMember: jest.fn(), + removeTeamMember: jest.fn(), + }; + + Object.assign(props, propOverrides); + + const wrapper = shallow(); + const instance = wrapper.instance() as TeamMemberRow; + + return { + wrapper, + instance, + }; +}; + +describe('Render', () => { + describe('when feature toggle editorsCanAdmin is turned on', () => { + it('should render permissions select if user is team admin', () => { + const { wrapper } = setup({ editorsCanAdmin: true, signedInUserIsTeamAdmin: true }); + + expect(wrapper).toMatchSnapshot(); + }); + + it('should render span and disable buttons if user is team member', () => { + const { wrapper } = setup({ editorsCanAdmin: true, signedInUserIsTeamAdmin: false }); + + expect(wrapper).toMatchSnapshot(); + }); + }); + + describe('when feature toggle editorsCanAdmin is turned off', () => { + it('should not render permissions', () => { + const { wrapper } = setup({ editorsCanAdmin: false, signedInUserIsTeamAdmin: true }); + + expect(wrapper).toMatchSnapshot(); + }); + }); +}); + +describe('Functions', () => { + describe('on remove member', () => { + const member = getMockTeamMember(); + const { instance } = setup({ member }); + + instance.onRemoveMember(member); + + expect(instance.props.removeTeamMember).toHaveBeenCalledWith(1); + }); + + describe('on update permision for user in team', () => { + const member: TeamMember = { + userId: 3, + teamId: 2, + avatarUrl: '', + email: 'user@user.org', + labels: [], + login: 'member', + permission: TeamPermissionLevel.Member, + }; + const { instance } = setup({ member }); + const permission = TeamPermissionLevel.Admin; + const item: SelectOptionItem = { value: permission }; + const expectedTeamMemeber = { ...member, permission }; + + instance.onPermissionChange(item, member); + + expect(instance.props.updateTeamMember).toHaveBeenCalledWith(expectedTeamMemeber); + }); +}); diff --git a/public/app/features/teams/TeamMemberRow.tsx b/public/app/features/teams/TeamMemberRow.tsx new file mode 100644 index 00000000000..e0bd26f4fd7 --- /dev/null +++ b/public/app/features/teams/TeamMemberRow.tsx @@ -0,0 +1,106 @@ +import React, { PureComponent } from 'react'; +import { connect } from 'react-redux'; +import { DeleteButton, Select, SelectOptionItem } from '@grafana/ui'; + +import { TeamMember, teamsPermissionLevels } from 'app/types'; +import { WithFeatureToggle } from 'app/core/components/WithFeatureToggle'; +import { updateTeamMember, removeTeamMember } from './state/actions'; +import { TagBadge } from 'app/core/components/TagFilter/TagBadge'; + +export interface Props { + member: TeamMember; + syncEnabled: boolean; + editorsCanAdmin: boolean; + signedInUserIsTeamAdmin: boolean; + removeTeamMember?: typeof removeTeamMember; + updateTeamMember?: typeof updateTeamMember; +} + +export class TeamMemberRow extends PureComponent { + constructor(props: Props) { + super(props); + this.renderLabels = this.renderLabels.bind(this); + this.renderPermissions = this.renderPermissions.bind(this); + } + + onRemoveMember(member: TeamMember) { + this.props.removeTeamMember(member.userId); + } + + onPermissionChange = (item: SelectOptionItem, member: TeamMember) => { + const permission = item.value; + const updatedTeamMember = { ...member, permission }; + + this.props.updateTeamMember(updatedTeamMember); + }; + + renderPermissions(member: TeamMember) { + const { editorsCanAdmin, signedInUserIsTeamAdmin } = this.props; + const value = teamsPermissionLevels.find(dp => dp.value === member.permission); + + return ( + + +
+ {signedInUserIsTeamAdmin && ( + this.onPermissionChange(item, member)} - className="gf-form-select-box__control--menu-right" - value={value} - /> - )} - {!isUserTeamAdmin && {value.label}} -
- -
- ); - } - - renderMember(member: TeamMember, syncEnabled: boolean) { - return ( - - - - - {member.login} - {member.email} - {this.renderPermissions(member)} - {syncEnabled && this.renderLabels(member.labels)} - - this.onRemoveMember(member)} disabled={!this.isSignedInUserTeamAdmin()} /> - - - ); - } - render() { const { isAdding } = this.state; const { searchMemberQuery, members, syncEnabled, editorsCanAdmin } = this.props; @@ -198,7 +137,18 @@ export class TeamMembers extends PureComponent { - {members && members.map(member => this.renderMember(member, syncEnabled))} + + {members && + members.map(member => ( + + ))} + @@ -211,15 +161,14 @@ function mapStateToProps(state) { members: getTeamMembers(state.team), searchMemberQuery: getSearchMemberQuery(state.team), editorsCanAdmin: config.editorsCanAdmin, // this makes the feature toggle mockable/controllable from tests, + signedInUser: contextSrv.user, // this makes the feature toggle mockable/controllable from tests, }; } const mapDispatchToProps = { loadTeamMembers, addTeamMember, - removeTeamMember, setSearchMemberQuery, - updateTeamMember, }; export default connect( diff --git a/public/app/features/teams/__snapshots__/TeamMemberRow.test.tsx.snap b/public/app/features/teams/__snapshots__/TeamMemberRow.test.tsx.snap new file mode 100644 index 00000000000..3e7630d0618 --- /dev/null +++ b/public/app/features/teams/__snapshots__/TeamMemberRow.test.tsx.snap @@ -0,0 +1,191 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Render when feature toggle editorsCanAdmin is turned off should not render permissions 1`] = ` + + + + + + testUser + + + test@test.com + + + +
+ +
+ +
+ + + + +`; + +exports[`Render when feature toggle editorsCanAdmin is turned on should render span and disable buttons if user is team member 1`] = ` + + + + + + testUser + + + test@test.com + + + +
+ + Member + +
+ +
+ + + + +`; diff --git a/public/app/features/teams/__snapshots__/TeamMembers.test.tsx.snap b/public/app/features/teams/__snapshots__/TeamMembers.test.tsx.snap index da89d26d191..4d35a4a772b 100644 --- a/public/app/features/teams/__snapshots__/TeamMembers.test.tsx.snap +++ b/public/app/features/teams/__snapshots__/TeamMembers.test.tsx.snap @@ -177,361 +177,106 @@ exports[`Render should render team members 1`] = ` - - - - - - testUser-1 - - - test@test.com - - - -
- -
- -
- - - - - + - - - - - testUser-3 - - - test@test.com - - - -
- -
- -
- - - - - + - - - - - testUser-5 - - - test@test.com - - - -
- -
- -
- - - - - - - - - - - - - - testUser-2 - - - test@test.com - - - -
- -
- -
- - - - - - - - - - - - - - testUser-4 - - - test@test.com - - - -
- -
- -
- - - - - - - - - - - - -`; - -exports[`Render when feature toggle editorsCanAdmin is turned on should render permissions select if user is Grafana Admin 1`] = ` -
-
-
- -
-
- -
- -
- -
- Add team member -
-
- -
-
-
-
- - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Name - - Email - - Permission - -
- - - testUser-1 - - test@test.com - -
-
- -
- - - testUser-2 - - test@test.com - -
-
- -
- - - testUser-3 - - test@test.com - -
-
- -
- - - testUser-4 - - test@test.com - -
-
- -
- - - testUser-5 - - test@test.com - -
-
- -
-
-
-`; - -exports[`Render when feature toggle editorsCanAdmin is turned on should render permissions select if user is Org Admin 1`] = ` -
-
-
- -
-
- -
- -
- -
- Add team member -
-
- -
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Name - - Email - - Permission - -
- - - testUser-1 - - test@test.com - -
-
- -
- - - testUser-2 - - test@test.com - -
-
- -
- - - testUser-3 - - test@test.com - -
-
- -
- - - testUser-4 - - test@test.com - -
-
- -
- - - testUser-5 - - test@test.com - -
-
- -
-
-
-`; - -exports[`Render when feature toggle editorsCanAdmin is turned on should render permissions select if user is team admin 1`] = ` -
-
-
- -
-
- -
- -
- -
- Add team member -
-
- -
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - -
- - Name - - Email - - Permission - -
- - - testUser-1 - - test@test.com - -
- - Admin - -
-
- -
- - - testUser-2 - - test@test.com - -
- - Member - -
-
- -
- - - testUser-3 - - test@test.com - -
- - Member - -
-
- -
- - - testUser-4 - - test@test.com - -
- - Member - -
-
- -
- - - testUser-5 - - test@test.com - -
- - Member - -
-
- -
-
-
-`; - -exports[`Render when feature toggle editorsCanAdmin is turned on should render span and disable buttons if user is team member 1`] = ` -
-
-
- -
-
- -
- -
- -
- Add team member -
-
- -
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - + member={ + Object { + "avatarUrl": "some/url/", + "email": "test@test.com", + "labels": Array [ + "label 1", + "label 2", + ], + "login": "testUser-5", + "permission": 4, + "teamId": 1, + "userId": 5, + } + } + signedInUserIsTeamAdmin={true} + syncEnabled={true} + />
- - Name - - Email - - Permission - -
- - - testUser-1 - - test@test.com - -
- - Member - -
-
- -
- - - testUser-2 - - test@test.com - -
- - Member - -
-
- -
- - - testUser-3 - - test@test.com - -
- - Member - -
-
- -
- - - testUser-4 - - test@test.com - -
- - Member - -
-
- -
- - - testUser-5 - - test@test.com - -
- - Admin - -
-
- -