From 111ba4aefcb3485a0cbf009674d1a04d59ead54d Mon Sep 17 00:00:00 2001
From: Roy Liu <rliu@gitlab.com>
Date: Mon, 4 Dec 2023 14:59:03 +0000
Subject: [PATCH] Update field title and allow tab to function as enter

Changelog: changed
---
 .../components/invite_members_modal.vue           |  2 +-
 .../components/members_token_select.vue           |  8 ++++++++
 .../javascripts/invite_members/constants.js       |  2 +-
 locale/gitlab.pot                                 |  4 ++--
 .../components/members_token_select_spec.js       | 15 ++++++++++++++-
 5 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/app/assets/javascripts/invite_members/components/invite_members_modal.vue b/app/assets/javascripts/invite_members/components/invite_members_modal.vue
index 91158ef15c82b..bcf594a7b1ce9 100644
--- a/app/assets/javascripts/invite_members/components/invite_members_modal.vue
+++ b/app/assets/javascripts/invite_members/components/invite_members_modal.vue
@@ -160,7 +160,7 @@ export default {
     labelSearchField() {
       return this.isEmailSignupEnabled
         ? this.$options.labels.searchField
-        : s__('InviteMembersModal|Username');
+        : s__('InviteMembersModal|Username or name');
     },
     isEmptyInvites() {
       return Boolean(this.newUsersToInvite.length);
diff --git a/app/assets/javascripts/invite_members/components/members_token_select.vue b/app/assets/javascripts/invite_members/components/members_token_select.vue
index 015cadc99933c..928f81daf92b1 100644
--- a/app/assets/javascripts/invite_members/components/members_token_select.vue
+++ b/app/assets/javascripts/invite_members/components/members_token_select.vue
@@ -183,6 +183,12 @@ export default {
 
       this.$emit('clear');
     },
+    handleTab(event) {
+      if (this.originalInput.length > 0) {
+        event.preventDefault();
+        this.$refs.tokenSelector.handleEnter();
+      }
+    },
     hasError(token) {
       return Object.keys(this.invalidMembers).includes(memberName(token));
     },
@@ -196,6 +202,7 @@ export default {
 
 <template>
   <gl-token-selector
+    ref="tokenSelector"
     v-model="selectedTokens"
     :state="exceptionState"
     :dropdown-items="users"
@@ -210,6 +217,7 @@ export default {
     @input="handleInput"
     @focus="handleFocus"
     @token-remove="handleTokenRemove"
+    @keydown.tab="handleTab"
   >
     <template #token-content="{ token }">
       <gl-icon
diff --git a/app/assets/javascripts/invite_members/constants.js b/app/assets/javascripts/invite_members/constants.js
index 3b2840ecf1140..f2a6cccbe35ed 100644
--- a/app/assets/javascripts/invite_members/constants.js
+++ b/app/assets/javascripts/invite_members/constants.js
@@ -39,7 +39,7 @@ export const MEMBERS_TO_PROJECT_DEFAULT_INTRO_TEXT = s__(
 export const MEMBERS_TO_PROJECT_CELEBRATE_INTRO_TEXT = s__(
   "InviteMembersModal|Congratulations on creating your project, you're almost there!",
 );
-export const MEMBERS_SEARCH_FIELD = s__('InviteMembersModal|Username or email address');
+export const MEMBERS_SEARCH_FIELD = s__('InviteMembersModal|Username, name or email address');
 export const MEMBERS_PLACEHOLDER = s__('InviteMembersModal|Select members or type email addresses');
 
 export const GROUP_MODAL_DEFAULT_TITLE = s__('InviteMembersModal|Invite a group');
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index ab661f8bf1fa9..6c902239052aa 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -26142,10 +26142,10 @@ msgstr ""
 msgid "InviteMembersModal|To invite new users to this top-level group, you must remove existing users. You can still add existing users from the top-level group, including any subgroups and projects."
 msgstr ""
 
-msgid "InviteMembersModal|Username"
+msgid "InviteMembersModal|Username or name"
 msgstr ""
 
-msgid "InviteMembersModal|Username or email address"
+msgid "InviteMembersModal|Username, name or email address"
 msgstr ""
 
 msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
diff --git a/spec/frontend/invite_members/components/members_token_select_spec.js b/spec/frontend/invite_members/components/members_token_select_spec.js
index a4b8a8b019757..1cda9853ccdd3 100644
--- a/spec/frontend/invite_members/components/members_token_select_spec.js
+++ b/spec/frontend/invite_members/components/members_token_select_spec.js
@@ -12,6 +12,7 @@ const placeholder = 'Search for a member';
 const user1 = { id: 1, name: 'John Smith', username: 'one_1', avatar_url: '' };
 const user2 = { id: 2, name: 'Jane Doe', username: 'two_2', avatar_url: '' };
 const allUsers = [user1, user2];
+const handleEnterSpy = jest.fn();
 
 const createComponent = (props) => {
   return shallowMount(MembersTokenSelect, {
@@ -22,7 +23,11 @@ const createComponent = (props) => {
       ...props,
     },
     stubs: {
-      GlTokenSelector: stubComponent(GlTokenSelector),
+      GlTokenSelector: stubComponent(GlTokenSelector, {
+        methods: {
+          handleEnter: handleEnterSpy,
+        },
+      }),
     },
   });
 };
@@ -173,6 +178,14 @@ describe('MembersTokenSelect', () => {
           });
         });
       });
+
+      it('allows tab to function as enter', () => {
+        tokenSelector.vm.$emit('text-input', 'username');
+
+        tokenSelector.vm.$emit('keydown', new KeyboardEvent('keydown', { key: 'Tab' }));
+
+        expect(handleEnterSpy).toHaveBeenCalled();
+      });
     });
 
     describe('when user is selected', () => {
-- 
GitLab