* @param {mw.rcfilters.dm.FiltersViewModel} filtersModel Filters view model
* @param {mw.rcfilters.dm.ChangesListViewModel} changesListModel Changes list view model
* @param {mw.rcfilters.dm.SavedQueriesModel} savedQueriesModel Saved queries model
+ * @param {Object} config Additional configuration
+ * @cfg {string} savedQueriesPreferenceName Where to save the saved queries
*/
- mw.rcfilters.Controller = function MwRcfiltersController( filtersModel, changesListModel, savedQueriesModel ) {
+ mw.rcfilters.Controller = function MwRcfiltersController( filtersModel, changesListModel, savedQueriesModel, config ) {
this.filtersModel = filtersModel;
this.changesListModel = changesListModel;
this.savedQueriesModel = savedQueriesModel;
+ this.savedQueriesPreferenceName = config.savedQueriesPreferenceName;
+
this.requestCounter = {};
this.baseFilterState = {};
this.uriProcessor = null;
);
try {
- parsedSavedQueries = JSON.parse( mw.user.options.get( 'rcfilters-saved-queries' ) || '{}' );
+ parsedSavedQueries = JSON.parse( mw.user.options.get( this.savedQueriesPreferenceName ) || '{}' );
} catch ( err ) {
parsedSavedQueries = {};
}
// so it gets processed
this.changesListModel.update(
$changesList.length ? $changesList : 'NO_RESULTS',
- $( 'fieldset.rcoptions' ).first(),
+ $( 'fieldset.cloptions' ).first(),
true // We're using existing DOM elements
);
}
this.filtersModel.toggleInvertedNamespaces();
if (
- this.filtersModel.getFiltersByView( 'namespaces' )
- .filter( function ( filterItem ) {
- return filterItem.isSelected();
- } )
- .length
+ this.filtersModel.getFiltersByView( 'namespaces' ).filter(
+ function ( filterItem ) { return filterItem.isSelected(); }
+ ).length
) {
// Only re-fetch results if there are namespace items that are actually selected
this.updateChangesList();
* @return {Object} Minimal filters and highlights list
*/
mw.rcfilters.Controller.prototype._getMinimalFilterList = function ( valuesObject ) {
- var result = { filters: {}, highlights: {} },
+ var result = { filters: {}, highlights: {}, invert: valuesObject.invert },
baseState = this._getBaseFilterState();
// XOR results
}
// Save the preference
- new mw.Api().saveOption( 'rcfilters-saved-queries', stringified );
+ new mw.Api().saveOption( this.savedQueriesPreferenceName, stringified );
// Update the preference for this session
- mw.user.options.set( 'rcfilters-saved-queries', stringified );
+ mw.user.options.set( this.savedQueriesPreferenceName, stringified );
};
/**
* Update the list of changes and notify the model
*
* @param {Object} [params] Extra parameters to add to the API call
- * @param {string} [updateMode='filterChange'] One of 'filterChange', 'liveUpdate', 'showNewChanges'
+ * @param {string} [updateMode='filterChange'] One of 'filterChange', 'liveUpdate', 'showNewChanges', 'markSeen'
* @return {jQuery.Promise} Promise that is resolved when the update is complete
*/
mw.rcfilters.Controller.prototype.updateChangesList = function ( params, updateMode ) {
return $.ajax( uri.toString(), { contentType: 'html' } )
.then(
- // Success
function ( html ) {
- var $parsed;
+ var $parsed,
+ pieces;
+
if ( !latestRequest() ) {
return $.Deferred().reject();
}
$parsed = $( $.parseHTML( html ) );
- return {
+ pieces = {
// Changes list
changes: $parsed.find( '.mw-changeslist' ).first().contents(),
// Fieldset
- fieldset: $parsed.find( 'fieldset.rcoptions' ).first()
+ fieldset: $parsed.find( 'fieldset.cloptions' ).first()
};
+
+ // Watchlist returns 200 when there is no results
+ if ( pieces.changes.length === 0 ) {
+ pieces.changes = 'NO_RESULTS';
+ }
+
+ return pieces;
},
- // Failure
+ // RC returns 404 when there is no results
function ( responseObj ) {
var $parsed;
// Force a resolve state to this promise
return $.Deferred().resolve( {
changes: 'NO_RESULTS',
- fieldset: $parsed.find( 'fieldset.rcoptions' ).first()
+ fieldset: $parsed.find( 'fieldset.cloptions' ).first()
} ).promise();
}
);
this.prevLoggedItems = filters;
}
};
+
+ /**
+ * Mark all changes as seen on Watchlist
+ */
+ mw.rcfilters.Controller.prototype.markAllChangesAsSeen = function () {
+ var api = new mw.Api();
+ api.postWithToken( 'csrf', {
+ formatversion: 2,
+ action: 'setnotificationtimestamp',
+ entirewatchlist: true
+ } ).then( function () {
+ this.updateChangesList( null, 'markSeen' );
+ }.bind( this ) );
+ };
}( mediaWiki, jQuery ) );