@topgrid/grid-features
Column reorder, multi-sort, filter UI features · Free (MIT)
This page is auto-generated from TSDoc comments in the source code (internal markers scrubbed). For a curated getting-started summary, see the API Reference.
45 public exports — 6 functions · 3 hooks · 13 components · 23 types · 0 constants.
Components
DateFilter
Date range filter component.
Reuses FilterPopover + FilterIndicator to render from/to DatePickers.
Triggers TanStack Table filtering via column.setFilterValue.
DateFilter(__namedParameters: DateFilterProps<TData>): Element
Example
columnHelper.accessor('orderDate', {
filterFn: dateRangeFilterFn,
header: ({ column }) => (
<div>
주문일
<DateFilter column={column} />
</div>
),
});
DropIndicator
A blue vertical line indicator rendered at the drag drop position.
DropIndicator(__namedParameters: { … }): null | Element
FilterIndicator
Active filter indicator — a blue dot.
Passes the column.getIsFiltered result as the isFiltered prop.
Returns null when the filter is inactive (no DOM element).
FilterIndicator(__namedParameters: FilterIndicatorProps): null | Element
Example
<FilterIndicator isFiltered={column.getIsFiltered()} />
FilterPopover
Popover container for text filters.
Takes the trigger element via the trigger prop and renders the popover content as children. Manages open/close state internally (no external control needed).
FilterPopover(__namedParameters: FilterPopoverProps): Element
FilterResetButton
Component that resets all filters.
FilterResetButton(__namedParameters: FilterResetButtonProps<TData>): Element
GlobalSearchInput
All-row search input component (debounce 300ms).
GlobalSearchInput(__namedParameters: GlobalSearchInputProps<TData>): Element
NumberFilter
Number filter UI — a select of 7 operators + conditional input + clear button.
The main component composing FilterPopover + FilterIndicator ( reuse).
Connects to TanStack columnFilters via column.setFilterValue.
Debounce 300ms (Section 4.6).
between operator: conditionally renders two inputs, min/max (, Section 5.3).
NumberFilter(__namedParameters: NumberFilterProps<TData>): Element
Example
// Rendered in the columnDef header:
header: ({ column }) => (
<div className="flex items-center gap-1">
<span>가격</span>
<NumberFilter column={column} defaultOperator="=" />
</div>
),
filterFn: numberFilterFn,
NumberFloatingFilter
Number floating filter — one always-visible input. Operator fixed to = (exact match), and after a 300ms debounce
sets NumberFilterValue (empty value = cleared). Use on columns with filterFn: numberFilterFn.
NumberFloatingFilter(__namedParameters: { … }): Element
SelectFilter
Excel-style multi-select checkbox filter component.
SelectFilter(__namedParameters: SelectFilterProps<TData>): Element
SortBadge
Multi-sort priority badge — grid-core canonical source.
SortBadge(__namedParameters: SortBadgeProps): null | Element
SortClearButton
Button that clears the entire current sort state.
Used by wiring table.setSorting([]) to the onClear callback.
SortClearButton(__namedParameters: SortClearButtonProps): Element
Example
<SortClearButton onClear={() => table.setSorting([])} />
See — SortClearButtonProps
TextFilter
Text filter UI — operator select + value input + clear button.
The main component composing FilterPopover + FilterIndicator.
Connects to TanStack columnFilters via column.setFilterValue.
Debounce 300ms (Section 4.5).
TextFilter(__namedParameters: TextFilterProps<TData>): Element
Example
// Rendered in the columnDef header:
header: ({ column }) => (
<div className="flex items-center gap-1">
<span>이름</span>
<TextFilter column={column} defaultOperator="contains" />
</div>
),
filterFn: textFilterFn,
TextFloatingFilter
Text floating filter — one always-visible input. Operator fixed to contains (the operator of an existing value is preserved),
and after a 300ms debounce sets TextFilterValue (empty value = cleared). Use on columns with filterFn: textFilterFn.
TextFloatingFilter(__namedParameters: { … }): Element
Hooks
useColumnDrag
Column reorder hook based on the HTML5 Drag and Drop API.
useColumnDrag(props: UseColumnDragProps<TData>): UseColumnDragReturn
| Parameter | Type | Description |
|---|---|---|
props | UseColumnDragProps<TData> | UseColumnDragProps |
Returns — UseColumnDragReturn
useColumnOrderPersist
Hook that saves/restores column order to localStorage.
- Returns:
{ saveOrder }— called from handleColumnOrderChange inside useColumnDrag - On mount: localStorage.getItem → JSON.parse → table.setColumnOrder ( restore)
- Save method: call
saveOrder(order)→ localStorage.setItem - All localStorage access: the adapter does try/catch
- SSR guard: handled by the adapter
- QuotaExceededError: the adapter does console.warn + silent skip
useColumnOrderPersist(__namedParameters: UseColumnOrderPersistProps<TData>): { … }
useMultiSort
Helper for configuring multi-sort options when a consumer uses useReactTable directly.
useMultiSort(opts: UseMultiSortOptions): UseMultiSortResult
Example
const { enableMultiSort, isMultiSortEvent } = useMultiSort({ enableMultiSort: true });
const table = useReactTable({
data,
columns,
getCoreRowModel: getCoreRowModel(),
getSortedRowModel: getSortedRowModel(),
enableMultiSort,
isMultiSortEvent,
});
Functions
buildCellClassName
Compiles a declarative cell-rule array → grid-core CellClassNameCallback.
The predicate receives ctx.value (the value) and ctx.row (the row data) (grid-core 1.0 : clean ctx).
The join/undefined rules are the same as buildRowClassName. Pure function.
buildCellClassName(rules: CellFormatRule<TData, TValue>[]): CellClassNameCallback<TData>
Example
<Grid cellClassName={buildCellClassName<Order, number>([
{ when: (v) => v < 0, className: 'text-red-600' },
])} />
buildRowClassName
Compiles a declarative row-rule array → grid-core RowClassNameCallback.
Joins the className of every matching rule with a space, in rule order (multiple applications allowed).
0 matches → undefined (callback contract: no addition). Pure function — no side effects.
buildRowClassName(rules: RowFormatRule<TData>[]): RowClassNameCallback<TData>
Example
<Grid rowClassName={buildRowClassName([
{ when: (_, i) => i % 2 === 1, className: 'bg-gray-50' }, // alternating (stripes)
{ when: (d) => d.status === 'error', className: 'text-red-600' },
])} />
dateRangeFilterFn
dateRangeFilterFn(row: Row<unknown>, columnId: string, filterValue: any, addMeta: (