From a4376a76f06668e5293b350695546a7969b33b77 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Mon, 2 Sep 2019 11:25:29 +0200 Subject: [PATCH 1/3] only pass keyboard to autocomplete when it has selections otherwise if tab is pressed, try to tab complete the last word --- src/components/views/rooms/BasicMessageComposer.js | 2 +- src/editor/autocomplete.js | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/components/views/rooms/BasicMessageComposer.js b/src/components/views/rooms/BasicMessageComposer.js index d55e9acc86..ec1fd3d276 100644 --- a/src/components/views/rooms/BasicMessageComposer.js +++ b/src/components/views/rooms/BasicMessageComposer.js @@ -265,7 +265,7 @@ export default class BasicMessageEditor extends React.Component { handled = true; // autocomplete or enter to send below shouldn't have any modifier keys pressed. } else if (!(event.metaKey || event.altKey || event.shiftKey)) { - if (model.autoComplete) { + if (model.autoComplete && model.autoComplete.hasCompletions()) { const autoComplete = model.autoComplete; switch (event.key) { case "ArrowUp": diff --git a/src/editor/autocomplete.js b/src/editor/autocomplete.js index 79a69c07a6..a4cbc1cec8 100644 --- a/src/editor/autocomplete.js +++ b/src/editor/autocomplete.js @@ -41,6 +41,11 @@ export default class AutocompleteWrapperModel { return this._getAutocompleterComponent().hasSelection(); } + hasCompletions() { + const ac = this._getAutocompleterComponent(); + return ac && ac.countCompletions() > 0; + } + onEnter() { this._updateCallback({close: true}); } From 00d81eece924c95d9850a55c27cf5ecf6c6194d7 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Mon, 2 Sep 2019 11:26:20 +0200 Subject: [PATCH 2/3] don't accept @/#/: as part of command, allow to create pill candidate so if you type these 3 characters, you get the correct autocomplete --- src/editor/parts.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/editor/parts.js b/src/editor/parts.js index d14fcf98a2..9ca9205bcd 100644 --- a/src/editor/parts.js +++ b/src/editor/parts.js @@ -465,10 +465,6 @@ export class CommandPartCreator extends PartCreator { } class CommandPart extends PillCandidatePart { - acceptsInsertion(chr, i) { - return PlainPart.prototype.acceptsInsertion.call(this, chr, i); - } - get type() { return "command"; } From fdd23b34ae0cd11ab3c0831f69d5176f28cce40c Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Mon, 2 Sep 2019 11:27:22 +0200 Subject: [PATCH 3/3] also look backwards into commands for last word to tab-complete --- src/components/views/rooms/BasicMessageComposer.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/views/rooms/BasicMessageComposer.js b/src/components/views/rooms/BasicMessageComposer.js index ec1fd3d276..4d746448ef 100644 --- a/src/components/views/rooms/BasicMessageComposer.js +++ b/src/components/views/rooms/BasicMessageComposer.js @@ -306,7 +306,11 @@ export default class BasicMessageEditor extends React.Component { const position = model.positionForOffset(caret.offset, caret.atNodeEnd); const range = model.startRange(position); range.expandBackwardsWhile((index, offset, part) => { - return part.text[offset] !== " " && (part.type === "plain" || part.type === "pill-candidate"); + return part.text[offset] !== " " && ( + part.type === "plain" || + part.type === "pill-candidate" || + part.type === "command" + ); }); const {partCreator} = model; // await for auto-complete to be open