From a0c18ea25086ed07634baff5b4fea46e69aad38e Mon Sep 17 00:00:00 2001 From: Viktar Varvanovich Date: Thu, 24 May 2012 14:30:55 -0400 Subject: Draggable: Apply ui-draggable-dragging class prior to calculating dimensions. Fixes #8349 - Draggable: Incorrect dimensions used if .ui-draggable-dragging changes dimensions --- ui/jquery.ui.draggable.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'ui') diff --git a/ui/jquery.ui.draggable.js b/ui/jquery.ui.draggable.js index 84077ed29..5eb235642 100644 --- a/ui/jquery.ui.draggable.js +++ b/ui/jquery.ui.draggable.js @@ -102,6 +102,8 @@ $.widget("ui.draggable", $.ui.mouse, { //Create and append the visible helper this.helper = this._createHelper(event); + this.helper.addClass("ui-draggable-dragging"); + //Cache the helper size this._cacheHelperProportions(); @@ -162,7 +164,7 @@ $.widget("ui.draggable", $.ui.mouse, { if ($.ui.ddmanager && !o.dropBehaviour) $.ui.ddmanager.prepareOffsets(this, event); - this.helper.addClass("ui-draggable-dragging"); + this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position //If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003) -- cgit v1.2.3 From 4da1716cfd88ac9b4a8362f715c081c2f75bd316 Mon Sep 17 00:00:00 2001 From: Scott González Date: Thu, 24 May 2012 15:10:49 -0400 Subject: Draggable: Fixed destroy method. --- ui/jquery.ui.draggable.js | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) (limited to 'ui') diff --git a/ui/jquery.ui.draggable.js b/ui/jquery.ui.draggable.js index 5eb235642..1845f0891 100644 --- a/ui/jquery.ui.draggable.js +++ b/ui/jquery.ui.draggable.js @@ -55,17 +55,9 @@ $.widget("ui.draggable", $.ui.mouse, { }, - destroy: function() { - if(!this.element.data('draggable')) return; - this.element - .removeData("draggable") - .unbind(".draggable") - .removeClass("ui-draggable" - + " ui-draggable-dragging" - + " ui-draggable-disabled"); + _destroy: function() { + this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" ); this._mouseDestroy(); - - return this; }, _mouseCapture: function(event) { -- cgit v1.2.3 From ae3d3515a7489ae4abd9a10b14db97dc1d7b9476 Mon Sep 17 00:00:00 2001 From: Scott González Date: Thu, 24 May 2012 15:16:28 -0400 Subject: Resizable: Fixed destroy method. --- ui/jquery.ui.resizable.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'ui') diff --git a/ui/jquery.ui.resizable.js b/ui/jquery.ui.resizable.js index 6039cf648..f9330e843 100644 --- a/ui/jquery.ui.resizable.js +++ b/ui/jquery.ui.resizable.js @@ -190,13 +190,13 @@ $.widget("ui.resizable", $.ui.mouse, { }, - destroy: function() { + _destroy: function() { this._mouseDestroy(); var _destroy = function(exp) { $(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing") - .removeData("resizable").unbind(".resizable").find('.ui-resizable-handle').remove(); + .removeData("resizable").removeData("ui-resizable").unbind(".resizable").find('.ui-resizable-handle').remove(); }; //TODO: Unwrap at same DOM position -- cgit v1.2.3 From 446d8b7f4cbf132252b972d744aa8be46d04d2bc Mon Sep 17 00:00:00 2001 From: Scott González Date: Thu, 24 May 2012 15:18:04 -0400 Subject: Selectable: Fixed destroy method. --- ui/jquery.ui.selectable.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) (limited to 'ui') diff --git a/ui/jquery.ui.selectable.js b/ui/jquery.ui.selectable.js index f8a0134f8..2db9a8886 100644 --- a/ui/jquery.ui.selectable.js +++ b/ui/jquery.ui.selectable.js @@ -61,17 +61,13 @@ $.widget("ui.selectable", $.ui.mouse, { this.helper = $("
"); }, - destroy: function() { + _destroy: function() { this.selectees .removeClass("ui-selectee") .removeData("selectable-item"); this.element - .removeClass("ui-selectable ui-selectable-disabled") - .removeData("selectable") - .unbind(".selectable"); + .removeClass("ui-selectable ui-selectable-disabled"); this._mouseDestroy(); - - return this; }, _mouseStart: function(event) { -- cgit v1.2.3 From 79e4ae93b56d50ac61873205f1b5142d2f5a87e9 Mon Sep 17 00:00:00 2001 From: Scott González Date: Thu, 24 May 2012 15:20:10 -0400 Subject: Droppable: Fixed destroy method. --- ui/jquery.ui.droppable.js | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) (limited to 'ui') diff --git a/ui/jquery.ui.droppable.js b/ui/jquery.ui.droppable.js index 47d3e38e9..e2ad221e1 100644 --- a/ui/jquery.ui.droppable.js +++ b/ui/jquery.ui.droppable.js @@ -47,18 +47,13 @@ $.widget("ui.droppable", { }, - destroy: function() { + _destroy: function() { var drop = $.ui.ddmanager.droppables[this.options.scope]; for ( var i = 0; i < drop.length; i++ ) if ( drop[i] == this ) drop.splice(i, 1); - this.element - .removeClass("ui-droppable ui-droppable-disabled") - .removeData("droppable") - .unbind(".droppable"); - - return this; + this.element.removeClass("ui-droppable ui-droppable-disabled"); }, _setOption: function(key, value) { -- cgit v1.2.3 From 1af21ce27df1db7468d91f19f61423d2e9af4449 Mon Sep 17 00:00:00 2001 From: Scott González Date: Thu, 24 May 2012 15:21:35 -0400 Subject: Spinner: Use _destroy() instead of destroy(). --- ui/jquery.ui.spinner.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'ui') diff --git a/ui/jquery.ui.spinner.js b/ui/jquery.ui.spinner.js index 1e4204a0c..b01feec9a 100644 --- a/ui/jquery.ui.spinner.js +++ b/ui/jquery.ui.spinner.js @@ -427,7 +427,7 @@ $.widget( "ui.spinner", { this._refresh(); }, - destroy: function() { + _destroy: function() { this.element .removeClass( "ui-spinner-input" ) .prop( "disabled", false ) @@ -436,7 +436,6 @@ $.widget( "ui.spinner", { .removeAttr( "aria-valuemin" ) .removeAttr( "aria-valuemax" ) .removeAttr( "aria-valuenow" ); - this._super(); this.uiSpinner.replaceWith( this.element ); }, -- cgit v1.2.3 From 6a48cda4588454acb71984874c88535dde922757 Mon Sep 17 00:00:00 2001 From: Scott González Date: Thu, 24 May 2012 15:46:22 -0400 Subject: Accordion: Make sure there's always one header with tabindex=0. Fixes #8348 - Accordion: Collapsed accordion is removed from tab order. --- ui/jquery.ui.accordion.js | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) (limited to 'ui') diff --git a/ui/jquery.ui.accordion.js b/ui/jquery.ui.accordion.js index f713d25b8..0f1455790 100644 --- a/ui/jquery.ui.accordion.js +++ b/ui/jquery.ui.accordion.js @@ -453,16 +453,23 @@ $.widget( "ui.accordion", { this._toggleComplete( data ); } - toHide - .attr({ - "aria-expanded": "false", - "aria-hidden": "true" + toHide.attr({ + "aria-expanded": "false", + "aria-hidden": "true" + }); + toHide.prev().attr( "aria-selected", "false" ); + // if we're switching panels, remove the old header from the tab order + // if we're opening from collapsed state, remove the previous header from the tab order + // if we're collapsing, then keep the collapsing header in the tab order + if ( toShow.length && toHide.length ) { + toHide.prev().attr( "tabIndex", -1 ); + } else if ( toShow.length ) { + this.headers.filter(function() { + return $( this ).attr( "tabIndex" ) === 0; }) - .prev() - .attr({ - "aria-selected": "false", - tabIndex: -1 - }); + .attr( "tabIndex", -1 ); + } + toShow .attr({ "aria-expanded": "true", -- cgit v1.2.3 From 03da6e41f651d6dd227430757ec4c0d197d01c0c Mon Sep 17 00:00:00 2001 From: Scott González Date: Thu, 24 May 2012 16:16:27 -0400 Subject: Autocomplete: Remove left-over clearTimeout( this.closing ). --- ui/jquery.ui.autocomplete.js | 1 - 1 file changed, 1 deletion(-) (limited to 'ui') diff --git a/ui/jquery.ui.autocomplete.js b/ui/jquery.ui.autocomplete.js index e5cc9e693..2fb7e395c 100644 --- a/ui/jquery.ui.autocomplete.js +++ b/ui/jquery.ui.autocomplete.js @@ -429,7 +429,6 @@ $.widget( "ui.autocomplete", { }, _close: function( event ) { - clearTimeout( this.closing ); if ( this.menu.element.is( ":visible" ) ) { this.menu.element.hide(); this.menu.blur(); -- cgit v1.2.3 From f63bb4fbc4899dacee2e55784bafc59b4a829954 Mon Sep 17 00:00:00 2001 From: Scott González Date: Thu, 24 May 2012 21:15:55 -0400 Subject: Menu: Minor cleanup. --- ui/jquery.ui.menu.js | 95 ++++++++++++++++++++++++++++------------------------ 1 file changed, 52 insertions(+), 43 deletions(-) (limited to 'ui') diff --git a/ui/jquery.ui.menu.js b/ui/jquery.ui.menu.js index 1bfd76716..e6a047e53 100644 --- a/ui/jquery.ui.menu.js +++ b/ui/jquery.ui.menu.js @@ -36,11 +36,9 @@ $.widget( "ui.menu", { _create: function() { this.activeMenu = this.element; this.menuId = this.element.attr( "id" ) || "ui-menu-" + idIncrement++; - if ( this.element.find( ".ui-icon" ).length ) { - this.element.addClass( "ui-menu-icons" ); - } this.element .addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" ) + .toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length ) .attr({ id: this.menuId, role: this.options.role, @@ -95,9 +93,9 @@ $.widget( "ui.menu", { target.siblings().children( ".ui-state-active" ).removeClass( "ui-state-active" ); this.focus( event, target ); }, - "mouseleave": "collapseAll", + mouseleave: "collapseAll", "mouseleave .ui-menu": "collapseAll", - "focus": function( event ) { + focus: function( event ) { var menu = this.element, firstItem = menu.children( ".ui-menu-item" ).eq( 0 ); if ( this._hasScroll() && !this.active ) { @@ -120,11 +118,13 @@ $.widget( "ui.menu", { } }); }, - "keydown": "_keydown" + keydown: "_keydown" }); this.refresh(); + // TODO: We probably shouldn't bind to document for each menu. + // TODO: This isn't being cleaned up on destroy. this._bind( this.document, { click: function( event ) { if ( !$( event.target ).closest( ".ui-menu" ).length ) { @@ -149,7 +149,6 @@ $.widget( "ui.menu", { // destroy menu items this.element.find( ".ui-menu-item" ) - .unbind( ".menu" ) .removeClass( "ui-menu-item" ) .removeAttr( "role" ) .children( "a" ) @@ -158,6 +157,7 @@ $.widget( "ui.menu", { .removeAttr( "role" ) .removeAttr( "aria-haspopup" ) .removeAttr( "id" ) + // TODO: is this correct? Don't these exist in the original markup? .children( ".ui-icon" ) .remove(); @@ -166,82 +166,80 @@ $.widget( "ui.menu", { }, _keydown: function( event ) { + var match, prev, character, skip, + preventDefault = true; + + function escape( value ) { + return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ); + } + switch ( event.keyCode ) { case $.ui.keyCode.PAGE_UP: this.previousPage( event ); - event.preventDefault(); break; case $.ui.keyCode.PAGE_DOWN: this.nextPage( event ); - event.preventDefault(); break; case $.ui.keyCode.HOME: this._move( "first", "first", event ); - event.preventDefault(); break; case $.ui.keyCode.END: this._move( "last", "last", event ); - event.preventDefault(); break; case $.ui.keyCode.UP: this.previous( event ); - event.preventDefault(); break; case $.ui.keyCode.DOWN: this.next( event ); - event.preventDefault(); break; case $.ui.keyCode.LEFT: this.collapse( event ); - event.preventDefault(); break; case $.ui.keyCode.RIGHT: if ( !this.active.is( ".ui-state-disabled" ) ) { this.expand( event ); } - event.preventDefault(); break; case $.ui.keyCode.ENTER: this._activate( event ); - event.preventDefault(); break; case $.ui.keyCode.SPACE: this._activate( event ); - event.preventDefault(); break; case $.ui.keyCode.ESCAPE: this.collapse( event ); - event.preventDefault(); break; default: + preventDefault = false; + prev = this.previousFilter || ""; + character = String.fromCharCode( event.keyCode ); + skip = false; + clearTimeout( this.filterTimer ); - var match, - prev = this.previousFilter || "", - character = String.fromCharCode( event.keyCode ), - skip = false; if ( character === prev ) { skip = true; } else { character = prev + character; } - function escape( value ) { - return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); - } + match = this.activeMenu.children( ".ui-menu-item" ).filter(function() { return new RegExp( "^" + escape( character ), "i" ) .test( $( this ).children( "a" ).text() ); }); - match = skip && match.index(this.active.next()) !== -1 ? - this.active.nextAll(".ui-menu-item") : + match = skip && match.index( this.active.next() ) !== -1 ? + this.active.nextAll( ".ui-menu-item" ) : match; + + // TODO: document what's going on here, character is reset to the original value if ( !match.length ) { - character = String.fromCharCode(event.keyCode); - match = this.activeMenu.children(".ui-menu-item").filter(function() { + character = String.fromCharCode( event.keyCode ); + match = this.activeMenu.children( ".ui-menu-item" ).filter(function() { return new RegExp( "^" + escape(character), "i" ) .test( $( this ).children( "a" ).text() ); }); } + if ( match.length ) { this.focus( event, match ); if ( match.length > 1 ) { @@ -256,6 +254,10 @@ $.widget( "ui.menu", { delete this.previousFilter; } } + + if ( preventDefault ) { + event.preventDefault(); + } }, _activate: function( event ) { @@ -289,10 +291,12 @@ $.widget( "ui.menu", { .attr( "role", "presentation" ) .children( "a" ) .addClass( "ui-corner-all" ) - .attr( "tabIndex", -1 ) - .attr( "role", this._itemRole() ) - .attr( "id", function( i ) { - return menuId + "-" + i; + .attr({ + tabIndex: -1, + role: this._itemRole(), + id: function( i ) { + return menuId + "-" + i; + } }); // initialize unlinked menu-items as dividers @@ -305,7 +309,8 @@ $.widget( "ui.menu", { var menu = $( this ), item = menu.prev( "a" ); - item.attr( "aria-haspopup", "true" ) + item + .attr( "aria-haspopup", "true" ) .prepend( '' ); menu.attr( "aria-labelledby", item.attr( "id" ) ); }); @@ -333,7 +338,11 @@ $.widget( "ui.menu", { } // highlight active parent menu item, if any - this.active.parent().closest( ".ui-menu-item" ).children( "a:first" ).addClass( "ui-state-active" ); + this.active + .parent() + .closest( ".ui-menu-item" ) + .children( "a:first" ) + .addClass( "ui-state-active" ); if ( event && event.type === "keydown" ) { this._close(); @@ -401,18 +410,18 @@ $.widget( "ui.menu", { }, _open: function( submenu ) { + var position = $.extend({ + of: this.active + }, $.type( this.options.position ) === "function" ? + this.options.position( this.active ) : + this.options.position + ); + clearTimeout( this.timer ); this.element.find( ".ui-menu" ).not( submenu.parents() ) .hide() .attr( "aria-hidden", "true" ); - var position = $.extend( {}, { - of: this.active - }, $.type( this.options.position ) === "function" ? - this.options.position( this.active ) : - this.options.position - ); - submenu .show() .removeAttr( "aria-hidden" ) @@ -476,7 +485,7 @@ $.widget( "ui.menu", { if ( newItem && newItem.length ) { this._open( newItem.parent() ); - //timeout so Firefox will not hide activedescendant change in expanding submenu from AT + // timeout so Firefox will not hide activedescendant change in expanding submenu from AT this._delay(function() { this.focus( event, newItem ); }, 20 ); -- cgit v1.2.3 From fe7ca1f1c3922a301169256ed0614c5529e40454 Mon Sep 17 00:00:00 2001 From: kborchers Date: Thu, 24 May 2012 23:44:51 -0500 Subject: Menu: Better handling of divider elements and menu items without anchors. --- tests/unit/menu/menu.html | 3 +++ tests/unit/menu/menu_events.js | 27 +++++++++++++++------- tests/unit/menu/menu_methods.js | 6 ++++- tests/visual/menu/menu.html | 51 +++++++++++++++++++++++++++++++++++++++-- ui/jquery.ui.menu.js | 9 ++++++-- 5 files changed, 83 insertions(+), 13 deletions(-) (limited to 'ui') diff --git a/tests/unit/menu/menu.html b/tests/unit/menu/menu.html index 62585d863..a8a76bf14 100644 --- a/tests/unit/menu/menu.html +++ b/tests/unit/menu/menu.html @@ -88,8 +88,11 @@ Delphi
  • Perch
  • diff --git a/tests/unit/menu/menu_events.js b/tests/unit/menu/menu_events.js index ec3e7d3c4..2132ff764 100644 --- a/tests/unit/menu/menu_events.js +++ b/tests/unit/menu/menu_events.js @@ -315,16 +315,27 @@ asyncTest("handle keyboard navigation on menu without scroll and with submenus", equal( $("#log").html(), "4,keydown,", "Keydown ESCAPE (close submenu)"); log("keydown",true); - element.simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); - setTimeout( menukeyboard5, 50 ); + element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); + element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); + element.simulate( "keydown", { keyCode: $.ui.keyCode.RIGHT } ); + setTimeout( function() { + element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); + element.simulate( "keydown", { keyCode: $.ui.keyCode.RIGHT } ); + setTimeout( function() { + element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); + element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); + element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); + equal( $("#log").html(), "0,4,2,0,1,0,6,5,keydown,", "Keydown skip dividers and items without anchors"); + + log("keydown",true); + element.simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); + setTimeout( menukeyboard6, 50 ); + }, 50 ); + }, 50 ); } - function menukeyboard5() { - equal( $("#log").html(), "0,keydown,", "Keydown ENTER (open submenu)"); - - log("keydown",true); - element.simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); - equal( $("#log").html(), "Ada,keydown,", "Keydown ENTER (select item)"); + function menukeyboard6() { + equal( $("#log").html(), "Ada,keydown,", "Keydown ENTER (open submenu)"); start(); } diff --git a/tests/unit/menu/menu_methods.js b/tests/unit/menu/menu_methods.js index fc4fce4f1..c17986816 100644 --- a/tests/unit/menu/menu_methods.js +++ b/tests/unit/menu/menu_methods.js @@ -29,13 +29,17 @@ test( "enable/disable", function() { }); test( "refresh", function() { - expect( 3 ); + expect( 5 ); var menu = $( "#menu1" ).menu(); equal(menu.find(".ui-menu-item").length,5,"Incorrect number of menu items"); menu.append("
  • test item
  • ").menu("refresh"); equal(menu.find(".ui-menu-item").length,6,"Incorrect number of menu items"); menu.find(".ui-menu-item:last").remove().end().menu("refresh"); equal(menu.find(".ui-menu-item").length,5,"Incorrect number of menu items"); + menu.append("
  • ---
  • ").menu("refresh"); + equal(menu.find(".ui-menu-item").length,5,"Incorrect number of menu items"); + menu.children(":last").remove().end().menu("refresh"); + equal(menu.find(".ui-menu-item").length,5,"Incorrect number of menu items"); }); test("destroy", function() { diff --git a/tests/visual/menu/menu.html b/tests/visual/menu/menu.html index f92de61db..dd86a6e4b 100644 --- a/tests/visual/menu/menu.html +++ b/tests/visual/menu/menu.html @@ -15,7 +15,7 @@ $( "

    " ).text( "Selected: " + ui.item.text() ).appendTo( "#log" ); } - $( "#menu1, #menu2, #menu3, .menu4" ).menu({ + $( "#menu1, #menu2, #menu3, .menu4, #menu7" ).menu({ select: logger }); @@ -58,7 +58,6 @@

  • Ada
  • Adamsville
  • Addyston
  • -
  • Delphi
      @@ -257,6 +256,54 @@ +

      Inline with dividers and elements without anchors

      + +
      Log:
      diff --git a/ui/jquery.ui.menu.js b/ui/jquery.ui.menu.js index e6a047e53..5a3afdaaf 100644 --- a/ui/jquery.ui.menu.js +++ b/ui/jquery.ui.menu.js @@ -299,8 +299,13 @@ $.widget( "ui.menu", { } }); - // initialize unlinked menu-items as dividers - menus.children( ":not(.ui-menu-item)" ).addClass( "ui-widget-content ui-menu-divider" ); + // initialize unlinked menu-items containing spaces and/or dashes only as dividers + menus.children( ":not(.ui-menu-item)" ).each( function() { + var item = $( this ); + if ( !/[^\-—–\s]/.test( item.text() ) ) { + item.addClass( "ui-widget-content ui-menu-divider" ); + } + }); // add aria-disabled attribute to any disabled menu item menus.children( ".ui-state-disabled" ).attr( "aria-disabled", "true" ); -- cgit v1.2.3 From be784b2f79e6f70a8b02d4ae7834d5081d8993c6 Mon Sep 17 00:00:00 2001 From: Scott González Date: Fri, 25 May 2012 12:58:40 -0400 Subject: Menu: Added a comment about which characters are checked for dividers. --- ui/jquery.ui.menu.js | 1 + 1 file changed, 1 insertion(+) (limited to 'ui') diff --git a/ui/jquery.ui.menu.js b/ui/jquery.ui.menu.js index 5a3afdaaf..8d28ee82f 100644 --- a/ui/jquery.ui.menu.js +++ b/ui/jquery.ui.menu.js @@ -302,6 +302,7 @@ $.widget( "ui.menu", { // initialize unlinked menu-items containing spaces and/or dashes only as dividers menus.children( ":not(.ui-menu-item)" ).each( function() { var item = $( this ); + // hypen, em dash, en dash if ( !/[^\-—–\s]/.test( item.text() ) ) { item.addClass( "ui-widget-content ui-menu-divider" ); } -- cgit v1.2.3 From 6e2f95f59d73d86a2b84faecba3fca593534b8c9 Mon Sep 17 00:00:00 2001 From: Danny Trunk Date: Mon, 28 May 2012 15:11:20 -0400 Subject: Tabs: Added heightStyle option. Fixed #8345 - Tabs: Add heightStyle option. --- tests/unit/tabs/tabs.html | 25 ++++++++++++ tests/unit/tabs/tabs_common.js | 1 + tests/unit/tabs/tabs_common_deprecated.js | 1 + tests/unit/tabs/tabs_deprecated.html | 25 ++++++++++++ tests/unit/tabs/tabs_options.js | 67 +++++++++++++++++++++++++++++++ tests/unit/tabs/tabs_test_helpers.js | 6 +++ ui/jquery.ui.tabs.js | 54 +++++++++++++++++++++++++ 7 files changed, 179 insertions(+) (limited to 'ui') diff --git a/tests/unit/tabs/tabs.html b/tests/unit/tabs/tabs.html index b9fa507d8..3a55f3b79 100644 --- a/tests/unit/tabs/tabs.html +++ b/tests/unit/tabs/tabs.html @@ -31,6 +31,14 @@ + @@ -120,6 +128,23 @@
      +
      +
      +
        +
      • 1
      • +
      • 2
      • +
      +
      +

      Lorem ipsum

      +

      Lorem ipsum

      +

      Lorem ipsum

      +
      +
      +

      Lorem ipsum

      +
      +
      +
      + diff --git a/tests/unit/tabs/tabs_common.js b/tests/unit/tabs/tabs_common.js index b98ff3575..a589515f8 100644 --- a/tests/unit/tabs/tabs_common.js +++ b/tests/unit/tabs/tabs_common.js @@ -4,6 +4,7 @@ TestHelpers.commonWidgetTests( "tabs", { collapsible: false, disabled: false, event: "click", + heightStyle: "content", hide: null, show: null, diff --git a/tests/unit/tabs/tabs_common_deprecated.js b/tests/unit/tabs/tabs_common_deprecated.js index 718ae8272..5b41014da 100644 --- a/tests/unit/tabs/tabs_common_deprecated.js +++ b/tests/unit/tabs/tabs_common_deprecated.js @@ -7,6 +7,7 @@ TestHelpers.commonWidgetTests( "tabs", { cookie: null, disabled: false, event: "click", + heightStyle: "content", hide: null, fx: null, idPrefix: "ui-tabs-", diff --git a/tests/unit/tabs/tabs_deprecated.html b/tests/unit/tabs/tabs_deprecated.html index e58382efb..bb4088350 100644 --- a/tests/unit/tabs/tabs_deprecated.html +++ b/tests/unit/tabs/tabs_deprecated.html @@ -30,6 +30,14 @@ + @@ -119,6 +127,23 @@
      +
      +
      +
        +
      • 1
      • +
      • 2
      • +
      +
      +

      Lorem ipsum

      +

      Lorem ipsum

      +

      Lorem ipsum

      +
      +
      +

      Lorem ipsum

      +
      +
      +
      + diff --git a/tests/unit/tabs/tabs_options.js b/tests/unit/tabs/tabs_options.js index df6827c57..8365a42d7 100644 --- a/tests/unit/tabs/tabs_options.js +++ b/tests/unit/tabs/tabs_options.js @@ -1,6 +1,7 @@ (function( $ ) { var disabled = TestHelpers.tabs.disabled, + equalHeight = TestHelpers.tabs.equalHeight, state = TestHelpers.tabs.state; module( "tabs: options" ); @@ -211,6 +212,72 @@ test( "{ event: custom }", function() { state( element, 0, 1, 0 ); }); +test( "{ heightStyle: 'auto' }", function() { + expect( 2 ); + var element = $( "#tabs8" ).tabs({ heightStyle: "auto" }); + equalHeight( element, 45 ); +}); + +test( "{ heightStyle: 'content' }", function() { + expect( 2 ); + var element = $( "#tabs8" ).tabs({ heightStyle: "content" }), + sizes = element.find( ".ui-tabs-panel" ).map(function() { + return $( this ).height(); + }).get(); + equal( sizes[ 0 ], 45 ); + equal( sizes[ 1 ], 15 ); +}); + +test( "{ heightStyle: 'fill' }", function() { + expect( 2 ); + $( "#tabs8Wrapper" ).height( 500 ); + var element = $( "#tabs8" ).tabs({ heightStyle: "fill" }); + equalHeight( element, 485 ); +}); + +test( "{ heightStyle: 'fill' } with sibling", function() { + expect( 2 ); + $( "#tabs8Wrapper" ).height( 500 ); + $( "

      Lorem Ipsum

      " ) + .css({ + height: 50, + marginTop: 20, + marginBottom: 30 + }) + .prependTo( "#tabs8Wrapper" ); + var element = $( "#tabs8" ).tabs({ heightStyle: "fill" }); + equalHeight( element, 385 ); +}); + +test( "{ heightStyle: 'fill' } with multiple siblings", function() { + expect( 2 ); + $( "#tabs8Wrapper" ).height( 500 ); + $( "

      Lorem Ipsum

      " ) + .css({ + height: 50, + marginTop: 20, + marginBottom: 30 + }) + .prependTo( "#tabs8Wrapper" ); + $( "

      Lorem Ipsum

      " ) + .css({ + height: 50, + marginTop: 20, + marginBottom: 30, + position: "absolute" + }) + .prependTo( "#tabs8Wrapper" ); + $( "

      Lorem Ipsum

      " ) + .css({ + height: 25, + marginTop: 10, + marginBottom: 15 + }) + .prependTo( "#tabs8Wrapper" ); + var element = $( "#tabs8" ).tabs({ heightStyle: "fill" }); + equalHeight( element, 335 ); +}); + // TODO: add animation tests }( jQuery ) ); diff --git a/tests/unit/tabs/tabs_test_helpers.js b/tests/unit/tabs/tabs_test_helpers.js index 508043943..0c9309186 100644 --- a/tests/unit/tabs/tabs_test_helpers.js +++ b/tests/unit/tabs/tabs_test_helpers.js @@ -38,6 +38,12 @@ TestHelpers.tabs = { deepEqual( actual, expected ); }, + equalHeight: function( tabs, height ) { + tabs.find( ".ui-tabs-panel" ).each(function() { + equal( $( this ).outerHeight(), height ); + }); + }, + state: function( tabs ) { var expected = $.makeArray( arguments ).slice( 1 ), actual = tabs.find( ".ui-tabs-nav li" ).map(function() { diff --git a/ui/jquery.ui.tabs.js b/ui/jquery.ui.tabs.js index a693899da..1224f47b9 100644 --- a/ui/jquery.ui.tabs.js +++ b/ui/jquery.ui.tabs.js @@ -34,6 +34,7 @@ $.widget( "ui.tabs", { active: null, collapsible: false, event: "click", + heightStyle: "content", hide: null, show: null, @@ -150,6 +151,10 @@ $.widget( "ui.tabs", { if ( key === "event" ) { this._setupEvents( value ); } + + if ( key === "heightStyle" ) { + this._setupHeightStyle( value ); + } }, _tabId: function( tab ) { @@ -202,6 +207,7 @@ $.widget( "ui.tabs", { this._setupDisabled( options.disabled ); this._setupEvents( options.event ); + this._setupHeightStyle( options.heightStyle ); // remove all handlers, may run on existing tabs this.lis.unbind( ".tabs" ); @@ -290,6 +296,50 @@ $.widget( "ui.tabs", { this._bind( this.anchors, events ); }, + _setupHeightStyle: function( heightStyle ) { + var maxHeight, overflow, + parent = this.element.parent(); + + if ( heightStyle === "fill" ) { + // IE 6 treats height like minHeight, so we need to turn off overflow + // in order to get a reliable height + // we use the minHeight support test because we assume that only + // browsers that don't support minHeight will treat height as minHeight + if ( !$.support.minHeight ) { + overflow = parent.css( "overflow" ); + parent.css( "overflow", "hidden"); + } + maxHeight = parent.height(); + this.element.siblings( ":visible" ).each(function() { + var elem = $( this ), + position = elem.css( "position" ); + + if ( position === "absolute" || position === "fixed" ) { + return; + } + maxHeight -= elem.outerHeight( true ); + }); + if ( overflow ) { + parent.css( "overflow", overflow ); + } + + this.element.children().not( this.panels ).each(function() { + maxHeight -= $( this ).outerHeight( true ); + }); + + this.panels.each(function() { + $( this ).height( Math.max( 0, maxHeight - + $( this ).innerHeight() + $( this ).height() ) ); + }) + .css( "overflow", "auto" ); + } else if ( heightStyle === "auto" ) { + maxHeight = 0; + this.panels.each(function() { + maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() ); + }).height( maxHeight ); + } + }, + _eventHandler: function( event ) { var options = this.options, active = this.active, @@ -448,6 +498,10 @@ $.widget( "ui.tabs", { } }); + if ( this.options.heightStyle !== "content" ) { + this.panels.css( "height", "" ); + } + return this; }, -- cgit v1.2.3 From 234ced07ef55df99f1886f47b7783dcbec33a77c Mon Sep 17 00:00:00 2001 From: Scott González Date: Tue, 29 May 2012 10:04:20 -0400 Subject: Tabs: Simplify _findActive() now that hrefs are never used. --- ui/jquery.ui.tabs.js | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) (limited to 'ui') diff --git a/ui/jquery.ui.tabs.js b/ui/jquery.ui.tabs.js index 1224f47b9..9c5de53d1 100644 --- a/ui/jquery.ui.tabs.js +++ b/ui/jquery.ui.tabs.js @@ -447,14 +447,8 @@ $.widget( "ui.tabs", { }); }, - _findActive: function( selector ) { - if ( typeof selector === "number" ) { - return this.lis.eq( selector ); - } - if ( typeof selector === "string" ) { - return this.anchors.filter( "[href$='" + selector + "']" ).closest( "li" ); - } - return $(); + _findActive: function( index ) { + return index === false ? $() : this.lis.eq( index ); }, _getIndex: function( index ) { -- cgit v1.2.3 From 0bbad349b982839c607d7c16bf2e46a293532dee Mon Sep 17 00:00:00 2001 From: Pavel Stetina Date: Tue, 29 May 2012 10:20:02 -0400 Subject: Datepicker: Corrected language code for Georgian language according to ISO 639. Fixed #8356 - jquery.ui.datepicker-ge.js has wrong language code. --- demos/datepicker/localization.html | 2 +- demos/index.html | 2 +- ui/i18n/jquery.ui.datepicker-ge.js | 21 --------------------- ui/i18n/jquery.ui.datepicker-ka.js | 21 +++++++++++++++++++++ 4 files changed, 23 insertions(+), 23 deletions(-) delete mode 100644 ui/i18n/jquery.ui.datepicker-ge.js create mode 100644 ui/i18n/jquery.ui.datepicker-ka.js (limited to 'ui') diff --git a/demos/datepicker/localization.html b/demos/datepicker/localization.html index ba5efdfc3..e7bb42c16 100644 --- a/demos/datepicker/localization.html +++ b/demos/datepicker/localization.html @@ -32,7 +32,6 @@ - @@ -43,6 +42,7 @@ + diff --git a/demos/index.html b/demos/index.html index 678c9961f..059bf42cb 100644 --- a/demos/index.html +++ b/demos/index.html @@ -66,7 +66,6 @@ - @@ -77,6 +76,7 @@ + diff --git a/ui/i18n/jquery.ui.datepicker-ge.js b/ui/i18n/jquery.ui.datepicker-ge.js deleted file mode 100644 index 10d4e5851..000000000 --- a/ui/i18n/jquery.ui.datepicker-ge.js +++ /dev/null @@ -1,21 +0,0 @@ -/* Georgian (UTF-8) initialisation for the jQuery UI date picker plugin. */ -/* Written by Lado Lomidze (lado.lomidze@gmail.com). */ -jQuery(function($){ - $.datepicker.regional['ge'] = { - closeText: 'დახურვა', - prevText: '< წინა', - nextText: 'შემდეგი >', - currentText: 'დღეს', - monthNames: ['იანვარი','თებერვალი','მარტი','აპრილი','მაისი','ივნისი', 'ივლისი','აგვისტო','სექტემბერი','ოქტომბერი','ნოემბერი','დეკემბერი'], - monthNamesShort: ['იან','თებ','მარ','აპრ','მაი','ივნ', 'ივლ','აგვ','სექ','ოქტ','ნოე','დეკ'], - dayNames: ['კვირა','ორშაბათი','სამშაბათი','ოთხშაბათი','ხუთშაბათი','პარასკევი','შაბათი'], - dayNamesShort: ['კვ','ორშ','სამ','ოთხ','ხუთ','პარ','შაბ'], - dayNamesMin: ['კვ','ორშ','სამ','ოთხ','ხუთ','პარ','შაბ'], - weekHeader: 'კვირა', - dateFormat: 'dd-mm-yy', - firstDay: 1, - isRTL: false, - showMonthAfterYear: false, - yearSuffix: ''}; - $.datepicker.setDefaults($.datepicker.regional['ge']); -}); diff --git a/ui/i18n/jquery.ui.datepicker-ka.js b/ui/i18n/jquery.ui.datepicker-ka.js new file mode 100644 index 000000000..c10658d79 --- /dev/null +++ b/ui/i18n/jquery.ui.datepicker-ka.js @@ -0,0 +1,21 @@ +/* Georgian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Lado Lomidze (lado.lomidze@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['ka'] = { + closeText: 'დახურვა', + prevText: '< წინა', + nextText: 'შემდეგი >', + currentText: 'დღეს', + monthNames: ['იანვარი','თებერვალი','მარტი','აპრილი','მაისი','ივნისი', 'ივლისი','აგვისტო','სექტემბერი','ოქტომბერი','ნოემბერი','დეკემბერი'], + monthNamesShort: ['იან','თებ','მარ','აპრ','მაი','ივნ', 'ივლ','აგვ','სექ','ოქტ','ნოე','დეკ'], + dayNames: ['კვირა','ორშაბათი','სამშაბათი','ოთხშაბათი','ხუთშაბათი','პარასკევი','შაბათი'], + dayNamesShort: ['კვ','ორშ','სამ','ოთხ','ხუთ','პარ','შაბ'], + dayNamesMin: ['კვ','ორშ','სამ','ოთხ','ხუთ','პარ','შაბ'], + weekHeader: 'კვირა', + dateFormat: 'dd-mm-yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ka']); +}); -- cgit v1.2.3 From 40e47c0b08c31e5003833b9c46d36e7468a63de8 Mon Sep 17 00:00:00 2001 From: kborchers Date: Tue, 29 May 2012 20:55:43 -0500 Subject: Core: Add the uniqueId() and removeUniqueId() methods written by @scottgonzalez to provide a generalized way of generating and removing generated element id's. Also, added a unit test. Fixed #8361 - Add uniqueId() and removeUniqueId() --- tests/unit/core/core.js | 10 ++++++++++ ui/jquery.ui.core.js | 19 +++++++++++++++++++ 2 files changed, 29 insertions(+) (limited to 'ui') diff --git a/tests/unit/core/core.js b/tests/unit/core/core.js index 7a78ae34d..1026c5b0b 100644 --- a/tests/unit/core/core.js +++ b/tests/unit/core/core.js @@ -153,4 +153,14 @@ test( "outerHeight(true) - setter", function() { equal( el.height(), 32, "height set properly when hidden" ); }); +test( "uniqueId / removeUniqueId", function() { + var el = $( "img" ).eq( 0 ); + + equal( el.attr( "id" ), undefined, "element has no initial id" ); + el.uniqueId(); + ok( /ui-id-\d+$/.test( el.attr( "id" ) ), "element has generated id" ); + el.removeUniqueId(); + equal( el.attr( "id" ), undefined, "unique id has been removed from element" ); +}); + })( jQuery ); diff --git a/ui/jquery.ui.core.js b/ui/jquery.ui.core.js index d8fff91e1..a511de24b 100644 --- a/ui/jquery.ui.core.js +++ b/ui/jquery.ui.core.js @@ -9,6 +9,9 @@ */ (function( $, undefined ) { +var uuid = 0, + runiqueId = /^ui-id-\d+$/; + // prevent duplicate loading // this is only a problem because we proxy existing functions // and we don't want to double proxy them @@ -107,6 +110,22 @@ $.fn.extend({ return 0; }, + uniqueId: function() { + return this.each(function() { + if ( !this.id ) { + this.id = "ui-id-" + (++uuid); + } + }); + }, + + removeUniqueId: function() { + return this.each(function() { + if ( runiqueId.test( this.id ) ) { + $( this ).removeAttr( "id" ); + } + }); + }, + disableSelection: function() { return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) + ".ui-disableSelection", function( event ) { -- cgit v1.2.3 From d44f3d079e1a5976333afe56d104d03ba00a901b Mon Sep 17 00:00:00 2001 From: kborchers Date: Tue, 29 May 2012 20:59:03 -0500 Subject: Menu: Use new uniqueId and removeUniqueId methods for generating id's on menus and menu items and for removing those id's during destroy. Also, properly remove the aria-disabled attribute during destroy. --- ui/jquery.ui.menu.js | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) (limited to 'ui') diff --git a/ui/jquery.ui.menu.js b/ui/jquery.ui.menu.js index 8d28ee82f..54a85abf5 100644 --- a/ui/jquery.ui.menu.js +++ b/ui/jquery.ui.menu.js @@ -13,8 +13,7 @@ */ (function($) { -var idIncrement = 0, - currentEventTarget = null; +var currentEventTarget = null; $.widget( "ui.menu", { version: "@VERSION", @@ -35,12 +34,11 @@ $.widget( "ui.menu", { }, _create: function() { this.activeMenu = this.element; - this.menuId = this.element.attr( "id" ) || "ui-menu-" + idIncrement++; this.element + .uniqueId() .addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" ) .toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length ) .attr({ - id: this.menuId, role: this.options.role, tabIndex: 0 }) @@ -145,18 +143,21 @@ $.widget( "ui.menu", { .removeAttr( "aria-labelledby" ) .removeAttr( "aria-expanded" ) .removeAttr( "aria-hidden" ) + .removeAttr( "aria-disabled" ) + .removeUniqueId() .show(); // destroy menu items this.element.find( ".ui-menu-item" ) .removeClass( "ui-menu-item" ) .removeAttr( "role" ) + .removeAttr( "aria-disabled" ) .children( "a" ) + .removeUniqueId() .removeClass( "ui-corner-all ui-state-hover" ) .removeAttr( "tabIndex" ) .removeAttr( "role" ) .removeAttr( "aria-haspopup" ) - .removeAttr( "id" ) // TODO: is this correct? Don't these exist in the original markup? .children( ".ui-icon" ) .remove(); @@ -273,7 +274,6 @@ $.widget( "ui.menu", { refresh: function() { // initialize nested menus var menus, - menuId = this.menuId, submenus = this.element.find( this.options.menus + ":not(.ui-menu)" ) .addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" ) .hide() @@ -290,13 +290,11 @@ $.widget( "ui.menu", { .addClass( "ui-menu-item" ) .attr( "role", "presentation" ) .children( "a" ) + .uniqueId() .addClass( "ui-corner-all" ) .attr({ tabIndex: -1, - role: this._itemRole(), - id: function( i ) { - return menuId + "-" + i; - } + role: this._itemRole() }); // initialize unlinked menu-items containing spaces and/or dashes only as dividers -- cgit v1.2.3 From 9f59d01fdc5e0a62f3bd2072b197d92ee107b2c3 Mon Sep 17 00:00:00 2001 From: kborchers Date: Tue, 29 May 2012 22:25:23 -0500 Subject: Tabs: Remove aria-controls attribute during destroy --- ui/jquery.ui.tabs.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'ui') diff --git a/ui/jquery.ui.tabs.js b/ui/jquery.ui.tabs.js index 9c5de53d1..79587bba6 100644 --- a/ui/jquery.ui.tabs.js +++ b/ui/jquery.ui.tabs.js @@ -488,7 +488,8 @@ $.widget( "ui.tabs", { "ui-tabs-panel", "ui-widget-content", "ui-corner-bottom" - ].join( " " ) ); + ].join( " " ) ) + .removeAttr( "aria-controls" ); } }); -- cgit v1.2.3 From 240b22b1439df22408c5782e640e98cb335c7a2e Mon Sep 17 00:00:00 2001 From: kborchers Date: Tue, 29 May 2012 23:11:42 -0500 Subject: Dialog: Use new uniqueId method for generating id's --- tests/unit/dialog/dialog_core.js | 21 +++------------------ ui/jquery.ui.dialog.js | 12 ++++++------ 2 files changed, 9 insertions(+), 24 deletions(-) (limited to 'ui') diff --git a/tests/unit/dialog/dialog_core.js b/tests/unit/dialog/dialog_core.js index 5d7beb99b..636b957e8 100644 --- a/tests/unit/dialog/dialog_core.js +++ b/tests/unit/dialog/dialog_core.js @@ -89,26 +89,11 @@ function margin(el, side) { module("dialog: core"); test("title id", function() { - expect(3); - - var titleId; - - // reset the uuid so we know what values to expect - $.ui.dialog.uuid = 0; + expect(1); el = $('
      ').dialog(); - titleId = dlg().find('.ui-dialog-title').attr('id'); - equal(titleId, 'ui-dialog-title-1', 'auto-numbered title id'); - el.remove(); - - el = $('
      ').dialog(); - titleId = dlg().find('.ui-dialog-title').attr('id'); - equal(titleId, 'ui-dialog-title-2', 'auto-numbered title id'); - el.remove(); - - el = $('
      ').dialog(); - titleId = dlg().find('.ui-dialog-title').attr('id'); - equal(titleId, 'ui-dialog-title-foo', 'carried over title id'); + var titleId = dlg().find('.ui-dialog-title').attr('id'); + ok( /ui-id-\d+$/.test( titleId ), 'auto-numbered title id'); el.remove(); }); diff --git a/ui/jquery.ui.dialog.js b/ui/jquery.ui.dialog.js index e48c26400..4ef8a20cb 100644 --- a/ui/jquery.ui.dialog.js +++ b/ui/jquery.ui.dialog.js @@ -87,7 +87,6 @@ $.widget("ui.dialog", { options = this.options, title = options.title || " ", - titleId = $.ui.dialog.getTitleId( this.element ), uiDialog = ( this.uiDialog = $( "
      " ) ) .addClass( uiDialogClasses + options.dialogClass ) @@ -105,10 +104,6 @@ $.widget("ui.dialog", { event.preventDefault(); } }) - .attr({ - role: "dialog", - "aria-labelledby": titleId - }) .mousedown(function( event ) { that.moveToTop( false, event ); }) @@ -140,8 +135,8 @@ $.widget("ui.dialog", { .appendTo( uiDialogTitlebarClose ), uiDialogTitle = $( "" ) + .uniqueId() .addClass( "ui-dialog-title" ) - .attr( "id", titleId ) .html( title ) .prependTo( uiDialogTitlebar ), @@ -152,6 +147,11 @@ $.widget("ui.dialog", { .addClass( "ui-dialog-buttonset" ) .appendTo( uiDialogButtonPane ); + uiDialog.attr({ + role: "dialog", + "aria-labelledby": uiDialogTitle.attr( "id" ) + }); + uiDialogTitlebar.find( "*" ).add( uiDialogTitlebar ).disableSelection(); this._hoverable( uiDialogTitlebarClose ); this._focusable( uiDialogTitlebarClose ); -- cgit v1.2.3 From fe567eb9584892b3a035f74d5f75c149576fe1b8 Mon Sep 17 00:00:00 2001 From: Scott González Date: Tue, 29 May 2012 17:55:24 -0400 Subject: Tabs: Properly remove generated aria-controls attributes on destroy. --- ui/jquery.ui.tabs.js | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) (limited to 'ui') diff --git a/ui/jquery.ui.tabs.js b/ui/jquery.ui.tabs.js index 79587bba6..a64dca6e4 100644 --- a/ui/jquery.ui.tabs.js +++ b/ui/jquery.ui.tabs.js @@ -247,7 +247,9 @@ $.widget( "ui.tabs", { if ( panel.length) { that.panels = that.panels.add( panel ); } - tab.attr( "aria-controls", selector.substring( 1 ) ); + tab + .data( "ui-tabs-aria-controls", tab.attr( "aria-controls" ) ) + .attr( "aria-controls", selector.substring( 1 ) ); }); }, @@ -488,8 +490,17 @@ $.widget( "ui.tabs", { "ui-tabs-panel", "ui-widget-content", "ui-corner-bottom" - ].join( " " ) ) - .removeAttr( "aria-controls" ); + ].join( " " ) ); + } + }); + + this.lis.each(function() { + var li = $( this ), + prev = li.data( "ui-tabs-aria-controls" ); + if ( prev ) { + li.attr( "aria-controls", prev ); + } else { + li.removeAttr( "aria-controls" ); } }); -- cgit v1.2.3 From e0fe788ee0c0c0d8d23f9d90b9acff713ba1302f Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Wed, 30 May 2012 14:40:03 +0200 Subject: Accordion: Update activate and beforeActivate event properties to newPanel/oldPanel (instead of content). Fixes #6840 and #6842 --- tests/unit/accordion/accordion_events.js | 46 ++++++++++++++++---------------- ui/jquery.ui.accordion.js | 24 ++++++++++++----- 2 files changed, 40 insertions(+), 30 deletions(-) (limited to 'ui') diff --git a/tests/unit/accordion/accordion_events.js b/tests/unit/accordion/accordion_events.js index 079c71a62..b67f2b26d 100644 --- a/tests/unit/accordion/accordion_events.js +++ b/tests/unit/accordion/accordion_events.js @@ -56,11 +56,11 @@ test( "beforeActivate", function() { element.one( "accordionbeforeactivate", function( event, ui ) { ok( !( "originalEvent" in event ) ); equal( ui.oldHeader.length, 0 ); - equal( ui.oldContent.length, 0 ); + equal( ui.oldPanel.length, 0 ); equal( ui.newHeader.length, 1 ); strictEqual( ui.newHeader[ 0 ], headers[ 0 ] ); - equal( ui.newContent.length, 1 ); - strictEqual( ui.newContent[ 0 ], content[ 0 ] ); + equal( ui.newPanel.length, 1 ); + strictEqual( ui.newPanel[ 0 ], content[ 0 ] ); state( element, 0, 0, 0 ); }); element.accordion( "option", "active", 0 ); @@ -70,12 +70,12 @@ test( "beforeActivate", function() { equal( event.originalEvent.type, "click" ); equal( ui.oldHeader.length, 1 ); strictEqual( ui.oldHeader[ 0 ], headers[ 0 ] ); - equal( ui.oldContent.length, 1 ); - strictEqual( ui.oldContent[ 0 ], content[ 0 ] ); + equal( ui.oldPanel.length, 1 ); + strictEqual( ui.oldPanel[ 0 ], content[ 0 ] ); equal( ui.newHeader.length, 1 ); strictEqual( ui.newHeader[ 0 ], headers[ 1 ] ); - equal( ui.newContent.length, 1 ); - strictEqual( ui.newContent[ 0 ], content[ 1 ] ); + equal( ui.newPanel.length, 1 ); + strictEqual( ui.newPanel[ 0 ], content[ 1 ] ); state( element, 1, 0, 0 ); }); headers.eq( 1 ).click(); @@ -85,10 +85,10 @@ test( "beforeActivate", function() { ok( !( "originalEvent" in event ) ); equal( ui.oldHeader.length, 1 ); strictEqual( ui.oldHeader[ 0 ], headers[ 1 ] ); - equal( ui.oldContent.length, 1 ); - strictEqual( ui.oldContent[ 0 ], content[ 1 ] ); + equal( ui.oldPanel.length, 1 ); + strictEqual( ui.oldPanel[ 0 ], content[ 1 ] ); equal( ui.newHeader.length, 0 ); - equal( ui.newContent.length, 0 ); + equal( ui.newPanel.length, 0 ); state( element, 0, 1, 0 ); }); element.accordion( "option", "active", false ); @@ -97,11 +97,11 @@ test( "beforeActivate", function() { element.one( "accordionbeforeactivate", function( event, ui ) { ok( !( "originalEvent" in event ) ); equal( ui.oldHeader.length, 0 ); - equal( ui.oldContent.length, 0 ); + equal( ui.oldPanel.length, 0 ); equal( ui.newHeader.length, 1 ); strictEqual( ui.newHeader[ 0 ], headers[ 2 ] ); - equal( ui.newContent.length, 1 ); - strictEqual( ui.newContent[ 0 ], content[ 2 ] ); + equal( ui.newPanel.length, 1 ); + strictEqual( ui.newPanel[ 0 ], content[ 2 ] ); event.preventDefault(); state( element, 0, 0, 0 ); }); @@ -120,33 +120,33 @@ test( "activate", function() { element.one( "accordionactivate", function( event, ui ) { equal( ui.oldHeader.length, 0 ); - equal( ui.oldContent.length, 0 ); + equal( ui.oldPanel.length, 0 ); equal( ui.newHeader.length, 1 ); strictEqual( ui.newHeader[ 0 ], headers[ 0 ] ); - equal( ui.newContent.length, 1 ); - strictEqual( ui.newContent[ 0 ], content[ 0 ] ); + equal( ui.newPanel.length, 1 ); + strictEqual( ui.newPanel[ 0 ], content[ 0 ] ); }); element.accordion( "option", "active", 0 ); element.one( "accordionactivate", function( event, ui ) { equal( ui.oldHeader.length, 1 ); strictEqual( ui.oldHeader[ 0 ], headers[ 0 ] ); - equal( ui.oldContent.length, 1 ); - strictEqual( ui.oldContent[ 0 ], content[ 0 ] ); + equal( ui.oldPanel.length, 1 ); + strictEqual( ui.oldPanel[ 0 ], content[ 0 ] ); equal( ui.newHeader.length, 1 ); strictEqual( ui.newHeader[ 0 ], headers[ 1 ] ); - equal( ui.newContent.length, 1 ); - strictEqual( ui.newContent[ 0 ], content[ 1 ] ); + equal( ui.newPanel.length, 1 ); + strictEqual( ui.newPanel[ 0 ], content[ 1 ] ); }); headers.eq( 1 ).click(); element.one( "accordionactivate", function( event, ui ) { equal( ui.oldHeader.length, 1 ); strictEqual( ui.oldHeader[ 0 ], headers[ 1 ] ); - equal( ui.oldContent.length, 1 ); - strictEqual( ui.oldContent[ 0 ], content[ 1 ] ); + equal( ui.oldPanel.length, 1 ); + strictEqual( ui.oldPanel[ 0 ], content[ 1 ] ); equal( ui.newHeader.length, 0 ); - equal( ui.newContent.length, 0 ); + equal( ui.newPanel.length, 0 ); }); element.accordion( "option", "active", false ); diff --git a/ui/jquery.ui.accordion.js b/ui/jquery.ui.accordion.js index 0f1455790..856b3ba4b 100644 --- a/ui/jquery.ui.accordion.js +++ b/ui/jquery.ui.accordion.js @@ -389,9 +389,9 @@ $.widget( "ui.accordion", { toHide = active.next(), eventData = { oldHeader: active, - oldContent: toHide, + oldPanel: toHide, newHeader: collapsing ? $() : clicked, - newContent: toShow + newPanel: toShow }; event.preventDefault(); @@ -437,8 +437,8 @@ $.widget( "ui.accordion", { }, _toggle: function( data ) { - var toShow = data.newContent, - toHide = this.prevShow.length ? this.prevShow : data.oldContent; + var toShow = data.newPanel, + toHide = this.prevShow.length ? this.prevShow : data.oldPanel; // handle activating a panel during the animation for another activation this.prevShow.add( this.prevHide ).stop( true, true ); @@ -524,7 +524,7 @@ $.widget( "ui.accordion", { }, _toggleComplete: function( data ) { - var toHide = data.oldContent; + var toHide = data.oldPanel; toHide .removeClass( "ui-accordion-content-active" ) @@ -676,9 +676,19 @@ if ( $.uiBackCompat !== false ) { } if ( type === "beforeActivate" ) { - ret = _trigger.call( this, "changestart", event, data ); + ret = _trigger.call( this, "changestart", event, { + oldHeader: data.oldHeader, + oldContent: data.oldPanel, + newHeader: data.newHeader, + newContent: data.newPanel + }); } else if ( type === "activate" ) { - ret = _trigger.call( this, "change", event, data ); + ret = _trigger.call( this, "change", event, { + oldHeader: data.oldHeader, + oldContent: data.oldPanel, + newHeader: data.newHeader, + newContent: data.newPanel + }); } return ret; }; -- cgit v1.2.3