angular-google-analytics
Advanced tools
Comparing version 1.1.3 to 1.1.4
@@ -21,8 +21,3 @@ { | ||
"homepage": "https://github.com/revolunet/angular-google-analytics", | ||
"license": [ | ||
{ | ||
"type": "MIT", | ||
"url": "http://revolunet.mit-license.org" | ||
} | ||
], | ||
"license": "MIT", | ||
"repository": { | ||
@@ -32,3 +27,3 @@ "type": "git", | ||
}, | ||
"main": "./dist/angular-google-analytics.js", | ||
"main": "./dist/angular-google-analytics.min.js", | ||
"dependencies": { | ||
@@ -35,0 +30,0 @@ "angular": ">=1" |
/** | ||
* Angular Google Analytics - Easy tracking for your AngularJS application | ||
* @version v1.1.3 - 2015-10-26 | ||
* @version v1.1.4 - 2015-12-11 | ||
* @link http://github.com/revolunet/angular-google-analytics | ||
@@ -9,4 +9,14 @@ * @author Julien Bouquillon <julien@revolunet.com> (https://github.com/revolunet) | ||
*/ | ||
(function (window, document, angular, undefined) { | ||
/* globals define */ | ||
(function (root, factory) { | ||
'use strict'; | ||
if (typeof define === 'function' && define.amd) { | ||
define(['angular'], factory); | ||
} else if (typeof module === 'object' && module.exports) { | ||
module.exports = factory(require('angular')); | ||
} else { | ||
factory(root.angular); | ||
} | ||
}(this, function (angular, undefined) { | ||
'use strict'; | ||
angular.module('angular-google-analytics', []) | ||
@@ -21,2 +31,3 @@ .provider('Analytics', function () { | ||
currency = 'USD', | ||
debugMode = false, | ||
delayScriptTag = false, | ||
@@ -36,2 +47,3 @@ displayFeatures = false, | ||
testMode = false, | ||
traceDebuggingMode = false, | ||
trackPrefix = '', | ||
@@ -63,4 +75,4 @@ trackRoutes = true, | ||
this.trackPages = function (doTrack) { | ||
trackRoutes = doTrack; | ||
this.trackPages = function (val) { | ||
trackRoutes = !!val; | ||
return this; | ||
@@ -176,2 +188,8 @@ }; | ||
this.enterDebugMode = function (enableTraceDebugging) { | ||
debugMode = true; | ||
traceDebuggingMode = !!enableTraceDebugging; | ||
return this; | ||
}; | ||
/** | ||
@@ -385,2 +403,3 @@ * Public Service | ||
var document = $document[0]; | ||
var scriptSource; | ||
@@ -396,3 +415,2 @@ if (displayFeatures === true) { | ||
(function () { | ||
var document = $document[0]; | ||
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; | ||
@@ -422,4 +440,5 @@ ga.src = scriptSource; | ||
var document = $document[0]; | ||
var protocol = hybridMobileSupport === true ? 'https:' : ''; | ||
var scriptSource = protocol + '//www.google-analytics.com/analytics.js'; | ||
var scriptSource = protocol + '//www.google-analytics.com/' + (debugMode ? 'analytics_debug.js' : 'analytics.js'); | ||
if (testMode !== true) { | ||
@@ -440,2 +459,6 @@ // If not in test mode inject the Google Analytics tag | ||
if (traceDebuggingMode) { | ||
$window.ga_debug = { trace: true }; | ||
} | ||
accounts.forEach(function (trackerObj) { | ||
@@ -514,3 +537,3 @@ trackerObj.crossDomainLinker = isPropertyDefined('crossDomainLinker', trackerObj) ? trackerObj.crossDomainLinker : crossDomainLinker; | ||
if (trackRoutes && !ignoreFirstPageLoad) { | ||
_ga(generateCommandName('send', trackerObj), 'pageview', getUrl()); | ||
_ga(generateCommandName('send', trackerObj), 'pageview', trackPrefix + getUrl()); | ||
} | ||
@@ -920,7 +943,8 @@ }); | ||
* @param action | ||
* @param list | ||
* @private | ||
*/ | ||
this._trackCart = function (action) { | ||
this._trackCart = function (action, listName) { | ||
if (['add', 'remove'].indexOf(action) !== -1) { | ||
this._setAction(action); | ||
this._setAction(action, { list: listName }); | ||
this._trackEvent('UX', 'click', action + (action === 'add' ? ' to cart' : ' from cart')); | ||
@@ -1029,2 +1053,3 @@ } | ||
currency: currency, | ||
debugMode: debugMode, | ||
delayScriptTag: delayScriptTag, | ||
@@ -1043,2 +1068,3 @@ displayFeatures: displayFeatures, | ||
testMode: testMode, | ||
traceDebuggingMode: traceDebuggingMode, | ||
trackPrefix: trackPrefix, | ||
@@ -1115,3 +1141,3 @@ trackRoutes: trackRoutes, | ||
}, | ||
trackCart: function (action) { | ||
trackCart: function (action, list) { | ||
that._trackCart.apply(that, arguments); | ||
@@ -1162,2 +1188,3 @@ }, | ||
}]); | ||
})(window, document, window.angular); | ||
return angular.module('angular-google-analytics'); | ||
})); |
/** | ||
* Angular Google Analytics - Easy tracking for your AngularJS application | ||
* @version v1.1.3 - 2015-10-26 | ||
* @version v1.1.4 - 2015-12-11 | ||
* @link http://github.com/revolunet/angular-google-analytics | ||
@@ -9,2 +9,2 @@ * @author Julien Bouquillon <julien@revolunet.com> (https://github.com/revolunet) | ||
*/ | ||
!function(a,b,c,d){"use strict";c.module("angular-google-analytics",[]).provider("Analytics",function(){var e,f,g,h,i,j=!0,k="auto",l=!1,m=!1,n="USD",o=!1,p=!1,q=!1,r=!1,s=!1,t=!1,u=!1,v=!1,w=!1,x="$routeChangeSuccess",y=!1,z="",A=!0,B=!1;this.log=[],this.offlineQueue=[],this.setAccount=function(a){return e=c.isUndefined(a)||a===!1?d:c.isArray(a)?a:c.isObject(a)?[a]:[{tracker:a,trackEvent:!0}],this},this.trackPages=function(a){return A=a,this},this.trackPrefix=function(a){return z=a,this},this.setDomainName=function(a){return g=a,this},this.useDisplayFeatures=function(a){return p=!!a,this},this.useAnalytics=function(a){return j=!!a,this},this.useEnhancedLinkAttribution=function(a){return s=!!a,this},this.useCrossDomainLinker=function(a){return m=!!a,this},this.setCrossLinkDomains=function(a){return f=a,this},this.setPageEvent=function(a){return x=a,this},this.setCookieConfig=function(a){return k=a,this},this.useECommerce=function(a,b){return q=!!a,r=!!b,this},this.setCurrency=function(a){return n=a,this},this.setRemoveRegExp=function(a){return a instanceof RegExp&&(i=a),this},this.setExperimentId=function(a){return h=a,this},this.ignoreFirstPageLoad=function(a){return t=!!a,this},this.trackUrlParams=function(a){return B=!!a,this},this.setHybridMobileSupport=function(a){return v=!!a,this},this.startOffline=function(a){return w=!!a,w===!0&&this.delayScriptTag(!0),this},this.delayScriptTag=function(a){return o=!!a,this},this.logAllCalls=function(a){return u=!!a,this},this.enterTestMode=function(){return y=!0,this},this.$get=["$document","$location","$log","$rootScope","$window",function(C,D,E,F,G){var H=this,I=function(a,b){return c.isString(b)?b+"."+a:J("name",b)?b.name+"."+a:a},J=function(a,b){return c.isObject(b)&&c.isDefined(b[a])},K=function(a,b,c){return J(a,b)&&b[a]===c},L=function(){var a=B?D.url():D.path();return i?a.replace(i,""):a},M=function(){var a={utm_source:"campaignSource",utm_medium:"campaignMedium",utm_term:"campaignTerm",utm_content:"campaignContent",utm_campaign:"campaignName"},b={};return c.forEach(D.search(),function(d,e){var f=a[e];c.isDefined(f)&&(b[f]=d)}),b},N=function(a,b,c,d,e,f,g,h,i){var j={};return a&&(j.id=a),b&&(j.affiliation=b),c&&(j.revenue=c),d&&(j.tax=d),e&&(j.shipping=e),f&&(j.coupon=f),g&&(j.list=g),h&&(j.step=h),i&&(j.option=i),j},O=function(a){!j&&G._gaq&&"function"==typeof a&&a()},P=function(){var a=Array.prototype.slice.call(arguments);return w===!0?void H.offlineQueue.push([P,a]):(G._gaq||(G._gaq=[]),u===!0&&H._log.apply(H,a),void G._gaq.push(a))},Q=function(a){j&&G.ga&&"function"==typeof a&&a()},R=function(){var a=Array.prototype.slice.call(arguments);return w===!0?void H.offlineQueue.push([R,a]):"function"!=typeof G.ga?void H._log("warn","ga function not set on window"):(u===!0&&H._log.apply(H,a),void G.ga.apply(null,a))},S=function(a){var b=Array.prototype.slice.call(arguments,1),c=b[0],d=[];return"function"==typeof a?e.forEach(function(b){a(b)&&d.push(b)}):d=e,0===d.length?void R.apply(H,b):void d.forEach(function(a){(!J("select",a)||"function"!=typeof a.select||a.select(b))&&(b[0]=I(c,a),R.apply(H,b))})};return this._log=function(){var a=Array.prototype.slice.call(arguments);if(a.length>0){if(a.length>1)switch(a[0]){case"debug":case"error":case"info":case"log":case"warn":E[a[0]](a.slice(1))}H.log.push(a)}},this._createScriptTag=function(){if(!e||e.length<1)return void H._log("warn","No account id set to create script tag");if(e.length>1&&(H._log("warn","Multiple trackers are not supported with ga.js. Using first tracker only"),e=e.slice(0,1)),l===!0)return void H._log("warn","ga.js or analytics.js script tag already created");P("_setAccount",e[0].tracker),g&&P("_setDomainName",g),s&&P("_require","inpage_linkid","//www.google-analytics.com/plugins/ga/inpage_linkid.js"),A&&!t&&(i?P("_trackPageview",L()):P("_trackPageview"));var a;return a=p===!0?("https:"===b.location.protocol?"https://":"http://")+"stats.g.doubleclick.net/dc.js":("https:"===b.location.protocol?"https://ssl":"http://www")+".google-analytics.com/ga.js",y!==!0?!function(){var b=C[0],c=b.createElement("script");c.type="text/javascript",c.async=!0,c.src=a;var d=b.getElementsByTagName("script")[0];d.parentNode.insertBefore(c,d)}():H._log("inject",a),l=!0,!0},this._createAnalyticsScriptTag=function(){if(!e)return void H._log("warn","No account id set to create analytics script tag");if(l===!0)return void H._log("warn","ga.js or analytics.js script tag already created");var d=v===!0?"https:":"",g=d+"//www.google-analytics.com/analytics.js";if(y!==!0?!function(a,b,c,d,e,f,g){a.GoogleAnalyticsObject=e,a[e]=a[e]||function(){(a[e].q=a[e].q||[]).push(arguments)},a[e].l=1*new Date,f=b.createElement(c),g=b.getElementsByTagName(c)[0],f.async=1,f.src=d,g.parentNode.insertBefore(f,g)}(a,b,"script",g,"ga"):("function"!=typeof G.ga&&(G.ga=function(){}),H._log("inject",g)),e.forEach(function(a){a.crossDomainLinker=J("crossDomainLinker",a)?a.crossDomainLinker:m,a.crossLinkDomains=J("crossLinkDomains",a)?a.crossLinkDomains:f,a.displayFeatures=J("displayFeatures",a)?a.displayFeatures:p,a.enhancedLinkAttribution=J("enhancedLinkAttribution",a)?a.enhancedLinkAttribution:s,a.set=J("set",a)?a.set:{},a.trackEcommerce=J("trackEcommerce",a)?a.trackEcommerce:q,a.trackEvent=J("trackEvent",a)?a.trackEvent:!1;var b={};J("fields",a)?b=a.fields:J("cookieConfig",a)?c.isString(a.cookieConfig)?b.cookieDomain=a.cookieConfig:b=a.cookieConfig:c.isString(k)?b.cookieDomain=k:k&&(b=k),a.crossDomainLinker===!0&&(b.allowLinker=!0),J("name",a)&&(b.name=a.name),a.fields=b,R("create",a.tracker,a.fields),v===!0&&R(I("set",a),"checkProtocolTask",null);for(var d in a.set)a.set.hasOwnProperty(d)&&R(I("set",a),d,a.set[d]);a.crossDomainLinker===!0&&(R(I("require",a),"linker"),c.isDefined(a.crossLinkDomains)&&R(I("linker:autoLink",a),a.crossLinkDomains)),a.displayFeatures&&R(I("require",a),"displayfeatures"),a.trackEcommerce&&(r?(R(I("require",a),"ec"),R(I("set",a),"&cu",n)):R(I("require",a),"ecommerce")),a.enhancedLinkAttribution&&R(I("require",a),"linkid"),A&&!t&&R(I("send",a),"pageview",L())}),h){var i=b.createElement("script"),j=b.getElementsByTagName("script")[0];i.src=d+"//www.google-analytics.com/cx/api.js?experiment="+h,j.parentNode.insertBefore(i,j)}return l=!0,!0},this._ecommerceEnabled=function(a,b){var c=q&&!r;return a===!0&&c===!1&&(q&&r?H._log("warn",b+" is not available when Enhanced Ecommerce is enabled with analytics.js"):H._log("warn","Ecommerce must be enabled to use "+b+" with analytics.js")),c},this._enhancedEcommerceEnabled=function(a,b){var c=q&&r;return a===!0&&c===!1&&H._log("warn","Enhanced Ecommerce must be enabled to use "+b+" with analytics.js"),c},this._trackPage=function(a,b,e){a=a?a:L(),b=b?b:C[0].title,O(function(){P("_set","title",b),P("_trackPageview",z+a)}),Q(function(){var f={page:z+a,title:b};c.extend(f,M()),c.isObject(e)&&c.extend(f,e),S(d,"send","pageview",f)})},this._trackEvent=function(a,b,d,e,f,g){O(function(){P("_trackEvent",a,b,d,e,!!f)}),Q(function(){var h={},i=function(a){return K("trackEvent",a,!0)};c.isDefined(f)&&(h.nonInteraction=!!f),c.isObject(g)&&c.extend(h,g),S(i,"send","event",a,b,d,e,h)})},this._addTrans=function(a,b,c,d,e,f,g,h,i){O(function(){P("_addTrans",a,b,c,d,e,f,g,h)}),Q(function(){if(H._ecommerceEnabled(!0,"addTrans")){var f=function(a){return K("trackEcommerce",a,!0)};S(f,"ecommerce:addTransaction",{id:a,affiliation:b,revenue:c,tax:d,shipping:e,currency:i||"USD"})}})},this._addItem=function(a,b,c,d,e,f){O(function(){P("_addItem",a,b,c,d,e,f)}),Q(function(){if(H._ecommerceEnabled(!0,"addItem")){var g=function(a){return K("trackEcommerce",a,!0)};S(g,"ecommerce:addItem",{id:a,name:c,sku:b,category:d,price:e,quantity:f})}})},this._trackTrans=function(){O(function(){P("_trackTrans")}),Q(function(){if(H._ecommerceEnabled(!0,"trackTrans")){var a=function(a){return K("trackEcommerce",a,!0)};S(a,"ecommerce:send")}})},this._clearTrans=function(){Q(function(){if(H._ecommerceEnabled(!0,"clearTrans")){var a=function(a){return K("trackEcommerce",a,!0)};S(a,"ecommerce:clear")}})},this._addProduct=function(a,b,d,e,f,g,h,i,j,k){O(function(){P("_addProduct",a,b,d,e,f,g,h,i,j)}),Q(function(){if(H._enhancedEcommerceEnabled(!0,"addProduct")){var l=function(a){return K("trackEcommerce",a,!0)},m={id:a,name:b,category:d,brand:e,variant:f,price:g,quantity:h,coupon:i,position:j};c.isObject(k)&&c.extend(m,k),S(l,"ec:addProduct",m)}})},this._addImpression=function(a,b,c,d,e,f,g,h){O(function(){P("_addImpression",a,b,c,d,e,f,g,h)}),Q(function(){if(H._enhancedEcommerceEnabled(!0,"addImpression")){var i=function(a){return K("trackEcommerce",a,!0)};S(i,"ec:addImpression",{id:a,name:b,category:e,brand:d,variant:f,list:c,position:g,price:h})}})},this._addPromo=function(a,b,c,d){O(function(){P("_addPromo",a,b,c,d)}),Q(function(){if(H._enhancedEcommerceEnabled(!0,"addPromo")){var e=function(a){return K("trackEcommerce",a,!0)};S(e,"ec:addPromo",{id:a,name:b,creative:c,position:d})}})},this._setAction=function(a,b){O(function(){P("_setAction",a,b)}),Q(function(){if(H._enhancedEcommerceEnabled(!0,"setAction")){var c=function(a){return K("trackEcommerce",a,!0)};S(c,"ec:setAction",a,b)}})},this._trackTransaction=function(a,b,c,d,e,f,g,h,i){this._setAction("purchase",N(a,b,c,d,e,f,g,h,i))},this._trackRefund=function(a){this._setAction("refund",N(a))},this._trackCheckOut=function(a,b){this._setAction("checkout",N(null,null,null,null,null,null,null,a,b))},this._trackDetail=function(){this._setAction("detail"),this._pageView()},this._trackCart=function(a){-1!==["add","remove"].indexOf(a)&&(this._setAction(a),this._trackEvent("UX","click",a+("add"===a?" to cart":" from cart")))},this._promoClick=function(a){this._setAction("promo_click"),this._trackEvent("Internal Promotions","click",a)},this._productClick=function(a){this._setAction("click",N(null,null,null,null,null,null,a,null,null)),this._trackEvent("UX","click",a)},this._pageView=function(a){Q(function(){R(I("send",a),"pageview")})},this._send=function(){var a=Array.prototype.slice.call(arguments);a.unshift("send"),Q(function(){R.apply(H,a)})},this._set=function(a,b,c){Q(function(){R(I("set",c),a,b)})},this._trackTimings=function(a,b,c,d){this._send("timing",a,b,c,d)},o||(j?this._createAnalyticsScriptTag():this._createScriptTag()),A&&F.$on(x,function(){H._trackPage()}),{log:H.log,offlineQueue:H.offlineQueue,configuration:{accounts:e,universalAnalytics:j,crossDomainLinker:m,crossLinkDomains:f,currency:n,delayScriptTag:o,displayFeatures:p,domainName:g,ecommerce:H._ecommerceEnabled(),enhancedEcommerce:H._enhancedEcommerceEnabled(),enhancedLinkAttribution:s,experimentId:h,hybridMobileSupport:v,ignoreFirstPageLoad:t,logAllCalls:u,pageEvent:x,removeRegExp:i,testMode:y,trackPrefix:z,trackRoutes:A,trackUrlParams:B},getUrl:L,setCookieConfig:H._setCookieConfig,getCookieConfig:function(){return k},createAnalyticsScriptTag:function(a){return a&&(k=a),H._createAnalyticsScriptTag()},createScriptTag:function(){return H._createScriptTag()},offline:function(a){if(a===!0&&w===!1&&(w=!0),a===!1&&w===!0)for(w=!1;H.offlineQueue.length>0;){var b=H.offlineQueue.shift();b[0].apply(H,b[1])}return w},trackPage:function(a,b,c){H._trackPage.apply(H,arguments)},trackEvent:function(a,b,c,d,e,f){H._trackEvent.apply(H,arguments)},addTrans:function(a,b,c,d,e,f,g,h,i){H._addTrans.apply(H,arguments)},addItem:function(a,b,c,d,e,f){H._addItem.apply(H,arguments)},trackTrans:function(){H._trackTrans.apply(H,arguments)},clearTrans:function(){H._clearTrans.apply(H,arguments)},addProduct:function(a,b,c,d,e,f,g,h,i,j){H._addProduct.apply(H,arguments)},addPromo:function(a,b,c,d){H._addPromo.apply(H,arguments)},addImpression:function(a,b,c,d,e,f,g,h){H._addImpression.apply(H,arguments)},productClick:function(a){H._productClick.apply(H,arguments)},promoClick:function(a){H._promoClick.apply(H,arguments)},trackDetail:function(){H._trackDetail.apply(H,arguments)},trackCart:function(a){H._trackCart.apply(H,arguments)},trackCheckout:function(a,b){H._trackCheckOut.apply(H,arguments)},trackTimings:function(a,b,c,d){H._trackTimings.apply(H,arguments)},trackTransaction:function(a,b,c,d,e,f,g,h,i){H._trackTransaction.apply(H,arguments)},setAction:function(a,b){H._setAction.apply(H,arguments)},pageView:function(){H._pageView.apply(H,arguments)},send:function(a){H._send.apply(H,arguments)},set:function(a,b,c){H._set.apply(H,arguments)}}}]}).directive("gaTrackEvent",["Analytics","$parse",function(a,b){return{restrict:"A",link:function(c,d,e){var f=b(e.gaTrackEvent);d.bind("click",function(){(!e.gaTrackEventIf||c.$eval(e.gaTrackEventIf))&&f.length>1&&a.trackEvent.apply(a,f(c))})}}}])}(window,document,window.angular); | ||
!function(a,b){"use strict";"function"==typeof define&&define.amd?define(["angular"],b):"object"==typeof module&&module.exports?module.exports=b(require("angular")):b(a.angular)}(this,function(a,b){"use strict";return a.module("angular-google-analytics",[]).provider("Analytics",function(){var c,d,e,f,g,h=!0,i="auto",j=!1,k=!1,l="USD",m=!1,n=!1,o=!1,p=!1,q=!1,r=!1,s=!1,t=!1,u=!1,v=!1,w="$routeChangeSuccess",x=!1,y=!1,z="",A=!0,B=!1;this.log=[],this.offlineQueue=[],this.setAccount=function(d){return c=a.isUndefined(d)||d===!1?b:a.isArray(d)?d:a.isObject(d)?[d]:[{tracker:d,trackEvent:!0}],this},this.trackPages=function(a){return A=!!a,this},this.trackPrefix=function(a){return z=a,this},this.setDomainName=function(a){return e=a,this},this.useDisplayFeatures=function(a){return o=!!a,this},this.useAnalytics=function(a){return h=!!a,this},this.useEnhancedLinkAttribution=function(a){return r=!!a,this},this.useCrossDomainLinker=function(a){return k=!!a,this},this.setCrossLinkDomains=function(a){return d=a,this},this.setPageEvent=function(a){return w=a,this},this.setCookieConfig=function(a){return i=a,this},this.useECommerce=function(a,b){return p=!!a,q=!!b,this},this.setCurrency=function(a){return l=a,this},this.setRemoveRegExp=function(a){return a instanceof RegExp&&(g=a),this},this.setExperimentId=function(a){return f=a,this},this.ignoreFirstPageLoad=function(a){return s=!!a,this},this.trackUrlParams=function(a){return B=!!a,this},this.setHybridMobileSupport=function(a){return u=!!a,this},this.startOffline=function(a){return v=!!a,v===!0&&this.delayScriptTag(!0),this},this.delayScriptTag=function(a){return n=!!a,this},this.logAllCalls=function(a){return t=!!a,this},this.enterTestMode=function(){return x=!0,this},this.enterDebugMode=function(a){return m=!0,y=!!a,this},this.$get=["$document","$location","$log","$rootScope","$window",function(C,D,E,F,G){var H=this,I=function(b,c){return a.isString(c)?c+"."+b:J("name",c)?c.name+"."+b:b},J=function(b,c){return a.isObject(c)&&a.isDefined(c[b])},K=function(a,b,c){return J(a,b)&&b[a]===c},L=function(){var a=B?D.url():D.path();return g?a.replace(g,""):a},M=function(){var b={utm_source:"campaignSource",utm_medium:"campaignMedium",utm_term:"campaignTerm",utm_content:"campaignContent",utm_campaign:"campaignName"},c={};return a.forEach(D.search(),function(d,e){var f=b[e];a.isDefined(f)&&(c[f]=d)}),c},N=function(a,b,c,d,e,f,g,h,i){var j={};return a&&(j.id=a),b&&(j.affiliation=b),c&&(j.revenue=c),d&&(j.tax=d),e&&(j.shipping=e),f&&(j.coupon=f),g&&(j.list=g),h&&(j.step=h),i&&(j.option=i),j},O=function(a){!h&&G._gaq&&"function"==typeof a&&a()},P=function(){var a=Array.prototype.slice.call(arguments);return v===!0?void H.offlineQueue.push([P,a]):(G._gaq||(G._gaq=[]),t===!0&&H._log.apply(H,a),void G._gaq.push(a))},Q=function(a){h&&G.ga&&"function"==typeof a&&a()},R=function(){var a=Array.prototype.slice.call(arguments);return v===!0?void H.offlineQueue.push([R,a]):"function"!=typeof G.ga?void H._log("warn","ga function not set on window"):(t===!0&&H._log.apply(H,a),void G.ga.apply(null,a))},S=function(a){var b=Array.prototype.slice.call(arguments,1),d=b[0],e=[];return"function"==typeof a?c.forEach(function(b){a(b)&&e.push(b)}):e=c,0===e.length?void R.apply(H,b):void e.forEach(function(a){(!J("select",a)||"function"!=typeof a.select||a.select(b))&&(b[0]=I(d,a),R.apply(H,b))})};return this._log=function(){var a=Array.prototype.slice.call(arguments);if(a.length>0){if(a.length>1)switch(a[0]){case"debug":case"error":case"info":case"log":case"warn":E[a[0]](a.slice(1))}H.log.push(a)}},this._createScriptTag=function(){if(!c||c.length<1)return void H._log("warn","No account id set to create script tag");if(c.length>1&&(H._log("warn","Multiple trackers are not supported with ga.js. Using first tracker only"),c=c.slice(0,1)),j===!0)return void H._log("warn","ga.js or analytics.js script tag already created");P("_setAccount",c[0].tracker),e&&P("_setDomainName",e),r&&P("_require","inpage_linkid","//www.google-analytics.com/plugins/ga/inpage_linkid.js"),A&&!s&&(g?P("_trackPageview",L()):P("_trackPageview"));var a,b=C[0];return a=o===!0?("https:"===b.location.protocol?"https://":"http://")+"stats.g.doubleclick.net/dc.js":("https:"===b.location.protocol?"https://ssl":"http://www")+".google-analytics.com/ga.js",x!==!0?!function(){var c=b.createElement("script");c.type="text/javascript",c.async=!0,c.src=a;var d=b.getElementsByTagName("script")[0];d.parentNode.insertBefore(c,d)}():H._log("inject",a),j=!0,!0},this._createAnalyticsScriptTag=function(){if(!c)return void H._log("warn","No account id set to create analytics script tag");if(j===!0)return void H._log("warn","ga.js or analytics.js script tag already created");var b=C[0],e=u===!0?"https:":"",g=e+"//www.google-analytics.com/"+(m?"analytics_debug.js":"analytics.js");if(x!==!0?!function(a,b,c,d,e,f,g){a.GoogleAnalyticsObject=e,a[e]=a[e]||function(){(a[e].q=a[e].q||[]).push(arguments)},a[e].l=1*new Date,f=b.createElement(c),g=b.getElementsByTagName(c)[0],f.async=1,f.src=d,g.parentNode.insertBefore(f,g)}(window,b,"script",g,"ga"):("function"!=typeof G.ga&&(G.ga=function(){}),H._log("inject",g)),y&&(G.ga_debug={trace:!0}),c.forEach(function(b){b.crossDomainLinker=J("crossDomainLinker",b)?b.crossDomainLinker:k,b.crossLinkDomains=J("crossLinkDomains",b)?b.crossLinkDomains:d,b.displayFeatures=J("displayFeatures",b)?b.displayFeatures:o,b.enhancedLinkAttribution=J("enhancedLinkAttribution",b)?b.enhancedLinkAttribution:r,b.set=J("set",b)?b.set:{},b.trackEcommerce=J("trackEcommerce",b)?b.trackEcommerce:p,b.trackEvent=J("trackEvent",b)?b.trackEvent:!1;var c={};J("fields",b)?c=b.fields:J("cookieConfig",b)?a.isString(b.cookieConfig)?c.cookieDomain=b.cookieConfig:c=b.cookieConfig:a.isString(i)?c.cookieDomain=i:i&&(c=i),b.crossDomainLinker===!0&&(c.allowLinker=!0),J("name",b)&&(c.name=b.name),b.fields=c,R("create",b.tracker,b.fields),u===!0&&R(I("set",b),"checkProtocolTask",null);for(var e in b.set)b.set.hasOwnProperty(e)&&R(I("set",b),e,b.set[e]);b.crossDomainLinker===!0&&(R(I("require",b),"linker"),a.isDefined(b.crossLinkDomains)&&R(I("linker:autoLink",b),b.crossLinkDomains)),b.displayFeatures&&R(I("require",b),"displayfeatures"),b.trackEcommerce&&(q?(R(I("require",b),"ec"),R(I("set",b),"&cu",l)):R(I("require",b),"ecommerce")),b.enhancedLinkAttribution&&R(I("require",b),"linkid"),A&&!s&&R(I("send",b),"pageview",z+L())}),f){var h=b.createElement("script"),n=b.getElementsByTagName("script")[0];h.src=e+"//www.google-analytics.com/cx/api.js?experiment="+f,n.parentNode.insertBefore(h,n)}return j=!0,!0},this._ecommerceEnabled=function(a,b){var c=p&&!q;return a===!0&&c===!1&&(p&&q?H._log("warn",b+" is not available when Enhanced Ecommerce is enabled with analytics.js"):H._log("warn","Ecommerce must be enabled to use "+b+" with analytics.js")),c},this._enhancedEcommerceEnabled=function(a,b){var c=p&&q;return a===!0&&c===!1&&H._log("warn","Enhanced Ecommerce must be enabled to use "+b+" with analytics.js"),c},this._trackPage=function(c,d,e){c=c?c:L(),d=d?d:C[0].title,O(function(){P("_set","title",d),P("_trackPageview",z+c)}),Q(function(){var f={page:z+c,title:d};a.extend(f,M()),a.isObject(e)&&a.extend(f,e),S(b,"send","pageview",f)})},this._trackEvent=function(b,c,d,e,f,g){O(function(){P("_trackEvent",b,c,d,e,!!f)}),Q(function(){var h={},i=function(a){return K("trackEvent",a,!0)};a.isDefined(f)&&(h.nonInteraction=!!f),a.isObject(g)&&a.extend(h,g),S(i,"send","event",b,c,d,e,h)})},this._addTrans=function(a,b,c,d,e,f,g,h,i){O(function(){P("_addTrans",a,b,c,d,e,f,g,h)}),Q(function(){if(H._ecommerceEnabled(!0,"addTrans")){var f=function(a){return K("trackEcommerce",a,!0)};S(f,"ecommerce:addTransaction",{id:a,affiliation:b,revenue:c,tax:d,shipping:e,currency:i||"USD"})}})},this._addItem=function(a,b,c,d,e,f){O(function(){P("_addItem",a,b,c,d,e,f)}),Q(function(){if(H._ecommerceEnabled(!0,"addItem")){var g=function(a){return K("trackEcommerce",a,!0)};S(g,"ecommerce:addItem",{id:a,name:c,sku:b,category:d,price:e,quantity:f})}})},this._trackTrans=function(){O(function(){P("_trackTrans")}),Q(function(){if(H._ecommerceEnabled(!0,"trackTrans")){var a=function(a){return K("trackEcommerce",a,!0)};S(a,"ecommerce:send")}})},this._clearTrans=function(){Q(function(){if(H._ecommerceEnabled(!0,"clearTrans")){var a=function(a){return K("trackEcommerce",a,!0)};S(a,"ecommerce:clear")}})},this._addProduct=function(b,c,d,e,f,g,h,i,j,k){O(function(){P("_addProduct",b,c,d,e,f,g,h,i,j)}),Q(function(){if(H._enhancedEcommerceEnabled(!0,"addProduct")){var l=function(a){return K("trackEcommerce",a,!0)},m={id:b,name:c,category:d,brand:e,variant:f,price:g,quantity:h,coupon:i,position:j};a.isObject(k)&&a.extend(m,k),S(l,"ec:addProduct",m)}})},this._addImpression=function(a,b,c,d,e,f,g,h){O(function(){P("_addImpression",a,b,c,d,e,f,g,h)}),Q(function(){if(H._enhancedEcommerceEnabled(!0,"addImpression")){var i=function(a){return K("trackEcommerce",a,!0)};S(i,"ec:addImpression",{id:a,name:b,category:e,brand:d,variant:f,list:c,position:g,price:h})}})},this._addPromo=function(a,b,c,d){O(function(){P("_addPromo",a,b,c,d)}),Q(function(){if(H._enhancedEcommerceEnabled(!0,"addPromo")){var e=function(a){return K("trackEcommerce",a,!0)};S(e,"ec:addPromo",{id:a,name:b,creative:c,position:d})}})},this._setAction=function(a,b){O(function(){P("_setAction",a,b)}),Q(function(){if(H._enhancedEcommerceEnabled(!0,"setAction")){var c=function(a){return K("trackEcommerce",a,!0)};S(c,"ec:setAction",a,b)}})},this._trackTransaction=function(a,b,c,d,e,f,g,h,i){this._setAction("purchase",N(a,b,c,d,e,f,g,h,i))},this._trackRefund=function(a){this._setAction("refund",N(a))},this._trackCheckOut=function(a,b){this._setAction("checkout",N(null,null,null,null,null,null,null,a,b))},this._trackDetail=function(){this._setAction("detail"),this._pageView()},this._trackCart=function(a,b){-1!==["add","remove"].indexOf(a)&&(this._setAction(a,{list:b}),this._trackEvent("UX","click",a+("add"===a?" to cart":" from cart")))},this._promoClick=function(a){this._setAction("promo_click"),this._trackEvent("Internal Promotions","click",a)},this._productClick=function(a){this._setAction("click",N(null,null,null,null,null,null,a,null,null)),this._trackEvent("UX","click",a)},this._pageView=function(a){Q(function(){R(I("send",a),"pageview")})},this._send=function(){var a=Array.prototype.slice.call(arguments);a.unshift("send"),Q(function(){R.apply(H,a)})},this._set=function(a,b,c){Q(function(){R(I("set",c),a,b)})},this._trackTimings=function(a,b,c,d){this._send("timing",a,b,c,d)},n||(h?this._createAnalyticsScriptTag():this._createScriptTag()),A&&F.$on(w,function(){H._trackPage()}),{log:H.log,offlineQueue:H.offlineQueue,configuration:{accounts:c,universalAnalytics:h,crossDomainLinker:k,crossLinkDomains:d,currency:l,debugMode:m,delayScriptTag:n,displayFeatures:o,domainName:e,ecommerce:H._ecommerceEnabled(),enhancedEcommerce:H._enhancedEcommerceEnabled(),enhancedLinkAttribution:r,experimentId:f,hybridMobileSupport:u,ignoreFirstPageLoad:s,logAllCalls:t,pageEvent:w,removeRegExp:g,testMode:x,traceDebuggingMode:y,trackPrefix:z,trackRoutes:A,trackUrlParams:B},getUrl:L,setCookieConfig:H._setCookieConfig,getCookieConfig:function(){return i},createAnalyticsScriptTag:function(a){return a&&(i=a),H._createAnalyticsScriptTag()},createScriptTag:function(){return H._createScriptTag()},offline:function(a){if(a===!0&&v===!1&&(v=!0),a===!1&&v===!0)for(v=!1;H.offlineQueue.length>0;){var b=H.offlineQueue.shift();b[0].apply(H,b[1])}return v},trackPage:function(a,b,c){H._trackPage.apply(H,arguments)},trackEvent:function(a,b,c,d,e,f){H._trackEvent.apply(H,arguments)},addTrans:function(a,b,c,d,e,f,g,h,i){H._addTrans.apply(H,arguments)},addItem:function(a,b,c,d,e,f){H._addItem.apply(H,arguments)},trackTrans:function(){H._trackTrans.apply(H,arguments)},clearTrans:function(){H._clearTrans.apply(H,arguments)},addProduct:function(a,b,c,d,e,f,g,h,i,j){H._addProduct.apply(H,arguments)},addPromo:function(a,b,c,d){H._addPromo.apply(H,arguments)},addImpression:function(a,b,c,d,e,f,g,h){H._addImpression.apply(H,arguments)},productClick:function(a){H._productClick.apply(H,arguments)},promoClick:function(a){H._promoClick.apply(H,arguments)},trackDetail:function(){H._trackDetail.apply(H,arguments)},trackCart:function(a,b){H._trackCart.apply(H,arguments)},trackCheckout:function(a,b){H._trackCheckOut.apply(H,arguments)},trackTimings:function(a,b,c,d){H._trackTimings.apply(H,arguments)},trackTransaction:function(a,b,c,d,e,f,g,h,i){H._trackTransaction.apply(H,arguments)},setAction:function(a,b){H._setAction.apply(H,arguments)},pageView:function(){H._pageView.apply(H,arguments)},send:function(a){H._send.apply(H,arguments)},set:function(a,b,c){H._set.apply(H,arguments)}}}]}).directive("gaTrackEvent",["Analytics","$parse",function(a,b){return{restrict:"A",link:function(c,d,e){var f=b(e.gaTrackEvent);d.bind("click",function(){(!e.gaTrackEventIf||c.$eval(e.gaTrackEventIf))&&f.length>1&&a.trackEvent.apply(a,f(c))})}}}]),a.module("angular-google-analytics")}); |
@@ -26,3 +26,3 @@ /* global require, module */ | ||
dist: { | ||
src: ['src/*.js'], | ||
src: ['index.js'], | ||
dest: '<%= dirs.dest %>/<%= pkg.name %>.js' | ||
@@ -40,17 +40,7 @@ } | ||
}, | ||
changelog: { | ||
options: { | ||
dest: 'CHANGELOG.md', | ||
versionFile: 'package.json' | ||
} | ||
}, | ||
stage: { | ||
options: { | ||
files: ['CHANGELOG.md'] | ||
} | ||
}, | ||
stage: {}, | ||
release: { | ||
options: { | ||
commitMessage: '<%= version %>', | ||
tagName: 'v<%= version %>', | ||
tagName: '<%= version %>', | ||
file: 'package.json', | ||
@@ -64,3 +54,3 @@ push: false, | ||
jshint: { | ||
files: ['Gruntfile.js', 'src/*.js', 'test/unit/*.js'], | ||
files: ['Gruntfile.js', 'index.js', 'test/*.js', 'test/unit/*.js'], | ||
options: { | ||
@@ -88,6 +78,2 @@ curly: true, | ||
}, | ||
// watch: { | ||
// files: '<config:jshint.files>', | ||
// tasks: 'default' | ||
// }, | ||
karma: { | ||
@@ -120,8 +106,2 @@ test: { | ||
// Load the plugin that provides the "watch" task. | ||
//grunt.loadNpmTasks('grunt-contrib-watch'); | ||
grunt.loadNpmTasks('grunt-release'); | ||
grunt.loadNpmTasks('grunt-conventional-changelog'); | ||
grunt.registerTask('stage', 'git add files before running the release task', function () { | ||
@@ -135,4 +115,2 @@ var files = this.options().files; | ||
grunt.renameTask('release', 'originalRelease'); | ||
// Default task. | ||
@@ -151,3 +129,3 @@ grunt.registerTask('default', ['test']); | ||
// release task | ||
// Release task. | ||
grunt.registerTask('release', ['build']); | ||
@@ -154,0 +132,0 @@ |
1169
index.js
@@ -1,2 +0,1167 @@ | ||
require('./src/angular-google-analytics'); | ||
module.exports = 'angular-google-analytics'; | ||
/* globals define */ | ||
(function (root, factory) { | ||
'use strict'; | ||
if (typeof define === 'function' && define.amd) { | ||
define(['angular'], factory); | ||
} else if (typeof module === 'object' && module.exports) { | ||
module.exports = factory(require('angular')); | ||
} else { | ||
factory(root.angular); | ||
} | ||
}(this, function (angular, undefined) { | ||
'use strict'; | ||
angular.module('angular-google-analytics', []) | ||
.provider('Analytics', function () { | ||
var accounts, | ||
analyticsJS = true, | ||
cookieConfig = 'auto', // DEPRECATED | ||
created = false, | ||
crossDomainLinker = false, | ||
crossLinkDomains, | ||
currency = 'USD', | ||
debugMode = false, | ||
delayScriptTag = false, | ||
displayFeatures = false, | ||
domainName, | ||
ecommerce = false, | ||
enhancedEcommerce = false, | ||
enhancedLinkAttribution = false, | ||
experimentId, | ||
ignoreFirstPageLoad = false, | ||
logAllCalls = false, | ||
hybridMobileSupport = false, | ||
offlineMode = false, | ||
pageEvent = '$routeChangeSuccess', | ||
removeRegExp, | ||
testMode = false, | ||
traceDebuggingMode = false, | ||
trackPrefix = '', | ||
trackRoutes = true, | ||
trackUrlParams = false; | ||
this.log = []; | ||
this.offlineQueue = []; | ||
/** | ||
* Configuration Methods | ||
**/ | ||
this.setAccount = function (tracker) { | ||
if (angular.isUndefined(tracker) || tracker === false) { | ||
accounts = undefined; | ||
} else if (angular.isArray(tracker)) { | ||
accounts = tracker; | ||
} else if (angular.isObject(tracker)) { | ||
accounts = [tracker]; | ||
} else { | ||
// In order to preserve an existing behavior with how the _trackEvent function works, | ||
// the trackEvent property must be set to true when there is only a single tracker. | ||
accounts = [{ tracker: tracker, trackEvent: true }]; | ||
} | ||
return this; | ||
}; | ||
this.trackPages = function (val) { | ||
trackRoutes = !!val; | ||
return this; | ||
}; | ||
this.trackPrefix = function (prefix) { | ||
trackPrefix = prefix; | ||
return this; | ||
}; | ||
this.setDomainName = function (domain) { | ||
domainName = domain; | ||
return this; | ||
}; | ||
this.useDisplayFeatures = function (val) { | ||
displayFeatures = !!val; | ||
return this; | ||
}; | ||
this.useAnalytics = function (val) { | ||
analyticsJS = !!val; | ||
return this; | ||
}; | ||
this.useEnhancedLinkAttribution = function (val) { | ||
enhancedLinkAttribution = !!val; | ||
return this; | ||
}; | ||
this.useCrossDomainLinker = function (val) { | ||
crossDomainLinker = !!val; | ||
return this; | ||
}; | ||
this.setCrossLinkDomains = function (domains) { | ||
crossLinkDomains = domains; | ||
return this; | ||
}; | ||
this.setPageEvent = function (name) { | ||
pageEvent = name; | ||
return this; | ||
}; | ||
/* DEPRECATED */ | ||
this.setCookieConfig = function (config) { | ||
cookieConfig = config; | ||
return this; | ||
}; | ||
this.useECommerce = function (val, enhanced) { | ||
ecommerce = !!val; | ||
enhancedEcommerce = !!enhanced; | ||
return this; | ||
}; | ||
this.setCurrency = function (currencyCode) { | ||
currency = currencyCode; | ||
return this; | ||
}; | ||
this.setRemoveRegExp = function (regex) { | ||
if (regex instanceof RegExp) { | ||
removeRegExp = regex; | ||
} | ||
return this; | ||
}; | ||
this.setExperimentId = function (id) { | ||
experimentId = id; | ||
return this; | ||
}; | ||
this.ignoreFirstPageLoad = function (val) { | ||
ignoreFirstPageLoad = !!val; | ||
return this; | ||
}; | ||
this.trackUrlParams = function (val) { | ||
trackUrlParams = !!val; | ||
return this; | ||
}; | ||
this.setHybridMobileSupport = function (val) { | ||
hybridMobileSupport = !!val; | ||
return this; | ||
}; | ||
this.startOffline = function (val) { | ||
offlineMode = !!val; | ||
if (offlineMode === true) { | ||
this.delayScriptTag(true); | ||
} | ||
return this; | ||
}; | ||
this.delayScriptTag = function (val) { | ||
delayScriptTag = !!val; | ||
return this; | ||
}; | ||
this.logAllCalls = function (val) { | ||
logAllCalls = !!val; | ||
return this; | ||
}; | ||
this.enterTestMode = function () { | ||
testMode = true; | ||
return this; | ||
}; | ||
this.enterDebugMode = function (enableTraceDebugging) { | ||
debugMode = true; | ||
traceDebuggingMode = !!enableTraceDebugging; | ||
return this; | ||
}; | ||
/** | ||
* Public Service | ||
*/ | ||
this.$get = ['$document', '$location', '$log', '$rootScope', '$window', function ($document, $location, $log, $rootScope, $window) { | ||
var that = this; | ||
/** | ||
* Side-effect Free Helper Methods | ||
**/ | ||
var generateCommandName = function (commandName, config) { | ||
if (angular.isString(config)) { | ||
return config + '.' + commandName; | ||
} | ||
return isPropertyDefined('name', config) ? (config.name + '.' + commandName) : commandName; | ||
}; | ||
var isPropertyDefined = function (key, config) { | ||
return angular.isObject(config) && angular.isDefined(config[key]); | ||
}; | ||
var isPropertySetTo = function (key, config, value) { | ||
return isPropertyDefined(key, config) && config[key] === value; | ||
}; | ||
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 object = {}; | ||
angular.forEach($location.search(), function (value, key) { | ||
var campaignVar = utmToCampaignVar[key]; | ||
if (angular.isDefined(campaignVar)) { | ||
object[campaignVar] = value; | ||
} | ||
}); | ||
return object; | ||
}; | ||
/** | ||
* 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 | ||
*/ | ||
var 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; | ||
}; | ||
/** | ||
* Private Methods | ||
*/ | ||
var _gaJs = function (fn) { | ||
if (!analyticsJS && $window._gaq && typeof fn === 'function') { | ||
fn(); | ||
} | ||
}; | ||
var _gaq = function () { | ||
var args = Array.prototype.slice.call(arguments); | ||
if (offlineMode === true) { | ||
that.offlineQueue.push([_gaq, args]); | ||
return; | ||
} | ||
if (!$window._gaq) { | ||
$window._gaq = []; | ||
} | ||
if (logAllCalls === true) { | ||
that._log.apply(that, args); | ||
} | ||
$window._gaq.push(args); | ||
}; | ||
var _analyticsJs = function (fn) { | ||
if (analyticsJS && $window.ga && typeof fn === 'function') { | ||
fn(); | ||
} | ||
}; | ||
var _ga = function () { | ||
var args = Array.prototype.slice.call(arguments); | ||
if (offlineMode === true) { | ||
that.offlineQueue.push([_ga, args]); | ||
return; | ||
} | ||
if (typeof $window.ga !== 'function') { | ||
that._log('warn', 'ga function not set on window'); | ||
return; | ||
} | ||
if (logAllCalls === true) { | ||
that._log.apply(that, args); | ||
} | ||
$window.ga.apply(null, args); | ||
}; | ||
var _gaMultipleTrackers = function (includeFn) { | ||
// Drop the includeFn from the arguments and preserve the original command name | ||
var args = Array.prototype.slice.call(arguments, 1), | ||
commandName = args[0], | ||
trackers = []; | ||
if (typeof includeFn === 'function') { | ||
accounts.forEach(function (account) { | ||
if (includeFn(account)) { | ||
trackers.push(account); | ||
} | ||
}); | ||
} else { | ||
// No include function indicates that all accounts are to be used | ||
trackers = accounts; | ||
} | ||
// To preserve backwards compatibility fallback to _ga method if no account | ||
// matches the specified includeFn. This preserves existing behaviors by | ||
// performing the single tracker operation. | ||
if (trackers.length === 0) { | ||
_ga.apply(that, args); | ||
return; | ||
} | ||
trackers.forEach(function (tracker) { | ||
// Check tracker 'select' function, if it exists, for whether the tracker should be used with the current command. | ||
// If the 'select' function returns false then the tracker will not be used with the current command. | ||
if (isPropertyDefined('select', tracker) && typeof tracker.select === 'function' && !tracker.select(args)) { | ||
return; | ||
} | ||
args[0] = generateCommandName(commandName, tracker); | ||
_ga.apply(that, args); | ||
}); | ||
}; | ||
this._log = function () { | ||
var args = Array.prototype.slice.call(arguments); | ||
if (args.length > 0) { | ||
if (args.length > 1) { | ||
switch (args[0]) { | ||
case 'debug': | ||
case 'error': | ||
case 'info': | ||
case 'log': | ||
case 'warn': | ||
$log[args[0]](args.slice(1)); | ||
break; | ||
} | ||
} | ||
that.log.push(args); | ||
} | ||
}; | ||
this._createScriptTag = function () { | ||
if (!accounts || accounts.length < 1) { | ||
that._log('warn', 'No account id set to create script tag'); | ||
return; | ||
} | ||
if (accounts.length > 1) { | ||
that._log('warn', 'Multiple trackers are not supported with ga.js. Using first tracker only'); | ||
accounts = accounts.slice(0, 1); | ||
} | ||
if (created === true) { | ||
that._log('warn', 'ga.js or analytics.js script tag already created'); | ||
return; | ||
} | ||
_gaq('_setAccount', accounts[0].tracker); | ||
if(domainName) { | ||
_gaq('_setDomainName', domainName); | ||
} | ||
if (enhancedLinkAttribution) { | ||
_gaq('_require', 'inpage_linkid', '//www.google-analytics.com/plugins/ga/inpage_linkid.js'); | ||
} | ||
if (trackRoutes && !ignoreFirstPageLoad) { | ||
if (removeRegExp) { | ||
_gaq('_trackPageview', getUrl()); | ||
} else { | ||
_gaq('_trackPageview'); | ||
} | ||
} | ||
var document = $document[0]; | ||
var scriptSource; | ||
if (displayFeatures === true) { | ||
scriptSource = ('https:' === document.location.protocol ? 'https://' : 'http://') + 'stats.g.doubleclick.net/dc.js'; | ||
} else { | ||
scriptSource = ('https:' === document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; | ||
} | ||
if (testMode !== true) { | ||
// If not in test mode inject the Google Analytics tag | ||
(function () { | ||
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; | ||
ga.src = scriptSource; | ||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); | ||
})(); | ||
} else { | ||
// Log the source location for validation | ||
that._log('inject', scriptSource); | ||
} | ||
created = true; | ||
return true; | ||
}; | ||
this._createAnalyticsScriptTag = function () { | ||
if (!accounts) { | ||
that._log('warn', 'No account id set to create analytics script tag'); | ||
return; | ||
} | ||
if (created === true) { | ||
that._log('warn', 'ga.js or analytics.js script tag already created'); | ||
return; | ||
} | ||
var document = $document[0]; | ||
var protocol = hybridMobileSupport === true ? 'https:' : ''; | ||
var scriptSource = protocol + '//www.google-analytics.com/' + (debugMode ? 'analytics_debug.js' : 'analytics.js'); | ||
if (testMode !== true) { | ||
// If not in test mode 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',scriptSource,'ga'); | ||
} else { | ||
if (typeof $window.ga !== 'function') { | ||
// In test mode create a ga function if none exists that is a noop sink. | ||
$window.ga = function () {}; | ||
} | ||
// Log script injection. | ||
that._log('inject', scriptSource); | ||
} | ||
if (traceDebuggingMode) { | ||
$window.ga_debug = { trace: true }; | ||
} | ||
accounts.forEach(function (trackerObj) { | ||
trackerObj.crossDomainLinker = isPropertyDefined('crossDomainLinker', trackerObj) ? trackerObj.crossDomainLinker : crossDomainLinker; | ||
trackerObj.crossLinkDomains = isPropertyDefined('crossLinkDomains', trackerObj) ? trackerObj.crossLinkDomains : crossLinkDomains; | ||
trackerObj.displayFeatures = isPropertyDefined('displayFeatures', trackerObj) ? trackerObj.displayFeatures : displayFeatures; | ||
trackerObj.enhancedLinkAttribution = isPropertyDefined('enhancedLinkAttribution', trackerObj) ? trackerObj.enhancedLinkAttribution : enhancedLinkAttribution; | ||
trackerObj.set = isPropertyDefined('set', trackerObj) ? trackerObj.set : {}; | ||
trackerObj.trackEcommerce = isPropertyDefined('trackEcommerce', trackerObj) ? trackerObj.trackEcommerce : ecommerce; | ||
trackerObj.trackEvent = isPropertyDefined('trackEvent', trackerObj) ? trackerObj.trackEvent : false; | ||
// Logic to choose the account fields to be used. | ||
// cookieConfig is being deprecated for a tracker specific property: fields. | ||
var fields = {}; | ||
if (isPropertyDefined('fields', trackerObj)) { | ||
fields = trackerObj.fields; | ||
} else if (isPropertyDefined('cookieConfig', trackerObj)) { | ||
if (angular.isString(trackerObj.cookieConfig)) { | ||
fields.cookieDomain = trackerObj.cookieConfig; | ||
} else { | ||
fields = trackerObj.cookieConfig; | ||
} | ||
} else if (angular.isString(cookieConfig)) { | ||
fields.cookieDomain = cookieConfig; | ||
} else if (cookieConfig) { | ||
fields = cookieConfig; | ||
} | ||
if (trackerObj.crossDomainLinker === true) { | ||
fields.allowLinker = true; | ||
} | ||
if (isPropertyDefined('name', trackerObj)) { | ||
fields.name = trackerObj.name; | ||
} | ||
trackerObj.fields = fields; | ||
_ga('create', trackerObj.tracker, trackerObj.fields); | ||
// Hybrid mobile application support | ||
// https://developers.google.com/analytics/devguides/collection/analyticsjs/tasks | ||
if (hybridMobileSupport === true) { | ||
_ga(generateCommandName('set', trackerObj), 'checkProtocolTask', null); | ||
} | ||
// Send all custom set commands from the trackerObj.set property | ||
for (var key in trackerObj.set) { | ||
if (trackerObj.set.hasOwnProperty(key)) { | ||
_ga(generateCommandName('set', trackerObj), key, trackerObj.set[key]); | ||
} | ||
} | ||
if (trackerObj.crossDomainLinker === true) { | ||
_ga(generateCommandName('require', trackerObj), 'linker'); | ||
if (angular.isDefined(trackerObj.crossLinkDomains)) { | ||
_ga(generateCommandName('linker:autoLink', trackerObj), trackerObj.crossLinkDomains); | ||
} | ||
} | ||
if (trackerObj.displayFeatures) { | ||
_ga(generateCommandName('require', trackerObj), 'displayfeatures'); | ||
} | ||
if (trackerObj.trackEcommerce) { | ||
if (!enhancedEcommerce) { | ||
_ga(generateCommandName('require', trackerObj), 'ecommerce'); | ||
} else { | ||
_ga(generateCommandName('require', trackerObj), 'ec'); | ||
_ga(generateCommandName('set', trackerObj), '&cu', currency); | ||
} | ||
} | ||
if (trackerObj.enhancedLinkAttribution) { | ||
_ga(generateCommandName('require', trackerObj), 'linkid'); | ||
} | ||
if (trackRoutes && !ignoreFirstPageLoad) { | ||
_ga(generateCommandName('send', trackerObj), 'pageview', trackPrefix + getUrl()); | ||
} | ||
}); | ||
if (experimentId) { | ||
var expScript = document.createElement('script'), | ||
s = document.getElementsByTagName('script')[0]; | ||
expScript.src = protocol + '//www.google-analytics.com/cx/api.js?experiment=' + experimentId; | ||
s.parentNode.insertBefore(expScript, s); | ||
} | ||
created = true; | ||
return true; | ||
}; | ||
this._ecommerceEnabled = function (warn, command) { | ||
var result = ecommerce && !enhancedEcommerce; | ||
if (warn === true && result === false) { | ||
if (ecommerce && enhancedEcommerce) { | ||
that._log('warn', command + ' is not available when Enhanced Ecommerce is enabled with analytics.js'); | ||
} else { | ||
that._log('warn', 'Ecommerce must be enabled to use ' + command + ' with analytics.js'); | ||
} | ||
} | ||
return result; | ||
}; | ||
this._enhancedEcommerceEnabled = function (warn, command) { | ||
var result = ecommerce && enhancedEcommerce; | ||
if (warn === true && result === false) { | ||
that._log('warn', 'Enhanced Ecommerce must be enabled to use ' + command + ' with analytics.js'); | ||
} | ||
return result; | ||
}; | ||
/** | ||
* 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) { | ||
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 | ||
_gaq('_set', 'title', title); | ||
_gaq('_trackPageview', (trackPrefix + url)); | ||
}); | ||
_analyticsJs(function () { | ||
var opt_fieldObject = { | ||
'page': trackPrefix + url, | ||
'title': title | ||
}; | ||
angular.extend(opt_fieldObject, getUtmParams()); | ||
if (angular.isObject(custom)) { | ||
angular.extend(opt_fieldObject, custom); | ||
} | ||
_gaMultipleTrackers(undefined, 'send', 'pageview', opt_fieldObject); | ||
}); | ||
}; | ||
/** | ||
* 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) { | ||
_gaJs(function () { | ||
_gaq('_trackEvent', category, action, label, value, !!noninteraction); | ||
}); | ||
_analyticsJs(function () { | ||
var opt_fieldObject = {}; | ||
var includeFn = function (trackerObj) { | ||
return isPropertySetTo('trackEvent', trackerObj, true); | ||
}; | ||
if (angular.isDefined(noninteraction)) { | ||
opt_fieldObject.nonInteraction = !!noninteraction; | ||
} | ||
if (angular.isObject(custom)) { | ||
angular.extend(opt_fieldObject, custom); | ||
} | ||
_gaMultipleTrackers(includeFn, 'send', 'event', category, action, label, value, opt_fieldObject); | ||
}); | ||
}; | ||
/** | ||
* 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) { | ||
_gaJs(function () { | ||
_gaq('_addTrans', transactionId, affiliation, total, tax, shipping, city, state, country); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._ecommerceEnabled(true, 'addTrans')) { | ||
var includeFn = function (trackerObj) { | ||
return isPropertySetTo('trackEcommerce', trackerObj, true); | ||
}; | ||
_gaMultipleTrackers( | ||
includeFn, | ||
'ecommerce:addTransaction', | ||
{ | ||
id: transactionId, | ||
affiliation: affiliation, | ||
revenue: total, | ||
tax: tax, | ||
shipping: shipping, | ||
currency: currency || 'USD' | ||
}); | ||
} | ||
}); | ||
}; | ||
/** | ||
* 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) { | ||
_gaJs(function () { | ||
_gaq('_addItem', transactionId, sku, name, category, price, quantity); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._ecommerceEnabled(true, 'addItem')) { | ||
var includeFn = function (trackerObj) { | ||
return isPropertySetTo('trackEcommerce', trackerObj, true); | ||
}; | ||
_gaMultipleTrackers( | ||
includeFn, | ||
'ecommerce:addItem', | ||
{ | ||
id: transactionId, | ||
name: name, | ||
sku: sku, | ||
category: category, | ||
price: price, | ||
quantity: quantity | ||
}); | ||
} | ||
}); | ||
}; | ||
/** | ||
* 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 () { | ||
_gaJs(function () { | ||
_gaq('_trackTrans'); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._ecommerceEnabled(true, 'trackTrans')) { | ||
var includeFn = function (trackerObj) { | ||
return isPropertySetTo('trackEcommerce', trackerObj, true); | ||
}; | ||
_gaMultipleTrackers(includeFn, 'ecommerce:send'); | ||
} | ||
}); | ||
}; | ||
/** | ||
* Clear transaction | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce#clearingData | ||
* @private | ||
*/ | ||
this._clearTrans = function () { | ||
_analyticsJs(function () { | ||
if (that._ecommerceEnabled(true, 'clearTrans')) { | ||
var includeFn = function (trackerObj) { | ||
return isPropertySetTo('trackEcommerce', trackerObj, true); | ||
}; | ||
_gaMultipleTrackers(includeFn, 'ecommerce:clear'); | ||
} | ||
}); | ||
}; | ||
/** | ||
* Enhanced Ecommerce | ||
*/ | ||
/** | ||
* Add Product | ||
* 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 | ||
* @param custom | ||
* @private | ||
*/ | ||
this._addProduct = function (productId, name, category, brand, variant, price, quantity, coupon, position, custom) { | ||
_gaJs(function () { | ||
_gaq('_addProduct', productId, name, category, brand, variant, price, quantity, coupon, position); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._enhancedEcommerceEnabled(true, 'addProduct')) { | ||
var includeFn = function (trackerObj) { | ||
return isPropertySetTo('trackEcommerce', trackerObj, true); | ||
}; | ||
var details = { | ||
id: productId, | ||
name: name, | ||
category: category, | ||
brand: brand, | ||
variant: variant, | ||
price: price, | ||
quantity: quantity, | ||
coupon: coupon, | ||
position: position | ||
}; | ||
if (angular.isObject(custom)) { | ||
angular.extend(details, custom); | ||
} | ||
_gaMultipleTrackers(includeFn, 'ec:addProduct', details); | ||
} | ||
}); | ||
}; | ||
/** | ||
* Add Impression | ||
* 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 | ||
* @private | ||
*/ | ||
this._addImpression = function (id, name, list, brand, category, variant, position, price){ | ||
_gaJs(function () { | ||
_gaq('_addImpression', id, name, list, brand, category, variant, position, price); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._enhancedEcommerceEnabled(true, 'addImpression')) { | ||
var includeFn = function (trackerObj) { | ||
return isPropertySetTo('trackEcommerce', trackerObj, true); | ||
}; | ||
_gaMultipleTrackers( | ||
includeFn, | ||
'ec:addImpression', | ||
{ | ||
id: id, | ||
name: name, | ||
category: category, | ||
brand: brand, | ||
variant: variant, | ||
list: list, | ||
position: position, | ||
price: price | ||
}); | ||
} | ||
}); | ||
}; | ||
/** | ||
* Add Promo | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce | ||
* @param productId | ||
* @param name | ||
* @param creative | ||
* @param position | ||
* @private | ||
*/ | ||
this._addPromo = function (productId, name, creative, position) { | ||
_gaJs(function () { | ||
_gaq('_addPromo', productId, name, creative, position); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._enhancedEcommerceEnabled(true, 'addPromo')) { | ||
var includeFn = function (trackerObj) { | ||
return isPropertySetTo('trackEcommerce', trackerObj, true); | ||
}; | ||
_gaMultipleTrackers( | ||
includeFn, | ||
'ec:addPromo', | ||
{ | ||
id: productId, | ||
name: name, | ||
creative: creative, | ||
position: position | ||
}); | ||
} | ||
}); | ||
}; | ||
/** | ||
* Set Action | ||
* 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 obj | ||
* @private | ||
*/ | ||
this._setAction = function (action, obj){ | ||
_gaJs(function () { | ||
_gaq('_setAction', action, obj); | ||
}); | ||
_analyticsJs(function () { | ||
if (that._enhancedEcommerceEnabled(true, 'setAction')) { | ||
var includeFn = function (trackerObj) { | ||
return isPropertySetTo('trackEcommerce', trackerObj, true); | ||
}; | ||
_gaMultipleTrackers(includeFn, 'ec:setAction', action, obj); | ||
} | ||
}); | ||
}; | ||
/** | ||
* 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 | ||
* @private | ||
*/ | ||
this._trackTransaction = function (transactionId, affiliation, revenue, tax, shipping, coupon, list, step, option) { | ||
this._setAction('purchase', 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 | ||
* @private | ||
*/ | ||
this._trackRefund = function (transactionId) { | ||
this._setAction('refund', getActionFieldObject(transactionId)); | ||
}; | ||
/** | ||
* Track Checkout | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-checkout | ||
* @param step | ||
* @param option | ||
* @private | ||
*/ | ||
this._trackCheckOut = function (step, option) { | ||
this._setAction('checkout', getActionFieldObject(null, null, null, null, null, null, null, step, option)); | ||
}; | ||
/** | ||
* Track detail | ||
* @private | ||
*/ | ||
this._trackDetail = function () { | ||
this._setAction('detail'); | ||
this._pageView(); | ||
}; | ||
/** | ||
* Track add/remove to cart | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#add-remove-cart | ||
* @param action | ||
* @param list | ||
* @private | ||
*/ | ||
this._trackCart = function (action, listName) { | ||
if (['add', 'remove'].indexOf(action) !== -1) { | ||
this._setAction(action, { list: listName }); | ||
this._trackEvent('UX', 'click', action + (action === 'add' ? ' to cart' : ' from cart')); | ||
} | ||
}; | ||
/** | ||
* Track promo click | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-promo-clicks | ||
* @param promotionName | ||
* @private | ||
*/ | ||
this._promoClick = function (promotionName) { | ||
this._setAction('promo_click'); | ||
this._trackEvent('Internal Promotions', 'click', promotionName); | ||
}; | ||
/** | ||
* Track product click | ||
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-promo-clicks | ||
* @param promotionName | ||
* @private | ||
*/ | ||
this._productClick = function (listName) { | ||
this._setAction('click', getActionFieldObject(null, null, null, null, null, null, listName, null, null)); | ||
this._trackEvent('UX', 'click', listName); | ||
}; | ||
/** | ||
* Send page view | ||
* @param trackerName | ||
* @private | ||
*/ | ||
this._pageView = function (trackerName) { | ||
_analyticsJs(function () { | ||
_ga(generateCommandName('send', trackerName), 'pageview'); | ||
}); | ||
}; | ||
/** | ||
* 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 | ||
* @private | ||
*/ | ||
this._send = function () { | ||
var args = Array.prototype.slice.call(arguments); | ||
args.unshift('send'); | ||
_analyticsJs(function () { | ||
_ga.apply(that, 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 (Required) | ||
* @param value (Required) | ||
* @param trackerName (Not Required) | ||
* @private | ||
*/ | ||
this._set = function (name, value, trackerName) { | ||
_analyticsJs(function () { | ||
_ga(generateCommandName('set', trackerName), name, value); | ||
}); | ||
}; | ||
/** | ||
* Track user timings | ||
* @param timingCategory (Required): A string for categorizing all user timing variables into logical groups(e.g jQuery). | ||
* @param timingVar (Required): A string to identify the variable being recorded(e.g. JavaScript Load). | ||
* @param timingValue (Required): The number of milliseconds in elapsed time to report to Google Analytics(e.g. 20). | ||
* @param timingLabel (Not Required): A string that can be used to add flexibility in visualizing user timings in the reports(e.g. Google CDN). | ||
* @private | ||
*/ | ||
this._trackTimings = function (timingCategory, timingVar, timingValue, timingLabel) { | ||
this._send('timing', timingCategory, timingVar, timingValue, timingLabel); | ||
}; | ||
// creates the Google Analytics tracker | ||
if (!delayScriptTag) { | ||
if (analyticsJS) { | ||
this._createAnalyticsScriptTag(); | ||
} else { | ||
this._createScriptTag(); | ||
} | ||
} | ||
// activates page tracking | ||
if (trackRoutes) { | ||
$rootScope.$on(pageEvent, function () { | ||
that._trackPage(); | ||
}); | ||
} | ||
return { | ||
log: that.log, | ||
offlineQueue: that.offlineQueue, | ||
configuration: { | ||
accounts: accounts, | ||
universalAnalytics: analyticsJS, | ||
crossDomainLinker: crossDomainLinker, | ||
crossLinkDomains: crossLinkDomains, | ||
currency: currency, | ||
debugMode: debugMode, | ||
delayScriptTag: delayScriptTag, | ||
displayFeatures: displayFeatures, | ||
domainName: domainName, | ||
ecommerce: that._ecommerceEnabled(), | ||
enhancedEcommerce: that._enhancedEcommerceEnabled(), | ||
enhancedLinkAttribution: enhancedLinkAttribution, | ||
experimentId: experimentId, | ||
hybridMobileSupport: hybridMobileSupport, | ||
ignoreFirstPageLoad: ignoreFirstPageLoad, | ||
logAllCalls: logAllCalls, | ||
pageEvent: pageEvent, | ||
removeRegExp: removeRegExp, | ||
testMode: testMode, | ||
traceDebuggingMode: traceDebuggingMode, | ||
trackPrefix: trackPrefix, | ||
trackRoutes: trackRoutes, | ||
trackUrlParams: trackUrlParams | ||
}, | ||
getUrl: getUrl, | ||
/* DEPRECATED */ | ||
setCookieConfig: that._setCookieConfig, | ||
/* DEPRECATED */ | ||
getCookieConfig: function () { | ||
return cookieConfig; | ||
}, | ||
createAnalyticsScriptTag: function (config) { | ||
if (config) { | ||
cookieConfig = config; | ||
} | ||
return that._createAnalyticsScriptTag(); | ||
}, | ||
createScriptTag: function () { | ||
return that._createScriptTag(); | ||
}, | ||
offline: function (mode) { | ||
if (mode === true && offlineMode === false) { | ||
// Go to offline mode | ||
offlineMode = true; | ||
} | ||
if (mode === false && offlineMode === true) { | ||
// Go to online mode and process the offline queue | ||
offlineMode = false; | ||
while (that.offlineQueue.length > 0) { | ||
var obj = that.offlineQueue.shift(); | ||
obj[0].apply(that, obj[1]); | ||
} | ||
} | ||
return offlineMode; | ||
}, | ||
trackPage: function (url, title, custom) { | ||
that._trackPage.apply(that, arguments); | ||
}, | ||
trackEvent: function (category, action, label, value, noninteraction, custom) { | ||
that._trackEvent.apply(that, arguments); | ||
}, | ||
addTrans: function (transactionId, affiliation, total, tax, shipping, city, state, country, currency) { | ||
that._addTrans.apply(that, arguments); | ||
}, | ||
addItem: function (transactionId, sku, name, category, price, quantity) { | ||
that._addItem.apply(that, arguments); | ||
}, | ||
trackTrans: function () { | ||
that._trackTrans.apply(that, arguments); | ||
}, | ||
clearTrans: function () { | ||
that._clearTrans.apply(that, arguments); | ||
}, | ||
addProduct: function (productId, name, category, brand, variant, price, quantity, coupon, position, custom) { | ||
that._addProduct.apply(that, arguments); | ||
}, | ||
addPromo: function (productId, name, creative, position) { | ||
that._addPromo.apply(that, arguments); | ||
}, | ||
addImpression: function (productId, name, list, brand, category, variant, position, price) { | ||
that._addImpression.apply(that, arguments); | ||
}, | ||
productClick: function (listName) { | ||
that._productClick.apply(that, arguments); | ||
}, | ||
promoClick : function (promotionName) { | ||
that._promoClick.apply(that, arguments); | ||
}, | ||
trackDetail: function () { | ||
that._trackDetail.apply(that, arguments); | ||
}, | ||
trackCart: function (action, list) { | ||
that._trackCart.apply(that, arguments); | ||
}, | ||
trackCheckout: function (step, option) { | ||
that._trackCheckOut.apply(that, arguments); | ||
}, | ||
trackTimings: function (timingCategory, timingVar, timingValue, timingLabel) { | ||
that._trackTimings.apply(that, arguments); | ||
}, | ||
trackTransaction: function (transactionId, affiliation, revenue, tax, shipping, coupon, list, step, option){ | ||
that._trackTransaction.apply(that, arguments); | ||
}, | ||
setAction: function (action, obj) { | ||
that._setAction.apply(that, arguments); | ||
}, | ||
pageView: function () { | ||
that._pageView.apply(that, arguments); | ||
}, | ||
send: function (obj) { | ||
that._send.apply(that, arguments); | ||
}, | ||
set: function (name, value, trackerName) { | ||
that._set.apply(that, arguments); | ||
} | ||
}; | ||
}]; | ||
}) | ||
.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)); | ||
} | ||
}); | ||
} | ||
}; | ||
}]); | ||
return angular.module('angular-google-analytics'); | ||
})); |
{ | ||
"name": "angular-google-analytics", | ||
"description": "Angular Google Analytics - Easy tracking for your AngularJS application", | ||
"version": "1.1.3", | ||
"version": "1.1.4", | ||
"homepage": "http://github.com/revolunet/angular-google-analytics", | ||
@@ -21,8 +21,3 @@ "author": "Julien Bouquillon <julien@revolunet.com> (https://github.com/revolunet)", | ||
}, | ||
"licenses": [ | ||
{ | ||
"type": "MIT", | ||
"url": "http://revolunet.mit-license.org" | ||
} | ||
], | ||
"license": "MIT", | ||
"dependencies": {}, | ||
@@ -37,5 +32,3 @@ "devDependencies": { | ||
"grunt-contrib-jshint": "*", | ||
"grunt-contrib-uglify": "*", | ||
"grunt-release": "~0.3.3", | ||
"grunt-conventional-changelog": "0.0.12" | ||
"grunt-contrib-uglify": "*" | ||
}, | ||
@@ -42,0 +35,0 @@ "scripts": { |
@@ -5,2 +5,3 @@ # angular-google-analytics | ||
![NPM Version](https://img.shields.io/npm/v/angular-google-analytics.svg) | ||
![Master Build Status](https://codeship.com/projects/ba7a0af0-33fe-0133-927c-127922174191/status?branch=master) | ||
@@ -251,3 +252,4 @@ This service lets you integrate google analytics tracker in your AngularJS applications easily. | ||
// Universal analytics: Analytics.createAnalyticsScriptTag(); | ||
// Helpful when needing to do advanced configuration or user opt-out and wanting explicit control over when the Google Analytics script gets injected. | ||
// Helpful when needing to do advanced configuration or user opt-out and wanting explicit control | ||
// over when the Google Analytics script gets injected. | ||
AnalyticsProvider.delayScriptTag(true); | ||
@@ -275,7 +277,18 @@ ``` | ||
// and ensures there is a $window.ga() method available for calling by unit tests. This corrects transient | ||
// errors that were seen during unit tests due to the operation of the Google Analtics scripts. | ||
// errors that were seen during unit tests due to the operation of the Google Analytics scripts. | ||
AnalyticsProvider.enterTestMode(); | ||
``` | ||
## Automatic Tracking | ||
### Debug Mode | ||
```js | ||
// Calling this method will enable debugging mode for Universal Analytics. Supplying a truthy value for the | ||
// optional parameter will further enable trace debugging for Universal Analytics. More information on this | ||
// is available here: https://developers.google.com/analytics/devguides/collection/analyticsjs/debugging. | ||
AnalyticsProvider.enterDebugMode(Boolean); | ||
``` | ||
## Using the Analytics Service | ||
**IMPORTANT!** Due to how Google Analytics works, it is important to remember that you must always call `Analytics.pageView();` when you want to push setting changes and function calls to Google Analytics. | ||
### Automatic Page View Tracking | ||
If you are relying on automatic page tracking, you need to inject Analytics at least once in your application. | ||
@@ -287,3 +300,3 @@ ```js | ||
## Making Calls | ||
### Declaring a Controller | ||
```js | ||
@@ -309,2 +322,4 @@ // As an example, a simple controller to make calls from: | ||
Analytics.configuration.currency; | ||
Analytics.configuration.debugMode; | ||
Analytics.configuration.delayScriptTag; | ||
@@ -324,2 +339,3 @@ Analytics.configuration.displayFeatures; | ||
Analytics.configuration.removeRegExp; | ||
Analytics.configuration.traceDebuggingMode; | ||
Analytics.configuration.trackPrefix; | ||
@@ -473,3 +489,3 @@ Analytics.configuration.trackRoutes; | ||
Analytics.addProduct(productId, name, category, brand, variant, price, quantity, coupon, position); | ||
Analytics.trackCart('add'); | ||
Analytics.trackCart('add', listName); // listname is optional | ||
@@ -479,3 +495,3 @@ // example: | ||
Analytics.addProduct('sku-2', 'Test Product 2', 'Category-1', 'Brand 2', 'variant-3', '2499', '1', 'FLAT10', '1'); | ||
Analytics.trackCart('add'); | ||
Analytics.trackCart('add', 'Search Result'); | ||
``` | ||
@@ -486,3 +502,3 @@ | ||
Analytics.addProduct(productId, name, category, brand, variant, price, quantity, coupon, position); | ||
Analytics.trackCart('remove'); | ||
Analytics.trackCart('remove', listName); // listname is optional | ||
@@ -492,3 +508,3 @@ // example: | ||
Analytics.addProduct('sku-2', 'Test Product 2', 'Category-1', 'Brand 2', 'variant-3', '2499', '1', 'FLAT10', '1'); | ||
Analytics.trackCart('remove'); | ||
Analytics.trackCart('remove', 'Search Result'); | ||
``` | ||
@@ -587,2 +603,3 @@ | ||
## Troubleshooting | ||
### AdBlock EasyPrivacy | ||
@@ -594,2 +611,7 @@ | ||
### Debugging Resources | ||
Chrome Extension: [Google Analytics Debugger](https://chrome.google.com/webstore/detail/google-analytics-debugger/jnkmfdileelhofjcijamephohjechhna) | ||
Firefox Add-on: [Google Analytics Debugger](https://addons.mozilla.org/en-US/firefox/addon/gadebugger/) | ||
## Licence | ||
@@ -596,0 +618,0 @@ |
@@ -12,3 +12,3 @@ // Karma v0.13 http://karma-runner.github.io/0.13/config/configuration-file.html | ||
'bower_components/angular-mocks/angular-mocks.js', | ||
'src/*.js', | ||
'index.js', | ||
'test/unit/*.js' | ||
@@ -15,0 +15,0 @@ ], |
@@ -117,2 +117,17 @@ /* global afterEach, before, beforeEach, describe, document, expect, inject, it, module, spyOn */ | ||
}); | ||
describe('with a prefix set', function(){ | ||
beforeEach(module(function (AnalyticsProvider){ | ||
AnalyticsProvider | ||
.trackPrefix("test-prefix"); | ||
})); | ||
it('should send the url, including the prefix', function(){ | ||
inject(function (Analytics) { | ||
Analytics.log.length = 0; // clear log | ||
Analytics.createAnalyticsScriptTag(); | ||
expect(Analytics.log[2]).toEqual(['send', 'pageview', 'test-prefix']); | ||
}); | ||
}); | ||
}); | ||
}); | ||
@@ -550,2 +565,14 @@ | ||
it('should track add to cart event with product list', function () { | ||
inject(function (Analytics) { | ||
Analytics.log.length = 0; // clear log | ||
Analytics.addProduct('sku-2', 'Test Product 2', 'Category-1', 'Brand 2', 'variant-3', '2499', '1', 'FLAT10', '1'); | ||
Analytics.trackCart('add', 'product-list'); | ||
expect(Analytics.log.length).toBe(3); | ||
expect(Analytics.log[0][0]).toBe('ec:addProduct'); | ||
expect(Analytics.log[1]).toEqual([ 'ec:setAction', 'add', {list: 'product-list'} ]); | ||
expect(Analytics.log[2]).toEqual([ 'send', 'event', 'UX', 'click', 'add to cart', undefined, {} ]); | ||
}); | ||
}); | ||
it('should track remove from cart event', function () { | ||
@@ -564,2 +591,14 @@ inject(function (Analytics) { | ||
it('should track remove from cart event with product list', function () { | ||
inject(function (Analytics) { | ||
Analytics.log.length = 0; // clear log | ||
Analytics.addProduct('sku-2', 'Test Product 2', 'Category-1', 'Brand 2', 'variant-3', '2499', '1', 'FLAT10', '1'); | ||
Analytics.trackCart('remove', 'product-list'); | ||
expect(Analytics.log.length).toBe(3); | ||
expect(Analytics.log[0][0]).toBe('ec:addProduct'); | ||
expect(Analytics.log[1]).toEqual([ 'ec:setAction', 'remove', {list: 'product-list'} ]); | ||
expect(Analytics.log[2]).toEqual([ 'send', 'event', 'UX', 'click', 'remove from cart', undefined, {} ]); | ||
}); | ||
}); | ||
it('should track checkout', function () { | ||
@@ -566,0 +605,0 @@ inject(function (Analytics) { |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
196792
8
3782
623
16
1