diff --git a/app/assets/javascripts/google_tag_manager/index.js b/app/assets/javascripts/google_tag_manager/index.js index c8204f397ffd47a348242c53190cef9cfa4d87e5..ca5a1b29b6ded302c828145486e88100c27c00ff 100644 --- a/app/assets/javascripts/google_tag_manager/index.js +++ b/app/assets/javascripts/google_tag_manager/index.js @@ -290,3 +290,11 @@ export const trackCombinedGroupProjectForm = () => { pushEvent('combinedGroupProjectFormSubmit'); }); }; + +export const trackCompanyForm = (aboutYourCompanyType) => { + if (!isSupported()) { + return; + } + + pushEvent('aboutYourCompanyFormSubmit', { aboutYourCompanyType }); +}; diff --git a/ee/app/assets/javascripts/registrations/components/company_form.vue b/ee/app/assets/javascripts/registrations/components/company_form.vue index 221ecc438ec91add0f33de61620e9372db054044..f78886931c95696b91c6c5274db3c1d506538db2 100644 --- a/ee/app/assets/javascripts/registrations/components/company_form.vue +++ b/ee/app/assets/javascripts/registrations/components/company_form.vue @@ -22,6 +22,7 @@ import { TRIAL_PHONE_DESCRIPTION, TRIAL_FORM_SUBMIT_TEXT, } from 'ee/trials/constants'; +import { trackCompanyForm } from '~/google_tag_manager'; export default { csrf, @@ -69,6 +70,9 @@ export default { ? this.$options.i18n.description.trial : this.$options.i18n.description.registration; }, + aboutYourCompanyType() { + return this.trial ? 'ultimate_trial' : 'free_account'; + }, }, methods: { toggleTrial() { @@ -76,6 +80,9 @@ export default { trialOnboardingFlow: this.trialOnboardingFlow, }); }, + trackCompanyForm() { + trackCompanyForm(this.aboutYourCompanyType); + }, }, i18n: { companyNameLabel: LEADS_COMPANY_NAME_LABEL, @@ -99,7 +106,7 @@ export default { </script> <template> - <gl-form :action="submitPath" method="post"> + <gl-form :action="submitPath" method="post" @submit="trackCompanyForm"> <input :value="$options.csrf.token" type="hidden" name="authenticity_token" /> <gl-form-text class="gl-font-base gl-text-gray-400 gl-pb-3">{{ descriptionText }}</gl-form-text> <div class="gl-display-flex gl-flex-direction-column gl-sm-flex-direction-row gl-mt-5"> diff --git a/ee/app/controllers/registrations/company_controller.rb b/ee/app/controllers/registrations/company_controller.rb index a579cfe9c6ab3cb86d5a8dcb134f7e26d7b4d45b..90a8b2d7f2e7391952525be7153ec3af6b408311 100644 --- a/ee/app/controllers/registrations/company_controller.rb +++ b/ee/app/controllers/registrations/company_controller.rb @@ -2,11 +2,17 @@ module Registrations class CompanyController < ApplicationController + include OneTrustCSP + include GoogleAnalyticsCSP + layout 'minimal' before_action :check_if_gl_com_or_dev before_action :authenticate_user! feature_category :onboarding + before_action only: [:new] do + push_frontend_feature_flag(:gitlab_gtm_datalayer, type: :ops) + end def new end diff --git a/ee/app/views/registrations/company/new.html.haml b/ee/app/views/registrations/company/new.html.haml index 3442ca876eea9c58fcc3ac785223b2319c79557c..8cdc2ec753a8187c285231877e2ad226d310cefd 100644 --- a/ee/app/views/registrations/company/new.html.haml +++ b/ee/app/views/registrations/company/new.html.haml @@ -1,4 +1,9 @@ - page_title _('Start your Free Ultimate Trial') +- content_for :page_specific_javascripts do + = render "layouts/google_tag_manager_head" + = render "layouts/one_trust" + = render "layouts/bizible" += render "layouts/google_tag_manager_body" .row .col-md-6.m-sm-6 diff --git a/ee/spec/views/registrations/company/new.html.haml_spec.rb b/ee/spec/views/registrations/company/new.html.haml_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..107929656263a1667d109d59be31c44ed0da12dd --- /dev/null +++ b/ee/spec/views/registrations/company/new.html.haml_spec.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'registrations/company/new' do + describe 'Google Tag Manager' do + let!(:gtm_id) { 'GTM-WWKMTWS' } + let!(:google_url) { 'www.googletagmanager.com' } + + subject { rendered } + + before do + stub_devise + allow(Gitlab).to receive(:com?).and_return(true) + stub_config(extra: { google_tag_manager_id: gtm_id, google_tag_manager_nonce_id: gtm_id }) + allow(view).to receive(:google_tag_manager_enabled?).and_return(gtm_enabled) + + render + end + + describe 'when Google Tag Manager is enabled' do + let(:gtm_enabled) { true } + + it { is_expected.to match(/#{google_url}/) } + end + + describe 'when Google Tag Manager is disabled' do + let(:gtm_enabled) { false } + + it { is_expected.not_to match(/#{google_url}/) } + end + end + + def stub_devise + allow(view).to receive(:devise_mapping).and_return(Devise.mappings[:user]) + allow(view).to receive(:resource).and_return(spy) + allow(view).to receive(:resource_name).and_return(:user) + end +end diff --git a/spec/frontend/google_tag_manager/index_spec.js b/spec/frontend/google_tag_manager/index_spec.js index 6a7eb1fd9f10f2d5b4e2c4557a0852be06cbdc25..9c4b23e3a7040e6a3489f0394ac0a09d75a9a21c 100644 --- a/spec/frontend/google_tag_manager/index_spec.js +++ b/spec/frontend/google_tag_manager/index_spec.js @@ -15,6 +15,7 @@ import { trackTransaction, trackAddToCartUsageTab, getNamespaceId, + trackCompanyForm, } from '~/google_tag_manager'; import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures'; import { logError } from '~/lib/logger'; @@ -440,6 +441,34 @@ describe('~/google_tag_manager/index', () => { }); }); }); + + describe('when trackCompanyForm is invoked', () => { + it('with an ultimate trial', () => { + expect(spy).not.toHaveBeenCalled(); + + trackCompanyForm('ultimate_trial'); + + expect(spy).toHaveBeenCalledTimes(1); + expect(spy).toHaveBeenCalledWith({ + event: 'aboutYourCompanyFormSubmit', + aboutYourCompanyType: 'ultimate_trial', + }); + expect(logError).not.toHaveBeenCalled(); + }); + + it('with a free account', () => { + expect(spy).not.toHaveBeenCalled(); + + trackCompanyForm('free_account'); + + expect(spy).toHaveBeenCalledTimes(1); + expect(spy).toHaveBeenCalledWith({ + event: 'aboutYourCompanyFormSubmit', + aboutYourCompanyType: 'free_account', + }); + expect(logError).not.toHaveBeenCalled(); + }); + }); }); describe.each([