diff --git a/resources/src/mediawiki.special.block.js b/resources/src/mediawiki.special.block.js index 6d003aa5bc5..d1bada0c180 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(); } } );