ESLint: Prefer arrow callbacks (autofixed)

Change-Id: I01da3714b1f5d9b1926ee4394c15f594efb01245
This commit is contained in:
Ed Sanders 2024-06-03 13:26:18 +01:00
parent 573e7c74ee
commit 2dd3780966
40 changed files with 161 additions and 194 deletions

View file

@ -9,6 +9,9 @@
"commonjs": true
},
"rules": {
"max-len": "off"
"max-len": "off",
"prefer-arrow-callback": "error",
"implicit-arrow-linebreak": "error",
"arrow-body-style": "error"
}
}

View file

@ -158,7 +158,7 @@
}
return fetchNotifPromise
.fail( function () {
.fail( () => {
// Mark API error state
me.apiErrorState[ type ][ fetchingSource ] = true;
} );

View file

@ -61,9 +61,7 @@
*/
mw.echo.api.EchoApi.prototype.fetchUnreadNotificationPages = function ( sources ) {
return this.network.getApiHandler( 'local' ).fetchUnreadNotificationPages( sources )
.then( function ( data ) {
return OO.getProp( data, 'query', 'unreadnotificationpages' );
} );
.then( ( data ) => OO.getProp( data, 'query', 'unreadnotificationpages' ) );
};
/**
@ -162,9 +160,7 @@
!!isForced,
this.convertFiltersToAPIParams( filters )
) )
.then( function ( result ) {
return OO.getProp( result.query, 'notifications' );
} );
.then( ( result ) => OO.getProp( result.query, 'notifications' ) );
};
/**
@ -191,9 +187,7 @@
isForced,
this.convertFiltersToAPIParams( filters )
) )
.then( function ( result ) {
return OO.getProp( result.query, 'notifications' );
} );
.then( ( result ) => OO.getProp( result.query, 'notifications' ) );
};
/**
@ -208,7 +202,7 @@
mw.echo.api.EchoApi.prototype.fetchNotificationGroups = function ( sourceArray, type, bundle ) {
const overrideParams = { notcrosswikisummary: false, notbundle: bundle };
return this.network.getApiHandler( 'local' ).fetchNotifications( type, sourceArray, true, overrideParams )
.then( function ( result ) {
.then( ( result ) => {
const items = OO.getProp( result, 'query', 'notifications', 'list' ),
groups = {};

View file

@ -46,9 +46,7 @@
type: type.length === 1 ? type[ 0 ] : 'all',
timestampFormat: 'ISO_8601'
} )
.then( function ( data ) {
return data.query.echomarkseen.timestamp;
} );
.then( ( data ) => data.query.echomarkseen.timestamp );
};
/**
@ -72,9 +70,7 @@
}
return this.api.postWithToken( 'csrf', data )
.then( function ( result ) {
return OO.getProp( result.query, 'echomarkread', type, 'rawcount' ) || 0;
} );
.then( ( result ) => OO.getProp( result.query, 'echomarkread', type, 'rawcount' ) || 0 );
};
/**
@ -124,7 +120,7 @@
}
return this.api.get( apiData )
.then( function ( result ) {
.then( ( result ) => {
if ( type === 'message' || type === 'alert' ) {
return OO.getProp( result.query, 'notifications', normalizedType, 'rawcount' ) || 0;
} else {

View file

@ -85,7 +85,7 @@
sourcePageModel = filterModel.getSourcePagesModel();
return this.api.fetchUnreadNotificationPages()
.then( function ( data ) {
.then( ( data ) => {
const result = {},
foreignSources = {};
@ -132,7 +132,7 @@
titles: filters.getSourcePagesModel().getGroupedPagesForCurrentTitle()
}
)
.then( function ( data ) {
.then( ( data ) => {
const dateItemIds = {},
dateItems = {},
models = {};
@ -223,12 +223,10 @@
} )
.then(
null,
function ( errCode, errObj ) {
return {
errCode: errCode,
errInfo: OO.getProp( errObj, 'error', 'info' )
};
}
( errCode, errObj ) => ( {
errCode: errCode,
errInfo: OO.getProp( errObj, 'error', 'info' )
} )
);
};
/**
@ -259,7 +257,7 @@
return this.api.fetchNotifications( this.manager.getTypeString(), 'local', !!isForced, { unreadFirst: true, bundle: true } /* filters */ )
.then(
// Success
function ( data ) {
( data ) => {
const allModels = { local: localListModel },
createBundledNotification = function ( modelName, rawBundledNotifData ) {
const bundleNotifData = controller.createNotificationData( rawBundledNotifData );
@ -346,7 +344,7 @@
return idArray;
},
// Failure
function ( errCode, errObj ) {
( errCode, errObj ) => {
if ( !controller.manager.getNotificationModel( 'local' ) ) {
// Update the controller
controller.manager.setNotificationModels( { local: localListModel } );
@ -457,7 +455,7 @@
source = source || this.manager.getFiltersModel().getSourcePagesModel().getCurrentSource();
this.manager.getNotificationsBySource( source ).forEach( function ( notification ) {
this.manager.getNotificationsBySource( source ).forEach( ( notification ) => {
if ( !notification.isRead() ) {
itemIds.push( ...notification.getAllIds() );
notification.toggleRead( true );
@ -494,7 +492,7 @@
const readState = this.manager.getFiltersModel().getReadState(),
modelItems = {};
this.manager.getLocalNotifications().forEach( function ( notification ) {
this.manager.getLocalNotifications().forEach( ( notification ) => {
if ( !notification.isRead() ) {
notification.toggleRead( true );
@ -538,7 +536,7 @@
return this.api.fetchNotificationGroups( xwikiModel.getSourceNames(), this.manager.getTypeString(), true )
.then(
function ( groupList ) {
( groupList ) => {
for ( const group in groupList ) {
const listModel = xwikiModel.getItemBySource( group );
const groupItems = groupList[ group ];
@ -559,14 +557,12 @@
listModel.setItems( items );
}
},
function ( errCode, errObj ) {
return {
errCode: errCode,
errInfo: errCode === 'http' ?
mw.msg( 'echo-api-failure-cross-wiki' ) :
OO.getProp( errObj, 'error', 'info' )
};
}
( errCode, errObj ) => ( {
errCode: errCode,
errInfo: errCode === 'http' ?
mw.msg( 'echo-api-failure-cross-wiki' ) :
OO.getProp( errObj, 'error', 'info' )
} )
);
};
@ -608,7 +604,7 @@
// to reflect the new pagination? etc.
}
items.forEach( function ( notification ) {
items.forEach( ( notification ) => {
allIds.push( ...notification.getAllIds() );
if ( readState === 'all' ) {
notification.toggleRead( isRead );
@ -652,7 +648,7 @@
// Update pagination count
this.manager.updateCurrentPageItemCount();
notifs.forEach( function ( notif ) {
notifs.forEach( ( notif ) => {
allIds.push( ...notif.getAllIds() );
} );
this.manager.getUnreadCounter().estimateChange( -allIds.length );
@ -677,7 +673,7 @@
this.manager.getUnreadCounter().estimateChange( -xwikiModel.getCount() );
return this.api.fetchNotificationGroups( xwikiModel.getSourceNames(), this.manager.getTypeString() )
.then( function ( groupList ) {
.then( ( groupList ) => {
const promises = [];
for ( const group in groupList ) {
@ -736,7 +732,7 @@
// will be updated globally
this.manager.getFiltersModel().getSourcePagesModel().getCurrentSource()
)
.then( function ( time ) {
.then( ( time ) => {
controller.manager.getSeenTimeModel().setSeenTime( time );
} );
};

View file

@ -1,7 +1,7 @@
/*
* Loads Echo on CentralAuth autologin
*/
mw.hook( 'centralauth-p-personal-reset' ).add( function () {
mw.hook( 'centralauth-p-personal-reset' ).add( () => {
mw.loader.using( [
'ext.echo.init',
'ext.echo.styles.badge',

View file

@ -23,7 +23,7 @@ function initDesktop() {
}
// Activate OOUI
$( function () {
$( () => {
const maxNotificationCount = require( './config.json' ).EchoMaxNotificationCount,
pollingRate = require( './config.json' ).EchoPollForUpdates,
documentTitle = document.title,
@ -73,7 +73,7 @@ function initDesktop() {
*/
function showNotificationSnippet( modelManager, highestNotifTime ) {
let highestTime = highestNotifTime;
modelManager.getLocalNotifications().forEach( function ( notificationItem ) {
modelManager.getLocalNotifications().forEach( ( notificationItem ) => {
const timestampAsDate = new Date( notificationItem.timestamp );
if ( timestampAsDate > highestNotifTime ) {
if ( timestampAsDate > highestTime ) {
@ -95,7 +95,7 @@ function initDesktop() {
* @param {mw.echo.ui.NotificationBadgeWidget} badgeWidget
*/
function updateBadgeState( modelManager, badgeWidget ) {
modelManager.getLocalNotifications().forEach( function ( notificationItem ) {
modelManager.getLocalNotifications().forEach( ( notificationItem ) => {
if ( !notificationItem.isSeen() ) {
badgeWidget.updateBadgeSeenState( true );
}
@ -129,7 +129,7 @@ function initDesktop() {
// This part executes only once, either when header icons are clicked or after completion of 60secs whichever occur first.
const echoApi = new mw.echo.api.EchoApi();
loadingPromise = mw.loader.using( 'ext.echo.ui.desktop' ).then( function () {
loadingPromise = mw.loader.using( 'ext.echo.ui.desktop' ).then( () => {
// Overlay
mw.echo.ui.$overlay.appendTo( document.body );
@ -155,15 +155,15 @@ function initDesktop() {
// Replace the link button with the ooui button
$existingAlertLink.parent().replaceWith( mw.echo.ui.alertWidget.$element );
alertModelManager.on( 'allTalkRead', function () {
alertModelManager.on( 'allTalkRead', () => {
// If there was a talk page notification, get rid of it
$( '#pt-talk-alert' ).remove();
} );
// listen to event countChange and change title only if polling rate is non-zero
if ( isLivePollingFeatureEnabledOnWiki() ) {
alertModelManager.getUnreadCounter().on( 'countChange', function ( count ) {
alertController.fetchLocalNotifications().then( function () {
alertModelManager.getUnreadCounter().on( 'countChange', ( count ) => {
alertController.fetchLocalNotifications().then( () => {
updateBadgeState( alertModelManager, mw.echo.ui.alertWidget );
if ( userHasOptedInToLiveNotifications() ) {
latestAlertNotifTime = showNotificationSnippet( alertModelManager, latestAlertNotifTime );
@ -199,8 +199,8 @@ function initDesktop() {
// listen to event countChange and change title only if polling rate is non-zero
if ( isLivePollingFeatureEnabledOnWiki() ) {
messageModelManager.getUnreadCounter().on( 'countChange', function ( count ) {
messageController.fetchLocalNotifications().then( function () {
messageModelManager.getUnreadCounter().on( 'countChange', ( count ) => {
messageController.fetchLocalNotifications().then( () => {
updateBadgeState( messageModelManager, mw.echo.ui.messageWidget );
if ( userHasOptedInToLiveNotifications() ) {
latestMessageNotifTime = showNotificationSnippet( messageModelManager, latestMessageNotifTime );
@ -234,15 +234,15 @@ function initDesktop() {
// Fire the notification API requests
const echoApi = new mw.echo.api.EchoApi();
echoApi.fetchNotifications( clickedSection )
.then( function ( data ) {
.then( ( data ) => {
mw.track( 'timing.MediaWiki.echo.overlay.api', mw.now() - timeOfClick );
return data;
} );
loadEcho().then( function () {
loadEcho().then( () => {
// Now that the module loaded, show the popup
const selectedWidget = clickedSection === 'alert' ? mw.echo.ui.alertWidget : mw.echo.ui.messageWidget;
selectedWidget.once( 'finishLoading', function () {
selectedWidget.once( 'finishLoading', () => {
// Log timing after notifications are shown
mw.track( 'timing.MediaWiki.echo.overlay', mw.now() - timeOfClick );
} );
@ -255,7 +255,7 @@ function initDesktop() {
// The other part is the 'echo.unseen' counter, see EchoHooks::onSkinTemplateNavigationUniversal().
mw.track( 'counter.MediaWiki.echo.unseen.click' );
}
}, function () {
}, () => {
// Un-dim badge if loading failed
$badge.removeClass( 'mw-echo-notifications-badge-dimmed' );
} );
@ -288,13 +288,13 @@ function initDesktop() {
*/
function initMobile() {
if ( !mw.user.isAnon() ) {
mw.loader.using( [ 'ext.echo.mobile', 'mobile.startup' ] ).then( function ( require ) {
mw.loader.using( [ 'ext.echo.mobile', 'mobile.startup' ] ).then( ( require ) => {
require( 'ext.echo.mobile' ).init();
} );
}
}
$( function () {
$( () => {
if ( mw.config.get( 'wgMFMode' ) ) {
initMobile();
} else {

View file

@ -53,27 +53,27 @@ function notificationsList( echo, markAllReadButton, onCountChange ) {
} );
// Events
unreadCounter.on( 'countChange', function ( count ) {
unreadCounter.on( 'countChange', ( count ) => {
onCountChange(
controller.manager.getUnreadCounter().getCappedNotificationCount( count )
);
markAsReadHandler();
} );
markAllReadButton.on( 'click', function () {
markAllReadButton.on( 'click', () => {
const numNotifications = controller.manager.getLocalUnread().length;
controller.markLocalNotificationsRead()
.then( function () {
.then( () => {
mw.notify( mw.msg( 'echo-mark-all-as-read-confirmation', numNotifications ) );
markAllReadButton.toggle( false );
}, function () {
}, () => {
markAllReadButton.toggle( false );
} );
} );
return promisedView(
// Populate notifications
wrapperWidget.populate().then( function () {
wrapperWidget.populate().then( () => {
controller.updateSeenTime();
markAsReadHandler();
// Connect event here as we know that everything loaded correctly

View file

@ -29,7 +29,7 @@ function init() {
function showNotificationOverlay() {
const overlay = notificationsOverlay(
function ( exit ) {
( exit ) => {
onCloseNotificationsOverlay();
exit();
} );
@ -41,7 +41,7 @@ function init() {
let initialized = false;
// Once the DOM is loaded add the overlay and overlay manager. Minerva will handle the
// notification button that will link to Special:Notifications.
$( function () {
$( () => {
overlayManager.add( /^\/notifications$/, showNotificationOverlay );
/**
@ -73,7 +73,7 @@ function init() {
// The code is bundled here since it makes use of loadModuleScript. This also allows
// the possibility of invoking the filter from outside the Special page in future.
// Once the 'ext.echo.special.onInitialize' hook has fired, load notification filter.
mw.hook( 'ext.echo.special.onInitialize' ).add( function () {
mw.hook( 'ext.echo.special.onInitialize' ).add( () => {
// eslint-disable-next-line no-jquery/no-global-selector
const $crossWikiUnreadFilter = $( '.mw-echo-ui-crossWikiUnreadFilterWidget' ),
// eslint-disable-next-line no-jquery/no-global-selector
@ -90,7 +90,7 @@ function init() {
addFilterButton();
// setup route
overlayManager.add( /^\/notifications-filter$/, function () {
overlayManager.add( /^\/notifications-filter$/, () => {
onOpenNotificationsOverlay();
return notificationsFilterOverlay( {
onBeforeExit: function ( exit ) {

View file

@ -45,7 +45,7 @@ function onCountChange( count ) {
*/
function notificationsOverlay( onBeforeExit ) {
let markAllReadButton;
const oouiPromise = mw.loader.using( 'oojs-ui' ).then( function () {
const oouiPromise = mw.loader.using( 'oojs-ui' ).then( () => {
markAllReadButton = new OO.ui.ButtonWidget( {
icon: 'checkAll'
} );
@ -71,15 +71,13 @@ function notificationsOverlay( onBeforeExit ) {
isBorderBox: false,
className: 'overlay notifications-overlay navigation-drawer',
onBeforeExit: function ( exit ) {
onBeforeExit( function () {
onBeforeExit( () => {
onBeforeExitAnimation( overlay, exit );
} );
}
},
promisedView(
oouiPromise.then( function () {
return list( mw.echo, markAllReadButton, onCountChange );
} )
oouiPromise.then( () => list( mw.echo, markAllReadButton, onCountChange ) )
)
);
return overlay;

View file

@ -15,7 +15,7 @@
// Parent constructor
mw.echo.dm.BundleNotificationItem.super.call( this, id, config );
this.getSecondaryUrls().forEach( function ( link ) {
this.getSecondaryUrls().forEach( ( link ) => {
// hack: put all secondary actions in the menu for now
// this is a temporary fix for
// - alignment of the labels
@ -27,7 +27,7 @@
this.count = bundledNotificationModels.length;
// bundled notifications use the compact header and do not have icons
bundledNotificationModels.forEach( function ( bundled ) {
bundledNotificationModels.forEach( ( bundled ) => {
bundled.content.header = bundled.content.compactHeader;
delete bundled.iconURL;
} );
@ -59,9 +59,7 @@
* @return {boolean} Whether this bundle is completely read
*/
mw.echo.dm.BundleNotificationItem.prototype.isRead = function () {
return this.list.getItems().every( function ( item ) {
return item.isRead();
} );
return this.list.getItems().every( ( item ) => item.isRead() );
};
/**
@ -102,7 +100,7 @@
* @param {number} timestamp New seen timestamp
*/
mw.echo.dm.BundleNotificationItem.prototype.updateSeenState = function ( timestamp ) {
this.list.getItems().forEach( function ( notification ) {
this.list.getItems().forEach( ( notification ) => {
notification.toggleSeen(
notification.isRead() || notification.getTimestamp() < timestamp
);
@ -126,9 +124,7 @@
* @return {number[]}
*/
mw.echo.dm.BundleNotificationItem.prototype.getAllIds = function () {
return this.list.getItems().map( function ( item ) {
return item.getId();
} );
return this.list.getItems().map( ( item ) => item.getId() );
};
/**

View file

@ -122,8 +122,8 @@
* @param {number} timestamp New seen timestamp
*/
mw.echo.dm.CrossWikiNotificationItem.prototype.updateSeenState = function ( timestamp ) {
this.getList().getItems().forEach( function ( source ) {
source.getItems().forEach( function ( notification ) {
this.getList().getItems().forEach( ( source ) => {
source.getItems().forEach( ( notification ) => {
notification.toggleSeen(
notification.isRead() || notification.getTimestamp() < timestamp
);
@ -138,7 +138,7 @@
*/
mw.echo.dm.CrossWikiNotificationItem.prototype.getItems = function () {
let notifications = [];
this.list.getItems().forEach( function ( sourceList ) {
this.list.getItems().forEach( ( sourceList ) => {
notifications = notifications.concat( sourceList.getItems() );
} );

View file

@ -433,7 +433,7 @@
source = source || 'local';
const notifications = [];
Object.keys( this.getAllNotificationModels() ).forEach( function ( modelName ) {
Object.keys( this.getAllNotificationModels() ).forEach( ( modelName ) => {
const model = manager.getNotificationModel( modelName );
if ( model.getSource() === source ) {
notifications.push( ...model.getItems() );
@ -454,7 +454,7 @@
source = source || 'local';
Object.keys( this.getAllNotificationModels() ).forEach( function ( modelName ) {
Object.keys( this.getAllNotificationModels() ).forEach( ( modelName ) => {
const model = manager.getNotificationModel( modelName );
if ( model.getSource() === source ) {
modelIds.push( modelName );

View file

@ -21,7 +21,7 @@
mw.echo.dm.NotificationGroupsList.super.call( this );
// Sorting callback
this.setSortingCallback( function ( a, b ) {
this.setSortingCallback( ( a, b ) => {
// Reverse sorting
if ( b.getTimestamp() < a.getTimestamp() ) {
return -1;

View file

@ -35,7 +35,7 @@
this.fallbackTimestamp = config.timestamp || 0;
// Sorting callback
this.setSortingCallback( config.sortingCallback || function ( a, b ) {
this.setSortingCallback( config.sortingCallback || ( ( a, b ) => {
if ( !a.isRead() && b.isRead() ) {
return -1; // Unread items are always above read items
} else if ( a.isRead() && !b.isRead() ) {
@ -55,7 +55,7 @@
// Fallback on IDs
return b.getId() - a.getId();
} );
} ) );
// Events
this.aggregate( { update: 'itemUpdate' } );
@ -215,9 +215,7 @@
* @return {mw.echo.dm.NotificationItem[]} An array of matching items
*/
mw.echo.dm.NotificationsList.prototype.findByIds = function ( ids ) {
return this.getItems().filter( function ( item ) {
return ids.indexOf( item.getId() ) !== -1;
} );
return this.getItems().filter( ( item ) => ids.indexOf( item.getId() ) !== -1 );
};
/**
@ -249,7 +247,7 @@
* @param {string} timestamp New seen timestamp
*/
mw.echo.dm.NotificationsList.prototype.updateSeenState = function ( timestamp ) {
this.getItems().forEach( function ( notification ) {
this.getItems().forEach( ( notification ) => {
notification.toggleSeen(
notification.isRead() || notification.getTimestamp() < timestamp
);

View file

@ -56,7 +56,7 @@
const model = this;
let hasChanged = false;
this.getTypes().forEach( function ( type ) {
this.getTypes().forEach( ( type ) => {
if ( model.seenTime[ type ] !== time ) {
model.seenTime[ type ] = time;
hasChanged = true;

View file

@ -129,7 +129,7 @@
this.source,
this.type,
this.localOnly
) ).then( function ( actualCount ) {
) ).then( ( actualCount ) => {
model.setCount( actualCount, false );
return actualCount;

View file

@ -4,7 +4,7 @@
/*!
* Echo Special:Notifications page initialization
*/
$( function () {
$( () => {
const limitNotifications = 50,
links = mw.config.get( 'wgNotificationsSpecialPageLinks' ),
// FIXME: Use CSS transition

View file

@ -23,7 +23,7 @@
this.listWidget = new mw.echo.ui.SortedListWidget(
// Sorting callback
function ( a, b ) {
( ( a, b ) => {
// Reverse sorting
if ( b.getTimestamp() < a.getTimestamp() ) {
return -1;
@ -33,7 +33,7 @@
// Fallback on IDs
return b.getId() - a.getId();
},
} ),
// Config
{
classes: [ 'mw-echo-ui-bundleNotificationItemWidget-group' ],
@ -50,11 +50,11 @@
.css( 'display', 'none' );
// Prevent clicks on the list padding area from activating the primary link
this.listWidget.$element.on( 'click', function ( e ) {
this.listWidget.$element.on( 'click', ( e ) => {
if ( e.target.closest( 'a' ) === this.$element[ 0 ] ) {
e.preventDefault();
}
}.bind( this ) );
} );
// Initialize closed
this.expanded = false;
@ -115,16 +115,14 @@
*/
mw.echo.ui.BundleNotificationItemWidget.prototype.populateFromModel = function () {
const widget = this;
this.getList().addItems( this.model.getList().getItems().map( function ( singleNotifModel ) {
return new mw.echo.ui.SingleNotificationItemWidget(
widget.controller,
singleNotifModel,
{
$overlay: widget.$overlay,
bundle: true
}
);
} ) );
this.getList().addItems( this.model.getList().getItems().map( ( singleNotifModel ) => new mw.echo.ui.SingleNotificationItemWidget(
widget.controller,
singleNotifModel,
{
$overlay: widget.$overlay,
bundle: true
}
) ) );
};
/**

View file

@ -31,7 +31,7 @@
this.listWidget = new mw.echo.ui.SortedListWidget(
// Sorting callback
function ( a, b ) {
( ( a, b ) => {
// Define the sorting order.
// This will go by the lists' timestamp, which in turn
// take the latest timestamp in their items
@ -43,7 +43,7 @@
// Fallback on IDs
return b.getSource() - a.getSource();
},
} ),
// Config
{
classes: [ 'mw-echo-ui-crossWikiNotificationItemWidget-group' ],
@ -232,7 +232,7 @@
// Query all sources
this.controller.fetchCrossWikiNotifications()
.catch(
function ( result ) {
( result ) => {
const loginPageTitle = mw.Title.newFromText( 'Special:UserLogin' );
// If failure, check if the failure is due to login
// so we can display a more comprehensive error

View file

@ -17,7 +17,7 @@
// Parent constructor
mw.echo.ui.CrossWikiUnreadFilterWidget.super.call( this,
// Sorting callback
function ( a, b ) {
( a, b ) => {
// Local source is always first
if ( a.getSource() === 'local' ) {
return -1;

View file

@ -30,14 +30,14 @@
this.listWidget = new mw.echo.ui.SortedListWidget(
// Sorting callback
function ( a, b ) {
( ( a, b ) => {
// Reverse sorting
if ( b.getTimestamp() < a.getTimestamp() ) {
return -1;
} else if ( b.getTimestamp() > a.getTimestamp() ) {
return 1;
}
},
} ),
// Config
{
classes: [ 'mw-echo-ui-datedNotificationsWidget-group' ],
@ -118,7 +118,7 @@
groupWidgets.push( subgroupWidget );
}
this.getList().getItems().forEach( function ( widget ) {
this.getList().getItems().forEach( ( widget ) => {
// Destroy all available widgets
widget.destroy();
} );

View file

@ -307,7 +307,7 @@
this.controller.fetchLocalNotifications( this.hasRunFirstTime )
.then(
// Success
function () {
() => {
if ( widget.popup.isVisible() ) {
// Fire initialization hook
mw.hook( 'ext.echo.popup.onInitialize' ).fire( widget.manager.getTypeString(), widget.controller );
@ -317,7 +317,7 @@
}
},
// Failure
function ( errorObj ) {
( errorObj ) => {
if ( errorObj.errCode === 'notlogin-required' ) {
// Login required message
widget.notificationsWidget.resetLoadingOption( mw.msg( 'echo-notification-loginrequired' ) );
@ -328,7 +328,7 @@
}
)
.then( this.emit.bind( this, 'finishLoading' ) )
.always( function () {
.always( () => {
widget.popup.clip();
// Pop pending
widget.popPending();

View file

@ -243,7 +243,7 @@
// Send to controller
item.pushPending();
this.controller.performDynamicAction( actionData, this.getModel().getSource() )
.then( function () {
.then( () => {
const $title = $( '<p>' )
.addClass( 'mw-echo-ui-notificationItemWidget-notify-title' )
.append( $.parseHTML( messages.title ) ),

View file

@ -238,7 +238,7 @@
return fetchPromise
.then(
// Success
function () {
() => {
// Fire initialization hook
mw.hook( 'ext.echo.special.onInitialize' ).fire( widget.controller.manager.getTypeString(), widget.controller );
@ -247,7 +247,7 @@
widget.controller.updateSeenTime();
},
// Failure
function ( errObj ) {
( errObj ) => {
let msg;
if ( errObj.errCode === 'notlogin-required' ) {
// Login required message

View file

@ -22,7 +22,7 @@
mw.echo.ui.NotificationsListWidget.super.call(
this,
// Sorting callback
function ( a, b ) {
( a, b ) => {
if ( !a.isRead() && b.isRead() ) {
return -1; // Unread items are always above read items
} else if ( a.isRead() && !b.isRead() ) {

View file

@ -69,7 +69,7 @@
this.pushPending();
return this.controller.fetchLocalNotifications( true )
.catch( function ( errorObj ) {
.catch( ( errorObj ) => {
if ( errorObj.errCode === 'notlogin-required' ) {
// Login required message
widget.notificationsWidget.resetLoadingOption( mw.msg( 'echo-notification-loginrequired' ) );
@ -78,7 +78,7 @@
widget.notificationsWidget.resetLoadingOption( mw.msg( 'echo-api-failure' ) );
}
} )
.always( function () {
.always( () => {
widget.popPending();
widget.emit( 'finishLoading' );
widget.promiseRunning = false;

View file

@ -133,9 +133,7 @@
return OO.binarySearch(
this.items,
function ( otherItem ) {
return widget.sortingFunction( item, otherItem );
},
( otherItem ) => widget.sortingFunction( item, otherItem ),
true
);
};

View file

@ -83,7 +83,7 @@
// fade out fake
// FIXME: Use CSS transition
// eslint-disable-next-line no-jquery/no-fade
fakeWidget.$element.fadeOut( 400, function () {
fakeWidget.$element.fadeOut( 400, () => {
// remove fake
widget.removeItems( [ fakeWidget ] );
// fade-in real item

View file

@ -31,7 +31,7 @@
this.listWidget = new mw.echo.ui.SortedListWidget(
// Sorting callback
config.sortingCallback || function ( a, b ) {
config.sortingCallback || ( ( a, b ) => {
// Reverse sorting
if ( b.getTimestamp() < a.getTimestamp() ) {
return -1;
@ -41,7 +41,7 @@
// Fallback on IDs
return b.getId() - a.getId();
},
} ),
// Config
{
$overlay: this.$overlay,

View file

@ -1,6 +1,6 @@
QUnit.module( 'ext.echo.dm - BundleNotificationItem' );
QUnit.test( 'Constructing the model', function ( assert ) {
QUnit.test( 'Constructing the model', ( assert ) => {
const bundledItems = [
new mw.echo.dm.NotificationItem( 0, { read: false, seen: false, timestamp: '201601010000' } ),
new mw.echo.dm.NotificationItem( 1, { read: false, seen: false, timestamp: '201601010100' } ),
@ -44,9 +44,7 @@ QUnit.test( 'Constructing the model', function ( assert ) {
'Bundle has unseen items'
);
const findItems = bundle.findByIds( [ 1, 4 ] ).map( function ( item ) {
return item.getId();
} );
const findItems = bundle.findByIds( [ 1, 4 ] ).map( ( item ) => item.getId() );
assert.deepEqual(
findItems,
[ 4, 1 ],
@ -54,7 +52,7 @@ QUnit.test( 'Constructing the model', function ( assert ) {
);
} );
QUnit.test( 'Managing a list of items', function ( assert ) {
QUnit.test( 'Managing a list of items', ( assert ) => {
const bundledItems = [
new mw.echo.dm.NotificationItem( 0, { read: false, seen: false, timestamp: '201601010000' } ),
new mw.echo.dm.NotificationItem( 1, { read: false, seen: false, timestamp: '201601010100' } ),
@ -77,7 +75,7 @@ QUnit.test( 'Managing a list of items', function ( assert ) {
);
// Mark all items as seen
bundledItems.forEach( function ( item ) {
bundledItems.forEach( ( item ) => {
item.toggleSeen( true );
} );
@ -101,7 +99,7 @@ QUnit.test( 'Managing a list of items', function ( assert ) {
);
// Mark all items as read
bundledItems.forEach( function ( item ) {
bundledItems.forEach( ( item ) => {
item.toggleRead( true );
} );
assert.strictEqual(

View file

@ -26,7 +26,7 @@ QUnit.test.each( 'Constructing the model', {
getCount: 10
}
}
}, function ( assert, data ) {
}, ( assert, data ) => {
const defaults = {
getModelName: 'xwiki',
getSourceNames: [],
@ -54,7 +54,7 @@ QUnit.test.each( 'Constructing the model', {
}
} );
QUnit.test( 'Managing notification lists', function ( assert ) {
QUnit.test( 'Managing notification lists', ( assert ) => {
const model = new mw.echo.dm.CrossWikiNotificationItem( 1 );
const groupDefinitions = [
{
@ -95,7 +95,7 @@ QUnit.test( 'Managing notification lists', function ( assert ) {
];
// Add groups to model
groupDefinitions.forEach( function ( def ) {
groupDefinitions.forEach( ( def ) => {
model.getList().addGroup(
def.name,
def.sourceData,
@ -115,8 +115,8 @@ QUnit.test( 'Managing notification lists', function ( assert ) {
);
// Mark all items as seen except one
groupDefinitions.forEach( function ( def ) {
def.items.forEach( function ( item ) {
groupDefinitions.forEach( ( def ) => {
def.items.forEach( ( item ) => {
item.toggleSeen( true );
} );
} );
@ -143,7 +143,7 @@ QUnit.test( 'Managing notification lists', function ( assert ) {
);
} );
QUnit.test( 'Update seen state', function ( assert ) {
QUnit.test( 'Update seen state', ( assert ) => {
const model = new mw.echo.dm.CrossWikiNotificationItem( 1 );
const groupDefinitions = [
{
@ -184,9 +184,7 @@ QUnit.test( 'Update seen state', function ( assert ) {
];
// Count all actual items
const numAllItems = groupDefinitions.reduce( function ( prev, curr ) {
return prev + curr.items.length;
}, 0 );
const numAllItems = groupDefinitions.reduce( ( prev, curr ) => prev + curr.items.length, 0 );
// Add groups to model
for ( let i = 0; i < groupDefinitions.length; i++ ) {
@ -197,9 +195,7 @@ QUnit.test( 'Update seen state', function ( assert ) {
);
}
let numUnseenItems = model.getItems().filter( function ( item ) {
return !item.isSeen();
} ).length;
let numUnseenItems = model.getItems().filter( ( item ) => !item.isSeen() ).length;
assert.strictEqual(
numUnseenItems,
numAllItems,
@ -209,9 +205,7 @@ QUnit.test( 'Update seen state', function ( assert ) {
// Update seen time to be bigger than 'foo' but smaller than the other groups
model.updateSeenState( '201601010400' );
numUnseenItems = model.getItems().filter( function ( item ) {
return !item.isSeen();
} ).length;
numUnseenItems = model.getItems().filter( ( item ) => !item.isSeen() ).length;
assert.strictEqual(
numUnseenItems,
numAllItems - groupDefinitions[ 0 ].items.length,
@ -221,9 +215,7 @@ QUnit.test( 'Update seen state', function ( assert ) {
// Update seen time to be bigger than all
model.updateSeenState( '201701010000' );
numUnseenItems = model.getItems().filter( function ( item ) {
return !item.isSeen();
} ).length;
numUnseenItems = model.getItems().filter( ( item ) => !item.isSeen() ).length;
assert.strictEqual(
numUnseenItems,
0,
@ -231,7 +223,7 @@ QUnit.test( 'Update seen state', function ( assert ) {
);
} );
QUnit.test( 'Emit discard event', function ( assert ) {
QUnit.test( 'Emit discard event', ( assert ) => {
const results = [];
const model = new mw.echo.dm.CrossWikiNotificationItem( -1 );
const groupDefinitions = [
@ -282,7 +274,7 @@ QUnit.test( 'Emit discard event', function ( assert ) {
}
// Listen to event
model.on( 'discard', function ( name ) {
model.on( 'discard', ( name ) => {
results.push( name );
} );

View file

@ -21,7 +21,7 @@ QUnit.test.each( 'Constructing the model', {
getReadState: 'read'
}
}
}, function ( assert, data ) {
}, ( assert, data ) => {
const defaultValues = {
getReadState: 'all'
};
@ -41,7 +41,7 @@ QUnit.test.each( 'Constructing the model', {
}
} );
QUnit.test( 'Changing filters', function ( assert ) {
QUnit.test( 'Changing filters', ( assert ) => {
const model = new mw.echo.dm.FiltersModel();
assert.strictEqual(
@ -72,12 +72,12 @@ QUnit.test( 'Changing filters', function ( assert ) {
);
} );
QUnit.test( '.setReadState() events', function ( assert ) {
QUnit.test( '.setReadState() events', ( assert ) => {
const results = [];
const model = new mw.echo.dm.FiltersModel();
// Listen to update event
model.on( 'update', function () {
model.on( 'update', () => {
results.push( model.getReadState() );
} );

View file

@ -1,6 +1,6 @@
QUnit.module( 'ext.echo.dm - NotificationGroupsList' );
QUnit.test( 'Constructing the model', function ( assert ) {
QUnit.test( 'Constructing the model', ( assert ) => {
const model = new mw.echo.dm.NotificationGroupsList();
assert.strictEqual(
@ -10,7 +10,7 @@ QUnit.test( 'Constructing the model', function ( assert ) {
);
} );
QUnit.test( 'Managing lists', function ( assert ) {
QUnit.test( 'Managing lists', ( assert ) => {
const model = new mw.echo.dm.NotificationGroupsList();
const groupDefinitions = [
{
@ -50,7 +50,7 @@ QUnit.test( 'Managing lists', function ( assert ) {
}
];
groupDefinitions.forEach( function ( def, i ) {
groupDefinitions.forEach( ( def, i ) => {
model.addGroup(
def.name,
def.sourceData,
@ -95,7 +95,7 @@ QUnit.test( 'Managing lists', function ( assert ) {
);
} );
QUnit.test( 'Emitting discard event', function ( assert ) {
QUnit.test( 'Emitting discard event', ( assert ) => {
const results = [];
const model = new mw.echo.dm.NotificationGroupsList();
const groups = {
@ -121,7 +121,7 @@ QUnit.test( 'Emitting discard event', function ( assert ) {
// Listen to the event
model
.on( 'discard', function ( g ) {
.on( 'discard', ( g ) => {
results.push( g.getName() );
} );

View file

@ -1,4 +1,4 @@
QUnit.module( 'ext.echo.dm - NotificationItem', function ( hooks ) {
QUnit.module( 'ext.echo.dm - NotificationItem', ( hooks ) => {
const fakeData = {
type: 'alert',
read: true,
@ -67,7 +67,7 @@ QUnit.module( 'ext.echo.dm - NotificationItem', function ( hooks ) {
]
}
}
}, function ( assert, data ) {
}, ( assert, data ) => {
const defaultValues = {
getId: undefined,
getContentHeader: '',
@ -94,7 +94,7 @@ QUnit.module( 'ext.echo.dm - NotificationItem', function ( hooks ) {
);
const methods = ( data.methods === 'all' ? Object.keys( expected ) : data.methods );
methods.forEach( function ( method ) {
methods.forEach( ( method ) => {
assert.deepEqual(
// Run the method
itemModel[ method ](),
@ -106,12 +106,12 @@ QUnit.module( 'ext.echo.dm - NotificationItem', function ( hooks ) {
} );
} );
QUnit.test( 'Emitting update event', function ( assert ) {
QUnit.test( 'Emitting update event', ( assert ) => {
const results = [];
const itemModel = new mw.echo.dm.NotificationItem( 0, $.extend( true, {}, fakeData, { seen: false, read: false } ) );
// Listen to update event
itemModel.on( 'update', function () {
itemModel.on( 'update', () => {
results.push( [
itemModel.isRead(),
itemModel.isSeen()

View file

@ -22,7 +22,7 @@ QUnit.test.each( 'Constructing the model', {
isForeign: true
}
}
}, function ( assert, data ) {
}, ( assert, data ) => {
const defaultValues = {
getAllItemIds: [],
getAllItemIdsByType: [],
@ -50,7 +50,7 @@ QUnit.test.each( 'Constructing the model', {
}
} );
QUnit.test( 'Handling notification items', function ( assert ) {
QUnit.test( 'Handling notification items', ( assert ) => {
const model = new mw.echo.dm.NotificationsList( { timestamp: '200101010000' } );
const items = [
new mw.echo.dm.NotificationItem( 0, { type: 'alert', timestamp: '201609190000', read: false, seen: false } ),
@ -137,7 +137,7 @@ QUnit.test( 'Handling notification items', function ( assert ) {
} );
QUnit.test( 'Intercepting events', function ( assert ) {
QUnit.test( 'Intercepting events', ( assert ) => {
const model = new mw.echo.dm.NotificationsList();
const result = [];
const items = [
@ -151,13 +151,13 @@ QUnit.test( 'Intercepting events', function ( assert ) {
// Listen to events
model
.on( 'update', function ( itms ) {
.on( 'update', ( itms ) => {
result.push( 'update:' + itms.length );
} )
.on( 'discard', function ( item ) {
.on( 'discard', ( item ) => {
result.push( 'discard:' + item.getId() );
} )
.on( 'itemUpdate', function ( item ) {
.on( 'itemUpdate', ( item ) => {
result.push( 'itemUpdate:' + item.getId() );
} );

View file

@ -17,7 +17,7 @@ QUnit.test.each( 'Constructing the model', {
getCurrentPageItemCount: 10
}
}
}, function ( assert, data ) {
}, ( assert, data ) => {
const defaultValues = {
getPageContinue: undefined,
getCurrPageIndex: 0,
@ -45,12 +45,12 @@ QUnit.test.each( 'Constructing the model', {
}
} );
QUnit.test( 'Emitting update event', function ( assert ) {
QUnit.test( 'Emitting update event', ( assert ) => {
const results = [];
const model = new mw.echo.dm.PaginationModel();
// Listen to update event
model.on( 'update', function () {
model.on( 'update', () => {
results.push( [
model.getCurrPageIndex(),
model.hasNextPage()

View file

@ -1,6 +1,6 @@
QUnit.module( 'ext.echo.dm - SeenTimeModel' );
QUnit.test( '.getTypes()', function ( assert ) {
QUnit.test( '.getTypes()', ( assert ) => {
const model = new mw.echo.dm.SeenTimeModel();
assert.deepEqual(
@ -10,7 +10,7 @@ QUnit.test( '.getTypes()', function ( assert ) {
);
} );
QUnit.test( '.setSeenTime() reflected', function ( assert ) {
QUnit.test( '.setSeenTime() reflected', ( assert ) => {
let model;
model = new mw.echo.dm.SeenTimeModel();
@ -32,12 +32,12 @@ QUnit.test( '.setSeenTime() reflected', function ( assert ) {
);
} );
QUnit.test( '.setSeenTime() events', function ( assert ) {
QUnit.test( '.setSeenTime() events', ( assert ) => {
const results = [];
const model = new mw.echo.dm.SeenTimeModel();
// Attach a listener
model.on( 'update', function ( time ) {
model.on( 'update', ( time ) => {
results.push( time );
} );

View file

@ -1,4 +1,4 @@
QUnit.module( 'ext.echo.dm - SourcePagesModel', function () {
QUnit.module( 'ext.echo.dm - SourcePagesModel', () => {
// Mock partial API response we feed into the model
const sources = {
local: {
@ -75,7 +75,7 @@ QUnit.module( 'ext.echo.dm - SourcePagesModel', function () {
}
};
QUnit.test( 'Creating source-page map', function ( assert ) {
QUnit.test( 'Creating source-page map', ( assert ) => {
const model = new mw.echo.dm.SourcePagesModel();
model.setAllSources( sources );

View file

@ -4,7 +4,7 @@ QUnit.test.each( '.getCappedNotificationCount()', [
{ input: 5, output: 5 },
{ input: 20, output: 11 },
{ input: 10, output: 10 }
], function ( assert, data ) {
], ( assert, data ) => {
const model = new mw.echo.dm.UnreadNotificationCounter(
null,
'all', // type
@ -17,7 +17,7 @@ QUnit.test.each( '.getCappedNotificationCount()', [
);
} );
QUnit.test( '.estimateChange()', function ( assert ) {
QUnit.test( '.estimateChange()', ( assert ) => {
const model = new mw.echo.dm.UnreadNotificationCounter(
null,
'all', // type
@ -48,7 +48,7 @@ QUnit.test( '.estimateChange()', function ( assert ) {
);
} );
QUnit.test( '.setCount()', function ( assert ) {
QUnit.test( '.setCount()', ( assert ) => {
const results = [];
const model = new mw.echo.dm.UnreadNotificationCounter(
null,
@ -57,7 +57,7 @@ QUnit.test( '.setCount()', function ( assert ) {
);
// Listen to event
model.on( 'countChange', function ( count ) {
model.on( 'countChange', ( count ) => {
results.push( count );
} );