mediawiki-extensions-Echo/modules/logger/mw.echo.Logger.js
Moriel Schottlender 1ac72cc01a Split alerts and messages in Echo
Split the notifications into 'alert' and 'message' badget with two
different flyouts. Also clean up styling and module behavior.

** Depends on ooui change Id4bbe14ba0bf6c for footers in popups.
** Depends on ooui change Ie93e4d6ed5637c for fixing a bug in
   inverted icons.

** MobileFrontend must also be updated to support the new modules
   in this patch  I168f485d6e54cb4067

In this change:
* Split notifcations into alert and messages and display those in
  two different badges.
* Create two separate flyout/popups for each category with their
  notifications.
* Create a view-model to control notification state and emit events
  for both the popup and the badge to intercept and react to.
* Clean up module load and distribution:
  * Create an ext.echo.ui module for javascript-ui support and ooui
    widgets.
  * Create an ext.echo.nojs module that unifies all base classes that
    are needed for both nojs and js support, that the js version
    builds upon.
  * Create a separate ext.echo.logger module as a singleton that can
    be called to perform all logging.
* Clean up style uses
  * Move the special page LESS file into nojs module so all styles
    load properly even in nojs mode.
  * Transfer some of the styling from JS to LESS for consistency.
  * Make the 'read more' button load already with the styles it
    needs to look like a button, since its behavior is similar in
    nojs and js vesions, but before its classes were applied only
    by the js, making it inconsistent and also making its appearance
    'jump' from a link to a button.
* Delete and clean up all old and unused files.
* Moved 'Help.png' icon from modules/overlay to modules/icons for
  later use.

Bug: T108190
Change-Id: I55f440ed9f64c46817f620328a6bb522d44c9ca9
2015-09-02 15:36:37 -07:00

128 lines
3.2 KiB
JavaScript

( function ( mw ) {
mw.echo = mw.echo || {};
/**
* Echo logger
*
* @class
*
* @constructor
* @param {Object} [config] Configuration object
* @cfg {boolean} [clickThroughEnabled] Whether logging is enabled
*/
mw.echo.Logger = function MwEchoUiLogger( config ) {
config = config || {};
this.clickThroughEnabled = config.clickThroughEnabled || this.constructor.static.clickThroughEnabled;
this.notificationsIdCache = [];
};
OO.initClass( mw.echo.Logger );
/* Static methods */
/**
* Default behavior in MediaWiki for whether logging Echo interactions
* is enabled
*
* @static
* @property {[type]}
*/
mw.echo.Logger.static.clickThroughEnabled = OO.getProp(
mw.config.get( 'wgEchoConfig' ),
'eventlogging',
'EchoInteraction',
'enabled'
);
/**
* Context definitions.
*
* 'flyout': Interactions from the popup content
* 'archive': Interactions from the Special:Notifications page
* 'badge': Interactions from the badge button
*
* @static
* @property {Object}
*/
mw.echo.Logger.static.context = {
popup: 'flyout',
archive: 'archive',
badge: undefined
};
/**
* Logging action names for consistency.
*
* 'notificationClick': Click interaction
* 'notificationImpression': Impression interaction
*
* @static
* @property {Object}
*/
mw.echo.Logger.static.actions = {
notificationClick: 'notification-link-click',
notificationImpression: 'notification-impression'
};
/* Methods */
/**
* Log all Echo interaction related events
*
* @param {string} action The interaction
* @param {string} [context] 'flyout'/'archive' or undefined for the badge
* @param {int} [eventId] Notification event id
* @param {string} [eventType] notification type
* @param {boolean} [mobile] True if interaction was on a mobile device
*/
mw.echo.Logger.prototype.logInteraction = function ( action, context, eventId, eventType, mobile ) {
if ( !this.constructor.clickThroughEnabled ) {
return;
}
var myEvt = {
action: action
};
// All the fields below are optional
if ( context ) {
myEvt.context = context;
}
if ( eventId ) {
myEvt.eventId = Number( eventId );
}
if ( eventType ) {
myEvt.notificationType = eventType;
}
if ( mobile ) {
myEvt.mobile = mobile;
}
mw.eventLog.logEvent( 'EchoInteraction', myEvt );
};
/**
* Log the impression of notifications. This will log each notification exactly once.
*
* @param {string} type Notification type; 'alert' or 'message'
* @param {number[]} notificationIds Array of notification ids
* @param {string} context 'flyout'/'archive' or undefined for the badge
* @param {boolean} [mobile] True if interaction was on a mobile device
*/
mw.echo.Logger.prototype.logNotificationImpressions = function ( type, notificationIds, context, mobile ) {
var i, len;
for ( i = 0, len = notificationIds.length; i < len; i++ ) {
if ( !this.notificationsIdCache[ notificationIds[i] ] ) {
// Log notification impression
this.logInteraction( 'notification-impression', context, notificationIds[i], type, mobile );
// Cache
this.notificationsIdCache[ notificationIds[i] ] = true;
}
}
};
mw.echo.logger = new mw.echo.Logger();
} )( mediaWiki );