Skip to content

Commit 0b3ea6e

Browse files
author
Stephane Bisson
committed
RC Filters: combine user registration and experience level filters
Add 'registered' and 'unregistered' filters to user experience group. Keep minimal definitions of user registration to support hideanons and hideliu for no-js and users who are not using ERI filters. Reword all user experience levels description according to the phab task. Bug: T165160 Change-Id: Ie6b1795d7cbdb1692f8eeb13db7afb89ea4e5bbc
1 parent accf2a3 commit 0b3ea6e

File tree

4 files changed

+193
-73
lines changed

4 files changed

+193
-73
lines changed

includes/specialpage/ChangesListSpecialPage.php

Lines changed: 69 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,6 @@ public function __construct( $name, $restriction ) {
8686
'filters' => [
8787
[
8888
'name' => 'hideliu',
89-
'label' => 'rcfilters-filter-registered-label',
90-
'description' => 'rcfilters-filter-registered-description',
9189
// rcshowhideliu-show, rcshowhideliu-hide,
9290
// wlshowhideliu
9391
'showHideSuffix' => 'showhideliu',
@@ -97,16 +95,11 @@ public function __construct( $name, $restriction ) {
9795
) {
9896
$conds[] = 'rc_user = 0';
9997
},
100-
'cssClassSuffix' => 'liu',
101-
'isRowApplicableCallable' => function ( $ctx, $rc ) {
102-
return $rc->getAttribute( 'rc_user' );
103-
},
98+
'isReplacedInStructuredUi' => true,
10499

105100
],
106101
[
107102
'name' => 'hideanons',
108-
'label' => 'rcfilters-filter-unregistered-label',
109-
'description' => 'rcfilters-filter-unregistered-description',
110103
// rcshowhideanons-show, rcshowhideanons-hide,
111104
// wlshowhideanons
112105
'showHideSuffix' => 'showhideanons',
@@ -116,10 +109,7 @@ public function __construct( $name, $restriction ) {
116109
) {
117110
$conds[] = 'rc_user != 0';
118111
},
119-
'cssClassSuffix' => 'anon',
120-
'isRowApplicableCallable' => function ( $ctx, $rc ) {
121-
return !$rc->getAttribute( 'rc_user' );
122-
},
112+
'isReplacedInStructuredUi' => true,
123113
]
124114
],
125115
],
@@ -128,9 +118,26 @@ public function __construct( $name, $restriction ) {
128118
'name' => 'userExpLevel',
129119
'title' => 'rcfilters-filtergroup-userExpLevel',
130120
'class' => ChangesListStringOptionsFilterGroup::class,
131-
// Excludes unregistered users
132-
'isFullCoverage' => false,
121+
'isFullCoverage' => true,
133122
'filters' => [
123+
[
124+
'name' => 'unregistered',
125+
'label' => 'rcfilters-filter-user-experience-level-unregistered-label',
126+
'description' => 'rcfilters-filter-user-experience-level-unregistered-description',
127+
'cssClassSuffix' => 'user-unregistered',
128+
'isRowApplicableCallable' => function ( $ctx, $rc ) {
129+
return !$rc->getAttribute( 'rc_user' );
130+
}
131+
],
132+
[
133+
'name' => 'registered',
134+
'label' => 'rcfilters-filter-user-experience-level-registered-label',
135+
'description' => 'rcfilters-filter-user-experience-level-registered-description',
136+
'cssClassSuffix' => 'user-registered',
137+
'isRowApplicableCallable' => function ( $ctx, $rc ) {
138+
return $rc->getAttribute( 'rc_user' );
139+
}
140+
],
134141
[
135142
'name' => 'newcomer',
136143
'label' => 'rcfilters-filter-user-experience-level-newcomer-label',
@@ -632,19 +639,10 @@ protected function registerFilters() {
632639
$this->registerFiltersFromDefinitions( [ $unstructuredGroupDefinition ] );
633640

634641
$userExperienceLevel = $this->getFilterGroup( 'userExpLevel' );
635-
636-
$registration = $this->getFilterGroup( 'registration' );
637-
$anons = $registration->getFilter( 'hideanons' );
638-
639-
// This means there is a conflict between any item in user experience level
640-
// being checked and only anons being *shown* (hideliu=1&hideanons=0 in the
641-
// URL, or equivalent).
642-
$userExperienceLevel->conflictsWith(
643-
$anons,
644-
'rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global',
645-
'rcfilters-filtergroup-user-experience-level-conflicts-unregistered',
646-
'rcfilters-filter-unregistered-conflicts-user-experience-level'
647-
);
642+
$registered = $userExperienceLevel->getFilter( 'registered' );
643+
$registered->setAsSupersetOf( $userExperienceLevel->getFilter( 'newcomer' ) );
644+
$registered->setAsSupersetOf( $userExperienceLevel->getFilter( 'learner' ) );
645+
$registered->setAsSupersetOf( $userExperienceLevel->getFilter( 'experienced' ) );
648646

649647
$categoryFilter = $changeTypeGroup->getFilter( 'hidecategorization' );
650648
$logactionsFilter = $changeTypeGroup->getFilter( 'hidelog' );
@@ -1337,15 +1335,35 @@ public function filterOnUserExperienceLevel( $specialPageClassName, $context, $d
13371335
$wgLearnerMemberSince,
13381336
$wgExperiencedUserMemberSince;
13391337

1340-
$LEVEL_COUNT = 3;
1338+
$LEVEL_COUNT = 5;
13411339

1342-
// If all levels are selected, all logged-in users are included (but no
1343-
// anons), so we can short-circuit.
1340+
// If all levels are selected, don't filter
13441341
if ( count( $selectedExpLevels ) === $LEVEL_COUNT ) {
1342+
return;
1343+
}
1344+
1345+
// both 'registered' and 'unregistered', experience levels, if any, are included in 'registered'
1346+
if (
1347+
in_array( 'registered', $selectedExpLevels ) &&
1348+
in_array( 'unregistered', $selectedExpLevels )
1349+
) {
1350+
return;
1351+
}
1352+
1353+
// 'registered' but not 'unregistered', experience levels, if any, are included in 'registered'
1354+
if (
1355+
in_array( 'registered', $selectedExpLevels ) &&
1356+
!in_array( 'unregistered', $selectedExpLevels )
1357+
) {
13451358
$conds[] = 'rc_user != 0';
13461359
return;
13471360
}
13481361

1362+
if ( $selectedExpLevels === [ 'unregistered' ] ) {
1363+
$conds[] = 'rc_user = 0';
1364+
return;
1365+
}
1366+
13491367
$tables[] = 'user';
13501368
$join_conds['user'] = [ 'LEFT JOIN', 'rc_user = user_id' ];
13511369

@@ -1373,24 +1391,39 @@ public function filterOnUserExperienceLevel( $specialPageClassName, $context, $d
13731391
IDatabase::LIST_AND
13741392
);
13751393

1394+
$conditions = [];
1395+
1396+
if ( in_array( 'unregistered', $selectedExpLevels ) ) {
1397+
$selectedExpLevels = array_diff( $selectedExpLevels, [ 'unregistered' ] );
1398+
$conditions[] = 'rc_user = 0';
1399+
}
1400+
13761401
if ( $selectedExpLevels === [ 'newcomer' ] ) {
1377-
$conds[] = "NOT ( $aboveNewcomer )";
1402+
$conditions[] = "NOT ( $aboveNewcomer )";
13781403
} elseif ( $selectedExpLevels === [ 'learner' ] ) {
1379-
$conds[] = $dbr->makeList(
1404+
$conditions[] = $dbr->makeList(
13801405
[ $aboveNewcomer, "NOT ( $aboveLearner )" ],
13811406
IDatabase::LIST_AND
13821407
);
13831408
} elseif ( $selectedExpLevels === [ 'experienced' ] ) {
1384-
$conds[] = $aboveLearner;
1409+
$conditions[] = $aboveLearner;
13851410
} elseif ( $selectedExpLevels === [ 'learner', 'newcomer' ] ) {
1386-
$conds[] = "NOT ( $aboveLearner )";
1411+
$conditions[] = "NOT ( $aboveLearner )";
13871412
} elseif ( $selectedExpLevels === [ 'experienced', 'newcomer' ] ) {
1388-
$conds[] = $dbr->makeList(
1413+
$conditions[] = $dbr->makeList(
13891414
[ "NOT ( $aboveNewcomer )", $aboveLearner ],
13901415
IDatabase::LIST_OR
13911416
);
13921417
} elseif ( $selectedExpLevels === [ 'experienced', 'learner' ] ) {
1393-
$conds[] = $aboveNewcomer;
1418+
$conditions[] = $aboveNewcomer;
1419+
} elseif ( $selectedExpLevels === [ 'experienced', 'learner', 'newcomer' ] ) {
1420+
$conditions[] = 'rc_user != 0';
1421+
}
1422+
1423+
if ( count( $conditions ) > 1 ) {
1424+
$conds[] = $dbr->makeList( $conditions, IDatabase::LIST_OR );
1425+
} elseif ( count( $conditions ) === 1 ) {
1426+
$conds[] = reset( $conditions );
13941427
}
13951428
}
13961429
}

languages/i18n/en.json

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1380,26 +1380,22 @@
13801380
"rcfilters-noresults-conflict": "No results found because the search criteria are in conflict",
13811381
"rcfilters-state-message-subset": "This filter has no effect because its results are included with those of the following, broader {{PLURAL:$2|filter|filters}} (try highlighting to distinguish it): $1",
13821382
"rcfilters-state-message-fullcoverage": "Selecting all filters in a group is the same as selecting none, so this filter has no effect. Group includes: $1",
1383-
"rcfilters-filtergroup-registration": "User registration",
1384-
"rcfilters-filter-registered-label": "Registered",
1385-
"rcfilters-filter-registered-description": "Logged-in editors.",
1386-
"rcfilters-filter-unregistered-label": "Unregistered",
1387-
"rcfilters-filter-unregistered-description": "Editors who aren’t logged in.",
1388-
"rcfilters-filter-unregistered-conflicts-user-experience-level": "This filter conflicts with the following Experience {{PLURAL:$2|filter|filters}}, which {{PLURAL:$2|finds|find}} only registered users: $1",
13891383
"rcfilters-filtergroup-authorship": "Contribution authorship",
13901384
"rcfilters-filter-editsbyself-label": "Changes by you",
13911385
"rcfilters-filter-editsbyself-description": "Your own contributions.",
13921386
"rcfilters-filter-editsbyother-label": "Changes by others",
13931387
"rcfilters-filter-editsbyother-description": "All changes except your own.",
1394-
"rcfilters-filtergroup-userExpLevel": "Experience level (for registered users only)",
1395-
"rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Experience filters find only registered users, so this filter conflicts with the “Unregistered” filter.",
1396-
"rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "The \"Unregistered\" filter conflicts with one or more Experience filters, which find registered users only. The conflicting filters are marked in the Active Filters area, above.",
1388+
"rcfilters-filtergroup-userExpLevel": "Experience registration and experience",
1389+
"rcfilters-filter-user-experience-level-registered-label": "Registered",
1390+
"rcfilters-filter-user-experience-level-registered-description": "Logged-in editors.",
1391+
"rcfilters-filter-user-experience-level-unregistered-label": "Unregistered",
1392+
"rcfilters-filter-user-experience-level-unregistered-description": "Editors who aren't logged-in.",
13971393
"rcfilters-filter-user-experience-level-newcomer-label": "Newcomers",
1398-
"rcfilters-filter-user-experience-level-newcomer-description": "Fewer than 10 edits and 4 days of activity.",
1394+
"rcfilters-filter-user-experience-level-newcomer-description": "Registered editors with fewer than 10 edits and 4 days of activity.",
13991395
"rcfilters-filter-user-experience-level-learner-label": "Learners",
1400-
"rcfilters-filter-user-experience-level-learner-description": "More experience than \"Newcomers\" but less than \"Experienced users\".",
1396+
"rcfilters-filter-user-experience-level-learner-description": "Registered editors whose experience falls between \"Newcomers\" and \"Experienced users.\"",
14011397
"rcfilters-filter-user-experience-level-experienced-label": "Experienced users",
1402-
"rcfilters-filter-user-experience-level-experienced-description": "More than 30 days of activity and 500 edits.",
1398+
"rcfilters-filter-user-experience-level-experienced-description": "Registered editors with more than 500 edits and 30 days of activity.",
14031399
"rcfilters-filtergroup-automated": "Automated contributions",
14041400
"rcfilters-filter-bots-label": "Bot",
14051401
"rcfilters-filter-bots-description": "Edits made by automated tools.",

languages/i18n/qqq.json

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1570,20 +1570,16 @@
15701570
"rcfilters-noresults-conflict": "A message displayed in the results area when no results found because there are filters in conflict with one another.",
15711571
"rcfilters-state-message-subset": "Tooltip shown when hovering over a filter tag when one or more broader filters that contain the hovered filter are also selected. This indicates that the hovered filter has no effect because all the results it matches are also matched by the broader filter(s). Parameters:\n* $1 - Comma-separated string of selected broader filters that this filter is a subset of\n* $2 - Count of filters in $1, for PLURAL",
15721572
"rcfilters-state-message-fullcoverage": "Tooltip shown when hovering over a filter tag when all the filters in its group are selected. This indicates that the hovered filter has no effect because the selected filters in the group cover all changes. Parameters:\n* $1 - Comma-separated string of selected filters in the group\n* $2 - Count of filters in $1, for PLURAL",
1573-
"rcfilters-filtergroup-registration": "Title for the filter group for editor registration type.",
1574-
"rcfilters-filter-registered-label": "Label for the filter for showing edits made by logged-in users.\n{{Identical|Registered}}",
1575-
"rcfilters-filter-registered-description": "Description for the filter for showing edits made by logged-in users.",
1576-
"rcfilters-filter-unregistered-label": "Label for the filter for showing edits made by logged-out users.\n{{Identical|Unregistered}}",
1577-
"rcfilters-filter-unregistered-description": "Description for the filter for showing edits made by logged-out users.",
1578-
"rcfilters-filter-unregistered-conflicts-user-experience-level": "Tooltip shown when hovering over a Unregistered filter tag, when a User Experience Level filter is also selected.\n\n\"Unregistered\" is {{msg-mw|Rcfilters-filter-unregistered-label}}.\n\n\"Experience\" is based on {{msg-mw|Rcfilters-filtergroup-userExpLevel}}.\n\nThis indicates that no results will be shown, because users matched by the User Experience Level groups are never unregistered. Parameters:\n* $1 - Comma-separated string of selected User Experience Level filters, e.g. \"Newcomer, Experienced\"\n* $2 - Count of selected User Experience Level filters, for PLURAL",
15791573
"rcfilters-filtergroup-authorship": "Title for the filter group for edit authorship. This filter group allows the user to choose between \"Your own edits\" and \"Edits by others\". More info: https://phabricator.wikimedia.org/T149859",
15801574
"rcfilters-filter-editsbyself-label": "Label for the filter for showing edits made by the current user.",
15811575
"rcfilters-filter-editsbyself-description": "Description for the filter for showing edits made by the current user.",
15821576
"rcfilters-filter-editsbyother-label": "Label for the filter for showing edits made by anyone other than the current user.",
15831577
"rcfilters-filter-editsbyother-description": "Description for the filter for showing edits made by anyone other than the current user.",
15841578
"rcfilters-filtergroup-userExpLevel": "Title for the filter group for user experience levels.",
1585-
"rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Tooltip shown when hovering over a User Experience Level filter tag, when only Unregistered users are being shown. This indicates that no results will be shown, because users matched by the User Experience Level groups are never unregistered.\n\n\"Unregistered\" is {{msg-mw|Rcfilters-filter-unregistered-label}}.",
1586-
"rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Message shown in the result area when both a User Experience Level filter and the Unregistered filter are selected. This indicates that no results will be shown because users selected by the User Experience Filter are never unregistered.\n\n\"Unregistered\" is {{msg-mw|Rcfilters-filter-unregistered-label}}.\n\n\"Experience\" is based on {{msg-mw|Rcfilters-filtergroup-userExpLevel}}.",
1579+
"rcfilters-filter-user-experience-level-registered-label": "Label for the filter for showing edits made by logged-in editors.",
1580+
"rcfilters-filter-user-experience-level-registered-description": "Description for the filter for showing edits made by logged-in editors.",
1581+
"rcfilters-filter-user-experience-level-unregistered-label": "Label for the filter for showing edits made by anonymous editors.",
1582+
"rcfilters-filter-user-experience-level-unregistered-description": "Description for the filter for showing edits made by anonymous editors.",
15871583
"rcfilters-filter-user-experience-level-newcomer-label": "Label for the filter for showing edits made by new editors.",
15881584
"rcfilters-filter-user-experience-level-newcomer-description": "Description for the filter for showing edits made by new editors.",
15891585
"rcfilters-filter-user-experience-level-learner-label": "Label for the filter for showing edits made by learning editors.",

0 commit comments

Comments
 (0)