From 5dedfdfcadbe240e233539f0a57ff7d5788b63c8 Mon Sep 17 00:00:00 2001 From: Nicolas Dos Santos Date: Wed, 20 Sep 2017 18:54:14 +0200 Subject: [PATCH] mention autocomplete does not trigger when there is an active selection --- mention/plugin.js | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/mention/plugin.js b/mention/plugin.js index 82622a0..fe97211 100644 --- a/mention/plugin.js +++ b/mention/plugin.js @@ -381,17 +381,26 @@ // If the delimiter is a string value convert it to an array. (backwards compatibility) autoCompleteData.delimiter = (autoCompleteData.delimiter !== undefined) ? !$.isArray(autoCompleteData.delimiter) ? [autoCompleteData.delimiter] : autoCompleteData.delimiter : ['@']; - function prevCharIsSpace() { - var start = ed.selection.getRng(true).startOffset, - text = ed.selection.getRng(true).startContainer.data || '', - charachter = text.substr(start > 0 ? start - 1 : 0, 1); - - return (!!$.trim(charachter).length) ? false : true; + function canTriggerAutocomplete() { + var rng = ed.selection.getRng(true); + + // Allow autocomplete to be performed to replace the selected text (if any) + var hasSelectedText = rng.startOffset !== rng.endOffset; + if (hasSelectedText) { + return true; + } + + // Allow autocomplete after whitespaces (if the preceding text can be trimmed to 0 length string) + var start = rng.startOffset, + text = rng.startContainer.data || '', + character = text.substr(start > 0 ? start - 1 : 0, 1); + var prevCharIsNotSpace = !!$.trim(character).length; + return !prevCharIsNotSpace; } ed.on('keypress', function (e) { var delimiterIndex = $.inArray(String.fromCharCode(e.which || e.keyCode), autoCompleteData.delimiter); - if (delimiterIndex > -1 && prevCharIsSpace()) { + if (delimiterIndex > -1 && canTriggerAutocomplete()) { if (autoComplete === undefined || (autoComplete.hasFocus !== undefined && !autoComplete.hasFocus)) { e.preventDefault(); // Clone options object and set the used delimiter.