From 2c5fd0ea76d16743420e8cc6c380042227b837e5 Mon Sep 17 00:00:00 2001 From: Nick A Date: Thu, 3 Apr 2025 21:37:08 -0400 Subject: [PATCH] sorting and filter functionality --- .../FilterBox/{index.tsx => FilterBox.tsx} | 1 - compass/components/Table/ResourceTable.tsx | 3 + compass/components/Table/Table.tsx | 61 +++++++++++++++---- compass/components/Table/TableAction.tsx | 2 +- 4 files changed, 54 insertions(+), 13 deletions(-) rename compass/components/FilterBox/{index.tsx => FilterBox.tsx} (99%) diff --git a/compass/components/FilterBox/index.tsx b/compass/components/FilterBox/FilterBox.tsx similarity index 99% rename from compass/components/FilterBox/index.tsx rename to compass/components/FilterBox/FilterBox.tsx index be0e6fa..6e6fe6b 100644 --- a/compass/components/FilterBox/index.tsx +++ b/compass/components/FilterBox/FilterBox.tsx @@ -1,4 +1,3 @@ -// FilterBox.tsx import { useState } from "react"; import { ChevronDownIcon } from "@heroicons/react/24/solid"; import { ContainsDropdown } from "./ContainsDropdown"; diff --git a/compass/components/Table/ResourceTable.tsx b/compass/components/Table/ResourceTable.tsx index a1e6391..590b264 100644 --- a/compass/components/Table/ResourceTable.tsx +++ b/compass/components/Table/ResourceTable.tsx @@ -118,6 +118,9 @@ export default function ResourceTable({ ), + meta: { + filterVariant: "select", + } }), columnHelper.accessor("summary", { header: () => ( diff --git a/compass/components/Table/Table.tsx b/compass/components/Table/Table.tsx index 538e546..95b0047 100644 --- a/compass/components/Table/Table.tsx +++ b/compass/components/Table/Table.tsx @@ -5,17 +5,13 @@ import { getCoreRowModel, flexRender, createColumnHelper, + getFilteredRowModel, + ColumnFiltersState, + getSortedRowModel, + SortingState, } from "@tanstack/react-table"; -import { - ChangeEvent, - useState, - useEffect, - Key, - Dispatch, - SetStateAction, -} from "react"; +import { ChangeEvent, useState, Dispatch, SetStateAction } from "react"; import { TableAction } from "./TableAction"; -import { PlusIcon } from "@heroicons/react/24/solid"; import { rankItem } from "@tanstack/match-sorter-utils"; import { RowOptionMenu } from "./RowOptionMenu"; import DataPoint from "@/utils/models/DataPoint"; @@ -81,7 +77,8 @@ export default function Table({ createEndpoint, isAdmin = false, }: TableProps) { - console.log(data); + const [filters, setFilters] = useState([]); + const [sorting, setSorting] = useState([]); const columnHelper = createColumnHelper(); @@ -166,10 +163,16 @@ export default function Table({ }, state: { globalFilter: query, + columnFilters: filters, + sorting, }, onGlobalFilterChange: setQuery, globalFilterFn: fuzzyFilter, getCoreRowModel: getCoreRowModel(), + getFilteredRowModel: getFilteredRowModel(), + getSortedRowModel: getSortedRowModel(), + onColumnFiltersChange: setFilters, + onSortingChange: setSorting, }); return ( @@ -185,12 +188,24 @@ export default function Table({ {header.isPlaceholder ? null @@ -198,6 +213,14 @@ export default function Table({ header.column.columnDef.header, header.getContext() )} + {{ + asc: "🔼", + desc: "🔽", + }[header.column.getIsSorted() as string] ?? + null} + {header.column.getCanFilter() && ( + + )} ))} @@ -266,3 +289,19 @@ export default function Table({ ); } + +function Filter({ column }: { column: any }) { + return ( +
+ { + column.setFilterValue(e.target.value); + }} + placeholder="Search..." + className="border border-gray-300 rounded p-1" + /> +
+ ); +} diff --git a/compass/components/Table/TableAction.tsx b/compass/components/Table/TableAction.tsx index c8cecc9..ff9a77f 100644 --- a/compass/components/Table/TableAction.tsx +++ b/compass/components/Table/TableAction.tsx @@ -1,7 +1,7 @@ // TableAction.tsx import { MagnifyingGlassIcon } from "@heroicons/react/24/solid"; import { ChangeEventHandler, FunctionComponent, useRef, useState } from "react"; -import { FilterBox } from "../FilterBox"; +import { FilterBox } from "../FilterBox/FilterBox"; type TableActionProps = { query: string;