diff --git a/app/assets/javascripts/hyrax/analytics_events.js b/app/assets/javascripts/hyrax/analytics_events.js
new file mode 100644
index 00000000..d9b981f5
--- /dev/null
+++ b/app/assets/javascripts/hyrax/analytics_events.js
@@ -0,0 +1,125 @@
+class TrackingTags {
+ constructor(provider) {
+ this.provider = provider
+ switch(this.provider) {
+ case 'matomo':
+ this.tracker = new MatomoTagTracker();
+ break;
+ case 'google':
+ this.tracker = new UATagTracker();
+ break;
+ case 'ga4':
+ this.tracker = new GA4TagTracker();
+ break;
+ default:
+ console.error('Unsupport analytics provider ' + this.provider + ', supported values are: matomo, google, ga4');
+ }
+ }
+
+ // Track an event with the configured provider
+ trackTagEvent(category, action, name) {
+ this.tracker.trackEvent(category, action, name);
+ }
+
+ // Track a page view with the configured provider
+ trackPageView() {
+ this.tracker.trackPageView();
+ }
+
+ // Deprecated: use trackTagEvent and trackPageView instead.
+ analytics() {
+ return this;
+ }
+
+ // Deprecated: use trackTagEvent and trackPageView instead.
+ push(params) {
+ if (params[0] == 'trackPageView' || params[0] == '_trackPageView') {
+ this.tracker.trackPageView();
+ } else {
+ this.tracker.trackTagEvent(params[1], params[2], params[3]);
+ }
+ }
+
+ // Deprecated
+ pageView() {
+ return 'trackPageView';
+ }
+
+ // Deprecated
+ trackEvent() {
+ return 'trackEvent';
+ }
+}
+
+class GA4TagTracker {
+ trackEvent(category, action, name) {
+ gtag('event', action, {
+ 'category': category,
+ 'name': name
+ });
+ }
+
+ trackPageView() {
+ // No operation necessary, this event is automatically collected
+ }
+}
+
+class UATagTracker {
+ trackEvent(category, action, name) {
+ _gaq.push(['_trackEvent', category, action, name]);
+ }
+
+ trackPageView() {
+ _gaq.push(['_trackPageView']);
+ }
+}
+
+class MatomoTagTracker {
+ trackEvent(category, action, name) {
+ _paq.push(['trackEvent', category, action, name]);
+ }
+
+ trackPageView() {
+ _paq.push(['trackPageView']);
+ }
+}
+
+function trackPageView() {
+ window.trackingTags.trackPageView();
+}
+
+function trackAnalyticsEvents() {
+ $('span.analytics-event').each(function(){
+ var eventSpan = $(this);
+ window.trackingTags.trackTagEvent(eventSpan.data('category'), eventSpan.data('action'), eventSpan.data('name'));
+ })
+}
+
+function setupTracking() {
+ var provider = $('meta[name="analytics-provider"]').prop('content')
+ if (provider === undefined) {
+ return;
+ }
+ window.trackingTags = new TrackingTags(provider);
+ trackPageView();
+ trackAnalyticsEvents();
+}
+
+if (typeof Turbolinks !== 'undefined') {
+ $(document).on('turbolinks:load', function() {
+ setupTracking();
+ });
+} else {
+ $(document).on('ready', function() {
+ setupTracking();
+ });
+}
+
+$(document).on('click', '#file_download', function(e) {
+ window.trackingTags.trackTagEvent('file-set', 'file-set-download', $(this).data('label'));
+ window.trackingTags.trackTagEvent('file-set-in-work', 'file-set-in-work-download', $(this).data('work-id'));
+ $(this).data('collection-ids').forEach(function (collection) {
+ window.trackingTags.trackTagEvent('file-set-in-collection', 'file-set-in-collection-download', collection);
+ window.trackingTags.trackTagEvent('work-in-collection', 'work-in-collection-download', collection);
+ });
+});
diff --git a/app/views/_ga.html.erb b/app/views/_ga.html.erb
new file mode 100644
index 00000000..8352c044
--- /dev/null
+++ b/app/views/_ga.html.erb
@@ -0,0 +1,9 @@
+
+
+
+
diff --git a/app/views/_ga4.html.erb b/app/views/_ga4.html.erb
new file mode 100644
index 00000000..c54f10a5
--- /dev/null
+++ b/app/views/_ga4.html.erb
@@ -0,0 +1,10 @@
+
+
+
+