From 673c6558e01dd8a5423ec21bf40d6efe443580d2 Mon Sep 17 00:00:00 2001 From: Scott González Date: Tue, 22 Jan 2013 08:56:38 -0500 Subject: Accordion: Properly set corner classes on refresh. Fixes #8995 - Accordion: Corner display issues. --- ui/jquery.ui.accordion.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'ui') diff --git a/ui/jquery.ui.accordion.js b/ui/jquery.ui.accordion.js index 8050e55ab..d8faa0e9f 100644 --- a/ui/jquery.ui.accordion.js +++ b/ui/jquery.ui.accordion.js @@ -262,8 +262,8 @@ $.widget( "ui.accordion", { (this.element.attr( "id" ) || ++uid); this.active = this._findActive( options.active ) - .addClass( "ui-accordion-header-active ui-state-active" ) - .toggleClass( "ui-corner-all ui-corner-top" ); + .addClass( "ui-accordion-header-active ui-state-active ui-corner-top" ) + .removeClass( "ui-corner-all" ); this.active.next() .addClass( "ui-accordion-content-active" ) .show(); -- cgit v1.2.3 From 10c873ab6cf2333f7e51784e84c03a0fbb975e1f Mon Sep 17 00:00:00 2001 From: Scott González Date: Tue, 22 Jan 2013 09:19:04 -0500 Subject: Accordion: Add panel in addition to content for create event. Fixes #8998 - Accordion: Create event uses content instead of panel. --- tests/unit/accordion/accordion_events.js | 7 ++++++- ui/jquery.ui.accordion.js | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) (limited to 'ui') diff --git a/tests/unit/accordion/accordion_events.js b/tests/unit/accordion/accordion_events.js index b67f2b26d..79283d11c 100644 --- a/tests/unit/accordion/accordion_events.js +++ b/tests/unit/accordion/accordion_events.js @@ -6,7 +6,7 @@ var setupTeardown = TestHelpers.accordion.setupTeardown, module( "accordion: events", setupTeardown() ); test( "create", function() { - expect( 10 ); + expect( 15 ); var element = $( "#list1" ), headers = element.children( "h3" ), @@ -16,6 +16,8 @@ test( "create", function() { create: function( event, ui ) { equal( ui.header.length, 1, "header length" ); strictEqual( ui.header[ 0 ], headers[ 0 ], "header" ); + equal( ui.panel.length, 1, "panel length" ); + strictEqual( ui.panel[ 0 ], contents[ 0 ], "panel" ); equal( ui.content.length, 1, "content length" ); strictEqual( ui.content[ 0 ], contents[ 0 ], "content" ); } @@ -27,6 +29,8 @@ test( "create", function() { create: function( event, ui ) { equal( ui.header.length, 1, "header length" ); strictEqual( ui.header[ 0 ], headers[ 2 ], "header" ); + equal( ui.panel.length, 1, "panel length" ); + strictEqual( ui.panel[ 0 ], contents[ 2 ], "panel" ); equal( ui.content.length, 1, "content length" ); strictEqual( ui.content[ 0 ], contents[ 2 ], "content" ); } @@ -38,6 +42,7 @@ test( "create", function() { collapsible: true, create: function( event, ui ) { equal( ui.header.length, 0, "header length" ); + equal( ui.panel.length, 0, "panel length" ); equal( ui.content.length, 0, "content length" ); } }); diff --git a/ui/jquery.ui.accordion.js b/ui/jquery.ui.accordion.js index d8faa0e9f..1afa95cb4 100644 --- a/ui/jquery.ui.accordion.js +++ b/ui/jquery.ui.accordion.js @@ -65,6 +65,7 @@ $.widget( "ui.accordion", { _getCreateEventData: function() { return { header: this.active, + panel: !this.active.length ? $() : this.active.next(), content: !this.active.length ? $() : this.active.next() }; }, -- cgit v1.2.3 From 8f7c3e309cae07c75b930c55f14c05053d5028e9 Mon Sep 17 00:00:00 2001 From: David Petersen Date: Wed, 23 Jan 2013 13:41:01 -0600 Subject: Datepicker: Handle when yearRange is a year or a modifier. Fixed #8994 - Datepicker: next and prev buttons are disabled when using yearRange --- tests/unit/datepicker/datepicker_options.js | 18 +++++++++++++++++- ui/jquery.ui.datepicker.js | 10 ++++++++-- 2 files changed, 25 insertions(+), 3 deletions(-) (limited to 'ui') diff --git a/tests/unit/datepicker/datepicker_options.js b/tests/unit/datepicker/datepicker_options.js index e47235786..dac2262dc 100644 --- a/tests/unit/datepicker/datepicker_options.js +++ b/tests/unit/datepicker/datepicker_options.js @@ -384,7 +384,7 @@ test("miscellaneous", function() { }); test("minMax", function() { - expect( 19 ); + expect( 23 ); var date, inp = TestHelpers.datepicker.init("#inp"), dp = $("#ui-datepicker-div"), @@ -472,6 +472,22 @@ test("minMax", function() { ok(dp.find(".ui-datepicker-prev").hasClass("ui-state-disabled"), "Year Range Test - previous button disabled at 1/1/minYear"); inp.datepicker("setDate", "12/30/" + new Date().getFullYear()); ok(dp.find(".ui-datepicker-next").hasClass("ui-state-disabled"), "Year Range Test - next button disabled at 12/30/maxYear"); + + inp.datepicker("option", { + minDate: new Date(1900, 0, 1), + maxDate: "-6Y", + yearRange: "1900:-6" + }).val( "" ); + ok(dp.find(".ui-datepicker-next").hasClass("ui-state-disabled"), "Year Range Test - next button disabled"); + ok(!dp.find(".ui-datepicker-prev").hasClass("ui-state-disabled"), "Year Range Test - prev button enabled"); + + inp.datepicker("option", { + minDate: new Date(1900, 0, 1), + maxDate: "1/25/2007", + yearRange: "1900:2007" + }).val( "" ); + ok(dp.find(".ui-datepicker-next").hasClass("ui-state-disabled"), "Year Range Test - next button disabled"); + ok(!dp.find(".ui-datepicker-prev").hasClass("ui-state-disabled"), "Year Range Test - prev button enabled"); }); test("setDate", function() { diff --git a/ui/jquery.ui.datepicker.js b/ui/jquery.ui.datepicker.js index 24f0d5405..e93f596fc 100644 --- a/ui/jquery.ui.datepicker.js +++ b/ui/jquery.ui.datepicker.js @@ -1918,8 +1918,14 @@ $.extend(Datepicker.prototype, { if (years){ yearSplit = years.split(":"); currentYear = new Date().getFullYear(); - minYear = parseInt(yearSplit[0], 10) + currentYear; - maxYear = parseInt(yearSplit[1], 10) + currentYear; + minYear = parseInt(yearSplit[0], 10); + maxYear = parseInt(yearSplit[1], 10); + if ( yearSplit[0].match(/[+\-].*/) ) { + minYear += currentYear; + } + if ( yearSplit[1].match(/[+\-].*/) ) { + maxYear += currentYear; + } } return ((!minDate || date.getTime() >= minDate.getTime()) && -- cgit v1.2.3 From 649f105229b2a24adc21cba2d56cb05a59711ccb Mon Sep 17 00:00:00 2001 From: David Petersen Date: Wed, 23 Jan 2013 19:12:25 -0600 Subject: Dialog: Don't handle overlays on destory if there are not any. Fixed: #9004 - failed in _destroyOverlay when I destroy a modal dialog thau was never opened. Fixed: #9000 Dialog leaves broken event handler after close/destroy in certain cases --- tests/unit/dialog/dialog_methods.js | 33 ++++++++++++++++++++++++++++++++- ui/jquery.ui.dialog.js | 12 ++++++++---- 2 files changed, 40 insertions(+), 5 deletions(-) (limited to 'ui') diff --git a/tests/unit/dialog/dialog_methods.js b/tests/unit/dialog/dialog_methods.js index b4c58c31e..efca71fd8 100644 --- a/tests/unit/dialog/dialog_methods.js +++ b/tests/unit/dialog/dialog_methods.js @@ -34,7 +34,9 @@ test("init", function() { }); test("destroy", function() { - expect( 7 ); + expect( 17 ); + + var el, el2; $( "#dialog1, #form-dialog" ).hide(); domEqual( "#dialog1", function() { @@ -57,6 +59,35 @@ test("destroy", function() { domEqual( "#dialog1", function() { $( "#dialog1" ).dialog().dialog( "destroy" ); }); + + // Don't throw errors when destroying a never opened modal dialog (#9004) + $( "#dialog1" ).dialog({ autoOpen: false, modal: true }).dialog( "destroy" ); + equal( $( ".ui-widget-overlay" ).length, 0, "overlay does not exist" ); + equal( $.ui.dialog.overlayInstances, 0, "overlayInstances equals the number of open overlays"); + + el = $( "#dialog1" ).dialog({ modal: true }), + el2 = $( "#dialog2" ).dialog({ modal: true }); + equal( $( ".ui-widget-overlay" ).length, 2, "overlays created when dialogs are open" ); + equal( $.ui.dialog.overlayInstances, 2, "overlayInstances equals the number of open overlays" ); + el.dialog( "close" ); + equal( $( ".ui-widget-overlay" ).length, 1, "overlay remains after closing one dialog" ); + equal( $.ui.dialog.overlayInstances, 1, "overlayInstances equals the number of open overlays" ); + el.dialog( "destroy" ); + equal( $( ".ui-widget-overlay" ).length, 1, "overlay remains after destroying one dialog" ); + equal( $.ui.dialog.overlayInstances, 1, "overlayInstances equals the number of open overlays" ); + el2.dialog( "destroy" ); + equal( $( ".ui-widget-overlay" ).length, 0, "overlays removed when all dialogs are destoryed" ); + equal( $.ui.dialog.overlayInstances, 0, "overlayInstances equals the number of open overlays" ); +}); + +asyncTest("#9000: Dialog leaves broken event handler after close/destroy in certain cases", function() { + expect( 1 ); + $( "#dialog1" ).dialog({ modal:true }).dialog( "close" ).dialog( "destroy" ); + setTimeout(function() { + $( "#favorite-animal" ).focus(); + ok( true, "close and destroy modal dialog before its really opened" ); + start(); + }, 2 ); }); test("#4980: Destroy should place element back in original DOM position", function(){ diff --git a/ui/jquery.ui.dialog.js b/ui/jquery.ui.dialog.js index ef5787ef6..bfe37235e 100644 --- a/ui/jquery.ui.dialog.js +++ b/ui/jquery.ui.dialog.js @@ -704,11 +704,15 @@ $.widget( "ui.dialog", { return; } - $.ui.dialog.overlayInstances--; - if ( !$.ui.dialog.overlayInstances ) { - this._off( this.document, "focusin" ); + if ( this.overlay ) { + $.ui.dialog.overlayInstances--; + + if ( !$.ui.dialog.overlayInstances ) { + this._off( this.document, "focusin" ); + } + this.overlay.remove(); + this.overlay = null; } - this.overlay.remove(); } }); -- cgit v1.2.3 From c53198c2099d25e80887c86af6d0e624414cc2f7 Mon Sep 17 00:00:00 2001 From: Scott González Date: Fri, 25 Jan 2013 08:51:13 -0500 Subject: Dialog: Allow interaction with datepickers from modal dialogs. Fixes #8989 - Dialog: Cannot change month/year in datepicker within modal. --- ui/jquery.ui.dialog.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'ui') diff --git a/ui/jquery.ui.dialog.js b/ui/jquery.ui.dialog.js index bfe37235e..1d3a7a88f 100644 --- a/ui/jquery.ui.dialog.js +++ b/ui/jquery.ui.dialog.js @@ -679,7 +679,10 @@ $.widget( "ui.dialog", { if ( $.ui.dialog.overlayInstances ) { this._on( this.document, { focusin: function( event ) { - if ( !$( event.target ).closest(".ui-dialog").length ) { + if ( !$( event.target ).closest(".ui-dialog").length && + // TODO: Remove hack when datepicker implements + // the .ui-front logic (#8989) + !$( event.target ).closest(".ui-datepicker").length ) { event.preventDefault(); $(".ui-dialog:visible:last .ui-dialog-content") .data("ui-dialog")._focusTabbable(); -- cgit v1.2.3 From 55360eeb7eae5c560d51b09178e64d83c59223a6 Mon Sep 17 00:00:00 2001 From: David Sullivan Date: Sat, 26 Jan 2013 04:03:14 -0600 Subject: Dialog: modified _createOverlay to _appendTo instead of document.body. Fixed #8984 - Modal dialogs display behind overlay when using appendTo option --- tests/unit/dialog/dialog_options.js | 36 ++++++++++++++++++++++++++++-------- ui/jquery.ui.dialog.js | 2 +- 2 files changed, 29 insertions(+), 9 deletions(-) (limited to 'ui') diff --git a/tests/unit/dialog/dialog_options.js b/tests/unit/dialog/dialog_options.js index a20480de6..5f0434308 100644 --- a/tests/unit/dialog/dialog_options.js +++ b/tests/unit/dialog/dialog_options.js @@ -6,43 +6,63 @@ module("dialog: options"); test( "appendTo", function() { - expect( 8 ); + expect( 16 ); var detached = $( "
" ), - element = $( "#dialog1" ).dialog(); + element = $( "#dialog1" ).dialog({ + modal: true + }); equal( element.dialog( "widget" ).parent()[0], document.body, "defaults to body" ); + equal( $( ".ui-widget-overlay" ).parent()[0], document.body, "overlay defaults to body" ); element.dialog( "destroy" ); element.dialog({ - appendTo: ".wrap" + appendTo: ".wrap", + modal: true }); equal( element.dialog( "widget" ).parent()[0], $( "#wrap1" )[0], "first found element" ); + equal( $( ".ui-widget-overlay" ).parent()[0], $( "#wrap1" )[0], "overlay first found element" ); equal( $( "#wrap2 .ui-dialog" ).length, 0, "only appends to one element" ); + equal( $( "#wrap2 .ui-widget-overlay" ).length, 0, "overlay only appends to one element" ); element.dialog( "destroy" ); element.dialog({ - appendTo: null + appendTo: null, + modal: true }); equal( element.dialog( "widget" ).parent()[0], document.body, "null" ); + equal( $( ".ui-widget-overlay" ).parent()[0], document.body, "overlay null" ); element.dialog( "destroy" ); - element.dialog({ autoOpen: false }).dialog( "option", "appendTo", "#wrap1" ).dialog( "open" ); + element.dialog({ + autoOpen: false, + modal: true + }).dialog( "option", "appendTo", "#wrap1" ).dialog( "open" ); equal( element.dialog( "widget" ).parent()[0], $( "#wrap1" )[0], "modified after init" ); + equal( $( ".ui-widget-overlay" ).parent()[0], $( "#wrap1" )[0], "overlay modified after init" ); element.dialog( "destroy" ); element.dialog({ - appendTo: detached + appendTo: detached, + modal: true }); equal( element.dialog( "widget" ).parent()[0], detached[0], "detached jQuery object" ); + equal( detached.find( ".ui-widget-overlay" ).parent()[0], detached[0], "overlay detached jQuery object" ); element.dialog( "destroy" ); element.dialog({ - appendTo: detached[0] + appendTo: detached[0], + modal: true }); equal( element.dialog( "widget" ).parent()[0], detached[0], "detached DOM element" ); + equal( detached.find( ".ui-widget-overlay" ).parent()[0], detached[0], "overlay detached DOM element" ); element.dialog( "destroy" ); - element.dialog({ autoOpen: false }).dialog( "option", "appendTo", detached ); + element.dialog({ + autoOpen: false, + modal: true + }).dialog( "option", "appendTo", detached ); equal( element.dialog( "widget" ).parent()[0], detached[0], "detached DOM element via option()" ); + equal( detached.find( ".ui-widget-overlay" ).length, 0, "overlay detached DOM element via option()" ); element.dialog( "destroy" ); }); diff --git a/ui/jquery.ui.dialog.js b/ui/jquery.ui.dialog.js index 1d3a7a88f..ec4032ff3 100644 --- a/ui/jquery.ui.dialog.js +++ b/ui/jquery.ui.dialog.js @@ -695,7 +695,7 @@ $.widget( "ui.dialog", { this.overlay = $("
") .addClass("ui-widget-overlay ui-front") - .appendTo( this.document[0].body ); + .appendTo( this._appendTo() ); this._on( this.overlay, { mousedown: "_keepFocus" }); -- cgit v1.2.3 From 3aa8ad0c4ad15ceac52c4f653b7d4e66995bb297 Mon Sep 17 00:00:00 2001 From: Thomas Jaggi Date: Mon, 28 Jan 2013 16:03:42 +0100 Subject: Slider: Added rounded corners to range area. Fixed #9024 - Slider: Range area needs rounded corners, too --- ui/jquery.ui.slider.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ui') diff --git a/ui/jquery.ui.slider.js b/ui/jquery.ui.slider.js index 9640361a1..54024af49 100644 --- a/ui/jquery.ui.slider.js +++ b/ui/jquery.ui.slider.js @@ -80,7 +80,7 @@ $.widget( "ui.slider", $.ui.mouse, { .addClass( "ui-slider-range" + // note: this isn't the most fittingly semantic framework class for this element, // but worked best visually with a variety of themes - " ui-widget-header" + + " ui-widget-header ui-corner-all" + ( ( o.range === "min" || o.range === "max" ) ? " ui-slider-range-" + o.range : "" ) ); } -- cgit v1.2.3 From 2ca4d17982bfedc723f499b41e0936ada9eaa852 Mon Sep 17 00:00:00 2001 From: David Petersen Date: Sat, 26 Jan 2013 11:59:08 -0600 Subject: Effects Core: make removeClass work correctly with changes jQuery 1.9.0. Fixed #9015 - Inclusion of jQuery UI breaks removeClass --- tests/unit/effects/effects_core.js | 11 +++++++++++ ui/jquery.ui.effect.js | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) (limited to 'ui') diff --git a/tests/unit/effects/effects_core.js b/tests/unit/effects/effects_core.js index 26390b7d3..c9b1e1b4a 100644 --- a/tests/unit/effects/effects_core.js +++ b/tests/unit/effects/effects_core.js @@ -38,6 +38,17 @@ asyncTest( "Parse of null for options", function() { }); }); +test( "removeClass", function() { + expect( 3 ); + + var element = $( "
" ); + equal( "", element[ 0 ].className ); + element.addClass( "destroyed" ); + equal( "destroyed", element[ 0 ].className ); + element.removeClass(); + equal( "", element[ 0 ].className ); +}); + /* TODO: Disabled - Can't figure out why this is failing in IE 6/7 test( "createWrapper and removeWrapper retain focused elements (#7595)", function() { diff --git a/ui/jquery.ui.effect.js b/ui/jquery.ui.effect.js index c6623a0a1..97f006ee0 100644 --- a/ui/jquery.ui.effect.js +++ b/ui/jquery.ui.effect.js @@ -849,10 +849,10 @@ $.fn.extend({ _removeClass: $.fn.removeClass, removeClass: function( classNames, speed, easing, callback ) { - return speed ? + return arguments.length > 1 ? $.effects.animateClass.call( this, { remove: classNames }, speed, easing, callback ) : - this._removeClass( classNames ); + this._removeClass.apply( this, arguments ); }, _toggleClass: $.fn.toggleClass, -- cgit v1.2.3