Filter Plugin

Use ZenGrid filtering through the public grid.filter API.

The filter plugin is installed automatically by Grid. Application code should use grid.filter.

Public API

filter-api.ts
grid.filter.set(1, 'contains', 'Alice');
grid.filter.setColumn(
2,
[
{ operator: 'greaterThan', value: 18 },
{ operator: 'lessThan', value: 65 },
],
'AND'
);
grid.filter.setQuick('engineering');
grid.filter.clearColumn(1);
grid.filter.clearQuick();
grid.filter.clear();
const state = grid.filter.getState();
const quick = grid.filter.getQuick();
const exports = grid.filter.getExports();

Column Setup

columns.ts
import type { ColumnDef } from '@zengrid/core';
const columns: ColumnDef[] = [
{ field: 'name', header: 'Name', width: 220, filterable: true },
{ field: 'department', header: 'Department', width: 180, filterable: true },
{ field: 'status', header: 'Status', width: 140, filterable: true },
];

Events

filter-events.ts
grid.on('filter:change', ({ filterState, previousFilterState }) => {
console.log({ filterState, previousFilterState });
});
grid.on('filter:export', ({ rest, graphql, sql }) => {
console.log(rest, graphql, sql);
});

Backend Mode

When dataMode: 'backend', filter state is delegated through onDataRequest.

backend-filter.ts
const grid = new Grid(container, {
columns,
rowCount: 100000,
colCount: columns.length,
rowHeight: 36,
colWidth: columns.map((column) => column.width ?? 140),
dataMode: 'backend',
onDataRequest: async (request) => {
const response = await fetch('/api/search', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(request.query),
signal: request.signal,
});
return response.json();
},
});
Warning

Validate filter input on the server. Client-side filter exports are a transport format, not a security boundary.