Merge "RCFilters: Have the model accept multiple views"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 23 Jun 2017 00:18:15 +0000 (00:18 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 23 Jun 2017 00:18:15 +0000 (00:18 +0000)
1  2 
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js
resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js

@@@ -20,7 -20,7 +20,7 @@@
                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();
        };