|
1 | 1 | <script setup lang="ts"> |
2 | 2 | import FilterInput from "@/components/FilterInput.vue"; |
3 | | -import { ref, watch } from "vue"; |
| 3 | +import { onMounted, ref, useTemplateRef, watch } from "vue"; |
4 | 4 |
|
5 | 5 | const selected = defineModel<string>({ required: true }); |
6 | 6 | const props = withDefaults( |
@@ -29,17 +29,24 @@ watch([filter, () => props.items], () => { |
29 | 29 | function setFilter(item: string, isSelected: boolean) { |
30 | 30 | selected.value = isSelected && props.canClear ? "" : item; |
31 | 31 | } |
| 32 | +const bootstrapDropDown = useTemplateRef<HTMLElement | null>("bootstrapDropDown"); |
| 33 | +const filterInput = useTemplateRef<{ focus: () => void } | null>("filterInput"); |
| 34 | +onMounted(() => { |
| 35 | + bootstrapDropDown.value?.addEventListener("shown.bs.dropdown", () => { |
| 36 | + filterInput.value?.focus(); |
| 37 | + }); |
| 38 | +}); |
32 | 39 | </script> |
33 | 40 |
|
34 | 41 | <template> |
35 | | - <div class="dropdown"> |
| 42 | + <div ref="bootstrapDropDown" class="dropdown"> |
36 | 43 | <button type="button" aria-label="open dropdown menu" class="btn btn-dropdown dropdown-toggle sp-btn-menu" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> |
37 | 44 | <span class="wrap-text">{{ selected || defaultEmptyText }}</span> |
38 | 45 | </button> |
39 | 46 | <div class="dropdown-menu wrapper"> |
40 | 47 | <div class="instructions">{{ instructions }}</div> |
41 | 48 | <div v-if="showFilter" class="filter-input"> |
42 | | - <FilterInput v-model="filter" :placeholder="`Filter ${itemName}s`" /> |
| 49 | + <FilterInput ref="filterInput" v-model="filter" :placeholder="`Filter ${itemName}s`" /> |
43 | 50 | </div> |
44 | 51 | <div class="items-container"> |
45 | 52 | <div class="item-container" v-if="showClear && selected" @click.prevent="() => setFilter('', true)"> |
|
0 commit comments