Merge "Remove space after cast"
[lhc/web/wiklou.git] / resources / src / mediawiki.rcfilters / ui / mw.rcfilters.ui.MenuSelectWidget.js
index dda4ac5..d9a1822 100644 (file)
@@ -30,6 +30,7 @@
                this.model = model;
                this.currentView = '';
                this.views = {};
+               this.userSelecting = false;
 
                this.inputValue = '';
                this.$overlay = config.$overlay || this.$element;
                // based on view
                config.footers = config.footers || [];
                config.footers.forEach( function ( footerData ) {
-                       var adjustedData = {
-                               // Wrap the element with our own footer wrapper
-                               $element: $( '<div>' )
-                                       .addClass( 'mw-rcfilters-ui-menuSelectWidget-footer' )
-                                       .addClass( 'mw-rcfilters-ui-menuSelectWidget-footer-' + footerData.name )
-                                       .append( footerData.$element ),
-                               views: footerData.views
-                       };
-
-                       this.footers.push( adjustedData );
-                       this.$element.append( adjustedData.$element );
+                       var isSticky = footerData.sticky === undefined ? true : !!footerData.sticky,
+                               adjustedData = {
+                                       // Wrap the element with our own footer wrapper
+                                       $element: $( '<div>' )
+                                               .addClass( 'mw-rcfilters-ui-menuSelectWidget-footer' )
+                                               .addClass( 'mw-rcfilters-ui-menuSelectWidget-footer-' + footerData.name )
+                                               .append( footerData.$element ),
+                                       views: footerData.views
+                               };
+
+                       if ( !footerData.disabled ) {
+                               this.footers.push( adjustedData );
+
+                               if ( isSticky ) {
+                                       this.$element.append( adjustedData.$element );
+                               } else {
+                                       this.$body.append( adjustedData.$element );
+                               }
+                       }
                }.bind( this ) );
 
                // Switch to the correct view
 
                // Count groups per view
                $.each( groups, function ( groupName, groupModel ) {
-                       viewGroupCount[ groupModel.getView() ] = viewGroupCount[ groupModel.getView() ] || 0;
-                       viewGroupCount[ groupModel.getView() ]++;
+                       if ( !groupModel.isHidden() ) {
+                               viewGroupCount[ groupModel.getView() ] = viewGroupCount[ groupModel.getView() ] || 0;
+                               viewGroupCount[ groupModel.getView() ]++;
+                       }
                } );
 
                $.each( groups, function ( groupName, groupModel ) {
                        var currentItems = [],
                                view = groupModel.getView();
 
-                       if ( viewGroupCount[ view ] > 1 ) {
-                               // Only add a section header if there is more than
-                               // one group
-                               currentItems.push(
-                                       // Group section
-                                       new mw.rcfilters.ui.FilterMenuSectionOptionWidget(
-                                               widget.controller,
-                                               groupModel,
-                                               {
-                                                       $overlay: widget.$overlay
-                                               }
-                                       )
-                               );
-                       }
+                       if ( !groupModel.isHidden() ) {
+                               if ( viewGroupCount[ view ] > 1 ) {
+                                       // Only add a section header if there is more than
+                                       // one group
+                                       currentItems.push(
+                                               // Group section
+                                               new mw.rcfilters.ui.FilterMenuSectionOptionWidget(
+                                                       widget.controller,
+                                                       groupModel,
+                                                       {
+                                                               $overlay: widget.$overlay
+                                                       }
+                                               )
+                                       );
+                               }
 
-                       // Add items
-                       widget.model.getGroupFilters( groupName ).forEach( function ( filterItem ) {
-                               currentItems.push(
-                                       new mw.rcfilters.ui.FilterMenuOptionWidget(
-                                               widget.controller,
-                                               filterItem,
-                                               {
-                                                       $overlay: widget.$overlay
-                                               }
-                                       )
-                               );
-                       } );
-
-                       // Cache the items per view, so we can switch between them
-                       // without rebuilding the widgets each time
-                       widget.views[ view ] = widget.views[ view ] || [];
-                       widget.views[ view ] = widget.views[ view ].concat( currentItems );
+                               // Add items
+                               widget.model.getGroupFilters( groupName ).forEach( function ( filterItem ) {
+                                       currentItems.push(
+                                               new mw.rcfilters.ui.FilterMenuOptionWidget(
+                                                       widget.controller,
+                                                       filterItem,
+                                                       {
+                                                               $overlay: widget.$overlay
+                                                       }
+                                               )
+                                       );
+                               } );
+
+                               // Cache the items per view, so we can switch between them
+                               // without rebuilding the widgets each time
+                               widget.views[ view ] = widget.views[ view ] || [];
+                               widget.views[ view ] = widget.views[ view ].concat( currentItems );
+                       }
                } );
 
                this.switchView( this.model.getCurrentView() );
 
                // Since the method hides/shows items, we don't want to
                // call it unless the input actually changed
-               if ( this.inputValue !== inputVal ) {
+               if (
+                       !this.userSelecting &&
+                       this.inputValue !== inputVal
+               ) {
                        // Parent method
                        mw.rcfilters.ui.MenuSelectWidget.parent.prototype.updateItemVisibility.call( this );
 
        mw.rcfilters.ui.MenuSelectWidget.prototype.scrollToTop = function () {
                this.$body.scrollTop( 0 );
        };
+
+       /**
+        * Set whether the user is currently selecting an item.
+        * This is important when the user selects an item that is in between
+        * different views, and makes sure we do not re-select a different
+        * item (like the item on top) when this is happening.
+        *
+        * @param {boolean} isSelecting User is selecting
+        */
+       mw.rcfilters.ui.MenuSelectWidget.prototype.setUserSelecting = function ( isSelecting ) {
+               this.userSelecting = !!isSelecting;
+       };
 }( mediaWiki ) );