MCPcopy Create free account
hub / github.com/OpenPipe/OpenPipe / SelectFilter

Function SelectFilter

app/src/components/Filters/Filter/SelectFilter.tsx:17–75  ·  view source on GitHub ↗
({
  filterOptions,
  filter,
  urlKey,
}: {
  filterOptions: AtLeastOne<FilterOption>;
  filter: FilterData;
  urlKey?: string;
})

Source from the content-addressed store, hash-verified

15import InputDropdown from "~/components/InputDropdown";
16
17const 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 );

Callers

nothing calls this directly

Calls 3

useFiltersFunction · 0.90
removeFilterFunction · 0.85
updateFilterFunction · 0.50

Tested by

no test coverage detected