*
* @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 ) {
+ mw.rcfilters.dm.FiltersViewModel.prototype.initializeFilters = function ( filters, namespaces, tags ) {
var filterItem, filterConflictResult, groupConflictResult,
model = this,
items = [],
items = items.concat( model.groups.namespace.getItems() );
}
+ 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.tags = new mw.rcfilters.dm.FilterGroup(
+ 'tags',
+ {
+ type: 'string_options',
+ view: 'tags',
+ title: 'rcfilters-view-tags', // Message key
+ labelPrefixKey: 'rcfilters-tag-prefix-tags',
+ separator: '|',
+ fullCoverage: false
+ }
+ );
+
+ // Add tag items to group
+ model.groups.tags.initializeFilters( tags );
+
+ // Add item references to the model, for lookup
+ items = items.concat( model.groups.tags.getItems() );
+ }
+
// Add item references to the model, for lookup
this.addItems( items );
+
// Expand conflicts
groupConflictResult = expandConflictDefinitions( groupConflictMap );
filterConflictResult = expandConflictDefinitions( filterConflictMap );
groupTitle,
result = {},
flatResult = [],
- view = query.indexOf( this.getViewTrigger( 'namespaces' ) ) === 0 ? 'namespaces' : 'default',
+ view = this.getViewByTrigger( query.substr( 0, 1 ) ),
items = this.getFiltersByView( view );
// Normalize so we can search strings regardless of case and view
query = query.toLowerCase();
- if ( view === 'namespaces' ) {
+ if ( view !== 'default' ) {
query = query.substr( 1 );
}
for ( i = 0; i < items.length; i++ ) {
if (
searchIsEmpty ||
- items[ i ].getLabel().toLowerCase().indexOf( query ) === 0
+ items[ i ].getLabel().toLowerCase().indexOf( query ) === 0 ||
+ (
+ // For tags, we want the parameter name to be included in the search
+ view === 'tags' &&
+ items[ i ].getParamName().toLowerCase().indexOf( query ) > -1
+ )
) {
result[ items[ i ].getGroupName() ] = result[ items[ i ].getGroupName() ] || [];
result[ items[ i ].getGroupName() ].push( items[ i ] );
searchIsEmpty ||
items[ i ].getLabel().toLowerCase().indexOf( query ) > -1 ||
items[ i ].getDescription().toLowerCase().indexOf( query ) > -1 ||
- groupTitle.toLowerCase().indexOf( query ) > -1
+ groupTitle.toLowerCase().indexOf( query ) > -1 ||
+ (
+ // For tags, we want the parameter name to be included in the search
+ view === 'tags' &&
+ items[ i ].getParamName().toLowerCase().indexOf( query ) > -1
+ )
) {
result[ items[ i ].getGroupName() ] = result[ items[ i ].getGroupName() ] || [];
result[ items[ i ].getGroupName() ].push( items[ i ] );
return this.views[ this.getCurrentView() ].label;
};
+ /**
+ * Get an array of all available view names
+ *
+ * @return {string} Available view names
+ */
+ mw.rcfilters.dm.FiltersViewModel.prototype.getAvailableViews = function () {
+ return Object.keys( this.views );
+ };
+
+ /**
+ * Get the view that fits the given trigger
+ *
+ * @param {string} trigger Trigger
+ * @return {string} Name of view
+ */
+ mw.rcfilters.dm.FiltersViewModel.prototype.getViewByTrigger = function ( trigger ) {
+ var result = 'default';
+
+ $.each( this.views, function ( name, data ) {
+ if ( data.trigger === trigger ) {
+ result = name;
+ }
+ } );
+
+ return result;
+ };
+
/**
* Toggle the highlight feature on and off.
* Propagate the change to filter items.