History: Simplify checkboxes script on History pages
authorDerk-Jan Hartman <hartman.wiki@gmail.com>
Fri, 16 May 2014 13:52:52 +0000 (15:52 +0200)
committerKrinkle <krinklemail@gmail.com>
Wed, 11 Jun 2014 02:57:02 +0000 (02:57 +0000)
This should reduce the amount of variables constructed and also switches
to a class based implementation, which allows us to do the same with
fewer calls touching the DOM.

Not supported by IE6.

Bug: 51561
Change-Id: I4596b3667f990ef1d8c7ca753e1d80fe285d5614

resources/Resources.php
resources/src/mediawiki.action/mediawiki.action.history.css [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.history.js

index ac83302..ea7d397 100644 (file)
@@ -1024,6 +1024,7 @@ return array(
        ),
        'mediawiki.action.history' => array(
                'scripts' => 'resources/src/mediawiki.action/mediawiki.action.history.js',
+               'styles' => 'resources/src/mediawiki.action/mediawiki.action.history.css',
                'group' => 'mediawiki.action.history',
        ),
        'mediawiki.action.history.diff' => array(
diff --git a/resources/src/mediawiki.action/mediawiki.action.history.css b/resources/src/mediawiki.action/mediawiki.action.history.css
new file mode 100644 (file)
index 0000000..603a965
--- /dev/null
@@ -0,0 +1,4 @@
+#pagehistory li.before input[name="oldid"],
+#pagehistory li.after input[name="diff"] {
+       visibility: hidden;
+}
index 8aa5a1f..ac48c59 100644 (file)
@@ -12,54 +12,39 @@ jQuery( function ( $ ) {
         * @param e {jQuery.Event}
         */
        function updateDiffRadios() {
-               var diffLi = false, // the li where the diff radio is checked
-                       oldLi = false; // the li where the oldid radio is checked
+               var nextState = 'before',
+                       $li,
+                       $inputs,
+                       $oldidRadio,
+                       $diffRadio;
 
                if ( !$lis.length ) {
                        return true;
                }
 
                $lis
-               .removeClass( 'selected' )
                .each( function () {
-                       var     $li = $( this ),
-                               $inputs = $li.find( 'input[type="radio"]' ),
-                               $oldidRadio = $inputs.filter( '[name="oldid"]' ).eq( 0 ),
-                               $diffRadio = $inputs.filter( '[name="diff"]' ).eq( 0 );
+                       $li = $( this );
+                       $inputs = $li.find( 'input[type="radio"]' );
+                       $oldidRadio = $inputs.filter( '[name="oldid"]' ).eq( 0 );
+                       $diffRadio = $inputs.filter( '[name="diff"]' ).eq( 0 );
+
+                       $li.removeClass( 'selected between before after' );
 
                        if ( !$oldidRadio.length || !$diffRadio.length ) {
                                return true;
                        }
 
                        if ( $oldidRadio.prop( 'checked' ) ) {
-                               oldLi = true;
-                               $li.addClass( 'selected' );
-                               $oldidRadio.css( 'visibility', 'visible' );
-                               $diffRadio.css( 'visibility', 'hidden' );
-
+                               $li.addClass( 'selected after' );
+                               nextState = 'after';
                        } else if ( $diffRadio.prop( 'checked' ) ) {
-                               diffLi = true;
-                               $li.addClass( 'selected' );
-                               $oldidRadio.css( 'visibility', 'hidden' );
-                               $diffRadio.css( 'visibility', 'visible' );
-
-                       // This list item has neither checked
+                               $li.addClass( 'selected ' + nextState );
+                               nextState = 'between';
                        } else {
-                               // We're below the selected radios
-                               if ( diffLi && oldLi ) {
-                                       $oldidRadio.css( 'visibility', 'visible' );
-                                       $diffRadio.css( 'visibility', 'hidden' );
-
-                               // We're between the selected radios
-                               } else if ( diffLi ) {
-                                       $diffRadio.css( 'visibility', 'visible' );
-                                       $oldidRadio.css( 'visibility', 'visible' );
-
-                               // We're above the selected radios
-                               } else {
-                                       $diffRadio.css( 'visibility', 'visible' );
-                                       $oldidRadio.css( 'visibility', 'hidden' );
-                               }
+                               // This list item has neither checked
+                               // apply the appropriate class following the previous item.
+                               $li.addClass( nextState );
                        }
                } );