({
filterOptions,
filter,
urlKey,
}: {
filterOptions: AtLeastOne<FilterOption>;
filter: FilterData;
urlKey?: string;
})
| 15 | import InputDropdown from "~/components/InputDropdown"; |
| 16 | |
| 17 | const SelectFilter = ({ |
| 18 | filterOptions, |
| 19 | filter, |
| 20 | urlKey, |
| 21 | }: { |
| 22 | filterOptions: AtLeastOne<FilterOption>; |
| 23 | filter: FilterData; |
| 24 | urlKey?: string; |
| 25 | }) => { |
| 26 | const { updateFilter, removeFilter } = useFilters({ urlKey }); |
| 27 | |
| 28 | const filterOption = useMemo(() => { |
| 29 | return filterOptions.find( |
| 30 | (option) => option.field === filter.field && option.type === "select", |
| 31 | ) as SelectFilterOption | undefined; |
| 32 | }, [filter.field, filterOptions]); |
| 33 | |
| 34 | const selectedSelectFilterOption = useMemo(() => { |
| 35 | const selectOptions = filterOption?.options || []; |
| 36 | return selectOptions.find((option) => option.value === filter.value) || selectOptions[0]; |
| 37 | }, [filterOption, filter.value]); |
| 38 | |
| 39 | const onOptionUpdated = useCallback( |
| 40 | (option: SelectFilterSelectOption) => { |
| 41 | updateFilter({ ...filter, value: option.value }); |
| 42 | }, |
| 43 | [updateFilter, filter], |
| 44 | ); |
| 45 | |
| 46 | const valueIsEmpty = !filter.value; |
| 47 | |
| 48 | useEffect(() => { |
| 49 | if (valueIsEmpty && selectedSelectFilterOption) { |
| 50 | onOptionUpdated(selectedSelectFilterOption); |
| 51 | } |
| 52 | }, [valueIsEmpty, onOptionUpdated, selectedSelectFilterOption]); |
| 53 | |
| 54 | if (!filterOption?.options || !selectedSelectFilterOption) { |
| 55 | return null; |
| 56 | } |
| 57 | |
| 58 | return ( |
| 59 | <HStack> |
| 60 | <SelectFieldDropdown filterOptions={filterOptions} filter={filter} urlKey={urlKey} /> |
| 61 | <SelectComparatorDropdown filter={filter} filterType="select" urlKey={urlKey} /> |
| 62 | <InputDropdown |
| 63 | options={filterOption.options} |
| 64 | getDisplayLabel={(option) => option.label ?? option.value} |
| 65 | selectedOption={selectedSelectFilterOption} |
| 66 | onSelect={onOptionUpdated} |
| 67 | /> |
| 68 | <IconButton |
| 69 | aria-label="Remove Filter" |
| 70 | icon={<BsTrash />} |
| 71 | onClick={() => removeFilter(filter)} |
| 72 | /> |
| 73 | </HStack> |
| 74 | ); |
nothing calls this directly
no test coverage detected