mediawiki-extensions-Echo/modules/model/mw.echo.dm.CrossWikiNotificationItem.js
Moriel Schottlender 545d4e67ae Add a mark-all-read button and a settings menu to Special:Notifications
Add a global-wiki 'mark all as read' to the Special:Notifications page.
The 'mark all as read' will makr all notifications in the given
wiki. The context of the wiki changes when filters are chosen,
and so the message of the button changes as well.

Bug: T115528
Change-Id: Ibd9dcdf7072d6cbc1a268c18e558e6d0df28f929
2016-07-20 17:25:38 -07:00

150 lines
3.8 KiB
JavaScript

( function ( mw ) {
/**
* Cross-wiki notification item model. Contains a list of sources,
* that each contain a list of notification items from that source.
*
* @class
* @extends mw.echo.dm.NotificationItem
*
* @constructor
* @param {number} id Notification id
* @param {Object} [config] Configuration object
* @cfg {number} count The initial anticipated count of notifications through all
* of the sources.
*/
mw.echo.dm.CrossWikiNotificationItem = function MwEchoDmCrossWikiNotificationItem( id, config ) {
config = config || {};
mw.echo.dm.CrossWikiNotificationItem.parent.call( this, id, config );
this.foreign = true;
this.source = null;
this.count = config.count || 0;
this.list = new mw.echo.dm.NotificationGroupsList();
this.list.connect( this, { discard: 'onListDiscard' } );
};
OO.inheritClass( mw.echo.dm.CrossWikiNotificationItem, mw.echo.dm.NotificationItem );
/* Events */
/**
* @event discard
* @param {string} name The symbolic name for the list model that was discarded
*
* A sub list has been discarded
*/
/* Methods */
/**
* Respond to list being removed from the cross-wiki bundle.
*
* @param {mw.echo.dm.NotificationGroupsList} sourceModel The source model that was removed
* @fires discard
*/
mw.echo.dm.CrossWikiNotificationItem.prototype.onListDiscard = function ( sourceModel ) {
this.emit( 'discard', sourceModel.getName() );
};
/**
* Get the list of sources
*
* @return {mw.echo.dm.NotificationGroupsList} List of sources
*/
mw.echo.dm.CrossWikiNotificationItem.prototype.getList = function () {
return this.list;
};
/**
* Get an array of source names that are in the cross-wiki list
*
* @return {string[]} Source names
*/
mw.echo.dm.CrossWikiNotificationItem.prototype.getSourceNames = function () {
var i,
sourceNames = [],
sourceLists = this.list.getItems();
for ( i = 0; i < sourceLists.length; i++ ) {
sourceNames.push( sourceLists[ i ].getName() );
}
return sourceNames;
};
/**
* Get a specific item from the list by its source name
*
* @param {string} sourceName Source name
* @return {mw.echo.dm.NotificationGroupsList} Source item
*/
mw.echo.dm.CrossWikiNotificationItem.prototype.getItemBySource = function ( sourceName ) {
return this.list.getGroupByName( sourceName );
};
/**
* Get expected item count from all sources
*
* @return {number} Item count
*/
mw.echo.dm.CrossWikiNotificationItem.prototype.getCount = function () {
return this.count;
};
/**
* Check if there are unseen items in any of the cross wiki source lists.
* This method is required for all models that are managed by the
* mw.echo.dm.ModelManager.
*
* @return {boolean} There are unseen items
*/
mw.echo.dm.CrossWikiNotificationItem.prototype.hasUnseen = function () {
var i, j, items,
sourceLists = this.getList().getItems();
for ( i = 0; i < sourceLists.length; i++ ) {
items = sourceLists[ i ].getItems();
for ( j = 0; j < items.length; j++ ) {
if ( !items[ j ].isSeen() ) {
return true;
}
}
}
return false;
};
/**
* Get all items in the cross wiki notification bundle
*
* @return {mw.echo.dm.NotificationItem[]} All items across all sources
*/
mw.echo.dm.CrossWikiNotificationItem.prototype.getItems = function () {
var notifications = [];
this.list.getItems().forEach( function ( sourceList ) {
notifications = notifications.concat( sourceList.getItems() );
} );
return notifications;
};
/**
* This item is a group.
* This method is required for all models that are managed by the
* mw.echo.dm.ModelManager.
*
* @return {boolean} This item is a group
*/
mw.echo.dm.CrossWikiNotificationItem.prototype.isGroup = function () {
return true;
};
mw.echo.dm.CrossWikiNotificationItem.prototype.isEmpty = function () {
return this.getList().isEmpty();
};
} )( mediaWiki );