From 4de494b503e3c73089fe9e9f694853ae80bc9552 Mon Sep 17 00:00:00 2001
From: Allen Gilliland <agilliland@gmail.com>
Date: Mon, 5 Oct 2015 21:45:31 -0700
Subject: [PATCH] use the GA code that is injected into the app dynamically and
 instrument our setup steps so we know if people fail on install.

---
 frontend/app/services.js                             |  5 +++--
 frontend/app/setup/components/DatabaseStep.react.js  |  7 +++++++
 .../app/setup/components/PreferencesStep.react.js    |  3 +++
 frontend/app/setup/components/Setup.react.js         |  8 +++++++-
 frontend/app/setup/components/UserStep.react.js      |  3 +++
 resources/frontend_client/index_template.html        | 12 ++++++++----
 6 files changed, 31 insertions(+), 7 deletions(-)

diff --git a/frontend/app/services.js b/frontend/app/services.js
index b21665f1489..5470171acb2 100644
--- a/frontend/app/services.js
+++ b/frontend/app/services.js
@@ -233,9 +233,10 @@ MetabaseServices.factory('AppState', ['$rootScope', '$q', '$location', '$interva
 
         // enable / disable GA based on opt-out of anonymous tracking
         $rootScope.$on("appstate:site-settings", function(event, settings) {
+            const ga_code = MetabaseSettings.get('ga_code');
             if (MetabaseSettings.isTrackingEnabled()) {
                 // we are doing tracking
-                window['ga-disable-UA-60817802-1'] = null;
+                window['ga-disable-'+ga_code] = null;
 
                 if (currentUserPromise) {
                     currentUserPromise.then(function(user) {
@@ -244,7 +245,7 @@ MetabaseServices.factory('AppState', ['$rootScope', '$q', '$location', '$interva
                 }
             } else {
                 // tracking is disabled
-                window['ga-disable-UA-60817802-1'] = true;
+                window['ga-disable-'+ga_code] = true;
 
                 teardownIntercom();
             }
diff --git a/frontend/app/setup/components/DatabaseStep.react.js b/frontend/app/setup/components/DatabaseStep.react.js
index 9650b8c1269..c0d648d66a1 100644
--- a/frontend/app/setup/components/DatabaseStep.react.js
+++ b/frontend/app/setup/components/DatabaseStep.react.js
@@ -3,6 +3,7 @@ import _ from "underscore";
 
 import DatabaseDetailsForm from "metabase/components/database/DatabaseDetailsForm.react";
 import FormField from "metabase/components/form/FormField.react";
+import MetabaseAnalytics from "metabase/lib/analytics";
 import MetabaseCore from "metabase/lib/core";
 
 import StepTitle from './StepTitle.react'
@@ -23,6 +24,8 @@ export default class DatabaseStep extends Component {
         this.setState({
             'engine': engine
         });
+
+        MetabaseAnalytics.trackEvent('Setup', 'Choose Database', engine);
     }
 
     async detailsCaptured(details) {
@@ -39,6 +42,8 @@ export default class DatabaseStep extends Component {
                 'nextStep': ++this.props.stepNumber,
                 'details': details
             }));
+
+            MetabaseAnalytics.trackEvent('Setup', 'Database Step', this.state.engine);
         } catch (error) {
             this.setState({
                 'formError': error
@@ -55,6 +60,8 @@ export default class DatabaseStep extends Component {
             'nextStep': ++this.props.stepNumber,
             'details': null
         }));
+
+        MetabaseAnalytics.trackEvent('Setup', 'Database Step');
     }
 
     renderEngineSelect() {
diff --git a/frontend/app/setup/components/PreferencesStep.react.js b/frontend/app/setup/components/PreferencesStep.react.js
index b7cfa626ca5..695bf96e7b4 100644
--- a/frontend/app/setup/components/PreferencesStep.react.js
+++ b/frontend/app/setup/components/PreferencesStep.react.js
@@ -1,5 +1,6 @@
 import React, { Component, PropTypes } from "react";
 
+import MetabaseAnalytics from "metabase/lib/analytics";
 import Toggle from "metabase/components/Toggle.react";
 
 import StepTitle from './StepTitle.react';
@@ -20,6 +21,8 @@ export default class PreferencesStep extends Component {
 
         // okay, this is the big one.  we actually submit everything to the api now and complete the process.
         this.props.dispatch(submitSetup());
+
+        MetabaseAnalytics.trackEvent('Setup', 'Preferences Step');
     }
 
     render() {
diff --git a/frontend/app/setup/components/Setup.react.js b/frontend/app/setup/components/Setup.react.js
index 49f147d2a19..1ba56c0c1f1 100644
--- a/frontend/app/setup/components/Setup.react.js
+++ b/frontend/app/setup/components/Setup.react.js
@@ -1,6 +1,7 @@
 import React, { Component, PropTypes } from "react";
 
 import LogoIcon from 'metabase/components/LogoIcon.react';
+import MetabaseAnalytics from "metabase/lib/analytics";
 import MetabaseSettings from "metabase/lib/settings";
 
 import UserStep from './UserStep.react';
@@ -19,6 +20,11 @@ export default class Setup extends Component {
 
     completeWelcome() {
         this.props.dispatch(setActiveStep(USER_STEP_NUMBER));
+        MetabaseAnalytics.trackEvent('Setup', 'Welcome');
+    }
+
+    completeSetup() {
+        MetabaseAnalytics.trackEvent('Setup', 'Complete');
     }
 
     renderFooter() {
@@ -69,7 +75,7 @@ export default class Setup extends Component {
                                 <section className="SetupStep rounded SetupStep--active flex flex-column layout-centered p4">
                                     <h1 style={{fontSize: "xx-large"}} className="text-normal pt2">You're all set up!</h1>
                                     <div className="pt4 pb2">
-                                        <a className="Button Button--primary" href="/">Take me to Metabase</a>
+                                        <a className="Button Button--primary" href="/" onClick={this.completeSetup.bind(this)}>Take me to Metabase</a>
                                     </div>
                                 </section>
                             : null }
diff --git a/frontend/app/setup/components/UserStep.react.js b/frontend/app/setup/components/UserStep.react.js
index 9eddc6d5bef..3f403a5ac03 100644
--- a/frontend/app/setup/components/UserStep.react.js
+++ b/frontend/app/setup/components/UserStep.react.js
@@ -5,6 +5,7 @@ import cx from "classnames";
 import FormField from "metabase/components/form/FormField.react";
 import FormLabel from "metabase/components/form/FormLabel.react";
 import FormMessage from "metabase/components/form/FormMessage.react";
+import MetabaseAnalytics from "metabase/lib/analytics";
 import MetabaseSettings from "metabase/lib/settings";
 import MetabaseUtils from "metabase/lib/utils";
 
@@ -99,6 +100,8 @@ export default class UserStep extends Component {
                 'site_name': React.findDOMNode(this.refs.siteName).value
             }
         }));
+
+        MetabaseAnalytics.trackEvent('Setup', 'User Details Step');
     }
 
     render() {
diff --git a/resources/frontend_client/index_template.html b/resources/frontend_client/index_template.html
index ae27cbb6f65..74dc50af68a 100644
--- a/resources/frontend_client/index_template.html
+++ b/resources/frontend_client/index_template.html
@@ -37,9 +37,13 @@
     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');
 
-    // start off with tracking disabled (the angular app will re-enable this once we know the app runtime settings)
-    window['ga-disable-UA-60817802-1'] = true;
-
-    ga('create', 'UA-60817802-1', 'auto');
+    // if we are not doing tracking then go ahead and disable GA now so we never even track the initial pageview
+    const tracking = window.MetabaseBootstrap.anon_tracking_enabled;
+    const ga_code = window.MetabaseBootstrap.ga_code;
+    if (!tracking) {
+        window['ga-disable-'+ga_code] = true;
+    }
+
+    ga('create', ga_code, 'auto');
     </script>
 </html>
-- 
GitLab