Socket
Socket
Sign inDemoInstall

angular-google-analytics

Package Overview
Dependencies
Maintainers
1
Versions
15
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

angular-google-analytics - npm Package Compare versions

Comparing version 0.0.17 to 0.0.18

2

bower.json

@@ -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>",

@@ -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();

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc