Bug Tracker

Changeset 4816

Show
Ignore:
Timestamp:
02/22/08 23:21:22 (11 months ago)
Author:
klaus.hartl
Message:

UI Tabs: added length method, fixed a bunch of bugs related to adding/removing and/or enabling/disabling tabs, fixes #2353

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/ui/ui.tabs.js

    r4814 r4816  
    1919        var args = method && Array.prototype.slice.call(arguments, 1) || arguments; 
    2020 
    21         return this.each(function() { 
    22             if (method) { 
    23                 var tabs = $.data(this, 'ui-tabs'); 
    24                 tabs[method].apply(tabs, args); 
    25             } else 
    26                 new $.ui.tabs(this, args[0] || {}); 
    27         }); 
     21        return method == 'length' ? 
     22            $.data(this[0], 'ui-tabs').$tabs.length : 
     23            this.each(function() { 
     24                if (method) { 
     25                    var tabs = $.data(this, 'ui-tabs'); 
     26                    tabs[method].apply(tabs, args); 
     27                } else 
     28                    new $.ui.tabs(this, args[0] || {}); 
     29            }); 
    2830    }; 
    2931 
     
    205207            // disable tabs 
    206208            for (var i = 0, li; li = this.$lis[i]; i++) 
    207                 $(li)[$.inArray(i, o.disabled) != -1 ? 'addClass' : 'removeClass'](o.disabledClass); 
     209                $(li)[$.inArray(i, o.disabled) != -1 && !$(li).hasClass(o.selectedClass) ? 'addClass' : 'removeClass'](o.disabledClass); 
    208210 
    209211            // set up animations 
     
    347349        }, 
    348350        add: function(url, label, index) { 
    349             if (url && label) { 
    350                 index = index || this.$tabs.length; // append by default 
    351  
    352                 var o = this.options; 
    353                 var $li = $(o.tabTemplate.replace(/#\{href\}/, url).replace(/#\{label\}/, label)); 
    354                 $li.data('destroy.ui-tabs', true); 
    355  
    356                 var id = url.indexOf('#') == 0 ? url.replace('#', '') : this.tabId( $('a:first-child', $li)[0] ); 
    357  
    358                 // try to find an existing element before creating a new one 
    359                 var $panel = $('#' + id); 
    360                 if (!$panel.length) { 
    361                     $panel = $(o.panelTemplate).attr('id', id) 
    362                         .addClass(o.panelClass).addClass(o.hideClass); 
    363                     $panel.data('destroy.ui-tabs', true); 
    364                 } 
    365                 if (index >= this.$lis.length) { 
    366                     $li.appendTo(this.element); 
    367                     $panel.appendTo(this.element.parentNode); 
    368                 } else { 
    369                     $li.insertBefore(this.$lis[index]); 
    370                     $panel.insertBefore(this.$panels[index]); 
    371                 } 
    372  
    373                 this.tabify(); 
    374  
    375                 if (this.$tabs.length == 1) { 
    376                      $li.addClass(o.selectedClass); 
    377                      $panel.removeClass(o.hideClass); 
    378                      var href = $.data(this.$tabs[0], 'load.ui-tabs'); 
    379                      if (href) 
    380                          this.load(index, href); 
    381                 } 
    382  
    383                 // callback 
    384                 $(this.element).triggerHandler("add.ui-tabs", 
    385                     [this.ui(this.$tabs[index], this.$panels[index])] 
    386                 ); 
    387  
    388             } else 
    389                 throw 'jQuery UI Tabs: Not enough arguments to add tab.'; 
     351            if (index == undefined)  
     352                index = this.$tabs.length; // append by default 
     353 
     354            var o = this.options; 
     355            var $li = $(o.tabTemplate.replace(/#\{href\}/, url).replace(/#\{label\}/, label)); 
     356            $li.data('destroy.ui-tabs', true); 
     357 
     358            var id = url.indexOf('#') == 0 ? url.replace('#', '') : this.tabId( $('a:first-child', $li)[0] ); 
     359 
     360            // try to find an existing element before creating a new one 
     361            var $panel = $('#' + id); 
     362            if (!$panel.length) { 
     363                $panel = $(o.panelTemplate).attr('id', id) 
     364                    .addClass(o.panelClass).addClass(o.hideClass); 
     365                $panel.data('destroy.ui-tabs', true); 
     366            } 
     367            if (index >= this.$lis.length) { 
     368                $li.appendTo(this.element); 
     369                $panel.appendTo(this.element.parentNode); 
     370            } else { 
     371                $li.insertBefore(this.$lis[index]); 
     372                $panel.insertBefore(this.$panels[index]); 
     373            } 
     374             
     375            o.disabled = $.map(o.disabled, 
     376                function(n, i) { return n >= index ? ++n : n }); 
     377                 
     378            this.tabify(); 
     379 
     380            if (this.$tabs.length == 1) { 
     381                 $li.addClass(o.selectedClass); 
     382                 $panel.removeClass(o.hideClass); 
     383                var href = $.data(this.$tabs[0], 'load.ui-tabs'); 
     384                 if (href) 
     385                     this.load(index, href); 
     386            } 
     387 
     388            // callback 
     389            $(this.element).triggerHandler("add.ui-tabs", 
     390                [this.ui(this.$tabs[index], this.$panels[index])] 
     391            ); 
    390392        }, 
    391393        remove: function(index) { 
     
    398400                this.select(index + (index + 1 < this.$tabs.length ? 1 : -1)); 
    399401 
     402            o.disabled = $.map($.grep(o.disabled, function(n, i) { return n != index; }), 
     403                function(n, i) { return n >= index ? --n : n }); 
     404 
    400405            this.tabify(); 
    401406 
     
    406411        }, 
    407412        enable: function(index) { 
    408             var self = this, o = this.options, $li = this.$lis.eq(index); 
    409             $li.removeClass(o.disabledClass); 
     413            var o = this.options; 
     414            if ($.inArray(index, o.disabled) == -1) 
     415                return; 
     416                 
     417            var $li = this.$lis.eq(index).removeClass(o.disabledClass); 
    410418            if ($.browser.safari) { // fix disappearing tab (that used opacity indicating disabling) after enabling in Safari 2... 
    411419                $li.css('display', 'inline-block'); 
     
    415423            } 
    416424 
    417             o.disabled = o.disabled.splice(index, 1); 
     425            o.disabled = $.grep(o.disabled, function(n, i) { return n != index; }); 
    418426 
    419427            // callback