mediawiki-extensions-Echo/modules/model/mw.echo.dm.SourcePagesModel.js
Roan Kattouw 6c4bf99da8 ApiUnreadNotificationPages: Output pages as an array rather than an object
Make the frontend code based on page titles rather than page IDs.

Change-Id: I79c6a0e3a7178acdb14039a0c5208e90a7341044
2016-06-23 17:00:51 +02:00

155 lines
3.7 KiB
JavaScript

( function ( mw ) {
/**
* Source pages model for notification filtering
*
* @class
* @mixins OO.EventEmitter
*
* @constructor
* @param {Object} config Configuration object
* @cfg {string} [currentSource] The selected source for the model.
* Defaults to the current wiki.
*/
mw.echo.dm.SourcePagesModel = function MwEchoDmSourcePagesModel( config ) {
config = config || {};
// Mixin constructor
OO.EventEmitter.call( this );
this.sources = {};
this.currentSource = config.currentSource || mw.config.get( 'wgDBname' );
this.currentPage = null;
};
/* Initialization */
OO.initClass( mw.echo.dm.SourcePagesModel );
OO.mixinClass( mw.echo.dm.SourcePagesModel, OO.EventEmitter );
/* Events */
/**
* @event update
*
* The state of the source page model has changed
*/
/* Methds */
/**
* Set the current source and page.
*
* @param {string} source New source
* @param {string} page New page
* @fires update
*/
mw.echo.dm.SourcePagesModel.prototype.setCurrentSourcePage = function ( source, page ) {
if (
this.currentSource !== source ||
this.currentPage !== page
) {
this.currentSource = source;
this.currentPage = page;
this.emit( 'update' );
}
};
/**
* Get the current source
*
* @return {string} Current source
*/
mw.echo.dm.SourcePagesModel.prototype.getCurrentSource = function () {
return this.currentSource;
};
/**
* Get the title of the currently selected page
*
* @return {string} Page title
*/
mw.echo.dm.SourcePagesModel.prototype.getCurrentPage = function () {
return this.currentPage;
};
/**
* Set all sources and pages. This will also reset and override any
* previously set information.
*
* @param {Object} sourceData A detailed object about sources and pages
*/
mw.echo.dm.SourcePagesModel.prototype.setAllSources = function ( sourceData ) {
var source;
this.reset();
for ( source in sourceData ) {
if ( sourceData.hasOwnProperty( source ) ) {
this.setSourcePagesDetails( source, sourceData[ source ] );
}
}
this.emit( 'update' );
};
/**
* Get an array of all source names
*
* @return {string[]} Array of source names
*/
mw.echo.dm.SourcePagesModel.prototype.getSourcesArray = function () {
return Object.keys( this.sources );
};
/**
* Get the title of a source
*
* @param {string} source Symbolic name of the source
* @return {string} Source title
*/
mw.echo.dm.SourcePagesModel.prototype.getSourceTitle = function ( source ) {
return this.sources[ source ] && this.sources[ source ].title;
};
/**
* Get the total count of a source
*
* @param {string} source Symbolic name of the source
* @return {number} Total count
*/
mw.echo.dm.SourcePagesModel.prototype.getSourceTotalCount = function ( source ) {
return ( this.sources[ source ] && this.sources[ source ].totalCount ) || 0;
};
/**
* Get all pages in a source
*
* @param {string} source Symbolic name of the source
* @return {Object[]} Page definitions in this source
*/
mw.echo.dm.SourcePagesModel.prototype.getSourcePages = function ( source ) {
return this.sources[ source ] && this.sources[ source ].pages;
};
/**
* Reset the data
*/
mw.echo.dm.SourcePagesModel.prototype.reset = function () {
this.sources = {};
};
/**
* Set the details of a source and its page definitions
*
* @private
* @param {string} source Source symbolic name
* @param {Object} details Details object
*/
mw.echo.dm.SourcePagesModel.prototype.setSourcePagesDetails = function ( source, details ) {
this.sources[ source ] = {
title: details.source.title,
base: details.source.base,
totalCount: details.totalCount,
pages: details.pages
};
};
} )( mediaWiki );