Remember checkbox state on Special:Block if checkbox disabled
authorThalia <thalia.e.chan@googlemail.com>
Mon, 15 Jul 2019 18:39:36 +0000 (19:39 +0100)
committerThalia <thalia.e.chan@googlemail.com>
Wed, 17 Jul 2019 11:52:54 +0000 (12:52 +0100)
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

index 6d003aa..d1bada0 100644 (file)
                        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 === '',
                                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 ) {
                                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();
                }
        } );