Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2023-01-05 06:10:00 +00:00
parent 6cb2a797bf
commit 678c40e542
11 changed files with 60 additions and 32 deletions

View File

@ -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,
};

View File

@ -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,
};

View File

@ -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

View File

@ -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) {

View File

@ -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',

View File

@ -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,

View File

@ -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,
});
});
});

View File

@ -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,

View File

@ -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,
);
});
});
});

View File

@ -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,
});
});

View File

@ -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: [] },
};