diff --git a/packages/web-app-search/src/portals/SearchBar.vue b/packages/web-app-search/src/portals/SearchBar.vue index 8541c95480..44687e8507 100644 --- a/packages/web-app-search/src/portals/SearchBar.vue +++ b/packages/web-app-search/src/portals/SearchBar.vue @@ -24,7 +24,7 @@ @update:model-value="updateTerm" @clear="onClear" @click="showPreview" - @keyup.esc="hideOptionsDrop" + @keyup.esc="onKeyUpEsc" @keyup.up="onKeyUpUp" @keyup.down="onKeyUpDown" @keyup.enter="onKeyUpEnter" @@ -513,6 +513,14 @@ export default defineComponent({ onKeyUpDown() { this.activePreviewIndex = this.findNextPreviewIndex(false) }, + onKeyUpEsc() { + if (this.term) { + this.updateTerm('') + return + } + const inputElement = this.$el.getElementsByTagName('input')[0] as HTMLElement + inputElement.blur() + }, getSearchResultForProvider(provider: SearchProvider) { return this.searchResults.find(({ providerId }) => providerId === provider.id)?.result }, diff --git a/packages/web-app-search/tests/unit/portals/SearchBar.spec.ts b/packages/web-app-search/tests/unit/portals/SearchBar.spec.ts index a73246ed08..1dcf0f1565 100644 --- a/packages/web-app-search/tests/unit/portals/SearchBar.spec.ts +++ b/packages/web-app-search/tests/unit/portals/SearchBar.spec.ts @@ -251,6 +251,22 @@ describe('Search Bar portal component', () => { wrapper.vm.onSearchShortcut(keyEvent) textInput.remove() }) + test('clears search term on key press esc while input has focus', async () => { + const { wrapper } = getMountedWrapper() + wrapper.find(selectors.searchInput).setValue('albert') + await flushPromises() + wrapper.find(selectors.searchInput).trigger('keyup.esc') + expect(wrapper.vm.term).toBe('') + }) + test('unfocuses search input on key press esc when search term is empty', () => { + const { wrapper } = getMountedWrapper() + const blurSpy = vi.spyOn( + wrapper.find(selectors.searchInput).element as HTMLInputElement, + 'blur' + ) + wrapper.find(selectors.searchInput).trigger('keyup.esc') + expect(blurSpy).toHaveBeenCalled() + }) }) function getMountedWrapper({