diff --git a/app/assets/javascripts/app/frontend/controllers/_base.js b/app/assets/javascripts/app/frontend/controllers/_base.js index 441bca4c1..cd7cc16d9 100644 --- a/app/assets/javascripts/app/frontend/controllers/_base.js +++ b/app/assets/javascripts/app/frontend/controllers/_base.js @@ -1,30 +1,11 @@ class BaseCtrl { - constructor(syncManager, dbManager, authManager) { + constructor(syncManager, dbManager, analyticsManager) { dbManager.openDatabase(null, function(){ // new database, delete syncToken so that items can be refetched entirely from server syncManager.clearSyncToken(); syncManager.sync(); }) - - // load analytics - window._paq = window._paq || []; - - (function() { - var u="https://piwik.standardnotes.org/"; - window._paq.push(['setTrackerUrl', u+'piwik.php']); - window._paq.push(['setSiteId', '2']); - var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; - g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s); - })(); - - var analyticsId = authManager.getUserAnalyticsId(); - if(analyticsId) { - window._paq.push(['setUserId', analyticsId]); - } - window._paq.push(['trackPageView']); - window._paq.push(['enableLinkTracking']); } - } angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); diff --git a/app/assets/javascripts/app/services/analyticsManager.js b/app/assets/javascripts/app/services/analyticsManager.js new file mode 100644 index 000000000..f9aed87c8 --- /dev/null +++ b/app/assets/javascripts/app/services/analyticsManager.js @@ -0,0 +1,51 @@ +class AnalyticsManager { + + constructor(authManager) { + this.authManager = authManager; + + var status = localStorage.getItem("analyticsEnabled"); + if(status === null) { + this.enabled = true; + } else { + this.enabled = JSON.parse(status); + } + + if(this.enabled === true) { + this.initialize(); + } + } + + setStatus(enabled) { + this.enabled = enabled; + localStorage.setItem("analyticsEnabled", JSON.stringify(enabled)); + + window.location.reload(); + } + + toggleStatus() { + this.setStatus(!this.enabled); + } + + initialize() { + // load analytics + window._paq = window._paq || []; + + (function() { + var u="https://piwik.standardnotes.org/"; + window._paq.push(['setTrackerUrl', u+'piwik.php']); + window._paq.push(['setSiteId', '2']); + var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; + g.type='text/javascript'; g.id="piwik", g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s); + })(); + + var analyticsId = this.authManager.getUserAnalyticsId(); + if(analyticsId) { + window._paq.push(['setUserId', analyticsId]); + } + window._paq.push(['trackPageView', "AppInterface"]); + window._paq.push(['enableLinkTracking']); + } + +} + +angular.module('app.frontend').service('analyticsManager', AnalyticsManager); diff --git a/app/assets/javascripts/app/services/directives/views/accountMenu.js b/app/assets/javascripts/app/services/directives/views/accountMenu.js index 6289e7883..a3c94ade4 100644 --- a/app/assets/javascripts/app/services/directives/views/accountMenu.js +++ b/app/assets/javascripts/app/services/directives/views/accountMenu.js @@ -6,7 +6,7 @@ class AccountMenu { this.scope = {}; } - controller($scope, authManager, modelManager, syncManager, dbManager, $timeout) { + controller($scope, authManager, modelManager, syncManager, dbManager, analyticsManager, $timeout) { 'ngInject'; $scope.formData = {mergeLocal: true, url: syncManager.serverURL}; @@ -14,6 +14,7 @@ class AccountMenu { $scope.server = syncManager.serverURL; $scope.syncStatus = syncManager.syncStatus; + $scope.analyticsManager = analyticsManager; $scope.encryptionKey = function() { return authManager.keys().mk; diff --git a/app/assets/templates/frontend/directives/account-menu.html.haml b/app/assets/templates/frontend/directives/account-menu.html.haml index 7d971dbee..e89549c27 100644 --- a/app/assets/templates/frontend/directives/account-menu.html.haml +++ b/app/assets/templates/frontend/directives/account-menu.html.haml @@ -2,7 +2,7 @@ .panel-body.large-padding %div{"ng-if" => "!user"} %div{"ng-if" => "!formData.confirmPassword"} - %p Enter your Standard File account information. You can also register for free using the default server address. + %p Enter your account information. You can also register for free using the default server address. .small-v-space %form.mt-5 @@ -20,8 +20,8 @@ %button.btn.dark-button.half-button{"ng-click" => "submitRegistrationForm()"} %span Register %br - .block{"style" => "margin-top: 10px; font-size: 14px; font-weight: bold; text-align: center;"} - %a.btn{"ng-click" => "showResetForm = !showResetForm"} Passwords cannot be forgotten. + .block.bold.center-align{"style" => "font-size: 14px;"} + %a.btn.mt-5{"ng-click" => "formData.showResetForm = !formData.showResetForm"} Passwords cannot be forgotten. %div{"ng-if" => "formData.confirmPassword"} %h3 Confirm your password. @@ -33,10 +33,12 @@ %em.block.center-align.mt-10{"ng-if" => "formData.status", "style" => "font-size: 14px;"} {{formData.status}} - %div{"ng-if" => "showResetForm"} - %p{"style" => "font-size: 13px; text-align: center;"} + .gray-bg.medium-padding{"ng-if" => "formData.showResetForm"} + %p{"style" => "font-size: 13px;"} Because notes are locally encrypted using a secret key derived from your password, there's no way to decrypt these notes if you forget your password. - For this reason, Standard Notes cannot offer a password reset option. You must make sure to store or remember your password. + For this reason, Standard Notes cannot offer a password reset option. You + %span.bold must + make sure to store or remember your password. %div{"ng-if" => "user"} %h2 {{user.email}} @@ -92,7 +94,7 @@ %input{"type" => "radio", "ng-model" => "archiveFormData.encrypted", "ng-value" => "false", "ng-change" => "archiveFormData.encrypted = false"} Decrypted - %a.block{"ng-click" => "downloadDataArchive()"} Download Data Archive + %a.block{"ng-click" => "downloadDataArchive()", "ng-class" => "{'mt-5' : !user}"} Download Data Archive %label.block.mt-5 %input{"type" => "file", "style" => "display: none;", "file-change" => "->", "handler" => "importFileSelected(files)"} @@ -107,4 +109,14 @@ .spinner.mt-10{"ng-if" => "importData.loading"} + .mt-25 + %h4 Analytics + %p + Help Standard Notes improve by sending anonymous data on general usage. Learn more + %a{"href" => "https://standardnotes.org/philosophy", "target" => "_blank"} here. + %div.mt-5 + %label Status: + {{analyticsManager.enabled ? "Enabled" : "Disabled"}} + %a{"ng-click" => "analyticsManager.toggleStatus()"} {{analyticsManager.enabled ? "Disable" : "Enable"}} + %a.block.mt-25.red{"ng-click" => "destroyLocalData()"} {{ user ? "Sign out and clear local data" : "Clear all local data" }} diff --git a/app/assets/templates/frontend/header.html.haml b/app/assets/templates/frontend/header.html.haml index a908c2f4b..06256bb70 100644 --- a/app/assets/templates/frontend/header.html.haml +++ b/app/assets/templates/frontend/header.html.haml @@ -9,7 +9,7 @@ %global-extensions-menu{"ng-if" => "ctrl.showExtensionsMenu"} .footer-bar-link - %a{"href" => "https://standardnotes.org", "target" => "_blank"} + %a{"href" => "https://standardnotes.org/help", "target" => "_blank"} Help .pull-right