From 80674d1cb953d3798a382a3f25189d99097fc5a3 Mon Sep 17 00:00:00 2001 From: Thalia Date: Mon, 15 Jul 2019 19:39:36 +0100 Subject: [PATCH] Remember checkbox state on Special:Block if checkbox disabled Many of the blocking options on Special:Block are only valid for certain inputs. These options are represented with checkboxes. If an option is not valid with the current form inputs, its checkbox is disabled (and not submitted) and it is set to false by default. To make this clear to the user, we uncheck the checkbox when it is disabled. This stores the value of the checkbox before it was disabled and restores it if the checkbox is enabled again. Bug: T221117 Change-Id: I3e52d7c3eb70f2798de3fb5ac3824d56e73306a6 --- resources/src/mediawiki.special.block.js | 44 +++++++++++++++++------- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/resources/src/mediawiki.special.block.js b/resources/src/mediawiki.special.block.js index 6d003aa5bc..d1bada0c18 100644 --- a/resources/src/mediawiki.special.block.js +++ b/resources/src/mediawiki.special.block.js @@ -16,6 +16,31 @@ pageRestrictionsWidget, namespaceRestrictionsWidget, createAccountWidget, data, enablePartialBlocks, blockAllowsUTEdit, userChangedCreateAccount, updatingBlockOptions; + function preserveSelectedStateOnDisable( widget ) { + var widgetWasSelected; + + if ( !widget ) { + return; + } + + // 'disable' event fires if disabled state changes + widget.on( 'disable', function ( disabled ) { + if ( disabled ) { + // Disabling an enabled widget + // Save selected and set selected to false + widgetWasSelected = widget.isSelected(); + widget.setSelected( false ); + } else { + // Enabling a disabled widget + // Set selected to the saved value + if ( widgetWasSelected !== undefined ) { + widget.setSelected( widgetWasSelected ); + } + widgetWasSelected = undefined; + } + } ); + } + function updateBlockOptions() { var blocktarget = blockTargetWidget.getValue().trim(), isEmpty = blocktarget === '', @@ -31,27 +56,15 @@ isSitewide = editingIsSelected && editingRestrictionValue === 'sitewide'; enableAutoblockWidget.setDisabled( isNonEmptyIp ); - if ( enableAutoblockWidget.isDisabled() ) { - enableAutoblockWidget.setSelected( false ); - } anonOnlyWidget.setDisabled( !isIp && !isEmpty ); - if ( anonOnlyWidget.isDisabled() ) { - anonOnlyWidget.setSelected( false ); - } if ( hideUserWidget ) { hideUserWidget.setDisabled( isNonEmptyIp || !isIndefinite || !isSitewide ); - if ( hideUserWidget.isDisabled() ) { - hideUserWidget.setSelected( false ); - } } if ( watchUserWidget ) { watchUserWidget.setDisabled( isIpRange && !isEmpty ); - if ( watchUserWidget.isDisabled() ) { - watchUserWidget.setSelected( false ); - } } if ( enablePartialBlocks ) { @@ -124,6 +137,13 @@ preventTalkPageEditWidget = infuseIfExists( $( '#mw-input-wpDisableUTEdit' ) ); } + // When disabling checkboxes, preserve their selected state in case they are re-enabled + preserveSelectedStateOnDisable( enableAutoblockWidget ); + preserveSelectedStateOnDisable( anonOnlyWidget ); + preserveSelectedStateOnDisable( watchUserWidget ); + preserveSelectedStateOnDisable( hideUserWidget ); + preserveSelectedStateOnDisable( preventTalkPageEditWidget ); + updateBlockOptions(); } } ); -- 2.20.1