From 4d9e7577f6345d7eb44d2b7bd08cc66733f092c4 Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Tue, 14 Mar 2023 21:19:07 +0000 Subject: [PATCH 1/5] feat: expanded InputSelectSearch WIP --- .../elements/forms/inputSelectSearch.svelte | 33 +++++++------ .../[[page]]/+page.svelte | 49 +++++++++++++++++++ 2 files changed, 67 insertions(+), 15 deletions(-) diff --git a/src/lib/elements/forms/inputSelectSearch.svelte b/src/lib/elements/forms/inputSelectSearch.svelte index 0ea5d7330..aefd5dac3 100644 --- a/src/lib/elements/forms/inputSelectSearch.svelte +++ b/src/lib/elements/forms/inputSelectSearch.svelte @@ -3,6 +3,13 @@ import { onMount } from 'svelte'; import { Label } from '.'; + type Option = $$Generic<{ + value: string | boolean | number; + label: string; + }>; + type OptionArray = Option[]; + + export let options: OptionArray; export let id: string; export let label: string; export let optionalText: string | undefined = undefined; @@ -11,18 +18,12 @@ export let required = false; export let disabled = false; export let autofocus = false; - export let debounce = 250; - export let options: { - value: string | boolean | number; - label: string; - }[]; // Input value - export let search: string = null; + export let search = ''; // The actual selected value export let value: string | number | boolean; let element: HTMLInputElement; - let timer: ReturnType; let hasFocus = false; let selected: number = null; @@ -36,16 +37,13 @@ } }); - function handleInput(event: Event) { + function handleInput() { hasFocus = true; - clearTimeout(timer); - timer = setTimeout(() => { - const target = event.target as HTMLInputElement; - search = target.value; - }, debounce); } function handleKeydown(event: KeyboardEvent) { + console.log('handle key down'); + event.stopImmediatePropagation(); switch (event.key) { @@ -71,6 +69,7 @@ event.preventDefault(); value = options[selected].value; search = options[selected].label; + // element.value = search; hasFocus = false; } break; @@ -78,6 +77,9 @@ } +Inner search: {search} +
+
  • (hasFocus = true)} on:input={handleInput} on:keydown={handleKeydown} /> -
  • {:else} diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/[[page]]/+page.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/[[page]]/+page.svelte index a7f59dfe0..0fd0bd8d9 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/[[page]]/+page.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/[[page]]/+page.svelte @@ -24,6 +24,7 @@ import { onMount } from 'svelte'; import RelationshipsModal from './relationshipsModal.svelte'; import CreateAttributeDropdown from '../attributes/createAttributeDropdown.svelte'; + import InputSelectSearch from '$lib/elements/forms/inputSelectSearch.svelte'; export let data: PageData; const projectId = $page.params.project; @@ -86,6 +87,36 @@ whole: formattedColumn }; } + + type Option = { + value: string; + label: string; + name: string; + }; + + const selectOptions: Option[] = [ + { + value: '1', + label: 'first-ec68ac3515e4bc06', + name: 'Option 1' + }, + { + value: '2', + label: 'second-ec68ac3521e4bc06', + name: 'Option 2' + } + ]; + + let selectSearch = ''; + let selectValue = ''; + + $: filteredOptions = (function filter() { + console.log('filtering'); + + return selectOptions.filter((option) => + option.label.toLowerCase().includes(selectSearch.toLowerCase()) + ); + })(); @@ -103,6 +134,24 @@ + Outer search: {selectSearch} +
    + Outer value: {selectValue} + +
    + {o.label} + {o.name} +
    +
    + {#if $collection?.attributes?.length} {#if data.documents.total} From 483c5066eb2bc7f8f9ebf417955819494ade9285 Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Wed, 15 Mar 2023 15:45:05 +0000 Subject: [PATCH 2/5] fix: selection bug --- .../elements/forms/inputSelectSearch.svelte | 31 ++++++++++--------- .../[[page]]/+page.svelte | 3 -- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/lib/elements/forms/inputSelectSearch.svelte b/src/lib/elements/forms/inputSelectSearch.svelte index aefd5dac3..0e0895b6e 100644 --- a/src/lib/elements/forms/inputSelectSearch.svelte +++ b/src/lib/elements/forms/inputSelectSearch.svelte @@ -67,18 +67,26 @@ case 'Enter': if (selected !== null) { event.preventDefault(); - value = options[selected].value; - search = options[selected].label; - // element.value = search; - hasFocus = false; + selectOption(options[selected]); } break; } } - -Inner search: {search} -
    + function selectOption(option: Option) { + value = option.value; + search = option.label; + // It's not working without this line. + element.value = search; + hasFocus = false; + } + + function clearOption() { + value = null; + search = ''; + element.value = search; + } +
  • { - search = ''; - value = null; - }}> + on:click|preventDefault={clearOption}>