diff options
author | David Petersen <public@petersendidit.com> | 2011-04-19 12:54:41 -0400 |
---|---|---|
committer | Scott González <scott.gonzalez@gmail.com> | 2011-04-28 13:13:42 -0400 |
commit | 5d23e8eacd95b0bcb859c4303a39709ef8a4dc86 (patch) | |
tree | 0e39d17d4edf687a39926da25b89c60d095cf0e7 | |
parent | dcb1720f317aecfd7a8eaddd7a7756226d60ab09 (diff) | |
download | jquery-ui-5d23e8eacd95b0bcb859c4303a39709ef8a4dc86.tar.gz jquery-ui-5d23e8eacd95b0bcb859c4303a39709ef8a4dc86.zip |
Tabs: Fix issues with refresh method, add refresh method tests
-rw-r--r-- | tests/unit/tabs/tabs_methods.js | 39 | ||||
-rwxr-xr-x | ui/jquery.ui.tabs.js | 36 |
2 files changed, 54 insertions, 21 deletions
diff --git a/tests/unit/tabs/tabs_methods.js b/tests/unit/tabs/tabs_methods.js index c7c043760..9d6864218 100644 --- a/tests/unit/tabs/tabs_methods.js +++ b/tests/unit/tabs/tabs_methods.js @@ -86,7 +86,7 @@ test( "disable( index )", function() { }); test('refresh', function() { - expect(5); + expect( 13 ); var el = $('<div id="tabs"><ul></ul></div>').tabs(), ul = el.find('ul'); @@ -95,22 +95,45 @@ test('refresh', function() { ul.append('<li><a href="data/test.html">Test 1</a></li>'); el.tabs('refresh'); + equals( el.tabs('option', 'active'), 0, 'First tab added should be auto active'); + ok( $( "li:eq(0)", el).is('.ui-tabs-active'), 'First tab should be auto active'); equals( el.find('.ui-tabs-panel').length, 1, 'Panel created after refresh'); ul.find('li').remove(); el.tabs('refresh'); equals( el.find('.ui-tabs-panel').length, 0, 'Panel removed after refresh'); + equals( el.tabs('option', 'active'), false, 'No tabs are active'); - ul.append('<li><a href="#test1">Test 1</a></li>'); - $('<div id="test1">Test Panel 1</div>').insertAfter( ul ); + // Hide second tab + $('<li><a href="#test1">Test 1</a></li><li><a href="#test2">Test 2</a></li><li><a href="#test3">Test 3</a></li>') + .appendTo( ul ); + $('<div id="test1">Test Panel 1</div><div id="test2">Test Panel 2</div><div id="test3">Test Panel 3</div>') + .insertAfter( ul ); el.tabs('refresh'); - el.tabs('option', 'active', 0); - equals( el.tabs('option', 'active'), 0, 'First tab added should be auto active'); + equals( el.tabs('option', 'active'), 0, 'Second tab added should not be auto active'); + equals( $( "#test2", el ).css("display"), "none", 'Second panel is hidden'); - ul.append('<li><a href="#test2">Test 2</a></li>'); - $('<div id="test2">Test Panel 2</div>').insertAfter( ul ); + // Make second tab active and then remove the first one + el.tabs('option', 'active', 1); + el.find('a[href="#test1"]').parent().remove(); el.tabs('refresh'); - equals( el.tabs('option', 'active'), 0, 'Second tab added should not be auto active'); + equals( el.tabs('option', 'active'), 0, 'Active index correctly updated'); + ok( el.find('a[href="#test2"]').parent().is('.ui-tabs-active'), 'Tab is still active'); + + // Refresh with disabled tabs + el.tabs('disable', 1); + same( el.tabs('option', 'disabled'), [ 1 ], 'Second tab disabled'); + + el.find('a[href="#test3"]').remove(); + ul.append('<li><a href="#test4">Test 4</a></li>'); + $('<div id="test4">Test Panel 4</div>').insertAfter( ul ); + el.tabs('refresh'); + equals( el.tabs('option', 'disabled'), false, 'Not disabled'); + + ul.append('<li class="ui-state-disabled"><a href="#test3">Test 3</a></li>'); + $('<div id="test3">Test Panel 3</div>').insertAfter( ul ); + el.tabs('refresh'); + same( el.tabs('option', 'disabled'), [ 2 ], 'Second tab disabled'); }); test('load', function() { diff --git a/ui/jquery.ui.tabs.js b/ui/jquery.ui.tabs.js index 47cca9c37..c7483e0de 100755 --- a/ui/jquery.ui.tabs.js +++ b/ui/jquery.ui.tabs.js @@ -81,7 +81,7 @@ $.widget( "ui.tabs", { options.active = active; // don't allow collapsible: false and active: false - if ( !options.collapsible && options.active === false ) { + if ( !options.collapsible && options.active === false && this.anchors.length ) { options.active = 0; } @@ -170,7 +170,14 @@ $.widget( "ui.tabs", { }, refresh: function() { - var self = this; + var self = this, + options = this.options, + lis = $( " > li:has(a[href])", this.list ); + + // Get disabled tabs from class attribute from HTML + options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( n ) { + return lis.index( n ); + }); this._processTabs(); @@ -183,6 +190,20 @@ $.widget( "ui.tabs", { $( panel ).remove(); } }); + + this.panels.not( this._getPanelForTab( this.active ) ).hide(); + + if ( !this.anchors.length ) { + options.active = false; + this.active = $(); + } else if ( !this.active || ( this.active && !$.contains( this.list[ 0 ], this.active[ 0 ] ) ) ) { + // Activate previous tab + var next = options.active - 1; + this._activate( next >= 0 ? next : 0 ); + } else { + // Make sure active index is correct + options.active = this.anchors.index( this.active ); + } }, _refresh: function() { @@ -841,17 +862,6 @@ if ( $.uiBackCompat !== false ) { this.refresh(); - if ( this.anchors.length == 1 ) { - o.active = o.selected = 0; - $li.addClass( "ui-tabs-active ui-state-active" ); - $panel.show(); - this.element.queue( "tabs", function() { - self._trigger( "activate", null, self._ui( self.anchors[ 0 ], self.panels[ 0 ] ) ); - }); - - this.load( 0 ); - } - this._trigger( "add", null, this._ui( this.anchors[ index ], this.panels[ index ] ) ); return this; }; |