diff --git a/compass/components/Table/FilterDropdown.tsx b/compass/components/Table/FilterDropdown.tsx new file mode 100644 index 0000000..880a206 --- /dev/null +++ b/compass/components/Table/FilterDropdown.tsx @@ -0,0 +1,84 @@ +import DataPoint from "@/utils/models/DataPoint"; +import { Column } from "@tanstack/react-table"; +import { Details } from "../Drawer/Drawer"; +import { useEffect, useState } from "react"; +import TagsInput from "../TagsInput/Index"; + +export type FilterFn = "arrIncludesSome" | "arrIncludesAll"; + +interface FilterDropdownProps { + details: Details; + column: Column; + setFilterFn?: (field: string, filterFn: FilterFn) => void; +} + +export default function FilterDropdown({ + details, + column, + setFilterFn, +}: FilterDropdownProps) { + const filterState = useState( + details.inputType === "select-multiple" || + details.inputType === "select-one" + ? "arrIncludesSome" + : null + ); + const [filter] = filterState; + const { inputType, presetOptionsValues, presetOptionsSetter } = details; + + useEffect(() => { + if (filter && setFilterFn) { + setFilterFn(details.key, filter); + column.setFilterValue((prev: any) => prev); + } + }, [details.key, filter, setFilterFn, column]); + + switch (inputType) { + case "select-one": + return ( +
+ {})} + presetValue={[]} + onTagsChange={(tags) => { + const tagsArray = Array.from(tags); + column.setFilterValue(tagsArray); + }} + cellSelectedPreset={true} + /> +
+ ); + case "select-multiple": + return ( +
+ {})} + presetValue={[]} + onTagsChange={(tags) => { + const tagsArray = Array.from(tags); + column.setFilterValue(tagsArray); + }} + cellSelectedPreset={true} + filterState={filterState} + /> +
+ ); + default: + return ( +
+ Contains + { + column.setFilterValue(e.target.value); + }} + placeholder="Type a value…" + className="border border-gray-300 rounded p-1" + /> +
+ ); + } +}