X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fspecials%2FSpecialWatchlist.php;h=e9d3f26f76d4f4a92897cdfa9dd4ebdd064f3c0e;hb=65ba7408c61e36093b9c83a6eda787eddb690f0f;hp=822648bff0d3deab61ed0360e770103214f78f7e;hpb=d657b1706621e2272ad40f4fe566854f82980c03;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/specials/SpecialWatchlist.php b/includes/specials/SpecialWatchlist.php index 822648bff0..e9d3f26f76 100644 --- a/includes/specials/SpecialWatchlist.php +++ b/includes/specials/SpecialWatchlist.php @@ -23,6 +23,7 @@ use MediaWiki\MediaWikiServices; use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\IDatabase; /** * A special page that lists last changes made to the wiki, @@ -80,6 +81,7 @@ class SpecialWatchlist extends ChangesListSpecialPage { if ( ( $config->get( 'EnotifWatchlist' ) || $config->get( 'ShowUpdatedMarker' ) ) && $request->getVal( 'reset' ) && $request->wasPosted() + && $user->matchEditToken( $request->getVal( 'token' ) ) ) { $user->clearAllNotifications(); $output->redirect( $this->getPageTitle()->getFullURL( $opts->getChangedValues() ) ); @@ -104,6 +106,58 @@ class SpecialWatchlist extends ChangesListSpecialPage { ]; } + /** + * @inheritdoc + */ + protected function transformFilterDefinition( array $filterDefinition ) { + if ( isset( $filterDefinition['showHideSuffix'] ) ) { + $filterDefinition['showHide'] = 'wl' . $filterDefinition['showHideSuffix']; + } + + return $filterDefinition; + } + + /** + * @inheritdoc + */ + protected function registerFilters() { + parent::registerFilters(); + + $user = $this->getUser(); + + $significance = $this->getFilterGroup( 'significance' ); + $hideMinor = $significance->getFilter( 'hideminor' ); + $hideMinor->setDefault( $user->getBoolOption( 'watchlisthideminor' ) ); + + $automated = $this->getFilterGroup( 'automated' ); + $hideBots = $automated->getFilter( 'hidebots' ); + $hideBots->setDefault( $user->getBoolOption( 'watchlisthidebots' ) ); + + $registration = $this->getFilterGroup( 'registration' ); + $hideAnons = $registration->getFilter( 'hideanons' ); + $hideAnons->setDefault( $user->getBoolOption( 'watchlisthideanons' ) ); + $hideLiu = $registration->getFilter( 'hideliu' ); + $hideLiu->setDefault( $user->getBoolOption( 'watchlisthideliu' ) ); + + $reviewStatus = $this->getFilterGroup( 'reviewStatus' ); + if ( $reviewStatus !== null ) { + // Conditional on feature being available and rights + $hidePatrolled = $reviewStatus->getFilter( 'hidepatrolled' ); + $hidePatrolled->setDefault( $user->getBoolOption( 'watchlisthidepatrolled' ) ); + } + + $authorship = $this->getFilterGroup( 'authorship' ); + $hideMyself = $authorship->getFilter( 'hidemyself' ); + $hideMyself->setDefault( $user->getBoolOption( 'watchlisthideown' ) ); + + $changeType = $this->getFilterGroup( 'changeType' ); + $hideCategorization = $changeType->getFilter( 'hidecategorization' ); + if ( $hideCategorization !== null ) { + // Conditional on feature being available + $hideCategorization->setDefault( $user->getBoolOption( 'watchlisthidecategorization' ) ); + } + } + /** * Get a FormOptions object containing the default options * @@ -115,18 +169,6 @@ class SpecialWatchlist extends ChangesListSpecialPage { $opts->add( 'days', $user->getOption( 'watchlistdays' ), FormOptions::FLOAT ); $opts->add( 'extended', $user->getBoolOption( 'extendwatchlist' ) ); - if ( $this->getRequest()->getVal( 'action' ) == 'submit' ) { - // The user has submitted the form, so we dont need the default values - return $opts; - } - - $opts->add( 'hideminor', $user->getBoolOption( 'watchlisthideminor' ) ); - $opts->add( 'hidebots', $user->getBoolOption( 'watchlisthidebots' ) ); - $opts->add( 'hideanons', $user->getBoolOption( 'watchlisthideanons' ) ); - $opts->add( 'hideliu', $user->getBoolOption( 'watchlisthideliu' ) ); - $opts->add( 'hidepatrolled', $user->getBoolOption( 'watchlisthidepatrolled' ) ); - $opts->add( 'hidemyself', $user->getBoolOption( 'watchlisthideown' ) ); - $opts->add( 'hidecategorization', $user->getBoolOption( 'watchlisthidecategorization' ) ); return $opts; } @@ -172,6 +214,26 @@ class SpecialWatchlist extends ChangesListSpecialPage { } } + if ( $this->getRequest()->getVal( 'action' ) == 'submit' ) { + $allBooleansFalse = []; + + // If the user submitted the form, start with a baseline of "all + // booleans are false", then change the ones they checked. This + // means we ignore the defaults. + + // This is how we handle the fact that HTML forms don't submit + // unchecked boxes. + foreach ( $this->filterGroups as $filterGroup ) { + if ( $filterGroup instanceof ChangesListBooleanFilterGroup ) { + foreach ( $filterGroup->getFilters() as $filter ) { + $allBooleansFalse[$filter->getName()] = false; + } + } + } + + $params = $params + $allBooleansFalse; + } + // Not the prettiest way to achieve this… FormOptions internally depends on data sanitization // methods defined on WebRequest and removing this dependency would cause some code duplication. $request = new DerivativeRequest( $this->getRequest(), $params ); @@ -181,32 +243,28 @@ class SpecialWatchlist extends ChangesListSpecialPage { } /** - * Return an array of conditions depending of options set in $opts - * - * @param FormOptions $opts - * @return array + * @inheritdoc */ - public function buildMainQueryConds( FormOptions $opts ) { + protected function buildQuery( &$tables, &$fields, &$conds, &$query_options, + &$join_conds, FormOptions $opts ) { + $dbr = $this->getDB(); - $conds = parent::buildMainQueryConds( $opts ); + parent::buildQuery( $tables, $fields, $conds, $query_options, $join_conds, + $opts ); // Calculate cutoff if ( $opts['days'] > 0 ) { $conds[] = 'rc_timestamp > ' . $dbr->addQuotes( $dbr->timestamp( time() - intval( $opts['days'] * 86400 ) ) ); } - - return $conds; } /** - * Process the query - * - * @param array $conds - * @param FormOptions $opts - * @return bool|ResultWrapper Result or false (for Recentchangeslinked only) + * @inheritdoc */ - public function doMainQuery( $conds, $opts ) { + protected function doMainQuery( $tables, $fields, $conds, $query_options, + $join_conds, FormOptions $opts ) { + $dbr = $this->getDB(); $user = $this->getUser(); @@ -231,19 +289,23 @@ class SpecialWatchlist extends ChangesListSpecialPage { $usePage = true; } - $tables = [ 'recentchanges', 'watchlist' ]; - $fields = RecentChange::selectFields(); - $query_options = [ 'ORDER BY' => 'rc_timestamp DESC' ]; - $join_conds = [ - 'watchlist' => [ - 'INNER JOIN', - [ - 'wl_user' => $user->getId(), - 'wl_namespace=rc_namespace', - 'wl_title=rc_title' + $tables = array_merge( [ 'recentchanges', 'watchlist' ], $tables ); + $fields = array_merge( RecentChange::selectFields(), $fields ); + + $query_options = array_merge( [ 'ORDER BY' => 'rc_timestamp DESC' ], $query_options ); + $join_conds = array_merge( + [ + 'watchlist' => [ + 'INNER JOIN', + [ + 'wl_user' => $user->getId(), + 'wl_namespace=rc_namespace', + 'wl_title=rc_title' + ], ], ], - ]; + $join_conds + ); if ( $this->getConfig()->get( 'ShowUpdatedMarker' ) ) { $fields[] = 'wl_notificationtimestamp'; @@ -361,7 +423,7 @@ class SpecialWatchlist extends ChangesListSpecialPage { $dbr->dataSeek( $rows, 0 ); - $list = ChangesList::newFromContext( $this->getContext() ); + $list = ChangesList::newFromContext( $this->getContext(), $this->filterGroups ); $list->setWatchlistDivs(); $list->initChangesListRows( $rows ); $dbr->dataSeek( $rows, 0 ); @@ -448,31 +510,23 @@ class SpecialWatchlist extends ChangesListSpecialPage { $cutofflinks = $this->msg( 'wlshowtime' ) . ' ' . $this->cutoffselector( $opts ); # Spit out some control panel links - $filters = [ - 'hideminor' => 'wlshowhideminor', - 'hidebots' => 'wlshowhidebots', - 'hideanons' => 'wlshowhideanons', - 'hideliu' => 'wlshowhideliu', - 'hidemyself' => 'wlshowhidemine', - 'hidepatrolled' => 'wlshowhidepatr' - ]; - - if ( $this->getConfig()->get( 'RCWatchCategoryMembership' ) ) { - $filters['hidecategorization'] = 'wlshowhidecategorization'; - } - - foreach ( $this->getRenderableCustomFilters( $this->getCustomFilters() ) as $key => $params ) { - $filters[$key] = $params['msg']; - } - - // Disable some if needed - if ( !$user->useRCPatrol() ) { - unset( $filters['hidepatrolled'] ); - } - $links = []; - foreach ( $filters as $name => $msg ) { - $links[] = $this->showHideCheck( $nondefaults, $msg, $name, $opts[$name] ); + $context = $this->getContext(); + $namesOfDisplayedFilters = []; + foreach ( $this->getFilterGroups() as $groupName => $group ) { + if ( !$group->isPerGroupRequestParameter() ) { + foreach ( $group->getFilters() as $filterName => $filter ) { + if ( $filter->displaysOnUnstructuredUi( $this ) ) { + $namesOfDisplayedFilters[] = $filterName; + $links[] = $this->showHideCheck( + $nondefaults, + $filter->getShowHide(), + $filterName, + $opts[$filterName] + ); + } + } + } } $hiddenFields = $nondefaults; @@ -481,8 +535,8 @@ class SpecialWatchlist extends ChangesListSpecialPage { unset( $hiddenFields['invert'] ); unset( $hiddenFields['associated'] ); unset( $hiddenFields['days'] ); - foreach ( $filters as $key => $value ) { - unset( $hiddenFields[$key] ); + foreach ( $namesOfDisplayedFilters as $filterName ) { + unset( $hiddenFields[$filterName] ); } # Create output @@ -607,6 +661,7 @@ class SpecialWatchlist extends ChangesListSpecialPage { 'id' => 'mw-watchlist-resetbutton' ] ) . "\n" . Xml::submitButton( $this->msg( 'enotif_reset' )->text(), [ 'name' => 'mw-watchlist-reset-submit' ] ) . "\n" . + Html::hidden( 'token', $user->getEditToken() ) . "\n" . Html::hidden( 'reset', 'all' ) . "\n"; foreach ( $nondefaults as $key => $value ) { $form .= Html::hidden( $key, $value ) . "\n";