*/
use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
/**
* A special page that lists last changes made to the wiki
$opts->add( 'categories_any', false );
$opts->add( 'tagfilter', '' );
+ $opts->add( 'userExpLevel', 'all' );
+
return $opts;
}
$opts['tagfilter']
);
+ $this->filterOnUserExperienceLevel( $tables, $conds, $join_conds, $opts );
+
if ( !$this->runMainQueryHook( $tables, $fields, $conds, $query_options, $join_conds,
$opts )
) {
$panel[] = $form;
$panelString = implode( "\n", $panel );
+ // Insert a placeholder for RCFilters
+ if ( $this->getUser()->getOption(
+ 'rcenhancedfilters',
+ /*default=*/ null,
+ /*ignoreHidden=*/ true
+ )
+ ) {
+ $this->getOutput()->addHTML(
+ Html::element(
+ 'div',
+ [ 'class' => 'rcfilters-container' ]
+ )
+ );
+ }
+
$this->getOutput()->addHTML(
Xml::fieldset(
$this->msg( 'recentchanges-legend' )->text(),
parent::addModules();
$out = $this->getOutput();
$out->addModules( 'mediawiki.special.recentchanges' );
+ if ( $this->getUser()->getOption(
+ 'rcenhancedfilters',
+ /*default=*/ null,
+ /*ignoreHidden=*/ true
+ )
+ ) {
+ $out->addModules( 'mediawiki.rcfilters.filters.ui' );
+ $out->addModuleStyles( 'mediawiki.rcfilters.filters.base.styles' );
+ }
}
/**
function makeOptionsLink( $title, $override, $options, $active = false ) {
$params = $override + $options;
- // Bug 36524: false values have be converted to "0" otherwise
+ // T38524: false values have be converted to "0" otherwise
// wfArrayToCgi() will omit it them.
foreach ( $params as &$value ) {
if ( $value === false ) {
$title = new HtmlArmor( '<strong>' . htmlspecialchars( $title ) . '</strong>' );
}
- return $this->getLinkRenderer()->makeKnownLink( $this->getPageTitle(), $title, [], $params );
+ return $this->getLinkRenderer()->makeKnownLink( $this->getPageTitle(), $title, [
+ 'data-params' => json_encode( $override ),
+ 'data-keys' => implode( ',', array_keys( $override ) ),
+ ], $params );
}
/**
return 60 * 5;
}
+ function filterOnUserExperienceLevel( &$tables, &$conds, &$join_conds, $opts ) {
+ global $wgLearnerEdits,
+ $wgExperiencedUserEdits,
+ $wgLearnerMemberSince,
+ $wgExperiencedUserMemberSince;
+
+ $selectedExpLevels = explode( ',', strtolower( $opts['userExpLevel'] ) );
+ // remove values that are not recognized
+ $selectedExpLevels = array_intersect(
+ $selectedExpLevels,
+ [ 'newcomer', 'learner', 'experienced' ]
+ );
+ sort( $selectedExpLevels );
+
+ if ( $selectedExpLevels ) {
+ $tables[] = 'user';
+ $join_conds['user'] = [ 'LEFT JOIN', 'rc_user = user_id' ];
+
+ $now = time();
+ $secondsPerDay = 86400;
+ $learnerCutoff = $now - $wgLearnerMemberSince * $secondsPerDay;
+ $experiencedUserCutoff = $now - $wgExperiencedUserMemberSince * $secondsPerDay;
+
+ $aboveNewcomer = $this->getDB()->makeList(
+ [
+ 'user_editcount >= ' . intval( $wgLearnerEdits ),
+ 'user_registration <= ' . $this->getDB()->timestamp( $learnerCutoff ),
+ ],
+ IDatabase::LIST_AND
+ );
+
+ $aboveLearner = $this->getDB()->makeList(
+ [
+ 'user_editcount >= ' . intval( $wgExperiencedUserEdits ),
+ 'user_registration <= ' . $this->getDB()->timestamp( $experiencedUserCutoff ),
+ ],
+ IDatabase::LIST_AND
+ );
+
+ if ( $selectedExpLevels === [ 'newcomer' ] ) {
+ $conds[] = "NOT ( $aboveNewcomer )";
+ } elseif ( $selectedExpLevels === [ 'learner' ] ) {
+ $conds[] = $this->getDB()->makeList(
+ [ $aboveNewcomer, "NOT ( $aboveLearner )" ],
+ IDatabase::LIST_AND
+ );
+ } elseif ( $selectedExpLevels === [ 'experienced' ] ) {
+ $conds[] = $aboveLearner;
+ } elseif ( $selectedExpLevels === [ 'learner', 'newcomer' ] ) {
+ $conds[] = "NOT ( $aboveLearner )";
+ } elseif ( $selectedExpLevels === [ 'experienced', 'newcomer' ] ) {
+ $conds[] = $this->getDB()->makeList(
+ [ "NOT ( $aboveNewcomer )", $aboveLearner ],
+ IDatabase::LIST_OR
+ );
+ } elseif ( $selectedExpLevels === [ 'experienced', 'learner' ] ) {
+ $conds[] = $aboveNewcomer;
+ }
+ }
+ }
+
}