From ad531db3ad9fef7700b15af78d0072e63c17144f Mon Sep 17 00:00:00 2001 From: Eric Larson Date: Fri, 19 Mar 2021 10:15:25 -0500 Subject: [PATCH] GeoBlacklight Google Anaytics Module Addresses #13 --- .example.env.test | 3 + app/assets/javascripts/analytics.js | 101 +++++++++++++++++++++ app/assets/javascripts/application.js | 1 + app/views/layouts/blacklight/base.html.erb | 3 +- config/environments/development.rb | 3 + config/environments/production.rb | 3 + config/environments/test.rb | 3 + config/initializers/assets.rb | 2 +- test/system/homepage_test.rb | 7 +- 9 files changed, 121 insertions(+), 5 deletions(-) create mode 100644 app/assets/javascripts/analytics.js diff --git a/.example.env.test b/.example.env.test index ddb6da7..b7e6f1a 100644 --- a/.example.env.test +++ b/.example.env.test @@ -9,3 +9,6 @@ MYSQL_SERVER=127.0.0.1 MYSQL_PORT=3306 MYSQL_USER=root MYSQL_PASSWORD=root + +# Google Analytics +GOOGLE_ANALYTICS=UA-XXXXXXXX-X diff --git a/app/assets/javascripts/analytics.js b/app/assets/javascripts/analytics.js new file mode 100644 index 0000000..879e645 --- /dev/null +++ b/app/assets/javascripts/analytics.js @@ -0,0 +1,101 @@ +// Inspired by and modified from http://railsapps.github.io/rails-google-analytics.html + +GoogleAnalytics = (function() { + function GoogleAnalytics() {} + + GoogleAnalytics.load = function() { + var firstScript, ga; + window._gaq = []; + GoogleAnalytics.analyticsId = GoogleAnalytics.getAnalyticsId(); + window._gaq.push(['_setAccount', GoogleAnalytics.analyticsId]); + ga = document.createElement('script'); + ga.type = 'text/javascript'; + ga.async = true; + ga.src = ('https:' === document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; + firstScript = document.getElementsByTagName('script')[0]; + firstScript.parentNode.insertBefore(ga, firstScript); + }; + + GoogleAnalytics.trackPageview = function(url) { + if (!GoogleAnalytics.isLocalRequest()) { + if (url) { + window._gaq.push(['_trackPageview', url]); + } else { + window._gaq.push(['_trackPageview']); + } + return window._gaq.push(['_trackPageLoadTime']); + } + }; + + GoogleAnalytics.isLocalRequest = function() { + return GoogleAnalytics.documentDomainIncludes('local'); + }; + + GoogleAnalytics.documentDomainIncludes = function(str) { + return document.domain.indexOf(str) !== -1; + }; + + GoogleAnalytics.getAnalyticsId = function() { + return $('[data-analytics-id]').data('analytics-id'); + }; + + return GoogleAnalytics; + +})(); + +Blacklight.onLoad(function() { + GoogleAnalytics.load(); + if (GoogleAnalytics.analyticsId) { + GoogleAnalytics.trackPageview(); + } + + // Log spatial search events + + // Map Moved + History.Adapter.bind(window, 'statechange', function(e) { + var state = History.getState(); + window._gaq.push(['_trackEvent', 'Spatial Search', 'Map Moved', state.url]); + }); + + // Initiate search in an area + $('.leaflet-control.search-control a.btn-primary').on('click', function(e) { + window._gaq.push(['_trackEvent', 'Spatial Search', 'Search Here', e.currentTarget.baseURI]); + }); + + // Log download clicks + $(document).on('click', '[data-download="trigger"]', function(e) { + var data = $(e.target).data(); + window._gaq.push(['_trackEvent', 'Download', data.downloadId, data.downloadType]); + }); + + // Log failed download + $(document).on('DOMNodeInserted', '[data-download="error"]', function(e) { + var data = $(e.target).data(); + window._gaq.push(['_trackEvent', 'Failed Download', data.downloadId, data.downloadType]); + }); + + // Log all show page tool clicks + $(document).on('click', 'div.show-tools li a', function() { + var data = $(this); + window._gaq.push(['_trackEvent', $.trim(data[0].innerText), window.location.href.split("/").pop()]); + }); + + // Log all facet expand/collapse clicks + $('#facets h3').on('click', function(){ + var label = $(this).text(); + var heading_values = ['Facets', 'collapse_expand', label]; + _gaq.push(['_trackEvent'].concat(heading_values)); + }); + + // Log all facet more link clicks + $('#facets li.more_facets a').on('click', function(){ + var label = $(this).find("span").text(); + var heading_values = ['Facets', 'more_link', label]; + _gaq.push(['_trackEvent'].concat(heading_values)); + }); + + // Log all item viewer definition rollovers + $('#viewer-container a[data-toggle="popover"]').hover(function(){ + window._gaq.push(['_trackEvent', 'Item Viewer Popover', window.location.href.split("/").pop()]); + }); +}); diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 3d6b43b..067dc7e 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -15,3 +15,4 @@ //= require geoblacklight // UMass +//= require analytics diff --git a/app/views/layouts/blacklight/base.html.erb b/app/views/layouts/blacklight/base.html.erb index d98e872..ca9ad34 100644 --- a/app/views/layouts/blacklight/base.html.erb +++ b/app/views/layouts/blacklight/base.html.erb @@ -15,6 +15,7 @@ <%= stylesheet_link_tag "application", media: "all" %> <%= javascript_include_tag "application" %> + <%= javascript_include_tag 'analytics' %> <%= csrf_meta_tags %> <%= content_for(:head) %> @@ -32,7 +33,7 @@ -
+
<%= content_for(:container_header) %> <%= render partial: 'shared/flash_msg', layout: 'shared/flash_messages' %> diff --git a/config/environments/development.rb b/config/environments/development.rb index 7a9f6c3..537ed2a 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -64,6 +64,9 @@ # Raises error for missing translations. # config.i18n.raise_on_missing_translations = true + # Google Analytics - Dev + config.google_analytics = ENV['GOOGLE_ANALYTICS'] + # Annotate rendered view with file names. # config.action_view.annotate_rendered_view_with_filenames = true diff --git a/config/environments/production.rb b/config/environments/production.rb index 28dea86..79ba1a8 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -97,6 +97,9 @@ # Do not dump schema after migrations. config.active_record.dump_schema_after_migration = false + # Google Analytics - Prod + config.google_analytics = ENV['GOOGLE_ANALYTICS'] + # Inserts middleware to perform automatic connection switching. # The `database_selector` hash is used to pass options to the DatabaseSelector # middleware. The `delay` is used to determine how long to wait after a write diff --git a/config/environments/test.rb b/config/environments/test.rb index d3d5247..429fbf3 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -54,6 +54,9 @@ # Tell Active Support which deprecation messages to disallow. config.active_support.disallowed_deprecation_warnings = [] + # Google Analytics - Test + config.google_analytics = ENV['GOOGLE_ANALYTICS'] + # Raises error for missing translations. # config.i18n.raise_on_missing_translations = true diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb index 53213e2..4c16fac 100644 --- a/config/initializers/assets.rb +++ b/config/initializers/assets.rb @@ -11,7 +11,7 @@ # Precompile additional assets. # application.js, application.css, and all non-JS/CSS in the app/assets # folder are already added. -# Rails.application.config.assets.precompile += %w( admin.js admin.css ) +Rails.application.config.assets.precompile += %w( analytics.js ) Rails.application.config.assets.precompile += %w( favicon.ico ) diff --git a/test/system/homepage_test.rb b/test/system/homepage_test.rb index ff9363f..df4815a 100644 --- a/test/system/homepage_test.rb +++ b/test/system/homepage_test.rb @@ -6,13 +6,14 @@ def setup end def test_basic_dom - assert page.has_selector?('header') # Global Header + assert page.has_selector?('header') # Header + assert page.has_selector?("[data-analytics-id]") # Google Analytics assert page.has_selector?('ul.navbar-nav') # Navbar - assert page.has_selector?('footer') # Global Footer + assert page.has_selector?('footer') # Footer end def test_homepage_copy - within('ul.navbar-nav') do + within('#application-nav ul.navbar-nav') do assert page.has_link?("About") assert page.has_link?("Contact") assert page.has_link?("Help")