@bagelink/vue 0.0.823 → 0.0.827
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/form/inputs/SelectInput.vue.d.ts +2 -0
- package/dist/components/form/inputs/SelectInput.vue.d.ts.map +1 -1
- package/dist/components/layout/Skeleton.vue.d.ts +6 -2
- package/dist/components/layout/Skeleton.vue.d.ts.map +1 -1
- package/dist/index.cjs +117 -87
- package/dist/index.mjs +117 -87
- package/dist/style.css +27 -23
- package/dist/utils/BagelFormUtils.d.ts +1 -0
- package/dist/utils/BagelFormUtils.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/form/inputs/SelectInput.vue +36 -12
- package/src/components/layout/Skeleton.vue +24 -18
- package/src/styles/theme.css +5 -1
- package/src/utils/BagelFormUtils.ts +3 -0
package/dist/style.css
CHANGED
|
@@ -1188,10 +1188,10 @@ p {
|
|
|
1188
1188
|
}
|
|
1189
1189
|
.resize-observer[data-v-b329ee4c]{position:absolute;top:0;left:0;z-index:-1;width:100%;height:100%;border:none;background-color:transparent;pointer-events:none;display:block;overflow:hidden;opacity:0}.resize-observer[data-v-b329ee4c] object{display:block;position:absolute;top:0;left:0;height:100%;width:100%;overflow:hidden;pointer-events:none;z-index:-1}.v-popper__popper{z-index:10000;top:0;left:0;outline:none}.v-popper__popper.v-popper__popper--hidden{visibility:hidden;opacity:0;transition:opacity .15s,visibility .15s;pointer-events:none}.v-popper__popper.v-popper__popper--shown{visibility:visible;opacity:1;transition:opacity .15s}.v-popper__popper.v-popper__popper--skip-transition,.v-popper__popper.v-popper__popper--skip-transition>.v-popper__wrapper{transition:none!important}.v-popper__backdrop{position:absolute;top:0;left:0;width:100%;height:100%;display:none}.v-popper__inner{position:relative;box-sizing:border-box;overflow-y:auto}.v-popper__inner>div{position:relative;z-index:1;max-width:inherit;max-height:inherit}.v-popper__arrow-container{position:absolute;width:10px;height:10px}.v-popper__popper--arrow-overflow .v-popper__arrow-container,.v-popper__popper--no-positioning .v-popper__arrow-container{display:none}.v-popper__arrow-inner,.v-popper__arrow-outer{border-style:solid;position:absolute;top:0;left:0;width:0;height:0}.v-popper__arrow-inner{visibility:hidden;border-width:7px}.v-popper__arrow-outer{border-width:6px}.v-popper__popper[data-popper-placement^=top] .v-popper__arrow-inner,.v-popper__popper[data-popper-placement^=bottom] .v-popper__arrow-inner{left:-2px}.v-popper__popper[data-popper-placement^=top] .v-popper__arrow-outer,.v-popper__popper[data-popper-placement^=bottom] .v-popper__arrow-outer{left:-1px}.v-popper__popper[data-popper-placement^=top] .v-popper__arrow-inner,.v-popper__popper[data-popper-placement^=top] .v-popper__arrow-outer{border-bottom-width:0;border-left-color:transparent!important;border-right-color:transparent!important;border-bottom-color:transparent!important}.v-popper__popper[data-popper-placement^=top] .v-popper__arrow-inner{top:-2px}.v-popper__popper[data-popper-placement^=bottom] .v-popper__arrow-container{top:0}.v-popper__popper[data-popper-placement^=bottom] .v-popper__arrow-inner,.v-popper__popper[data-popper-placement^=bottom] .v-popper__arrow-outer{border-top-width:0;border-left-color:transparent!important;border-right-color:transparent!important;border-top-color:transparent!important}.v-popper__popper[data-popper-placement^=bottom] .v-popper__arrow-inner{top:-4px}.v-popper__popper[data-popper-placement^=bottom] .v-popper__arrow-outer{top:-6px}.v-popper__popper[data-popper-placement^=left] .v-popper__arrow-inner,.v-popper__popper[data-popper-placement^=right] .v-popper__arrow-inner{top:-2px}.v-popper__popper[data-popper-placement^=left] .v-popper__arrow-outer,.v-popper__popper[data-popper-placement^=right] .v-popper__arrow-outer{top:-1px}.v-popper__popper[data-popper-placement^=right] .v-popper__arrow-inner,.v-popper__popper[data-popper-placement^=right] .v-popper__arrow-outer{border-left-width:0;border-left-color:transparent!important;border-top-color:transparent!important;border-bottom-color:transparent!important}.v-popper__popper[data-popper-placement^=right] .v-popper__arrow-inner{left:-4px}.v-popper__popper[data-popper-placement^=right] .v-popper__arrow-outer{left:-6px}.v-popper__popper[data-popper-placement^=left] .v-popper__arrow-container{right:-10px}.v-popper__popper[data-popper-placement^=left] .v-popper__arrow-inner,.v-popper__popper[data-popper-placement^=left] .v-popper__arrow-outer{border-right-width:0;border-top-color:transparent!important;border-right-color:transparent!important;border-bottom-color:transparent!important}.v-popper__popper[data-popper-placement^=left] .v-popper__arrow-inner{left:-2px}.v-popper--theme-tooltip .v-popper__inner{background:rgba(0,0,0,.8);color:#fff;border-radius:6px;padding:7px 12px 6px}.v-popper--theme-tooltip .v-popper__arrow-outer{border-color:#000c}.v-popper--theme-dropdown .v-popper__inner{background:#fff;color:#000;border-radius:6px;border:1px solid #ddd;box-shadow:0 6px 30px #0000001a}.v-popper--theme-dropdown .v-popper__arrow-inner{visibility:visible;border-color:#fff}.v-popper--theme-dropdown .v-popper__arrow-outer{border-color:#ddd}
|
|
1190
1190
|
|
|
1191
|
-
.selectinput[data-v-
|
|
1191
|
+
.selectinput[data-v-e3164caf] {
|
|
1192
1192
|
width: 100%;
|
|
1193
1193
|
}
|
|
1194
|
-
.selectinput-option[data-v-
|
|
1194
|
+
.selectinput-option[data-v-e3164caf] {
|
|
1195
1195
|
padding: 6px 12px;
|
|
1196
1196
|
cursor: pointer;
|
|
1197
1197
|
border-radius: 5px;
|
|
@@ -1203,23 +1203,23 @@ p {
|
|
|
1203
1203
|
font-size: var(--input-font-size);
|
|
1204
1204
|
margin-block: 0.15rem;
|
|
1205
1205
|
}
|
|
1206
|
-
.selectinput-option .bgl_icon-font[data-v-
|
|
1206
|
+
.selectinput-option .bgl_icon-font[data-v-e3164caf]{
|
|
1207
1207
|
line-height: normal;
|
|
1208
1208
|
}
|
|
1209
|
-
.selectinput-options.multiselect .selectinput-option[data-v-
|
|
1209
|
+
.selectinput-options.multiselect .selectinput-option[data-v-e3164caf] {
|
|
1210
1210
|
grid-template-columns: 10px 1fr;
|
|
1211
1211
|
}
|
|
1212
|
-
.selectinput-options[data-v-
|
|
1212
|
+
.selectinput-options[data-v-e3164caf] {
|
|
1213
1213
|
max-height: 300px;
|
|
1214
1214
|
overflow-y: auto;
|
|
1215
1215
|
}
|
|
1216
|
-
.selectinput-option[data-v-
|
|
1216
|
+
.selectinput-option[data-v-e3164caf]:hover {
|
|
1217
1217
|
background: var(--bgl-gray-20);
|
|
1218
1218
|
}
|
|
1219
|
-
.isEmpty p[data-v-
|
|
1219
|
+
.isEmpty p[data-v-e3164caf] {
|
|
1220
1220
|
opacity: 0.3;
|
|
1221
1221
|
}
|
|
1222
|
-
.selected[data-v-
|
|
1222
|
+
.selected[data-v-e3164caf]{
|
|
1223
1223
|
/* background: var(--bgl-primary-tint); */
|
|
1224
1224
|
background: var(--bgl-selected);
|
|
1225
1225
|
}
|
|
@@ -1814,27 +1814,27 @@ p {
|
|
|
1814
1814
|
transform: translateX(-20px);
|
|
1815
1815
|
}
|
|
1816
1816
|
|
|
1817
|
-
.skeleton-wrap[data-v-
|
|
1818
|
-
--skeleton-radius: 0.25rem;
|
|
1819
|
-
--skeleton-bg: #f0f0f0;
|
|
1820
|
-
--skeleton-margin: 1rem;
|
|
1817
|
+
.skeleton-wrap[data-v-9a44f23a] {
|
|
1821
1818
|
margin-bottom: var(--skeleton-margin);
|
|
1822
1819
|
}
|
|
1823
|
-
.skeleton[data-v-
|
|
1824
|
-
animation: skeleton-a06bec19 2s infinite;
|
|
1820
|
+
.skeleton[data-v-9a44f23a] {
|
|
1825
1821
|
background-color: var(--skeleton-bg);
|
|
1826
1822
|
border-radius: var(--bg-card-radius);
|
|
1827
1823
|
margin-bottom: 0.25em;
|
|
1824
|
+
position: relative;
|
|
1825
|
+
overflow: hidden;
|
|
1828
1826
|
}
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
1827
|
+
.skeleton[data-v-9a44f23a]::before {
|
|
1828
|
+
content: "";
|
|
1829
|
+
background: linear-gradient(90deg, transparent 20%, var(--skeleton-pulse) 50%, transparent 80%);
|
|
1830
|
+
animation: loadingAnimation-9a44f23a 1s ease-in-out infinite;
|
|
1831
|
+
position: absolute;
|
|
1832
|
+
inset: 0px;
|
|
1833
|
+
transform: translateX(-100%);
|
|
1835
1834
|
}
|
|
1836
|
-
|
|
1837
|
-
|
|
1835
|
+
@keyframes loadingAnimation-9a44f23a {
|
|
1836
|
+
to {
|
|
1837
|
+
transform: translateX(100%);
|
|
1838
1838
|
}
|
|
1839
1839
|
}
|
|
1840
1840
|
|
|
@@ -13225,7 +13225,9 @@ body:has([class*="slide-fade"])::-webkit-scrollbar {
|
|
|
13225
13225
|
--bgl-scrollbar-thumb: var(--bgl-gray);
|
|
13226
13226
|
--pill-btn-color: var(--bgl-white);
|
|
13227
13227
|
--pill-btn-bg: var(--placeholder-color);
|
|
13228
|
-
--bgl-selected: var(--bgl-gray-light)
|
|
13228
|
+
--bgl-selected: var(--bgl-gray-light);
|
|
13229
|
+
--skeleton-bg: #f0f0f0;
|
|
13230
|
+
--skeleton-pulse: var(--bgl-bg);
|
|
13229
13231
|
}
|
|
13230
13232
|
/* TYPE */
|
|
13231
13233
|
:root {
|
|
@@ -13244,6 +13246,8 @@ body:has([class*="slide-fade"])::-webkit-scrollbar {
|
|
|
13244
13246
|
--btn-height: 40px;
|
|
13245
13247
|
--pill-border-radius: 8px;
|
|
13246
13248
|
--pill-height: 30px;
|
|
13249
|
+
--skeleton-radius: 0.25rem;
|
|
13250
|
+
--skeleton-margin: 1rem;
|
|
13247
13251
|
}
|
|
13248
13252
|
/* MISC */
|
|
13249
13253
|
:root {
|
|
@@ -16,6 +16,7 @@ interface TextInputOptions extends InputOptions {
|
|
|
16
16
|
interface SlctInputOptions extends InputOptions {
|
|
17
17
|
searchable?: boolean;
|
|
18
18
|
multiselect?: boolean;
|
|
19
|
+
onSearch?: (search: string) => any;
|
|
19
20
|
}
|
|
20
21
|
interface NumFieldOptions extends InputOptions {
|
|
21
22
|
max?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BagelFormUtils.d.ts","sourceRoot":"","sources":["../../src/utils/BagelFormUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,cAAc,EAAE,KAAK,KAAK,EAAE,KAAK,MAAM,EAAY,MAAM,eAAe,CAAA;AAGjG,UAAU,YAAY;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,KAAK,WAAW,GAAG,YAAY,CAAA;AAE/B,UAAU,gBAAiB,SAAQ,YAAY;IAC9C,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,CAAA;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,UAAU,gBAAiB,SAAQ,YAAY;IAC9C,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,WAAW,CAAC,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"BagelFormUtils.d.ts","sourceRoot":"","sources":["../../src/utils/BagelFormUtils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
Btn,
|
|
4
4
|
Card,
|
|
5
|
+
Skeleton,
|
|
5
6
|
Dropdown,
|
|
6
7
|
Icon,
|
|
7
8
|
type MaterialIcons,
|
|
@@ -26,9 +27,10 @@ const props = defineProps<{
|
|
|
26
27
|
defaultValue?: Option
|
|
27
28
|
clearable?: boolean
|
|
28
29
|
searchPlaceholder?: string
|
|
30
|
+
onSearch?: (search: string) => Promise<Option[]>
|
|
29
31
|
}>()
|
|
30
32
|
|
|
31
|
-
const emit = defineEmits(['update:modelValue'])
|
|
33
|
+
const emit = defineEmits(['update:modelValue']) // Add 'search' event
|
|
32
34
|
|
|
33
35
|
const searchPlaceholder = $computed(() => props.searchPlaceholder || 'Search')
|
|
34
36
|
|
|
@@ -60,17 +62,35 @@ const selectedLabel = $computed((): string => {
|
|
|
60
62
|
return selectedItems.map(item => getLabel(item)).join(', ')
|
|
61
63
|
})
|
|
62
64
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
65
|
+
let serverOptions: Option[] = $ref([])
|
|
66
|
+
let isSearching = $ref(false)
|
|
67
|
+
|
|
68
|
+
async function runServerSearch() {
|
|
69
|
+
if (props.onSearch !== undefined) {
|
|
70
|
+
isSearching = true
|
|
71
|
+
serverOptions = await props.onSearch(search)
|
|
72
|
+
isSearching = false
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const filteredOptions = $computed(() => {
|
|
77
|
+
if (props.onSearch !== undefined) {
|
|
78
|
+
if (isSearching) return []
|
|
79
|
+
if (search.trim().length) return serverOptions
|
|
80
|
+
return props.options
|
|
81
|
+
}
|
|
82
|
+
return props.options.filter((option) => {
|
|
83
|
+
const searchTerm = search
|
|
84
|
+
.split(/\s+/)
|
|
85
|
+
.filter(Boolean)
|
|
86
|
+
.map(t => new RegExp(t.replaceAll(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'gi'))
|
|
87
|
+
return (
|
|
88
|
+
Boolean(option)
|
|
89
|
+
&& (searchTerm.every(s => getLabel(option).match(s))
|
|
90
|
+
)
|
|
71
91
|
)
|
|
72
|
-
)
|
|
73
|
-
})
|
|
92
|
+
})
|
|
93
|
+
})
|
|
74
94
|
|
|
75
95
|
const isSelected = (option: Option) => selectedItems.find(item => getValue(option) === getValue(item)) !== undefined
|
|
76
96
|
|
|
@@ -87,7 +107,7 @@ function updateOpen(visible: boolean) {
|
|
|
87
107
|
if (props.searchable && !props.multiselect && selectedItemCount) search = selectedLabel as string
|
|
88
108
|
setTimeout(
|
|
89
109
|
() => (searchInput as any)?.$el?.querySelector('input')?.focus(),
|
|
90
|
-
|
|
110
|
+
100,
|
|
91
111
|
)
|
|
92
112
|
}
|
|
93
113
|
}
|
|
@@ -176,6 +196,7 @@ watch(
|
|
|
176
196
|
)
|
|
177
197
|
|
|
178
198
|
onMounted(() => {
|
|
199
|
+
console.log('mounted')
|
|
179
200
|
if (props.defaultValue !== undefined) {
|
|
180
201
|
const defaultOption = props.options.find(
|
|
181
202
|
o => getValue(o) === getValue(props.defaultValue),
|
|
@@ -193,6 +214,7 @@ onMounted(() => {
|
|
|
193
214
|
ref="dropdown"
|
|
194
215
|
placement="bottom-start"
|
|
195
216
|
class="bagel-input selectinput"
|
|
217
|
+
noAutoFocus
|
|
196
218
|
@hide="updateOpen(false)"
|
|
197
219
|
>
|
|
198
220
|
<template #trigger>
|
|
@@ -207,6 +229,7 @@ onMounted(() => {
|
|
|
207
229
|
dense
|
|
208
230
|
:placeholder="searchPlaceholder"
|
|
209
231
|
icon="search"
|
|
232
|
+
@debounce="runServerSearch"
|
|
210
233
|
@input="selected = false"
|
|
211
234
|
/>
|
|
212
235
|
<button
|
|
@@ -249,6 +272,7 @@ onMounted(() => {
|
|
|
249
272
|
</div>
|
|
250
273
|
</label>
|
|
251
274
|
</template>
|
|
275
|
+
<Skeleton v-if="isSearching" :count="3" width="230px" height="30px" class="mx-1 my-05" />
|
|
252
276
|
<Card
|
|
253
277
|
class="p-05"
|
|
254
278
|
:style="{ width: fullWidth ? '100%' : 'auto' }"
|
|
@@ -4,11 +4,15 @@ const {
|
|
|
4
4
|
height = '50px',
|
|
5
5
|
width = 'auto',
|
|
6
6
|
borderRadius = 'var(--skeleton-radius)',
|
|
7
|
+
round = false,
|
|
8
|
+
class: className = '',
|
|
7
9
|
} = defineProps<{
|
|
8
|
-
count?: number
|
|
10
|
+
count?: number | string
|
|
9
11
|
height?: string
|
|
10
12
|
width?: string
|
|
13
|
+
round?: boolean
|
|
11
14
|
borderRadius?: string
|
|
15
|
+
class?: string
|
|
12
16
|
}>()
|
|
13
17
|
import { useSlots } from 'vue'
|
|
14
18
|
|
|
@@ -16,37 +20,39 @@ const slots = useSlots()
|
|
|
16
20
|
</script>
|
|
17
21
|
|
|
18
22
|
<template>
|
|
19
|
-
<template v-for="i in count" :key="i">
|
|
20
|
-
<div v-if="slots.default" class="skeleton-wrap">
|
|
23
|
+
<template v-for="i in +count" :key="i">
|
|
24
|
+
<div v-if="slots.default" class="skeleton-wrap" :class="className">
|
|
21
25
|
<slot />
|
|
22
26
|
</div>
|
|
23
|
-
<div v-else class="skeleton" :style="{ height, width, borderRadius }" />
|
|
27
|
+
<div v-else class="skeleton" :style="{ height, width, borderRadius }" :class="{ round, [className as string]: true }" />
|
|
24
28
|
</template>
|
|
25
29
|
</template>
|
|
26
30
|
|
|
27
31
|
<style scoped>
|
|
28
32
|
.skeleton-wrap {
|
|
29
|
-
--skeleton-radius: 0.25rem;
|
|
30
|
-
--skeleton-bg: #f0f0f0;
|
|
31
|
-
--skeleton-margin: 1rem;
|
|
32
33
|
margin-bottom: var(--skeleton-margin);
|
|
33
34
|
}
|
|
35
|
+
|
|
34
36
|
.skeleton {
|
|
35
|
-
animation: skeleton 2s infinite;
|
|
36
37
|
background-color: var(--skeleton-bg);
|
|
37
38
|
border-radius: var(--bg-card-radius);
|
|
38
39
|
margin-bottom: 0.25em;
|
|
40
|
+
position: relative;
|
|
41
|
+
overflow: hidden;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.skeleton::before {
|
|
45
|
+
content: "";
|
|
46
|
+
background: linear-gradient(90deg, transparent 20%, var(--skeleton-pulse) 50%, transparent 80%);
|
|
47
|
+
animation: loadingAnimation 1s ease-in-out infinite;
|
|
48
|
+
position: absolute;
|
|
49
|
+
inset: 0px;
|
|
50
|
+
transform: translateX(-100%);
|
|
39
51
|
}
|
|
40
52
|
|
|
41
|
-
@keyframes
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
50% {
|
|
46
|
-
opacity: 1;
|
|
47
|
-
}
|
|
48
|
-
100% {
|
|
49
|
-
opacity: 0.5;
|
|
50
|
-
}
|
|
53
|
+
@keyframes loadingAnimation {
|
|
54
|
+
to {
|
|
55
|
+
transform: translateX(100%);
|
|
56
|
+
}
|
|
51
57
|
}
|
|
52
58
|
</style>
|
package/src/styles/theme.css
CHANGED
|
@@ -36,7 +36,9 @@
|
|
|
36
36
|
--bgl-scrollbar-thumb: var(--bgl-gray);
|
|
37
37
|
--pill-btn-color: var(--bgl-white);
|
|
38
38
|
--pill-btn-bg: var(--placeholder-color);
|
|
39
|
-
--bgl-selected: var(--bgl-gray-light)
|
|
39
|
+
--bgl-selected: var(--bgl-gray-light);
|
|
40
|
+
--skeleton-bg: #f0f0f0;
|
|
41
|
+
--skeleton-pulse: var(--bgl-bg);
|
|
40
42
|
}
|
|
41
43
|
|
|
42
44
|
/* TYPE */
|
|
@@ -57,6 +59,8 @@
|
|
|
57
59
|
--btn-height: 40px;
|
|
58
60
|
--pill-border-radius: 8px;
|
|
59
61
|
--pill-height: 30px;
|
|
62
|
+
--skeleton-radius: 0.25rem;
|
|
63
|
+
--skeleton-margin: 1rem;
|
|
60
64
|
}
|
|
61
65
|
|
|
62
66
|
/* MISC */
|
|
@@ -21,6 +21,7 @@ interface TextInputOptions extends InputOptions {
|
|
|
21
21
|
interface SlctInputOptions extends InputOptions {
|
|
22
22
|
searchable?: boolean
|
|
23
23
|
multiselect?: boolean
|
|
24
|
+
onSearch?: (search: string) => any
|
|
24
25
|
}
|
|
25
26
|
|
|
26
27
|
interface NumFieldOptions extends InputOptions {
|
|
@@ -80,6 +81,7 @@ export function slctField(
|
|
|
80
81
|
label?: string,
|
|
81
82
|
options?: Option[] | (() => Option[]),
|
|
82
83
|
config?: SlctInputOptions,
|
|
84
|
+
|
|
83
85
|
): Field {
|
|
84
86
|
return {
|
|
85
87
|
$el: 'select',
|
|
@@ -94,6 +96,7 @@ export function slctField(
|
|
|
94
96
|
disabled: config?.disabled,
|
|
95
97
|
searchable: config?.searchable,
|
|
96
98
|
multiselect: config?.multiselect,
|
|
99
|
+
onSearch: config?.onSearch,
|
|
97
100
|
},
|
|
98
101
|
}
|
|
99
102
|
}
|