From 87ccba7f9ddf5154558f5b785fc27b64d4de89f4 Mon Sep 17 00:00:00 2001 From: Ben Basten <45583362+ben-basten@users.noreply.github.com> Date: Thu, 21 Mar 2024 12:24:19 +0000 Subject: [PATCH] feat(web): keyboard access for search dropdown, combobox fixes (#8079) * feat(web): keyboard access for search dropdown Also: fixing cosmetic issue with combobox component. * fix: revert changing required field * fix: create new focusChange action * fix: combobox usability improvements * handle escape key on the clear button * move focus to input when clear button is clicked * leave the dropdown closed if the user has already closed the dropdown and tabs over to the clear button * activate the combobox if a user tabs backwards onto the clear button * rename focusChange to focusOutside * small fixes * do not activate combobox on backwards tabbing * simplify classes in "No results" option * prevent dropdown option from being preselected when clear button is clicked * fix: remove unused event dispatcher interface --- .../shared-components/combobox.svelte | 25 ++++++++++++------- .../search-bar/search-bar.svelte | 4 ++- web/src/lib/utils/focus-outside.ts | 21 ++++++++++++++++ 3 files changed, 40 insertions(+), 10 deletions(-) create mode 100644 web/src/lib/utils/focus-outside.ts diff --git a/web/src/lib/components/shared-components/combobox.svelte b/web/src/lib/components/shared-components/combobox.svelte index 19fd73d25f..28a2b7253d 100644 --- a/web/src/lib/components/shared-components/combobox.svelte +++ b/web/src/lib/components/shared-components/combobox.svelte @@ -18,6 +18,7 @@ import type { FormEventHandler } from 'svelte/elements'; import { shortcuts } from '$lib/utils/shortcut'; import { clickOutside } from '$lib/utils/click-outside'; + import { focusOutside } from '$lib/utils/focus-outside'; /** * Unique identifier for the combobox. @@ -40,6 +41,7 @@ let searchQuery = selectedOption?.label || ''; let selectedIndex: number | undefined; let optionRefs: HTMLElement[] = []; + let input: HTMLInputElement; const inputId = `combobox-${id}`; const listboxId = `listbox-${id}`; @@ -51,7 +53,6 @@ const dispatch = createEventDispatcher<{ select: ComboBoxOption | undefined; - click: void; }>(); const activate = () => { @@ -101,6 +102,8 @@ }; const onClear = () => { + input?.focus(); + selectedIndex = undefined; selectedOption = undefined; searchQuery = ''; dispatch('select', selectedOption); @@ -111,11 +114,16 @@