diff --git a/packages/matomo/package.json b/packages/matomo/package.json index 5d8c69be6dd668f811e300dd1d44abcd7935bac0..4a41d9c761de0a430c653e03d9b1ffd8fac6a72e 100644 --- a/packages/matomo/package.json +++ b/packages/matomo/package.json @@ -1,7 +1,7 @@ { "name": "@dbp-toolkit/matomo", "homepage": "https://gitlab.tugraz.at/dbp/web-components/toolkit/-/tree/master/packages/matomo", - "version": "0.2.2", + "version": "0.2.3", "main": "src/index.js", "license": "LGPL-2.1-or-later", "repository": { diff --git a/packages/matomo/src/matomo.js b/packages/matomo/src/matomo.js index 01567191892d02f013a5317158ba98bedc469217..28cef91f7b7eecf330ae310494150934d8132492 100644 --- a/packages/matomo/src/matomo.js +++ b/packages/matomo/src/matomo.js @@ -1,11 +1,6 @@ import DBPLitElement from '@dbp-toolkit/common/dbp-lit-element'; import {LoginStatus} from "@dbp-toolkit/auth/src/util"; -function pushEvent(event) { - window._paq = window._paq || []; - window._paq.push(event); -} - export class MatomoElement extends DBPLitElement { constructor() { @@ -53,7 +48,7 @@ export class MatomoElement extends DBPLitElement { this.analyticsEvent.name, this.analyticsEvent.value]; if (this.isRunning) { - pushEvent(event); + this.pushEvent(event); } else { this.lastEvent = event; } @@ -81,15 +76,17 @@ export class MatomoElement extends DBPLitElement { } console.log('add matomo...'); - pushEvent(['setCustomVariable', 1, "GitCommit", this.gitInfo, "visit"]); - pushEvent(['enableHeartBeatTimer']); - pushEvent(['disableCookies']); - pushEvent(['trackPageView']); - pushEvent(['enableLinkTracking']); + this.pushEvent(['setCustomVariable', 1, "GitCommit", this.gitInfo, "visit"]); + this.pushEvent(['enableHeartBeatTimer']); + this.pushEvent(['disableCookies']); + this.pushEvent(['trackPageView']); + this.pushEvent(['enableLinkTracking']); + + const that = this; (function (endpoint, siteId) { - pushEvent(['setTrackerUrl', endpoint+'matomo.php']); - pushEvent(['setSiteId', siteId]); + that.pushEvent(['setTrackerUrl', endpoint+'matomo.php']); + that.pushEvent(['setSiteId', siteId]); var g = document.createElement('script'); var s = document.getElementsByTagName('script')[0]; @@ -102,31 +99,46 @@ export class MatomoElement extends DBPLitElement { // track changed locations window.addEventListener('locationchanged', function(e) { - pushEvent(['setReferrerUrl', e.detail.referrerUrl]); - pushEvent(['setCustomUrl', location.href]); - // pushEvent(['setDocumentTitle', '']); - pushEvent(['trackPageView']); + that.pushEvent(['setReferrerUrl', e.detail.referrerUrl]); + that.pushEvent(['setCustomUrl', location.href]); + // that.pushEvent(['setDocumentTitle', '']); + that.pushEvent(['trackPageView']); // make Matomo aware of newly added content var content = document.getElementById('content'); - pushEvent(['MediaAnalytics::scanForMedia', content]); - pushEvent(['FormAnalytics::scanForForms', content]); - pushEvent(['trackContentImpressionsWithinNode', content]); + that.pushEvent(['MediaAnalytics::scanForMedia', content]); + that.pushEvent(['FormAnalytics::scanForForms', content]); + that.pushEvent(['trackContentImpressionsWithinNode', content]); }); // track errors window.addEventListener('error', function(e) { - pushEvent(['trackEvent', 'Error', e.error.message + '\n' + e.error.stack]); + that.pushEvent(['trackEvent', 'Error', e.error.message + '\n' + e.error.stack]); }); window.addEventListener('unhandledrejection', function(e) { - pushEvent(['trackEvent', 'UnhandledRejection', e.reason]); + let name = e.reason; + + // TypeError objects have no toJSON() method, so we can't serialize them by themselves + if (e.reason instanceof TypeError) { + const error = e.reason; + name = { + 'message': error.message, + 'name': error.name, + 'fileName': error.fileName, + 'lineNumber': error.lineNumber, + 'columnNumber': error.columnNumber, + 'stack': error.stack, + }; + } + + that.pushEvent(['trackEvent', 'UnhandledRejection', name]); }); this.isRunning = true; if (this.lastEvent.length > 0) { console.log('MatomoElement* (' + this.isRunning + '): ' + this.lastEvent[1] + ', ' + this.lastEvent[2]); - pushEvent(this.lastEvent); + that.pushEvent(this.lastEvent); this.lastEvent = []; } return; @@ -137,4 +149,28 @@ export class MatomoElement extends DBPLitElement { this.isRunning = false; } } + + /** + * Pushes an event array to Matomo + * See: https://matomo.org/docs/event-tracking/ + * + * event[0]: Event Category + * event[1]: Event Action + * event[2]: Event Name + * event[3]: Event Value + * + * @param event + */ + pushEvent(event) { + window._paq = window._paq || []; + + // make sure the event name is a non-empty string + if (event[2] === null || event[2] === '') { + event[2] = 'empty'; + } else if (typeof event[2] === 'object') { + event[2] = JSON.stringify(event[2]); + } + + window._paq.push(event); + } }