diff --git a/app/assets/javascripts/invite_members/components/invite_members_modal.vue b/app/assets/javascripts/invite_members/components/invite_members_modal.vue index 7163d1be7735dfd5d2a07da430e0ad9aa1be4ce0..91a139a510585378aa872c94a18fd67975c5fc4f 100644 --- a/app/assets/javascripts/invite_members/components/invite_members_modal.vue +++ b/app/assets/javascripts/invite_members/components/invite_members_modal.vue @@ -20,7 +20,6 @@ import { BV_SHOW_MODAL } from '~/lib/utils/constants'; import { getParameterValues } from '~/lib/utils/url_utility'; import { sprintf } from '~/locale'; import { - INVITE_MEMBERS_IN_COMMENT, GROUP_FILTERS, USERS_FILTER_ALL, INVITE_MEMBERS_FOR_TASK, @@ -254,11 +253,6 @@ export default { this.submitInviteMembers(); } }, - trackInvite() { - if (this.source === INVITE_MEMBERS_IN_COMMENT) { - this.trackEvent(INVITE_MEMBERS_IN_COMMENT, 'comment_invite_success'); - } - }, trackinviteMembersForTask() { const label = 'selected_tasks_to_be_done'; const property = this.selectedTasksToBeDone.join(','); @@ -312,7 +306,6 @@ export default { promises.push(apiAddByUserId(this.id, this.addByUserIdPostData(usersToAddById))); } - this.trackInvite(); this.trackinviteMembersForTask(); Promise.all(promises) diff --git a/app/assets/javascripts/invite_members/components/invite_members_trigger.vue b/app/assets/javascripts/invite_members/components/invite_members_trigger.vue index bf3250f63a5cf3f38452af8b507eaf1f04bb8839..7dd74f8803a8dcf828f30b40cba51616c3c17b2a 100644 --- a/app/assets/javascripts/invite_members/components/invite_members_trigger.vue +++ b/app/assets/javascripts/invite_members/components/invite_members_trigger.vue @@ -1,6 +1,5 @@ <script> import { GlButton, GlLink, GlIcon } from '@gitlab/ui'; -import ExperimentTracking from '~/experimentation/experiment_tracking'; import { s__ } from '~/locale'; import eventHub from '../event_hub'; import { TRIGGER_ELEMENT_BUTTON, TRIGGER_ELEMENT_SIDE_NAV } from '../constants'; @@ -32,11 +31,6 @@ export default { type: String, required: true, }, - trackExperiment: { - type: String, - required: false, - default: undefined, - }, triggerElement: { type: String, required: false, @@ -72,9 +66,6 @@ export default { return baseAttributes; }, }, - mounted() { - this.trackExperimentOnShow(); - }, methods: { checkTrigger(targetTriggerElement) { return this.triggerElement === targetTriggerElement; @@ -82,12 +73,6 @@ export default { openModal() { eventHub.$emit('openModal', { inviteeType: 'members', source: this.triggerSource }); }, - trackExperimentOnShow() { - if (this.trackExperiment) { - const tracking = new ExperimentTracking(this.trackExperiment); - tracking.event('comment_invite_shown'); - } - }, }, TRIGGER_ELEMENT_BUTTON, TRIGGER_ELEMENT_SIDE_NAV, diff --git a/app/assets/javascripts/invite_members/constants.js b/app/assets/javascripts/invite_members/constants.js index 87d2fbc6aac1b2b885b9fbff2f25ad865a5bacb1..ec59b3909fe15ecf8b183db2adad9ca379b2764a 100644 --- a/app/assets/javascripts/invite_members/constants.js +++ b/app/assets/javascripts/invite_members/constants.js @@ -2,7 +2,6 @@ import { __, s__ } from '~/locale'; export const SEARCH_DELAY = 200; -export const INVITE_MEMBERS_IN_COMMENT = 'invite_members_in_comment'; export const INVITE_MEMBERS_FOR_TASK = { minimum_access_level: 30, name: 'invite_members_for_task', diff --git a/app/assets/javascripts/vue_shared/components/markdown/toolbar.vue b/app/assets/javascripts/vue_shared/components/markdown/toolbar.vue index 912aa8ce294452859d96dba39f81658371a0d6c8..f1c293c87f474775053686da7b697f86bf4726a2 100644 --- a/app/assets/javascripts/vue_shared/components/markdown/toolbar.vue +++ b/app/assets/javascripts/vue_shared/components/markdown/toolbar.vue @@ -1,18 +1,13 @@ <script> import { GlButton, GlLink, GlLoadingIcon, GlSprintf, GlIcon } from '@gitlab/ui'; -import { isExperimentVariant } from '~/experimentation/utils'; -import InviteMembersTrigger from '~/invite_members/components/invite_members_trigger.vue'; -import { INVITE_MEMBERS_IN_COMMENT } from '~/invite_members/constants'; export default { - inviteMembersInComment: INVITE_MEMBERS_IN_COMMENT, components: { GlButton, GlLink, GlLoadingIcon, GlSprintf, GlIcon, - InviteMembersTrigger, }, props: { markdownDocsPath: { @@ -34,9 +29,6 @@ export default { hasQuickActionsDocsPath() { return this.quickActionsDocsPath !== ''; }, - inviteCommentEnabled() { - return isExperimentVariant(INVITE_MEMBERS_IN_COMMENT, 'invite_member_link'); - }, }, }; </script> @@ -67,16 +59,6 @@ export default { </template> </div> <span v-if="canAttachFile" class="uploading-container"> - <invite-members-trigger - v-if="inviteCommentEnabled" - classes="gl-mr-3 gl-vertical-align-text-bottom" - :display-text="s__('InviteMember|Invite Member')" - icon="assignee" - variant="link" - :track-experiment="$options.inviteMembersInComment" - :trigger-source="$options.inviteMembersInComment" - data-track-action="comment_invite_click" - /> <span class="uploading-progress-container hide"> <gl-icon name="media" /> <span class="attaching-file-message"></span> diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb index 345e4434f4daf63148295f60a7bb02f77bece35c..d2d7ecfab6f620bcef85e96936815a047dc4155d 100644 --- a/app/controllers/projects/issues_controller.rb +++ b/app/controllers/projects/issues_controller.rb @@ -52,15 +52,6 @@ class Projects::IssuesController < Projects::ApplicationController push_frontend_feature_flag(:confidential_notes, @project, default_enabled: :yaml) push_frontend_feature_flag(:issue_assignees_widget, @project, default_enabled: :yaml) push_frontend_feature_flag(:paginated_issue_discussions, @project, default_enabled: :yaml) - - experiment(:invite_members_in_comment, namespace: @project.root_ancestor) do |experiment_instance| - experiment_instance.exclude! unless helpers.can_admin_project_member?(@project) - - experiment_instance.use {} - experiment_instance.try(:invite_member_link) {} - - experiment_instance.track(:view, property: @project.root_ancestor.id.to_s) - end end around_action :allow_gitaly_ref_name_caching, only: [:discussions] diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 3cffa9136d6c6a1eeeb1e9e74df3806980703c7d..ccc34e2940ec775e5cbcf82fb3412b3ec736a73d 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -47,15 +47,6 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo push_frontend_feature_flag(:users_expanding_widgets_usage_data, @project, default_enabled: :yaml) push_frontend_feature_flag(:diff_settings_usage_data, default_enabled: :yaml) push_frontend_feature_flag(:diff_searching_usage_data, @project, default_enabled: :yaml) - - experiment(:invite_members_in_comment, namespace: @project.root_ancestor) do |experiment_instance| - experiment_instance.exclude! unless helpers.can_admin_project_member?(@project) - - experiment_instance.use {} - experiment_instance.try(:invite_member_link) {} - - experiment_instance.track(:view, property: @project.root_ancestor.id.to_s) - end end before_action do diff --git a/config/feature_flags/experiment/invite_members_in_comment.yml b/config/feature_flags/experiment/invite_members_in_comment.yml deleted file mode 100644 index 521574ad71be912ae58814077c801d1deb0a919f..0000000000000000000000000000000000000000 --- a/config/feature_flags/experiment/invite_members_in_comment.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -name: invite_members_in_comment -introduced_by_url: 'https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51400' -rollout_issue_url: 'https://gitlab.com/gitlab-org/growth/team-tasks/-/issues/300' -milestone: '13.10' -type: experiment -group: group::expansion -default_enabled: false diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 40079e9bdeb8d3622ffc9df66c7ac3938db17fff..69d3e5096e311189c3578a5d5abad2d2e23b01b9 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -19317,9 +19317,6 @@ msgstr "" msgid "InviteMember|Add members to this project and start collaborating with your team." msgstr "" -msgid "InviteMember|Invite Member" -msgstr "" - msgid "InviteMember|Invite Members (optional)" msgstr "" diff --git a/spec/controllers/projects/issues_controller_spec.rb b/spec/controllers/projects/issues_controller_spec.rb index ce8bbf92cdfc04aed9b2a328828d3669bc199370..763c3e43e27c9d38cae72e1ca63fa2b475bd4a65 100644 --- a/spec/controllers/projects/issues_controller_spec.rb +++ b/spec/controllers/projects/issues_controller_spec.rb @@ -201,32 +201,6 @@ expect(response).to have_gitlab_http_status(:ok) expect(json_response['issue_email_participants']).to contain_exactly({ "email" => participants[0].email }, { "email" => participants[1].email }) end - - context 'with the invite_members_in_comment experiment', :experiment do - context 'when user can invite' do - before do - stub_experiments(invite_members_in_comment: :invite_member_link) - project.add_maintainer(user) - end - - it 'assigns the candidate experience and tracks the event' do - expect(experiment(:invite_members_in_comment)).to track(:view, property: project.root_ancestor.id.to_s) - .for(:invite_member_link) - .with_context(namespace: project.root_ancestor) - .on_next_instance - - get :show, params: { namespace_id: project.namespace, project_id: project, id: issue.iid } - end - end - - context 'when user can not invite' do - it 'does not track the event' do - expect(experiment(:invite_members_in_comment)).not_to track(:view) - - get :show, params: { namespace_id: project.namespace, project_id: project, id: issue.iid } - end - end - end end describe 'GET #new' do diff --git a/spec/controllers/projects/merge_requests_controller_spec.rb b/spec/controllers/projects/merge_requests_controller_spec.rb index f4a5044c049663385e67c8e01e6303fb5313c234..36b6df59ef5565f95608e2f52175b6e741685909 100644 --- a/spec/controllers/projects/merge_requests_controller_spec.rb +++ b/spec/controllers/projects/merge_requests_controller_spec.rb @@ -42,32 +42,6 @@ def go(extra_params = {}) get :show, params: params.merge(extra_params) end - context 'with the invite_members_in_comment experiment', :experiment do - context 'when user can invite' do - before do - stub_experiments(invite_members_in_comment: :invite_member_link) - project.add_maintainer(user) - end - - it 'assigns the candidate experience and tracks the event' do - expect(experiment(:invite_members_in_comment)).to track(:view, property: project.root_ancestor.id.to_s) - .for(:invite_member_link) - .with_context(namespace: project.root_ancestor) - .on_next_instance - - go - end - end - - context 'when user can not invite' do - it 'does not track the event' do - expect(experiment(:invite_members_in_comment)).not_to track(:view) - - go - end - end - end - context 'with view param' do before do go(view: 'parallel') diff --git a/spec/features/issues/user_invites_from_a_comment_spec.rb b/spec/features/issues/user_invites_from_a_comment_spec.rb deleted file mode 100644 index 82061f6ed792eb2780c39552e4535fe282c771bc..0000000000000000000000000000000000000000 --- a/spec/features/issues/user_invites_from_a_comment_spec.rb +++ /dev/null @@ -1,25 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -RSpec.describe "User invites from a comment", :js do - let_it_be(:project) { create(:project_empty_repo, :public) } - let_it_be(:issue) { create(:issue, project: project) } - let_it_be(:user) { project.owner } - - before do - sign_in(user) - end - - it "launches the invite modal from invite link on a comment" do - stub_experiments(invite_members_in_comment: :invite_member_link) - - visit project_issue_path(project, issue) - - page.within(".new-note") do - click_button 'Invite Member' - end - - expect(page).to have_content("You're inviting members to the") - end -end diff --git a/spec/features/merge_request/user_invites_from_a_comment_spec.rb b/spec/features/merge_request/user_invites_from_a_comment_spec.rb deleted file mode 100644 index 79865094fd08fbfcbfe949483a19940a4a55395d..0000000000000000000000000000000000000000 --- a/spec/features/merge_request/user_invites_from_a_comment_spec.rb +++ /dev/null @@ -1,25 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -RSpec.describe "User invites from a comment", :js do - let_it_be(:project) { create(:project, :public, :repository) } - let_it_be(:merge_request) { create(:merge_request, source_project: project) } - let_it_be(:user) { project.owner } - - before do - sign_in(user) - end - - it "launches the invite modal from invite link on a comment" do - stub_experiments(invite_members_in_comment: :invite_member_link) - - visit project_merge_request_path(project, merge_request) - - page.within(".new-note") do - click_button 'Invite Member' - end - - expect(page).to have_content("You're inviting members to the") - end -end diff --git a/spec/frontend/invite_members/components/invite_members_modal_spec.js b/spec/frontend/invite_members/components/invite_members_modal_spec.js index f3cad3fc066831c7bd2dda4834b744ab6da589a8..e190ddf243e6d1699681a8fad369b3dbdebc96f3 100644 --- a/spec/frontend/invite_members/components/invite_members_modal_spec.js +++ b/spec/frontend/invite_members/components/invite_members_modal_spec.js @@ -17,7 +17,6 @@ import InviteMembersModal from '~/invite_members/components/invite_members_modal import ModalConfetti from '~/invite_members/components/confetti.vue'; import MembersTokenSelect from '~/invite_members/components/members_token_select.vue'; import { - INVITE_MEMBERS_IN_COMMENT, INVITE_MEMBERS_FOR_TASK, CANCEL_BUTTON_TEXT, INVITE_BUTTON_TEXT, @@ -746,7 +745,6 @@ describe('InviteMembersModal', () => { wrapper.vm.$toast = { show: jest.fn() }; jest.spyOn(Api, 'inviteGroupMembersByEmail').mockResolvedValue({ data: postData }); jest.spyOn(Api, 'addGroupMembersByUserId').mockResolvedValue({ data: postData }); - jest.spyOn(wrapper.vm, 'trackInvite'); }); describe('when triggered from regular mounting', () => { @@ -864,31 +862,6 @@ describe('InviteMembersModal', () => { jest.spyOn(Api, 'inviteGroupMembersByEmail').mockResolvedValue({}); }); - it('tracks the invite', () => { - eventHub.$emit('openModal', { inviteeType: 'members', source: INVITE_MEMBERS_IN_COMMENT }); - - clickInviteButton(); - - expect(ExperimentTracking).toHaveBeenCalledWith(INVITE_MEMBERS_IN_COMMENT); - expect(ExperimentTracking.prototype.event).toHaveBeenCalledWith('comment_invite_success'); - }); - - it('does not track invite for unknown source', () => { - eventHub.$emit('openModal', { inviteeType: 'members', source: 'unknown' }); - - clickInviteButton(); - - expect(ExperimentTracking).not.toHaveBeenCalledWith(INVITE_MEMBERS_IN_COMMENT); - }); - - it('does not track invite undefined source', () => { - eventHub.$emit('openModal', { inviteeType: 'members' }); - - clickInviteButton(); - - expect(ExperimentTracking).not.toHaveBeenCalledWith(INVITE_MEMBERS_IN_COMMENT); - }); - it('tracks the view for learn_gitlab source', () => { eventHub.$emit('openModal', { inviteeType: 'members', source: LEARN_GITLAB }); diff --git a/spec/frontend/invite_members/components/invite_members_trigger_spec.js b/spec/frontend/invite_members/components/invite_members_trigger_spec.js index 3fce23f854c9796839d7cb26b1aa100f6df46d15..429b6fad24a6d5abdf85bc06cfa97a3fcc0774c5 100644 --- a/spec/frontend/invite_members/components/invite_members_trigger_spec.js +++ b/spec/frontend/invite_members/components/invite_members_trigger_spec.js @@ -1,6 +1,5 @@ import { GlButton, GlLink, GlIcon } from '@gitlab/ui'; import { shallowMount } from '@vue/test-utils'; -import ExperimentTracking from '~/experimentation/experiment_tracking'; import InviteMembersTrigger from '~/invite_members/components/invite_members_trigger.vue'; import eventHub from '~/invite_members/event_hub'; import { TRIGGER_ELEMENT_BUTTON, TRIGGER_ELEMENT_SIDE_NAV } from '~/invite_members/constants'; @@ -79,19 +78,6 @@ describe.each(triggerItems)('with triggerElement as %s', (triggerItem) => { }); describe('tracking', () => { - it('tracks on mounting', () => { - createComponent({ trackExperiment: '_track_experiment_' }); - - expect(ExperimentTracking).toHaveBeenCalledWith('_track_experiment_'); - expect(ExperimentTracking.prototype.event).toHaveBeenCalledWith('comment_invite_shown'); - }); - - it('does not track on mounting', () => { - createComponent(); - - expect(ExperimentTracking).not.toHaveBeenCalledWith('_track_experiment_'); - }); - it('does not add tracking attributes', () => { createComponent(); diff --git a/spec/frontend/vue_shared/components/markdown/toolbar_spec.js b/spec/frontend/vue_shared/components/markdown/toolbar_spec.js index eddc4033a65281d23817404b455182c5a41e1c97..8bff85b0bda3c4b88c824b2e2fea3933e0364575 100644 --- a/spec/frontend/vue_shared/components/markdown/toolbar_spec.js +++ b/spec/frontend/vue_shared/components/markdown/toolbar_spec.js @@ -1,24 +1,17 @@ import { mount } from '@vue/test-utils'; -import { isExperimentVariant } from '~/experimentation/utils'; -import InviteMembersTrigger from '~/invite_members/components/invite_members_trigger.vue'; -import { INVITE_MEMBERS_IN_COMMENT } from '~/invite_members/constants'; import Toolbar from '~/vue_shared/components/markdown/toolbar.vue'; -jest.mock('~/experimentation/utils', () => ({ isExperimentVariant: jest.fn() })); - describe('toolbar', () => { let wrapper; const createMountedWrapper = (props = {}) => { wrapper = mount(Toolbar, { propsData: { markdownDocsPath: '', ...props }, - stubs: { 'invite-members-trigger': true }, }); }; afterEach(() => { wrapper.destroy(); - isExperimentVariant.mockReset(); }); describe('user can attach file', () => { @@ -40,36 +33,4 @@ describe('toolbar', () => { expect(wrapper.vm.$el.querySelector('.uploading-container')).toBeNull(); }); }); - - describe('user can invite member', () => { - const findInviteLink = () => wrapper.find(InviteMembersTrigger); - - beforeEach(() => { - isExperimentVariant.mockReturnValue(true); - createMountedWrapper(); - }); - - it('should render the invite members trigger', () => { - expect(findInviteLink().exists()).toBe(true); - }); - - it('should have correct props', () => { - expect(findInviteLink().props().displayText).toBe('Invite Member'); - expect(findInviteLink().props().trackExperiment).toBe(INVITE_MEMBERS_IN_COMMENT); - expect(findInviteLink().props().triggerSource).toBe(INVITE_MEMBERS_IN_COMMENT); - }); - }); - - describe('user can not invite member', () => { - const findInviteLink = () => wrapper.find(InviteMembersTrigger); - - beforeEach(() => { - isExperimentVariant.mockReturnValue(false); - createMountedWrapper(); - }); - - it('should render the invite members trigger', () => { - expect(findInviteLink().exists()).toBe(false); - }); - }); });