mirror of
https://github.com/cssgunc/compass.git
synced 2025-04-28 05:49:49 -04:00
added filter dropdown
This commit is contained in:
parent
c21d12b408
commit
b83298ed04
84
compass/components/Table/FilterDropdown.tsx
Normal file
84
compass/components/Table/FilterDropdown.tsx
Normal file
|
@ -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<T extends DataPoint> {
|
||||||
|
details: Details;
|
||||||
|
column: Column<T, any>;
|
||||||
|
setFilterFn?: (field: string, filterFn: FilterFn) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function FilterDropdown<T extends DataPoint>({
|
||||||
|
details,
|
||||||
|
column,
|
||||||
|
setFilterFn,
|
||||||
|
}: FilterDropdownProps<T>) {
|
||||||
|
const filterState = useState<FilterFn | null>(
|
||||||
|
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 (
|
||||||
|
<div className="absolute -top-5 -left-1">
|
||||||
|
<TagsInput
|
||||||
|
presetOptions={presetOptionsValues ?? []}
|
||||||
|
setPresetOptions={presetOptionsSetter ?? (() => {})}
|
||||||
|
presetValue={[]}
|
||||||
|
onTagsChange={(tags) => {
|
||||||
|
const tagsArray = Array.from(tags);
|
||||||
|
column.setFilterValue(tagsArray);
|
||||||
|
}}
|
||||||
|
cellSelectedPreset={true}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
case "select-multiple":
|
||||||
|
return (
|
||||||
|
<div className="absolute -top-5 -left-1">
|
||||||
|
<TagsInput
|
||||||
|
presetOptions={presetOptionsValues ?? []}
|
||||||
|
setPresetOptions={presetOptionsSetter ?? (() => {})}
|
||||||
|
presetValue={[]}
|
||||||
|
onTagsChange={(tags) => {
|
||||||
|
const tagsArray = Array.from(tags);
|
||||||
|
column.setFilterValue(tagsArray);
|
||||||
|
}}
|
||||||
|
cellSelectedPreset={true}
|
||||||
|
filterState={filterState}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
default:
|
||||||
|
return (
|
||||||
|
<div className="flex flex-col px-4 py-2">
|
||||||
|
<span>Contains</span>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
value={(column.getFilterValue() ?? "") as string}
|
||||||
|
onChange={(e) => {
|
||||||
|
column.setFilterValue(e.target.value);
|
||||||
|
}}
|
||||||
|
placeholder="Type a value…"
|
||||||
|
className="border border-gray-300 rounded p-1"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user