diff --git a/vuejs/client/src/components/Forms/Field/Combobox.vue b/vuejs/client/src/components/Forms/Field/Combobox.vue index 9626b19d4..0b7ba59bf 100644 --- a/vuejs/client/src/components/Forms/Field/Combobox.vue +++ b/vuejs/client/src/components/Forms/Field/Combobox.vue @@ -270,14 +270,27 @@ function closeScroll(e) { select.isOpen = false; } +// Check after a key is pressed if the current active element is the select button +// If not close the select +function closeTab(e) { + if (e.key !== "Tab" && e.key !== "Shift-Tab") return; + setTimeout(() => { + const activeEl = document.activeElement; + if (activeEl.closest("[data-select-dropdown]") !== selectDropdown.value) + return (select.isOpen = false); + }, 10); +} + // Close select dropdown when clicked outside element watch(select, () => { if (select.isOpen) { window.addEventListener("click", closeOutside); window.addEventListener("scroll", closeScroll, true); + window.addEventListener("keydown", closeTab); } else { window.removeEventListener("click", closeOutside); window.removeEventListener("scroll", closeScroll, true); + window.removeEventListener("keydown", closeTab); } }); @@ -446,6 +459,7 @@ const emits = defineEmits(["inp"]); : '', 'select-dropdown-btn', ]" + data-select-item :data-setting-id="props.id" :data-setting-value="value" :aria-controls="`${props.id}-text`" diff --git a/vuejs/client/src/components/Forms/Field/Select.vue b/vuejs/client/src/components/Forms/Field/Select.vue index 873c1fc72..b6b87abe6 100644 --- a/vuejs/client/src/components/Forms/Field/Select.vue +++ b/vuejs/client/src/components/Forms/Field/Select.vue @@ -246,14 +246,27 @@ function closeScroll(e) { select.isOpen = false; } +// Check after a key is pressed if the current active element is the select button +// If not close the select +function closeTab(e) { + if (e.key !== "Tab" && e.key !== "Shift-Tab") return; + setTimeout(() => { + const activeEl = document.activeElement; + if (activeEl.closest("[data-select-dropdown]") !== selectDropdown.value) + return (select.isOpen = false); + }, 10); +} + // Close select dropdown when clicked outside element watch(select, () => { if (select.isOpen) { window.addEventListener("click", closeOutside); window.addEventListener("scroll", closeScroll, true); + window.addEventListener("keydown", closeTab); } else { window.removeEventListener("click", closeOutside); window.removeEventListener("scroll", closeScroll, true); + window.removeEventListener("keydown", closeTab); } }); @@ -374,6 +387,7 @@ const emits = defineEmits(["inp"]); : '', 'select-dropdown-btn', ]" + data-select-item :data-setting-id="props.id" :data-setting-value="value" :aria-controls="`${props.id}-text`"