Home/Filtering/Quick Filter
Filtering

Quick Filter

Add a single search box that filters every column at once — matching the text you see on screen. Type to narrow the rows; it works together with sorting and column filters.

Searching every column

One box, every column. Type Cairo, then Engineering, then $120,000 — all three match, because the search reads the text the cell renders.

Name
Department
City
Role
Salary
Hired
Amira Hassan
Engineering
Cairo
Lead
$42,000
Jan 2015
Omar Nabil
Design
Remote
Senior
$43,700
Feb 2016
Lena Rashid
Sales
London
Mid
$45,400
Mar 2017
Yusuf Zaki
Marketing
Tokyo
Junior
$47,100
Apr 2018
Nadia Farouk
Support
Austin
Manager
$48,800
May 2019
Karim Salem
Finance
Berlin
Lead
$50,500
Jun 2020
Sara Fahmy
Engineering
Cairo
Senior
$52,200
Jul 2021
Hana Khaled
Design
Remote
Mid
$53,900
Aug 2022
Tarek Aziz
Sales
London
Junior
$55,600
Sep 2023
Maya Mansour
Marketing
Tokyo
Manager
$57,300
Oct 2024
Amira Hassan
Support
Austin
Lead
$59,000
Nov 2015
Omar Nabil
Finance
Berlin
Senior
$60,700
Dec 2016
Lena Rashid
Engineering
Cairo
Mid
$62,400
Jan 2017
Yusuf Zaki
Design
Remote
Junior
$64,100
Feb 2018
Nadia Farouk
Sales
London
Manager
$65,800
Mar 2019
Karim Salem
Marketing
Tokyo
Lead
$67,500
Apr 2020
Sara Fahmy
Support
Austin
Senior
$69,200
May 2021
Hana Khaled
Finance
Berlin
Mid
$70,900
Jun 2022
Tarek Aziz
Engineering
Cairo
Junior
$72,600
Jul 2023
Maya Mansour
Design
Remote
Manager
$74,300
Aug 2024
Amira Hassan
Sales
London
Lead
$76,000
Sep 2015
Omar Nabil
Marketing
Tokyo
Senior
$77,700
Oct 2016
Lena Rashid
Support
Austin
Mid
$79,400
Nov 2017
Yusuf Zaki
Finance
Berlin
Junior
$81,100
Dec 2018
Nadia Farouk
Engineering
Cairo
Manager
$82,800
Jan 2019
Karim Salem
Design
Remote
Lead
$84,500
Feb 2020
All records loaded
60 / 60 records

Searching only some columns

The same rows, with the search restricted to Name and City. Cairo still matches. Engineering no longer does — the Department column is outside the search.

Name
Department
City
Role
Salary
Hired
Amira Hassan
Engineering
Cairo
Lead
$42,000
Jan 2015
Omar Nabil
Design
Remote
Senior
$43,700
Feb 2016
Lena Rashid
Sales
London
Mid
$45,400
Mar 2017
Yusuf Zaki
Marketing
Tokyo
Junior
$47,100
Apr 2018
Nadia Farouk
Support
Austin
Manager
$48,800
May 2019
Karim Salem
Finance
Berlin
Lead
$50,500
Jun 2020
Sara Fahmy
Engineering
Cairo
Senior
$52,200
Jul 2021
Hana Khaled
Design
Remote
Mid
$53,900
Aug 2022
Tarek Aziz
Sales
London
Junior
$55,600
Sep 2023
Maya Mansour
Marketing
Tokyo
Manager
$57,300
Oct 2024
Amira Hassan
Support
Austin
Lead
$59,000
Nov 2015
Omar Nabil
Finance
Berlin
Senior
$60,700
Dec 2016
Lena Rashid
Engineering
Cairo
Mid
$62,400
Jan 2017
Yusuf Zaki
Design
Remote
Junior
$64,100
Feb 2018
Nadia Farouk
Sales
London
Manager
$65,800
Mar 2019
Karim Salem
Marketing
Tokyo
Lead
$67,500
Apr 2020
Sara Fahmy
Support
Austin
Senior
$69,200
May 2021
Hana Khaled
Finance
Berlin
Mid
$70,900
Jun 2022
Tarek Aziz
Engineering
Cairo
Junior
$72,600
Jul 2023
Maya Mansour
Design
Remote
Manager
$74,300
Aug 2024
Amira Hassan
Sales
London
Lead
$76,000
Sep 2015
Omar Nabil
Marketing
Tokyo
Senior
$77,700
Oct 2016
Lena Rashid
Support
Austin
Mid
$79,400
Nov 2017
Yusuf Zaki
Finance
Berlin
Junior
$81,100
Dec 2018
Nadia Farouk
Engineering
Cairo
Manager
$82,800
Jan 2019
Karim Salem
Design
Remote
Lead
$84,500
Feb 2020
All records loaded
60 / 60 records

There is no quickFilter.columns option

The subset is the third argument of quickFilterPredicate, so it exists exactly where you call that predicate: inside a client-side data source, as above. Know the limits before you plan around it.

  • There is no quickFilter.columns config property. Narrowing is a call argument, not a setting on the grid.
  • filterApplyMode: 'client' does not take it either. In that mode the grid calls the predicate for you and searches every column — pass your own predicate from a data source when you need a subset.
  • A server-side source never runs the predicate at all. It receives params.quickFilter as plain text and decides for itself which columns the query searches.

Keep the two ends agreed. If your API searches three columns while the grid's box says it searches two, the difference surfaces as rows the user cannot explain.

Turn it on with one line

Set config.quickFilter: true to add a search box to the grid toolbar. Type in it and the grid keeps only the rows that match your text — across every column at once. No per-column setup, no options array.

readonly config: GridConfig<Person> = {
  quickFilter: true,
};

It searches what you see

The search matches the formatted, on-screen text — the same value shown in the cell. So searching $120,000 matches the Salary column even though the raw data is a number, and Jan 2021 matches the Hired column even though the raw value is an ISO date. Type several words and every word must appear somewhere in the row.

Works together with everything

Quick filter composes with the rest of the grid. This demo lets you sort any column and filter Department with its own column filter — the search box narrows the rows first, and sorting plus the column filter apply on top of what's left. Use all three together and they all stack.

Let the grid filter for you

By default the grid sends the search text (and any column filters) to your data source, which does the filtering. If your rows are already in memory, set filterApplyMode: 'client' and the grid filters them for you — return the full list from your source and drop the filtering code entirely. It mirrors sortMode: 'client'.

readonly config: GridConfig<Person> = {
  quickFilter: true,
  filterApplyMode: 'client',   // grid filters the loaded rows in memory
};

In this mode a row edited live so it no longer matches the search disappears on its own, and one edited to start matching appears — no refetch. Available with infinite scroll; paging, tree data, and lazily-loaded groups keep filtering on your data source instead.

Fine-tuning

Pass an object instead of true to adjust the box:

  • placeholder — the hint text inside the box. Default 'Search…'.
  • debounceMs — how long to wait after you stop typing before filtering. Default 250.
readonly config: GridConfig<Person> = {
  quickFilter: {
    placeholder: 'Search people…',
    debounceMs:  300,
  },
};

Client-side sources filter the loaded array with the quickFilterPredicate(text, columns) helper. Server-side sources receive the text as a plain string on params.quickFilter — forward it to your API and search the full dataset.

Quick filter API

PropertyTypeDefaultDescription
config.quickFilterboolean | QuickFilterConfigfalseEnable the toolbar search box. true for defaults, or an object to configure it.
quickFilter.placeholderstring'Search…'Placeholder text shown inside the search box.
quickFilter.debounceMsnumber250Delay after the last keystroke before the grid (re)filters or refetches.
config.filterApplyMode'client' | 'server''server'Where filtering runs. 'server' forwards filters to your data source. 'client' filters the loaded rows in memory (return the full set) and re-evaluates live edits automatically. Infinite scroll only — paging, tree data, and lazily-loaded groups fall back to server filtering. Mirrors sortMode.
params.quickFilterstring—The search text delivered to your data source — forward it to a server API.
quickFilterPredicate(text, columns, only?)(row: T) =&gt; boolean—Library helper — builds a row predicate that matches the formatted cell text for in-memory sources. only is a list of column keys to search; omit it for every column. Client-side callers only — there is no config equivalent.