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 --- ui/jquery.ui.dialog.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'ui/jquery.ui.dialog.js') 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/jquery.ui.dialog.js') 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/jquery.ui.dialog.js') 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