|
1 | 1 | <script lang="ts">
|
2 | 2 | import FormField from 'src/forms/FormField.svelte'
|
3 |
| - import {createEventDispatcher} from 'svelte' |
4 | 3 |
|
5 | 4 | type T = $$Generic
|
6 | 5 |
|
7 | 6 | export let query: string = ''
|
8 | 7 | export let options: T[] = []
|
9 | 8 | export let optionMapper: (m: T) => string
|
| 9 | + export let onselected: ((t: T) => void) | undefined = undefined |
10 | 10 |
|
11 | 11 | let selectedIndex = -1
|
12 | 12 | let showList = false
|
|
26 | 26 | }
|
27 | 27 | }
|
28 | 28 |
|
29 |
| - const dispatch = createEventDispatcher<{selected: T}>() |
30 |
| -
|
31 | 29 | function select(result: T) {
|
32 | 30 | query = optionMapper(result)
|
33 | 31 | setTimeout(() => showList = false)
|
34 |
| - dispatch('selected', result) |
| 32 | + onselected?.(result) |
35 | 33 | }
|
36 | 34 | </script>
|
37 | 35 |
|
38 | 36 | <div class="relative">
|
39 |
| - <FormField type="search" bind:value={query} on:keydown={navigateList} autocomplete="off" {...$$restProps} |
40 |
| - on:input={() => showList = true} on:blur={() => showList = false}> |
| 37 | + <FormField type="search" bind:value={query} onkeydown={navigateList} autocomplete="off" {...$$restProps} |
| 38 | + oninput={() => showList = true} onblur={() => showList = false}> |
41 | 39 | <svelte:fragment slot="after"><slot/></svelte:fragment>
|
42 | 40 | </FormField>
|
43 | 41 |
|
44 | 42 | {#if showList && options.length}
|
45 | 43 | <div class="absolute rounded shadow bg-white overflow-hidden flex flex-col w-full mt-0 border border-gray-200 text-sm">
|
46 | 44 | {#each options as o, i}
|
47 | 45 | <div class="cursor-pointer group border-t"
|
48 |
| - on:mousedown={() => select(o)} |
49 |
| - on:mouseover={() => selectedIndex = i} on:focus={() => {}}> |
| 46 | + onmousedown={() => select(o)} |
| 47 | + onmouseover={() => selectedIndex = i} |
| 48 | + > |
50 | 49 | <div class="block p-2 border-transparent border-l-4"
|
51 | 50 | class:border-primary-600={i === selectedIndex}
|
52 | 51 | class:bg-gray-100={i === selectedIndex}>
|
|
0 commit comments