this.parameterMap = {};
this.views = {};
- this.currentView = null;
+ this.currentView = 'default';
// Events
this.aggregate( { update: 'filterItemUpdate' } );
* Set filters and preserve a group relationship based on
* the definition given by an object
*
- * @param {Array} filters Filter group definition
- * @param {Object} [namespaces] Namespace definition
- * @param {Object[]} [tags] Tag array definition
- */
- mw.rcfilters.dm.FiltersViewModel.prototype.initializeFilters = function ( filters, namespaces, tags ) {
+ * @param {Array} filters Filters definition
+ * @param {Object} [views] Extra views definition
+ * Expected in the following format:
+ * {
+ * namespaces: {
+ * label: 'namespaces', // Message key
+ * trigger: ':',
+ * groups: [
+ * {
+ * // Group info
+ * name: 'namespaces' // Parameter name
+ * definition: {
+ * title: 'namespaces' // Message key
+ * type: 'string_options',
+ * separator: ';',
+ * labelPrefixKey: { 'default': 'rcfilters-tag-prefix-namespace', inverted: 'rcfilters-tag-prefix-namespace-inverted' },
+ * fullCoverage: true
+ * },
+ * items: []
+ * }
+ * ]
+ * }
+ * }
+ */
+ mw.rcfilters.dm.FiltersViewModel.prototype.initializeFilters = function ( filters, views ) {
var filterItem, filterConflictResult, groupConflictResult,
model = this,
items = [],
- namespaceDefinition = [],
groupConflictMap = {},
filterConflictMap = {},
/*!
this.groups = {};
this.views = {};
+ views = views || {};
+
// Filters
this.views.default = { name: 'default', label: mw.msg( 'rcfilters-filterlist-title' ) };
filters.forEach( function ( data ) {
}
} );
- namespaces = namespaces || {};
- if (
- mw.config.get( 'wgStructuredChangeFiltersEnableExperimentalViews' ) &&
- !$.isEmptyObject( namespaces )
- ) {
- // Namespaces group
- this.views.namespaces = { name: 'namespaces', label: mw.msg( 'namespaces' ), trigger: ':' };
- $.each( namespaces, function ( namespaceID, label ) {
- // Build and clean up the definition
- namespaceDefinition.push( {
- name: namespaceID,
- label: label || mw.msg( 'blanknamespace' ),
- description: '',
- identifiers: [
- ( namespaceID < 0 || namespaceID % 2 === 0 ) ?
- 'subject' : 'talk'
- ],
- cssClass: 'mw-changeslist-ns-' + namespaceID
- } );
- } );
-
- // Add the group
- model.groups.namespace = new mw.rcfilters.dm.FilterGroup(
- 'namespace', // Parameter name is singular
- {
- type: 'string_options',
- view: 'namespaces',
- title: 'namespaces', // Message key
- separator: ';',
- labelPrefixKey: { 'default': 'rcfilters-tag-prefix-namespace', inverted: 'rcfilters-tag-prefix-namespace-inverted' },
- fullCoverage: true
- }
- );
- // Add namespace items to group
- model.groups.namespace.initializeFilters( namespaceDefinition );
- items = items.concat( model.groups.namespace.getItems() );
- }
+ if ( mw.config.get( 'wgStructuredChangeFiltersEnableExperimentalViews' ) ) {
+ $.each( views, function ( viewName, viewData ) {
+ model.views[ viewName ] = {
+ name: viewData.name,
+ title: viewData.title,
+ trigger: viewData.trigger
+ };
- tags = tags || [];
- if (
- mw.config.get( 'wgStructuredChangeFiltersEnableExperimentalViews' ) &&
- tags.length > 0
- ) {
- // Define view
- this.views.tags = { name: 'tags', label: mw.msg( 'rcfilters-view-tags' ), trigger: '#' };
-
- // Add the group
- model.groups.tagfilter = new mw.rcfilters.dm.FilterGroup(
- 'tagfilter',
- {
- type: 'string_options',
- view: 'tags',
- title: 'rcfilters-view-tags', // Message key
- labelPrefixKey: 'rcfilters-tag-prefix-tags',
- separator: '|',
- fullCoverage: false
- }
- );
+ // Group
+ viewData.groups.forEach( function ( groupData ) {
+ model.groups[ groupData.name ] = new mw.rcfilters.dm.FilterGroup(
+ groupData.name,
+ $.extend( true, {}, groupData.definition, { view: viewName } )
+ );
- // Add tag items to group
- model.groups.tagfilter.initializeFilters( tags );
+ // Add items
+ model.groups[ groupData.name ].initializeFilters( groupData.items );
- // Add item references to the model, for lookup
- items = items.concat( model.groups.tagfilter.getItems() );
+ // Add to global search list
+ items = items.concat( model.groups[ groupData.name ].getItems() );
+ } );
+ } );
}
// Add item references to the model, for lookup
* @return {string} View trigger, if exists
*/
mw.rcfilters.dm.FiltersViewModel.prototype.getViewTrigger = function ( view ) {
- return this.views[ view ] && this.views[ view ].trigger;
+ return ( this.views[ view ] && this.views[ view ].trigger ) || '';
};
/**
* Get the value of a specific parameter
* @return {string} Label for the current view
*/
mw.rcfilters.dm.FiltersViewModel.prototype.getCurrentViewLabel = function () {
- return this.views[ this.getCurrentView() ].label;
+ return this.views[ this.getCurrentView() ].title;
};
/**
filterItem.clearHighlightColor();
} );
};
+
+ /**
+ * Return a version of the given string that is without any
+ * view triggers.
+ *
+ * @param {string} str Given string
+ * @return {string} Result
+ */
+ mw.rcfilters.dm.FiltersViewModel.prototype.removeViewTriggers = function ( str ) {
+ if ( this.getViewByTrigger( str.substr( 0, 1 ) ) !== 'default' ) {
+ str = str.substr( 1 );
+ }
+
+ return str;
+ };
}( mediaWiki, jQuery ) );
*/
mw.rcfilters.Controller.prototype.initialize = function ( filterStructure, namespaceStructure, tagList ) {
var parsedSavedQueries,
+ views = {},
+ items = [],
uri = new mw.Uri(),
$changesList = $( '.mw-changeslist' ).first().contents();
+ // Prepare views
+ if ( namespaceStructure ) {
+ items = [];
+ $.each( namespaceStructure, function ( namespaceID, label ) {
+ // Build and clean up the individual namespace items definition
+ items.push( {
+ name: namespaceID,
+ label: label || mw.msg( 'blanknamespace' ),
+ description: '',
+ identifiers: [
+ ( namespaceID < 0 || namespaceID % 2 === 0 ) ?
+ 'subject' : 'talk'
+ ],
+ cssClass: 'mw-changeslist-ns-' + namespaceID
+ } );
+ } );
+
+ views.namespaces = {
+ title: mw.msg( 'namespaces' ),
+ 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
+ } ]
+ };
+ }
+ if ( tagList ) {
+ views.tags = {
+ title: mw.msg( 'rcfilters-view-tags' ),
+ trigger: '#',
+ 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
+ } ]
+ };
+ }
+
// Initialize the model
- this.filtersModel.initializeFilters( filterStructure, namespaceStructure, tagList );
+ this.filtersModel.initializeFilters( filterStructure, views );
this._buildBaseFilterState();
* @param {string} queryID Query id
*/
mw.rcfilters.Controller.prototype.removeSavedQuery = function ( queryID ) {
- var query = this.savedQueriesModel.getItemByID( queryID );
+ this.savedQueriesModel.removeQuery( queryID );
- this.savedQueriesModel.removeItems( [ query ] );
-
- // Check if this item was the default
- if ( this.savedQueriesModel.getDefault() === queryID ) {
- // Nulify the default
- this.savedQueriesModel.setDefault( null );
- }
this._saveSavedQueries();
};