Skip to content

Commit a417878

Browse files
skuengneoSandro Küngneotrow
authored
Added option to hide header filter based on column meta, style header filter row and custom filter name mapping (#74)
Co-authored-by: Sandro Küng <sk@neolution.ch> Co-authored-by: Timothy Trowbridge <92933708+neotrow@users.noreply.github.com>
1 parent dea19ab commit a417878

4 files changed

Lines changed: 54 additions & 6 deletions

File tree

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Added
11+
12+
- option `hideHeaderFilters` added to the column meta to hide the header filter (needs to be set to true for all columns)
13+
- option `headerFilterStyle` added to the column meta to be able to style the header filter
14+
- option `customFilterName` added to the column meta to be able to use different mappings than the `accessor` of the column description
15+
1016
### Fixed
1117

1218
- `pkg.pr.new` workflow in order to prevent caching issues

src/lib/ReactDataTable/ReactDataTable.tsx

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { DndContext, KeyboardSensor, MouseSensor, TouchSensor, closestCenter, us
1313
import { restrictToVerticalAxis } from "@dnd-kit/modifiers";
1414
import { DraggableRow, InternalTableRow } from "./TableRows";
1515
import { SortableContext, verticalListSortingStrategy } from "@dnd-kit/sortable";
16+
import { getFilterValue, setFilterValue } from "../utils/customFilterMethods";
1617

1718
interface TableBodyProps<TData> {
1819
enableDragAndDrop: boolean;
@@ -158,7 +159,7 @@ const ReactDataTable = <TData, TFilter extends FilterModel = Record<string, neve
158159
</th>
159160
))}
160161
</tr>
161-
{!withoutHeaderFilters && (
162+
{!withoutHeaderFilters && !headerGroup.headers.every((x) => !!x.column.columnDef.meta?.hideHeaderFilters) && (
162163
<tr key={`${headerGroup.id}-col-filters`}>
163164
{headerGroup.headers.map((header) => {
164165
const {
@@ -168,7 +169,7 @@ const ReactDataTable = <TData, TFilter extends FilterModel = Record<string, neve
168169
} = header;
169170

170171
return (
171-
<th key={`${header.id}-col-filter`}>
172+
<th key={`${header.id}-col-filter`} style={header.column.columnDef.meta?.headerFilterStyle}>
172173
{header.index === 0 && (
173174
<>
174175
{onEnter && (
@@ -203,12 +204,16 @@ const ReactDataTable = <TData, TFilter extends FilterModel = Record<string, neve
203204
{header.column.getCanFilter() && (
204205
<>
205206
{meta?.customFilter ? (
206-
meta?.customFilter(header.column.getFilterValue(), header.column.setFilterValue)
207+
meta?.customFilter(getFilterValue(header.column, table), (value) =>
208+
setFilterValue(header.column, table, value),
209+
)
207210
) : meta?.dropdownFilter ? (
208211
<Input
209212
type="select"
210213
onChange={(e) => {
211-
header.column.setFilterValue(
214+
setFilterValue(
215+
header.column,
216+
table,
212217
// eslint-disable-next-line @typescript-eslint/no-explicit-any
213218
meta.dropdownFilter?.options[(e.target as any as HTMLSelectElement).selectedIndex]?.value ??
214219
e.target.value,
@@ -236,9 +241,9 @@ const ReactDataTable = <TData, TFilter extends FilterModel = Record<string, neve
236241
) : (
237242
<Input
238243
type="text"
239-
value={(header.column.getFilterValue() as string) ?? ""}
244+
value={(getFilterValue(header.column, table) as string) ?? ""}
240245
onChange={(e) => {
241-
header.column.setFilterValue(e.target.value);
246+
setFilterValue(header.column, table, e.target.value);
242247
if (!onEnter && manualPagination) {
243248
resetPageIndex(true);
244249
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { Column, Table } from "@tanstack/react-table";
2+
3+
const setFilterValue = <TData>(column: Column<TData, unknown>, table: Table<TData>, value: unknown) => {
4+
const customFilterName = column.columnDef.meta?.customFilterName;
5+
6+
if (customFilterName) {
7+
table.setColumnFilters((prev) => [...prev.filter((x) => x.id !== customFilterName), { id: customFilterName, value }]);
8+
} else {
9+
column.setFilterValue(value);
10+
}
11+
};
12+
13+
const getFilterValue = <TData>(column: Column<TData, unknown>, table: Table<TData>): unknown => {
14+
const customFilterName = column.columnDef.meta?.customFilterName;
15+
16+
if (customFilterName) {
17+
return table.getState().columnFilters.find((x) => x.id === customFilterName)?.value;
18+
}
19+
return column.getFilterValue();
20+
};
21+
22+
export { setFilterValue, getFilterValue };

src/react-table.d.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,21 @@ declare module "@tanstack/table-core" {
6262
* Prevents the column from being drawn
6363
*/
6464
isHidden?: boolean;
65+
66+
/**
67+
* Set to true to hide the header filters
68+
*/
69+
hideHeaderFilters?: boolean;
70+
71+
/**
72+
* Sets the header filter style
73+
*/
74+
headerFilterStyle?: CSSProperties;
75+
76+
/**
77+
* Custom filter name to use instead of the default used accessor name
78+
*/
79+
customFilterName?: string;
6580
}
6681

6782
interface RowSelectionOptions<TData extends RowData> {

0 commit comments

Comments
 (0)