]> source.dussan.org Git - jquery-ui.git/commitdiff
Tabs: Fix disable and enable methods to correctly handle when index is undefined... 162/head
authorDavid Petersen <public@petersendidit.com>
Sun, 6 Feb 2011 19:49:42 +0000 (14:49 -0500)
committerDavid Petersen <public@petersendidit.com>
Mon, 21 Mar 2011 13:18:19 +0000 (09:18 -0400)
tests/unit/tabs/tabs_defaults.js
tests/unit/tabs/tabs_methods.js
tests/unit/tabs/tabs_options.js
ui/jquery.ui.tabs.js

index d94fbda92a577b7dc3e33a95ea8083831ba1698d..ef93c69ee5d9638e96b55c73b8c0eb9ba2411e94 100644 (file)
@@ -9,7 +9,7 @@ var tabs_defaults = {
        collapsible: false,
        cookie: null,
        disable: null,
-       disabled: [],
+       disabled: false,
        enable: null,
        event: "click",
        fx: null,
index bfd9d7713d4eee304b9cbcdeee6eec87c862d853..0209af6972c0e8673923b509bc33906523691048 100644 (file)
@@ -73,16 +73,32 @@ test('destroy', function() {
 });
 
 test('enable', function() {
-    expect(2);
+    expect(8);
 
        el = $('#tabs1').tabs({ disabled: [ 0, 1 ] });
        el.tabs("enable", 1);
        ok( $('li:eq(1)', el).is(':not(.ui-state-disabled)'), 'remove class from li');
-       same(el.tabs('option', 'disabled'), [ ], 'update property');
+       same(el.tabs('option', 'disabled'), [ 0 ], 'update property');
+       
+       // enable all tabs
+       el.tabs({ disabled: [ 0, 1 ] });
+       el.tabs("enable");
+       ok( !$('li.ui-state-disabled', el).length, 'enable all');
+       same(el.tabs('option', 'disabled'), false, 'update property');
+
+       el.tabs('destroy');
+       // enable all tabs one by one
+       el.tabs({ disabled: [ 1, 2 ] });
+       el.tabs("enable", 1);
+       ok( $('li:eq(1)', el).is(':not(.ui-state-disabled)'), 'remove class from li');
+       same(el.tabs('option', 'disabled'), [ 2 ], 'update property');
+       el.tabs("enable", 2);
+       ok( $('li:eq(2)', el).is(':not(.ui-state-disabled)'), 'remove class from li');
+       same( el.tabs('option', 'disabled'), false, 'set to false');
 });
 
 test('disable', function() {
-    expect(4);
+    expect(12);
 
        // normal
        el = $('#tabs1').tabs();
@@ -90,10 +106,28 @@ test('disable', function() {
        ok( $('li:eq(1)', el).is('.ui-state-disabled'), 'add class to li');
        same(el.tabs('option', 'disabled'), [ 1 ], 'update disabled property');
 
-       // attempt to disable selected has no effect
+       // disable selected
        el.tabs('disable', 0);
-       ok( $('li:eq(0)', el).is(':not(.ui-state-disabled)'), 'not add class to li');
-       same(el.tabs('option', 'disabled'), [ 1 ], 'not update property');
+       ok( $('li:eq(0)', el).is('.ui-state-disabled'), 'add class to selected li');
+       same(el.tabs('option', 'disabled'), [ 0, 1 ], 'update disabled property');
+       
+       // disable all tabs
+       el.tabs('disable');
+       same( $('li.ui-state-disabled', el).length, 3, 'disable all');
+       same(el.tabs('option', 'disabled'), true, 'set to true');
+
+       el.tabs("destroy");
+       // disable all tabs one by one
+       el.tabs();
+       el.tabs('disable', 0);
+       ok( $('li:eq(0)', el).is('.ui-state-disabled'), 'add class to li');
+       same(el.tabs('option', 'disabled'), [ 0 ], 'update disabled property');
+       el.tabs('disable', 1);
+       ok( $('li:eq(1)', el).is('.ui-state-disabled'), 'add class to li');
+       same(el.tabs('option', 'disabled'), [ 0, 1 ], 'update disabled property');
+       el.tabs('disable', 2);
+       ok( $('li:eq(2)', el).is('.ui-state-disabled'), 'add class to li');
+       same(el.tabs('option', 'disabled'), true, 'set to true');
 });
 
 test('add', function() {
index 4fb802b663d1cba9e029a8187a7493dd431949c8..1c621ac280f608e175852d95d175ed56e791727d 100644 (file)
@@ -67,17 +67,16 @@ test('disabled', function() {
        expect(4);
 
        el = $('#tabs1').tabs();
-       same(el.tabs('option', 'disabled'), [ ], "should not disable any tab by default");
+       same(el.tabs('option', 'disabled'), false, "should not disable any tab by default");
 
        el.tabs('option', 'disabled', [ 1 ]);
        same(el.tabs('option', 'disabled'), [ 1 ], "should set property"); // everything else is being tested in methods module...
 
-       // FIXME bug... property needs to be [ 1 ], since selected tab cannot be disabled!
        el.tabs('option', 'disabled', [ 0, 1 ]);
-       same(el.tabs('option', 'disabled'), [ 1 ], "should disable given tabs but not selected one"); // ...
+       same(el.tabs('option', 'disabled'), [ 0, 1 ], "should disable given tabs, even selected one"); // ...
 
        el.tabs('option', 'disabled', [ ]);
-       same(el.tabs('option', 'disabled'), [ ], "should not disable any tab"); // ...
+       same(el.tabs('option', 'disabled'), false, "should not disable any tab"); // ...
 });
 
 test('event', function() {
index c1c78653a5ee2ac0e20d35d70896fedb591a1002..fcdf22c0e5a1bced21b506fedd923da87da099a9 100755 (executable)
@@ -32,7 +32,7 @@ $.widget( "ui.tabs", {
                cookie: null, // e.g. { expires: 7, path: '/', domain: 'jquery.com', secure: true }
                collapsible: false,
                disable: null,
-               disabled: [],
+               disabled: false,
                enable: null,
                event: "click",
                fx: null, // e.g. { height: 'toggle', opacity: 'toggle', duration: 200 }
@@ -194,15 +194,12 @@ $.widget( "ui.tabs", {
 
                        // Take disabling tabs via class attribute from HTML
                        // into account and update option properly.
-                       // A selected tab cannot become disabled.
-                       o.disabled = $.unique( o.disabled.concat(
-                               $.map( this.lis.filter( ".ui-state-disabled" ), function( n, i ) {
-                                       return self.lis.index( n );
-                               })
-                       ) ).sort();
-
-                       if ( $.inArray( o.selected, o.disabled ) != -1 ) {
-                               o.disabled.splice( $.inArray( o.selected, o.disabled ), 1 );
+                       if ( $.isArray( o.disabled ) ) {
+                               o.disabled = $.unique( o.disabled.concat(
+                                       $.map( this.lis.filter( ".ui-state-disabled" ), function( n, i ) {
+                                               return self.lis.index( n );
+                                       })
+                               ) ).sort();
                        }
 
                        // highlight selected tab
@@ -233,6 +230,10 @@ $.widget( "ui.tabs", {
                        o.selected = this.lis.index( this.lis.filter( ".ui-tabs-selected" ) );
                }
 
+               if ( !o.disabled.length ) {
+                       o.disabled = false;
+               }
+
                this.element.toggleClass( "ui-tabs-collapsible", o.collapsible );
 
                // set or update cookie after init and add/remove respectively
@@ -242,8 +243,7 @@ $.widget( "ui.tabs", {
 
                // disable tabs
                for ( var i = 0, li; ( li = this.lis[ i ] ); i++ ) {
-                       $( li ).toggleClass( "ui-state-disabled",
-                               $.inArray( i, o.disabled ) != -1 && !$( li ).hasClass( "ui-tabs-selected" ) );
+                       $( li ).toggleClass( "ui-state-disabled", $.inArray( i, o.disabled ) != -1 );
                }
 
                // reset cache if switching from cached to not cached
@@ -533,30 +533,50 @@ $.widget( "ui.tabs", {
        },
 
        enable: function( index ) {
+               if ( index === undefined ) {
+                       for ( var i = 0, len = this.lis.length; i < len; i++ ) {
+                               this.enable( i );
+                       }
+                       return this;
+               }
                index = this._getIndex( index );
                var o = this.options;
-               if ( $.inArray( index, o.disabled ) == -1 ) {
+               if ( !o.disabled || ($.isArray( o.disabled ) && $.inArray( index, o.disabled ) == -1 ) ) {
                        return;
                }
 
                this.lis.eq( index ).removeClass( "ui-state-disabled" );
-               o.disabled = $.grep( o.disabled, function( n, i ) {
-                       return n != index;
-               });
+               o.disabled = this.lis.map( function( i ) {
+                       return $(this).is( ".ui-state-disabled" ) ? i : null;
+               }).get();
+
+               if ( !o.disabled.length ) {
+                       o.disabled = false;
+               }
 
                this._trigger( "enable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
                return this;
        },
 
        disable: function( index ) {
+               if ( index === undefined ) {
+                       for ( var i = 0, len = this.lis.length; i < len; i++ ) {
+                               this.disable( i );
+                       }
+                       return this;
+               }
                index = this._getIndex( index );
-               var self = this, o = this.options;
-               // cannot disable already selected tab
-               if ( index != o.selected ) {
+               var o = this.options;
+               if ( !o.disabled || ($.isArray( o.disabled ) && $.inArray( index, o.disabled ) == -1 ) ) {
                        this.lis.eq( index ).addClass( "ui-state-disabled" );
 
-                       o.disabled.push( index );
-                       o.disabled.sort();
+                       o.disabled = this.lis.map( function( i ) {
+                               return $(this).is( ".ui-state-disabled" ) ? i : null;
+                       }).get();
+                       
+                       if ( o.disabled.length === this.anchors.length ) {
+                               o.disabled = true;
+                       }
 
                        this._trigger( "disable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
                }