* @param {Array} filters Filter group definition
*/
mw.rcfilters.dm.FiltersViewModel.prototype.initializeFilters = function ( filters ) {
- var i, filterItem, selectedFilterNames, filterConflictResult, groupConflictResult, subsetNames,
+ var i, filterItem, filterConflictResult, groupConflictResult, subsetNames,
model = this,
items = [],
supersetMap = {},
type: data.type,
title: mw.msg( data.title ),
separator: data.separator,
- fullCoverage: !!data.fullCoverage
+ fullCoverage: !!data.fullCoverage,
+ whatsThis: {
+ body: data.whatsThisBody,
+ header: data.whatsThisHeader,
+ linkText: data.whatsThisLinkText,
+ url: data.whatsThisUrl
+ }
} );
}
groupConflictMap[ group ] = data.conflicts;
}
- selectedFilterNames = [];
for ( i = 0; i < data.filters.length; i++ ) {
data.filters[ i ].subset = data.filters[ i ].subset || [];
data.filters[ i ].subset = data.filters[ i ].subset.map( function ( el ) {
// Store the default parameter state
// For this group type, parameter values are direct
model.defaultParams[ data.filters[ i ].name ] = Number( !!data.filters[ i ].default );
- } else if (
- data.type === 'string_options' &&
- data.filters[ i ].default
- ) {
- selectedFilterNames.push( data.filters[ i ].name );
}
model.groups[ group ].addItems( filterItem );
items.push( filterItem );
}
- if ( data.type === 'string_options' ) {
+ if ( data.type === 'string_options' && data.default ) {
// Store the default parameter group state
// For this group, the parameter is group name and value is the names
// of selected items
- model.defaultParams[ group ] = model.sanitizeStringOptionGroup( group, selectedFilterNames ).join( model.groups[ group ].getSeparator() );
+ model.defaultParams[ group ] = model.sanitizeStringOptionGroup(
+ group,
+ data.default.split( model.groups[ group ].getSeparator() )
+ ).join( model.groups[ group ].getSeparator() );
}
} );
* Analyze the groups and their filters and output an object representing
* the state of the parameters they represent.
*
- * @param {Object} [filterGroups] An object defining the filter groups to
- * translate to parameters. Its structure must follow that of this.groups
- * see #getFilterGroups
+ * @param {Object} [filterDefinition] An object defining the filter values,
+ * keyed by filter names.
* @return {Object} Parameter state object
*/
- mw.rcfilters.dm.FiltersViewModel.prototype.getParametersFromFilters = function ( filterGroups ) {
- var result = {},
- groupItems = filterGroups || this.getFilterGroups();
+ mw.rcfilters.dm.FiltersViewModel.prototype.getParametersFromFilters = function ( filterDefinition ) {
+ var groupItemDefinition,
+ result = {},
+ groupItems = this.getFilterGroups();
+
+ if ( filterDefinition ) {
+ groupItemDefinition = {};
+ // Filter definition is "flat", but in effect
+ // each group needs to tell us its result based
+ // on the values in it. We need to split this list
+ // back into groupings so we can "feed" it to the
+ // loop below, and we need to expand it so it includes
+ // all filters (set to false)
+ this.getItems().forEach( function ( filterItem ) {
+ groupItemDefinition[ filterItem.getGroupName() ] = groupItemDefinition[ filterItem.getGroupName() ] || {};
+ groupItemDefinition[ filterItem.getGroupName() ][ filterItem.getName() ] = !!filterDefinition[ filterItem.getName() ];
+ } );
+ }
$.each( groupItems, function ( group, model ) {
- $.extend( result, model.getParamRepresentation() );
+ $.extend(
+ result,
+ model.getParamRepresentation(
+ groupItemDefinition ?
+ groupItemDefinition[ group ] : null
+ )
+ );
} );
return result;
* @param {string[]} valueArray Array of values
* @return {string[]} Array of valid values
*/
- mw.rcfilters.dm.FiltersViewModel.prototype.sanitizeStringOptionGroup = function( groupName, valueArray ) {
+ mw.rcfilters.dm.FiltersViewModel.prototype.sanitizeStringOptionGroup = function ( groupName, valueArray ) {
var result = [],
validNames = this.getGroupFilters( groupName ).map( function ( filterItem ) {
return filterItem.getParamName();
paramValues.length === model.groups[ group ].getItemCount()
) ?
// All true (either because all values are written or the term 'all' is written)
- // is the same as all filters set to false
- false :
+ // is the same as all filters set to true
+ true :
// Otherwise, the filter is selected only if it appears in the parameter values
paramValues.indexOf( filterItem.getParamName() ) > -1;
}
* Find items whose labels match the given string
*
* @param {string} query Search string
+ * @param {boolean} [returnFlat] Return a flat array. If false, the result
+ * is an object whose keys are the group names and values are an array of
+ * filters per group. If set to true, returns an array of filters regardless
+ * of their groups.
* @return {Object} An object of items to show
* arranged by their group names
*/
- mw.rcfilters.dm.FiltersViewModel.prototype.findMatches = function ( query ) {
+ mw.rcfilters.dm.FiltersViewModel.prototype.findMatches = function ( query, returnFlat ) {
var i,
groupTitle,
result = {},
+ flatResult = [],
items = this.getItems();
// Normalize so we can search strings regardless of case
if ( items[ i ].getLabel().toLowerCase().indexOf( query ) === 0 ) {
result[ items[ i ].getGroupName() ] = result[ items[ i ].getGroupName() ] || [];
result[ items[ i ].getGroupName() ].push( items[ i ] );
+ flatResult.push( items[ i ] );
}
}
) {
result[ items[ i ].getGroupName() ] = result[ items[ i ].getGroupName() ] || [];
result[ items[ i ].getGroupName() ].push( items[ i ] );
+ flatResult.push( items[ i ] );
}
}
}
- return result;
+ return returnFlat ? flatResult : result;
};
/**