From c36b43d0ee3cf7e10d82d21e3a4ca6cb954f4c16 Mon Sep 17 00:00:00 2001 From: Jay Oster Date: Thu, 15 Sep 2011 17:02:18 -0700 Subject: Datepicker: Fix `this` reference in _hideDatepicker(). Fixed #7722 - Datepicker: Does not properly clear current instance when hidden. --- ui/jquery.ui.datepicker.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'ui') diff --git a/ui/jquery.ui.datepicker.js b/ui/jquery.ui.datepicker.js index 0b6fb2218..a5ff08c63 100644 --- a/ui/jquery.ui.datepicker.js +++ b/ui/jquery.ui.datepicker.js @@ -807,9 +807,10 @@ $.extend(Datepicker.prototype, { if (this._datepickerShowing) { var showAnim = this._get(inst, 'showAnim'); var duration = this._get(inst, 'duration'); + var self = this; var postProcess = function() { $.datepicker._tidyDialog(inst); - this._curInst = null; + self._curInst = null; }; // DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed -- cgit v1.2.3 From 91ef69d7503f11f2b6223b9c0061fca51e3a006f Mon Sep 17 00:00:00 2001 From: Scott González Date: Mon, 21 Nov 2011 11:14:19 -0500 Subject: Widget: Don't use $.event.props when creating events. --- ui/jquery.ui.widget.js | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) (limited to 'ui') diff --git a/ui/jquery.ui.widget.js b/ui/jquery.ui.widget.js index 53cde389e..0d52fb534 100644 --- a/ui/jquery.ui.widget.js +++ b/ui/jquery.ui.widget.js @@ -374,29 +374,28 @@ $.Widget.prototype = { }, _trigger: function( type, event, data ) { - var callback = this.options[ type ], - args; + var args, prop, orig, + callback = this.options[ type ]; + data = data || {}; event = $.Event( event ); event.type = ( type === this.widgetEventPrefix ? type : this.widgetEventPrefix + type ).toLowerCase(); - data = data || {}; + // the original event may come from any element + // so we need to reset the target on the new event + event.target = this.element[ 0 ]; // copy original event properties over to the new event - // this would happen if we could call $.event.fix instead of $.Event - // but we don't have a way to force an event to be fixed multiple times - if ( event.originalEvent ) { - for ( var i = $.event.props.length, prop; i; ) { - prop = $.event.props[ --i ]; - event[ prop ] = event.originalEvent[ prop ]; + orig = event.originalEvent; + if ( orig ) { + for ( prop in orig ) { + if ( !( prop in event ) ) { + event[ prop ] = orig[ prop ]; + } } } - // the original event may come from any element - // so we need to reset the target on the new event - event.target = this.element[0]; - this.element.trigger( event, data ); args = $.isArray( data ) ? -- cgit v1.2.3 From 5fb9629766f10a9119e0099bd8aee06f86cc3f30 Mon Sep 17 00:00:00 2001 From: Scott González Date: Mon, 21 Nov 2011 11:31:51 -0500 Subject: Widget: Simplify data normalization in _trigger(). --- ui/jquery.ui.widget.js | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) (limited to 'ui') diff --git a/ui/jquery.ui.widget.js b/ui/jquery.ui.widget.js index 0d52fb534..4f47a008b 100644 --- a/ui/jquery.ui.widget.js +++ b/ui/jquery.ui.widget.js @@ -374,7 +374,7 @@ $.Widget.prototype = { }, _trigger: function( type, event, data ) { - var args, prop, orig, + var prop, orig, callback = this.options[ type ]; data = data || {}; @@ -397,13 +397,8 @@ $.Widget.prototype = { } this.element.trigger( event, data ); - - args = $.isArray( data ) ? - [ event ].concat( data ) : - [ event, data ]; - return !( $.isFunction( callback ) && - callback.apply( this.element[0], args ) === false || + callback.apply( this.element[0], [ event ].concat( data ) ) === false || event.isDefaultPrevented() ); } }; -- cgit v1.2.3 From fdc332ed5fb7f7e688151d5cae9b450569d73da5 Mon Sep 17 00:00:00 2001 From: "Michael P. Jung" Date: Mon, 21 Nov 2011 16:16:32 -0500 Subject: Droppable: Make sure._drop is called for all relevant droppables. Fixes #6009 - Upper droppable should receive draggable. Fixes #6085 - Parent droppable takes precedence over dynamically created child droppable. --- ui/jquery.ui.droppable.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ui') diff --git a/ui/jquery.ui.droppable.js b/ui/jquery.ui.droppable.js index 3942c6b8f..62bba2aba 100644 --- a/ui/jquery.ui.droppable.js +++ b/ui/jquery.ui.droppable.js @@ -224,7 +224,7 @@ $.ui.ddmanager = { if(!this.options) return; if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance)) - dropped = dropped || this._drop.call(this, event); + dropped = this._drop.call(this, event) || dropped; if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) { this.isout = 1; this.isover = 0; -- cgit v1.2.3 From 35dd0417bdb442ad00a9eb37a85db5ddf1b14615 Mon Sep 17 00:00:00 2001 From: Scott González Date: Tue, 22 Nov 2011 08:31:11 -0500 Subject: Selectable: Explicitly check event.ctrlKey now that jQuery differentiates between meta and ctrl. Fixes #7858 - ctrl-click to select multiple elements not working. --- ui/jquery.ui.selectable.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'ui') diff --git a/ui/jquery.ui.selectable.js b/ui/jquery.ui.selectable.js index d7b24d4e3..408771eff 100644 --- a/ui/jquery.ui.selectable.js +++ b/ui/jquery.ui.selectable.js @@ -104,7 +104,7 @@ $.widget("ui.selectable", $.ui.mouse, { this.selectees.filter('.ui-selected').each(function() { var selectee = $.data(this, "selectable-item"); selectee.startselected = true; - if (!event.metaKey) { + if (!event.metaKey && !event.ctrlKey) { selectee.$element.removeClass('ui-selected'); selectee.selected = false; selectee.$element.addClass('ui-unselecting'); @@ -119,7 +119,7 @@ $.widget("ui.selectable", $.ui.mouse, { $(event.target).parents().andSelf().each(function() { var selectee = $.data(this, "selectable-item"); if (selectee) { - var doSelect = !event.metaKey || !selectee.$element.hasClass('ui-selected'); + var doSelect = (!event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass('ui-selected'); selectee.$element .removeClass(doSelect ? "ui-unselecting" : "ui-selected") .addClass(doSelect ? "ui-selecting" : "ui-unselecting"); @@ -189,7 +189,7 @@ $.widget("ui.selectable", $.ui.mouse, { } else { // UNSELECT if (selectee.selecting) { - if (event.metaKey && selectee.startselected) { + if ((event.metaKey || event.ctrlKey) && selectee.startselected) { selectee.$element.removeClass('ui-selecting'); selectee.selecting = false; selectee.$element.addClass('ui-selected'); @@ -208,7 +208,7 @@ $.widget("ui.selectable", $.ui.mouse, { } } if (selectee.selected) { - if (!event.metaKey && !selectee.startselected) { + if (!event.metaKey && !event.ctrlKey && !selectee.startselected) { selectee.$element.removeClass('ui-selected'); selectee.selected = false; -- cgit v1.2.3 From 2445e20a856192179590c0d08e5d73479df1e52d Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 23 Nov 2011 13:39:45 -0500 Subject: Autocomplete: Making sure we do not show search menu after a blur. Fixed #7423 - Tab out of autocomplete with remote source can leave menu showing. --- tests/unit/autocomplete/autocomplete_events.js | 19 +++++++++++++++++++ ui/jquery.ui.autocomplete.js | 4 +++- 2 files changed, 22 insertions(+), 1 deletion(-) (limited to 'ui') diff --git a/tests/unit/autocomplete/autocomplete_events.js b/tests/unit/autocomplete/autocomplete_events.js index 286d902f1..d6a008ea2 100644 --- a/tests/unit/autocomplete/autocomplete_events.js +++ b/tests/unit/autocomplete/autocomplete_events.js @@ -157,6 +157,25 @@ asyncTest( "cancel select", function() { }, 50 ); }); +asyncTest( "blur during remote search", function() { + expect( 1 ); + var ac = $( "#autocomplete" ).autocomplete({ + delay: 0, + source: function( request, response ) { + ok( true, "trigger request" ); + ac.simulate( "blur" ); + setTimeout(function() { + response([ "result" ]); + start(); + }, 100 ); + }, + open: function() { + ok( false, "opened after a blur" ); + } + }); + ac.val( "ro" ).keydown(); +}); + /* TODO previous fix broke more than it fixed, disabling this for now - messed up regular menu select event test("blur without selection", function() { expect(1); diff --git a/ui/jquery.ui.autocomplete.js b/ui/jquery.ui.autocomplete.js index 9871b52d7..dbda2058e 100644 --- a/ui/jquery.ui.autocomplete.js +++ b/ui/jquery.ui.autocomplete.js @@ -184,6 +184,7 @@ $.widget( "ui.autocomplete", { } clearTimeout( self.searching ); + self.cancelSearch = true; // clicks on the menu (or a button to trigger a search) will cause a blur event self.closing = setTimeout(function() { self.close( event ); @@ -373,6 +374,7 @@ $.widget( "ui.autocomplete", { _search: function( value ) { this.pending++; this.element.addClass( "ui-autocomplete-loading" ); + this.cancelSearch = false; this.source( { term: value }, this.response ); }, @@ -382,7 +384,7 @@ $.widget( "ui.autocomplete", { content = this._normalize( content ); } this._trigger( "response", null, { content: content } ); - if ( !this.options.disabled && content && content.length ) { + if ( !this.options.disabled && content && content.length && !this.cancelSearch ) { this._suggest( content ); this._trigger( "open" ); } else { -- cgit v1.2.3 From 74a3f2ce0897ce8bdcac2acc997e68e3e8603121 Mon Sep 17 00:00:00 2001 From: kborchers Date: Wed, 23 Nov 2011 22:37:55 -0600 Subject: Menu: Move mousedown handler into _bind and fix focusing of the Menu after click. Fixes focus issues with Selectmenu and Autocomplete. --- ui/jquery.ui.menu.js | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) (limited to 'ui') diff --git a/ui/jquery.ui.menu.js b/ui/jquery.ui.menu.js index bf36a77fe..4fe859f4e 100644 --- a/ui/jquery.ui.menu.js +++ b/ui/jquery.ui.menu.js @@ -40,16 +40,6 @@ $.widget( "ui.menu", { id: this.menuId, role: "menu" }) - // Prevent focus from sticking to links inside menu after clicking - // them (focus should always stay on UL during navigation). - // If the link is clicked, redirect focus to the menu. - // TODO move to _bind below - .bind( "mousedown.menu", function( event ) { - if ( $( event.target).is( "a" ) ) { - event.preventDefault(); - $( this ).focus( 1 ); - } - }) // need to catch all clicks on disabled menu // not possible through _bind .bind( "click.menu", $.proxy( function( event ) { @@ -58,6 +48,11 @@ $.widget( "ui.menu", { } }, this)); this._bind({ + // Prevent focus from sticking to links inside menu after clicking + // them (focus should always stay on UL during navigation). + "mousedown .ui-menu-item > a": function( event ) { + event.preventDefault(); + }, "click .ui-menu-item:has(a)": function( event ) { event.stopImmediatePropagation(); var target = $( event.currentTarget ); @@ -66,6 +61,8 @@ $.widget( "ui.menu", { this.focus( event, target ); } this.select( event ); + // Redirect focus to the menu. + this.element.focus(); }, "mouseover .ui-menu-item": function( event ) { event.stopImmediatePropagation(); -- cgit v1.2.3