Merge "Fix \n handling for HTMLUsersMultiselectField"
[lhc/web/wiklou.git] / resources / src / mediawiki.rcfilters / dm / mw.rcfilters.dm.FiltersViewModel.js
index 46f0fd8..75431d9 100644 (file)
         * Set filters and preserve a group relationship based on
         * the definition given by an object
         *
-        * @param {Array} filters Filters definition
+        * @param {Array} filterGroups Filters definition
         * @param {Object} [views] Extra views definition
         *  Expected in the following format:
         *  {
         *         {
         *            // 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
-        *            },
+        *            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,
+       mw.rcfilters.dm.FiltersViewModel.prototype.initializeFilters = function ( filterGroups, views ) {
+               var filterConflictResult, groupConflictResult,
+                       allViews = {},
                        model = this,
                        items = [],
                        groupConflictMap = {},
                this.groups = {};
                this.views = {};
 
-               views = 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': {
+                               title: 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 );
+               }
 
-               if ( mw.config.get( 'wgStructuredChangeFiltersEnableExperimentalViews' ) ) {
-                       $.each( views, function ( viewName, viewData ) {
-                               model.views[ viewName ] = {
-                                       name: viewData.name,
-                                       title: viewData.title,
-                                       trigger: viewData.trigger
-                               };
+               // Go over all views
+               $.each( allViews, function ( viewName, viewData ) {
+                       // Define the view
+                       model.views[ viewName ] = {
+                               name: viewData.name,
+                               title: viewData.title,
+                               trigger: viewData.trigger
+                       };
 
-                               // Group
-                               viewData.groups.forEach( function ( groupData ) {
-                                       model.groups[ groupData.name ] = new mw.rcfilters.dm.FilterGroup(
-                                               groupData.name,
-                                               $.extend( true, {}, groupData.definition, { view: viewName } )
+                       // Go over groups
+                       viewData.groups.forEach( function ( groupData ) {
+                               var group = groupData.name;
+
+                               if ( !model.groups[ group ] ) {
+                                       model.groups[ group ] = new mw.rcfilters.dm.FilterGroup(
+                                               group,
+                                               $.extend( true, {}, groupData, { view: viewName } )
                                        );
+                               }
+
+                               model.groups[ group ].initializeFilters( groupData.filters, groupData.default );
+                               items = items.concat( model.groups[ group ].getItems() );
 
-                                       // Add items
-                                       model.groups[ groupData.name ].initializeFilters( groupData.items );
+                               // Prepare conflicts
+                               if ( groupData.conflicts ) {
+                                       // Group conflicts
+                                       groupConflictMap[ group ] = groupData.conflicts;
+                               }
 
-                                       // Add to global search list
-                                       items = items.concat( model.groups[ groupData.name ].getItems() );
+                               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 );
                                groupModel.getItems().forEach( function ( filterItem ) {
                                        model.parameterMap[ filterItem.getParamName() ] = filterItem;
                                } );
-                       } else if ( groupModel.getType() === 'string_options' ) {
+                       } else if (
+                               groupModel.getType() === 'string_options' ||
+                               groupModel.getType() === 'single_option'
+                       ) {
                                // Group
                                model.parameterMap[ groupModel.getName() ] = groupModel;
                        }
        /**
         * Get the label for the current view
         *
+        * @param {string} viewName View name
         * @return {string} Label for the current view
         */
-       mw.rcfilters.dm.FiltersViewModel.prototype.getCurrentViewLabel = function () {
-               return this.views[ this.getCurrentView() ].title;
+       mw.rcfilters.dm.FiltersViewModel.prototype.getViewTitle = function ( viewName ) {
+               viewName = viewName || this.getCurrentView();
+
+               return this.views[ viewName ] && this.views[ viewName ].title;
        };
 
        /**