Merge "Convert article delete to use OOUI"
[lhc/web/wiklou.git] / includes / specialpage / ChangesListSpecialPage.php
index 27e278b..8c4cc11 100644 (file)
@@ -92,8 +92,8 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                                'showHideSuffix' => 'showhideliu',
                                                'default' => false,
                                                'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
-                                                       &$query_options, &$join_conds ) {
-
+                                                       &$query_options, &$join_conds
+                                               ) {
                                                        $conds[] = 'rc_user = 0';
                                                },
                                                'cssClassSuffix' => 'liu',
@@ -111,8 +111,8 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                                'showHideSuffix' => 'showhideanons',
                                                'default' => false,
                                                'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
-                                                       &$query_options, &$join_conds ) {
-
+                                                       &$query_options, &$join_conds
+                                               ) {
                                                        $conds[] = 'rc_user != 0';
                                                },
                                                'cssClassSuffix' => 'anon',
@@ -182,8 +182,8 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                                'showHideSuffix' => 'showhidemine',
                                                'default' => false,
                                                'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
-                                                       &$query_options, &$join_conds ) {
-
+                                                       &$query_options, &$join_conds
+                                               ) {
                                                        $user = $ctx->getUser();
                                                        $conds[] = 'rc_user_text != ' . $dbr->addQuotes( $user->getName() );
                                                },
@@ -198,8 +198,8 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                                'description' => 'rcfilters-filter-editsbyother-description',
                                                'default' => false,
                                                'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
-                                                       &$query_options, &$join_conds ) {
-
+                                                       &$query_options, &$join_conds
+                                               ) {
                                                        $user = $ctx->getUser();
                                                        $conds[] = 'rc_user_text = ' . $dbr->addQuotes( $user->getName() );
                                                },
@@ -225,8 +225,8 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                                'showHideSuffix' => 'showhidebots',
                                                'default' => false,
                                                'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
-                                                       &$query_options, &$join_conds ) {
-
+                                                       &$query_options, &$join_conds
+                                               ) {
                                                        $conds[] = 'rc_bot = 0';
                                                },
                                                'cssClassSuffix' => 'bot',
@@ -240,8 +240,8 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                                'description' => 'rcfilters-filter-humans-description',
                                                'default' => false,
                                                'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
-                                                       &$query_options, &$join_conds ) {
-
+                                                       &$query_options, &$join_conds
+                                               ) {
                                                        $conds[] = 'rc_bot = 1';
                                                },
                                                'cssClassSuffix' => 'human',
@@ -255,79 +255,79 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                        // reviewStatus (conditional)
 
                        [
-                               'name' => 'lastRevision',
-                               'title' => 'rcfilters-filtergroup-lastRevision',
+                               'name' => 'significance',
+                               'title' => 'rcfilters-filtergroup-significance',
                                'class' => ChangesListBooleanFilterGroup::class,
-                               'priority' => -7,
+                               'priority' => -6,
                                'filters' => [
                                        [
-                                               'name' => 'hidelastrevision',
-                                               'label' => 'rcfilters-filter-lastrevision-label',
-                                               'description' => 'rcfilters-filter-lastrevision-description',
+                                               'name' => 'hideminor',
+                                               'label' => 'rcfilters-filter-minor-label',
+                                               'description' => 'rcfilters-filter-minor-description',
+                                               // rcshowhideminor-show, rcshowhideminor-hide,
+                                               // wlshowhideminor
+                                               'showHideSuffix' => 'showhideminor',
                                                'default' => false,
                                                'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
-                                                       &$query_options, &$join_conds ) {
-                                                       $conds[] = 'rc_this_oldid <> page_latest';
+                                                       &$query_options, &$join_conds
+                                               ) {
+                                                       $conds[] = 'rc_minor = 0';
                                                },
-                                               'cssClassSuffix' => 'last',
+                                               'cssClassSuffix' => 'minor',
                                                'isRowApplicableCallable' => function ( $ctx, $rc ) {
-                                                       return $rc->getAttribute( 'rc_this_oldid' ) === $rc->getAttribute( 'page_latest' );
+                                                       return $rc->getAttribute( 'rc_minor' );
                                                }
                                        ],
                                        [
-                                               'name' => 'hidepreviousrevisions',
-                                               'label' => 'rcfilters-filter-previousrevision-label',
-                                               'description' => 'rcfilters-filter-previousrevision-description',
+                                               'name' => 'hidemajor',
+                                               'label' => 'rcfilters-filter-major-label',
+                                               'description' => 'rcfilters-filter-major-description',
                                                'default' => false,
                                                'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
-                                                       &$query_options, &$join_conds ) {
-                                                       $conds[] = 'rc_this_oldid = page_latest';
+                                                       &$query_options, &$join_conds
+                                               ) {
+                                                       $conds[] = 'rc_minor = 1';
                                                },
-                                               'cssClassSuffix' => 'previous',
+                                               'cssClassSuffix' => 'major',
                                                'isRowApplicableCallable' => function ( $ctx, $rc ) {
-                                                       return $rc->getAttribute( 'rc_this_oldid' ) !== $rc->getAttribute( 'page_latest' );
+                                                       return !$rc->getAttribute( 'rc_minor' );
                                                }
                                        ]
                                ]
                        ],
 
                        [
-                               'name' => 'significance',
-                               'title' => 'rcfilters-filtergroup-significance',
+                               'name' => 'lastRevision',
+                               'title' => 'rcfilters-filtergroup-lastRevision',
                                'class' => ChangesListBooleanFilterGroup::class,
-                               'priority' => -6,
+                               'priority' => -7,
                                'filters' => [
                                        [
-                                               'name' => 'hideminor',
-                                               'label' => 'rcfilters-filter-minor-label',
-                                               'description' => 'rcfilters-filter-minor-description',
-                                               // rcshowhideminor-show, rcshowhideminor-hide,
-                                               // wlshowhideminor
-                                               'showHideSuffix' => 'showhideminor',
+                                               'name' => 'hidelastrevision',
+                                               'label' => 'rcfilters-filter-lastrevision-label',
+                                               'description' => 'rcfilters-filter-lastrevision-description',
                                                'default' => false,
                                                'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
                                                        &$query_options, &$join_conds ) {
-
-                                                       $conds[] = 'rc_minor = 0';
+                                                       $conds[] = 'rc_this_oldid <> page_latest';
                                                },
-                                               'cssClassSuffix' => 'minor',
+                                               'cssClassSuffix' => 'last',
                                                'isRowApplicableCallable' => function ( $ctx, $rc ) {
-                                                       return $rc->getAttribute( 'rc_minor' );
+                                                       return $rc->getAttribute( 'rc_this_oldid' ) === $rc->getAttribute( 'page_latest' );
                                                }
                                        ],
                                        [
-                                               'name' => 'hidemajor',
-                                               'label' => 'rcfilters-filter-major-label',
-                                               'description' => 'rcfilters-filter-major-description',
+                                               'name' => 'hidepreviousrevisions',
+                                               'label' => 'rcfilters-filter-previousrevision-label',
+                                               'description' => 'rcfilters-filter-previousrevision-description',
                                                'default' => false,
                                                'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
                                                        &$query_options, &$join_conds ) {
-
-                                                       $conds[] = 'rc_minor = 1';
+                                                       $conds[] = 'rc_this_oldid = page_latest';
                                                },
-                                               'cssClassSuffix' => 'major',
+                                               'cssClassSuffix' => 'previous',
                                                'isRowApplicableCallable' => function ( $ctx, $rc ) {
-                                                       return !$rc->getAttribute( 'rc_minor' );
+                                                       return $rc->getAttribute( 'rc_this_oldid' ) !== $rc->getAttribute( 'page_latest' );
                                                }
                                        ]
                                ]
@@ -347,8 +347,8 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                                'default' => false,
                                                'priority' => -2,
                                                'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
-                                                       &$query_options, &$join_conds ) {
-
+                                                       &$query_options, &$join_conds
+                                               ) {
                                                        $conds[] = 'rc_type != ' . $dbr->addQuotes( RC_EDIT );
                                                },
                                                'cssClassSuffix' => 'src-mw-edit',
@@ -363,8 +363,8 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                                'default' => false,
                                                'priority' => -3,
                                                'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
-                                                       &$query_options, &$join_conds ) {
-
+                                                       &$query_options, &$join_conds
+                                               ) {
                                                        $conds[] = 'rc_type != ' . $dbr->addQuotes( RC_NEW );
                                                },
                                                'cssClassSuffix' => 'src-mw-new',
@@ -382,8 +382,8 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                                'default' => false,
                                                'priority' => -5,
                                                'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
-                                                       &$query_options, &$join_conds ) {
-
+                                                       &$query_options, &$join_conds
+                                               ) {
                                                        $conds[] = 'rc_type != ' . $dbr->addQuotes( RC_LOG );
                                                },
                                                'cssClassSuffix' => 'src-mw-log',
@@ -412,8 +412,8 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                                'showHideSuffix' => 'showhidepatr',
                                                'default' => false,
                                                'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
-                                                       &$query_options, &$join_conds ) {
-
+                                                       &$query_options, &$join_conds
+                                               ) {
                                                        $conds[] = 'rc_patrolled = 0';
                                                },
                                                'cssClassSuffix' => 'patrolled',
@@ -427,8 +427,8 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                                'description' => 'rcfilters-filter-unpatrolled-description',
                                                'default' => false,
                                                'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
-                                                       &$query_options, &$join_conds ) {
-
+                                                       &$query_options, &$join_conds
+                                               ) {
                                                        $conds[] = 'rc_patrolled = 1';
                                                },
                                                'cssClassSuffix' => 'unpatrolled',
@@ -450,8 +450,8 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                        'default' => false,
                        'priority' => -4,
                        'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
-                               &$query_options, &$join_conds ) {
-
+                               &$query_options, &$join_conds
+                       ) {
                                $conds[] = 'rc_type != ' . $dbr->addQuotes( RC_CATEGORIZE );
                        },
                        'cssClassSuffix' => 'src-mw-categorize',
@@ -470,7 +470,6 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                $opts = $this->getOptions();
                /** @var ChangesListFilterGroup $group */
                foreach ( $this->getFilterGroups() as $group ) {
-
                        if ( $group->getConflictingGroups() ) {
                                wfLogWarning(
                                        $group->getName() .
@@ -487,7 +486,6 @@ abstract class ChangesListSpecialPage extends SpecialPage {
 
                        /** @var ChangesListFilter $filter */
                        foreach ( $group->getFilters() as $filter ) {
-
                                /** @var ChangesListFilter $conflictingFilter */
                                foreach ( $filter->getConflictingFilters() as $conflictingFilter ) {
                                        if (
@@ -791,16 +789,18 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                $config = $this->getConfig();
                $opts = new FormOptions();
                $structuredUI = $this->getUser()->getOption( 'rcenhancedfilters' );
+               // 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
                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(), $filterGroup->getDefault() );
+                               $opts->add( $filterGroup->getName(), $useDefaults ? $filterGroup->getDefault() : '' );
                        } else {
                                foreach ( $filterGroup->getFilters() as $filter ) {
-                                       $opts->add( $filter->getName(), $filter->getDefault( $structuredUI ) );
+                                       $opts->add( $filter->getName(), $useDefaults ? $filter->getDefault( $structuredUI ) : false );
                                }
                        }
                }
@@ -808,6 +808,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                $opts->add( 'namespace', '', FormOptions::STRING );
                $opts->add( 'invert', false );
                $opts->add( 'associated', false );
+               $opts->add( 'urlversion', 1 );
 
                return $opts;
        }
@@ -973,13 +974,17 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         * @return bool True if any option was reset
         */
        private function fixContradictoryOptions( FormOptions $opts ) {
-               $contradictorySets = [];
-
                $fixed = $this->fixBackwardsCompatibilityOptions( $opts );
 
                foreach ( $this->filterGroups as $filterGroup ) {
                        if ( $filterGroup instanceof ChangesListBooleanFilterGroup ) {
                                $filters = $filterGroup->getFilters();
+
+                               if ( count( $filters ) === 1 ) {
+                                       // legacy boolean filters should not be considered
+                                       continue;
+                               }
+
                                $allInGroupEnabled = array_reduce(
                                        $filters,
                                        function ( $carry, $filter ) use ( $opts ) {
@@ -990,7 +995,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
 
                                if ( $allInGroupEnabled ) {
                                        foreach ( $filters as $filter ) {
-                                               $opts->reset( $filter->getName() );
+                                               $opts[ $filter->getName() ] = false;
                                        }
 
                                        $fixed = true;
@@ -1022,7 +1027,6 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                }
 
                return false;
-
        }
 
        /**
@@ -1055,8 +1059,8 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         * @param FormOptions $opts
         */
        protected function buildQuery( &$tables, &$fields, &$conds, &$query_options,
-               &$join_conds, FormOptions $opts ) {
-
+               &$join_conds, FormOptions $opts
+       ) {
                $dbr = $this->getDB();
                $user = $this->getUser();
 
@@ -1079,7 +1083,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
 
                // Namespace filtering
                if ( $opts[ 'namespace' ] !== '' ) {
-                       $namespaces = explode( ',', $opts[ 'namespace' ] );
+                       $namespaces = explode( ';', $opts[ 'namespace' ] );
 
                        if ( $opts[ 'associated' ] ) {
                                $associatedNamespaces = array_map(
@@ -1115,8 +1119,8 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         * @return bool|ResultWrapper Result or false
         */
        protected function doMainQuery( $tables, $fields, $conds,
-               $query_options, $join_conds, FormOptions $opts ) {
-
+               $query_options, $join_conds, FormOptions $opts
+       ) {
                $tables[] = 'recentchanges';
                $fields = array_merge( RecentChange::selectFields(), $fields );
 
@@ -1283,9 +1287,14 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                $legend .= Html::closeElement( 'dl' ) . "\n";
 
                # Collapsibility
+               $legendHeading = $this->getUser()->getOption(
+                       'rcenhancedfilters'
+               ) ?
+                       $context->msg( 'rcfilters-legend-heading' )->parse() :
+                       $context->msg( 'recentchanges-legend-heading' )->parse();
                $legend =
                        '<div class="mw-changeslist-legend">' .
-                               $context->msg( 'recentchanges-legend-heading' )->parse() .
+                               $legendHeading .
                                '<div class="mw-collapsible-content">' . $legend . '</div>' .
                        '</div>';
 
@@ -1326,8 +1335,8 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         *   (optional)
         */
        public function filterOnUserExperienceLevel( $specialPageClassName, $context, $dbr,
-               &$tables, &$fields, &$conds, &$query_options, &$join_conds, $selectedExpLevels, $now = 0 ) {
-
+               &$tables, &$fields, &$conds, &$query_options, &$join_conds, $selectedExpLevels, $now = 0
+       ) {
                global $wgLearnerEdits,
                        $wgExperiencedUserEdits,
                        $wgLearnerMemberSince,
@@ -1355,7 +1364,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                $aboveNewcomer = $dbr->makeList(
                        [
                                'user_editcount >= ' . intval( $wgLearnerEdits ),
-                               'user_registration <= ' . $dbr->timestamp( $learnerCutoff ),
+                               'user_registration <= ' . $dbr->addQuotes( $dbr->timestamp( $learnerCutoff ) ),
                        ],
                        IDatabase::LIST_AND
                );
@@ -1363,7 +1372,8 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                $aboveLearner = $dbr->makeList(
                        [
                                'user_editcount >= ' . intval( $wgExperiencedUserEdits ),
-                               'user_registration <= ' . $dbr->timestamp( $experiencedUserCutoff ),
+                               'user_registration <= ' .
+                                       $dbr->addQuotes( $dbr->timestamp( $experiencedUserCutoff ) ),
                        ],
                        IDatabase::LIST_AND
                );