Filterable Grid
Grid with column filters, quick filter, and backend-friendly filter exports.
This example uses ColumnDef.filterable and the grid.filter API.
Enable Filtering
import { Grid, type ColumnDef } from '@zengrid/core';import '@zengrid/core/dist/styles.css';
const columns: ColumnDef[] = [ { field: 'id', header: 'ID', width: 60 }, { field: 'name', header: 'Name', width: 200, filterable: true }, { field: 'email', header: 'Email', width: 260, filterable: true }, { field: 'role', header: 'Role', width: 150, filterable: true }, { field: 'status', header: 'Status', width: 120, filterable: true },];
const rows = [ [1, 'Alice Smith', 'alice@example.com', 'Admin', 'Active'], [2, 'Bob Jones', 'bob@example.com', 'Editor', 'Inactive'], [3, 'Charlie Brown', 'charlie@example.com', 'Viewer', 'Active'],];
const grid = new Grid(document.getElementById('grid')!, { columns, rowCount: rows.length, colCount: columns.length, rowHeight: 40, colWidth: columns.map((column) => column.width ?? 140),});
grid.setData(rows);grid.render();Column Filters
grid.filter.set(4, 'equals', 'Active');grid.filter.set(1, 'contains', 'Alice');
grid.filter.setColumn( 3, [ { operator: 'equals', value: 'Admin' }, { operator: 'equals', value: 'Editor' }, ], 'OR');
const activeFilters = grid.filter.getState();grid.filter.clearColumn(4);grid.filter.clear(); 💡 Tip
Common operators include equals, notEquals, contains, startsWith, endsWith, greaterThan, lessThan, blank, notBlank, in, and regex.
Quick Filter
grid.filter.setQuick('alice');grid.filter.setQuick('admin', [1, 3]);
const quick = grid.filter.getQuick();grid.filter.clearQuick();Filter Exports
grid.filter.getExports() returns backend-friendly formats when the active filter state can be projected.
grid.filter.set(4, 'equals', 'Active');grid.filter.set(1, 'contains', 'Smith');
const exports = grid.filter.getExports();
if (exports) { console.log('REST:', exports.rest); console.log('GraphQL:', exports.graphql); console.log('SQL:', exports.sql);} âš Warning
Always validate and parameterize filter input on the server before using exported filters in database queries.
Filter Events
grid.on('filter:change', ({ filterState, previousFilterState }) => { console.log('Previous:', previousFilterState); console.log('Current:', filterState);});
grid.on('filter:export', ({ rest, graphql, sql }) => { console.log(rest, graphql, sql);});Backend Filtering
const grid = new Grid(container, { columns, rowCount: 50000, colCount: columns.length, rowHeight: 40, colWidth: columns.map((column) => column.width ?? 140), dataMode: 'backend', onDataRequest: async (request) => { const response = await fetch('/api/users/query', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(request.query), signal: request.signal, });
return response.json(); },});