diff --git a/web/src/lib/components/elements/dropdown.svelte b/web/src/lib/components/elements/dropdown.svelte index d89847c209..b08b58f6d9 100644 --- a/web/src/lib/components/elements/dropdown.svelte +++ b/web/src/lib/components/elements/dropdown.svelte @@ -29,10 +29,13 @@ icon?: string; }; - let showMenu = false; + export let showMenu = false; + export let controlable = false; const handleClickOutside = () => { - showMenu = false; + if(!controlable){ + showMenu = false; + } }; const handleSelectOption = (option: T) => { diff --git a/web/src/lib/components/shared-components/change-date.svelte b/web/src/lib/components/shared-components/change-date.svelte index e165069e1d..d21e2dc806 100644 --- a/web/src/lib/components/shared-components/change-date.svelte +++ b/web/src/lib/components/shared-components/change-date.svelte @@ -29,12 +29,25 @@ let selectedTimezone = initialOption?.offset || null; let disabled = false; + let searchQuery = ''; + let filteredTimezones: ZoneOption[] = timezones; + + const updateSearchQuery = (event: Event) => { + searchQuery = (event.target as HTMLInputElement).value; + filterTimezones(); + }; + + const filterTimezones = () => { + filteredTimezones = timezones.filter((timezone) => + timezone.zone.toLowerCase().includes(searchQuery.toLowerCase()) + ); + }; + const dispatch = createEventDispatcher<{ cancel: void; confirm: string; }>(); - const handleSelect = (item: ZoneOption) => (selectedTimezone = item.offset); const handleCancel = () => dispatch('cancel'); const handleConfirm = () => { let date = DateTime.fromISO(selectedDate); @@ -53,6 +66,21 @@ event.stopPropagation(); } }; + let isDropdownOpen = false; + + const openDropdown = () => { + isDropdownOpen = true; + }; + + const closeDropdown = () => { + isDropdownOpen = false; + }; + + const handleSelectTz = (item: ZoneOption) => { + selectedTimezone = item.offset; + closeDropdown(); + }; +
- (item ? `${item.zone} (${item.offset})` : '(not selected)')} - on:select={({ detail: item }) => handleSelect(item)} - /> +
+ + (item ? `${item.zone} (${item.offset})` : '(not selected)')} + on:select={({ detail: item }) => handleSelectTz(item)} + controlable = {true} + bind:showMenu={isDropdownOpen} + /> +