Merge "RCFilters: rephrase the feedback link text"
[lhc/web/wiklou.git] / includes / specials / SpecialWatchlist.php
index b20b331..0dd66b0 100644 (file)
@@ -97,6 +97,8 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                parent::execute( $subpage );
 
                if ( $this->isStructuredFilterUiEnabled() ) {
+                       $output->addModuleStyles( [ 'mediawiki.rcfilters.highlightCircles.seenunseen.styles' ] );
+
                        $output->addJsConfigVars( 'wgStructuredChangeFiltersLiveUpdateSupported', false );
                        $output->addJsConfigVars(
                                'wgStructuredChangeFiltersSavedQueriesPreferenceName',
@@ -142,6 +144,40 @@ class SpecialWatchlist extends ChangesListSpecialPage {
        protected function registerFilters() {
                parent::registerFilters();
 
+               // legacy 'extended' filter
+               $this->registerFilterGroup( new ChangesListBooleanFilterGroup( [
+                       'name' => 'extended-group',
+                       'filters' => [
+                               [
+                                       'name' => 'extended',
+                                       'isReplacedInStructuredUi' => true,
+                                       'activeValue' => false,
+                                       'default' => $this->getUser()->getBoolOption( 'extendwatchlist' ),
+                                       'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables,
+                                                                                                 &$fields, &$conds, &$query_options, &$join_conds ) {
+                                               $nonRevisionTypes = [ RC_LOG ];
+                                               Hooks::run( 'SpecialWatchlistGetNonRevisionTypes', [ &$nonRevisionTypes ] );
+                                               if ( $nonRevisionTypes ) {
+                                                       $conds[] = $dbr->makeList(
+                                                               [
+                                                                       'rc_this_oldid=page_latest',
+                                                                       'rc_type' => $nonRevisionTypes,
+                                                               ],
+                                                               LIST_OR
+                                                       );
+                                               }
+                                       },
+                               ]
+                       ],
+
+               ] ) );
+
+               if ( $this->isStructuredFilterUiEnabled() ) {
+                       $this->getFilterGroup( 'lastRevision' )
+                               ->getFilter( 'hidepreviousrevisions' )
+                               ->setDefault( !$this->getUser()->getBoolOption( 'extendwatchlist' ) );
+               }
+
                $this->registerFilterGroup( new ChangesListStringOptionsFilterGroup( [
                        'name' => 'watchlistactivity',
                        'title' => 'rcfilters-filtergroup-watchlistactivity',
@@ -157,7 +193,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                                        'isRowApplicableCallable' => function ( $ctx, $rc ) {
                                                $changeTs = $rc->getAttribute( 'rc_timestamp' );
                                                $lastVisitTs = $rc->getAttribute( 'wl_notificationtimestamp' );
-                                               return $changeTs >= $lastVisitTs;
+                                               return $lastVisitTs !== null && $changeTs >= $lastVisitTs;
                                        },
                                ],
                                [
@@ -168,7 +204,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                                        'isRowApplicableCallable' => function ( $ctx, $rc ) {
                                                $changeTs = $rc->getAttribute( 'rc_timestamp' );
                                                $lastVisitTs = $rc->getAttribute( 'wl_notificationtimestamp' );
-                                               return $changeTs < $lastVisitTs;
+                                               return $lastVisitTs === null || $changeTs < $lastVisitTs;
                                        }
                                ],
                        ],
@@ -176,9 +212,15 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                        'queryCallable' => function ( $specialPageClassName, $context, $dbr,
                                                                                  &$tables, &$fields, &$conds, &$query_options, &$join_conds, $selectedValues ) {
                                if ( $selectedValues === [ 'seen' ] ) {
-                                       $conds[] = 'rc_timestamp < wl_notificationtimestamp';
+                                       $conds[] = $dbr->makeList( [
+                                               'wl_notificationtimestamp IS NULL',
+                                               'rc_timestamp < wl_notificationtimestamp'
+                                       ], LIST_OR );
                                } elseif ( $selectedValues === [ 'unseen' ] ) {
-                                       $conds[] = 'rc_timestamp >= wl_notificationtimestamp';
+                                       $conds[] = $dbr->makeList( [
+                                               'wl_notificationtimestamp IS NOT NULL',
+                                               'rc_timestamp >= wl_notificationtimestamp'
+                                       ], LIST_AND );
                                }
                        }
                ] ) );
@@ -228,7 +270,6 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                $user = $this->getUser();
 
                $opts->add( 'days', $user->getOption( 'watchlistdays' ), FormOptions::FLOAT );
-               $opts->add( 'extended', $user->getBoolOption( 'extendwatchlist' ) );
                $opts->add( 'limit', $user->getIntOption( 'wllimit' ), FormOptions::INT );
 
                return $opts;
@@ -292,8 +333,11 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                        // unchecked boxes.
                        foreach ( $this->filterGroups as $filterGroup ) {
                                if ( $filterGroup instanceof ChangesListBooleanFilterGroup ) {
+                                       /** @var ChangesListBooleanFilter $filter */
                                        foreach ( $filterGroup->getFilters() as $filter ) {
-                                               $allBooleansFalse[$filter->getName()] = false;
+                                               if ( $filter->displaysOnUnstructuredUi() ) {
+                                                       $allBooleansFalse[$filter->getName()] = false;
+                                               }
                                        }
                                }
                        }
@@ -335,25 +379,6 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                $dbr = $this->getDB();
                $user = $this->getUser();
 
-               # Toggle watchlist content (all recent edits or just the latest)
-               if ( $opts['extended'] ) {
-                       $usePage = false;
-               } else {
-                       # Top log Ids for a page are not stored
-                       $nonRevisionTypes = [ RC_LOG ];
-                       Hooks::run( 'SpecialWatchlistGetNonRevisionTypes', [ &$nonRevisionTypes ] );
-                       if ( $nonRevisionTypes ) {
-                               $conds[] = $dbr->makeList(
-                                       [
-                                               'rc_this_oldid=page_latest',
-                                               'rc_type' => $nonRevisionTypes,
-                                       ],
-                                       LIST_OR
-                               );
-                       }
-                       $usePage = true;
-               }
-
                $tables = array_merge( [ 'recentchanges', 'watchlist' ], $tables );
                $fields = array_merge( RecentChange::selectFields(), $fields );
 
@@ -375,18 +400,11 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                        $join_conds
                );
 
-               if ( $this->getConfig()->get( 'ShowUpdatedMarker' ) ) {
-                       $fields[] = 'wl_notificationtimestamp';
-               }
+               $tables[] = 'page';
+               $fields[] = 'page_latest';
+               $join_conds['page'] = [ 'LEFT JOIN', 'rc_cur_id=page_id' ];
 
-               $rollbacker = $user->isAllowed( 'rollback' );
-               if ( $usePage || $rollbacker ) {
-                       $tables[] = 'page';
-                       $join_conds['page'] = [ 'LEFT JOIN', 'rc_cur_id=page_id' ];
-                       if ( $rollbacker ) {
-                               $fields[] = 'page_latest';
-                       }
-               }
+               $fields[] = 'wl_notificationtimestamp';
 
                // Log entries with DELETED_ACTION must not show up unless the user has
                // the necessary rights.
@@ -415,6 +433,10 @@ class SpecialWatchlist extends ChangesListSpecialPage {
 
                $this->runMainQueryHook( $tables, $fields, $conds, $query_options, $join_conds, $opts );
 
+               if ( $this->areFiltersInConflict() ) {
+                       return false;
+               }
+
                return $dbr->select(
                        $tables,
                        $fields,
@@ -858,4 +880,12 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                $count = $store->countWatchedItems( $this->getUser() );
                return floor( $count / 2 );
        }
+
+       function getDefaultLimit() {
+               return $this->getUser()->getIntOption( 'wllimit' );
+       }
+
+       function getDefaultDays() {
+               return $this->getUser()->getIntOption( 'watchlistdays' );
+       }
 }