From a8d6df9b040bad6005bc00a064c7668ab500f735 Mon Sep 17 00:00:00 2001 From: Tom Byers Date: Fri, 13 Dec 2019 22:07:43 +0000 Subject: [PATCH] Wrap analytics code in GOVUK interface Wraps our analytics code in a stripped down version of GOVUK.Analytics to allow us to plug in the GOVUK code for consent. --- app/assets/javascripts/analytics/analytics.js | 39 +++++++++++++++++++ app/assets/javascripts/analytics/init.js | 39 +++++++++++++++++++ app/assets/javascripts/main.js | 2 + 3 files changed, 80 insertions(+) create mode 100644 app/assets/javascripts/analytics/analytics.js create mode 100644 app/assets/javascripts/analytics/init.js diff --git a/app/assets/javascripts/analytics/analytics.js b/app/assets/javascripts/analytics/analytics.js new file mode 100644 index 000000000..580ee382a --- /dev/null +++ b/app/assets/javascripts/analytics/analytics.js @@ -0,0 +1,39 @@ +(function (window) { + "use strict"; + + window.GOVUK = window.GOVUK || {}; + + // Stripped-down wrapper for Google Analytics, based on: + // https://github.com/alphagov/static/blob/master/app/assets/javascripts/analytics_toolkit/analytics.js + const Analytics = function (config) { + window.ga('create', config.trackingId, config.cookieDomain); + + window.ga('set', 'anonymizeIp', config.anonymizeIp); + window.ga('set', 'displayFeaturesTask', config.displayFeaturesTask); + window.ga('set', 'transport', config.transport); + + }; + + Analytics.load = function () { + /* jshint ignore:start */ + (function(i, s, o, g, r, a, m){ i['GoogleAnalyticsObject'] = r; i[r] = i[r] || function () { + (i[r].q = i[r].q || []).push(arguments) }, i[r].l = 1 * new Date(); a = s.createElement(o), + m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; m.parentNode.insertBefore(a,m) + })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); + /* jshint ignore:end */ + + }; + + Analytics.prototype.trackPageview = function (path, title, options) { + + // strip UUIDs + const page = (window.location.pathname + window.location.search).replace( + /[a-f0-9]{8}-?[a-f0-9]{4}-?4[a-f0-9]{3}-?[89ab][a-f0-9]{3}-?[a-f0-9]{12}/g, '…' + ); + window.ga('send', 'pageview', page); + + }; + + window.GOVUK.Analytics = Analytics; + +})(window); diff --git a/app/assets/javascripts/analytics/init.js b/app/assets/javascripts/analytics/init.js new file mode 100644 index 000000000..ea0d43454 --- /dev/null +++ b/app/assets/javascripts/analytics/init.js @@ -0,0 +1,39 @@ +(function (window) { + "use strict"; + + window.GOVUK = window.GOVUK || {}; + + const trackingId = 'UA-26179049-1'; + + // Disable analytics by default + window[`ga-disable-${trackingId}`] = true; + + const initAnalytics = function () { + + // guard against being called more than once + if (!('analytics' in window.GOVUK)) { + + window[`ga-disable-${trackingId}`] = false; + + // Load Google Analytics libraries + window.GOVUK.Analytics.load(); + + // Configure profiles and make interface public + // for custom dimensions, virtual pageviews and events + window.GOVUK.analytics = new GOVUK.Analytics({ + trackingId: trackingId, + cookieDomain: 'auto', + anonymizeIp: true, + displayFeaturesTask: null, + transport: 'beacon' + }); + + // Track initial pageview + window.GOVUK.analytics.trackPageview(); + + } + + }; + + window.GOVUK.initAnalytics = initAnalytics; +})(window); diff --git a/app/assets/javascripts/main.js b/app/assets/javascripts/main.js index 9c45e0508..2c3b43083 100644 --- a/app/assets/javascripts/main.js +++ b/app/assets/javascripts/main.js @@ -2,6 +2,8 @@ window.GOVUK.Frontend.initAll(); $(() => GOVUK.addCookieMessage()); +window.GOVUK.initAnalytics(); + $(() => $("time.timeago").timeago()); $(() => GOVUK.stickAtTopWhenScrolling.init());