angular-google-analytics
Advanced tools
Comparing version 0.0.17 to 0.0.18
@@ -5,3 +5,3 @@ { | ||
"description": "Easy Analytics for your AngularJS application", | ||
"version": "0.0.17", | ||
"version": "0.0.18", | ||
"homepage": "https://github.com/revolunet/angular-google-analytics", | ||
@@ -8,0 +8,0 @@ "repository": { |
/** | ||
* Angular Google Analytics - Easy tracking for your AngularJS application | ||
* @version v0.0.17 - 2015-07-09 | ||
* @version v0.0.18 - 2015-07-29 | ||
* @link http://github.com/revolunet/angular-google-analytics | ||
@@ -8,928 +8,916 @@ * @author Julien Bouquillon <julien@revolunet.com> | ||
*/ | ||
'use strict'; | ||
(function (window, document, angular, undefined) { | ||
'use strict'; | ||
angular.module('angular-google-analytics', []) | ||
.provider('Analytics', function () { | ||
var created = false, | ||
trackRoutes = true, | ||
accountId, | ||
displayFeatures, | ||
trackPrefix = '', | ||
domainName, | ||
analyticsJS = false, | ||
pageEvent = '$routeChangeSuccess', | ||
cookieConfig = 'auto', | ||
ecommerce = false, | ||
enhancedEcommerce = false, | ||
enhancedLinkAttribution = false, | ||
removeRegExp, | ||
experimentId, | ||
ignoreFirstPageLoad = false, | ||
crossDomainLinker = false, | ||
crossLinkDomains, | ||
linkerConfig = {'allowLinker': true}, | ||
trackUrlParams = false, | ||
delayScriptTag = false; | ||
angular.module('angular-google-analytics', []) | ||
.provider('Analytics', function () { | ||
var created = false, | ||
trackRoutes = true, | ||
accountId, | ||
displayFeatures, | ||
trackPrefix = '', | ||
domainName, | ||
analyticsJS = false, | ||
pageEvent = '$routeChangeSuccess', | ||
cookieConfig = 'auto', | ||
ecommerce = false, | ||
enhancedEcommerce = false, | ||
enhancedLinkAttribution = false, | ||
removeRegExp, | ||
experimentId, | ||
ignoreFirstPageLoad = false, | ||
crossDomainLinker = false, | ||
crossLinkDomains, | ||
linkerConfig = {'allowLinker': true}, | ||
trackUrlParams = false, | ||
delayScriptTag = false; | ||
this._logs = []; | ||
this._logs = []; | ||
// config methods | ||
this.setAccount = function (id) { | ||
accountId = id; | ||
return true; | ||
}; | ||
// config methods | ||
this.setAccount = function (id) { | ||
accountId = id; | ||
return true; | ||
}; | ||
this.trackPages = function (doTrack) { | ||
trackRoutes = doTrack; | ||
return true; | ||
}; | ||
this.trackPages = function (doTrack) { | ||
trackRoutes = doTrack; | ||
return true; | ||
}; | ||
this.trackPrefix = function (prefix) { | ||
trackPrefix = prefix; | ||
return true; | ||
}; | ||
this.trackPrefix = function (prefix) { | ||
trackPrefix = prefix; | ||
return true; | ||
}; | ||
this.setDomainName = function (domain) { | ||
domainName = domain; | ||
return true; | ||
}; | ||
this.setDomainName = function (domain) { | ||
domainName = domain; | ||
return true; | ||
}; | ||
this.useDisplayFeatures = function (val) { | ||
displayFeatures = !!val; | ||
return true; | ||
}; | ||
this.useDisplayFeatures = function (val) { | ||
displayFeatures = !!val; | ||
return true; | ||
}; | ||
this.useAnalytics = function (val) { | ||
analyticsJS = !!val; | ||
return true; | ||
}; | ||
this.useAnalytics = function (val) { | ||
analyticsJS = !!val; | ||
return true; | ||
}; | ||
this.useEnhancedLinkAttribution = function (val) { | ||
enhancedLinkAttribution = !!val; | ||
return true; | ||
}; | ||
this.useEnhancedLinkAttribution = function (val) { | ||
enhancedLinkAttribution = !!val; | ||
return true; | ||
}; | ||
this.useCrossDomainLinker = function (val) { | ||
crossDomainLinker = !!val; | ||
return true; | ||
}; | ||
this.useCrossDomainLinker = function (val) { | ||
crossDomainLinker = !!val; | ||
return true; | ||
}; | ||
this.setCrossLinkDomains = function (domains) { | ||
crossLinkDomains = domains; | ||
return true; | ||
}; | ||
this.setCrossLinkDomains = function (domains) { | ||
crossLinkDomains = domains; | ||
return true; | ||
}; | ||
this.setPageEvent = function (name) { | ||
pageEvent = name; | ||
return true; | ||
}; | ||
this.setPageEvent = function (name) { | ||
pageEvent = name; | ||
return true; | ||
}; | ||
this.setCookieConfig = function (config) { | ||
cookieConfig = config; | ||
return true; | ||
}; | ||
this.setCookieConfig = function (config) { | ||
cookieConfig = config; | ||
return true; | ||
}; | ||
this.useECommerce = function (val, enhanced) { | ||
ecommerce = !!val; | ||
enhancedEcommerce = !!enhanced; | ||
return true; | ||
}; | ||
this.useECommerce = function (val, enhanced) { | ||
ecommerce = !!val; | ||
enhancedEcommerce = !!enhanced; | ||
return true; | ||
}; | ||
this.setRemoveRegExp = function (regex) { | ||
if (regex instanceof RegExp) { | ||
removeRegExp = regex; | ||
return true; | ||
} | ||
return false; | ||
}; | ||
this.setRemoveRegExp = function (regex) { | ||
if (regex instanceof RegExp) { | ||
removeRegExp = regex; | ||
this.setExperimentId = function (id) { | ||
experimentId = id; | ||
return true; | ||
} | ||
return false; | ||
}; | ||
}; | ||
this.setExperimentId = function (id) { | ||
experimentId = id; | ||
return true; | ||
}; | ||
this.ignoreFirstPageLoad = function (val) { | ||
ignoreFirstPageLoad = !!val; | ||
return true; | ||
}; | ||
this.ignoreFirstPageLoad = function (val) { | ||
ignoreFirstPageLoad = !!val; | ||
return true; | ||
}; | ||
this.trackUrlParams = function (val) { | ||
trackUrlParams = !!val; | ||
return true; | ||
}; | ||
this.trackUrlParams = function (val) { | ||
trackUrlParams = !!val; | ||
return true; | ||
}; | ||
this.delayScriptTag = function (val) { | ||
delayScriptTag = !!val; | ||
return true; | ||
}; | ||
this.delayScriptTag = function (val) { | ||
delayScriptTag = !!val; | ||
return true; | ||
}; | ||
/** | ||
* Public Service | ||
*/ | ||
this.$get = ['$document', '$location', '$log', '$rootScope', '$window', function ($document, $location, $log, $rootScope, $window) { | ||
var me = this; | ||
/** | ||
* Public Service | ||
*/ | ||
this.$get = ['$document', '$location', '$log', '$rootScope', '$window', function ($document, $location, $log, $rootScope, $window) { | ||
var me = this; | ||
var getUrl = function () { | ||
var url = trackUrlParams ? $location.url() : $location.path(); | ||
return removeRegExp ? url.replace(removeRegExp, '') : url; | ||
}; | ||
var getUtmParams = function () { | ||
var utmToCampaignVar = { | ||
utm_source: 'campaignSource', | ||
utm_medium: 'campaignMedium', | ||
utm_term: 'campaignTerm', | ||
utm_content: 'campaignContent', | ||
utm_campaign: 'campaignName' | ||
var getUrl = function () { | ||
var url = trackUrlParams ? $location.url() : $location.path(); | ||
return removeRegExp ? url.replace(removeRegExp, '') : url; | ||
}; | ||
var object = {}; | ||
angular.forEach($location.search(), function (value, key) { | ||
var campaignVar = utmToCampaignVar[key]; | ||
var getUtmParams = function () { | ||
var utmToCampaignVar = { | ||
utm_source: 'campaignSource', | ||
utm_medium: 'campaignMedium', | ||
utm_term: 'campaignTerm', | ||
utm_content: 'campaignContent', | ||
utm_campaign: 'campaignName' | ||
}; | ||
var object = {}; | ||
if (angular.isDefined(campaignVar)) { | ||
object[campaignVar] = value; | ||
} | ||
angular.forEach($location.search(), function (value, key) { | ||
var campaignVar = utmToCampaignVar[key]; | ||
}); | ||
if (angular.isDefined(campaignVar)) { | ||
object[campaignVar] = value; | ||
} | ||
return object; | ||
}; | ||
}); | ||
/** | ||
* Private Methods | ||
*/ | ||
return object; | ||
}; | ||
function _gaJs(fn) { | ||
if (!analyticsJS && $window._gaq && typeof fn === 'function') { | ||
fn(); | ||
} | ||
} | ||
/** | ||
* Private Methods | ||
*/ | ||
function _analyticsJs(fn) { | ||
if (analyticsJS && $window.ga && typeof fn === 'function') { | ||
fn(); | ||
function _gaJs(fn) { | ||
if (!analyticsJS && $window._gaq && typeof fn === 'function') { | ||
fn(); | ||
} | ||
} | ||
} | ||
function _generateCommandName(commandName, config) { | ||
if (!angular.isUndefined(config) && 'name' in config && config.name) { | ||
return config.name + '.' + commandName; | ||
} else { | ||
return commandName; | ||
} | ||
} | ||
function _checkOption(key, config) { | ||
return key in config && config[key]; | ||
} | ||
this._log = function () { | ||
if (arguments.length > 0) { | ||
if (arguments.length > 1 && arguments[0] === 'warn') { | ||
$log.warn(Array.prototype.slice.call(arguments, 1)); | ||
function _analyticsJs(fn) { | ||
if (analyticsJS && $window.ga && typeof fn === 'function') { | ||
fn(); | ||
} | ||
// console.log('analytics', arguments); | ||
this._logs.push(arguments); | ||
} | ||
}; | ||
this._createScriptTag = function () { | ||
if (!accountId) { | ||
me._log('warn', 'No account id set to create script tag'); | ||
return; | ||
} | ||
if (created) { | ||
me._log('warn', 'Script tag already created'); | ||
return; | ||
} | ||
// inject the google analytics tag | ||
$window._gaq = []; | ||
$window._gaq.push(['_setAccount', accountId]); | ||
if(domainName) { | ||
$window._gaq.push(['_setDomainName', domainName]); | ||
} | ||
if (enhancedLinkAttribution) { | ||
$window._gaq.push(['_require', 'inpage_linkid', '//www.google-analytics.com/plugins/ga/inpage_linkid.js']); | ||
} | ||
if (trackRoutes && !ignoreFirstPageLoad) { | ||
if (removeRegExp) { | ||
$window._gaq.push(['_trackPageview', getUrl()]); | ||
function _generateCommandName(commandName, config) { | ||
if (!angular.isUndefined(config) && 'name' in config && config.name) { | ||
return config.name + '.' + commandName; | ||
} else { | ||
$window._gaq.push(['_trackPageview']); | ||
return commandName; | ||
} | ||
} | ||
var gaSrc; | ||
if (displayFeatures) { | ||
gaSrc = ('https:' === document.location.protocol ? 'https://' : 'http://') + 'stats.g.doubleclick.net/dc.js'; | ||
} else { | ||
gaSrc = ('https:' === document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; | ||
} | ||
(function () { | ||
var document = $document[0]; | ||
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; | ||
ga.src = gaSrc; | ||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); | ||
})(gaSrc); | ||
return created = true; | ||
}; | ||
this._createAnalyticsScriptTag = function () { | ||
if (!accountId) { | ||
me._log('warn', 'No account id set to create analytics script tag'); | ||
return; | ||
function _checkOption(key, config) { | ||
return key in config && config[key]; | ||
} | ||
if (created) { | ||
me._log('warn', 'Analytics script tag already created'); | ||
return; | ||
} | ||
// inject the google analytics tag | ||
(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'); | ||
if (angular.isArray(accountId)) { | ||
accountId.forEach(function (trackerObj) { | ||
var _cookieConfig = 'cookieConfig' in trackerObj ? trackerObj.cookieConfig : cookieConfig; | ||
var options; | ||
if (_checkOption('crossDomainLinker', trackerObj)) { | ||
trackerObj.allowLinker = trackerObj.crossDomainLinker; | ||
this._log = function () { | ||
if (arguments.length > 0) { | ||
if (arguments.length > 1 && arguments[0] === 'warn') { | ||
$log.warn(Array.prototype.slice.call(arguments, 1)); | ||
} | ||
angular.forEach(['name', 'allowLinker'], function(key) { | ||
if (key in trackerObj) { | ||
if (angular.isUndefined(options)) { | ||
options = {}; | ||
} | ||
options[key] = trackerObj[key]; | ||
} | ||
}); | ||
if (angular.isUndefined(options)) { | ||
$window.ga('create', trackerObj.tracker, _cookieConfig); | ||
} else { | ||
$window.ga('create', trackerObj.tracker, _cookieConfig, options); | ||
} | ||
if (options && 'allowLinker' in options && options.allowLinker) { | ||
$window.ga(_generateCommandName('require', trackerObj), 'linker'); | ||
if (_checkOption('crossLinkDomains', trackerObj)) { | ||
$window.ga(_generateCommandName('linker:autoLink', trackerObj), trackerObj.crossLinkDomains); | ||
} | ||
} | ||
}); | ||
} else if (crossDomainLinker) { | ||
$window.ga('create', accountId, cookieConfig, linkerConfig); | ||
$window.ga('require', 'linker'); | ||
if(crossLinkDomains) { | ||
$window.ga('linker:autoLink', crossLinkDomains ); | ||
// console.log('analytics', arguments); | ||
this._logs.push(arguments); | ||
} | ||
} else { | ||
$window.ga('create', accountId, cookieConfig); | ||
} | ||
}; | ||
if (displayFeatures) { | ||
$window.ga('require', 'displayfeatures'); | ||
} | ||
this._createScriptTag = function () { | ||
if (!accountId) { | ||
me._log('warn', 'No account id set to create script tag'); | ||
return; | ||
} | ||
if (trackRoutes && !ignoreFirstPageLoad) { | ||
$window.ga('send', 'pageview', getUrl()); | ||
} | ||
if (created) { | ||
me._log('warn', 'Script tag already created'); | ||
return; | ||
} | ||
if ($window.ga) { | ||
if (ecommerce) { | ||
if (!enhancedEcommerce) { | ||
$window.ga('require', 'ecommerce', 'ecommerce.js'); | ||
// inject the google analytics tag | ||
$window._gaq = []; | ||
$window._gaq.push(['_setAccount', accountId]); | ||
if(domainName) { | ||
$window._gaq.push(['_setDomainName', domainName]); | ||
} | ||
if (enhancedLinkAttribution) { | ||
$window._gaq.push(['_require', 'inpage_linkid', '//www.google-analytics.com/plugins/ga/inpage_linkid.js']); | ||
} | ||
if (trackRoutes && !ignoreFirstPageLoad) { | ||
if (removeRegExp) { | ||
$window._gaq.push(['_trackPageview', getUrl()]); | ||
} else { | ||
$window.ga('require', 'ec', 'ec.js'); | ||
$window._gaq.push(['_trackPageview']); | ||
} | ||
} | ||
if (enhancedLinkAttribution) { | ||
$window.ga('require', 'linkid', 'linkid.js'); | ||
var gaSrc; | ||
if (displayFeatures) { | ||
gaSrc = ('https:' === document.location.protocol ? 'https://' : 'http://') + 'stats.g.doubleclick.net/dc.js'; | ||
} else { | ||
gaSrc = ('https:' === document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; | ||
} | ||
if (experimentId) { | ||
var expScript = document.createElement('script'), | ||
s = document.getElementsByTagName('script')[0]; | ||
expScript.src = "//www.google-analytics.com/cx/api.js?experiment=" + experimentId; | ||
s.parentNode.insertBefore(expScript, s); | ||
} | ||
} | ||
(function () { | ||
var document = $document[0]; | ||
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; | ||
ga.src = gaSrc; | ||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); | ||
})(gaSrc); | ||
return created = true; | ||
}; | ||
created = true; | ||
return true; | ||
}; | ||
this._ecommerceEnabled = function () { | ||
if (!ecommerce) { | ||
this._log('warn', 'ecommerce not set. Use AnalyticsProvider.setECommerce(true, false);'); | ||
return false; | ||
} else if (enhancedEcommerce) { | ||
this._log('warn', 'Enhanced ecommerce plugin is enabled. Only one plugin(ecommerce/ec) can be used at a time. ' + | ||
'Use AnalyticsProvider.setECommerce(true, false);'); | ||
return false; | ||
} | ||
return true; | ||
}; | ||
this._createAnalyticsScriptTag = function () { | ||
if (!accountId) { | ||
me._log('warn', 'No account id set to create analytics script tag'); | ||
return; | ||
} | ||
this._enhancedEcommerceEnabled = function () { | ||
if (!ecommerce) { | ||
this._log('warn', 'ecommerce not set. Use AnalyticsProvider.setECommerce(true, true);'); | ||
return false; | ||
} else if (!enhancedEcommerce) { | ||
this._log('warn', 'Enhanced ecommerce plugin is disabled. Use AnalyticsProvider.setECommerce(true, true);'); | ||
return false; | ||
} | ||
return true; | ||
}; | ||
/** | ||
* Track page | ||
https://developers.google.com/analytics/devguides/collection/gajs/ | ||
https://developers.google.com/analytics/devguides/collection/analyticsjs/pages | ||
* @param url | ||
* @param title | ||
* @param custom | ||
* @private | ||
*/ | ||
this._trackPage = function (url, title, custom) { | ||
var that = this, args = arguments; | ||
url = url ? url : getUrl(); | ||
title = title ? title : $document[0].title; | ||
_gaJs(function () { | ||
// http://stackoverflow.com/questions/7322288/how-can-i-set-a-page-title-with-google-analytics | ||
$window._gaq.push(["_set", "title", title]); | ||
$window._gaq.push(['_trackPageview', trackPrefix + url]); | ||
that._log('_trackPageview', url, title, args); | ||
}); | ||
_analyticsJs(function () { | ||
var opt_fieldObject = { | ||
'page': trackPrefix + url, | ||
'title': title | ||
}; | ||
angular.extend(opt_fieldObject, getUtmParams()); | ||
if (angular.isObject(custom)) { | ||
angular.extend(opt_fieldObject, custom); | ||
if (created) { | ||
me._log('warn', 'Analytics script tag already created'); | ||
return; | ||
} | ||
if (angular.isArray(accountId)) { | ||
accountId.forEach(function (trackerObj) { | ||
$window.ga(_generateCommandName('send', trackerObj), 'pageview', opt_fieldObject); | ||
}); | ||
} else { | ||
$window.ga('send', 'pageview', opt_fieldObject); | ||
} | ||
that._log('pageview', url, title, args); | ||
}); | ||
}; | ||
/** | ||
* Track event | ||
https://developers.google.com/analytics/devguides/collection/gajs/eventTrackerGuide | ||
https://developers.google.com/analytics/devguides/collection/analyticsjs/events | ||
* @param category | ||
* @param action | ||
* @param label | ||
* @param value | ||
* @param noninteraction | ||
* @param custom | ||
* @private | ||
*/ | ||
this._trackEvent = function (category, action, label, value, noninteraction, custom) { | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_trackEvent', category, action, label, value, !!noninteraction]); | ||
that._log('trackEvent', args); | ||
}); | ||
_analyticsJs(function () { | ||
var opt_fieldObject = {}; | ||
if (angular.isDefined(noninteraction)) { | ||
opt_fieldObject['nonInteraction'] = !!noninteraction; | ||
} | ||
if (angular.isObject(custom)) { | ||
angular.extend(opt_fieldObject, custom); | ||
} | ||
// inject the google analytics tag | ||
(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'); | ||
if (angular.isArray(accountId)) { | ||
accountId.forEach(function (trackerObj) { | ||
if (_checkOption('trackEvent', trackerObj)) { | ||
$window.ga(_generateCommandName('send', trackerObj), 'event', category, action, label, value, opt_fieldObject); | ||
var _cookieConfig = 'cookieConfig' in trackerObj ? trackerObj.cookieConfig : cookieConfig; | ||
var options; | ||
if (_checkOption('crossDomainLinker', trackerObj)) { | ||
trackerObj.allowLinker = trackerObj.crossDomainLinker; | ||
} | ||
angular.forEach(['name', 'allowLinker'], function(key) { | ||
if (key in trackerObj) { | ||
if (angular.isUndefined(options)) { | ||
options = {}; | ||
} | ||
options[key] = trackerObj[key]; | ||
} | ||
}); | ||
if (angular.isUndefined(options)) { | ||
$window.ga('create', trackerObj.tracker, _cookieConfig); | ||
} else { | ||
$window.ga('create', trackerObj.tracker, _cookieConfig, options); | ||
} | ||
if (options && 'allowLinker' in options && options.allowLinker) { | ||
$window.ga(_generateCommandName('require', trackerObj), 'linker'); | ||
if (_checkOption('crossLinkDomains', trackerObj)) { | ||
$window.ga(_generateCommandName('linker:autoLink', trackerObj), trackerObj.crossLinkDomains); | ||
} | ||
} | ||
}); | ||
} else if (crossDomainLinker) { | ||
$window.ga('create', accountId, cookieConfig, linkerConfig); | ||
$window.ga('require', 'linker'); | ||
if(crossLinkDomains) { | ||
$window.ga('linker:autoLink', crossLinkDomains ); | ||
} | ||
} else { | ||
$window.ga('send', 'event', category, action, label, value, opt_fieldObject); | ||
$window.ga('create', accountId, cookieConfig); | ||
} | ||
that._log('event', args); | ||
}); | ||
}; | ||
/** | ||
* Add transaction | ||
* https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiEcommerce#_gat.GA_Tracker_._addTrans | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce#addTrans | ||
* @param transactionId | ||
* @param affiliation | ||
* @param total | ||
* @param tax | ||
* @param shipping | ||
* @param city | ||
* @param state | ||
* @param country | ||
* @private | ||
*/ | ||
this._addTrans = function (transactionId, affiliation, total, tax, shipping, city, state, country, currency) { | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_addTrans', transactionId, affiliation, total, tax, shipping, city, state, country]); | ||
that._log('_addTrans', args); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._ecommerceEnabled()) { | ||
$window.ga('ecommerce:addTransaction', { | ||
id: transactionId, | ||
affiliation: affiliation, | ||
revenue: total, | ||
tax: tax, | ||
shipping: shipping, | ||
currency: currency || 'USD' | ||
}); | ||
that._log('ecommerce:addTransaction', args); | ||
if (displayFeatures) { | ||
$window.ga('require', 'displayfeatures'); | ||
} | ||
}); | ||
}; | ||
/** | ||
* Add item to transaction | ||
* https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiEcommerce#_gat.GA_Tracker_._addItem | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce#addItem | ||
* @param transactionId | ||
* @param sku | ||
* @param name | ||
* @param category | ||
* @param price | ||
* @param quantity | ||
* @private | ||
*/ | ||
this._addItem = function (transactionId, sku, name, category, price, quantity) { | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_addItem', transactionId, sku, name, category, price, quantity]); | ||
that._log('_addItem', args); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._ecommerceEnabled()) { | ||
$window.ga('ecommerce:addItem', { | ||
id: transactionId, | ||
name: name, | ||
sku: sku, | ||
category: category, | ||
price: price, | ||
quantity: quantity | ||
}); | ||
that._log('ecommerce:addItem', args); | ||
if (trackRoutes && !ignoreFirstPageLoad) { | ||
$window.ga('send', 'pageview', getUrl()); | ||
} | ||
}); | ||
}; | ||
/** | ||
* Track transaction | ||
* https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiEcommerce#_gat.GA_Tracker_._trackTrans | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce#sendingData | ||
* @private | ||
*/ | ||
this._trackTrans = function () { | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_trackTrans']); | ||
that._log('_trackTrans', args); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._ecommerceEnabled()) { | ||
$window.ga('ecommerce:send'); | ||
that._log('ecommerce:send', args); | ||
if ($window.ga) { | ||
if (ecommerce) { | ||
if (!enhancedEcommerce) { | ||
$window.ga('require', 'ecommerce', 'ecommerce.js'); | ||
} else { | ||
$window.ga('require', 'ec', 'ec.js'); | ||
} | ||
} | ||
if (enhancedLinkAttribution) { | ||
$window.ga('require', 'linkid', 'linkid.js'); | ||
} | ||
if (experimentId) { | ||
var expScript = document.createElement('script'), | ||
s = document.getElementsByTagName('script')[0]; | ||
expScript.src = "//www.google-analytics.com/cx/api.js?experiment=" + experimentId; | ||
s.parentNode.insertBefore(expScript, s); | ||
} | ||
} | ||
}); | ||
}; | ||
/** | ||
* Clear transaction | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce#clearingData | ||
* @private | ||
*/ | ||
this._clearTrans = function () { | ||
var that = this, args = arguments; | ||
_analyticsJs(function () { | ||
if (that._ecommerceEnabled()) { | ||
$window.ga('ecommerce:clear'); | ||
that._log('ecommerce:clear', args); | ||
} | ||
}); | ||
}; | ||
created = true; | ||
return true; | ||
}; | ||
/** | ||
* Enhanced Ecommerce | ||
*/ | ||
this._ecommerceEnabled = function () { | ||
return ecommerce && !enhancedEcommerce; | ||
}; | ||
/** | ||
* Add product data | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#product-data | ||
* @param productId | ||
* @param name | ||
* @param category | ||
* @param brand | ||
* @param variant | ||
* @param price | ||
* @param quantity | ||
* @param coupon | ||
* @param position | ||
*/ | ||
this._addProduct = function (productId, name, category, brand, variant, price, quantity, coupon, position) { | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_addProduct', productId, name, category, brand, variant, price, quantity, coupon, position]); | ||
that._log('_addProduct', args); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._enhancedEcommerceEnabled()) { | ||
$window.ga('ec:addProduct', { | ||
id: productId, | ||
name: name, | ||
category: category, | ||
brand: brand, | ||
variant: variant, | ||
price: price, | ||
quantity: quantity, | ||
coupon: coupon, | ||
position: position | ||
}); | ||
that._log('ec:addProduct', args); | ||
} | ||
}); | ||
}; | ||
this._enhancedEcommerceEnabled = function () { | ||
return ecommerce && enhancedEcommerce; | ||
}; | ||
/** | ||
* Add Impression data | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#impression-data | ||
* @param id | ||
* @param name | ||
* @param list | ||
* @param brand | ||
* @param category | ||
* @param variant | ||
* @param position | ||
* @param price | ||
*/ | ||
this._addImpression = function (id, name, list, brand, category, variant, position, price){ | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_addImpression', id, name, list, brand, category, variant, position, price]); | ||
that._log('_addImpression', args); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._enhancedEcommerceEnabled()) { | ||
$window.ga('ec:addImpression', { | ||
id: id, | ||
name: name, | ||
category: category, | ||
brand: brand, | ||
variant: variant, | ||
list: list, | ||
position: position, | ||
price: price | ||
}); | ||
} | ||
that._log('ec:addImpression', args); | ||
}); | ||
}; | ||
/** | ||
* Track page | ||
https://developers.google.com/analytics/devguides/collection/gajs/ | ||
https://developers.google.com/analytics/devguides/collection/analyticsjs/pages | ||
* @param url | ||
* @param title | ||
* @param custom | ||
* @private | ||
*/ | ||
this._trackPage = function (url, title, custom) { | ||
var that = this, args = arguments; | ||
url = url ? url : getUrl(); | ||
title = title ? title : $document[0].title; | ||
_gaJs(function () { | ||
// http://stackoverflow.com/questions/7322288/how-can-i-set-a-page-title-with-google-analytics | ||
$window._gaq.push(["_set", "title", title]); | ||
$window._gaq.push(['_trackPageview', trackPrefix + url]); | ||
that._log('_trackPageview', url, title, args); | ||
}); | ||
_analyticsJs(function () { | ||
var opt_fieldObject = { | ||
'page': trackPrefix + url, | ||
'title': title | ||
}; | ||
angular.extend(opt_fieldObject, getUtmParams()); | ||
if (angular.isObject(custom)) { | ||
angular.extend(opt_fieldObject, custom); | ||
} | ||
if (angular.isArray(accountId)) { | ||
accountId.forEach(function (trackerObj) { | ||
$window.ga(_generateCommandName('send', trackerObj), 'pageview', opt_fieldObject); | ||
}); | ||
} else { | ||
$window.ga('send', 'pageview', opt_fieldObject); | ||
} | ||
that._log('pageview', url, title, args); | ||
}); | ||
}; | ||
/** | ||
* Add promo data | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce | ||
* @param productId | ||
* @param name | ||
* @param creative | ||
* @param position | ||
*/ | ||
this._addPromo = function (productId, name, creative, position) { | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_addPromo', productId, name, creative, position]); | ||
that._log('_addPromo', arguments); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._enhancedEcommerceEnabled()) { | ||
$window.ga('ec:addPromo', { | ||
id: productId, | ||
name: name, | ||
creative: creative, | ||
position: position | ||
}); | ||
that._log('ec:addPromo', args); | ||
} | ||
}); | ||
}; | ||
/** | ||
* Track event | ||
https://developers.google.com/analytics/devguides/collection/gajs/eventTrackerGuide | ||
https://developers.google.com/analytics/devguides/collection/analyticsjs/events | ||
* @param category | ||
* @param action | ||
* @param label | ||
* @param value | ||
* @param noninteraction | ||
* @param custom | ||
* @private | ||
*/ | ||
this._trackEvent = function (category, action, label, value, noninteraction, custom) { | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_trackEvent', category, action, label, value, !!noninteraction]); | ||
that._log('trackEvent', args); | ||
}); | ||
_analyticsJs(function () { | ||
var opt_fieldObject = {}; | ||
if (angular.isDefined(noninteraction)) { | ||
opt_fieldObject.nonInteraction = !!noninteraction; | ||
} | ||
if (angular.isObject(custom)) { | ||
angular.extend(opt_fieldObject, custom); | ||
} | ||
if (angular.isArray(accountId)) { | ||
accountId.forEach(function (trackerObj) { | ||
if (_checkOption('trackEvent', trackerObj)) { | ||
$window.ga(_generateCommandName('send', trackerObj), 'event', category, action, label, value, opt_fieldObject); | ||
} | ||
}); | ||
} else { | ||
$window.ga('send', 'event', category, action, label, value, opt_fieldObject); | ||
} | ||
that._log('event', args); | ||
}); | ||
}; | ||
/** | ||
* get ActionFieldObject | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#action-data | ||
* @param id | ||
* @param affliation | ||
* @param revenue | ||
* @param tax | ||
* @param shipping | ||
* @param coupon | ||
* @param list | ||
* @param step | ||
* @param option | ||
*/ | ||
this._getActionFieldObject = function (id, affiliation, revenue, tax, shipping, coupon, list, step, option) { | ||
var obj = {}; | ||
if (id) { obj.id = id; } | ||
if (affiliation) { obj.affiliation = affiliation; } | ||
if (revenue) { obj.revenue = revenue; } | ||
if (tax) { obj.tax = tax; } | ||
if (shipping) { obj.shipping = shipping; } | ||
if (coupon) { obj.coupon = coupon; } | ||
if (list) { obj.list = list; } | ||
if (step) { obj.step = step; } | ||
if (option) { obj.option = option; } | ||
return obj; | ||
}; | ||
/** | ||
* Add transaction | ||
* https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiEcommerce#_gat.GA_Tracker_._addTrans | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce#addTrans | ||
* @param transactionId | ||
* @param affiliation | ||
* @param total | ||
* @param tax | ||
* @param shipping | ||
* @param city | ||
* @param state | ||
* @param country | ||
* @private | ||
*/ | ||
this._addTrans = function (transactionId, affiliation, total, tax, shipping, city, state, country, currency) { | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_addTrans', transactionId, affiliation, total, tax, shipping, city, state, country]); | ||
that._log('_addTrans', args); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._ecommerceEnabled()) { | ||
$window.ga('ecommerce:addTransaction', { | ||
id: transactionId, | ||
affiliation: affiliation, | ||
revenue: total, | ||
tax: tax, | ||
shipping: shipping, | ||
currency: currency || 'USD' | ||
}); | ||
that._log('ecommerce:addTransaction', args); | ||
} | ||
}); | ||
}; | ||
/** | ||
* Set Action being performed | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-actions | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#action-types | ||
* @param action | ||
* @param name | ||
* @param obj | ||
*/ | ||
this._setAction = function (action, obj){ | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_setAction', action, obj]); | ||
that._log('__setAction', args); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._enhancedEcommerceEnabled()) { | ||
$window.ga('ec:setAction', action, obj); | ||
that._log('ec:setAction', args); | ||
} | ||
}); | ||
}; | ||
/** | ||
* Add item to transaction | ||
* https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiEcommerce#_gat.GA_Tracker_._addItem | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce#addItem | ||
* @param transactionId | ||
* @param sku | ||
* @param name | ||
* @param category | ||
* @param price | ||
* @param quantity | ||
* @private | ||
*/ | ||
this._addItem = function (transactionId, sku, name, category, price, quantity) { | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_addItem', transactionId, sku, name, category, price, quantity]); | ||
that._log('_addItem', args); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._ecommerceEnabled()) { | ||
$window.ga('ecommerce:addItem', { | ||
id: transactionId, | ||
name: name, | ||
sku: sku, | ||
category: category, | ||
price: price, | ||
quantity: quantity | ||
}); | ||
that._log('ecommerce:addItem', args); | ||
} | ||
}); | ||
}; | ||
/** | ||
* Track Transaction | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-transactions | ||
* @param transactionId | ||
* @param affiliation | ||
* @param revenue | ||
* @param tax | ||
* @param shipping | ||
* @param coupon | ||
* @param list | ||
* @param step | ||
* @param option | ||
*/ | ||
this._trackTransaction = function (transactionId, affiliation, revenue, tax, shipping, coupon, list, step, option) { | ||
this._setAction('purchase', this._getActionFieldObject(transactionId, affiliation, revenue, tax, shipping, coupon, list, step, option)); | ||
}; | ||
/** | ||
* Track transaction | ||
* https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiEcommerce#_gat.GA_Tracker_._trackTrans | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce#sendingData | ||
* @private | ||
*/ | ||
this._trackTrans = function () { | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_trackTrans']); | ||
that._log('_trackTrans', args); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._ecommerceEnabled()) { | ||
$window.ga('ecommerce:send'); | ||
that._log('ecommerce:send', args); | ||
} | ||
}); | ||
}; | ||
/** | ||
* Track Refund | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-refunds | ||
* @param transactionId | ||
* | ||
*/ | ||
this._trackRefund = function (transactionId) { | ||
this._setAction('refund', this._getActionFieldObject(transactionId)); | ||
}; | ||
/** | ||
* Clear transaction | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce#clearingData | ||
* @private | ||
*/ | ||
this._clearTrans = function () { | ||
var that = this, args = arguments; | ||
_analyticsJs(function () { | ||
if (that._ecommerceEnabled()) { | ||
$window.ga('ecommerce:clear'); | ||
that._log('ecommerce:clear', args); | ||
} | ||
}); | ||
}; | ||
/** | ||
* Track Checkout | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-checkout | ||
* @param step | ||
* @param option | ||
* | ||
*/ | ||
this._trackCheckOut = function (step, option) { | ||
this._setAction('checkout', this._getActionFieldObject(null, null, null, null, null, null, null, step, option)); | ||
}; | ||
/** | ||
* Enhanced Ecommerce | ||
*/ | ||
/** | ||
* Track add/remove to cart | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#add-remove-cart | ||
* @param action | ||
* | ||
*/ | ||
this._trackCart = function (action) { | ||
if (['add', 'remove'].indexOf(action) !== -1) { | ||
this._setAction(action); | ||
this._send('event', 'UX', 'click', action + ' to cart'); | ||
} | ||
}; | ||
/** | ||
* Add product data | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#product-data | ||
* @param productId | ||
* @param name | ||
* @param category | ||
* @param brand | ||
* @param variant | ||
* @param price | ||
* @param quantity | ||
* @param coupon | ||
* @param position | ||
*/ | ||
this._addProduct = function (productId, name, category, brand, variant, price, quantity, coupon, position) { | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_addProduct', productId, name, category, brand, variant, price, quantity, coupon, position]); | ||
that._log('_addProduct', args); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._enhancedEcommerceEnabled()) { | ||
$window.ga('ec:addProduct', { | ||
id: productId, | ||
name: name, | ||
category: category, | ||
brand: brand, | ||
variant: variant, | ||
price: price, | ||
quantity: quantity, | ||
coupon: coupon, | ||
position: position | ||
}); | ||
that._log('ec:addProduct', args); | ||
} | ||
}); | ||
}; | ||
/** | ||
* Track promo click | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-promo-clicks | ||
* @param promotionName | ||
* | ||
*/ | ||
this._promoClick = function (promotionName) { | ||
this._setAction('promo_click'); | ||
this._send('event', 'Internal Promotions', 'click', promotionName); | ||
}; | ||
/** | ||
* Add Impression data | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#impression-data | ||
* @param id | ||
* @param name | ||
* @param list | ||
* @param brand | ||
* @param category | ||
* @param variant | ||
* @param position | ||
* @param price | ||
*/ | ||
this._addImpression = function (id, name, list, brand, category, variant, position, price){ | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_addImpression', id, name, list, brand, category, variant, position, price]); | ||
that._log('_addImpression', args); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._enhancedEcommerceEnabled()) { | ||
$window.ga('ec:addImpression', { | ||
id: id, | ||
name: name, | ||
category: category, | ||
brand: brand, | ||
variant: variant, | ||
list: list, | ||
position: position, | ||
price: price | ||
}); | ||
that._log('ec:addImpression', args); | ||
} | ||
}); | ||
}; | ||
/** | ||
* Track product click | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-promo-clicks | ||
* @param promotionName | ||
* | ||
*/ | ||
this._productClick = function (listName) { | ||
this._setAction('click', this._getActionFieldObject(null, null, null, null, null, null, listName, null, null)); | ||
this._send('event', 'UX', 'click', listName); | ||
}; | ||
/** | ||
* Add promo data | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce | ||
* @param productId | ||
* @param name | ||
* @param creative | ||
* @param position | ||
*/ | ||
this._addPromo = function (productId, name, creative, position) { | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_addPromo', productId, name, creative, position]); | ||
that._log('_addPromo', arguments); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._enhancedEcommerceEnabled()) { | ||
$window.ga('ec:addPromo', { | ||
id: productId, | ||
name: name, | ||
creative: creative, | ||
position: position | ||
}); | ||
that._log('ec:addPromo', args); | ||
} | ||
}); | ||
}; | ||
/** | ||
* Send custom events | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/user-timings#implementation | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/social-interactions#implementation | ||
* | ||
* @param obj | ||
* @private | ||
*/ | ||
this._send = function () { | ||
var that = this; | ||
var args = Array.prototype.slice.call(arguments); | ||
args.unshift('send'); | ||
_analyticsJs(function () { | ||
$window.ga.apply(this, args); | ||
that._log(args); | ||
}); | ||
}; | ||
/** | ||
* get ActionFieldObject | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#action-data | ||
* @param id | ||
* @param affliation | ||
* @param revenue | ||
* @param tax | ||
* @param shipping | ||
* @param coupon | ||
* @param list | ||
* @param step | ||
* @param option | ||
*/ | ||
this._getActionFieldObject = function (id, affiliation, revenue, tax, shipping, coupon, list, step, option) { | ||
var obj = {}; | ||
if (id) { obj.id = id; } | ||
if (affiliation) { obj.affiliation = affiliation; } | ||
if (revenue) { obj.revenue = revenue; } | ||
if (tax) { obj.tax = tax; } | ||
if (shipping) { obj.shipping = shipping; } | ||
if (coupon) { obj.coupon = coupon; } | ||
if (list) { obj.list = list; } | ||
if (step) { obj.step = step; } | ||
if (option) { obj.option = option; } | ||
return obj; | ||
}; | ||
this._pageView = function() { | ||
this._send('pageview'); | ||
}; | ||
/** | ||
* Set Action being performed | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-actions | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#action-types | ||
* @param action | ||
* @param name | ||
* @param obj | ||
*/ | ||
this._setAction = function (action, obj){ | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_setAction', action, obj]); | ||
that._log('__setAction', args); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._enhancedEcommerceEnabled()) { | ||
$window.ga('ec:setAction', action, obj); | ||
that._log('ec:setAction', args); | ||
} | ||
}); | ||
}; | ||
/** | ||
* Set custom dimensions, metrics or experiment | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/custom-dims-mets | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#customs | ||
* @param name | ||
* @param value | ||
* @private | ||
*/ | ||
this._set = function (name, value) { | ||
var that = this; | ||
_analyticsJs(function () { | ||
$window.ga('set', name, value); | ||
that._log('set', name, value); | ||
}); | ||
}; | ||
/** | ||
* Track Transaction | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-transactions | ||
* @param transactionId | ||
* @param affiliation | ||
* @param revenue | ||
* @param tax | ||
* @param shipping | ||
* @param coupon | ||
* @param list | ||
* @param step | ||
* @param option | ||
*/ | ||
this._trackTransaction = function (transactionId, affiliation, revenue, tax, shipping, coupon, list, step, option) { | ||
this._setAction('purchase', this._getActionFieldObject(transactionId, affiliation, revenue, tax, shipping, coupon, list, step, option)); | ||
}; | ||
/** | ||
* Track Refund | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-refunds | ||
* @param transactionId | ||
* | ||
*/ | ||
this._trackRefund = function (transactionId) { | ||
this._setAction('refund', this._getActionFieldObject(transactionId)); | ||
}; | ||
// creates the ganalytics tracker | ||
if (!delayScriptTag) { | ||
if (analyticsJS) { | ||
this._createAnalyticsScriptTag(); | ||
} else { | ||
this._createScriptTag(); | ||
} | ||
} | ||
/** | ||
* Track Checkout | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-checkout | ||
* @param step | ||
* @param option | ||
* | ||
*/ | ||
this._trackCheckOut = function (step, option) { | ||
this._setAction('checkout', this._getActionFieldObject(null, null, null, null, null, null, null, step, option)); | ||
}; | ||
// activates page tracking | ||
if (trackRoutes) { | ||
$rootScope.$on(pageEvent, function () { | ||
me._trackPage(); | ||
}); | ||
} | ||
/** | ||
* Track add/remove to cart | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#add-remove-cart | ||
* @param action | ||
* | ||
*/ | ||
this._trackCart = function (action) { | ||
if (['add', 'remove'].indexOf(action) !== -1) { | ||
this._setAction(action); | ||
this._send('event', 'UX', 'click', action + ' to cart'); | ||
} | ||
}; | ||
/** | ||
* Track User Timings | ||
* @timingCategory (Required): A string for categorizing all user timing variables into logical groups(e.g jQuery). | ||
* @timingVar (Required): A string to identify the variable being recorded(e.g. JavaScript Load). | ||
* @timingValue (Required): The number of milliseconds in elapsed time to report to Google Analytics(e.g. 20). | ||
* @timingLabel (Not Required): A string that can be used to add flexibility in visualizing user timings in the reports(e.g. Google CDN). | ||
*/ | ||
this._trackTimings = function (timingCategory, timingVar, timingValue, timingLabel) { | ||
this._send('timing', timingCategory, timingVar, timingValue, timingLabel); | ||
}; | ||
/** | ||
* Track promo click | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-promo-clicks | ||
* @param promotionName | ||
* | ||
*/ | ||
this._promoClick = function (promotionName) { | ||
this._setAction('promo_click'); | ||
this._send('event', 'Internal Promotions', 'click', promotionName); | ||
}; | ||
return { | ||
_logs: me._logs, | ||
displayFeatures: displayFeatures, | ||
ecommerce: ecommerce, | ||
enhancedEcommerce: enhancedEcommerce, | ||
enhancedLinkAttribution: enhancedLinkAttribution, | ||
getUrl: getUrl, | ||
experimentId: experimentId, | ||
ignoreFirstPageLoad: ignoreFirstPageLoad, | ||
delayScriptTag: delayScriptTag, | ||
setCookieConfig: me._setCookieConfig, | ||
getCookieConfig: function () { | ||
return cookieConfig; | ||
}, | ||
createAnalyticsScriptTag: function (config) { | ||
if (config) { | ||
cookieConfig = config; | ||
} | ||
/** | ||
* Track product click | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-promo-clicks | ||
* @param promotionName | ||
* | ||
*/ | ||
this._productClick = function (listName) { | ||
this._setAction('click', this._getActionFieldObject(null, null, null, null, null, null, listName, null, null)); | ||
this._send('event', 'UX', 'click', listName); | ||
}; | ||
return me._createAnalyticsScriptTag(); | ||
}, | ||
createScriptTag: function (config) { | ||
if (config) { | ||
cookieConfig = config; | ||
/** | ||
* Send custom events | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/user-timings#implementation | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/social-interactions#implementation | ||
* | ||
* @param obj | ||
* @private | ||
*/ | ||
this._send = function () { | ||
var that = this; | ||
var args = Array.prototype.slice.call(arguments); | ||
args.unshift('send'); | ||
_analyticsJs(function () { | ||
$window.ga.apply(this, args); | ||
that._log(args); | ||
}); | ||
}; | ||
this._pageView = function() { | ||
this._send('pageview'); | ||
}; | ||
/** | ||
* Set custom dimensions, metrics or experiment | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/custom-dims-mets | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#customs | ||
* @param name | ||
* @param value | ||
* @private | ||
*/ | ||
this._set = function (name, value) { | ||
var that = this; | ||
_analyticsJs(function () { | ||
$window.ga('set', name, value); | ||
that._log('set', name, value); | ||
}); | ||
}; | ||
// creates the ganalytics tracker | ||
if (!delayScriptTag) { | ||
if (analyticsJS) { | ||
this._createAnalyticsScriptTag(); | ||
} else { | ||
this._createScriptTag(); | ||
} | ||
} | ||
return me._createScriptTag(); | ||
}, | ||
ecommerceEnabled: function () { | ||
return me._ecommerceEnabled(); | ||
}, | ||
enhancedEcommerceEnabled: function () { | ||
return me._enhancedEcommerceEnabled(); | ||
}, | ||
trackPage: function (url, title, custom) { | ||
me._trackPage(url, title, custom); | ||
}, | ||
trackEvent: function (category, action, label, value, noninteraction, custom) { | ||
me._trackEvent(category, action, label, value, noninteraction, custom); | ||
}, | ||
addTrans: function (transactionId, affiliation, total, tax, shipping, city, state, country, currency) { | ||
me._addTrans(transactionId, affiliation, total, tax, shipping, city, state, country, currency); | ||
}, | ||
addItem: function (transactionId, sku, name, category, price, quantity) { | ||
me._addItem(transactionId, sku, name, category, price, quantity); | ||
}, | ||
trackTrans: function () { | ||
me._trackTrans(); | ||
}, | ||
clearTrans: function () { | ||
me._clearTrans(); | ||
}, | ||
addProduct: function (productId, name, category, brand, variant, price, quantity, coupon, position) { | ||
me._addProduct(productId, name, category, brand, variant, price, quantity, coupon, position); | ||
}, | ||
addPromo: function (productId, name, creative, position) { | ||
me._addPromo(productId, name, creative, position); | ||
}, | ||
addImpression: function (productId, name, list, brand, category, variant, position, price) { | ||
me._addImpression(productId, name, list, brand, category, variant, position, price); | ||
}, | ||
productClick: function (listName) { | ||
me._productClick(listName); | ||
}, | ||
promoClick : function (promotionName) { | ||
me._promoClick(promotionName); | ||
}, | ||
trackDetail: function () { | ||
me._setAction('detail'); | ||
me._pageView(); | ||
}, | ||
trackCart: function (action) { | ||
me._trackCart(action); | ||
}, | ||
trackCheckout: function (step, option) { | ||
me._trackCheckOut(step, option); | ||
}, | ||
trackTimings: function (timingCategory, timingVar, timingValue, timingLabel) { | ||
me._trackTimings(timingCategory, timingVar, timingValue, timingLabel); | ||
}, | ||
trackTransaction: function (transactionId, affiliation, revenue, tax, shipping, coupon, list, step, option){ | ||
me._trackTransaction(transactionId, affiliation, revenue, tax, shipping, coupon, list, step, option); | ||
}, | ||
setAction: function (action, obj) { | ||
me._setAction(action, obj); | ||
}, | ||
send: function (obj) { | ||
me._send(obj); | ||
}, | ||
pageView: function () { | ||
me._pageView(); | ||
}, | ||
set: function (name, value) { | ||
me._set(name, value); | ||
// activates page tracking | ||
if (trackRoutes) { | ||
$rootScope.$on(pageEvent, function () { | ||
me._trackPage(); | ||
}); | ||
} | ||
}; | ||
}]; | ||
}) | ||
.directive('gaTrackEvent', ['Analytics', '$parse', function (Analytics, $parse) { | ||
return { | ||
restrict: 'A', | ||
link: function (scope, element, attrs) { | ||
var options = $parse(attrs.gaTrackEvent); | ||
element.bind('click', function () { | ||
if(attrs.gaTrackEventIf){ | ||
if(!scope.$eval(attrs.gaTrackEventIf)){ | ||
return; // Cancel this event if we don't pass the ga-track-event-if condition | ||
/** | ||
* Track User Timings | ||
* @timingCategory (Required): A string for categorizing all user timing variables into logical groups(e.g jQuery). | ||
* @timingVar (Required): A string to identify the variable being recorded(e.g. JavaScript Load). | ||
* @timingValue (Required): The number of milliseconds in elapsed time to report to Google Analytics(e.g. 20). | ||
* @timingLabel (Not Required): A string that can be used to add flexibility in visualizing user timings in the reports(e.g. Google CDN). | ||
*/ | ||
this._trackTimings = function (timingCategory, timingVar, timingValue, timingLabel) { | ||
this._send('timing', timingCategory, timingVar, timingValue, timingLabel); | ||
}; | ||
return { | ||
_logs: me._logs, | ||
displayFeatures: displayFeatures, | ||
ecommerce: ecommerce, | ||
enhancedEcommerce: enhancedEcommerce, | ||
enhancedLinkAttribution: enhancedLinkAttribution, | ||
getUrl: getUrl, | ||
experimentId: experimentId, | ||
ignoreFirstPageLoad: ignoreFirstPageLoad, | ||
delayScriptTag: delayScriptTag, | ||
setCookieConfig: me._setCookieConfig, | ||
getCookieConfig: function () { | ||
return cookieConfig; | ||
}, | ||
createAnalyticsScriptTag: function (config) { | ||
if (config) { | ||
cookieConfig = config; | ||
} | ||
return me._createAnalyticsScriptTag(); | ||
}, | ||
createScriptTag: function (config) { | ||
if (config) { | ||
cookieConfig = config; | ||
} | ||
return me._createScriptTag(); | ||
}, | ||
ecommerceEnabled: function () { | ||
return me._ecommerceEnabled(); | ||
}, | ||
enhancedEcommerceEnabled: function () { | ||
return me._enhancedEcommerceEnabled(); | ||
}, | ||
trackPage: function (url, title, custom) { | ||
me._trackPage(url, title, custom); | ||
}, | ||
trackEvent: function (category, action, label, value, noninteraction, custom) { | ||
me._trackEvent(category, action, label, value, noninteraction, custom); | ||
}, | ||
addTrans: function (transactionId, affiliation, total, tax, shipping, city, state, country, currency) { | ||
me._addTrans(transactionId, affiliation, total, tax, shipping, city, state, country, currency); | ||
}, | ||
addItem: function (transactionId, sku, name, category, price, quantity) { | ||
me._addItem(transactionId, sku, name, category, price, quantity); | ||
}, | ||
trackTrans: function () { | ||
me._trackTrans(); | ||
}, | ||
clearTrans: function () { | ||
me._clearTrans(); | ||
}, | ||
addProduct: function (productId, name, category, brand, variant, price, quantity, coupon, position) { | ||
me._addProduct(productId, name, category, brand, variant, price, quantity, coupon, position); | ||
}, | ||
addPromo: function (productId, name, creative, position) { | ||
me._addPromo(productId, name, creative, position); | ||
}, | ||
addImpression: function (productId, name, list, brand, category, variant, position, price) { | ||
me._addImpression(productId, name, list, brand, category, variant, position, price); | ||
}, | ||
productClick: function (listName) { | ||
me._productClick(listName); | ||
}, | ||
promoClick : function (promotionName) { | ||
me._promoClick(promotionName); | ||
}, | ||
trackDetail: function () { | ||
me._setAction('detail'); | ||
me._pageView(); | ||
}, | ||
trackCart: function (action) { | ||
me._trackCart(action); | ||
}, | ||
trackCheckout: function (step, option) { | ||
me._trackCheckOut(step, option); | ||
}, | ||
trackTimings: function (timingCategory, timingVar, timingValue, timingLabel) { | ||
me._trackTimings(timingCategory, timingVar, timingValue, timingLabel); | ||
}, | ||
trackTransaction: function (transactionId, affiliation, revenue, tax, shipping, coupon, list, step, option){ | ||
me._trackTransaction(transactionId, affiliation, revenue, tax, shipping, coupon, list, step, option); | ||
}, | ||
setAction: function (action, obj) { | ||
me._setAction(action, obj); | ||
}, | ||
send: function (obj) { | ||
me._send(obj); | ||
}, | ||
pageView: function () { | ||
me._pageView(); | ||
}, | ||
set: function (name, value) { | ||
me._set(name, value); | ||
} | ||
if (options.length > 1) { | ||
Analytics.trackEvent.apply(Analytics, options(scope)); | ||
} | ||
}); | ||
} | ||
}; | ||
}]); | ||
}; | ||
}]; | ||
}) | ||
.directive('gaTrackEvent', ['Analytics', '$parse', function (Analytics, $parse) { | ||
return { | ||
restrict: 'A', | ||
link: function (scope, element, attrs) { | ||
var options = $parse(attrs.gaTrackEvent); | ||
element.bind('click', function () { | ||
if(attrs.gaTrackEventIf){ | ||
if(!scope.$eval(attrs.gaTrackEventIf)){ | ||
return; // Cancel this event if we don't pass the ga-track-event-if condition | ||
} | ||
} | ||
if (options.length > 1) { | ||
Analytics.trackEvent.apply(Analytics, options(scope)); | ||
} | ||
}); | ||
} | ||
}; | ||
}]); | ||
})(window, document, window.angular); |
/** | ||
* Angular Google Analytics - Easy tracking for your AngularJS application | ||
* @version v0.0.17 - 2015-07-09 | ||
* @version v0.0.18 - 2015-07-29 | ||
* @link http://github.com/revolunet/angular-google-analytics | ||
@@ -8,2 +8,2 @@ * @author Julien Bouquillon <julien@revolunet.com> | ||
*/ | ||
"use strict";angular.module("angular-google-analytics",[]).provider("Analytics",function(){var n,e,t,a,i,c,r=!1,o=!0,s="",u=!1,l="$routeChangeSuccess",g="auto",d=!1,m=!1,_=!1,f=!1,h=!1,p={allowLinker:!0},k=!1,v=!1;this._logs=[],this.setAccount=function(e){return n=e,!0},this.trackPages=function(n){return o=n,!0},this.trackPrefix=function(n){return s=n,!0},this.setDomainName=function(n){return t=n,!0},this.useDisplayFeatures=function(n){return e=!!n,!0},this.useAnalytics=function(n){return u=!!n,!0},this.useEnhancedLinkAttribution=function(n){return _=!!n,!0},this.useCrossDomainLinker=function(n){return h=!!n,!0},this.setCrossLinkDomains=function(n){return c=n,!0},this.setPageEvent=function(n){return l=n,!0},this.setCookieConfig=function(n){return g=n,!0},this.useECommerce=function(n,e){return d=!!n,m=!!e,!0},this.setRemoveRegExp=function(n){return n instanceof RegExp?(a=n,!0):!1},this.setExperimentId=function(n){return i=n,!0},this.ignoreFirstPageLoad=function(n){return f=!!n,!0},this.trackUrlParams=function(n){return k=!!n,!0},this.delayScriptTag=function(n){return v=!!n,!0},this.$get=["$document","$location","$log","$rootScope","$window",function(E,y,w,A,T){function P(n){!u&&T._gaq&&"function"==typeof n&&n()}function b(n){u&&T.ga&&"function"==typeof n&&n()}function C(n,e){return!angular.isUndefined(e)&&"name"in e&&e.name?e.name+"."+n:n}function q(n,e){return n in e&&e[n]}var I=this,j=function(){var n=k?y.url():y.path();return a?n.replace(a,""):n},L=function(){var n={utm_source:"campaignSource",utm_medium:"campaignMedium",utm_term:"campaignTerm",utm_content:"campaignContent",utm_campaign:"campaignName"},e={};return angular.forEach(y.search(),function(t,a){var i=n[a];angular.isDefined(i)&&(e[i]=t)}),e};return this._log=function(){arguments.length>0&&(arguments.length>1&&"warn"===arguments[0]&&w.warn(Array.prototype.slice.call(arguments,1)),this._logs.push(arguments))},this._createScriptTag=function(){if(!n)return I._log("warn","No account id set to create script tag"),void 0;if(r)return I._log("warn","Script tag already created"),void 0;T._gaq=[],T._gaq.push(["_setAccount",n]),t&&T._gaq.push(["_setDomainName",t]),_&&T._gaq.push(["_require","inpage_linkid","//www.google-analytics.com/plugins/ga/inpage_linkid.js"]),o&&!f&&(a?T._gaq.push(["_trackPageview",j()]):T._gaq.push(["_trackPageview"]));var i;return i=e?("https:"===document.location.protocol?"https://":"http://")+"stats.g.doubleclick.net/dc.js":("https:"===document.location.protocol?"https://ssl":"http://www")+".google-analytics.com/ga.js",function(){var n=E[0],e=n.createElement("script");e.type="text/javascript",e.async=!0,e.src=i;var t=n.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t)}(i),r=!0},this._createAnalyticsScriptTag=function(){if(!n)return I._log("warn","No account id set to create analytics script tag"),void 0;if(r)return I._log("warn","Analytics script tag already created"),void 0;if(function(n,e,t,a,i,c,r){n.GoogleAnalyticsObject=i,n[i]=n[i]||function(){(n[i].q=n[i].q||[]).push(arguments)},n[i].l=1*new Date,c=e.createElement(t),r=e.getElementsByTagName(t)[0],c.async=1,c.src=a,r.parentNode.insertBefore(c,r)}(window,document,"script","//www.google-analytics.com/analytics.js","ga"),angular.isArray(n)?n.forEach(function(n){var e,t="cookieConfig"in n?n.cookieConfig:g;q("crossDomainLinker",n)&&(n.allowLinker=n.crossDomainLinker),angular.forEach(["name","allowLinker"],function(t){t in n&&(angular.isUndefined(e)&&(e={}),e[t]=n[t])}),angular.isUndefined(e)?T.ga("create",n.tracker,t):T.ga("create",n.tracker,t,e),e&&"allowLinker"in e&&e.allowLinker&&(T.ga(C("require",n),"linker"),q("crossLinkDomains",n)&&T.ga(C("linker:autoLink",n),n.crossLinkDomains))}):h?(T.ga("create",n,g,p),T.ga("require","linker"),c&&T.ga("linker:autoLink",c)):T.ga("create",n,g),e&&T.ga("require","displayfeatures"),o&&!f&&T.ga("send","pageview",j()),T.ga&&(d&&(m?T.ga("require","ec","ec.js"):T.ga("require","ecommerce","ecommerce.js")),_&&T.ga("require","linkid","linkid.js"),i)){var t=document.createElement("script"),a=document.getElementsByTagName("script")[0];t.src="//www.google-analytics.com/cx/api.js?experiment="+i,a.parentNode.insertBefore(t,a)}return r=!0},this._ecommerceEnabled=function(){return d?m?(this._log("warn","Enhanced ecommerce plugin is enabled. Only one plugin(ecommerce/ec) can be used at a time. Use AnalyticsProvider.setECommerce(true, false);"),!1):!0:(this._log("warn","ecommerce not set. Use AnalyticsProvider.setECommerce(true, false);"),!1)},this._enhancedEcommerceEnabled=function(){return d?m?!0:(this._log("warn","Enhanced ecommerce plugin is disabled. Use AnalyticsProvider.setECommerce(true, true);"),!1):(this._log("warn","ecommerce not set. Use AnalyticsProvider.setECommerce(true, true);"),!1)},this._trackPage=function(e,t,a){var i=this,c=arguments;e=e?e:j(),t=t?t:E[0].title,P(function(){T._gaq.push(["_set","title",t]),T._gaq.push(["_trackPageview",s+e]),i._log("_trackPageview",e,t,c)}),b(function(){var r={page:s+e,title:t};angular.extend(r,L()),angular.isObject(a)&&angular.extend(r,a),angular.isArray(n)?n.forEach(function(n){T.ga(C("send",n),"pageview",r)}):T.ga("send","pageview",r),i._log("pageview",e,t,c)})},this._trackEvent=function(e,t,a,i,c,r){var o=this,s=arguments;P(function(){T._gaq.push(["_trackEvent",e,t,a,i,!!c]),o._log("trackEvent",s)}),b(function(){var u={};angular.isDefined(c)&&(u.nonInteraction=!!c),angular.isObject(r)&&angular.extend(u,r),angular.isArray(n)?n.forEach(function(n){q("trackEvent",n)&&T.ga(C("send",n),"event",e,t,a,i,u)}):T.ga("send","event",e,t,a,i,u),o._log("event",s)})},this._addTrans=function(n,e,t,a,i,c,r,o,s){var u=this,l=arguments;P(function(){T._gaq.push(["_addTrans",n,e,t,a,i,c,r,o]),u._log("_addTrans",l)}),b(function(){u._ecommerceEnabled()&&(T.ga("ecommerce:addTransaction",{id:n,affiliation:e,revenue:t,tax:a,shipping:i,currency:s||"USD"}),u._log("ecommerce:addTransaction",l))})},this._addItem=function(n,e,t,a,i,c){var r=this,o=arguments;P(function(){T._gaq.push(["_addItem",n,e,t,a,i,c]),r._log("_addItem",o)}),b(function(){r._ecommerceEnabled()&&(T.ga("ecommerce:addItem",{id:n,name:t,sku:e,category:a,price:i,quantity:c}),r._log("ecommerce:addItem",o))})},this._trackTrans=function(){var n=this,e=arguments;P(function(){T._gaq.push(["_trackTrans"]),n._log("_trackTrans",e)}),b(function(){n._ecommerceEnabled()&&(T.ga("ecommerce:send"),n._log("ecommerce:send",e))})},this._clearTrans=function(){var n=this,e=arguments;b(function(){n._ecommerceEnabled()&&(T.ga("ecommerce:clear"),n._log("ecommerce:clear",e))})},this._addProduct=function(n,e,t,a,i,c,r,o,s){var u=this,l=arguments;P(function(){T._gaq.push(["_addProduct",n,e,t,a,i,c,r,o,s]),u._log("_addProduct",l)}),b(function(){u._enhancedEcommerceEnabled()&&(T.ga("ec:addProduct",{id:n,name:e,category:t,brand:a,variant:i,price:c,quantity:r,coupon:o,position:s}),u._log("ec:addProduct",l))})},this._addImpression=function(n,e,t,a,i,c,r,o){var s=this,u=arguments;P(function(){T._gaq.push(["_addImpression",n,e,t,a,i,c,r,o]),s._log("_addImpression",u)}),b(function(){s._enhancedEcommerceEnabled()&&T.ga("ec:addImpression",{id:n,name:e,category:i,brand:a,variant:c,list:t,position:r,price:o}),s._log("ec:addImpression",u)})},this._addPromo=function(n,e,t,a){var i=this,c=arguments;P(function(){T._gaq.push(["_addPromo",n,e,t,a]),i._log("_addPromo",arguments)}),b(function(){i._enhancedEcommerceEnabled()&&(T.ga("ec:addPromo",{id:n,name:e,creative:t,position:a}),i._log("ec:addPromo",c))})},this._getActionFieldObject=function(n,e,t,a,i,c,r,o,s){var u={};return n&&(u.id=n),e&&(u.affiliation=e),t&&(u.revenue=t),a&&(u.tax=a),i&&(u.shipping=i),c&&(u.coupon=c),r&&(u.list=r),o&&(u.step=o),s&&(u.option=s),u},this._setAction=function(n,e){var t=this,a=arguments;P(function(){T._gaq.push(["_setAction",n,e]),t._log("__setAction",a)}),b(function(){t._enhancedEcommerceEnabled()&&(T.ga("ec:setAction",n,e),t._log("ec:setAction",a))})},this._trackTransaction=function(n,e,t,a,i,c,r,o,s){this._setAction("purchase",this._getActionFieldObject(n,e,t,a,i,c,r,o,s))},this._trackRefund=function(n){this._setAction("refund",this._getActionFieldObject(n))},this._trackCheckOut=function(n,e){this._setAction("checkout",this._getActionFieldObject(null,null,null,null,null,null,null,n,e))},this._trackCart=function(n){-1!==["add","remove"].indexOf(n)&&(this._setAction(n),this._send("event","UX","click",n+" to cart"))},this._promoClick=function(n){this._setAction("promo_click"),this._send("event","Internal Promotions","click",n)},this._productClick=function(n){this._setAction("click",this._getActionFieldObject(null,null,null,null,null,null,n,null,null)),this._send("event","UX","click",n)},this._send=function(){var n=this,e=Array.prototype.slice.call(arguments);e.unshift("send"),b(function(){T.ga.apply(this,e),n._log(e)})},this._pageView=function(){this._send("pageview")},this._set=function(n,e){var t=this;b(function(){T.ga("set",n,e),t._log("set",n,e)})},v||(u?this._createAnalyticsScriptTag():this._createScriptTag()),o&&A.$on(l,function(){I._trackPage()}),this._trackTimings=function(n,e,t,a){this._send("timing",n,e,t,a)},{_logs:I._logs,displayFeatures:e,ecommerce:d,enhancedEcommerce:m,enhancedLinkAttribution:_,getUrl:j,experimentId:i,ignoreFirstPageLoad:f,delayScriptTag:v,setCookieConfig:I._setCookieConfig,getCookieConfig:function(){return g},createAnalyticsScriptTag:function(n){return n&&(g=n),I._createAnalyticsScriptTag()},createScriptTag:function(n){return n&&(g=n),I._createScriptTag()},ecommerceEnabled:function(){return I._ecommerceEnabled()},enhancedEcommerceEnabled:function(){return I._enhancedEcommerceEnabled()},trackPage:function(n,e,t){I._trackPage(n,e,t)},trackEvent:function(n,e,t,a,i,c){I._trackEvent(n,e,t,a,i,c)},addTrans:function(n,e,t,a,i,c,r,o,s){I._addTrans(n,e,t,a,i,c,r,o,s)},addItem:function(n,e,t,a,i,c){I._addItem(n,e,t,a,i,c)},trackTrans:function(){I._trackTrans()},clearTrans:function(){I._clearTrans()},addProduct:function(n,e,t,a,i,c,r,o,s){I._addProduct(n,e,t,a,i,c,r,o,s)},addPromo:function(n,e,t,a){I._addPromo(n,e,t,a)},addImpression:function(n,e,t,a,i,c,r,o){I._addImpression(n,e,t,a,i,c,r,o)},productClick:function(n){I._productClick(n)},promoClick:function(n){I._promoClick(n)},trackDetail:function(){I._setAction("detail"),I._pageView()},trackCart:function(n){I._trackCart(n)},trackCheckout:function(n,e){I._trackCheckOut(n,e)},trackTimings:function(n,e,t,a){I._trackTimings(n,e,t,a)},trackTransaction:function(n,e,t,a,i,c,r,o,s){I._trackTransaction(n,e,t,a,i,c,r,o,s)},setAction:function(n,e){I._setAction(n,e)},send:function(n){I._send(n)},pageView:function(){I._pageView()},set:function(n,e){I._set(n,e)}}}]}).directive("gaTrackEvent",["Analytics","$parse",function(n,e){return{restrict:"A",link:function(t,a,i){var c=e(i.gaTrackEvent);a.bind("click",function(){(!i.gaTrackEventIf||t.$eval(i.gaTrackEventIf))&&c.length>1&&n.trackEvent.apply(n,c(t))})}}}]); | ||
(function(n,t,e){"use strict";e.module("angular-google-analytics",[]).provider("Analytics",function(){var i,a,c,r,o,s,u=!1,g=!0,d="",l=!1,m="$routeChangeSuccess",_="auto",f=!1,h=!1,p=!1,k=!1,v=!1,E={allowLinker:!0},y=!1,w=!1;this._logs=[],this.setAccount=function(n){return i=n,!0},this.trackPages=function(n){return g=n,!0},this.trackPrefix=function(n){return d=n,!0},this.setDomainName=function(n){return c=n,!0},this.useDisplayFeatures=function(n){return a=!!n,!0},this.useAnalytics=function(n){return l=!!n,!0},this.useEnhancedLinkAttribution=function(n){return p=!!n,!0},this.useCrossDomainLinker=function(n){return v=!!n,!0},this.setCrossLinkDomains=function(n){return s=n,!0},this.setPageEvent=function(n){return m=n,!0},this.setCookieConfig=function(n){return _=n,!0},this.useECommerce=function(n,t){return f=!!n,h=!!t,!0},this.setRemoveRegExp=function(n){return n instanceof RegExp?(r=n,!0):!1},this.setExperimentId=function(n){return o=n,!0},this.ignoreFirstPageLoad=function(n){return k=!!n,!0},this.trackUrlParams=function(n){return y=!!n,!0},this.delayScriptTag=function(n){return w=!!n,!0},this.$get=["$document","$location","$log","$rootScope","$window",function(T,A,P,b,q){function C(n){!l&&q._gaq&&"function"==typeof n&&n()}function I(n){l&&q.ga&&"function"==typeof n&&n()}function j(n,t){return!e.isUndefined(t)&&"name"in t&&t.name?t.name+"."+n:n}function L(n,t){return n in t&&t[n]}var S=this,x=function(){var n=y?A.url():A.path();return r?n.replace(r,""):n},D=function(){var n={utm_source:"campaignSource",utm_medium:"campaignMedium",utm_term:"campaignTerm",utm_content:"campaignContent",utm_campaign:"campaignName"},t={};return e.forEach(A.search(),function(i,a){var c=n[a];e.isDefined(c)&&(t[c]=i)}),t};return this._log=function(){arguments.length>0&&(arguments.length>1&&"warn"===arguments[0]&&P.warn(Array.prototype.slice.call(arguments,1)),this._logs.push(arguments))},this._createScriptTag=function(){if(!i)return S._log("warn","No account id set to create script tag"),undefined;if(u)return S._log("warn","Script tag already created"),undefined;q._gaq=[],q._gaq.push(["_setAccount",i]),c&&q._gaq.push(["_setDomainName",c]),p&&q._gaq.push(["_require","inpage_linkid","//www.google-analytics.com/plugins/ga/inpage_linkid.js"]),g&&!k&&(r?q._gaq.push(["_trackPageview",x()]):q._gaq.push(["_trackPageview"]));var n;return n=a?("https:"===t.location.protocol?"https://":"http://")+"stats.g.doubleclick.net/dc.js":("https:"===t.location.protocol?"https://ssl":"http://www")+".google-analytics.com/ga.js",function(){var t=T[0],e=t.createElement("script");e.type="text/javascript",e.async=!0,e.src=n;var i=t.getElementsByTagName("script")[0];i.parentNode.insertBefore(e,i)}(n),u=!0,!0},this._createAnalyticsScriptTag=function(){if(!i)return S._log("warn","No account id set to create analytics script tag"),undefined;if(u)return S._log("warn","Analytics script tag already created"),undefined;if(function(n,t,e,i,a,c,r){n.GoogleAnalyticsObject=a,n[a]=n[a]||function(){(n[a].q=n[a].q||[]).push(arguments)},n[a].l=1*new Date,c=t.createElement(e),r=t.getElementsByTagName(e)[0],c.async=1,c.src=i,r.parentNode.insertBefore(c,r)}(n,t,"script","//www.google-analytics.com/analytics.js","ga"),e.isArray(i)?i.forEach(function(n){var t,i="cookieConfig"in n?n.cookieConfig:_;L("crossDomainLinker",n)&&(n.allowLinker=n.crossDomainLinker),e.forEach(["name","allowLinker"],function(i){i in n&&(e.isUndefined(t)&&(t={}),t[i]=n[i])}),e.isUndefined(t)?q.ga("create",n.tracker,i):q.ga("create",n.tracker,i,t),t&&"allowLinker"in t&&t.allowLinker&&(q.ga(j("require",n),"linker"),L("crossLinkDomains",n)&&q.ga(j("linker:autoLink",n),n.crossLinkDomains))}):v?(q.ga("create",i,_,E),q.ga("require","linker"),s&&q.ga("linker:autoLink",s)):q.ga("create",i,_),a&&q.ga("require","displayfeatures"),g&&!k&&q.ga("send","pageview",x()),q.ga&&(f&&(h?q.ga("require","ec","ec.js"):q.ga("require","ecommerce","ecommerce.js")),p&&q.ga("require","linkid","linkid.js"),o)){var c=t.createElement("script"),r=t.getElementsByTagName("script")[0];c.src="//www.google-analytics.com/cx/api.js?experiment="+o,r.parentNode.insertBefore(c,r)}return u=!0,!0},this._ecommerceEnabled=function(){return f&&!h},this._enhancedEcommerceEnabled=function(){return f&&h},this._trackPage=function(n,t,a){var c=this,r=arguments;n=n?n:x(),t=t?t:T[0].title,C(function(){q._gaq.push(["_set","title",t]),q._gaq.push(["_trackPageview",d+n]),c._log("_trackPageview",n,t,r)}),I(function(){var o={page:d+n,title:t};e.extend(o,D()),e.isObject(a)&&e.extend(o,a),e.isArray(i)?i.forEach(function(n){q.ga(j("send",n),"pageview",o)}):q.ga("send","pageview",o),c._log("pageview",n,t,r)})},this._trackEvent=function(n,t,a,c,r,o){var s=this,u=arguments;C(function(){q._gaq.push(["_trackEvent",n,t,a,c,!!r]),s._log("trackEvent",u)}),I(function(){var g={};e.isDefined(r)&&(g.nonInteraction=!!r),e.isObject(o)&&e.extend(g,o),e.isArray(i)?i.forEach(function(e){L("trackEvent",e)&&q.ga(j("send",e),"event",n,t,a,c,g)}):q.ga("send","event",n,t,a,c,g),s._log("event",u)})},this._addTrans=function(n,t,e,i,a,c,r,o,s){var u=this,g=arguments;C(function(){q._gaq.push(["_addTrans",n,t,e,i,a,c,r,o]),u._log("_addTrans",g)}),I(function(){u._ecommerceEnabled()&&(q.ga("ecommerce:addTransaction",{id:n,affiliation:t,revenue:e,tax:i,shipping:a,currency:s||"USD"}),u._log("ecommerce:addTransaction",g))})},this._addItem=function(n,t,e,i,a,c){var r=this,o=arguments;C(function(){q._gaq.push(["_addItem",n,t,e,i,a,c]),r._log("_addItem",o)}),I(function(){r._ecommerceEnabled()&&(q.ga("ecommerce:addItem",{id:n,name:e,sku:t,category:i,price:a,quantity:c}),r._log("ecommerce:addItem",o))})},this._trackTrans=function(){var n=this,t=arguments;C(function(){q._gaq.push(["_trackTrans"]),n._log("_trackTrans",t)}),I(function(){n._ecommerceEnabled()&&(q.ga("ecommerce:send"),n._log("ecommerce:send",t))})},this._clearTrans=function(){var n=this,t=arguments;I(function(){n._ecommerceEnabled()&&(q.ga("ecommerce:clear"),n._log("ecommerce:clear",t))})},this._addProduct=function(n,t,e,i,a,c,r,o,s){var u=this,g=arguments;C(function(){q._gaq.push(["_addProduct",n,t,e,i,a,c,r,o,s]),u._log("_addProduct",g)}),I(function(){u._enhancedEcommerceEnabled()&&(q.ga("ec:addProduct",{id:n,name:t,category:e,brand:i,variant:a,price:c,quantity:r,coupon:o,position:s}),u._log("ec:addProduct",g))})},this._addImpression=function(n,t,e,i,a,c,r,o){var s=this,u=arguments;C(function(){q._gaq.push(["_addImpression",n,t,e,i,a,c,r,o]),s._log("_addImpression",u)}),I(function(){s._enhancedEcommerceEnabled()&&(q.ga("ec:addImpression",{id:n,name:t,category:a,brand:i,variant:c,list:e,position:r,price:o}),s._log("ec:addImpression",u))})},this._addPromo=function(n,t,e,i){var a=this,c=arguments;C(function(){q._gaq.push(["_addPromo",n,t,e,i]),a._log("_addPromo",arguments)}),I(function(){a._enhancedEcommerceEnabled()&&(q.ga("ec:addPromo",{id:n,name:t,creative:e,position:i}),a._log("ec:addPromo",c))})},this._getActionFieldObject=function(n,t,e,i,a,c,r,o,s){var u={};return n&&(u.id=n),t&&(u.affiliation=t),e&&(u.revenue=e),i&&(u.tax=i),a&&(u.shipping=a),c&&(u.coupon=c),r&&(u.list=r),o&&(u.step=o),s&&(u.option=s),u},this._setAction=function(n,t){var e=this,i=arguments;C(function(){q._gaq.push(["_setAction",n,t]),e._log("__setAction",i)}),I(function(){e._enhancedEcommerceEnabled()&&(q.ga("ec:setAction",n,t),e._log("ec:setAction",i))})},this._trackTransaction=function(n,t,e,i,a,c,r,o,s){this._setAction("purchase",this._getActionFieldObject(n,t,e,i,a,c,r,o,s))},this._trackRefund=function(n){this._setAction("refund",this._getActionFieldObject(n))},this._trackCheckOut=function(n,t){this._setAction("checkout",this._getActionFieldObject(null,null,null,null,null,null,null,n,t))},this._trackCart=function(n){-1!==["add","remove"].indexOf(n)&&(this._setAction(n),this._send("event","UX","click",n+" to cart"))},this._promoClick=function(n){this._setAction("promo_click"),this._send("event","Internal Promotions","click",n)},this._productClick=function(n){this._setAction("click",this._getActionFieldObject(null,null,null,null,null,null,n,null,null)),this._send("event","UX","click",n)},this._send=function(){var n=this,t=Array.prototype.slice.call(arguments);t.unshift("send"),I(function(){q.ga.apply(this,t),n._log(t)})},this._pageView=function(){this._send("pageview")},this._set=function(n,t){var e=this;I(function(){q.ga("set",n,t),e._log("set",n,t)})},w||(l?this._createAnalyticsScriptTag():this._createScriptTag()),g&&b.$on(m,function(){S._trackPage()}),this._trackTimings=function(n,t,e,i){this._send("timing",n,t,e,i)},{_logs:S._logs,displayFeatures:a,ecommerce:f,enhancedEcommerce:h,enhancedLinkAttribution:p,getUrl:x,experimentId:o,ignoreFirstPageLoad:k,delayScriptTag:w,setCookieConfig:S._setCookieConfig,getCookieConfig:function(){return _},createAnalyticsScriptTag:function(n){return n&&(_=n),S._createAnalyticsScriptTag()},createScriptTag:function(n){return n&&(_=n),S._createScriptTag()},ecommerceEnabled:function(){return S._ecommerceEnabled()},enhancedEcommerceEnabled:function(){return S._enhancedEcommerceEnabled()},trackPage:function(n,t,e){S._trackPage(n,t,e)},trackEvent:function(n,t,e,i,a,c){S._trackEvent(n,t,e,i,a,c)},addTrans:function(n,t,e,i,a,c,r,o,s){S._addTrans(n,t,e,i,a,c,r,o,s)},addItem:function(n,t,e,i,a,c){S._addItem(n,t,e,i,a,c)},trackTrans:function(){S._trackTrans()},clearTrans:function(){S._clearTrans()},addProduct:function(n,t,e,i,a,c,r,o,s){S._addProduct(n,t,e,i,a,c,r,o,s)},addPromo:function(n,t,e,i){S._addPromo(n,t,e,i)},addImpression:function(n,t,e,i,a,c,r,o){S._addImpression(n,t,e,i,a,c,r,o)},productClick:function(n){S._productClick(n)},promoClick:function(n){S._promoClick(n)},trackDetail:function(){S._setAction("detail"),S._pageView()},trackCart:function(n){S._trackCart(n)},trackCheckout:function(n,t){S._trackCheckOut(n,t)},trackTimings:function(n,t,e,i){S._trackTimings(n,t,e,i)},trackTransaction:function(n,t,e,i,a,c,r,o,s){S._trackTransaction(n,t,e,i,a,c,r,o,s)},setAction:function(n,t){S._setAction(n,t)},send:function(n){S._send(n)},pageView:function(){S._pageView()},set:function(n,t){S._set(n,t)}}}]}).directive("gaTrackEvent",["Analytics","$parse",function(n,t){return{restrict:"A",link:function(e,i,a){var c=t(a.gaTrackEvent);i.bind("click",function(){(!a.gaTrackEventIf||e.$eval(a.gaTrackEventIf))&&c.length>1&&n.trackEvent.apply(n,c(e))})}}}])})(window,document,window.angular); |
@@ -1,6 +0,4 @@ | ||
/* global require, module, */ | ||
'use strict'; | ||
/* global require, module */ | ||
module.exports = function(grunt) { | ||
'use strict'; | ||
@@ -131,4 +129,2 @@ // Project configuration. | ||
grunt.renameTask('release', 'originalRelease'); | ||
@@ -149,3 +145,2 @@ | ||
// Provides the "karma" task. | ||
@@ -158,3 +153,2 @@ grunt.registerMultiTask('karma', 'Starts up a karma server.', function() { | ||
}); | ||
}; |
{ | ||
"name": "angular-google-analytics", | ||
"description": "Angular Google Analytics - Easy tracking for your AngularJS application", | ||
"version": "0.0.17", | ||
"version": "0.0.18", | ||
"homepage": "http://github.com/revolunet/angular-google-analytics", | ||
@@ -6,0 +6,0 @@ "author": "Julien Bouquillon <julien@revolunet.com>", |
101
README.md
@@ -12,3 +12,3 @@ # angular-google-analytics | ||
## features | ||
## Features | ||
@@ -25,3 +25,3 @@ - configurable | ||
## install | ||
## Installation | ||
@@ -32,3 +32,3 @@ `bower install angular-google-analytics` | ||
## example | ||
## Example | ||
@@ -38,18 +38,19 @@ ```js | ||
.config(function(AnalyticsProvider) { | ||
// initial configuration | ||
// Set analytics account | ||
AnalyticsProvider.setAccount('UA-XXXXX-xx'); | ||
// using multiple tracking objects (analytics.js only) | ||
// AnalyticsProvider.setAccount([ | ||
// { tracker: 'UA-12345-12', name: "tracker1" }, | ||
// { tracker: 'UA-12345-34', name: "tracker2" } | ||
// ]); | ||
// track all routes (or not) | ||
// Or if using multiple tracking objects (analytics.js only) | ||
AnalyticsProvider.setAccount([ | ||
{ tracker: 'UA-12345-12', name: "tracker1" }, | ||
{ tracker: 'UA-12345-34', name: "tracker2" } | ||
]); | ||
// Track all routes (or not) | ||
AnalyticsProvider.trackPages(true); | ||
// track all url query params (default is false) | ||
// Track all URL query params (default is false) | ||
AnalyticsProvider.trackUrlParams(true); | ||
// Optional set domain (Use 'none' for testing on localhost) | ||
// AnalyticsProvider.setDomainName('XXX'); | ||
AnalyticsProvider.setDomainName('XXX'); | ||
@@ -59,3 +60,3 @@ // Use display features plugin | ||
// url prefix (default is empty) | ||
// URL prefix (default is empty) | ||
// - for example: when an app doesn't run in the root directory | ||
@@ -74,6 +75,7 @@ AnalyticsProvider.trackPrefix('my-application'); | ||
// Enabled eCommerce module for analytics.js(uses legacy ecommerce plugin) | ||
// Enabled eCommerce module for analytics.js (uses legacy ecommerce plugin) | ||
AnalyticsProvider.useECommerce(true, false); | ||
// Enabled eCommerce module for analytics.js(uses ec plugin instead of ecommerce plugin) | ||
// Enabled enhanced eCommerce module for analytics.js (uses ec plugin instead of ecommerce plugin) | ||
// When enabled, legacy ecommerce plugin calls are not supported | ||
AnalyticsProvider.useECommerce(true, true); | ||
@@ -94,7 +96,6 @@ | ||
// change page event name | ||
// Change page event name | ||
AnalyticsProvider.setPageEvent('$stateChangeSuccess'); | ||
// Delay script tage creation | ||
// Delay script tag creation | ||
// must manually call Analytics.createScriptTag(cookieConfig) or Analytics.createAnalyticsScriptTag(cookieConfig) | ||
@@ -104,4 +105,4 @@ AnalyticsProvider.delayScriptTag(true); | ||
.run(function(Analytics) { | ||
// In case you are relying on automatic page tracking, you need to inject Analytics | ||
// at least once in your application (for example in the main run() block) | ||
// In case you are relying on automatic page tracking, you need to inject Analytics | ||
// at least once in your application (for example in the main run() block) | ||
}) | ||
@@ -125,10 +126,10 @@ .controller('SampleController', function(Analytics) { | ||
// create a new tracking event with optional value and noninteraction flag | ||
// Create a new tracking event with optional value and noninteraction flag | ||
Analytics.trackEvent('video', 'play', 'django.mp4', 4, true); | ||
// create a new tracking event with optional value, noninteraction flag, and custom dimension and metric | ||
// Create a new tracking event with optional value, noninteraction flag, and custom dimension and metric | ||
// (analytics.js only) | ||
Analytics.trackEvent('video', 'play', 'django.mp4', 4, true, {dimension15: 'My Custom Dimension', metric18: 8000}); | ||
// tracking e-commerce | ||
// Tracking e-commerce | ||
// - create transaction | ||
@@ -227,39 +228,42 @@ Analytics.addTrans('1', '', '2.42', '0.42', '0', 'Amsterdam', '', 'Netherlands', 'EUR'); | ||
Analytics.createAnalyticsScriptTag({userId: 1234}) | ||
//Track User Timings | ||
// Track User Timings | ||
Analytics.trackTimings(timingCategory, timingVar, timingValue, timingLabel) | ||
//example: | ||
// example: | ||
var endTime = new Date().getTime(); | ||
var timeSpent = endTime - startTime; | ||
Analytics.trackTimings('Time to Checkout', 'User Timings', timeSpent); | ||
}); | ||
``` | ||
### Directive | ||
### directive | ||
Alternatively you can use a directive to avoid filling controllers with `Analytics.trackEvent()` statements. Note: the directive does not create an isolate scope. | ||
```html | ||
<button type="button" ga-track-event="['video', 'play', 'django.mp4']"></button> | ||
``` | ||
<!-- OR --> | ||
```html | ||
<button type="button" ga-track-event="['video', 'play', 'django.mp4', 4, true, {dimension15: 'My Custom Dimension', metric18: 8000}]"></button> | ||
You can define the properties on your controller too `$scope.event = ['video', 'play', 'django.mp4']` and reference them | ||
``` | ||
You can define the properties on your controller too, `$scope.event = ['video', 'play', 'django.mp4']` and reference them | ||
```html | ||
<button type="button" ga-track-event="event"></button> | ||
``` | ||
`ga-track-event-if` is a conditional check. If the attribute value evaluates to a falsey, the event will NOT be fired. Useful for user tracking opt-out, etc. | ||
```html | ||
<button type="button" ga-track-event="['video', 'play', 'django.mp4']" ga-track-event-if="shouldTrack"></button> | ||
``` | ||
## configuration | ||
## Configuration | ||
```js | ||
// setup your account | ||
// Setup your account | ||
AnalyticsProvider.setAccount('UA-XXXXX-xx'); | ||
// automatic route tracking (default=true) | ||
// Automatic route tracking (default: true) | ||
AnalyticsProvider.trackPages(false); | ||
@@ -274,2 +278,3 @@ // Optional set domain (Use 'none' for testing on localhost) | ||
AnalyticsProvider.ignoreFirstPageLoad(true); | ||
// Enable eCommerce module for analytics.js | ||
@@ -291,5 +296,6 @@ AnalyticsProvider.useECommerce(true, false); | ||
AnalyticsProvider.setPageEvent('$stateChangeSuccess'); | ||
// Delay script tage creation...must manually call Analytics.createScriptTag() or Analytics.createAnalyticsScriptTag() to enable analytics | ||
// Delay script tag creation. Must manually call Analytics.createScriptTag() or Analytics.createAnalyticsScriptTag() to enable analytics | ||
AnalyticsProvider.delayScriptTag(true); | ||
// RegEx to scrub location before sending to analytics. Internally replaces all matching segments with an empty string | ||
AnalyticsProvider.setRemoveRegExp(/\/\d+?$/); | ||
``` | ||
@@ -304,2 +310,17 @@ | ||
## Licence | ||
As AngularJS itself, this module is released under the permissive [MIT license](http://revolunet.mit-license.org). Your contributions are always welcome. | ||
## Development | ||
After forking you will need to run the following from a command line to get your environment setup: | ||
1. ```npm install``` | ||
2. ```bower install``` | ||
After install you have the following commands available to you from a command line: | ||
1. ```npm test``` or ```grunt``` or ```grunt test``` | ||
2. ```npm test-server``` or ```grunt test-server``` | ||
3. ```grunt build``` or ```grunt release``` | ||
4. ```grunt stage``` |
@@ -1,927 +0,915 @@ | ||
'use strict'; | ||
(function (window, document, angular, undefined) { | ||
'use strict'; | ||
angular.module('angular-google-analytics', []) | ||
.provider('Analytics', function () { | ||
var created = false, | ||
trackRoutes = true, | ||
accountId, | ||
displayFeatures, | ||
trackPrefix = '', | ||
domainName, | ||
analyticsJS = false, | ||
pageEvent = '$routeChangeSuccess', | ||
cookieConfig = 'auto', | ||
ecommerce = false, | ||
enhancedEcommerce = false, | ||
enhancedLinkAttribution = false, | ||
removeRegExp, | ||
experimentId, | ||
ignoreFirstPageLoad = false, | ||
crossDomainLinker = false, | ||
crossLinkDomains, | ||
linkerConfig = {'allowLinker': true}, | ||
trackUrlParams = false, | ||
delayScriptTag = false; | ||
angular.module('angular-google-analytics', []) | ||
.provider('Analytics', function () { | ||
var created = false, | ||
trackRoutes = true, | ||
accountId, | ||
displayFeatures, | ||
trackPrefix = '', | ||
domainName, | ||
analyticsJS = false, | ||
pageEvent = '$routeChangeSuccess', | ||
cookieConfig = 'auto', | ||
ecommerce = false, | ||
enhancedEcommerce = false, | ||
enhancedLinkAttribution = false, | ||
removeRegExp, | ||
experimentId, | ||
ignoreFirstPageLoad = false, | ||
crossDomainLinker = false, | ||
crossLinkDomains, | ||
linkerConfig = {'allowLinker': true}, | ||
trackUrlParams = false, | ||
delayScriptTag = false; | ||
this._logs = []; | ||
this._logs = []; | ||
// config methods | ||
this.setAccount = function (id) { | ||
accountId = id; | ||
return true; | ||
}; | ||
// config methods | ||
this.setAccount = function (id) { | ||
accountId = id; | ||
return true; | ||
}; | ||
this.trackPages = function (doTrack) { | ||
trackRoutes = doTrack; | ||
return true; | ||
}; | ||
this.trackPages = function (doTrack) { | ||
trackRoutes = doTrack; | ||
return true; | ||
}; | ||
this.trackPrefix = function (prefix) { | ||
trackPrefix = prefix; | ||
return true; | ||
}; | ||
this.trackPrefix = function (prefix) { | ||
trackPrefix = prefix; | ||
return true; | ||
}; | ||
this.setDomainName = function (domain) { | ||
domainName = domain; | ||
return true; | ||
}; | ||
this.setDomainName = function (domain) { | ||
domainName = domain; | ||
return true; | ||
}; | ||
this.useDisplayFeatures = function (val) { | ||
displayFeatures = !!val; | ||
return true; | ||
}; | ||
this.useDisplayFeatures = function (val) { | ||
displayFeatures = !!val; | ||
return true; | ||
}; | ||
this.useAnalytics = function (val) { | ||
analyticsJS = !!val; | ||
return true; | ||
}; | ||
this.useAnalytics = function (val) { | ||
analyticsJS = !!val; | ||
return true; | ||
}; | ||
this.useEnhancedLinkAttribution = function (val) { | ||
enhancedLinkAttribution = !!val; | ||
return true; | ||
}; | ||
this.useEnhancedLinkAttribution = function (val) { | ||
enhancedLinkAttribution = !!val; | ||
return true; | ||
}; | ||
this.useCrossDomainLinker = function (val) { | ||
crossDomainLinker = !!val; | ||
return true; | ||
}; | ||
this.useCrossDomainLinker = function (val) { | ||
crossDomainLinker = !!val; | ||
return true; | ||
}; | ||
this.setCrossLinkDomains = function (domains) { | ||
crossLinkDomains = domains; | ||
return true; | ||
}; | ||
this.setCrossLinkDomains = function (domains) { | ||
crossLinkDomains = domains; | ||
return true; | ||
}; | ||
this.setPageEvent = function (name) { | ||
pageEvent = name; | ||
return true; | ||
}; | ||
this.setPageEvent = function (name) { | ||
pageEvent = name; | ||
return true; | ||
}; | ||
this.setCookieConfig = function (config) { | ||
cookieConfig = config; | ||
return true; | ||
}; | ||
this.setCookieConfig = function (config) { | ||
cookieConfig = config; | ||
return true; | ||
}; | ||
this.useECommerce = function (val, enhanced) { | ||
ecommerce = !!val; | ||
enhancedEcommerce = !!enhanced; | ||
return true; | ||
}; | ||
this.useECommerce = function (val, enhanced) { | ||
ecommerce = !!val; | ||
enhancedEcommerce = !!enhanced; | ||
return true; | ||
}; | ||
this.setRemoveRegExp = function (regex) { | ||
if (regex instanceof RegExp) { | ||
removeRegExp = regex; | ||
return true; | ||
} | ||
return false; | ||
}; | ||
this.setRemoveRegExp = function (regex) { | ||
if (regex instanceof RegExp) { | ||
removeRegExp = regex; | ||
this.setExperimentId = function (id) { | ||
experimentId = id; | ||
return true; | ||
} | ||
return false; | ||
}; | ||
}; | ||
this.setExperimentId = function (id) { | ||
experimentId = id; | ||
return true; | ||
}; | ||
this.ignoreFirstPageLoad = function (val) { | ||
ignoreFirstPageLoad = !!val; | ||
return true; | ||
}; | ||
this.ignoreFirstPageLoad = function (val) { | ||
ignoreFirstPageLoad = !!val; | ||
return true; | ||
}; | ||
this.trackUrlParams = function (val) { | ||
trackUrlParams = !!val; | ||
return true; | ||
}; | ||
this.trackUrlParams = function (val) { | ||
trackUrlParams = !!val; | ||
return true; | ||
}; | ||
this.delayScriptTag = function (val) { | ||
delayScriptTag = !!val; | ||
return true; | ||
}; | ||
this.delayScriptTag = function (val) { | ||
delayScriptTag = !!val; | ||
return true; | ||
}; | ||
/** | ||
* Public Service | ||
*/ | ||
this.$get = ['$document', '$location', '$log', '$rootScope', '$window', function ($document, $location, $log, $rootScope, $window) { | ||
var me = this; | ||
/** | ||
* Public Service | ||
*/ | ||
this.$get = ['$document', '$location', '$log', '$rootScope', '$window', function ($document, $location, $log, $rootScope, $window) { | ||
var me = this; | ||
var getUrl = function () { | ||
var url = trackUrlParams ? $location.url() : $location.path(); | ||
return removeRegExp ? url.replace(removeRegExp, '') : url; | ||
}; | ||
var getUtmParams = function () { | ||
var utmToCampaignVar = { | ||
utm_source: 'campaignSource', | ||
utm_medium: 'campaignMedium', | ||
utm_term: 'campaignTerm', | ||
utm_content: 'campaignContent', | ||
utm_campaign: 'campaignName' | ||
var getUrl = function () { | ||
var url = trackUrlParams ? $location.url() : $location.path(); | ||
return removeRegExp ? url.replace(removeRegExp, '') : url; | ||
}; | ||
var object = {}; | ||
angular.forEach($location.search(), function (value, key) { | ||
var campaignVar = utmToCampaignVar[key]; | ||
var getUtmParams = function () { | ||
var utmToCampaignVar = { | ||
utm_source: 'campaignSource', | ||
utm_medium: 'campaignMedium', | ||
utm_term: 'campaignTerm', | ||
utm_content: 'campaignContent', | ||
utm_campaign: 'campaignName' | ||
}; | ||
var object = {}; | ||
if (angular.isDefined(campaignVar)) { | ||
object[campaignVar] = value; | ||
} | ||
angular.forEach($location.search(), function (value, key) { | ||
var campaignVar = utmToCampaignVar[key]; | ||
}); | ||
if (angular.isDefined(campaignVar)) { | ||
object[campaignVar] = value; | ||
} | ||
return object; | ||
}; | ||
}); | ||
/** | ||
* Private Methods | ||
*/ | ||
return object; | ||
}; | ||
function _gaJs(fn) { | ||
if (!analyticsJS && $window._gaq && typeof fn === 'function') { | ||
fn(); | ||
} | ||
} | ||
/** | ||
* Private Methods | ||
*/ | ||
function _analyticsJs(fn) { | ||
if (analyticsJS && $window.ga && typeof fn === 'function') { | ||
fn(); | ||
function _gaJs(fn) { | ||
if (!analyticsJS && $window._gaq && typeof fn === 'function') { | ||
fn(); | ||
} | ||
} | ||
} | ||
function _generateCommandName(commandName, config) { | ||
if (!angular.isUndefined(config) && 'name' in config && config.name) { | ||
return config.name + '.' + commandName; | ||
} else { | ||
return commandName; | ||
} | ||
} | ||
function _checkOption(key, config) { | ||
return key in config && config[key]; | ||
} | ||
this._log = function () { | ||
if (arguments.length > 0) { | ||
if (arguments.length > 1 && arguments[0] === 'warn') { | ||
$log.warn(Array.prototype.slice.call(arguments, 1)); | ||
function _analyticsJs(fn) { | ||
if (analyticsJS && $window.ga && typeof fn === 'function') { | ||
fn(); | ||
} | ||
// console.log('analytics', arguments); | ||
this._logs.push(arguments); | ||
} | ||
}; | ||
this._createScriptTag = function () { | ||
if (!accountId) { | ||
me._log('warn', 'No account id set to create script tag'); | ||
return; | ||
} | ||
if (created) { | ||
me._log('warn', 'Script tag already created'); | ||
return; | ||
} | ||
// inject the google analytics tag | ||
$window._gaq = []; | ||
$window._gaq.push(['_setAccount', accountId]); | ||
if(domainName) { | ||
$window._gaq.push(['_setDomainName', domainName]); | ||
} | ||
if (enhancedLinkAttribution) { | ||
$window._gaq.push(['_require', 'inpage_linkid', '//www.google-analytics.com/plugins/ga/inpage_linkid.js']); | ||
} | ||
if (trackRoutes && !ignoreFirstPageLoad) { | ||
if (removeRegExp) { | ||
$window._gaq.push(['_trackPageview', getUrl()]); | ||
function _generateCommandName(commandName, config) { | ||
if (!angular.isUndefined(config) && 'name' in config && config.name) { | ||
return config.name + '.' + commandName; | ||
} else { | ||
$window._gaq.push(['_trackPageview']); | ||
return commandName; | ||
} | ||
} | ||
var gaSrc; | ||
if (displayFeatures) { | ||
gaSrc = ('https:' === document.location.protocol ? 'https://' : 'http://') + 'stats.g.doubleclick.net/dc.js'; | ||
} else { | ||
gaSrc = ('https:' === document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; | ||
} | ||
(function () { | ||
var document = $document[0]; | ||
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; | ||
ga.src = gaSrc; | ||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); | ||
})(gaSrc); | ||
return created = true; | ||
}; | ||
this._createAnalyticsScriptTag = function () { | ||
if (!accountId) { | ||
me._log('warn', 'No account id set to create analytics script tag'); | ||
return; | ||
function _checkOption(key, config) { | ||
return key in config && config[key]; | ||
} | ||
if (created) { | ||
me._log('warn', 'Analytics script tag already created'); | ||
return; | ||
} | ||
// inject the google analytics tag | ||
(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'); | ||
if (angular.isArray(accountId)) { | ||
accountId.forEach(function (trackerObj) { | ||
var _cookieConfig = 'cookieConfig' in trackerObj ? trackerObj.cookieConfig : cookieConfig; | ||
var options; | ||
if (_checkOption('crossDomainLinker', trackerObj)) { | ||
trackerObj.allowLinker = trackerObj.crossDomainLinker; | ||
this._log = function () { | ||
if (arguments.length > 0) { | ||
if (arguments.length > 1 && arguments[0] === 'warn') { | ||
$log.warn(Array.prototype.slice.call(arguments, 1)); | ||
} | ||
angular.forEach(['name', 'allowLinker'], function(key) { | ||
if (key in trackerObj) { | ||
if (angular.isUndefined(options)) { | ||
options = {}; | ||
} | ||
options[key] = trackerObj[key]; | ||
} | ||
}); | ||
if (angular.isUndefined(options)) { | ||
$window.ga('create', trackerObj.tracker, _cookieConfig); | ||
} else { | ||
$window.ga('create', trackerObj.tracker, _cookieConfig, options); | ||
} | ||
if (options && 'allowLinker' in options && options.allowLinker) { | ||
$window.ga(_generateCommandName('require', trackerObj), 'linker'); | ||
if (_checkOption('crossLinkDomains', trackerObj)) { | ||
$window.ga(_generateCommandName('linker:autoLink', trackerObj), trackerObj.crossLinkDomains); | ||
} | ||
} | ||
}); | ||
} else if (crossDomainLinker) { | ||
$window.ga('create', accountId, cookieConfig, linkerConfig); | ||
$window.ga('require', 'linker'); | ||
if(crossLinkDomains) { | ||
$window.ga('linker:autoLink', crossLinkDomains ); | ||
// console.log('analytics', arguments); | ||
this._logs.push(arguments); | ||
} | ||
} else { | ||
$window.ga('create', accountId, cookieConfig); | ||
} | ||
}; | ||
if (displayFeatures) { | ||
$window.ga('require', 'displayfeatures'); | ||
} | ||
this._createScriptTag = function () { | ||
if (!accountId) { | ||
me._log('warn', 'No account id set to create script tag'); | ||
return; | ||
} | ||
if (trackRoutes && !ignoreFirstPageLoad) { | ||
$window.ga('send', 'pageview', getUrl()); | ||
} | ||
if (created) { | ||
me._log('warn', 'Script tag already created'); | ||
return; | ||
} | ||
if ($window.ga) { | ||
if (ecommerce) { | ||
if (!enhancedEcommerce) { | ||
$window.ga('require', 'ecommerce', 'ecommerce.js'); | ||
// inject the google analytics tag | ||
$window._gaq = []; | ||
$window._gaq.push(['_setAccount', accountId]); | ||
if(domainName) { | ||
$window._gaq.push(['_setDomainName', domainName]); | ||
} | ||
if (enhancedLinkAttribution) { | ||
$window._gaq.push(['_require', 'inpage_linkid', '//www.google-analytics.com/plugins/ga/inpage_linkid.js']); | ||
} | ||
if (trackRoutes && !ignoreFirstPageLoad) { | ||
if (removeRegExp) { | ||
$window._gaq.push(['_trackPageview', getUrl()]); | ||
} else { | ||
$window.ga('require', 'ec', 'ec.js'); | ||
$window._gaq.push(['_trackPageview']); | ||
} | ||
} | ||
if (enhancedLinkAttribution) { | ||
$window.ga('require', 'linkid', 'linkid.js'); | ||
var gaSrc; | ||
if (displayFeatures) { | ||
gaSrc = ('https:' === document.location.protocol ? 'https://' : 'http://') + 'stats.g.doubleclick.net/dc.js'; | ||
} else { | ||
gaSrc = ('https:' === document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; | ||
} | ||
if (experimentId) { | ||
var expScript = document.createElement('script'), | ||
s = document.getElementsByTagName('script')[0]; | ||
expScript.src = "//www.google-analytics.com/cx/api.js?experiment=" + experimentId; | ||
s.parentNode.insertBefore(expScript, s); | ||
} | ||
} | ||
(function () { | ||
var document = $document[0]; | ||
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; | ||
ga.src = gaSrc; | ||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); | ||
})(gaSrc); | ||
return created = true; | ||
}; | ||
created = true; | ||
return true; | ||
}; | ||
this._ecommerceEnabled = function () { | ||
if (!ecommerce) { | ||
this._log('warn', 'ecommerce not set. Use AnalyticsProvider.setECommerce(true, false);'); | ||
return false; | ||
} else if (enhancedEcommerce) { | ||
this._log('warn', 'Enhanced ecommerce plugin is enabled. Only one plugin(ecommerce/ec) can be used at a time. ' + | ||
'Use AnalyticsProvider.setECommerce(true, false);'); | ||
return false; | ||
} | ||
return true; | ||
}; | ||
this._createAnalyticsScriptTag = function () { | ||
if (!accountId) { | ||
me._log('warn', 'No account id set to create analytics script tag'); | ||
return; | ||
} | ||
this._enhancedEcommerceEnabled = function () { | ||
if (!ecommerce) { | ||
this._log('warn', 'ecommerce not set. Use AnalyticsProvider.setECommerce(true, true);'); | ||
return false; | ||
} else if (!enhancedEcommerce) { | ||
this._log('warn', 'Enhanced ecommerce plugin is disabled. Use AnalyticsProvider.setECommerce(true, true);'); | ||
return false; | ||
} | ||
return true; | ||
}; | ||
/** | ||
* Track page | ||
https://developers.google.com/analytics/devguides/collection/gajs/ | ||
https://developers.google.com/analytics/devguides/collection/analyticsjs/pages | ||
* @param url | ||
* @param title | ||
* @param custom | ||
* @private | ||
*/ | ||
this._trackPage = function (url, title, custom) { | ||
var that = this, args = arguments; | ||
url = url ? url : getUrl(); | ||
title = title ? title : $document[0].title; | ||
_gaJs(function () { | ||
// http://stackoverflow.com/questions/7322288/how-can-i-set-a-page-title-with-google-analytics | ||
$window._gaq.push(["_set", "title", title]); | ||
$window._gaq.push(['_trackPageview', trackPrefix + url]); | ||
that._log('_trackPageview', url, title, args); | ||
}); | ||
_analyticsJs(function () { | ||
var opt_fieldObject = { | ||
'page': trackPrefix + url, | ||
'title': title | ||
}; | ||
angular.extend(opt_fieldObject, getUtmParams()); | ||
if (angular.isObject(custom)) { | ||
angular.extend(opt_fieldObject, custom); | ||
if (created) { | ||
me._log('warn', 'Analytics script tag already created'); | ||
return; | ||
} | ||
if (angular.isArray(accountId)) { | ||
accountId.forEach(function (trackerObj) { | ||
$window.ga(_generateCommandName('send', trackerObj), 'pageview', opt_fieldObject); | ||
}); | ||
} else { | ||
$window.ga('send', 'pageview', opt_fieldObject); | ||
} | ||
that._log('pageview', url, title, args); | ||
}); | ||
}; | ||
/** | ||
* Track event | ||
https://developers.google.com/analytics/devguides/collection/gajs/eventTrackerGuide | ||
https://developers.google.com/analytics/devguides/collection/analyticsjs/events | ||
* @param category | ||
* @param action | ||
* @param label | ||
* @param value | ||
* @param noninteraction | ||
* @param custom | ||
* @private | ||
*/ | ||
this._trackEvent = function (category, action, label, value, noninteraction, custom) { | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_trackEvent', category, action, label, value, !!noninteraction]); | ||
that._log('trackEvent', args); | ||
}); | ||
_analyticsJs(function () { | ||
var opt_fieldObject = {}; | ||
if (angular.isDefined(noninteraction)) { | ||
opt_fieldObject['nonInteraction'] = !!noninteraction; | ||
} | ||
if (angular.isObject(custom)) { | ||
angular.extend(opt_fieldObject, custom); | ||
} | ||
// inject the google analytics tag | ||
(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'); | ||
if (angular.isArray(accountId)) { | ||
accountId.forEach(function (trackerObj) { | ||
if (_checkOption('trackEvent', trackerObj)) { | ||
$window.ga(_generateCommandName('send', trackerObj), 'event', category, action, label, value, opt_fieldObject); | ||
var _cookieConfig = 'cookieConfig' in trackerObj ? trackerObj.cookieConfig : cookieConfig; | ||
var options; | ||
if (_checkOption('crossDomainLinker', trackerObj)) { | ||
trackerObj.allowLinker = trackerObj.crossDomainLinker; | ||
} | ||
angular.forEach(['name', 'allowLinker'], function(key) { | ||
if (key in trackerObj) { | ||
if (angular.isUndefined(options)) { | ||
options = {}; | ||
} | ||
options[key] = trackerObj[key]; | ||
} | ||
}); | ||
if (angular.isUndefined(options)) { | ||
$window.ga('create', trackerObj.tracker, _cookieConfig); | ||
} else { | ||
$window.ga('create', trackerObj.tracker, _cookieConfig, options); | ||
} | ||
if (options && 'allowLinker' in options && options.allowLinker) { | ||
$window.ga(_generateCommandName('require', trackerObj), 'linker'); | ||
if (_checkOption('crossLinkDomains', trackerObj)) { | ||
$window.ga(_generateCommandName('linker:autoLink', trackerObj), trackerObj.crossLinkDomains); | ||
} | ||
} | ||
}); | ||
} else if (crossDomainLinker) { | ||
$window.ga('create', accountId, cookieConfig, linkerConfig); | ||
$window.ga('require', 'linker'); | ||
if(crossLinkDomains) { | ||
$window.ga('linker:autoLink', crossLinkDomains ); | ||
} | ||
} else { | ||
$window.ga('send', 'event', category, action, label, value, opt_fieldObject); | ||
$window.ga('create', accountId, cookieConfig); | ||
} | ||
that._log('event', args); | ||
}); | ||
}; | ||
/** | ||
* Add transaction | ||
* https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiEcommerce#_gat.GA_Tracker_._addTrans | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce#addTrans | ||
* @param transactionId | ||
* @param affiliation | ||
* @param total | ||
* @param tax | ||
* @param shipping | ||
* @param city | ||
* @param state | ||
* @param country | ||
* @private | ||
*/ | ||
this._addTrans = function (transactionId, affiliation, total, tax, shipping, city, state, country, currency) { | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_addTrans', transactionId, affiliation, total, tax, shipping, city, state, country]); | ||
that._log('_addTrans', args); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._ecommerceEnabled()) { | ||
$window.ga('ecommerce:addTransaction', { | ||
id: transactionId, | ||
affiliation: affiliation, | ||
revenue: total, | ||
tax: tax, | ||
shipping: shipping, | ||
currency: currency || 'USD' | ||
}); | ||
that._log('ecommerce:addTransaction', args); | ||
if (displayFeatures) { | ||
$window.ga('require', 'displayfeatures'); | ||
} | ||
}); | ||
}; | ||
/** | ||
* Add item to transaction | ||
* https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiEcommerce#_gat.GA_Tracker_._addItem | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce#addItem | ||
* @param transactionId | ||
* @param sku | ||
* @param name | ||
* @param category | ||
* @param price | ||
* @param quantity | ||
* @private | ||
*/ | ||
this._addItem = function (transactionId, sku, name, category, price, quantity) { | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_addItem', transactionId, sku, name, category, price, quantity]); | ||
that._log('_addItem', args); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._ecommerceEnabled()) { | ||
$window.ga('ecommerce:addItem', { | ||
id: transactionId, | ||
name: name, | ||
sku: sku, | ||
category: category, | ||
price: price, | ||
quantity: quantity | ||
}); | ||
that._log('ecommerce:addItem', args); | ||
if (trackRoutes && !ignoreFirstPageLoad) { | ||
$window.ga('send', 'pageview', getUrl()); | ||
} | ||
}); | ||
}; | ||
/** | ||
* Track transaction | ||
* https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiEcommerce#_gat.GA_Tracker_._trackTrans | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce#sendingData | ||
* @private | ||
*/ | ||
this._trackTrans = function () { | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_trackTrans']); | ||
that._log('_trackTrans', args); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._ecommerceEnabled()) { | ||
$window.ga('ecommerce:send'); | ||
that._log('ecommerce:send', args); | ||
if ($window.ga) { | ||
if (ecommerce) { | ||
if (!enhancedEcommerce) { | ||
$window.ga('require', 'ecommerce', 'ecommerce.js'); | ||
} else { | ||
$window.ga('require', 'ec', 'ec.js'); | ||
} | ||
} | ||
if (enhancedLinkAttribution) { | ||
$window.ga('require', 'linkid', 'linkid.js'); | ||
} | ||
if (experimentId) { | ||
var expScript = document.createElement('script'), | ||
s = document.getElementsByTagName('script')[0]; | ||
expScript.src = "//www.google-analytics.com/cx/api.js?experiment=" + experimentId; | ||
s.parentNode.insertBefore(expScript, s); | ||
} | ||
} | ||
}); | ||
}; | ||
/** | ||
* Clear transaction | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce#clearingData | ||
* @private | ||
*/ | ||
this._clearTrans = function () { | ||
var that = this, args = arguments; | ||
_analyticsJs(function () { | ||
if (that._ecommerceEnabled()) { | ||
$window.ga('ecommerce:clear'); | ||
that._log('ecommerce:clear', args); | ||
} | ||
}); | ||
}; | ||
created = true; | ||
return true; | ||
}; | ||
/** | ||
* Enhanced Ecommerce | ||
*/ | ||
this._ecommerceEnabled = function () { | ||
return ecommerce && !enhancedEcommerce; | ||
}; | ||
/** | ||
* Add product data | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#product-data | ||
* @param productId | ||
* @param name | ||
* @param category | ||
* @param brand | ||
* @param variant | ||
* @param price | ||
* @param quantity | ||
* @param coupon | ||
* @param position | ||
*/ | ||
this._addProduct = function (productId, name, category, brand, variant, price, quantity, coupon, position) { | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_addProduct', productId, name, category, brand, variant, price, quantity, coupon, position]); | ||
that._log('_addProduct', args); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._enhancedEcommerceEnabled()) { | ||
$window.ga('ec:addProduct', { | ||
id: productId, | ||
name: name, | ||
category: category, | ||
brand: brand, | ||
variant: variant, | ||
price: price, | ||
quantity: quantity, | ||
coupon: coupon, | ||
position: position | ||
}); | ||
that._log('ec:addProduct', args); | ||
} | ||
}); | ||
}; | ||
this._enhancedEcommerceEnabled = function () { | ||
return ecommerce && enhancedEcommerce; | ||
}; | ||
/** | ||
* Add Impression data | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#impression-data | ||
* @param id | ||
* @param name | ||
* @param list | ||
* @param brand | ||
* @param category | ||
* @param variant | ||
* @param position | ||
* @param price | ||
*/ | ||
this._addImpression = function (id, name, list, brand, category, variant, position, price){ | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_addImpression', id, name, list, brand, category, variant, position, price]); | ||
that._log('_addImpression', args); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._enhancedEcommerceEnabled()) { | ||
$window.ga('ec:addImpression', { | ||
id: id, | ||
name: name, | ||
category: category, | ||
brand: brand, | ||
variant: variant, | ||
list: list, | ||
position: position, | ||
price: price | ||
}); | ||
} | ||
that._log('ec:addImpression', args); | ||
}); | ||
}; | ||
/** | ||
* Track page | ||
https://developers.google.com/analytics/devguides/collection/gajs/ | ||
https://developers.google.com/analytics/devguides/collection/analyticsjs/pages | ||
* @param url | ||
* @param title | ||
* @param custom | ||
* @private | ||
*/ | ||
this._trackPage = function (url, title, custom) { | ||
var that = this, args = arguments; | ||
url = url ? url : getUrl(); | ||
title = title ? title : $document[0].title; | ||
_gaJs(function () { | ||
// http://stackoverflow.com/questions/7322288/how-can-i-set-a-page-title-with-google-analytics | ||
$window._gaq.push(["_set", "title", title]); | ||
$window._gaq.push(['_trackPageview', trackPrefix + url]); | ||
that._log('_trackPageview', url, title, args); | ||
}); | ||
_analyticsJs(function () { | ||
var opt_fieldObject = { | ||
'page': trackPrefix + url, | ||
'title': title | ||
}; | ||
angular.extend(opt_fieldObject, getUtmParams()); | ||
if (angular.isObject(custom)) { | ||
angular.extend(opt_fieldObject, custom); | ||
} | ||
if (angular.isArray(accountId)) { | ||
accountId.forEach(function (trackerObj) { | ||
$window.ga(_generateCommandName('send', trackerObj), 'pageview', opt_fieldObject); | ||
}); | ||
} else { | ||
$window.ga('send', 'pageview', opt_fieldObject); | ||
} | ||
that._log('pageview', url, title, args); | ||
}); | ||
}; | ||
/** | ||
* Add promo data | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce | ||
* @param productId | ||
* @param name | ||
* @param creative | ||
* @param position | ||
*/ | ||
this._addPromo = function (productId, name, creative, position) { | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_addPromo', productId, name, creative, position]); | ||
that._log('_addPromo', arguments); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._enhancedEcommerceEnabled()) { | ||
$window.ga('ec:addPromo', { | ||
id: productId, | ||
name: name, | ||
creative: creative, | ||
position: position | ||
}); | ||
that._log('ec:addPromo', args); | ||
} | ||
}); | ||
}; | ||
/** | ||
* Track event | ||
https://developers.google.com/analytics/devguides/collection/gajs/eventTrackerGuide | ||
https://developers.google.com/analytics/devguides/collection/analyticsjs/events | ||
* @param category | ||
* @param action | ||
* @param label | ||
* @param value | ||
* @param noninteraction | ||
* @param custom | ||
* @private | ||
*/ | ||
this._trackEvent = function (category, action, label, value, noninteraction, custom) { | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_trackEvent', category, action, label, value, !!noninteraction]); | ||
that._log('trackEvent', args); | ||
}); | ||
_analyticsJs(function () { | ||
var opt_fieldObject = {}; | ||
if (angular.isDefined(noninteraction)) { | ||
opt_fieldObject.nonInteraction = !!noninteraction; | ||
} | ||
if (angular.isObject(custom)) { | ||
angular.extend(opt_fieldObject, custom); | ||
} | ||
if (angular.isArray(accountId)) { | ||
accountId.forEach(function (trackerObj) { | ||
if (_checkOption('trackEvent', trackerObj)) { | ||
$window.ga(_generateCommandName('send', trackerObj), 'event', category, action, label, value, opt_fieldObject); | ||
} | ||
}); | ||
} else { | ||
$window.ga('send', 'event', category, action, label, value, opt_fieldObject); | ||
} | ||
that._log('event', args); | ||
}); | ||
}; | ||
/** | ||
* get ActionFieldObject | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#action-data | ||
* @param id | ||
* @param affliation | ||
* @param revenue | ||
* @param tax | ||
* @param shipping | ||
* @param coupon | ||
* @param list | ||
* @param step | ||
* @param option | ||
*/ | ||
this._getActionFieldObject = function (id, affiliation, revenue, tax, shipping, coupon, list, step, option) { | ||
var obj = {}; | ||
if (id) { obj.id = id; } | ||
if (affiliation) { obj.affiliation = affiliation; } | ||
if (revenue) { obj.revenue = revenue; } | ||
if (tax) { obj.tax = tax; } | ||
if (shipping) { obj.shipping = shipping; } | ||
if (coupon) { obj.coupon = coupon; } | ||
if (list) { obj.list = list; } | ||
if (step) { obj.step = step; } | ||
if (option) { obj.option = option; } | ||
return obj; | ||
}; | ||
/** | ||
* Add transaction | ||
* https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiEcommerce#_gat.GA_Tracker_._addTrans | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce#addTrans | ||
* @param transactionId | ||
* @param affiliation | ||
* @param total | ||
* @param tax | ||
* @param shipping | ||
* @param city | ||
* @param state | ||
* @param country | ||
* @private | ||
*/ | ||
this._addTrans = function (transactionId, affiliation, total, tax, shipping, city, state, country, currency) { | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_addTrans', transactionId, affiliation, total, tax, shipping, city, state, country]); | ||
that._log('_addTrans', args); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._ecommerceEnabled()) { | ||
$window.ga('ecommerce:addTransaction', { | ||
id: transactionId, | ||
affiliation: affiliation, | ||
revenue: total, | ||
tax: tax, | ||
shipping: shipping, | ||
currency: currency || 'USD' | ||
}); | ||
that._log('ecommerce:addTransaction', args); | ||
} | ||
}); | ||
}; | ||
/** | ||
* Set Action being performed | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-actions | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#action-types | ||
* @param action | ||
* @param name | ||
* @param obj | ||
*/ | ||
this._setAction = function (action, obj){ | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_setAction', action, obj]); | ||
that._log('__setAction', args); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._enhancedEcommerceEnabled()) { | ||
$window.ga('ec:setAction', action, obj); | ||
that._log('ec:setAction', args); | ||
} | ||
}); | ||
}; | ||
/** | ||
* Add item to transaction | ||
* https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiEcommerce#_gat.GA_Tracker_._addItem | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce#addItem | ||
* @param transactionId | ||
* @param sku | ||
* @param name | ||
* @param category | ||
* @param price | ||
* @param quantity | ||
* @private | ||
*/ | ||
this._addItem = function (transactionId, sku, name, category, price, quantity) { | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_addItem', transactionId, sku, name, category, price, quantity]); | ||
that._log('_addItem', args); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._ecommerceEnabled()) { | ||
$window.ga('ecommerce:addItem', { | ||
id: transactionId, | ||
name: name, | ||
sku: sku, | ||
category: category, | ||
price: price, | ||
quantity: quantity | ||
}); | ||
that._log('ecommerce:addItem', args); | ||
} | ||
}); | ||
}; | ||
/** | ||
* Track Transaction | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-transactions | ||
* @param transactionId | ||
* @param affiliation | ||
* @param revenue | ||
* @param tax | ||
* @param shipping | ||
* @param coupon | ||
* @param list | ||
* @param step | ||
* @param option | ||
*/ | ||
this._trackTransaction = function (transactionId, affiliation, revenue, tax, shipping, coupon, list, step, option) { | ||
this._setAction('purchase', this._getActionFieldObject(transactionId, affiliation, revenue, tax, shipping, coupon, list, step, option)); | ||
}; | ||
/** | ||
* Track transaction | ||
* https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiEcommerce#_gat.GA_Tracker_._trackTrans | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce#sendingData | ||
* @private | ||
*/ | ||
this._trackTrans = function () { | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_trackTrans']); | ||
that._log('_trackTrans', args); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._ecommerceEnabled()) { | ||
$window.ga('ecommerce:send'); | ||
that._log('ecommerce:send', args); | ||
} | ||
}); | ||
}; | ||
/** | ||
* Track Refund | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-refunds | ||
* @param transactionId | ||
* | ||
*/ | ||
this._trackRefund = function (transactionId) { | ||
this._setAction('refund', this._getActionFieldObject(transactionId)); | ||
}; | ||
/** | ||
* Clear transaction | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce#clearingData | ||
* @private | ||
*/ | ||
this._clearTrans = function () { | ||
var that = this, args = arguments; | ||
_analyticsJs(function () { | ||
if (that._ecommerceEnabled()) { | ||
$window.ga('ecommerce:clear'); | ||
that._log('ecommerce:clear', args); | ||
} | ||
}); | ||
}; | ||
/** | ||
* Track Checkout | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-checkout | ||
* @param step | ||
* @param option | ||
* | ||
*/ | ||
this._trackCheckOut = function (step, option) { | ||
this._setAction('checkout', this._getActionFieldObject(null, null, null, null, null, null, null, step, option)); | ||
}; | ||
/** | ||
* Enhanced Ecommerce | ||
*/ | ||
/** | ||
* Track add/remove to cart | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#add-remove-cart | ||
* @param action | ||
* | ||
*/ | ||
this._trackCart = function (action) { | ||
if (['add', 'remove'].indexOf(action) !== -1) { | ||
this._setAction(action); | ||
this._send('event', 'UX', 'click', action + ' to cart'); | ||
} | ||
}; | ||
/** | ||
* Add product data | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#product-data | ||
* @param productId | ||
* @param name | ||
* @param category | ||
* @param brand | ||
* @param variant | ||
* @param price | ||
* @param quantity | ||
* @param coupon | ||
* @param position | ||
*/ | ||
this._addProduct = function (productId, name, category, brand, variant, price, quantity, coupon, position) { | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_addProduct', productId, name, category, brand, variant, price, quantity, coupon, position]); | ||
that._log('_addProduct', args); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._enhancedEcommerceEnabled()) { | ||
$window.ga('ec:addProduct', { | ||
id: productId, | ||
name: name, | ||
category: category, | ||
brand: brand, | ||
variant: variant, | ||
price: price, | ||
quantity: quantity, | ||
coupon: coupon, | ||
position: position | ||
}); | ||
that._log('ec:addProduct', args); | ||
} | ||
}); | ||
}; | ||
/** | ||
* Track promo click | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-promo-clicks | ||
* @param promotionName | ||
* | ||
*/ | ||
this._promoClick = function (promotionName) { | ||
this._setAction('promo_click'); | ||
this._send('event', 'Internal Promotions', 'click', promotionName); | ||
}; | ||
/** | ||
* Add Impression data | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#impression-data | ||
* @param id | ||
* @param name | ||
* @param list | ||
* @param brand | ||
* @param category | ||
* @param variant | ||
* @param position | ||
* @param price | ||
*/ | ||
this._addImpression = function (id, name, list, brand, category, variant, position, price){ | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_addImpression', id, name, list, brand, category, variant, position, price]); | ||
that._log('_addImpression', args); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._enhancedEcommerceEnabled()) { | ||
$window.ga('ec:addImpression', { | ||
id: id, | ||
name: name, | ||
category: category, | ||
brand: brand, | ||
variant: variant, | ||
list: list, | ||
position: position, | ||
price: price | ||
}); | ||
that._log('ec:addImpression', args); | ||
} | ||
}); | ||
}; | ||
/** | ||
* Track product click | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-promo-clicks | ||
* @param promotionName | ||
* | ||
*/ | ||
this._productClick = function (listName) { | ||
this._setAction('click', this._getActionFieldObject(null, null, null, null, null, null, listName, null, null)); | ||
this._send('event', 'UX', 'click', listName); | ||
}; | ||
/** | ||
* Add promo data | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce | ||
* @param productId | ||
* @param name | ||
* @param creative | ||
* @param position | ||
*/ | ||
this._addPromo = function (productId, name, creative, position) { | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_addPromo', productId, name, creative, position]); | ||
that._log('_addPromo', arguments); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._enhancedEcommerceEnabled()) { | ||
$window.ga('ec:addPromo', { | ||
id: productId, | ||
name: name, | ||
creative: creative, | ||
position: position | ||
}); | ||
that._log('ec:addPromo', args); | ||
} | ||
}); | ||
}; | ||
/** | ||
* Send custom events | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/user-timings#implementation | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/social-interactions#implementation | ||
* | ||
* @param obj | ||
* @private | ||
*/ | ||
this._send = function () { | ||
var that = this; | ||
var args = Array.prototype.slice.call(arguments); | ||
args.unshift('send'); | ||
_analyticsJs(function () { | ||
$window.ga.apply(this, args); | ||
that._log(args); | ||
}); | ||
}; | ||
/** | ||
* get ActionFieldObject | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#action-data | ||
* @param id | ||
* @param affliation | ||
* @param revenue | ||
* @param tax | ||
* @param shipping | ||
* @param coupon | ||
* @param list | ||
* @param step | ||
* @param option | ||
*/ | ||
this._getActionFieldObject = function (id, affiliation, revenue, tax, shipping, coupon, list, step, option) { | ||
var obj = {}; | ||
if (id) { obj.id = id; } | ||
if (affiliation) { obj.affiliation = affiliation; } | ||
if (revenue) { obj.revenue = revenue; } | ||
if (tax) { obj.tax = tax; } | ||
if (shipping) { obj.shipping = shipping; } | ||
if (coupon) { obj.coupon = coupon; } | ||
if (list) { obj.list = list; } | ||
if (step) { obj.step = step; } | ||
if (option) { obj.option = option; } | ||
return obj; | ||
}; | ||
this._pageView = function() { | ||
this._send('pageview'); | ||
}; | ||
/** | ||
* Set Action being performed | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-actions | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#action-types | ||
* @param action | ||
* @param name | ||
* @param obj | ||
*/ | ||
this._setAction = function (action, obj){ | ||
var that = this, args = arguments; | ||
_gaJs(function () { | ||
$window._gaq.push(['_setAction', action, obj]); | ||
that._log('__setAction', args); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._enhancedEcommerceEnabled()) { | ||
$window.ga('ec:setAction', action, obj); | ||
that._log('ec:setAction', args); | ||
} | ||
}); | ||
}; | ||
/** | ||
* Set custom dimensions, metrics or experiment | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/custom-dims-mets | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#customs | ||
* @param name | ||
* @param value | ||
* @private | ||
*/ | ||
this._set = function (name, value) { | ||
var that = this; | ||
_analyticsJs(function () { | ||
$window.ga('set', name, value); | ||
that._log('set', name, value); | ||
}); | ||
}; | ||
/** | ||
* Track Transaction | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-transactions | ||
* @param transactionId | ||
* @param affiliation | ||
* @param revenue | ||
* @param tax | ||
* @param shipping | ||
* @param coupon | ||
* @param list | ||
* @param step | ||
* @param option | ||
*/ | ||
this._trackTransaction = function (transactionId, affiliation, revenue, tax, shipping, coupon, list, step, option) { | ||
this._setAction('purchase', this._getActionFieldObject(transactionId, affiliation, revenue, tax, shipping, coupon, list, step, option)); | ||
}; | ||
/** | ||
* Track Refund | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-refunds | ||
* @param transactionId | ||
* | ||
*/ | ||
this._trackRefund = function (transactionId) { | ||
this._setAction('refund', this._getActionFieldObject(transactionId)); | ||
}; | ||
// creates the ganalytics tracker | ||
if (!delayScriptTag) { | ||
if (analyticsJS) { | ||
this._createAnalyticsScriptTag(); | ||
} else { | ||
this._createScriptTag(); | ||
} | ||
} | ||
/** | ||
* Track Checkout | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-checkout | ||
* @param step | ||
* @param option | ||
* | ||
*/ | ||
this._trackCheckOut = function (step, option) { | ||
this._setAction('checkout', this._getActionFieldObject(null, null, null, null, null, null, null, step, option)); | ||
}; | ||
// activates page tracking | ||
if (trackRoutes) { | ||
$rootScope.$on(pageEvent, function () { | ||
me._trackPage(); | ||
}); | ||
} | ||
/** | ||
* Track add/remove to cart | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#add-remove-cart | ||
* @param action | ||
* | ||
*/ | ||
this._trackCart = function (action) { | ||
if (['add', 'remove'].indexOf(action) !== -1) { | ||
this._setAction(action); | ||
this._send('event', 'UX', 'click', action + ' to cart'); | ||
} | ||
}; | ||
/** | ||
* Track User Timings | ||
* @timingCategory (Required): A string for categorizing all user timing variables into logical groups(e.g jQuery). | ||
* @timingVar (Required): A string to identify the variable being recorded(e.g. JavaScript Load). | ||
* @timingValue (Required): The number of milliseconds in elapsed time to report to Google Analytics(e.g. 20). | ||
* @timingLabel (Not Required): A string that can be used to add flexibility in visualizing user timings in the reports(e.g. Google CDN). | ||
*/ | ||
this._trackTimings = function (timingCategory, timingVar, timingValue, timingLabel) { | ||
this._send('timing', timingCategory, timingVar, timingValue, timingLabel); | ||
}; | ||
/** | ||
* Track promo click | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-promo-clicks | ||
* @param promotionName | ||
* | ||
*/ | ||
this._promoClick = function (promotionName) { | ||
this._setAction('promo_click'); | ||
this._send('event', 'Internal Promotions', 'click', promotionName); | ||
}; | ||
return { | ||
_logs: me._logs, | ||
displayFeatures: displayFeatures, | ||
ecommerce: ecommerce, | ||
enhancedEcommerce: enhancedEcommerce, | ||
enhancedLinkAttribution: enhancedLinkAttribution, | ||
getUrl: getUrl, | ||
experimentId: experimentId, | ||
ignoreFirstPageLoad: ignoreFirstPageLoad, | ||
delayScriptTag: delayScriptTag, | ||
setCookieConfig: me._setCookieConfig, | ||
getCookieConfig: function () { | ||
return cookieConfig; | ||
}, | ||
createAnalyticsScriptTag: function (config) { | ||
if (config) { | ||
cookieConfig = config; | ||
} | ||
/** | ||
* Track product click | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-promo-clicks | ||
* @param promotionName | ||
* | ||
*/ | ||
this._productClick = function (listName) { | ||
this._setAction('click', this._getActionFieldObject(null, null, null, null, null, null, listName, null, null)); | ||
this._send('event', 'UX', 'click', listName); | ||
}; | ||
return me._createAnalyticsScriptTag(); | ||
}, | ||
createScriptTag: function (config) { | ||
if (config) { | ||
cookieConfig = config; | ||
/** | ||
* Send custom events | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/user-timings#implementation | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/social-interactions#implementation | ||
* | ||
* @param obj | ||
* @private | ||
*/ | ||
this._send = function () { | ||
var that = this; | ||
var args = Array.prototype.slice.call(arguments); | ||
args.unshift('send'); | ||
_analyticsJs(function () { | ||
$window.ga.apply(this, args); | ||
that._log(args); | ||
}); | ||
}; | ||
this._pageView = function() { | ||
this._send('pageview'); | ||
}; | ||
/** | ||
* Set custom dimensions, metrics or experiment | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/custom-dims-mets | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#customs | ||
* @param name | ||
* @param value | ||
* @private | ||
*/ | ||
this._set = function (name, value) { | ||
var that = this; | ||
_analyticsJs(function () { | ||
$window.ga('set', name, value); | ||
that._log('set', name, value); | ||
}); | ||
}; | ||
// creates the ganalytics tracker | ||
if (!delayScriptTag) { | ||
if (analyticsJS) { | ||
this._createAnalyticsScriptTag(); | ||
} else { | ||
this._createScriptTag(); | ||
} | ||
} | ||
return me._createScriptTag(); | ||
}, | ||
ecommerceEnabled: function () { | ||
return me._ecommerceEnabled(); | ||
}, | ||
enhancedEcommerceEnabled: function () { | ||
return me._enhancedEcommerceEnabled(); | ||
}, | ||
trackPage: function (url, title, custom) { | ||
me._trackPage(url, title, custom); | ||
}, | ||
trackEvent: function (category, action, label, value, noninteraction, custom) { | ||
me._trackEvent(category, action, label, value, noninteraction, custom); | ||
}, | ||
addTrans: function (transactionId, affiliation, total, tax, shipping, city, state, country, currency) { | ||
me._addTrans(transactionId, affiliation, total, tax, shipping, city, state, country, currency); | ||
}, | ||
addItem: function (transactionId, sku, name, category, price, quantity) { | ||
me._addItem(transactionId, sku, name, category, price, quantity); | ||
}, | ||
trackTrans: function () { | ||
me._trackTrans(); | ||
}, | ||
clearTrans: function () { | ||
me._clearTrans(); | ||
}, | ||
addProduct: function (productId, name, category, brand, variant, price, quantity, coupon, position) { | ||
me._addProduct(productId, name, category, brand, variant, price, quantity, coupon, position); | ||
}, | ||
addPromo: function (productId, name, creative, position) { | ||
me._addPromo(productId, name, creative, position); | ||
}, | ||
addImpression: function (productId, name, list, brand, category, variant, position, price) { | ||
me._addImpression(productId, name, list, brand, category, variant, position, price); | ||
}, | ||
productClick: function (listName) { | ||
me._productClick(listName); | ||
}, | ||
promoClick : function (promotionName) { | ||
me._promoClick(promotionName); | ||
}, | ||
trackDetail: function () { | ||
me._setAction('detail'); | ||
me._pageView(); | ||
}, | ||
trackCart: function (action) { | ||
me._trackCart(action); | ||
}, | ||
trackCheckout: function (step, option) { | ||
me._trackCheckOut(step, option); | ||
}, | ||
trackTimings: function (timingCategory, timingVar, timingValue, timingLabel) { | ||
me._trackTimings(timingCategory, timingVar, timingValue, timingLabel); | ||
}, | ||
trackTransaction: function (transactionId, affiliation, revenue, tax, shipping, coupon, list, step, option){ | ||
me._trackTransaction(transactionId, affiliation, revenue, tax, shipping, coupon, list, step, option); | ||
}, | ||
setAction: function (action, obj) { | ||
me._setAction(action, obj); | ||
}, | ||
send: function (obj) { | ||
me._send(obj); | ||
}, | ||
pageView: function () { | ||
me._pageView(); | ||
}, | ||
set: function (name, value) { | ||
me._set(name, value); | ||
// activates page tracking | ||
if (trackRoutes) { | ||
$rootScope.$on(pageEvent, function () { | ||
me._trackPage(); | ||
}); | ||
} | ||
}; | ||
}]; | ||
}) | ||
.directive('gaTrackEvent', ['Analytics', '$parse', function (Analytics, $parse) { | ||
return { | ||
restrict: 'A', | ||
link: function (scope, element, attrs) { | ||
var options = $parse(attrs.gaTrackEvent); | ||
element.bind('click', function () { | ||
if(attrs.gaTrackEventIf){ | ||
if(!scope.$eval(attrs.gaTrackEventIf)){ | ||
return; // Cancel this event if we don't pass the ga-track-event-if condition | ||
/** | ||
* Track User Timings | ||
* @timingCategory (Required): A string for categorizing all user timing variables into logical groups(e.g jQuery). | ||
* @timingVar (Required): A string to identify the variable being recorded(e.g. JavaScript Load). | ||
* @timingValue (Required): The number of milliseconds in elapsed time to report to Google Analytics(e.g. 20). | ||
* @timingLabel (Not Required): A string that can be used to add flexibility in visualizing user timings in the reports(e.g. Google CDN). | ||
*/ | ||
this._trackTimings = function (timingCategory, timingVar, timingValue, timingLabel) { | ||
this._send('timing', timingCategory, timingVar, timingValue, timingLabel); | ||
}; | ||
return { | ||
_logs: me._logs, | ||
displayFeatures: displayFeatures, | ||
ecommerce: ecommerce, | ||
enhancedEcommerce: enhancedEcommerce, | ||
enhancedLinkAttribution: enhancedLinkAttribution, | ||
getUrl: getUrl, | ||
experimentId: experimentId, | ||
ignoreFirstPageLoad: ignoreFirstPageLoad, | ||
delayScriptTag: delayScriptTag, | ||
setCookieConfig: me._setCookieConfig, | ||
getCookieConfig: function () { | ||
return cookieConfig; | ||
}, | ||
createAnalyticsScriptTag: function (config) { | ||
if (config) { | ||
cookieConfig = config; | ||
} | ||
return me._createAnalyticsScriptTag(); | ||
}, | ||
createScriptTag: function (config) { | ||
if (config) { | ||
cookieConfig = config; | ||
} | ||
return me._createScriptTag(); | ||
}, | ||
ecommerceEnabled: function () { | ||
return me._ecommerceEnabled(); | ||
}, | ||
enhancedEcommerceEnabled: function () { | ||
return me._enhancedEcommerceEnabled(); | ||
}, | ||
trackPage: function (url, title, custom) { | ||
me._trackPage(url, title, custom); | ||
}, | ||
trackEvent: function (category, action, label, value, noninteraction, custom) { | ||
me._trackEvent(category, action, label, value, noninteraction, custom); | ||
}, | ||
addTrans: function (transactionId, affiliation, total, tax, shipping, city, state, country, currency) { | ||
me._addTrans(transactionId, affiliation, total, tax, shipping, city, state, country, currency); | ||
}, | ||
addItem: function (transactionId, sku, name, category, price, quantity) { | ||
me._addItem(transactionId, sku, name, category, price, quantity); | ||
}, | ||
trackTrans: function () { | ||
me._trackTrans(); | ||
}, | ||
clearTrans: function () { | ||
me._clearTrans(); | ||
}, | ||
addProduct: function (productId, name, category, brand, variant, price, quantity, coupon, position) { | ||
me._addProduct(productId, name, category, brand, variant, price, quantity, coupon, position); | ||
}, | ||
addPromo: function (productId, name, creative, position) { | ||
me._addPromo(productId, name, creative, position); | ||
}, | ||
addImpression: function (productId, name, list, brand, category, variant, position, price) { | ||
me._addImpression(productId, name, list, brand, category, variant, position, price); | ||
}, | ||
productClick: function (listName) { | ||
me._productClick(listName); | ||
}, | ||
promoClick : function (promotionName) { | ||
me._promoClick(promotionName); | ||
}, | ||
trackDetail: function () { | ||
me._setAction('detail'); | ||
me._pageView(); | ||
}, | ||
trackCart: function (action) { | ||
me._trackCart(action); | ||
}, | ||
trackCheckout: function (step, option) { | ||
me._trackCheckOut(step, option); | ||
}, | ||
trackTimings: function (timingCategory, timingVar, timingValue, timingLabel) { | ||
me._trackTimings(timingCategory, timingVar, timingValue, timingLabel); | ||
}, | ||
trackTransaction: function (transactionId, affiliation, revenue, tax, shipping, coupon, list, step, option){ | ||
me._trackTransaction(transactionId, affiliation, revenue, tax, shipping, coupon, list, step, option); | ||
}, | ||
setAction: function (action, obj) { | ||
me._setAction(action, obj); | ||
}, | ||
send: function (obj) { | ||
me._send(obj); | ||
}, | ||
pageView: function () { | ||
me._pageView(); | ||
}, | ||
set: function (name, value) { | ||
me._set(name, value); | ||
} | ||
if (options.length > 1) { | ||
Analytics.trackEvent.apply(Analytics, options(scope)); | ||
} | ||
}); | ||
} | ||
}; | ||
}]); | ||
}; | ||
}]; | ||
}) | ||
.directive('gaTrackEvent', ['Analytics', '$parse', function (Analytics, $parse) { | ||
return { | ||
restrict: 'A', | ||
link: function (scope, element, attrs) { | ||
var options = $parse(attrs.gaTrackEvent); | ||
element.bind('click', function () { | ||
if(attrs.gaTrackEventIf){ | ||
if(!scope.$eval(attrs.gaTrackEventIf)){ | ||
return; // Cancel this event if we don't pass the ga-track-event-if condition | ||
} | ||
} | ||
if (options.length > 1) { | ||
Analytics.trackEvent.apply(Analytics, options(scope)); | ||
} | ||
}); | ||
} | ||
}; | ||
}]); | ||
})(window, document, window.angular); |
@@ -1,3 +0,2 @@ | ||
/* global before, beforeEach, describe, expect, inject, it, module, spyOn */ | ||
/* global before, beforeEach, describe, document, expect, inject, it, module, spyOn */ | ||
'use strict'; | ||
@@ -423,3 +422,3 @@ | ||
it('should add product Impression', function () { | ||
it('should add product impression', function () { | ||
inject(function (Analytics) { | ||
@@ -495,3 +494,3 @@ expect(Analytics._logs.length).toBe(0); | ||
expect(Analytics._logs[1][1][0]).toBe('click'); | ||
expect(Analytics._logs[1][1][1]['list']).toBe(dummyList); | ||
expect(Analytics._logs[1][1][1].list).toBe(dummyList); | ||
expect(Analytics._logs[2][0]).toEqual([ 'send', 'event', 'UX', 'click', 'dummy list' ]); | ||
@@ -527,3 +526,3 @@ }); | ||
it('should track Remove from cart event', function () { | ||
it('should track remove from cart event', function () { | ||
inject(function (Analytics) { | ||
@@ -862,3 +861,3 @@ expect(Analytics._logs.length).toBe(0); | ||
element = '<div ga-track-event="[\'button\', \'click\', \'Some Button\']" ga-track-event-if="true">test</div>', | ||
element = '<div ga-track-event="[\'button\', \'click\', \'Some Button\']" ga-track-event-if="true">test</div>'; | ||
compiled = $compile(element)(scope); | ||
@@ -865,0 +864,0 @@ scope.$digest(); |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
131405
314
2679