Bmansurov has uploaded a new change for review.

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

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.
  The default rate is 1%.
* Events are tracked using a unique user session token.

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, 164 insertions(+), 3 deletions(-)


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

diff --git a/extension.json b/extension.json
index 334c23e..34f98df 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": [
+                               "mobile.startup"
+                       ],
                        "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..6adc4cc 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 registering enabled 
surveys
+        * @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..1464e32
--- /dev/null
+++ b/resources/ext.relatedArticles.readMore.minerva/SchemaRelatedArticles.js
@@ -0,0 +1,54 @@
+( function ( M, $ ) {
+       var Schema = M.require( 'mobile.startup/Schema' ),
+               SchemaRelatedArticles,
+               schemaRelatedArticles;
+
+       /**
+        * @class SchemaRelatedArticles
+        * @extends Schema
+        */
+       SchemaRelatedArticles = Schema.extend( {
+               /** @inheritdoc **/
+               name: 'RelatedArticles',
+               /**
+                * https://meta.wikimedia.org/wiki/Schema:RelatedArticles
+                * @inheritdoc
+                * @cfg {Object} defaults The options hash.
+                */
+               defaults: $.extend( {}, Schema.prototype.defaults, {
+                       pageId: mw.config.get( 'wgArticleId' ),
+                       skin: mw.config.get( 'skin' ),
+                       userSessionToken: mw.user.generateRandomSessionId() + ( 
new Date() ).getTime().toString()
+               } ),
+               /**
+                * @inheritdoc
+                */
+               isSampled: true,
+               /**
+                * @inheritdoc
+                * Defaults to 0.01
+                */
+               samplingRate: mw.config.get( 
'wgRelatedArticlesLoggingSamplingRate', 0.01 ),
+               /**
+                * @inheritdoc
+                */
+               initialize: function () {
+                       Schema.prototype.initialize.call( this, arguments );
+                       // See the schema definition at 
https://meta.wikimedia.org/wiki/Schema:RelatedArticles
+                       if ( this.defaults.skin === 'minerva' ) {
+                               this.defaults.skin += '-' + mw.config.get( 
'wgMFMode' );
+                       }
+               }
+       } );
+
+       schemaRelatedArticles = new SchemaRelatedArticles();
+
+       mw.trackSubscribe( 'ext.relatedArticles.log', function ( _, data ) {
+               if ( data.eventName === 'clicked' ) {
+                       schemaRelatedArticles.logBeacon( data );
+               } else {
+                       schemaRelatedArticles.log( data );
+               }
+       } );
+
+} )( mw.mobileFrontend, jQuery );
diff --git a/resources/ext.relatedArticles.readMore.minerva/index.js 
b/resources/ext.relatedArticles.readMore.minerva/index.js
index 888c5ab..c603e27 100644
--- a/resources/ext.relatedArticles.readMore.minerva/index.js
+++ b/resources/ext.relatedArticles.readMore.minerva/index.js
@@ -1,6 +1,9 @@
 ( function ( $ ) {
 
-       var MOBILE_WEB_WATCHING_FUNNEL = 'read-more';
+       var MOBILE_WEB_WATCHING_FUNNEL = 'read-more',
+               $window = $( window ),
+               timer = null,
+               $readMore;
 
        /**
         * Converts the set of pages generated in the init script into a set of
@@ -22,11 +25,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 ),
@@ -47,6 +82,31 @@
                $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
+                       function () {
+                               clearTimeout( timer );
+                               timer = setTimeout( logReadMoreSeen, 250 );
+                       }
+               );
+               logReadMoreSeen();
+
+               // track the clicked event
+               pageList.$el.find( 'a' ).each( function ( i ) {
+                       $( this ).on( 'click', function () {
+                               mw.track( 'ext.relatedArticles.log', {
+                                       eventName: 'clicked',
+                                       clickIndex: i + 1
+                               } );
+                       } );
+               } );
+
        } );
 
 }( jQuery ) );

-- 
To view, visit https://gerrit.wikimedia.org/r/249798
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: master
Gerrit-Owner: Bmansurov <[email protected]>

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

Reply via email to