Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
6cb2a797bf
commit
678c40e542
|
|
@ -14,11 +14,6 @@ export default {
|
|||
type: Number,
|
||||
required: true,
|
||||
},
|
||||
memberType: {
|
||||
type: String,
|
||||
required: false,
|
||||
default: null,
|
||||
},
|
||||
message: {
|
||||
type: String,
|
||||
required: true,
|
||||
|
|
@ -54,7 +49,6 @@ export default {
|
|||
isAccessRequest: this.isAccessRequest,
|
||||
isInvite: this.isInvite,
|
||||
memberPath: this.memberPath.replace(':id', this.memberId),
|
||||
memberType: this.memberType,
|
||||
message: this.message,
|
||||
userDeletionObstacles: this.userDeletionObstacles,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -11,7 +11,12 @@ export default {
|
|||
type: Number,
|
||||
required: true,
|
||||
},
|
||||
memberType: {
|
||||
/**
|
||||
* `GroupMember` (`app/models/members/group_member.rb`)
|
||||
* or
|
||||
* `ProjectMember` (`app/models/members/project_member.rb`).
|
||||
*/
|
||||
memberModelType: {
|
||||
type: String,
|
||||
required: false,
|
||||
default: null,
|
||||
|
|
@ -47,7 +52,7 @@ export default {
|
|||
isAccessRequest: this.isAccessRequest,
|
||||
isInvite: this.isInvite,
|
||||
memberPath: this.memberPath.replace(':id', this.memberId),
|
||||
memberType: this.memberType,
|
||||
memberModelType: this.memberModelType,
|
||||
message: this.modalMessage,
|
||||
userDeletionObstacles: this.userDeletionObstacles,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@ export default {
|
|||
<remove-member-dropdown-item
|
||||
v-else
|
||||
:member-id="member.id"
|
||||
:member-type="member.type"
|
||||
:member-model-type="member.type"
|
||||
:user-deletion-obstacles="userDeletionObstaclesUserData"
|
||||
:modal-message="modalMessage"
|
||||
>{{ $options.i18n.removeMember }}</remove-member-dropdown-item
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import { mapActions, mapState } from 'vuex';
|
|||
import csrf from '~/lib/utils/csrf';
|
||||
import { s__, __ } from '~/locale';
|
||||
import UserDeletionObstaclesList from '~/vue_shared/components/user_deletion_obstacles/user_deletion_obstacles_list.vue';
|
||||
import { MEMBER_MODEL_TYPE_GROUP_MEMBER } from '../../constants';
|
||||
|
||||
export default {
|
||||
actionCancel: {
|
||||
|
|
@ -27,8 +28,13 @@ export default {
|
|||
memberPath(state) {
|
||||
return state[this.namespace].removeMemberModalData.memberPath;
|
||||
},
|
||||
memberType(state) {
|
||||
return state[this.namespace].removeMemberModalData.memberType;
|
||||
/**
|
||||
* `GroupMember` (`app/models/members/group_member.rb`)
|
||||
* or
|
||||
* `ProjectMember` (`app/models/members/project_member.rb`).
|
||||
*/
|
||||
memberModelType(state) {
|
||||
return state[this.namespace].removeMemberModalData.memberModelType;
|
||||
},
|
||||
message(state) {
|
||||
return state[this.namespace].removeMemberModalData.message;
|
||||
|
|
@ -41,7 +47,7 @@ export default {
|
|||
},
|
||||
}),
|
||||
isGroupMember() {
|
||||
return this.memberType === 'GroupMember';
|
||||
return this.memberModelType === MEMBER_MODEL_TYPE_GROUP_MEMBER;
|
||||
},
|
||||
actionText() {
|
||||
if (this.isAccessRequest) {
|
||||
|
|
|
|||
|
|
@ -163,6 +163,12 @@ export const MEMBER_TYPES = {
|
|||
accessRequest: 'accessRequest',
|
||||
};
|
||||
|
||||
// `app/models/members/group_member.rb`
|
||||
export const MEMBER_MODEL_TYPE_GROUP_MEMBER = 'GroupMember';
|
||||
|
||||
// `app/models/members/project_member.rb`
|
||||
export const MEMBER_MODEL_TYPE_PROJECT_MEMBER = 'ProjectMember';
|
||||
|
||||
export const TAB_QUERY_PARAM_VALUES = {
|
||||
group: 'groups',
|
||||
invite: 'invited',
|
||||
|
|
|
|||
|
|
@ -39,7 +39,6 @@ describe('InviteActionButtons', () => {
|
|||
it('sets props correctly', () => {
|
||||
expect(findRemoveMemberButton().props()).toMatchObject({
|
||||
memberId: member.id,
|
||||
memberType: null,
|
||||
message: `Are you sure you want to revoke the invitation for ${member.invite.email} to join "${member.source.fullName}"`,
|
||||
title: 'Revoke invite',
|
||||
isAccessRequest: false,
|
||||
|
|
|
|||
|
|
@ -39,7 +39,6 @@ describe('RemoveMemberButton', () => {
|
|||
},
|
||||
propsData: {
|
||||
memberId: 1,
|
||||
memberType: 'GroupMember',
|
||||
message: 'Are you sure you want to remove John Smith?',
|
||||
title: 'Remove member',
|
||||
isAccessRequest: true,
|
||||
|
|
@ -77,6 +76,9 @@ describe('RemoveMemberButton', () => {
|
|||
it('calls Vuex action to show `remove member` modal when clicked', () => {
|
||||
findButton().vm.$emit('click');
|
||||
|
||||
expect(actions.showRemoveMemberModal).toHaveBeenCalledWith(expect.any(Object), modalData);
|
||||
expect(actions.showRemoveMemberModal).toHaveBeenCalledWith(expect.any(Object), {
|
||||
...modalData,
|
||||
memberModelType: undefined,
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import Vue from 'vue';
|
|||
import Vuex from 'vuex';
|
||||
import { modalData } from 'jest/members/mock_data';
|
||||
import RemoveMemberDropdownItem from '~/members/components/action_dropdowns/remove_member_dropdown_item.vue';
|
||||
import { MEMBER_TYPES } from '~/members/constants';
|
||||
import { MEMBER_TYPES, MEMBER_MODEL_TYPE_GROUP_MEMBER } from '~/members/constants';
|
||||
|
||||
Vue.use(Vuex);
|
||||
|
||||
|
|
@ -39,7 +39,7 @@ describe('RemoveMemberDropdownItem', () => {
|
|||
},
|
||||
propsData: {
|
||||
memberId: 1,
|
||||
memberType: 'GroupMember',
|
||||
memberModelType: MEMBER_MODEL_TYPE_GROUP_MEMBER,
|
||||
modalMessage: 'Are you sure you want to remove John Smith?',
|
||||
isAccessRequest: true,
|
||||
isInvite: true,
|
||||
|
|
|
|||
|
|
@ -5,6 +5,10 @@ import LeaveGroupDropdownItem from '~/members/components/action_dropdowns/leave_
|
|||
import RemoveMemberDropdownItem from '~/members/components/action_dropdowns/remove_member_dropdown_item.vue';
|
||||
import UserActionDropdown from '~/members/components/action_dropdowns/user_action_dropdown.vue';
|
||||
import { I18N } from '~/members/components/action_dropdowns/constants';
|
||||
import {
|
||||
MEMBER_MODEL_TYPE_GROUP_MEMBER,
|
||||
MEMBER_MODEL_TYPE_PROJECT_MEMBER,
|
||||
} from '~/members/constants';
|
||||
import { parseUserDeletionObstacles } from '~/vue_shared/components/user_deletion_obstacles/utils';
|
||||
import { member, orphanedMember } from '../../mock_data';
|
||||
|
||||
|
|
@ -55,7 +59,7 @@ describe('UserActionDropdown', () => {
|
|||
it('sets props correctly', () => {
|
||||
expect(findRemoveMemberDropdownItem().props()).toEqual({
|
||||
memberId: member.id,
|
||||
memberType: 'GroupMember',
|
||||
memberModelType: MEMBER_MODEL_TYPE_GROUP_MEMBER,
|
||||
modalMessage: sprintf(
|
||||
I18N.confirmNormalUserRemoval,
|
||||
{
|
||||
|
|
@ -121,7 +125,7 @@ describe('UserActionDropdown', () => {
|
|||
createComponent({
|
||||
member: {
|
||||
...member,
|
||||
type: 'GroupMember',
|
||||
type: MEMBER_MODEL_TYPE_GROUP_MEMBER,
|
||||
},
|
||||
permissions: {
|
||||
canRemove: true,
|
||||
|
|
@ -130,7 +134,9 @@ describe('UserActionDropdown', () => {
|
|||
});
|
||||
|
||||
it('sets member type correctly', () => {
|
||||
expect(findRemoveMemberDropdownItem().props().memberType).toBe('GroupMember');
|
||||
expect(findRemoveMemberDropdownItem().props().memberModelType).toBe(
|
||||
MEMBER_MODEL_TYPE_GROUP_MEMBER,
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
|
|
@ -139,7 +145,7 @@ describe('UserActionDropdown', () => {
|
|||
createComponent({
|
||||
member: {
|
||||
...member,
|
||||
type: 'ProjectMember',
|
||||
type: MEMBER_MODEL_TYPE_PROJECT_MEMBER,
|
||||
},
|
||||
permissions: {
|
||||
canRemove: true,
|
||||
|
|
@ -148,7 +154,9 @@ describe('UserActionDropdown', () => {
|
|||
});
|
||||
|
||||
it('sets member type correctly', () => {
|
||||
expect(findRemoveMemberDropdownItem().props().memberType).toBe('ProjectMember');
|
||||
expect(findRemoveMemberDropdownItem().props().memberModelType).toBe(
|
||||
MEMBER_MODEL_TYPE_PROJECT_MEMBER,
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -3,7 +3,11 @@ import { shallowMount } from '@vue/test-utils';
|
|||
import Vue from 'vue';
|
||||
import Vuex from 'vuex';
|
||||
import RemoveMemberModal from '~/members/components/modals/remove_member_modal.vue';
|
||||
import { MEMBER_TYPES } from '~/members/constants';
|
||||
import {
|
||||
MEMBER_TYPES,
|
||||
MEMBER_MODEL_TYPE_GROUP_MEMBER,
|
||||
MEMBER_MODEL_TYPE_PROJECT_MEMBER,
|
||||
} from '~/members/constants';
|
||||
import { OBSTACLE_TYPES } from '~/vue_shared/components/user_deletion_obstacles/constants';
|
||||
import UserDeletionObstaclesList from '~/vue_shared/components/user_deletion_obstacles/user_deletion_obstacles_list.vue';
|
||||
|
||||
|
|
@ -55,16 +59,16 @@ describe('RemoveMemberModal', () => {
|
|||
});
|
||||
|
||||
describe.each`
|
||||
state | memberType | isAccessRequest | isInvite | actionText | removeSubMembershipsCheckboxExpected | unassignIssuablesCheckboxExpected | message | userDeletionObstacles | isPartOfOncall
|
||||
${'removing a group member'} | ${'GroupMember'} | ${false} | ${false} | ${'Remove member'} | ${true} | ${true} | ${'Are you sure you want to remove Jane Doe from the Gitlab Org / Gitlab Test project?'} | ${{}} | ${false}
|
||||
${'removing a project member'} | ${'ProjectMember'} | ${false} | ${false} | ${'Remove member'} | ${false} | ${true} | ${'Are you sure you want to remove Jane Doe from the Gitlab Org / Gitlab Test project?'} | ${mockObstacles} | ${true}
|
||||
${'denying an access request'} | ${'ProjectMember'} | ${true} | ${false} | ${'Deny access request'} | ${false} | ${false} | ${"Are you sure you want to deny Jane Doe's request to join the Gitlab Org / Gitlab Test project?"} | ${{}} | ${false}
|
||||
${'revoking invite'} | ${'ProjectMember'} | ${false} | ${true} | ${'Revoke invite'} | ${false} | ${false} | ${'Are you sure you want to revoke the invitation for foo@bar.com to join the Gitlab Org / Gitlab Test project?'} | ${mockObstacles} | ${false}
|
||||
state | memberModelType | isAccessRequest | isInvite | actionText | removeSubMembershipsCheckboxExpected | unassignIssuablesCheckboxExpected | message | userDeletionObstacles | isPartOfOncall
|
||||
${'removing a group member'} | ${MEMBER_MODEL_TYPE_GROUP_MEMBER} | ${false} | ${false} | ${'Remove member'} | ${true} | ${true} | ${'Are you sure you want to remove Jane Doe from the Gitlab Org / Gitlab Test project?'} | ${{}} | ${false}
|
||||
${'removing a project member'} | ${MEMBER_MODEL_TYPE_PROJECT_MEMBER} | ${false} | ${false} | ${'Remove member'} | ${false} | ${true} | ${'Are you sure you want to remove Jane Doe from the Gitlab Org / Gitlab Test project?'} | ${mockObstacles} | ${true}
|
||||
${'denying an access request'} | ${MEMBER_MODEL_TYPE_PROJECT_MEMBER} | ${true} | ${false} | ${'Deny access request'} | ${false} | ${false} | ${"Are you sure you want to deny Jane Doe's request to join the Gitlab Org / Gitlab Test project?"} | ${{}} | ${false}
|
||||
${'revoking invite'} | ${MEMBER_MODEL_TYPE_PROJECT_MEMBER} | ${false} | ${true} | ${'Revoke invite'} | ${false} | ${false} | ${'Are you sure you want to revoke the invitation for foo@bar.com to join the Gitlab Org / Gitlab Test project?'} | ${mockObstacles} | ${false}
|
||||
`(
|
||||
'when $state',
|
||||
({
|
||||
actionText,
|
||||
memberType,
|
||||
memberModelType,
|
||||
isAccessRequest,
|
||||
isInvite,
|
||||
message,
|
||||
|
|
@ -79,7 +83,7 @@ describe('RemoveMemberModal', () => {
|
|||
isInvite,
|
||||
message,
|
||||
memberPath,
|
||||
memberType,
|
||||
memberModelType,
|
||||
userDeletionObstacles,
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,4 +1,8 @@
|
|||
import { MEMBER_TYPES, MEMBER_STATE_CREATED } from '~/members/constants';
|
||||
import {
|
||||
MEMBER_TYPES,
|
||||
MEMBER_STATE_CREATED,
|
||||
MEMBER_MODEL_TYPE_GROUP_MEMBER,
|
||||
} from '~/members/constants';
|
||||
|
||||
export const member = {
|
||||
requestedAt: null,
|
||||
|
|
@ -69,7 +73,7 @@ export const modalData = {
|
|||
isAccessRequest: true,
|
||||
isInvite: true,
|
||||
memberPath: '/groups/foo-bar/-/group_members/1',
|
||||
memberType: 'GroupMember',
|
||||
memberModelType: MEMBER_MODEL_TYPE_GROUP_MEMBER,
|
||||
message: 'Are you sure you want to remove John Smith?',
|
||||
userDeletionObstacles: { name: 'user', obstacles: [] },
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in New Issue