11<template >
22 <div class =" input-group" >
33 <label v-if =" label" :for =" name" >{{ label }} <slot ></slot ></label >
4- <div class =" custom-select" @blur =" open = false" :tabindex =" tabindex" >
5- <div class =" selected" :class =" { open: open, inactive: inactive }" @click =" open = !open" >{{ selected }} <IconChevronDown class =" selected-icon" /></div >
6- <div class =" rounded" :class =" { selectHide: !open }" >
7- <div ref =" items" class =" items" >
8- <div :key =" 0" @click =" updateClick(null)" >{{ placeholder }}</div >
9- <div v-for =" (option, i) of options" :key =" i" @click =" updateClick(option)" :class =" { highlight: check(option, modelValue) }" >{{ option.value ?? option }} <IconCheckmark v-if =" check(option, modelValue)" class =" checkmark" /></div >
4+ <div :class =" { 'custom-select': true, 'custom-select-open': open }" :data-uid =" uid" @blur =" open = false" @click.stop =" openSelect" >
5+ <div class =" selected" :class =" { open: open, inactive: inactive }" >{{ selected }} <IconChevronDown class =" selected-icon" /></div >
6+ <div class =" rounded" >
7+ <input type =" text" placeholder =" Search" @click.stop =" " @keyup =" filterOptions" />
8+ <div ref =" items" class =" items" :tabindex =" tabindex" >
9+ <div v-if =" search_check" class =" select-search-error" >{{ searchError }}</div >
10+ <div v-if =" !search_check" :key =" 0" @click.stop =" updateClick(null)" >{{ placeholder }}</div >
11+ <div v-for =" (option, i) of filtered_options" :key =" i" @click.stop =" updateClick(option)" :class =" { highlight: check(option, modelValue) }" >{{ option.value ?? option }} <IconCheckmark v-if =" check(option, modelValue)" class =" checkmark" /></div >
1012 </div >
1113 </div >
1214 <input ref =" input" type =" hidden" v-model =" modelValue" :name =" name" />
@@ -27,12 +29,29 @@ const props = defineProps({
2729 modelValue: { type: String },
2830 tabindex: { type: Number , default: 0 },
2931 placeholder: { type: String , default: ' Choose' },
32+ searchError: { type: String , default: ' Option does not exists.' },
3033})
3134const { label , name , options , modelValue , tabindex , placeholder } = toRefs (props)
3235const input = ref (null )
3336const selected = ref (null )
3437const inactive = ref (false )
3538const open = ref (false )
39+ const search_check = ref (false )
40+ const filtered_options = ref (options .value )
41+ const uid = ref (' custom-select-' + Date .now ())
42+
43+ function openSelect () {
44+ let all = document .querySelectorAll (' .custom-select-open' )
45+ all .forEach ((el ) => {
46+ let data = el .dataset .uid ?? null
47+ console .log (data)
48+ if (data != uid .value ) {
49+ el .click ()
50+ }
51+ })
52+
53+ open .value = ! open .value
54+ }
3655
3756// Test option highligt
3857function check (option , modelValue ) {
@@ -53,21 +72,25 @@ onMounted(() => {
5372 inactive .value = true
5473 modelValue .value = null
5574 }
75+
76+ document .addEventListener (' click' , (e ) => {
77+ let a = document .querySelectorAll (' .custom-select-open' )
78+ a .forEach ((el ) => el .click ())
79+ })
5680})
5781
5882function updateClick (option = null ) {
5983 if (option == null ) {
6084 modelValue .value = null
6185 selected .value = placeholder .value
6286 inactive .value = true
63- open .value = false
6487 } else {
6588 modelValue .value = option .key ?? option
6689 selected .value = option .value ?? option
6790 inactive .value = false
68- open .value = false
6991 }
70- emit (' update:modelValue' , modelValue .value )
92+ open .value = false
93+ emit (' update:modelValue' , modelValue)
7194}
7295
7396function renameKeys (obj = { id: ' 1' , name: ' Alex' }, newKeys = { id: ' key' , name: ' value' }) {
@@ -77,6 +100,17 @@ function renameKeys(obj = { id: '1', name: 'Alex' }, newKeys = { id: 'key', name
77100 })
78101 return Object .assign ({}, ... keyValues)
79102}
103+
104+ function filterOptions (e ) {
105+ filtered_options .value = options? .value ? .filter ((o ) => {
106+ if (o? .value ) {
107+ return o .value .toLowerCase ().startsWith (e .target .value .toLowerCase ())
108+ } else {
109+ return o .toLowerCase ().startsWith (e .target .value .toLowerCase ())
110+ }
111+ })
112+ search_check .value = filtered_options .value .length == 0 ? true : false
113+ }
80114< / script>
81115
82116< style>
0 commit comments