mirror of
https://github.com/discourse/discourse.git
synced 2024-11-27 11:20:57 -06:00
FIX: Bugs with autocomplete
It wasn't tearing itself down properly. It was swallowing events.
This commit is contained in:
parent
2389bee24c
commit
da9e2792eb
@ -57,6 +57,10 @@ export default TextField.extend({
|
||||
});
|
||||
}.on('didInsertElement'),
|
||||
|
||||
_removeAutocomplete: function() {
|
||||
this.$().autocomplete('destroy');
|
||||
}.on('willDestroyElement'),
|
||||
|
||||
// THIS IS A HUGE HACK TO SUPPORT CLEARING THE INPUT
|
||||
_clearInput: function() {
|
||||
if (arguments.length > 1) {
|
||||
|
@ -33,11 +33,23 @@ var keys = {
|
||||
};
|
||||
|
||||
|
||||
let inputTimeout;
|
||||
|
||||
export default function(options) {
|
||||
var autocompletePlugin = this;
|
||||
|
||||
if (this.length === 0) return;
|
||||
|
||||
if (options === 'destroy') {
|
||||
Ember.run.cancel(inputTimeout);
|
||||
|
||||
$(this).off('keypress.autocomplete')
|
||||
.off('keydown.autocomplete')
|
||||
.off('paste.autocomplete');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (options && options.cancel && this.data("closeAutocomplete")) {
|
||||
this.data("closeAutocomplete")();
|
||||
return this;
|
||||
@ -252,13 +264,13 @@ export default function(options) {
|
||||
closeAutocomplete();
|
||||
});
|
||||
|
||||
$(this).on('paste', function() {
|
||||
$(this).on('paste.autocomplete', function() {
|
||||
_.delay(function(){
|
||||
me.trigger("keydown");
|
||||
}, 50);
|
||||
});
|
||||
|
||||
$(this).keypress(function(e) {
|
||||
$(this).on('keypress.autocomplete', function(e) {
|
||||
var caretPosition, term;
|
||||
|
||||
// keep hunting backwards till you hit a the @ key
|
||||
@ -277,7 +289,7 @@ export default function(options) {
|
||||
}
|
||||
});
|
||||
|
||||
$(this).keydown(function(e) {
|
||||
$(this).on('keydown.autocomplete', function(e) {
|
||||
var c, caretPosition, i, initial, next, prev, prevIsGood, stopFound, term, total, userToComplete;
|
||||
|
||||
if(e.ctrlKey || e.altKey || e.metaKey){
|
||||
@ -286,7 +298,9 @@ export default function(options) {
|
||||
|
||||
if(options.allowAny){
|
||||
// saves us wiring up a change event as well, keypress is while its pressed
|
||||
_.delay(function(){
|
||||
|
||||
Ember.run.cancel(inputTimeout);
|
||||
inputTimeout = Ember.run.later(function(){
|
||||
if(inputSelectedItems.length === 0) {
|
||||
inputSelectedItems.push("");
|
||||
}
|
||||
@ -299,7 +313,7 @@ export default function(options) {
|
||||
}
|
||||
}
|
||||
|
||||
},50);
|
||||
}, 50);
|
||||
}
|
||||
|
||||
if (!options.key) {
|
||||
@ -332,7 +346,7 @@ export default function(options) {
|
||||
|
||||
// ESC
|
||||
if (e.which === keys.esc) {
|
||||
if (completeStart !== null) {
|
||||
if (div !== null) {
|
||||
closeAutocomplete();
|
||||
return false;
|
||||
}
|
||||
|
@ -2,6 +2,22 @@ export default Ember.View.extend({
|
||||
elementId: 'discourse-modal',
|
||||
templateName: 'modal/modal',
|
||||
classNameBindings: [':modal', ':hidden', 'controller.modalClass'],
|
||||
attributeBindings: ['data-keyboard'],
|
||||
|
||||
// We handle ESC ourselves
|
||||
'data-keyboard': 'false',
|
||||
|
||||
_bindOnInsert: function() {
|
||||
$('html').on('keydown.discourse-modal', e => {
|
||||
if (e.which === 27) {
|
||||
Em.run.next(() => $('.modal-header a.close').click());
|
||||
}
|
||||
});
|
||||
}.on('didInsertElement'),
|
||||
|
||||
_bindOnDestroy: function() {
|
||||
$('html').off('keydown.discourse-modal');
|
||||
}.on('willDestroyElement'),
|
||||
|
||||
click(e) {
|
||||
const $target = $(e.target);
|
||||
@ -12,12 +28,5 @@ export default Ember.View.extend({
|
||||
// the backdrop and makes it unclickable.
|
||||
$('.modal-header a.close').click();
|
||||
}
|
||||
},
|
||||
|
||||
keyDown(e) {
|
||||
// Delegate click to modal close when pressing ESC
|
||||
if (e.which === 27) {
|
||||
Em.run.next(() => $('.modal-header a.close').click());
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -22,7 +22,7 @@ test("modal", () => {
|
||||
ok(find('#discourse-modal:visible').length === 1, 'modal should reappear');
|
||||
});
|
||||
|
||||
keyEvent('#main-outlet', 'keyup', 27);
|
||||
keyEvent('#main-outlet', 'keydown', 27);
|
||||
andThen(() => {
|
||||
ok(find('#discourse-modal:visible').length === 0, 'ESC should close the modal');
|
||||
});
|
||||
|
Loading…
Reference in New Issue
Block a user