From 710d7620e7f713677a21fc5a8572581250499dd3 Mon Sep 17 00:00:00 2001 From: David Petersen Date: Sun, 6 Feb 2011 14:49:42 -0500 Subject: [PATCH] Tabs: Fix disable and enable methods to correctly handle when index is undefined. Use boolean when fully enabled/disabled. Allow selected tab to be disabled.Fixes #4386 --- tests/unit/tabs/tabs_defaults.js | 2 +- tests/unit/tabs/tabs_methods.js | 46 ++++++++++++++++++++---- tests/unit/tabs/tabs_options.js | 7 ++-- ui/jquery.ui.tabs.js | 62 +++++++++++++++++++++----------- 4 files changed, 85 insertions(+), 32 deletions(-) diff --git a/tests/unit/tabs/tabs_defaults.js b/tests/unit/tabs/tabs_defaults.js index d94fbda92..ef93c69ee 100644 --- a/tests/unit/tabs/tabs_defaults.js +++ b/tests/unit/tabs/tabs_defaults.js @@ -9,7 +9,7 @@ var tabs_defaults = { collapsible: false, cookie: null, disable: null, - disabled: [], + disabled: false, enable: null, event: "click", fx: null, diff --git a/tests/unit/tabs/tabs_methods.js b/tests/unit/tabs/tabs_methods.js index bfd9d7713..0209af697 100644 --- a/tests/unit/tabs/tabs_methods.js +++ b/tests/unit/tabs/tabs_methods.js @@ -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() { diff --git a/tests/unit/tabs/tabs_options.js b/tests/unit/tabs/tabs_options.js index 4fb802b66..1c621ac28 100644 --- a/tests/unit/tabs/tabs_options.js +++ b/tests/unit/tabs/tabs_options.js @@ -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() { diff --git a/ui/jquery.ui.tabs.js b/ui/jquery.ui.tabs.js index c1c78653a..fcdf22c0e 100755 --- a/ui/jquery.ui.tabs.js +++ b/ui/jquery.ui.tabs.js @@ -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 ] ) ); } -- 2.39.5