From: jenkins-bot Date: Tue, 18 Jul 2017 23:17:41 +0000 (+0000) Subject: Merge "RCFilters: Change `What's this?` i18n based on user testing" X-Git-Tag: 1.31.0-rc.0~2674 X-Git-Url: https://git.cyclocoop.org/%7B%24www_url%7Dadmin/compta/banques/ajouter.php?a=commitdiff_plain;h=12b7a7ea555ff4bda637b60f28e069a3b22873f4;hp=d1f82b5a49c9fc1ec76b57850388e5047484c9c2;p=lhc%2Fweb%2Fwiklou.git Merge "RCFilters: Change `What's this?` i18n based on user testing" --- diff --git a/includes/exception/MWExceptionRenderer.php b/includes/exception/MWExceptionRenderer.php index 2eb821ae69..60d760f3aa 100644 --- a/includes/exception/MWExceptionRenderer.php +++ b/includes/exception/MWExceptionRenderer.php @@ -211,7 +211,7 @@ class MWExceptionRenderer { "\nBacktrace:\n" . MWExceptionHandler::getRedactedTraceAsString( $e ) . "\n"; } else { - return self::getShowBacktraceError( $e ); + return self::getShowBacktraceError( $e ) . "\n"; } } @@ -242,7 +242,7 @@ class MWExceptionRenderer { $vars[] = '$wgShowDBErrorBacktrace = true;'; } $vars = implode( ' and ', $vars ); - return "Set $vars at the bottom of LocalSettings.php to show detailed debugging information\n"; + return "Set $vars at the bottom of LocalSettings.php to show detailed debugging information."; } /** diff --git a/includes/htmlform/fields/HTMLSelectAndOtherField.php b/includes/htmlform/fields/HTMLSelectAndOtherField.php index 9af60e5c22..38b487af10 100644 --- a/includes/htmlform/fields/HTMLSelectAndOtherField.php +++ b/includes/htmlform/fields/HTMLSelectAndOtherField.php @@ -63,8 +63,70 @@ class HTMLSelectAndOtherField extends HTMLSelectField { return "$select
\n$textbox"; } + protected function getOOUIModules() { + return [ 'mediawiki.widgets.SelectWithInputWidget' ]; + } + public function getInputOOUI( $value ) { - return false; + $this->mParent->getOutput()->addModuleStyles( 'mediawiki.widgets.SelectWithInputWidget.styles' ); + + # TextInput + $textAttribs = [ + 'id' => $this->mID . '-other', + 'name' => $this->mName . '-other', + 'size' => $this->getSize(), + 'class' => [ 'mw-htmlform-select-and-other-field' ], + 'data-id-select' => $this->mID, + 'value' => $value[2], + ]; + + $allowedParams = [ + 'required', + 'autofocus', + 'multiple', + 'disabled', + 'tabindex', + 'maxlength', + ]; + + $textAttribs += OOUI\Element::configFromHtmlAttributes( + $this->getAttributes( $allowedParams ) + ); + + if ( $this->mClass !== '' ) { + $textAttribs['classes'] = [ $this->mClass ]; + } + + # DropdownInput + $dropdownInputAttribs = [ + 'name' => $this->mName, + 'id' => $this->mID, + 'options' => $this->getOptionsOOUI(), + 'value' => $value[1], + ]; + + $allowedParams = [ + 'tabindex', + 'disabled', + ]; + + $dropdownInputAttribs += OOUI\Element::configFromHtmlAttributes( + $this->getAttributes( $allowedParams ) + ); + + if ( $this->mClass !== '' ) { + $dropdownInputAttribs['classes'] = [ $this->mClass ]; + } + + return $this->getInputWidget( [ + 'textinput' => $textAttribs, + 'dropdowninput' => $dropdownInputAttribs, + 'or' => false, + ] ); + } + + public function getInputWidget( $params ) { + return new Mediawiki\Widget\SelectWithInputWidget( $params ); } /** diff --git a/includes/htmlform/fields/HTMLSelectOrOtherField.php b/includes/htmlform/fields/HTMLSelectOrOtherField.php index bb410799ef..a009b287c2 100644 --- a/includes/htmlform/fields/HTMLSelectOrOtherField.php +++ b/includes/htmlform/fields/HTMLSelectOrOtherField.php @@ -64,8 +64,80 @@ class HTMLSelectOrOtherField extends HTMLTextField { return "$select
\n$textbox"; } + protected function shouldInfuseOOUI() { + return true; + } + + protected function getOOUIModules() { + return [ 'mediawiki.widgets.SelectWithInputWidget' ]; + } + public function getInputOOUI( $value ) { - return false; + $this->mParent->getOutput()->addModuleStyles( 'mediawiki.widgets.SelectWithInputWidget.styles' ); + + $valInSelect = false; + if ( $value !== false ) { + $value = strval( $value ); + $valInSelect = in_array( + $value, HTMLFormField::flattenOptions( $this->getOptions() ), true + ); + } + + # DropdownInput + $dropdownAttribs = [ + 'id' => $this->mID, + 'name' => $this->mName, + 'options' => $this->getOptionsOOUI(), + 'value' => $valInSelect ? $value : 'other', + 'class' => [ 'mw-htmlform-select-or-other' ], + ]; + + $allowedParams = [ + 'disabled', + 'tabindex', + ]; + + $dropdownAttribs += OOUI\Element::configFromHtmlAttributes( + $this->getAttributes( $allowedParams ) + ); + + # TextInput + $textAttribs = [ + 'id' => $this->mID . '-other', + 'name' => $this->mName . '-other', + 'size' => $this->getSize(), + 'value' => $valInSelect ? '' : $value, + ]; + + $allowedParams = [ + 'required', + 'autofocus', + 'multiple', + 'disabled', + 'tabindex', + 'maxlength', + ]; + + $textAttribs += OOUI\Element::configFromHtmlAttributes( + $this->getAttributes( $allowedParams ) + ); + + if ( $this->mClass !== '' ) { + $textAttribs['classes'] = [ $this->mClass ]; + } + if ( $this->mPlaceholder !== '' ) { + $textAttribs['placeholder'] = $this->mPlaceholder; + } + + return $this->getInputWidget( [ + 'textinput' => $textAttribs, + 'dropdowninput' => $dropdownAttribs, + 'or' => true, + ] ); + } + + public function getInputWidget( $params ) { + return new Mediawiki\Widget\SelectWithInputWidget( $params ); } /** diff --git a/includes/jobqueue/JobQueueDB.php b/includes/jobqueue/JobQueueDB.php index cefe74df18..b7cc133a75 100644 --- a/includes/jobqueue/JobQueueDB.php +++ b/includes/jobqueue/JobQueueDB.php @@ -768,7 +768,7 @@ class JobQueueDB extends JobQueue { protected function getDB( $index ) { $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory(); $lb = ( $this->cluster !== false ) - ? $lbFactory->getExternalLB( $this->cluster, $this->wiki ) + ? $lbFactory->getExternalLB( $this->cluster ) : $lbFactory->getMainLB( $this->wiki ); return $lb->getConnectionRef( $index, [], $this->wiki ); diff --git a/includes/specialpage/ChangesListSpecialPage.php b/includes/specialpage/ChangesListSpecialPage.php index b85d272c44..645fbb288f 100644 --- a/includes/specialpage/ChangesListSpecialPage.php +++ b/includes/specialpage/ChangesListSpecialPage.php @@ -86,8 +86,6 @@ abstract class ChangesListSpecialPage extends SpecialPage { 'filters' => [ [ 'name' => 'hideliu', - 'label' => 'rcfilters-filter-registered-label', - 'description' => 'rcfilters-filter-registered-description', // rcshowhideliu-show, rcshowhideliu-hide, // wlshowhideliu 'showHideSuffix' => 'showhideliu', @@ -97,16 +95,11 @@ abstract class ChangesListSpecialPage extends SpecialPage { ) { $conds[] = 'rc_user = 0'; }, - 'cssClassSuffix' => 'liu', - 'isRowApplicableCallable' => function ( $ctx, $rc ) { - return $rc->getAttribute( 'rc_user' ); - }, + 'isReplacedInStructuredUi' => true, ], [ 'name' => 'hideanons', - 'label' => 'rcfilters-filter-unregistered-label', - 'description' => 'rcfilters-filter-unregistered-description', // rcshowhideanons-show, rcshowhideanons-hide, // wlshowhideanons 'showHideSuffix' => 'showhideanons', @@ -116,10 +109,7 @@ abstract class ChangesListSpecialPage extends SpecialPage { ) { $conds[] = 'rc_user != 0'; }, - 'cssClassSuffix' => 'anon', - 'isRowApplicableCallable' => function ( $ctx, $rc ) { - return !$rc->getAttribute( 'rc_user' ); - }, + 'isReplacedInStructuredUi' => true, ] ], ], @@ -128,9 +118,26 @@ abstract class ChangesListSpecialPage extends SpecialPage { 'name' => 'userExpLevel', 'title' => 'rcfilters-filtergroup-userExpLevel', 'class' => ChangesListStringOptionsFilterGroup::class, - // Excludes unregistered users - 'isFullCoverage' => false, + 'isFullCoverage' => true, 'filters' => [ + [ + 'name' => 'unregistered', + 'label' => 'rcfilters-filter-user-experience-level-unregistered-label', + 'description' => 'rcfilters-filter-user-experience-level-unregistered-description', + 'cssClassSuffix' => 'user-unregistered', + 'isRowApplicableCallable' => function ( $ctx, $rc ) { + return !$rc->getAttribute( 'rc_user' ); + } + ], + [ + 'name' => 'registered', + 'label' => 'rcfilters-filter-user-experience-level-registered-label', + 'description' => 'rcfilters-filter-user-experience-level-registered-description', + 'cssClassSuffix' => 'user-registered', + 'isRowApplicableCallable' => function ( $ctx, $rc ) { + return $rc->getAttribute( 'rc_user' ); + } + ], [ 'name' => 'newcomer', 'label' => 'rcfilters-filter-user-experience-level-newcomer-label', @@ -632,19 +639,10 @@ abstract class ChangesListSpecialPage extends SpecialPage { $this->registerFiltersFromDefinitions( [ $unstructuredGroupDefinition ] ); $userExperienceLevel = $this->getFilterGroup( 'userExpLevel' ); - - $registration = $this->getFilterGroup( 'registration' ); - $anons = $registration->getFilter( 'hideanons' ); - - // This means there is a conflict between any item in user experience level - // being checked and only anons being *shown* (hideliu=1&hideanons=0 in the - // URL, or equivalent). - $userExperienceLevel->conflictsWith( - $anons, - 'rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global', - 'rcfilters-filtergroup-user-experience-level-conflicts-unregistered', - 'rcfilters-filter-unregistered-conflicts-user-experience-level' - ); + $registered = $userExperienceLevel->getFilter( 'registered' ); + $registered->setAsSupersetOf( $userExperienceLevel->getFilter( 'newcomer' ) ); + $registered->setAsSupersetOf( $userExperienceLevel->getFilter( 'learner' ) ); + $registered->setAsSupersetOf( $userExperienceLevel->getFilter( 'experienced' ) ); $categoryFilter = $changeTypeGroup->getFilter( 'hidecategorization' ); $logactionsFilter = $changeTypeGroup->getFilter( 'hidelog' ); @@ -1337,15 +1335,35 @@ abstract class ChangesListSpecialPage extends SpecialPage { $wgLearnerMemberSince, $wgExperiencedUserMemberSince; - $LEVEL_COUNT = 3; + $LEVEL_COUNT = 5; - // If all levels are selected, all logged-in users are included (but no - // anons), so we can short-circuit. + // If all levels are selected, don't filter if ( count( $selectedExpLevels ) === $LEVEL_COUNT ) { + return; + } + + // both 'registered' and 'unregistered', experience levels, if any, are included in 'registered' + if ( + in_array( 'registered', $selectedExpLevels ) && + in_array( 'unregistered', $selectedExpLevels ) + ) { + return; + } + + // 'registered' but not 'unregistered', experience levels, if any, are included in 'registered' + if ( + in_array( 'registered', $selectedExpLevels ) && + !in_array( 'unregistered', $selectedExpLevels ) + ) { $conds[] = 'rc_user != 0'; return; } + if ( $selectedExpLevels === [ 'unregistered' ] ) { + $conds[] = 'rc_user = 0'; + return; + } + $tables[] = 'user'; $join_conds['user'] = [ 'LEFT JOIN', 'rc_user = user_id' ]; @@ -1373,24 +1391,39 @@ abstract class ChangesListSpecialPage extends SpecialPage { IDatabase::LIST_AND ); + $conditions = []; + + if ( in_array( 'unregistered', $selectedExpLevels ) ) { + $selectedExpLevels = array_diff( $selectedExpLevels, [ 'unregistered' ] ); + $conditions[] = 'rc_user = 0'; + } + if ( $selectedExpLevels === [ 'newcomer' ] ) { - $conds[] = "NOT ( $aboveNewcomer )"; + $conditions[] = "NOT ( $aboveNewcomer )"; } elseif ( $selectedExpLevels === [ 'learner' ] ) { - $conds[] = $dbr->makeList( + $conditions[] = $dbr->makeList( [ $aboveNewcomer, "NOT ( $aboveLearner )" ], IDatabase::LIST_AND ); } elseif ( $selectedExpLevels === [ 'experienced' ] ) { - $conds[] = $aboveLearner; + $conditions[] = $aboveLearner; } elseif ( $selectedExpLevels === [ 'learner', 'newcomer' ] ) { - $conds[] = "NOT ( $aboveLearner )"; + $conditions[] = "NOT ( $aboveLearner )"; } elseif ( $selectedExpLevels === [ 'experienced', 'newcomer' ] ) { - $conds[] = $dbr->makeList( + $conditions[] = $dbr->makeList( [ "NOT ( $aboveNewcomer )", $aboveLearner ], IDatabase::LIST_OR ); } elseif ( $selectedExpLevels === [ 'experienced', 'learner' ] ) { - $conds[] = $aboveNewcomer; + $conditions[] = $aboveNewcomer; + } elseif ( $selectedExpLevels === [ 'experienced', 'learner', 'newcomer' ] ) { + $conditions[] = 'rc_user != 0'; + } + + if ( count( $conditions ) > 1 ) { + $conds[] = $dbr->makeList( $conditions, IDatabase::LIST_OR ); + } elseif ( count( $conditions ) === 1 ) { + $conds[] = reset( $conditions ); } } } diff --git a/languages/i18n/en.json b/languages/i18n/en.json index a76eafc3e4..263a1c1206 100644 --- a/languages/i18n/en.json +++ b/languages/i18n/en.json @@ -1380,26 +1380,22 @@ "rcfilters-noresults-conflict": "No results found because the search criteria are in conflict", "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", "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", - "rcfilters-filtergroup-registration": "User registration", - "rcfilters-filter-registered-label": "Registered", - "rcfilters-filter-registered-description": "Logged-in editors.", - "rcfilters-filter-unregistered-label": "Unregistered", - "rcfilters-filter-unregistered-description": "Editors who aren’t logged in.", - "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", "rcfilters-filtergroup-authorship": "Contribution authorship", "rcfilters-filter-editsbyself-label": "Changes by you", "rcfilters-filter-editsbyself-description": "Your own contributions.", "rcfilters-filter-editsbyother-label": "Changes by others", "rcfilters-filter-editsbyother-description": "All changes except your own.", - "rcfilters-filtergroup-userExpLevel": "Experience level (for registered users only)", - "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Experience filters find only registered users, so this filter conflicts with the “Unregistered” filter.", - "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.", + "rcfilters-filtergroup-userExpLevel": "Experience registration and experience", + "rcfilters-filter-user-experience-level-registered-label": "Registered", + "rcfilters-filter-user-experience-level-registered-description": "Logged-in editors.", + "rcfilters-filter-user-experience-level-unregistered-label": "Unregistered", + "rcfilters-filter-user-experience-level-unregistered-description": "Editors who aren't logged-in.", "rcfilters-filter-user-experience-level-newcomer-label": "Newcomers", - "rcfilters-filter-user-experience-level-newcomer-description": "Fewer than 10 edits and 4 days of activity.", + "rcfilters-filter-user-experience-level-newcomer-description": "Registered editors with fewer than 10 edits and 4 days of activity.", "rcfilters-filter-user-experience-level-learner-label": "Learners", - "rcfilters-filter-user-experience-level-learner-description": "More experience than \"Newcomers\" but less than \"Experienced users\".", + "rcfilters-filter-user-experience-level-learner-description": "Registered editors whose experience falls between \"Newcomers\" and \"Experienced users.\"", "rcfilters-filter-user-experience-level-experienced-label": "Experienced users", - "rcfilters-filter-user-experience-level-experienced-description": "More than 30 days of activity and 500 edits.", + "rcfilters-filter-user-experience-level-experienced-description": "Registered editors with more than 500 edits and 30 days of activity.", "rcfilters-filtergroup-automated": "Automated contributions", "rcfilters-filter-bots-label": "Bot", "rcfilters-filter-bots-description": "Edits made by automated tools.", diff --git a/languages/i18n/qqq.json b/languages/i18n/qqq.json index c8f0e060c7..182b910377 100644 --- a/languages/i18n/qqq.json +++ b/languages/i18n/qqq.json @@ -1570,20 +1570,16 @@ "rcfilters-noresults-conflict": "A message displayed in the results area when no results found because there are filters in conflict with one another.", "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", "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", - "rcfilters-filtergroup-registration": "Title for the filter group for editor registration type.", - "rcfilters-filter-registered-label": "Label for the filter for showing edits made by logged-in users.\n{{Identical|Registered}}", - "rcfilters-filter-registered-description": "Description for the filter for showing edits made by logged-in users.", - "rcfilters-filter-unregistered-label": "Label for the filter for showing edits made by logged-out users.\n{{Identical|Unregistered}}", - "rcfilters-filter-unregistered-description": "Description for the filter for showing edits made by logged-out users.", - "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", "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", "rcfilters-filter-editsbyself-label": "Label for the filter for showing edits made by the current user.", "rcfilters-filter-editsbyself-description": "Description for the filter for showing edits made by the current user.", "rcfilters-filter-editsbyother-label": "Label for the filter for showing edits made by anyone other than the current user.", "rcfilters-filter-editsbyother-description": "Description for the filter for showing edits made by anyone other than the current user.", "rcfilters-filtergroup-userExpLevel": "Title for the filter group for user experience levels.", - "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}}.", - "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}}.", + "rcfilters-filter-user-experience-level-registered-label": "Label for the filter for showing edits made by logged-in editors.", + "rcfilters-filter-user-experience-level-registered-description": "Description for the filter for showing edits made by logged-in editors.", + "rcfilters-filter-user-experience-level-unregistered-label": "Label for the filter for showing edits made by anonymous editors.", + "rcfilters-filter-user-experience-level-unregistered-description": "Description for the filter for showing edits made by anonymous editors.", "rcfilters-filter-user-experience-level-newcomer-label": "Label for the filter for showing edits made by new editors.", "rcfilters-filter-user-experience-level-newcomer-description": "Description for the filter for showing edits made by new editors.", "rcfilters-filter-user-experience-level-learner-label": "Label for the filter for showing edits made by learning editors.", diff --git a/maintenance/deleteDefaultMessages.php b/maintenance/deleteDefaultMessages.php index 69f4f893fc..ba8662ac2e 100644 --- a/maintenance/deleteDefaultMessages.php +++ b/maintenance/deleteDefaultMessages.php @@ -35,6 +35,7 @@ class DeleteDefaultMessages extends Maintenance { parent::__construct(); $this->addDescription( 'Deletes all pages in the MediaWiki namespace' . ' which were last edited by "MediaWiki default"' ); + $this->addOption( 'dry-run', 'Perform a dry run, delete nothing' ); } public function execute() { @@ -52,14 +53,23 @@ class DeleteDefaultMessages extends Maintenance { ); if ( $dbr->numRows( $res ) == 0 ) { - # No more messages left + // No more messages left $this->output( "done.\n" ); + return; + } + $dryrun = $this->hasOption( 'dry-run' ); + if ( $dryrun ) { + foreach ( $res as $row ) { + $title = Title::makeTitle( $row->page_namespace, $row->page_title ); + $this->output( "\n* [[$title]]" ); + } + $this->output( "\n\nRun again without --dry-run to delete these pages.\n" ); return; } - # Deletions will be made by $user temporarly added to the bot group - # in order to hide it in RecentChanges. + // Deletions will be made by $user temporarly added to the bot group + // in order to hide it in RecentChanges. $user = User::newFromName( 'MediaWiki default' ); if ( !$user ) { $this->error( "Invalid username", true ); @@ -67,7 +77,7 @@ class DeleteDefaultMessages extends Maintenance { $user->addGroup( 'bot' ); $wgUser = $user; - # Handle deletion + // Handle deletion $this->output( "\n...deleting old default messages (this may take a long time!)...", 'msg' ); $dbw = $this->getDB( DB_MASTER ); diff --git a/mw-config/config.js b/mw-config/config.js index 8b2d6e5ab4..c745ce44a7 100644 --- a/mw-config/config.js +++ b/mw-config/config.js @@ -4,7 +4,7 @@ function syncText() { var value = $( this ).val() - .replace( /[\[\]\{\}|#<>%+? ]/g, '_' ) + .replace( /[\[\]{}|#<>%+? ]/g, '_' ) // eslint-disable-line no-useless-escape .replace( /&/, '&' ) .replace( /__+/g, '_' ) .replace( /^_+/, '' ) @@ -14,17 +14,13 @@ } // Set up the help system - $( '.config-help-field-data' ) - .hide() - .closest( '.config-help-field-container' ) - .find( '.config-help-field-hint' ) - .show() - .click( function () { - $( this ) - .closest( '.config-help-field-container' ) - .find( '.config-help-field-data' ) - .slideToggle( 'fast' ); - } ); + $( '.config-help-field-data' ).hide() + .closest( '.config-help-field-container' ).find( '.config-help-field-hint' ) + .show() + .click( function () { + $( this ).closest( '.config-help-field-container' ).find( '.config-help-field-data' ) + .slideToggle( 'fast' ); + } ); // Show/hide code for DB-specific options // FIXME: Do we want slow, fast, or even non-animated (instantaneous) showing/hiding here? diff --git a/package.json b/package.json index e91f58be28..850723829c 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "grunt-banana-checker": "0.6.0", "grunt-contrib-copy": "1.0.0", "grunt-contrib-watch": "1.0.0", - "grunt-eslint": "19.0.0", + "grunt-eslint": "20.0.0", "grunt-jsonlint": "1.1.0", "grunt-karma": "2.0.0", "grunt-stylelint": "0.8.0", diff --git a/resources/src/jquery/jquery.badge.js b/resources/src/jquery/jquery.badge.js index 777386612f..40b3baf0e9 100644 --- a/resources/src/jquery/jquery.badge.js +++ b/resources/src/jquery/jquery.badge.js @@ -64,8 +64,7 @@ if ( $badge.length ) { $badge .toggleClass( 'mw-badge-important', isImportant ) - .find( '.mw-badge-content' ) - .text( text ); + .find( '.mw-badge-content' ).text( text ); } else { // Otherwise, create a new badge with the specified text and style $badge = $( '
' ) diff --git a/resources/src/jquery/jquery.colorUtil.js b/resources/src/jquery/jquery.colorUtil.js index 2be1dbaea5..a5b136d969 100644 --- a/resources/src/jquery/jquery.colorUtil.js +++ b/resources/src/jquery/jquery.colorUtil.js @@ -42,7 +42,7 @@ // Look for rgb(num%,num%,num%) // eslint-disable-next-line no-cond-assign - if ( result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec( color ) ) { + if ( result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)%\s*,\s*([0-9]+(?:\.[0-9]+)?)%\s*,\s*([0-9]+(?:\.[0-9]+)?)%\s*\)/.exec( color ) ) { return [ parseFloat( result[ 1 ] ) * 2.55, parseFloat( result[ 2 ] ) * 2.55, diff --git a/resources/src/jquery/jquery.makeCollapsible.js b/resources/src/jquery/jquery.makeCollapsible.js index 5ce9b1f9bc..aa76d6dfbb 100644 --- a/resources/src/jquery/jquery.makeCollapsible.js +++ b/resources/src/jquery/jquery.makeCollapsible.js @@ -264,14 +264,15 @@ buildDefaultToggleLink = function () { return $( '' ) .text( collapseText ) - .wrap( '' ).parent() - .attr( { - role: 'button', - tabindex: 0 - } ) - .prepend( '[' ) - .append( ']' ) - .on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler ); + .wrap( '' ) + .parent() + .attr( { + role: 'button', + tabindex: 0 + } ) + .prepend( '[' ) + .append( ']' ) + .on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler ); }; // Check if this element has a custom position for the toggle link diff --git a/resources/src/jquery/jquery.mwExtension.js b/resources/src/jquery/jquery.mwExtension.js index 6d478bd355..4bcccdd5e6 100644 --- a/resources/src/jquery/jquery.mwExtension.js +++ b/resources/src/jquery/jquery.mwExtension.js @@ -11,7 +11,7 @@ }, trimRight: function ( str ) { return str === null ? - '' : str.toString().replace( /\s+$/, '' ); + '' : str.toString().replace( /\s+$/, '' ); }, ucFirst: function ( str ) { return str.charAt( 0 ).toUpperCase() + str.slice( 1 ); @@ -122,7 +122,7 @@ } ); mw.log.deprecate( $, 'escapeRE', function ( str ) { - return str.replace( /([\\{}()|.?*+\-\^$\[\]])/g, '\\$1' ); + return str.replace( /([\\{}()|.?*+\-^$\[\]])/g, '\\$1' ); // eslint-disable-line no-useless-escape }, 'Use mediawiki.RegExp instead.' ); }( jQuery, mediaWiki ) ); diff --git a/resources/src/jquery/jquery.suggestions.js b/resources/src/jquery/jquery.suggestions.js index 75f1ba6e8e..4f4edc96b5 100644 --- a/resources/src/jquery/jquery.suggestions.js +++ b/resources/src/jquery/jquery.suggestions.js @@ -19,7 +19,6 @@ * @class jQuery.plugin.suggestions */ - // jscs:disable checkParamNames /** * @method suggestions * @chainable @@ -94,7 +93,6 @@ * @param {boolean} [options.highlightInput=false] Whether to highlight matched portions of the * input or not. */ - // jscs:enable checkParamNames ( function ( $, mw ) { @@ -755,7 +753,7 @@ 27, // escape 13, // enter 46, // delete - 8 // backspace + 8 // backspace ]; if ( context.data.keypressedCount === 0 && e.which === context.data.keypressed && diff --git a/resources/src/jquery/jquery.tablesorter.js b/resources/src/jquery/jquery.tablesorter.js index 8d019e568c..ec917730db 100644 --- a/resources/src/jquery/jquery.tablesorter.js +++ b/resources/src/jquery/jquery.tablesorter.js @@ -542,7 +542,7 @@ // Build RegEx // Any date formated with . , ' - or / - ts.dateRegex[ 0 ] = new RegExp( /^\s*(\d{1,2})[\,\.\-\/'\s]{1,2}(\d{1,2})[\,\.\-\/'\s]{1,2}(\d{2,4})\s*?/i ); + ts.dateRegex[ 0 ] = new RegExp( /^\s*(\d{1,2})[,.\-/'\s]{1,2}(\d{1,2})[,.\-/'\s]{1,2}(\d{2,4})\s*?/i ); // Written Month name, dmy ts.dateRegex[ 1 ] = new RegExp( @@ -684,7 +684,7 @@ } columnToCell = []; - cellsInRow = ( $row[ 0 ].cells.length ) || 0; // all cells in this row + cellsInRow = ( $row[ 0 ].cells.length ) || 0; // all cells in this row index = 0; // real cell index in this row for ( j = 0; j < columns; index++ ) { if ( index === cellsInRow ) { @@ -725,7 +725,7 @@ } ts.rgx = { IPAddress: [ - new RegExp( /^\d{1,3}[\.]\d{1,3}[\.]\d{1,3}[\.]\d{1,3}$/ ) + new RegExp( /^\d{1,3}[.]\d{1,3}[.]\d{1,3}[.]\d{1,3}$/ ) ], currency: [ new RegExp( /(^[£$€¥]|[£$€¥]$)/ ), @@ -736,7 +736,7 @@ new RegExp( /(https?|ftp|file):\/\// ) ], isoDate: [ - new RegExp( /^([-+]?\d{1,4})-([01]\d)-([0-3]\d)([T\s]((([01]\d|2[0-3])(:?[0-5]\d)?|24:?00)?(:?([0-5]\d|60))?([.,]\d+)?)([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?/ ), + new RegExp( /^([-+]?\d{1,4})-([01]\d)-([0-3]\d)([T\s]((([01]\d|2[0-3])(:?[0-5]\d)?|24:?00)?(:?([0-5]\d|60))?([.,]\d+)?)([zZ]|([+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?/ ), new RegExp( /^([-+]?\d{1,4})-([01]\d)-([0-3]\d)/ ) ], usLongDate: [ @@ -1059,7 +1059,7 @@ return getParserById( id ); }, - getParsers: function () { // for table diagnosis + getParsers: function () { // for table diagnosis return parsers; } }; diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.preview.js b/resources/src/mediawiki.action/mediawiki.action.edit.preview.js index 53c1fbbe4b..2b6fc9d8aa 100644 --- a/resources/src/mediawiki.action/mediawiki.action.edit.preview.js +++ b/resources/src/mediawiki.action/mediawiki.action.edit.preview.js @@ -301,8 +301,8 @@ role: 'navigation', 'aria-labelledby': 'p-lang-label' } ) - .append( $( '

' ).attr( 'id', 'p-lang-label' ).text( mw.msg( 'otherlanguages' ) ) ) - .append( $( '
' ).addClass( 'body' ).append( '