RCFilters: Unify reading filters by views and adjust unit tests
[lhc/web/wiklou.git] / resources / src / mediawiki.rcfilters / mw.rcfilters.Controller.js
index c5672ae..7b95b2e 100644 (file)
         * Initialize the filter and parameter states
         *
         * @param {Array} filterStructure Filter definition and structure for the model
+        * @param {Object} [namespaceStructure] Namespace definition
+        * @param {Object} [tagList] Tag definition
         */
-       mw.rcfilters.Controller.prototype.initialize = function ( filterStructure ) {
+       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',
+                                       type: 'string_options',
+                                       title: mw.msg( 'namespaces' ),
+                                       labelPrefixKey: { 'default': 'rcfilters-tag-prefix-namespace', inverted: 'rcfilters-tag-prefix-namespace-inverted' },
+                                       separator: ';',
+                                       fullCoverage: true,
+                                       filters: items
+                               } ]
+                       };
+               }
+               if ( tagList ) {
+                       views.tags = {
+                               title: mw.msg( 'rcfilters-view-tags' ),
+                               trigger: '#',
+                               groups: [ {
+                                       // Group definition (single group)
+                                       name: 'tagfilter', // Parameter name
+                                       type: 'string_options',
+                                       title: 'rcfilters-view-tags', // Message key
+                                       labelPrefixKey: 'rcfilters-tag-prefix-tags',
+                                       separator: '|',
+                                       fullCoverage: false,
+                                       filters: tagList
+                               } ]
+                       };
+               }
+
                // Initialize the model
-               this.filtersModel.initializeFilters( filterStructure );
+               this.filtersModel.initializeFilters( filterStructure, views );
 
                this._buildBaseFilterState();
+
                this.uriProcessor = new mw.rcfilters.UriProcessor(
                        this.filtersModel
                );
                                $( 'fieldset.rcoptions' ).first()
                        );
                }
+
                this.initializing = false;
+               this.switchView( 'default' );
+       };
+
+       /**
+        * Switch the view of the filters model
+        *
+        * @param {string} view Requested view
+        */
+       mw.rcfilters.Controller.prototype.switchView = function ( view ) {
+               this.filtersModel.switchView( view );
        };
 
        /**
                }
        };
 
+       /**
+        * Toggle the namespaces inverted feature on and off
+        */
+       mw.rcfilters.Controller.prototype.toggleInvertedNamespaces = function () {
+               this.filtersModel.toggleInvertedNamespaces();
+               this.updateChangesList();
+       };
+
        /**
         * Set the highlight color for a filter item
         *
                        label || mw.msg( 'rcfilters-savedqueries-defaultlabel' ),
                        {
                                filters: this.filtersModel.getSelectedState(),
-                               highlights: highlightedItems
+                               highlights: highlightedItems,
+                               invert: this.filtersModel.areNamespacesInverted()
                        }
                );
 
                        // Update model state from filters
                        this.filtersModel.toggleFiltersSelected( data.filters );
 
+                       // Update namespace inverted property
+                       this.filtersModel.toggleInvertedNamespaces( !!Number( data.invert ) );
+
                        // Update highlight state
                        this.filtersModel.toggleHighlight( !!Number( highlights.highlight ) );
                        this.filtersModel.getItems().forEach( function ( filterItem ) {
                return this.savedQueriesModel.findMatchingQuery(
                        {
                                filters: this.filtersModel.getSelectedState(),
-                               highlights: highlightedItems
+                               highlights: highlightedItems,
+                               invert: this.filtersModel.areNamespacesInverted()
                        }
                );
        };
 
                this.baseFilterState = {
                        filters: this.filtersModel.getFiltersFromParameters( defaultParams ),
-                       highlights: highlightedItems
+                       highlights: highlightedItems,
+                       invert: false
                };
        };
 
                                }
                        } );
 
-                       return $.extend( true, {}, savedParams, savedHighlights );
+                       return $.extend( true, {}, savedParams, savedHighlights, { invert: data.invert } );
                }
 
                return $.extend(
                        this.uriProcessor.getVersion( currentUri.query ) !== 2 ||
                        this.uriProcessor.isNewState( currentUri.query, updatedUri.query )
                ) {
-                       if ( this.initializing ) {
-                               // Initially, when we just build the first page load
-                               // out of defaults, we want to replace the history
-                               mw.rcfilters.UriProcessor.static.replaceState( updatedUri );
-                       } else {
-                               mw.rcfilters.UriProcessor.static.pushState( updatedUri );
-                       }
+                       mw.rcfilters.UriProcessor.static.replaceState( updatedUri );
                }
        };