timezone typeahead filter

timezone typeahead filter
This commit is contained in:
yannfrendo
2023-11-22 13:22:22 +01:00
parent 9ed0f78299
commit e26192eb00
2 changed files with 53 additions and 9 deletions
@@ -29,10 +29,13 @@
icon?: string; icon?: string;
}; };
let showMenu = false; export let showMenu = false;
export let controlable = false;
const handleClickOutside = () => { const handleClickOutside = () => {
if(!controlable){
showMenu = false; showMenu = false;
}
}; };
const handleSelectOption = (option: T) => { const handleSelectOption = (option: T) => {
@@ -29,12 +29,25 @@
let selectedTimezone = initialOption?.offset || null; let selectedTimezone = initialOption?.offset || null;
let disabled = false; 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<{ const dispatch = createEventDispatcher<{
cancel: void; cancel: void;
confirm: string; confirm: string;
}>(); }>();
const handleSelect = (item: ZoneOption) => (selectedTimezone = item.offset);
const handleCancel = () => dispatch('cancel'); const handleCancel = () => dispatch('cancel');
const handleConfirm = () => { const handleConfirm = () => {
let date = DateTime.fromISO(selectedDate); let date = DateTime.fromISO(selectedDate);
@@ -53,6 +66,21 @@
event.stopPropagation(); event.stopPropagation();
} }
}; };
let isDropdownOpen = false;
const openDropdown = () => {
isDropdownOpen = true;
};
const closeDropdown = () => {
isDropdownOpen = false;
};
const handleSelectTz = (item: ZoneOption) => {
selectedTimezone = item.offset;
closeDropdown();
};
</script> </script>
<div role="presentation" on:keydown={handleKeydown}> <div role="presentation" on:keydown={handleKeydown}>
<ConfirmDialogue <ConfirmDialogue
@@ -77,13 +105,26 @@
</div> </div>
<div class="flex flex-col w-full"> <div class="flex flex-col w-full">
<label for="timezone">Timezone</label> <label for="timezone">Timezone</label>
<div class="relative">
<input
class="immich-form-label text-sm mt-2 w-full text-black"
id="timezoneSearch"
type="text"
placeholder="Search timezone..."
bind:value={searchQuery}
on:input={updateSearchQuery}
on:focus={openDropdown}
/>
<Dropdown <Dropdown
selectedOption={initialOption} selectedOption={initialOption}
options={timezones} options={filteredTimezones}
render={(item) => (item ? `${item.zone} (${item.offset})` : '(not selected)')} render={(item) => (item ? `${item.zone} (${item.offset})` : '(not selected)')}
on:select={({ detail: item }) => handleSelect(item)} on:select={({ detail: item }) => handleSelectTz(item)}
controlable = {true}
bind:showMenu={isDropdownOpen}
/> />
</div> </div>
</div> </div>
</div>
</ConfirmDialogue> </ConfirmDialogue>
</div> </div>