diff --git a/src/svelte/custom-filter-app/components/folder-filter.svelte b/src/svelte/custom-filter-app/components/folder-filter.svelte index 8f089f5..c7df938 100644 --- a/src/svelte/custom-filter-app/components/folder-filter.svelte +++ b/src/svelte/custom-filter-app/components/folder-filter.svelte @@ -7,6 +7,7 @@ import VaultExplorerPlugin from "src/main"; import EventManager from "src/event/event-manager"; import { PluginEvent } from "src/event/types"; + import SearchSelection from "src/svelte/shared/components/search-selection.svelte"; export let index: number; export let id: string; @@ -134,12 +135,7 @@ on:ruleToggle > - + + import { onMount } from "svelte"; + import Icon from "./icon.svelte"; + + export let width = "fit-content"; + export let options: string[] = []; + + let inputValue = ""; + let selectedValue = ""; + let showDropdown = false; + + onMount(() => { + document.addEventListener("click", handleClickOutside); + + return () => { + document.removeEventListener("click", handleClickOutside); + }; + }); + + function handleOptionClick(e: Event, option: string) { + e.stopPropagation(); + inputValue = option; + selectedValue = option; + showDropdown = false; + } + + function handleInputChange(e: Event) { + const value = (e.target as HTMLInputElement).value; + inputValue = value; + } + + function handleInputClick() { + showDropdown = true; + inputValue = ""; + } + + function handleClickOutside(e: Event) { + const targetEl = e.target as HTMLElement; + const isInsideClick = targetEl.closest( + ".vault-explorer-search-selection", + ); + if (!isInsideClick && showDropdown) { + showDropdown = false; + inputValue = ""; + } + } + + function fuzzySearch(input: string) { + return options.filter((option) => + option.toLowerCase().includes(input.toLowerCase()), + ); + } + + $: filteredOptions = fuzzySearch(inputValue); + + +
+ + + + {#if showDropdown} +
+ {#each filteredOptions as option} +
handleOptionClick(e, option)} + on:keydown={(e) => { + if (e.key === "Enter") { + handleOptionClick(e, option); + } + }} + > + {option} +
+ {/each} + {#if filteredOptions.length === 0} +
+ No results found +
+ {/if} +
+ {/if} +
+ +