From 9ebeb0616a5ca556e507aecbe360f5dcec238737 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Scott=20Gonz=C3=A1lez?= Date: Tue, 12 Jun 2012 10:07:16 -0400 Subject: [PATCH] Tabs: Walk previous tabs (and loop) in refresh() in case the tab we're trying to activate is disabled. --- tests/unit/tabs/tabs_methods.js | 20 ++++++++++++++++++++ ui/jquery.ui.tabs.js | 16 +++++++++++++--- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/tests/unit/tabs/tabs_methods.js b/tests/unit/tabs/tabs_methods.js index ed3e73745..e48d353e7 100644 --- a/tests/unit/tabs/tabs_methods.js +++ b/tests/unit/tabs/tabs_methods.js @@ -148,6 +148,26 @@ test( "refresh", function() { disabled( element, false ); }); +test( "refresh - looping", function() { + expect( 6 ); + + var element = $( "#tabs1" ).tabs({ + disabled: [ 0 ], + active: 1 + }); + state( element, 0, 1, 0 ); + disabled( element, [ 0 ] ); + + // remove active, jump to previous + // previous is disabled, just back one more + // reached first tab, move to end + // activate last tab + element.find( ".ui-tabs-nav li" ).eq( 2 ).remove(); + element.tabs( "refresh" ); + state( element, 0, 1 ); + disabled( element, [ 0 ] ); +}); + asyncTest( "load", function() { expect( 30 ); diff --git a/ui/jquery.ui.tabs.js b/ui/jquery.ui.tabs.js index 8c7bd207b..e71b2a244 100644 --- a/ui/jquery.ui.tabs.js +++ b/ui/jquery.ui.tabs.js @@ -229,7 +229,7 @@ $.widget( "ui.tabs", { } }, - _focusNextTab: function( index, goingForward ) { + _findNextTab: function( index, goingForward ) { var lastTabIndex = this.tabs.length - 1; function constrain() { @@ -246,6 +246,11 @@ $.widget( "ui.tabs", { index = goingForward ? index + 1 : index - 1; } + return index; + }, + + _focusNextTab: function( index, goingForward ) { + index = this._findNextTab( index, goingForward ); this.tabs.eq( index ).focus(); return index; }, @@ -309,9 +314,14 @@ $.widget( "ui.tabs", { this.active = $(); // was active, but active tab is gone } else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) { + // all remaining tabs are disabled + if ( this.tabs.length === options.disabled.length ) { + options.active = false; + this.active = $(); // activate previous tab - next = options.active - 1; - this._activate( next >= 0 ? next : 0 ); + } else { + this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) ); + } // was active, active tab still exists } else { // make sure active index is correct -- 2.39.5