* 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
+ * @param {Array} filterGroups 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
+ * 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, namespaces, tags ) {
- var filterItem, filterConflictResult, groupConflictResult,
+ mw.rcfilters.dm.FiltersViewModel.prototype.initializeFilters = function ( filterGroups, views ) {
+ var filterConflictResult, groupConflictResult,
+ allViews = {},
model = this,
items = [],
- namespaceDefinition = [],
groupConflictMap = {},
filterConflictMap = {},
/*!
this.groups = {};
this.views = {};
- // Filters
- this.views.default = { name: 'default', label: mw.msg( 'rcfilters-filterlist-title' ) };
- filters.forEach( function ( data ) {
- var i,
- group = data.name;
-
- if ( !model.groups[ group ] ) {
- model.groups[ group ] = new mw.rcfilters.dm.FilterGroup( group, {
- type: data.type,
- title: data.title ? mw.msg( data.title ) : group,
- separator: data.separator,
- fullCoverage: !!data.fullCoverage,
- whatsThis: {
- body: data.whatsThisBody,
- header: data.whatsThisHeader,
- linkText: data.whatsThisLinkText,
- url: data.whatsThisUrl
- }
- } );
- }
+ // Clone
+ filterGroups = OO.copy( filterGroups );
+
+ // Normalize definition from the server
+ filterGroups.forEach( function ( data ) {
+ var i;
+ // What's this information needs to be normalized
+ data.whatsThis = {
+ body: data.whatsThisBody,
+ header: data.whatsThisHeader,
+ linkText: data.whatsThisLinkText,
+ url: data.whatsThisUrl
+ };
+
+ // Title is a msg-key
+ data.title = data.title ? mw.msg( data.title ) : data.name;
// Filters are given to us with msg-keys, we need
// to translate those before we hand them off
data.filters[ i ].label = data.filters[ i ].label ? mw.msg( data.filters[ i ].label ) : data.filters[ i ].name;
data.filters[ i ].description = data.filters[ i ].description ? mw.msg( data.filters[ i ].description ) : '';
}
+ } );
- model.groups[ group ].initializeFilters( data.filters, data.default );
- items = items.concat( model.groups[ group ].getItems() );
-
- // Prepare conflicts
- if ( data.conflicts ) {
- // Group conflicts
- groupConflictMap[ group ] = data.conflicts;
+ // Collect views
+ allViews = {
+ 'default': {
+ label: mw.msg( 'rcfilters-filterlist-title' ),
+ groups: filterGroups
}
+ };
- for ( i = 0; i < data.filters.length; i++ ) {
- // Filter conflicts
- if ( data.filters[ i ].conflicts ) {
- filterItem = model.groups[ group ].getItemByParamName( data.filters[ i ].name );
- filterConflictMap[ filterItem.getName() ] = data.filters[ i ].conflicts;
- }
- }
- } );
+ if ( views && mw.config.get( 'wgStructuredChangeFiltersEnableExperimentalViews' ) ) {
+ // If we have extended views, add them in
+ $.extend( true, allViews, views );
+ }
- 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
- } );
- } );
+ // Go over all views
+ $.each( allViews, function ( viewName, viewData ) {
+ // Define the view
+ model.views[ viewName ] = {
+ name: viewData.name,
+ title: viewData.title,
+ trigger: viewData.trigger
+ };
- // 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() );
- }
+ // Go over groups
+ viewData.groups.forEach( function ( groupData ) {
+ var group = groupData.name;
- 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
- }
- );
+ model.groups[ group ] = new mw.rcfilters.dm.FilterGroup(
+ group,
+ $.extend( true, {}, groupData, { view: viewName } )
+ );
- // Add tag items to group
- model.groups.tagfilter.initializeFilters( tags );
+ model.groups[ group ].initializeFilters( groupData.filters, groupData.default );
+ items = items.concat( model.groups[ group ].getItems() );
- // Add item references to the model, for lookup
- items = items.concat( model.groups.tagfilter.getItems() );
- }
+ // Prepare conflicts
+ if ( groupData.conflicts ) {
+ // Group conflicts
+ groupConflictMap[ group ] = groupData.conflicts;
+ }
+
+ groupData.filters.forEach( function ( itemData ) {
+ var filterItem = model.groups[ group ].getItemByParamName( itemData.name );
+ // Filter conflicts
+ if ( itemData.conflicts ) {
+ filterConflictMap[ filterItem.getName() ] = itemData.conflicts;
+ }
+ } );
+ } );
+ } );
// Add item references to the model, for lookup
this.addItems( items );
* @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;
};
/**