|
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