mirror of
https://gerrit.wikimedia.org/r/mediawiki/skins/MinervaNeue
synced 2024-12-04 02:29:00 +00:00
ef5003f310
The MobileFrontend dependency in Minerva is problematic. Code that Minerva needs should live in core. MobileFrontend should load code on all skins when they operate on a mobile domain. This eslint check reminds developers of this in a hope it encourages more upstreaming to core when possible. Of course disabling is also an option, but this check will at least make us aware of when we are moving further away from the goal. Change-Id: I62183c9aefc81053e4ad81fb746decef2dd24b44
111 lines
4.1 KiB
JavaScript
111 lines
4.1 KiB
JavaScript
/*
|
|
* This code loads the necessary modules for the notifications overlay, not to be confused
|
|
* with the Toast notifications defined by common/toast.js.
|
|
*/
|
|
module.exports = function () {
|
|
var badge,
|
|
// eslint-disable-next-line no-restricted-properties
|
|
M = mw.mobileFrontend,
|
|
mainMenu = require( './menu.js' ),
|
|
router = require( 'mediawiki.router' ),
|
|
mobile = M.require( 'mobile.startup' ),
|
|
util = mobile.util,
|
|
NotificationBadge = require( './NotificationBadge.js' ),
|
|
overlayManager = mobile.OverlayManager.getSingleton(),
|
|
initialized = false;
|
|
|
|
function showNotificationOverlay() {
|
|
// eslint-disable-next-line no-jquery/no-global-selector
|
|
var $pageCenter = $( '#mw-mf-page-center' ),
|
|
overlay = mobile.notifications.overlay( badge.setCount.bind( badge ),
|
|
badge.markAsSeen.bind( badge ) );
|
|
mainMenu.openNavigationDrawer( 'secondary' );
|
|
overlay.on( 'hide', function () {
|
|
mainMenu.closeNavigationDrawers();
|
|
$pageCenter.off( '.secondary' );
|
|
} );
|
|
|
|
$pageCenter.one( 'click.secondary', function () {
|
|
router.back();
|
|
} );
|
|
return overlay;
|
|
}
|
|
|
|
// Once the DOM is loaded hijack the notifications button to display an overlay rather
|
|
// than linking to Special:Notifications.
|
|
util.docReady( function () {
|
|
badge = new NotificationBadge( {
|
|
onClick: function ( ev ) {
|
|
router.navigate( '#/notifications' );
|
|
// prevent navigation to original Special:Notifications URL
|
|
// DO NOT USE stopPropagation or you'll break click tracking in WikimediaEvents
|
|
ev.preventDefault();
|
|
},
|
|
// eslint-disable-next-line no-jquery/no-global-selector
|
|
el: $( '#user-notifications.user-button' ).parent()
|
|
} );
|
|
overlayManager.add( /^\/notifications$/, showNotificationOverlay );
|
|
|
|
/**
|
|
* Adds a filter button to the UI inside notificationsInboxWidget
|
|
* @method
|
|
* @ignore
|
|
*/
|
|
function addFilterButton() {
|
|
// Create filter button once the notifications overlay has been loaded
|
|
var filterStatusButton = new OO.ui.ButtonWidget(
|
|
{
|
|
href: '#/notifications-filter',
|
|
classes: [ 'mw-echo-ui-notificationsInboxWidget-main-toolbar-nav-filter-placeholder' ],
|
|
icon: 'funnel',
|
|
label: mw.msg( 'mobile-frontend-notifications-filter' )
|
|
} );
|
|
|
|
// eslint-disable-next-line no-jquery/no-global-selector
|
|
$( '.mw-echo-ui-notificationsInboxWidget-cell-placeholder' ).append(
|
|
$( '<div>' )
|
|
.addClass( 'mw-echo-ui-notificationsInboxWidget-main-toolbar-nav-filter' )
|
|
.addClass( 'mw-echo-ui-notificationsInboxWidget-cell' )
|
|
.append( filterStatusButton.$element )
|
|
);
|
|
}
|
|
|
|
// This code will currently only be invoked on Special:Notifications
|
|
// 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 () {
|
|
// The 'ext.echo.special.onInitialize' hook is fired whenever special page notification
|
|
// changes display on click of a filter.
|
|
// Hence the hook is restricted from firing more than once.
|
|
if ( initialized ) {
|
|
return;
|
|
}
|
|
|
|
// Load the notification filter overlay
|
|
mw.loader.using( 'mobile.notifications.overlay' ).then( function () {
|
|
// eslint-disable-next-line no-jquery/no-global-selector
|
|
var $crossWikiUnreadFilter = $( '.mw-echo-ui-crossWikiUnreadFilterWidget' ),
|
|
// eslint-disable-next-line no-jquery/no-global-selector
|
|
$notifReadState = $( '.mw-echo-ui-notificationsInboxWidget-main-toolbar-readState' ),
|
|
NotificationsFilterOverlay = M.require( 'mobile.notifications.overlay/NotificationsFilterOverlay' );
|
|
|
|
// setup the filter button (now we have OOjs UI)
|
|
addFilterButton();
|
|
|
|
// setup route
|
|
overlayManager.add( /^\/notifications-filter$/, function () {
|
|
mainMenu.openNavigationDrawer( 'secondary' );
|
|
return new NotificationsFilterOverlay( {
|
|
$notifReadState: $notifReadState,
|
|
mainMenu: mainMenu,
|
|
$crossWikiUnreadFilter: $crossWikiUnreadFilter
|
|
} );
|
|
} );
|
|
} );
|
|
initialized = true;
|
|
} );
|
|
} );
|
|
|
|
};
|