{"version":3,"sources":["webpack:///./src/components/analytics/ga-api.ts","webpack:///./src/components/analytics/GoogleAnalytics.ts"],"names":["GoogleAnalyticsApi","constructor","trackingId","formInternalName","isEmbedded","gtag","window","dataLayer","push","arguments","this","initGoogleAnalyticsApi","initTracking","script","document","createElement","src","async","head","appendChild","Date","send_page_view","getTrackingUrl","pageFragment","result","location","pathname","pageSuffix","recordPageView","sendEvent","send_to","page_location","recordNavigation","event","pageTitle","data","destinationPage","title","pageNumber","number","recordSubmission","submissionGoalLabel","submissionGoalValue","SubmissionAction","event_category","event_label","value","recordConfirmation","eventName","eventParams","eventSent","customCallback","event_callback","Promise","resolve","interval","timer","setTimeout","clearInterval","ApiCallTimeout","setInterval","clearTimeout","Vue","extend","name","inject","props","type","String","default","required","trackFormSubmission","Boolean","Number","isMultiPage","firstVisiblePageName","googleAnalytics","mounted","flags","iframeFormTracking","formEvents","emit","FormEvent","FormEvents","InitGoogleAnalytics","googleAnalyticsTrackingId","isMultipageForm","on","AfterSubmit","recordIframeSubmission","embedded","AfterNavigate","methods","entryId","entry","Id","recordId","auditRecordId","recordGoalAuditRecord","submitEvent","once","IframeGoogleAnalyticsSubmissionRecordedEvent","recordedEvent","recordGoalAuditRecordIframe","IframeGoogleAnalyticsSubmissionEvent","goalLabel","goalValue","label","successful","auditService","recordGoogleAnalyticsOutcome","render"],"mappings":"gGAAA,kCAWO,MAAMA,EAaZC,YAAYC,EAAoBC,EAA0BC,GAAqB,KAVvEF,gBAAU,OACVC,sBAAgB,OAChBC,gBAAU,OAElBC,KAAkB,WAGjB,OAAOC,OAAOC,UAAUC,KAAKC,YAI7BC,KAAKR,WAAaA,EAClBQ,KAAKP,iBAAmBA,EACxBO,KAAKN,WAAaA,EAElBM,KAAKC,yBACLD,KAAKE,eAGN,iBACC,OAAOF,KAAKN,WAAaM,KAAKP,iBAAmB,KAGlDQ,yBACC,MAAME,EAASC,SAASC,cAAc,UACtCF,EAAOG,IAAM,+CAAiDN,KAAKR,WACnEW,EAAOI,OAAQ,EAEfH,SAASI,KAAKC,YAAYN,GAE1BP,OAAOC,UAAYD,OAAOC,WAAa,GAEvCG,KAAKL,KAAK,KAAM,IAAIe,MAGrBR,eAMCF,KAAKL,KAAK,SAAUK,KAAKR,WAAY,CACpCmB,gBAAgB,IAIlBC,eAAeC,GACd,IAAIC,EAASlB,OAAOmB,SAASC,SAS7B,OAPIhB,KAAKiB,aACRH,GAAU,IAAMd,KAAKiB,YAElBJ,IACHC,GAAU,IAAMD,GAGVC,EAGRI,eAAeL,GACd,OAAOb,KAAKmB,UAAU,YAAa,CAClCC,QAASpB,KAAKR,WACd6B,cAAerB,KAAKY,eAAeC,KAIrCS,iBAAiBC,GAChB,MAAMC,EAAYD,EAAME,KAAKC,gBAAgBC,MACvCC,EAAaL,EAAME,KAAKC,gBAAgBG,OAGxChB,EAAeW,GAAc,QAAUI,EAE7C,OAAO5B,KAAKkB,eAAeL,GAG5BiB,iBAAiBC,EAA6BC,GAC7C,OAAOhC,KAAKmB,UAAU7B,EAAmB2C,iBAAkB,CAC1Db,QAASpB,KAAKR,WACd0C,eAAgBlC,KAAKP,iBACrB0C,YAAaJ,EACbK,MAAOJ,IAITK,qBAEC,OAAOrC,KAAKkB,eAAe,gBAG5B,gBAAwBoB,EAA8DC,GACrF,IAAIC,GAAY,EAEhB,MAAMC,EAAkBF,EAAmCG,eAU3D,OARCH,EAAmCG,eAAiB,KACpDF,GAAY,EACRC,GACHA,KAGFzC,KAAKL,KAAK,QAAS2C,EAAWC,GAEvB,IAAII,QAAiBC,IAC3B,IAAIC,EAAmB,EAGvB,MAAMC,EAAQlD,OAAOmD,WAAW,KAE/BC,cAAcH,GAEdD,GAAQ,IACNtD,EAAmB2D,gBAGtBJ,EAAWjD,OAAOsD,YAAY,KACzBV,IAEHW,aAAaL,GAEbF,EAAQJ,KAEP,QA7HOlD,EACE2C,iBAAmB,kBADrB3C,EAEG2D,eAAiB,K,iCCZjC,kDAKeG,cAAIC,OAAO,CACzBC,KAAM,mBACNC,OAAQ,CAAC,QAAS,aAAc,gBAChCC,MAAO,CACNhE,WAAY,CAAEiE,KAAMC,OAAQC,QAAS,GAAIC,UAAU,GACnDnE,iBAAkB,CAAEgE,KAAMC,OAAQC,QAAS,IAC3CE,oBAAqB,CAAEJ,KAAMK,QAASH,SAAS,GAC/C5B,oBAAqB,CAAE0B,KAAMC,OAAQC,QAAS,IAC9C3B,oBAAqB,CAAEyB,KAAMM,OAAQJ,QAAS,MAC9CK,YAAa,CAAEP,KAAMK,QAASH,SAAS,GACvCM,qBAAsB,CAAER,KAAMC,OAAQC,QAAS,OAEhDlC,KAAIA,KACI,CACNyC,gBAAiB,OAGnBC,UACMnE,KAAKoE,MAAMC,oBAWfrE,KAAKsE,WAAWC,KAAK,IAAIC,IAAwCC,IAAWC,oBAAqB,CAChGC,0BAA2B3E,KAAKR,WAChCC,iBAAkBO,KAAKP,iBACvBmF,gBAAiB5E,KAAKgE,YACtBC,qBAAsBjE,KAAKiE,wBAE5BjE,KAAKsE,WAAWO,GAAGJ,IAAWK,YAAa9E,KAAK+E,0BAhBhD/E,KAAKkE,gBAAkB,IAAI5E,IAAmBU,KAAKR,WAAYQ,KAAKP,iBAAkBO,KAAKoE,MAAMY,UAGjGhF,KAAKkE,gBAAgBhD,eAAelB,KAAKgE,YAAchE,KAAKiE,qBAAuB,MAEnFjE,KAAKsE,WAAWO,GAAGJ,IAAWQ,cAAejF,KAAKsB,kBAClDtB,KAAKsE,WAAWO,GAAGJ,IAAWK,YAAa9E,KAAK8B,kBAChD9B,KAAKsE,WAAWO,GAAGJ,IAAWK,YAAa9E,KAAKqC,sBAYlD6C,QAAS,CACR5D,iBAAiBC,GAChB,OAAOvB,KAAKkE,gBAAgB5C,iBAAiBC,IAE9Cc,qBAEC,OAAOrC,KAAKkE,gBAAgB7B,sBAE7B,uBAAuBd,GACtB,GAAIvB,KAAK6D,oBAAqB,CAC7B,MAAM/C,QAAed,KAAKkE,gBAAgBpC,iBAAiB9B,KAAK+B,oBAAqB/B,KAAKgC,qBACpFmD,EAAU5D,EAAME,KAAK2D,MAAMC,GAC3BC,EAAW/D,EAAME,KAAK8D,cAC5BvF,KAAKwF,sBAAsBxF,KAAK+B,oBAAqB/B,KAAKgC,oBAAqBlB,EAAQqE,EAASG,KAGlGP,uBAAuBU,GACtB,MAAMN,EAAUM,EAAYhE,KAAK2D,MAAMC,GACjCC,EAAWG,EAAYhE,KAAK8D,cAC9BvF,KAAK6D,sBACR7D,KAAKsE,WAAWoB,KAAKjB,IAAWkB,6CAC9BC,GACA5F,KAAK6F,4BAA4BD,EAAeT,EAASG,IAC3DtF,KAAKsE,WAAWC,KAAK,IAAIC,IAAyDC,IAAWqB,qCAAsC,CAClIC,UAAW/F,KAAK+B,oBAChBiE,UAAWhG,KAAKgC,yBAInB,4BAA4BiE,EAAe7D,EAAe8D,EAAqBf,EAAiBI,SACzFvF,KAAKmG,aAAaC,6BAA6BpG,KAAKP,iBAAkBH,IAAmB2C,iBAAkBgE,EAAO7D,EAAO8D,EAAYf,EAASI,IAErJM,4BAA4BtE,EAAqD4D,EAAiBI,GACjGvF,KAAKwF,sBAAsBjE,EAAME,KAAKsE,UAAWxE,EAAME,KAAKuE,UAAWzE,EAAME,KAAKyE,WAAYf,EAASI,KAGzGc,OAAMA,IACE","file":"110.8531f9527197b9100205.js","sourcesContent":["// type definitions do not use module syntax\r\n// eslint-disable-next-line @typescript-eslint/triple-slash-reference\r\n/// \r\n\r\nimport type { AfterNavigateEvent } from 'src/framework/public/events';\r\n\r\ndeclare global {\r\n\t// eslint-disable-next-line no-var\r\n\tvar dataLayer: unknown[];\r\n}\r\n\r\nexport class GoogleAnalyticsApi {\r\n\tpublic static SubmissionAction = 'Form Submission';\r\n\tprivate static ApiCallTimeout = 3000;\r\n\tprivate trackingId: string;\r\n\tprivate formInternalName: string;\r\n\tprivate isEmbedded: boolean;\r\n\r\n\tgtag: Gtag.Gtag = function() {\r\n\t\t// WI: #37281\r\n\t\t// eslint-disable-next-line prefer-rest-params\r\n\t\treturn window.dataLayer.push(arguments);\r\n\t};\r\n\r\n\tconstructor(trackingId: string, formInternalName: string, isEmbedded: boolean) {\r\n\t\tthis.trackingId = trackingId;\r\n\t\tthis.formInternalName = formInternalName;\r\n\t\tthis.isEmbedded = isEmbedded;\r\n\r\n\t\tthis.initGoogleAnalyticsApi();\r\n\t\tthis.initTracking();\r\n\t}\r\n\r\n\tget pageSuffix() {\r\n\t\treturn this.isEmbedded ? this.formInternalName : null;\r\n\t}\r\n\r\n\tinitGoogleAnalyticsApi() {\r\n\t\tconst script = document.createElement('script');\r\n\t\tscript.src = 'https://www.googletagmanager.com/gtag/js?id=' + this.trackingId;\r\n\t\tscript.async = true;\r\n\r\n\t\tdocument.head.appendChild(script);\r\n\r\n\t\twindow.dataLayer = window.dataLayer || [];\r\n\r\n\t\tthis.gtag('js', new Date());\r\n\t}\r\n\r\n\tinitTracking() {\r\n\t\t/**\r\n\t\t * Set the tag Id\r\n\t\t * We don't want to automatically send a page view in case the user\r\n\t\t * has multiple forms embedded with different Gtags on the same page\r\n\t\t */\r\n\t\tthis.gtag('config', this.trackingId, {\r\n\t\t\tsend_page_view: false\r\n\t\t});\r\n\t}\r\n\r\n\tgetTrackingUrl(pageFragment?: string): string {\r\n\t\tlet result = window.location.pathname;\r\n\r\n\t\tif (this.pageSuffix)\r\n\t\t\tresult += '#' + this.pageSuffix;\r\n\r\n\t\tif (pageFragment) {\r\n\t\t\tresult += '#' + pageFragment;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\trecordPageView(pageFragment?: string) : Promise {\r\n\t\treturn this.sendEvent('page_view', {\r\n\t\t\tsend_to: this.trackingId,\r\n\t\t\tpage_location: this.getTrackingUrl(pageFragment)\r\n\t\t});\r\n\t}\r\n\r\n\trecordNavigation(event: AfterNavigateEvent) : Promise {\r\n\t\tconst pageTitle = event.data.destinationPage.title;\r\n\t\tconst pageNumber = event.data.destinationPage.number;\r\n\r\n\t\t// If the page has no title, default to the page number\r\n\t\tconst pageFragment = pageTitle || ('Page ' + pageNumber);\r\n\r\n\t\treturn this.recordPageView(pageFragment);\r\n\t}\r\n\r\n\trecordSubmission(submissionGoalLabel: string, submissionGoalValue: number) : Promise {\r\n\t\treturn this.sendEvent(GoogleAnalyticsApi.SubmissionAction, {\r\n\t\t\tsend_to: this.trackingId,\r\n\t\t\tevent_category: this.formInternalName,\r\n\t\t\tevent_label: submissionGoalLabel,\r\n\t\t\tvalue: submissionGoalValue\r\n\t\t});\r\n\t}\r\n\r\n\trecordConfirmation() : Promise {\r\n\t\t// Record the confirmation page after the form is submitted\r\n\t\treturn this.recordPageView('confirmation');\r\n\t}\r\n\r\n\tprivate async sendEvent(eventName: Gtag.EventNames | (string & NonNullable), eventParams?: Gtag.ControlParams | Gtag.EventParams | Gtag.CustomParams) : Promise {\r\n\t\tlet eventSent = false;\r\n\r\n\t\tconst customCallback = (eventParams as Gtag.ControlParams).event_callback;\r\n\r\n\t\t(eventParams as Gtag.ControlParams).event_callback = () => {\r\n\t\t\teventSent = true;\r\n\t\t\tif (customCallback)\r\n\t\t\t\tcustomCallback();\r\n\t\t};\r\n\r\n\t\tthis.gtag('event', eventName, eventParams);\r\n\r\n\t\treturn new Promise(resolve => {\r\n\t\t\tlet interval: number = 0;\r\n\r\n\t\t\t// Resolve to false if the callback isn't called within the specified time\r\n\t\t\tconst timer = window.setTimeout(() => {\r\n\t\t\t\t// If the we reach the timeout, stop checking for the callback to have been called\r\n\t\t\t\tclearInterval(interval);\r\n\r\n\t\t\t\tresolve(false);\r\n\t\t\t}, GoogleAnalyticsApi.ApiCallTimeout);\r\n\r\n\t\t\t// Check every 100ms for the callback to have been called\r\n\t\t\tinterval = window.setInterval(() => {\r\n\t\t\t\tif (eventSent) {\r\n\t\t\t\t\t// If the callback has been called, don't allow the promise to resolve to false\r\n\t\t\t\t\tclearTimeout(timer);\r\n\r\n\t\t\t\t\tresolve(eventSent);\r\n\t\t\t\t}\r\n\t\t\t}, 100);\r\n\t\t});\r\n\t}\r\n}","import type { AfterNavigateEvent, AfterSubmitEvent, IframeGoogleAnalyticsSubmissionEventEventData, IframeGoogleAnalyticsSubmissionRecordedEvent, InitGoogleAnalyticsEventData } from 'src/framework/public/events';\r\nimport { FormEvents } from 'src/framework/public/events';\r\nimport Vue from 'vue';\r\nimport { GoogleAnalyticsApi } from './ga-api';\r\nimport { FormEvent } from 'src/framework/eventing/form-event';\r\n\r\nexport default Vue.extend({\r\n\tname: 'CGoogleAnalytics',\r\n\tinject: ['flags', 'formEvents', 'auditService'],\r\n\tprops: {\r\n\t\ttrackingId: { type: String, default: '', required: true },\r\n\t\tformInternalName: { type: String, default: '' },\r\n\t\ttrackFormSubmission: { type: Boolean, default: false },\r\n\t\tsubmissionGoalLabel: { type: String, default: '' },\r\n\t\tsubmissionGoalValue: { type: Number, default: null },\r\n\t\tisMultiPage: { type: Boolean, default: false },\r\n\t\tfirstVisiblePageName: { type: String, default: null }\r\n\t},\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\tgoogleAnalytics: null\r\n\t\t};\r\n\t},\r\n\tmounted() {\r\n\t\tif (!this.flags.iframeFormTracking) {\r\n\t\t\tthis.googleAnalytics = new GoogleAnalyticsApi(this.trackingId, this.formInternalName, this.flags.embedded);\r\n\r\n\t\t\t// Record the initial page view\r\n\t\t\tthis.googleAnalytics.recordPageView(this.isMultiPage ? this.firstVisiblePageName : null);\r\n\r\n\t\t\tthis.formEvents.on(FormEvents.AfterNavigate, this.recordNavigation);\r\n\t\t\tthis.formEvents.on(FormEvents.AfterSubmit, this.recordSubmission);\r\n\t\t\tthis.formEvents.on(FormEvents.AfterSubmit, this.recordConfirmation);\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.formEvents.emit(new FormEvent(FormEvents.InitGoogleAnalytics, {\r\n\t\t\t\tgoogleAnalyticsTrackingId: this.trackingId,\r\n\t\t\t\tformInternalName: this.formInternalName,\r\n\t\t\t\tisMultipageForm: this.isMultiPage,\r\n\t\t\t\tfirstVisiblePageName: this.firstVisiblePageName\r\n\t\t\t}));\r\n\t\t\tthis.formEvents.on(FormEvents.AfterSubmit, this.recordIframeSubmission);\r\n\t\t}\r\n\t},\r\n\tmethods: {\r\n\t\trecordNavigation(event: AfterNavigateEvent) : Promise {\r\n\t\t\treturn this.googleAnalytics.recordNavigation(event);\r\n\t\t},\r\n\t\trecordConfirmation(): Promise {\r\n\t\t\t// Record the confirmation page after the form is submitted\r\n\t\t\treturn this.googleAnalytics.recordConfirmation();\r\n\t\t},\r\n\t\tasync recordSubmission(event: AfterSubmitEvent) {\r\n\t\t\tif (this.trackFormSubmission) {\r\n\t\t\t\tconst result = await this.googleAnalytics.recordSubmission(this.submissionGoalLabel, this.submissionGoalValue);\r\n\t\t\t\tconst entryId = event.data.entry.Id;\r\n\t\t\t\tconst recordId = event.data.auditRecordId;\r\n\t\t\t\tthis.recordGoalAuditRecord(this.submissionGoalLabel, this.submissionGoalValue, result, entryId, recordId);\r\n\t\t\t}\r\n\t\t},\r\n\t\trecordIframeSubmission(submitEvent: AfterSubmitEvent) {\r\n\t\t\tconst entryId = submitEvent.data.entry.Id;\r\n\t\t\tconst recordId = submitEvent.data.auditRecordId;\r\n\t\t\tif (this.trackFormSubmission) {\r\n\t\t\t\tthis.formEvents.once(FormEvents.IframeGoogleAnalyticsSubmissionRecordedEvent,\r\n\t\t\t\t\t(recordedEvent: IframeGoogleAnalyticsSubmissionRecordedEvent) =>\r\n\t\t\t\t\t\tthis.recordGoalAuditRecordIframe(recordedEvent, entryId, recordId));\r\n\t\t\t\tthis.formEvents.emit(new FormEvent(FormEvents.IframeGoogleAnalyticsSubmissionEvent, {\r\n\t\t\t\t\tgoalLabel: this.submissionGoalLabel,\r\n\t\t\t\t\tgoalValue: this.submissionGoalValue\r\n\t\t\t\t}));\r\n\t\t\t}\r\n\t\t},\r\n\t\tasync recordGoalAuditRecord(label: string, value: number, successful: boolean, entryId: string, auditRecordId: string) {\r\n\t\t\tawait this.auditService.recordGoogleAnalyticsOutcome(this.formInternalName, GoogleAnalyticsApi.SubmissionAction, label, value, successful, entryId, auditRecordId);\r\n\t\t},\r\n\t\trecordGoalAuditRecordIframe(event: IframeGoogleAnalyticsSubmissionRecordedEvent, entryId: string, auditRecordId: string) {\r\n\t\t\tthis.recordGoalAuditRecord(event.data.goalLabel, event.data.goalValue, event.data.successful, entryId, auditRecordId);\r\n\t\t}\r\n\t},\r\n\trender() {\r\n\t\treturn null;\r\n\t}\r\n});"],"sourceRoot":""}