Merge "RCFilters: define consistent interface in ChangesListFilterGroup"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 18 Oct 2017 20:04:55 +0000 (20:04 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 18 Oct 2017 20:04:55 +0000 (20:04 +0000)
1  2 
includes/specialpage/ChangesListSpecialPage.php

@@@ -970,6 -970,23 +970,23 @@@ abstract class ChangesListSpecialPage e
                return $unstructuredGroupDefinition;
        }
  
+       /**
+        * @return array The legacy show/hide toggle filters
+        */
+       protected function getLegacyShowHideFilters() {
+               $filters = [];
+               foreach ( $this->filterGroups as $group ) {
+                       if ( $group instanceof  ChangesListBooleanFilterGroup ) {
+                               foreach ( $group->getFilters() as $key => $filter ) {
+                                       if ( $filter->displaysOnUnstructuredUi( $this ) ) {
+                                               $filters[ $key ] = $filter;
+                                       }
+                               }
+                       }
+               }
+               return $filters;
+       }
        /**
         * Register all the filters, including legacy hook-driven ones.
         * Then create a FormOptions object with options as specified by the user
                // If urlversion=2 is set, ignore the filter defaults and set them all to false/empty
                $useDefaults = $this->getRequest()->getInt( 'urlversion' ) !== 2;
  
-               // Add all filters
                /** @var ChangesListFilterGroup $filterGroup */
                foreach ( $this->filterGroups as $filterGroup ) {
-                       // URL parameters can be per-group, like 'userExpLevel',
-                       // or per-filter, like 'hideminor'.
-                       if ( $filterGroup->isPerGroupRequestParameter() ) {
-                               $opts->add( $filterGroup->getName(), $useDefaults ? $filterGroup->getDefault() : '' );
-                       } else {
-                               /** @var ChangesListBooleanFilter $filter */
-                               foreach ( $filterGroup->getFilters() as $filter ) {
-                                       $opts->add( $filter->getName(), $useDefaults ? $filter->getDefault( $structuredUI ) : false );
-                               }
-                       }
+                       $filterGroup->addOptions( $opts, $useDefaults, $structuredUI );
                }
  
                $opts->add( 'namespace', '', FormOptions::STRING );
                // or per-filter, like 'hideminor'.
  
                foreach ( $this->filterGroups as $filterGroup ) {
-                       if ( $filterGroup->isPerGroupRequestParameter() ) {
+                       if ( $filterGroup instanceof ChangesListStringOptionsFilterGroup ) {
                                $stringParameterNameSet[$filterGroup->getName()] = true;
-                       } elseif ( $filterGroup->getType() === ChangesListBooleanFilterGroup::TYPE ) {
+                       } elseif ( $filterGroup instanceof ChangesListBooleanFilterGroup ) {
                                foreach ( $filterGroup->getFilters() as $filter ) {
                                        $hideParameterNameSet[$filter->getName()] = true;
                                }
         * @param FormOptions $opts
         */
        public function validateOptions( FormOptions $opts ) {
 -              if ( $this->fixContradictoryOptions( $opts ) ) {
 +              $isContradictory = $this->fixContradictoryOptions( $opts );
 +              $isReplaced = $this->replaceOldOptions( $opts );
 +
 +              if ( $isContradictory || $isReplaced ) {
                        $query = wfArrayToCgi( $this->convertParamsForLink( $opts->getChangedValues() ) );
                        $this->getOutput()->redirect( $this->getPageTitle()->getCanonicalURL( $query ) );
                }
                return false;
        }
  
 +      /**
 +       * Replace old options 'hideanons' or 'hideliu' with structured UI equivalent
 +       *
 +       * @param FormOptions $opts
 +       * @return bool True if the change was made
 +       */
 +      public function replaceOldOptions( FormOptions $opts ) {
 +              if ( !$this->isStructuredFilterUiEnabled() ) {
 +                      return false;
 +              }
 +
 +              // At this point 'hideanons' and 'hideliu' cannot be both true,
 +              // because fixBackwardsCompatibilityOptions resets (at least) 'hideanons' in such case
 +              if ( $opts[ 'hideanons' ] ) {
 +                      $opts->reset( 'hideanons' );
 +                      $opts[ 'userExpLevel' ] = 'registered';
 +                      return true;
 +              }
 +
 +              if ( $opts[ 'hideliu' ] ) {
 +                      $opts->reset( 'hideliu' );
 +                      $opts[ 'userExpLevel' ] = 'unregistered';
 +                      return true;
 +              }
 +
 +              return false;
 +      }
 +
        /**
         * Convert parameters values from true/false to 1/0
         * so they are not omitted by wfArrayToCgi()
                $dbr = $this->getDB();
                $isStructuredUI = $this->isStructuredFilterUiEnabled();
  
+               /** @var ChangesListFilterGroup $filterGroup */
                foreach ( $this->filterGroups as $filterGroup ) {
-                       // URL parameters can be per-group, like 'userExpLevel',
-                       // or per-filter, like 'hideminor'.
-                       if ( $filterGroup->isPerGroupRequestParameter() ) {
-                               if ( $filterGroup->isActive( $isStructuredUI ) ) {
-                                       $filterGroup->modifyQuery( $dbr, $this, $tables, $fields, $conds,
-                                               $query_options, $join_conds, $opts[$filterGroup->getName()] );
-                               }
-                       } else {
-                               foreach ( $filterGroup->getFilters() as $filter ) {
-                                       if ( $filter->isActive( $opts, $isStructuredUI ) ) {
-                                               $filter->modifyQuery( $dbr, $this, $tables, $fields, $conds,
-                                                       $query_options, $join_conds );
-                                       }
-                               }
-                       }
+                       $filterGroup->modifyQuery( $dbr, $this, $tables, $fields, $conds,
+                               $query_options, $join_conds, $opts, $isStructuredUI );
                }
  
                // Namespace filtering