Open mentions dropdown when previous char is \n
If starting a newline then open the mentions dropdown when @
is typed.
Ideally we do this for emoji dropdown as well but there was
feedback this is triggered accidentally hence do this only for
the mentions dropdown.
Release-Notes: skip
Google-bug-id: b/236921879
Change-Id: I4b83ea8e4995212b7e533b28415375580ea197b3
diff --git a/polygerrit-ui/app/elements/shared/gr-textarea/gr-textarea.ts b/polygerrit-ui/app/elements/shared/gr-textarea/gr-textarea.ts
index 0cca7e8..9c5e975 100644
--- a/polygerrit-ui/app/elements/shared/gr-textarea/gr-textarea.ts
+++ b/polygerrit-ui/app/elements/shared/gr-textarea/gr-textarea.ts
@@ -470,13 +470,21 @@
// When special char is detected, set index. We are interested only on
// special char after space or in beginning of textarea
+ // In case of mentions we are interested if previous char is '\n' as well
private getSpecialCharIndex(text: string) {
+ const charAtCursor = text[this.textarea!.selectionStart - 1];
if (
this.textarea!.selectionStart < 2 ||
text[this.textarea!.selectionStart - 2] === ' '
) {
return this.textarea!.selectionStart - 1;
}
+ if (
+ charAtCursor === '@' &&
+ text[this.textarea!.selectionStart - 2] === '\n'
+ ) {
+ return this.textarea!.selectionStart - 1;
+ }
return -1;
}
diff --git a/polygerrit-ui/app/elements/shared/gr-textarea/gr-textarea_test.ts b/polygerrit-ui/app/elements/shared/gr-textarea/gr-textarea_test.ts
index 5e6e645..bf01537 100644
--- a/polygerrit-ui/app/elements/shared/gr-textarea/gr-textarea_test.ts
+++ b/polygerrit-ui/app/elements/shared/gr-textarea/gr-textarea_test.ts
@@ -134,6 +134,41 @@
assert.equal(element.specialCharIndex, 0);
});
+ test('mention selector opens when previous char is \n', async () => {
+ stubRestApi('getSuggestedAccounts').returns(
+ Promise.resolve([
+ createAccountWithEmail('abc@google.com'),
+ createAccountWithEmail('abcdef@google.com'),
+ ])
+ );
+ element.textarea!.focus();
+ await waitUntil(() => element.textarea!.focused === true);
+
+ element.textarea!.selectionStart = 1;
+ element.textarea!.selectionEnd = 1;
+ element.text = '\n@';
+
+ await waitUntil(() => element.suggestions.length > 0);
+ await element.updateComplete;
+
+ assert.isTrue(element.emojiSuggestions!.isHidden);
+ assert.isFalse(element.mentionsSuggestions!.isHidden);
+ });
+
+ test('emoji selector does not open when previous char is \n', async () => {
+ element.textarea!.focus();
+ await waitUntil(() => element.textarea!.focused === true);
+
+ element.textarea!.selectionStart = 1;
+ element.textarea!.selectionEnd = 1;
+ element.text = '\n:';
+
+ await element.updateComplete;
+
+ assert.isTrue(element.emojiSuggestions!.isHidden);
+ assert.isTrue(element.mentionsSuggestions!.isHidden);
+ });
+
test('selecting mentions from dropdown', async () => {
stubRestApi('getSuggestedAccounts').returns(
Promise.resolve([