diff --git a/README.md b/README.md index ce945e4..abf61f4 100644 --- a/README.md +++ b/README.md @@ -237,6 +237,13 @@ Group membership can be debugged from the console via: And since session ID is an input in calculating the group, reassignment occurs when clearing it: `mw.storage.session.remove('mwuser-sessionId')`. +#### $wgMinervaSchemaMainMenuClickTrackingSampleRate + +Defines the sampling rate for the MobileWebMainMenuClickTracking schema. + +* Type: `Number` +* Default: `0` + ### Components Components may be shared between server and client. Keeping all code for a single component only in diff --git a/includes/MinervaHooks.php b/includes/MinervaHooks.php index f0df059..ad6e4fc 100644 --- a/includes/MinervaHooks.php +++ b/includes/MinervaHooks.php @@ -256,6 +256,8 @@ class MinervaHooks { $config = MediaWikiServices::getInstance()->getConfigFactory() ->makeConfig( 'minerva' ); $vars += [ + 'wgMinervaSchemaMainMenuClickTrackingSampleRate' => + $config->get( 'MinervaSchemaMainMenuClickTrackingSampleRate' ), 'wgMinervaABSamplingRate' => $config->get( 'MinervaABSamplingRate' ), 'wgMinervaCountErrors' => $config->get( 'MinervaCountErrors' ), 'wgMinervaErrorLogSamplingRate' => $config->get( 'MinervaErrorLogSamplingRate' ), diff --git a/resources/skins.minerva.scripts/init.js b/resources/skins.minerva.scripts/init.js index 4cebcfd..98a18cc 100644 --- a/resources/skins.minerva.scripts/init.js +++ b/resources/skins.minerva.scripts/init.js @@ -8,6 +8,7 @@ errorLogging = require( './errorLogging.js' ), notifications = require( './notifications.js' ), preInit = require( './preInit.js' ), + initLogging = require( './initLogging.js' ), mobileRedirect = require( './mobileRedirect.js' ), search = require( './search.js' ), references = require( './references.js' ), @@ -345,6 +346,8 @@ // - main menu closes when you click outside of it // - redirects show a toast. preInit(); + // - logging + initLogging(); // - references references(); // - search diff --git a/resources/skins.minerva.scripts/initLogging.js b/resources/skins.minerva.scripts/initLogging.js new file mode 100644 index 0000000..91c93ca --- /dev/null +++ b/resources/skins.minerva.scripts/initLogging.js @@ -0,0 +1,8 @@ +// This initialises EventLogging for main menu and some prominent links in the UI. +// This code should only be loaded on the Minerva skin, it does not apply to other skins. +// @deprecated and to be removed the moment that T220016 is live. +var mainMenu = require( './menu.js' ); + +module.exports = function () { + mainMenu.enableLogging(); +}; diff --git a/resources/skins.minerva.scripts/menu/MainMenu.js b/resources/skins.minerva.scripts/menu/MainMenu.js index 7618c32..4427457 100644 --- a/resources/skins.minerva.scripts/menu/MainMenu.js +++ b/resources/skins.minerva.scripts/menu/MainMenu.js @@ -33,6 +33,25 @@ activator: undefined }, + /** + * Turn on event logging on the existing main menu by reading `event-name` data + * attributes on elements. + * @memberof MainMenu + * @deprecated and to be removed the moment that T220016 is live. + * @instance + */ + enableLogging: function () { + this.$el.find( 'a' ).on( 'click', function () { + var $link = $( this ), + eventName = $link.data( 'event-name' ); + if ( eventName ) { + mw.track( 'minerva.schemaMobileWebMainMenuClickTracking', { + name: eventName, + destination: $link.attr( 'href' ) + } ); + } + } ); + }, /** * Remove the nearby menu entry if the browser doesn't support geo location * @memberof MainMenu diff --git a/resources/skins.minerva.scripts/menu/schema.js b/resources/skins.minerva.scripts/menu/schema.js new file mode 100644 index 0000000..ff5e1e9 --- /dev/null +++ b/resources/skins.minerva.scripts/menu/schema.js @@ -0,0 +1,53 @@ +mw.loader.using( [ + 'ext.eventLogging' +] ).then( function () { + var M = mw.mobileFrontend, + user = mw.user, + editCount = mw.config.get( 'wgUserEditCount' ), + // Need to make amc default to false because it will not exist in mw.config + // if using desktop Minerva or if MobileFrontend extension is not installed. + amc = mw.config.get( 'wgMFAmc', false ), + // Schema class provided by ext.eventLogging module + Schema = mw.eventLog.Schema, // resource-modules-disable-line + context = M.require( 'mobile.startup' ).context, + DEFAULT_SAMPLING_RATE = mw.config.get( 'wgMinervaSchemaMainMenuClickTrackingSampleRate' ), + // T218627: Sampling rate should be 100% if user has amc enabled + AMC_SAMPLING_RATE = 1, + /** + * MobileWebMainMenuClickTracking schema + * https://meta.wikimedia.org/wiki/Schema:MobileWebMainMenuClickTracking + * + * @class MobileWebMainMenuClickTracking + * @deprecated and to be removed the moment that T220016 is live. + * @singleton + */ + schemaMobileWebMainMenuClickTracking = new Schema( + 'MobileWebMainMenuClickTracking', + amc ? AMC_SAMPLING_RATE : DEFAULT_SAMPLING_RATE, + /** + * @property {Object} defaults Default options hash. + * @property {string} defaults.mode whether user is in stable, beta, or desktop + * @property {boolean} defaults.amc whether or not the user has advanced + * contributions mode enabled (true) or disabled (false) + * @property {string} [defaults.username] Username if the user is logged in, + * otherwise - undefined. + * Assigning undefined will make event logger omit this property when sending + * the data to a server. According to the schema username is optional. + * @property {number} [defaults.userEditCount] The number of edits the user has made + * if the user is logged in, otherwise - undefined. Assigning undefined will make event + * logger omit this property when sending the data to a server. According to the schema + * userEditCount is optional. + */ + { + mode: context.getMode() || 'desktop', + amc: amc, + username: user.getName() || undefined, + // FIXME: Use edit bucket here (T210106) + userEditCount: typeof editCount === 'number' ? editCount : undefined + } + ); + + mw.trackSubscribe( 'minerva.schemaMobileWebMainMenuClickTracking', function ( topic, data ) { + schemaMobileWebMainMenuClickTracking.log( data ); + } ); +} ); diff --git a/skin.json b/skin.json index 8c835cf..046a336 100644 --- a/skin.json +++ b/skin.json @@ -66,6 +66,7 @@ "base": false, "beta": true }, + "MinervaSchemaMainMenuClickTrackingSampleRate": 0, "MinervaABSamplingRate": 0 }, "ValidSkinNames": { @@ -186,7 +187,8 @@ }, "EventLoggingSchemas": { "WebClientError": 18340282, - "MobileWebShareButton": 18923688 + "MobileWebShareButton": 18923688, + "MobileWebMainMenuClickTracking": 18984528 }, "ResourceModules": { "skins.minerva.base.styles": { @@ -481,6 +483,7 @@ "resources/skins.minerva.scripts/NotificationBadge.js", "resources/skins.minerva.scripts/notifications.js", "resources/skins.minerva.scripts/overlayManager.js", + "resources/skins.minerva.scripts/menu/schema.js", "resources/skins.minerva.scripts/menu/MainMenu.js", "resources/skins.minerva.scripts/menu.js", "resources/skins.minerva.scripts/errorLogging.js", @@ -499,6 +502,7 @@ "resources/skins.minerva.scripts/TitleUtil.js", "components/ToggleList/ToggleList.js", "resources/skins.minerva.scripts/Toolbar.js", + "resources/skins.minerva.scripts/initLogging.js", "resources/skins.minerva.scripts/mobileRedirect.js", "resources/skins.minerva.scripts/search.js", "resources/skins.minerva.scripts/references.js",