aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Petersen <public@petersendidit.com>2011-04-19 12:54:41 -0400
committerScott González <scott.gonzalez@gmail.com>2011-04-28 13:13:42 -0400
commit5d23e8eacd95b0bcb859c4303a39709ef8a4dc86 (patch)
tree0e39d17d4edf687a39926da25b89c60d095cf0e7
parentdcb1720f317aecfd7a8eaddd7a7756226d60ab09 (diff)
downloadjquery-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.js39
-rwxr-xr-xui/jquery.ui.tabs.js36
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;
};