jenkins-bot has submitted this change and it was merged.

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 'ready', '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/ReadMoreHooks.php
A resources/ext.relatedArticles.readMore.minerva/eventLogging.js
M resources/ext.relatedArticles.readMore.minerva/index.js
4 files changed, 177 insertions(+), 18 deletions(-)

Approvals:
  Phuedx: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/extension.json b/extension.json
index fd69291..f3f0a9d 100644
--- a/extension.json
+++ b/extension.json
@@ -45,6 +45,15 @@
                ],
                "BeforePageDisplay": [
                        "RelatedArticles\\ReadMoreHooks::onBeforePageDisplay"
+               ],
+               "EventLoggingRegisterSchemas": [
+                       
"RelatedArticles\\ReadMoreHooks::onEventLoggingRegisterSchemas"
+               ],
+               "ResourceLoaderGetConfigVars": [
+                       
"RelatedArticles\\ReadMoreHooks::onResourceLoaderGetConfigVars"
+               ],
+               "ResourceLoaderRegisterModules": [
+                       
"RelatedArticles\\ReadMoreHooks::onResourceLoaderRegisterModules"
                ]
        },
        "MessagesDirs": {
@@ -78,28 +87,15 @@
                                "mobile",
                                "desktop"
                        ]
-               },
-               "ext.relatedArticles.readMore.minerva": {
-                       "scripts": [
-                               
"resources/ext.relatedArticles.readMore.minerva/index.js"
-                       ],
-                       "styles": [
-                               
"resources/ext.relatedArticles.readMore.minerva/readMore.less"
-                       ],
-                       "messages": [
-                               "relatedarticles-read-more-heading"
-                       ],
-                       "targets": [
-                               "mobile"
-                       ]
                }
        },
        "config": {
                "RelatedArticlesShowReadMore": false,
-               "RelatedArticlesUseCirrusSearch": false
+               "RelatedArticlesUseCirrusSearch": false,
+               "RelatedArticlesLoggingSamplingRate": 0.01
        },
        "ConfigRegistry": {
-               "relatedarticles": "GlobalVarConfig::newInstance"
+               "RelatedArticles": "GlobalVarConfig::newInstance"
        },
        "ResourceFileModulePaths": {
                "localBasePath": "",
diff --git a/includes/ReadMoreHooks.php b/includes/ReadMoreHooks.php
index b9703f0..ec76bd8 100644
--- a/includes/ReadMoreHooks.php
+++ b/includes/ReadMoreHooks.php
@@ -3,6 +3,7 @@
 namespace RelatedArticles;
 
 use OutputPage;
+use ResourceLoader;
 use Skin;
 use ConfigFactory;
 
@@ -44,7 +45,7 @@
         * @return boolean Always <code>true</code>
         */
        public static function onMakeGlobalVariablesScript( &$vars, OutputPage 
$out ) {
-               $config = ConfigFactory::getDefaultInstance()->makeConfig( 
'relatedarticles' );
+               $config = ConfigFactory::getDefaultInstance()->makeConfig( 
'RelatedArticles' );
 
                $vars['wgRelatedArticles'] = $out->getProperty( 
'RelatedArticles' );
                $vars['wgRelatedArticlesUseCirrusSearch'] = $config->get( 
'RelatedArticlesUseCirrusSearch' );
@@ -73,7 +74,7 @@
         * @return boolean Always <code>true</code>
         */
        public static function onBeforePageDisplay( OutputPage $out, Skin $skin 
) {
-               $config = ConfigFactory::getDefaultInstance()->makeConfig( 
'relatedarticles' );
+               $config = ConfigFactory::getDefaultInstance()->makeConfig( 
'RelatedArticles' );
                $showReadMore = $config->get( 'RelatedArticlesShowReadMore' );
 
                $title = $out->getContext()->getTitle();
@@ -90,4 +91,83 @@
 
                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'] = 14496900;
+
+               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 ) {
+               $config = ConfigFactory::getDefaultInstance()->makeConfig( 
'RelatedArticles' );
+               $vars['wgRelatedArticlesLoggingSamplingRate'] =
+                       $config->get( 'RelatedArticlesLoggingSamplingRate' );
+
+               return true;
+       }
+
+       /**
+        * Register the "ext.relatedArticles.readMore.minerva" module.
+        * Optionally update the dependencies and scripts if EventLogging is 
installed.
+        *
+        * @see 
https://www.mediawiki.org/wiki/Manual:Hooks/ResourceLoaderRegisterModules
+        *
+        * @param ResourceLoader &$resourceLoader The ResourceLoader object
+        * @return boolean
+        */
+       public static function onResourceLoaderRegisterModules( ResourceLoader 
&$resourceLoader ) {
+               $dependencies = array(
+                       "mediawiki.user"
+               );
+               $scripts = array(
+                       
"resources/ext.relatedArticles.readMore.minerva/index.js"
+               );
+
+               if ( class_exists( 'EventLogging' ) ) {
+                       $dependencies[] = "ext.eventLogging.Schema";
+                       $scripts[] = 
"resources/ext.relatedArticles.readMore.minerva/eventLogging.js";
+               }
+
+               $resourceLoader->register(
+                       "ext.relatedArticles.readMore.minerva",
+                       array(
+                               "dependencies" => $dependencies,
+                               "scripts" => $scripts,
+                               "styles" => array(
+                                       
"resources/ext.relatedArticles.readMore.minerva/readMore.less"
+                               ),
+                               "messages" => array(
+                                       "relatedarticles-read-more-heading"
+                               ),
+                               "targets" => array(
+                                       "mobile"
+                               ),
+                               "localBasePath" => __DIR__ . "/..",
+                               "remoteExtPath" => "RelatedArticles"
+                       )
+               );
+
+               return true;
+       }
 }
diff --git a/resources/ext.relatedArticles.readMore.minerva/eventLogging.js 
b/resources/ext.relatedArticles.readMore.minerva/eventLogging.js
new file mode 100644
index 0000000..8dc048e
--- /dev/null
+++ b/resources/ext.relatedArticles.readMore.minerva/eventLogging.js
@@ -0,0 +1,80 @@
+// See https://meta.wikimedia.org/wiki/Schema:RelatedArticles
+( function ( $ ) {
+       var $readMore,
+               schemaRelatedArticles,
+               skin = mw.config.get( 'skin' ),
+               $window = $( window );
+
+       /**
+        * 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', logReadMoreSeen );
+                       schemaRelatedArticles.log( { eventName: 'seen' } );
+               }
+       }
+
+       mw.trackSubscribe( 'ext.relatedArticles.logReady', function ( _, data ) 
{
+               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()
+                       }
+               );
+
+               $readMore = data.$readMore;
+
+               // log ready
+               schemaRelatedArticles.log( { eventName: 'ready' } );
+
+               // log when ReadMore is seen by the user
+               $window.on(
+                       'scroll',
+                       $.debounce( 250, logReadMoreSeen )
+               );
+               logReadMoreSeen();
+
+               // track the clicked event
+               // TODO: This should be moved into the PageList component or, 
preferably, the CardList/Card views.
+               $readMore.on( 'click', 'a', function () {
+                       var index = $( this ).parents( 'li' ).index();
+
+                       schemaRelatedArticles.log( {
+                               eventName: 'clicked',
+                               clickIndex: index + 1
+                       } );
+               } );
+       } );
+
+} )( jQuery );
diff --git a/resources/ext.relatedArticles.readMore.minerva/index.js 
b/resources/ext.relatedArticles.readMore.minerva/index.js
index 807a182..08e73fa 100644
--- a/resources/ext.relatedArticles.readMore.minerva/index.js
+++ b/resources/ext.relatedArticles.readMore.minerva/index.js
@@ -44,6 +44,9 @@
                $readMore.append( pageList.$el );
 
                $container.append( $readMore );
+
+               // the ReadMore code is ready
+               mw.track( 'ext.relatedArticles.logReady', { $readMore: 
$readMore } );
        } );
 
 }( jQuery ) );

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

Gerrit-MessageType: merged
Gerrit-Change-Id: I649d0817cbd10ad734989da548d20ad33e7f7360
Gerrit-PatchSet: 9
Gerrit-Project: mediawiki/extensions/RelatedArticles
Gerrit-Branch: dev
Gerrit-Owner: Bmansurov <[email protected]>
Gerrit-Reviewer: Bmansurov <[email protected]>
Gerrit-Reviewer: Jdlrobson <[email protected]>
Gerrit-Reviewer: Phuedx <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

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

Reply via email to