Skip to content

Commit

Permalink
Bump govuk frontend toolkit to 3.3.0
Browse files Browse the repository at this point in the history
# 3.3.0

- Add: Analytics - pageview tracking for a print attempt

# 3.2.1

- Fix: Analytics - don't run error and print plugins on load

# 3.2.0

- Add: Analytics API
alphagov/govuk_frontend_toolkit#162
https://github.com/alphagov/govuk_frontend_toolkit/blob/master/docs/anal
ytics.md
  • Loading branch information
Gemma Leigh committed Apr 10, 2015
1 parent caadd5a commit e850cc1
Show file tree
Hide file tree
Showing 7 changed files with 347 additions and 3 deletions.
27 changes: 27 additions & 0 deletions govuk/public/javascripts/govuk/analytics/error-tracking.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// Extension to track errors using google analytics as a data store.
(function() {

"use strict";

GOVUK.analyticsPlugins = GOVUK.analyticsPlugins || {};

GOVUK.analyticsPlugins.error = function () {
var trackJavaScriptError = function (e) {
var errorSource = e.filename + ': ' + e.lineno;
GOVUK.analytics.trackEvent('JavaScript Error', e.message, {
label: errorSource,
value: 1,
nonInteraction: true
});
};

if (window.addEventListener) {
window.addEventListener('error', trackJavaScriptError, false);
} else if (window.attachEvent) {
window.attachEvent('onerror', trackJavaScriptError);
} else {
window.onerror = trackJavaScriptError;
}
}

}());
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
(function() {
"use strict";
window.GOVUK = window.GOVUK || {};

var GoogleAnalyticsClassicTracker = function(id, cookieDomain) {
window._gaq = window._gaq || [];
configureProfile(id, cookieDomain);
allowCrossDomainTracking();
anonymizeIp();

function configureProfile(id, cookieDomain) {
_gaq.push(['_setAccount', id]);
_gaq.push(['_setDomainName', cookieDomain]);
}

function allowCrossDomainTracking() {
_gaq.push(['_setAllowLinker', true]);
}

// https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApi_gat#_gat._anonymizeIp
function anonymizeIp() {
_gaq.push(['_gat._anonymizeIp']);
}
};

GoogleAnalyticsClassicTracker.load = function() {
var ga = document.createElement('script'),
s = document.getElementsByTagName('script')[0];

ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
s.parentNode.insertBefore(ga, s);
};

// https://developers.google.com/analytics/devguides/collection/gajs/asyncMigrationExamples#VirtualPageviews
GoogleAnalyticsClassicTracker.prototype.trackPageview = function(path) {
var pageview = ['_trackPageview'];

if (typeof path === "string") {
pageview.push(path);
}

_gaq.push(pageview);
};

// https://developers.google.com/analytics/devguides/collection/gajs/eventTrackerGuide
GoogleAnalyticsClassicTracker.prototype.trackEvent = function(category, action, options) {
var value,
options = options || {},
hasLabel = false,
hasValue = false,
evt = ["_trackEvent", category, action];

// Label is optional
if (typeof options.label === "string") {
hasLabel = true;
evt.push(options.label);
}

// Value is optional, but when used must be an
// integer, otherwise the event will be invalid
// and not logged
if (options.value || options.value === 0) {
value = parseInt(options.value, 10);
if (typeof value === "number" && !isNaN(value)) {
hasValue = true;

// Push an empty label if not set for correct final argument order
if (!hasLabel) {
evt.push('');
}

evt.push(value);
}
}

// Prevents an event from affecting bounce rate
// https://developers.google.com/analytics/devguides/collection/gajs/eventTrackerGuide#non-interaction
if (options.nonInteraction) {

// Push empty label/value if not already set, for correct final argument order
if (!hasValue) {
if (!hasLabel) {
evt.push('');
}
evt.push(0);
}

evt.push(true);
}

_gaq.push(evt);
};

/*
https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiSocialTracking
network – The network on which the action occurs (e.g. Facebook, Twitter)
action – The type of action that happens (e.g. Like, Send, Tweet)
target – The text value that indicates the subject of the action
*/
GoogleAnalyticsClassicTracker.prototype.trackSocial = function(network, action, target) {
_gaq.push(['_trackSocial', network, action, target]);
};

// https://developers.google.com/analytics/devguides/collection/gajs/gaTrackingCustomVariables
GoogleAnalyticsClassicTracker.prototype.setCustomVariable = function(index, value, name, scope) {
_gaq.push(['_setCustomVar', index, name, String(value), scope]);
};

GOVUK.GoogleAnalyticsClassicTracker = GoogleAnalyticsClassicTracker;
})();
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
(function() {
"use strict";
window.GOVUK = window.GOVUK || {};

var GoogleAnalyticsUniversalTracker = function(id, cookieDomain) {
configureProfile(id, cookieDomain);
anonymizeIp();

function configureProfile(id, cookieDomain) {
sendToGa('create', id, {'cookieDomain': cookieDomain});
}

function anonymizeIp() {
// https://developers.google.com/analytics/devguides/collection/analyticsjs/advanced#anonymizeip
sendToGa('set', 'anonymizeIp', true);
}
};

GoogleAnalyticsUniversalTracker.load = function() {
(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');
};

// https://developers.google.com/analytics/devguides/collection/analyticsjs/pages
GoogleAnalyticsUniversalTracker.prototype.trackPageview = function(path, title) {
if (typeof path === "string") {
var pageviewObject = {
page: path
};

if (typeof title === "string") {
pageviewObject.title = title;
}
sendToGa('send', 'pageview', pageviewObject);
} else {
sendToGa('send', 'pageview');
}
};

// https://developers.google.com/analytics/devguides/collection/analyticsjs/events
GoogleAnalyticsUniversalTracker.prototype.trackEvent = function(category, action, options) {
var value,
options = options || {},
evt = {
hitType: 'event',
eventCategory: category,
eventAction: action
};

// Label is optional
if (typeof options.label === "string") {
evt.eventLabel = options.label;
}

// Value is optional, but when used must be an
// integer, otherwise the event will be invalid
// and not logged
if (options.value || options.value === 0) {
value = parseInt(options.value, 10);
if (typeof value === "number" && !isNaN(value)) {
evt.eventValue = value;
}
}

// Prevents an event from affecting bounce rate
// https://developers.google.com/analytics/devguides/collection/analyticsjs/events#implementation
if (options.nonInteraction) {
evt.nonInteraction = 1;
}

sendToGa('send', evt);
};

/*
https://developers.google.com/analytics/devguides/collection/analyticsjs/social-interactions
network – The network on which the action occurs (e.g. Facebook, Twitter)
action – The type of action that happens (e.g. Like, Send, Tweet)
target – Specifies the target of a social interaction.
This value is typically a URL but can be any text.
*/
GoogleAnalyticsUniversalTracker.prototype.trackSocial = function(network, action, target) {
sendToGa('send', {
'hitType': 'social',
'socialNetwork': network,
'socialAction': action,
'socialTarget': target
});
};

// https://developers.google.com/analytics/devguides/collection/analyticsjs/custom-dims-mets
GoogleAnalyticsUniversalTracker.prototype.setDimension = function(index, value) {
sendToGa('set', 'dimension' + index, String(value));
};

function sendToGa() {
if (typeof window.ga === "function") {
ga.apply(window, arguments);
}
}

GOVUK.GoogleAnalyticsUniversalTracker = GoogleAnalyticsUniversalTracker;
})();
37 changes: 37 additions & 0 deletions govuk/public/javascripts/govuk/analytics/print-intent.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// Extension to monitor attempts to print pages.
(function () {
"use strict";

GOVUK.analyticsPlugins = GOVUK.analyticsPlugins || {};

GOVUK.analyticsPlugins.printIntent = function () {
var printAttempt = (function () {
GOVUK.analytics.trackEvent('Print Intent', document.location.pathname);
GOVUK.analytics.trackPageview('/print' + document.location.pathname);
});

// Most browsers
if (window.matchMedia) {
var mediaQueryList = window.matchMedia('print'),
mqlListenerCount = 0;
mediaQueryList.addListener(function (mql) {
if (!mql.matches && mqlListenerCount === 0) {
printAttempt();
mqlListenerCount++;
// If we try and print again within 3 seconds, don't log it
window.setTimeout(function () {
mqlListenerCount = 0;
// printing will be tracked again now
}, 3000);
}
});
}

// IE < 10
if (window.onafterprint) {
window.onafterprint = printAttempt;
}

};

}());
61 changes: 61 additions & 0 deletions govuk/public/javascripts/govuk/analytics/tracker.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
(function() {
"use strict";
window.GOVUK = window.GOVUK || {};

// For usage and initialisation see:
// https://github.com/alphagov/govuk_frontend_toolkit/blob/master/docs/analytics.md#create-an-analytics-tracker

var Tracker = function(config) {
this.universal = new GOVUK.GoogleAnalyticsUniversalTracker(config.universalId, config.cookieDomain);
this.classic = new GOVUK.GoogleAnalyticsClassicTracker(config.classicId, config.cookieDomain);
};

Tracker.load = function() {
GOVUK.GoogleAnalyticsClassicTracker.load();
GOVUK.GoogleAnalyticsUniversalTracker.load();
};

Tracker.prototype.trackPageview = function(path, title) {
this.classic.trackPageview(path);
this.universal.trackPageview(path, title);
};

/*
https://developers.google.com/analytics/devguides/collection/analyticsjs/events
options.label – Useful for categorizing events (eg nav buttons)
options.value – Values must be non-negative. Useful to pass counts
options.nonInteraction – Prevent event from impacting bounce rate
*/
Tracker.prototype.trackEvent = function(category, action, options) {
this.classic.trackEvent(category, action, options);
this.universal.trackEvent(category, action, options);
};

Tracker.prototype.trackShare = function(network) {
var target = location.pathname;
this.classic.trackSocial(network, 'share', target);
this.universal.trackSocial(network, 'share', target);
};

/*
Assumes that the index of the dimension is the same for both classic and universal.
Check this for your app before using this
*/
Tracker.prototype.setDimension = function(index, value, name, scope) {
var PAGE_LEVEL_SCOPE = 3;
scope = scope || PAGE_LEVEL_SCOPE;

if (typeof index !== "number") {
index = parseInt(index, 10);
}

if (typeof scope !== "number") {
scope = parseInt(scope, 10);
}

this.universal.setDimension(index, value);
this.classic.setCustomVariable(index, value, name, scope);
};

GOVUK.Tracker = Tracker;
})();
8 changes: 6 additions & 2 deletions govuk/public/sass/_css3.scss
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,17 @@
box-shadow: $shadow;
}

@mixin scale($x, $y) {
@mixin scale($x, $y, $transform-origin: 50% 50% 0) {
// $x and $y should be numeric values without units
-webkit-transform: scale($x, $y); // Still in use now, started at: Chrome 4.0, Safari 3.1, Mobile Safari 3.2, Android 2.1
-moz-transform: scale($x, $y); // Firefox 3.5 to 15.0
-ms-transform: scale($x, $y); // IE9 only
-o-transform: scale($x, $y); // Opera 10.5 to 12.0
transform: scale($x, $y);

-webkit-transform-origin: $transform-origin; // Chrome, Safari 3.1
-moz-transform-origin: $transform-origin; // Firefox 10 to 15.0
-ms-transform-origin: $transform-origin; // IE9
transform-origin: $transform-origin;
}

@mixin translate($x, $y) {
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
"consolidate": "^0.10.0",
"readdir": "0.0.6",
"node-sass": "^1.2.3",
"govuk_frontend_toolkit": "^3.1.0",
"govuk_frontend_toolkit": "^3.3.0",
"govuk_template_mustache": "^0.12.0",
"grunt": "^0.4.2",
"grunt-contrib-clean": "^0.5.0",
Expand Down

0 comments on commit e850cc1

Please sign in to comment.