Bmansurov has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/251001

Change subject: Add event logging to read more
......................................................................

Add event logging to read more

* Schema is located at https://meta.wikimedia.org/wiki/Schema:RelatedArticles.
* Track 'loaded', 'seen', and 'clicked' events.
* The sampling rate can be set using the RelatedArticlesLoggingSamplingRate 
variable.
  If the variable is not set, sampling will be disabled. The default sampling 
rate
  is 0.01.
* Events are tracked using a unique user session token.

Dependency: Iea00d534371353c3ae5c06c74a08aa10cb60047b
Bug: T114303
Change-Id: I649d0817cbd10ad734989da548d20ad33e7f7360
---
M extension.json
M includes/Hooks.php
A resources/ext.relatedArticles.readMore.minerva/SchemaRelatedArticles.js
M resources/ext.relatedArticles.readMore.minerva/index.js
4 files changed, 127 insertions(+), 3 deletions(-)


  git pull 
ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/RelatedArticles 
refs/changes/01/251001/1

diff --git a/extension.json b/extension.json
index 7de70a7..7285c7a 100644
--- a/extension.json
+++ b/extension.json
@@ -42,6 +42,12 @@
                ],
                "BeforePageDisplay": [
                        "RelatedArticles\\ReadMoreHooks::onBeforePageDisplay"
+               ],
+               "EventLoggingRegisterSchemas": [
+                       "RelatedArticles\\Hooks::onEventLoggingRegisterSchemas"
+               ],
+               "ResourceLoaderGetConfigVars": [
+                       "RelatedArticles\\Hooks::onResourceLoaderGetConfigVars"
                ]
        },
        "MessagesDirs": {
@@ -64,7 +70,11 @@
                        ]
                },
                "ext.relatedArticles.readMore.minerva": {
+                       "dependencies": [
+                               "ext.eventLogging.Schema"
+                       ],
                        "scripts": [
+                               
"resources/ext.relatedArticles.readMore.minerva/SchemaRelatedArticles.js",
                                
"resources/ext.relatedArticles.readMore.minerva/index.js"
                        ],
                        "styles": [
@@ -81,5 +91,8 @@
        "ResourceFileModulePaths": {
                "localBasePath": "",
                "remoteExtPath": "RelatedArticles"
+       },
+       "config": {
+               "RelatedArticlesLoggingSamplingRate": 0.01
        }
 }
diff --git a/includes/Hooks.php b/includes/Hooks.php
index c83c95a..7e0a27d 100644
--- a/includes/Hooks.php
+++ b/includes/Hooks.php
@@ -278,4 +278,38 @@
 
                return true;
        }
+
+       /**
+        * EventLoggingRegisterSchemas hook handler.
+        *
+        * Registers our EventLogging schemas so that they can be converted to
+        * ResourceLoaderSchemaModules by the EventLogging extension.
+        *
+        * If the module has already been registered in
+        * onResourceLoaderRegisterModules, then it is overwritten.
+        *
+        * @param array $schemas The schemas currently registered with the 
EventLogging
+        *  extension
+        * @return bool Always true
+        */
+       public static function onEventLoggingRegisterSchemas( &$schemas ) {
+               // @see https://meta.wikimedia.org/wiki/Schema:RelatedArticles
+               $schemas['RelatedArticles'] = 14376180;
+
+               return true;
+       }
+
+       /**
+        * ResourceLoaderGetConfigVars hook handler for setting a config 
variable
+        * @see 
https://www.mediawiki.org/wiki/Manual:Hooks/ResourceLoaderGetConfigVars
+        *
+        * @param array $vars
+        * @return boolean
+        */
+       public static function onResourceLoaderGetConfigVars( &$vars ) {
+               global $wgRelatedArticlesLoggingSamplingRate;
+               $vars['wgRelatedArticlesLoggingSamplingRate']= 
$wgRelatedArticlesLoggingSamplingRate;
+
+               return true;
+       }
 }
diff --git 
a/resources/ext.relatedArticles.readMore.minerva/SchemaRelatedArticles.js 
b/resources/ext.relatedArticles.readMore.minerva/SchemaRelatedArticles.js
new file mode 100644
index 0000000..5a23b13
--- /dev/null
+++ b/resources/ext.relatedArticles.readMore.minerva/SchemaRelatedArticles.js
@@ -0,0 +1,22 @@
+( function () {
+       // See https://meta.wikimedia.org/wiki/Schema:RelatedArticles
+       var skin = mw.config.get( 'skin' ),
+               schemaRelatedArticles = new mw.eventLog.Schema(
+                       'RelatedArticles',
+                       // not sampled if the config variable is not set
+                       mw.config.get( 'wgRelatedArticlesLoggingSamplingRate', 
0 ),
+                       {
+                               pageId: mw.config.get( 'wgArticleId' ),
+                               skin: ( skin === 'minerva' ) ? skin + '-' +  
mw.config.get( 'wgMFMode' ) : skin,
+                               // We cannot depend on the uniqueness of 
mw.user.generateRandomSessionId(),
+                               // thus append the timestamp. See mw.user 
documentation for more info.
+                               userSessionToken: 
mw.user.generateRandomSessionId() +
+                                       ( new Date() ).getTime().toString()
+                       }
+               );
+
+       mw.trackSubscribe( 'ext.relatedArticles.log', function ( _, data ) {
+               schemaRelatedArticles.log( data );
+       } );
+
+} )();
diff --git a/resources/ext.relatedArticles.readMore.minerva/index.js 
b/resources/ext.relatedArticles.readMore.minerva/index.js
index 7a6b3b3..860d65a 100644
--- a/resources/ext.relatedArticles.readMore.minerva/index.js
+++ b/resources/ext.relatedArticles.readMore.minerva/index.js
@@ -1,6 +1,8 @@
 ( function ( $ ) {
 
-       var MOBILE_WEB_WATCHING_FUNNEL = 'read-more';
+       var MOBILE_WEB_WATCHING_FUNNEL = 'read-more',
+               $window = $( window ),
+               $readMore;
 
        /**
         * Converts the set of pages generated in the init script into a set of
@@ -22,11 +24,43 @@
                } );
        }
 
+       /**
+        * Check if at least half of the element's height and half of its width 
are in viewport
+        *
+        * @method
+        * @param {jQuery.Object} $el - element that's being tested
+        * @return {boolean}
+        */
+       function isElementInViewport( $el ) {
+               var windowHeight = $window.height(),
+                       windowWidth = $window.width(),
+                       windowScrollLeft = $window.scrollLeft(),
+                       windowScrollTop = $window.scrollTop(),
+                       elHeight = $el.height(),
+                       elWidth = $el.width(),
+                       elOffset = $el.offset();
+
+               return (
+                       ( windowScrollTop + windowHeight >= elOffset.top + 
elHeight / 2 ) &&
+                       ( windowScrollLeft + windowWidth >= elOffset.left + 
elWidth / 2 ) &&
+                       ( windowScrollTop <= elOffset.top + elHeight / 2 )
+               );
+       }
+
+       /**
+        * Log when readmore is seen by the user
+        */
+       function logReadMoreSeen() {
+               if ( isElementInViewport( $readMore ) ) {
+                       $window.off( 'scroll.readmore' );
+                       mw.track( 'ext.relatedArticles.log', { eventName: 
'seen' } );
+               }
+       }
+
        mw.trackSubscribe( 'ext.relatedArticles.init', function ( _, data ) {
                var WatchstarPageList = mw.mobileFrontend.require( 
'mobile.pagelist.scripts/WatchstarPageList' ),
                        pageList,
-                       $container = $( '#content' ),
-                       $readMore;
+                       $container = $( '#content' );
 
                pageList = new WatchstarPageList( {
                        pages: convertPages( data.pages ),
@@ -49,6 +83,27 @@
                $readMore.append( pageList.$el );
 
                $container.append( $readMore );
+
+               // the read more code is loaded
+               mw.track( 'ext.relatedArticles.log', { eventName: 'loaded' } );
+
+               // log when readmore is seen by the user
+               $window.on(
+                       'scroll.readmore',
+                       $.debounce( 250, logReadMoreSeen )
+               );
+               logReadMoreSeen();
+
+               // track the clicked event
+               pageList.$el.find( 'a' ).on( 'click', function () {
+                       var index = $( this ).parents( 'li' ).index();
+
+                       mw.track( 'ext.relatedArticles.log', {
+                               eventName: 'clicked',
+                               clickIndex: index + 1
+                       } );
+               } );
+
        } );
 
 }( jQuery ) );

-- 
To view, visit https://gerrit.wikimedia.org/r/251001
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I649d0817cbd10ad734989da548d20ad33e7f7360
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/RelatedArticles
Gerrit-Branch: dev
Gerrit-Owner: Bmansurov <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to