Dernière activité 1723437109

rootspring's Avatar rootspring a révisé ce gist 1723437109. Aller à la révision

1 file changed, 101 insertions

fix(fichier créé)

@@ -0,0 +1,101 @@
1 + <script lang="ts">
2 + import { createEventDispatcher } from 'svelte';
3 + export let name: string;
4 + export let value: string[] = [];
5 + export let placeholder: string | null = null;
6 + export let list: any[] = [];
7 + export let showFilter: boolean = false;
8 + $: getSelected = (): any[] => {
9 + return list?.filter((i) => {
10 + const val: string = i?.value;
11 + return value?.includes(val);
12 + });
13 + };
14 + let text: string;
15 + let open: boolean;
16 + let query: string = '';
17 + $: getResult = (): any[] => {
18 + return list?.filter((e) => {
19 + const q: string = e?.label;
20 + return q.indexOf(query) > -1;
21 + });
22 + };
23 + const dispatch = createEventDispatcher();
24 + const doHandleSelect = (item: any) => {
25 + open = false;
26 + if (!value) value = [];
27 + if (value?.includes(item.value)) return;
28 + value.push(item.value);
29 + value = value;
30 + dispatch('change', item);
31 + query = '';
32 + };
33 + const doHandleRemove = (item: any) => {
34 + value = value?.filter((value) => value != item.value);
35 + };
36 + </script>
37 +
38 + <details bind:open>
39 + <summary>
40 + {#each getSelected() as val}
41 + <input type="hidden" name={`${name}[]`} value={val.value} />
42 + <span class="badge"
43 + >{val.label} &nbsp;
44 + <button on:click|stopPropagation={() => doHandleRemove(val)}>x</button>
45 + </span>
46 + {:else}
47 + <span>{text ?? placeholder ?? '-'}</span>
48 + {/each}
49 + </summary>
50 + <ul role="listbox">
51 + {#if showFilter}
52 + <li class="search">
53 + <input placeholder="search..." type="text" bind:value={query} />
54 + </li>
55 + {/if}
56 + {#each getResult() as item}
57 + <button on:click={() => doHandleSelect(item)} data-value={item?.value}>
58 + {item?.label}
59 + </button>
60 + {/each}
61 + </ul>
62 + </details>
63 +
64 + <style>
65 + details {
66 + position: relative;
67 + }
68 + details summary {
69 + padding: 4px 8px;
70 + border-radius: 4px;
71 + border: 1px solid #eee;
72 + background: #fff;
73 + }
74 + details ul {
75 + position: absolute;
76 + left: 0;
77 + right: 0;
78 + min-height: 100px;
79 + max-height: 150px;
80 + overflow-y: auto;
81 + border: 1px solid #eee;
82 + background: #fff;
83 + box-shadow: 0 0 8px rgba(0, 0, 0, 0.08);
84 + padding: 4px;
85 + }
86 + details ul li {
87 + padding: 2px 4px;
88 + }
89 + details ul li:not(.search):hover {
90 + background: #ecec88;
91 + }
92 + .badge {
93 + padding: 2px 8px;
94 + margin: 2px;
95 + font-size: 0.75rem;
96 + border-radius: 4px;
97 + text-decoration: none !important;
98 + white-space: nowrap;
99 + background: #eee;
100 + }
101 + </style>
Plus récent Plus ancien