trigger: ':',
groups: [ {
// Group definition (single group)
- name: 'namespaces',
- definition: {
- type: 'string_options',
- title: mw.msg( 'namespaces' ),
- labelPrefixKey: { 'default': 'rcfilters-tag-prefix-namespace', inverted: 'rcfilters-tag-prefix-namespace-inverted' },
- separator: ';',
- fullCoverage: true
- },
- items: items
+ name: 'namespace', // parameter name is singular
+ type: 'string_options',
+ title: mw.msg( 'namespaces' ),
+ labelPrefixKey: { 'default': 'rcfilters-tag-prefix-namespace', inverted: 'rcfilters-tag-prefix-namespace-inverted' },
+ separator: ';',
+ fullCoverage: true,
+ filters: items
} ]
};
}
groups: [ {
// Group definition (single group)
name: 'tagfilter', // Parameter name
- definition: {
- type: 'string_options',
- title: 'rcfilters-view-tags', // Message key
- labelPrefixKey: 'rcfilters-tag-prefix-tags',
- separator: '|',
- fullCoverage: false
- },
- items: tagList
+ type: 'string_options',
+ title: 'rcfilters-view-tags', // Message key
+ labelPrefixKey: 'rcfilters-tag-prefix-tags',
+ separator: '|',
+ fullCoverage: false,
+ filters: tagList
} ]
};
}
this._trackHighlight( 'clear', filterName );
};
+ /**
+ * Enable or disable live updates.
+ * @param {boolean} enable True to enable, false to disable
+ */
+ mw.rcfilters.Controller.prototype.toggleLiveUpdate = function ( enable ) {
+ if ( enable && !this.liveUpdateTimeout ) {
+ this._scheduleLiveUpdate();
+ } else if ( !enable && this.liveUpdateTimeout ) {
+ clearTimeout( this.liveUpdateTimeout );
+ this.liveUpdateTimeout = null;
+ }
+ };
+
+ /**
+ * Set a timeout for the next live update.
+ * @private
+ */
+ mw.rcfilters.Controller.prototype._scheduleLiveUpdate = function () {
+ this.liveUpdateTimeout = setTimeout( this._doLiveUpdate.bind( this ), 3000 );
+ };
+
+ /**
+ * Perform a live update.
+ * @private
+ */
+ mw.rcfilters.Controller.prototype._doLiveUpdate = function () {
+ var controller = this;
+ this.updateChangesList( {}, true )
+ .always( function () {
+ if ( controller.liveUpdateTimeout ) {
+ // Live update was not disabled in the meantime
+ controller._scheduleLiveUpdate();
+ }
+ } );
+ };
+
/**
* Save the current model state as a saved query
*
* Update the list of changes and notify the model
*
* @param {Object} [params] Extra parameters to add to the API call
+ * @param {boolean} [isLiveUpdate] Don't update the URL or invalidate the changes list
+ * @return {jQuery.Promise} Promise that is resolved when the update is complete
*/
- mw.rcfilters.Controller.prototype.updateChangesList = function ( params ) {
- this._updateURL( params );
- this.changesListModel.invalidate();
- this._fetchChangesList()
+ mw.rcfilters.Controller.prototype.updateChangesList = function ( params, isLiveUpdate ) {
+ if ( !isLiveUpdate ) {
+ this._updateURL( params );
+ this.changesListModel.invalidate();
+ }
+ return this._fetchChangesList()
.then(
// Success
function ( pieces ) {