The Advanced Filter allows for complex filter conditions to be entered across columns in a single type-ahead input, as well as within a hierarchical visual builder.
import { Component } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { AgGridAngular } from "ag-grid-angular";
import {
ClientSideRowModelModule,
ColDef,
ColGroupDef,
DataTypeDefinitions,
GridApi,
GridOptions,
GridReadyEvent,
ModuleRegistry,
TextFilterModule,
enableDevValidations,
} from "ag-grid-community";
import {
AdvancedFilterModule,
ColumnMenuModule,
ContextMenuModule,
} from "ag-grid-enterprise";
if (process.env.NODE_ENV !== "production") {
// Enable extended validations only for development
enableDevValidations();
}
ModuleRegistry.registerModules([
TextFilterModule,
AdvancedFilterModule,
ClientSideRowModelModule,
ColumnMenuModule,
ContextMenuModule,
]);
interface IOlympicDataTypes extends IOlympicData {
dateObject: Date;
hasGold: boolean;
dateTime: Date;
dateTimeString: string;
countryObject: {
name: string;
};
}
@Component({
selector: "my-app",
standalone: true,
imports: [AgGridAngular],
template: `<ag-grid-angular
style="width: 100%; height: 100%;"
[columnDefs]="columnDefs"
[defaultColDef]="defaultColDef"
[dataTypeDefinitions]="dataTypeDefinitions"
[enableAdvancedFilter]="true"
[rowData]="rowData"
(gridReady)="onGridReady($event)"
/> `,
})
export class AppComponent {
columnDefs: ColDef[] = [
{ field: "athlete" },
{ field: "age", minWidth: 100 },
{ field: "hasGold", minWidth: 100, headerName: "Gold" },
{ field: "dateObject", headerName: "Date" },
{ field: "date", headerName: "Date (String)" },
{
field: "dateTime",
headerName: "DateTime",
cellDataType: "dateTime",
minWidth: 250,
},
{ field: "dateTimeString", headerName: "DateTime (String)", minWidth: 250 },
{ field: "countryObject", headerName: "Country" },
];
defaultColDef: ColDef = {
flex: 1,
minWidth: 180,
filter: true,
};
dataTypeDefinitions: DataTypeDefinitions = {
object: {
baseDataType: "object",
extendsDataType: "object",
valueParser: (params) => ({ name: params.newValue }),
valueFormatter: (params) =>
params.value == null ? "" : params.value.name,
},
};
rowData!: IOlympicDataTypes[];
constructor(private http: HttpClient) {}
onGridReady(params: GridReadyEvent<IOlympicDataTypes>) {
this.http
.get<
IOlympicDataTypes[]
>("https://www.ag-grid.com/example-assets/olympic-winners.json")
.subscribe(
(data) =>
(this.rowData = data.map((rowData) => {
const dateParts = rowData.date.split("/");
const [year, month, day] = dateParts
.reverse()
.map((e) => parseInt(e, 10));
const [h, m, s] = [
Math.floor(window.agRandom() * 24),
Math.floor(window.agRandom() * 60),
Math.floor(window.agRandom() * 60),
];
const paddedDateTimeStrings = [month, day, h, m, s].map((e) =>
e.toString().padStart(2, "0"),
);
const dateString = `${year}-${paddedDateTimeStrings[0]}-${paddedDateTimeStrings[1]}`;
const dateTimeString = `${year}-${paddedDateTimeStrings[0]}-${paddedDateTimeStrings[1]}T${paddedDateTimeStrings.slice(2).join(":")}`;
return {
...rowData,
date: dateString,
dateObject: new Date(year, month - 1, day),
dateTimeString,
dateTime: new Date(year, month - 1, day, h, m, s),
countryObject: {
name: rowData.country,
},
hasGold: rowData.gold > 0,
};
})),
);
}
}
import '@angular/compiler';
import { provideHttpClient } from '@angular/common/http';
import { enableProdMode } from '@angular/core';
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app.component';
if (new URLSearchParams(window.location.search).get('prod') !== 'false') {
enableProdMode();
}
const app = bootstrapApplication(AppComponent, {
providers: [provideHttpClient()],
});
The Advanced Filter is enabled by setting the property enableAdvancedFilter = true. By default, the Advanced Filter is displayed between the column headers and the grid rows. It can instead be displayed outside of the grid by setting an Advanced Filter Parent. The buttons shown alongside the input can be customised.
<ag-grid-angular
[enableAdvancedFilter]="enableAdvancedFilter"
[defaultColDef]="defaultColDef"
/* other grid options ... */ />
this.enableAdvancedFilter = true;
this.defaultColDef = {
// Include all columns in the Advanced Filter
filter: true,
};Advanced Filter and Column Filters cannot be active at the same time. Enabling Advanced Filter will disable Column Filters.
Advanced Filter Input Copy Link
The example below demonstrates the Advanced Filter:
- Start typing
athleteinto the Advanced Filter input. As you type, the list of suggested column names will be filtered down. - Select the
Athleteentry by pressing ↵ Enter or ⇥ Tab, or using the mouse to click on the entry. - Select the
containsentry in a similar way. - After the quote, type
michaelfollowed by an end quote ("). - Press ↵ Enter or click the
Applybutton to execute the filter. - Try out each of the columns to see how the different Cell Data Types are handled.
- Complex filter expressions can be built up by using
ANDandORalong with brackets -(and).
import { Component } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { AgGridAngular } from "ag-grid-angular";
import {
ClientSideRowModelModule,
ColDef,
ColGroupDef,
DataTypeDefinitions,
GridApi,
GridOptions,
GridReadyEvent,
ModuleRegistry,
TextFilterModule,
enableDevValidations,
} from "ag-grid-community";
import {
AdvancedFilterModule,
ColumnMenuModule,
ContextMenuModule,
} from "ag-grid-enterprise";
if (process.env.NODE_ENV !== "production") {
// Enable extended validations only for development
enableDevValidations();
}
ModuleRegistry.registerModules([
TextFilterModule,
AdvancedFilterModule,
ClientSideRowModelModule,
ColumnMenuModule,
ContextMenuModule,
]);
interface IOlympicDataTypes extends IOlympicData {
dateObject: Date;
hasGold: boolean;
dateTime: Date;
dateTimeString: string;
countryObject: {
name: string;
};
}
@Component({
selector: "my-app",
standalone: true,
imports: [AgGridAngular],
template: `<ag-grid-angular
style="width: 100%; height: 100%;"
[columnDefs]="columnDefs"
[defaultColDef]="defaultColDef"
[dataTypeDefinitions]="dataTypeDefinitions"
[enableAdvancedFilter]="true"
[rowData]="rowData"
(gridReady)="onGridReady($event)"
/> `,
})
export class AppComponent {
columnDefs: ColDef[] = [
{ field: "athlete" },
{ field: "age", minWidth: 100 },
{ field: "hasGold", minWidth: 100, headerName: "Gold" },
{ field: "dateObject", headerName: "Date" },
{ field: "date", headerName: "Date (String)" },
{
field: "dateTime",
headerName: "DateTime",
cellDataType: "dateTime",
minWidth: 250,
},
{ field: "dateTimeString", headerName: "DateTime (String)", minWidth: 250 },
{ field: "countryObject", headerName: "Country" },
];
defaultColDef: ColDef = {
flex: 1,
minWidth: 180,
filter: true,
};
dataTypeDefinitions: DataTypeDefinitions = {
object: {
baseDataType: "object",
extendsDataType: "object",
valueParser: (params) => ({ name: params.newValue }),
valueFormatter: (params) =>
params.value == null ? "" : params.value.name,
},
};
rowData!: IOlympicDataTypes[];
constructor(private http: HttpClient) {}
onGridReady(params: GridReadyEvent<IOlympicDataTypes>) {
this.http
.get<
IOlympicDataTypes[]
>("https://www.ag-grid.com/example-assets/olympic-winners.json")
.subscribe(
(data) =>
(this.rowData = data.map((rowData) => {
const dateParts = rowData.date.split("/");
const [year, month, day] = dateParts
.reverse()
.map((e) => parseInt(e, 10));
const [h, m, s] = [
Math.floor(window.agRandom() * 24),
Math.floor(window.agRandom() * 60),
Math.floor(window.agRandom() * 60),
];
const paddedDateTimeStrings = [month, day, h, m, s].map((e) =>
e.toString().padStart(2, "0"),
);
const dateString = `${year}-${paddedDateTimeStrings[0]}-${paddedDateTimeStrings[1]}`;
const dateTimeString = `${year}-${paddedDateTimeStrings[0]}-${paddedDateTimeStrings[1]}T${paddedDateTimeStrings.slice(2).join(":")}`;
return {
...rowData,
date: dateString,
dateObject: new Date(year, month - 1, day),
dateTimeString,
dateTime: new Date(year, month - 1, day, h, m, s),
countryObject: {
name: rowData.country,
},
hasGold: rowData.gold > 0,
};
})),
);
}
}
import '@angular/compiler';
import { provideHttpClient } from '@angular/common/http';
import { enableProdMode } from '@angular/core';
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app.component';
if (new URLSearchParams(window.location.search).get('prod') !== 'false') {
enableProdMode();
}
const app = bootstrapApplication(AppComponent, {
providers: [provideHttpClient()],
});
Advanced Filter Builder Copy Link
As well as typing into the Advanced Filter input, Advanced Filters can also be set by using the Advanced Filter Builder. This displays a hierarchical view of the filter, and allows the different filter parts to be set using dropdowns and inputs. It also allows for filter conditions to be added, deleted and reordered.
The Advanced Filter Builder can be launched by clicking the Builder button next to the Advanced Filter input. It can also be shown and hidden via the API, and its options customised, as described in Advanced Filter Builder.
The following example demonstrates the Advanced Filter Builder:
- Click on any of the dropdown pills to change the join operators, columns and filter options.
- Click on the value pills to change the filter values.
- Use the drag handles to move the filter conditions or groups around.
- Use the add and remove buttons to create new conditions or delete existing ones.
- If the filter is valid (and does not match the already applied filter), click the
Applybutton to apply the filter.
import { Component } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { AgGridAngular } from "ag-grid-angular";
import {
AdvancedFilterModel,
ClientSideRowModelModule,
ColDef,
ColGroupDef,
FirstDataRenderedEvent,
GridApi,
GridOptions,
GridReadyEvent,
GridState,
GridStateModule,
ModuleRegistry,
NumberFilterModule,
TextFilterModule,
enableDevValidations,
} from "ag-grid-community";
import {
AdvancedFilterModule,
ColumnMenuModule,
ContextMenuModule,
} from "ag-grid-enterprise";
if (process.env.NODE_ENV !== "production") {
// Enable extended validations only for development
enableDevValidations();
}
ModuleRegistry.registerModules([
TextFilterModule,
NumberFilterModule,
GridStateModule,
AdvancedFilterModule,
ClientSideRowModelModule,
ColumnMenuModule,
ContextMenuModule,
]);
import { IOlympicData } from "./interfaces";
@Component({
selector: "my-app",
standalone: true,
imports: [AgGridAngular],
template: `<ag-grid-angular
style="width: 100%; height: 100%;"
[columnDefs]="columnDefs"
[defaultColDef]="defaultColDef"
[enableAdvancedFilter]="true"
[initialState]="initialState"
[rowData]="rowData"
(firstDataRendered)="onFirstDataRendered($event)"
(gridReady)="onGridReady($event)"
/> `,
})
export class AppComponent {
columnDefs: ColDef[] = [
{ field: "athlete" },
{ field: "country" },
{ field: "sport" },
{ field: "age", minWidth: 100 },
{ field: "gold", minWidth: 100 },
{ field: "silver", minWidth: 100 },
{ field: "bronze", minWidth: 100 },
];
defaultColDef: ColDef = {
flex: 1,
minWidth: 180,
filter: true,
};
initialState: GridState = {
filter: {
advancedFilterModel: initialAdvancedFilterModel,
},
};
rowData!: IOlympicData[];
constructor(private http: HttpClient) {}
onFirstDataRendered(params: FirstDataRenderedEvent) {
params.api.showAdvancedFilterBuilder();
}
onGridReady(params: GridReadyEvent<IOlympicData>) {
this.http
.get<
IOlympicData[]
>("https://www.ag-grid.com/example-assets/olympic-winners.json")
.subscribe((data) => (this.rowData = data));
}
}
const initialAdvancedFilterModel: AdvancedFilterModel = {
filterType: "join",
type: "AND",
conditions: [
{
filterType: "join",
type: "OR",
conditions: [
{
filterType: "number",
colId: "age",
type: "greaterThan",
filter: 23,
},
{
filterType: "text",
colId: "sport",
type: "endsWith",
filter: "ing",
},
],
},
{
filterType: "text",
colId: "country",
type: "contains",
filter: "united",
},
],
};
import '@angular/compiler';
import { provideHttpClient } from '@angular/common/http';
import { enableProdMode } from '@angular/core';
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app.component';
if (new URLSearchParams(window.location.search).get('prod') !== 'false') {
enableProdMode();
}
const app = bootstrapApplication(AppComponent, {
providers: [provideHttpClient()],
});
export interface IOlympicData {
athlete: string,
age: number,
country: string,
year: number,
date: string,
sport: string,
gold: number,
silver: number,
bronze: number,
total: number
} Next Steps Copy Link
- Columns & Filter Options - which columns appear, how they are named, the filter options each offers, and how each Cell Data Type is compared.
- Input & Builder - configuring the Advanced Filter, its parent element and the Advanced Filter Builder.
- Custom Filter Options - offering Custom Filter Options in the Advanced Filter.
- Filter Model / API - reading and setting the Advanced Filter Model.
- Server-Side Row Model - using the Advanced Filter with the Server-Side Row Model instead of the Client-Side Row Model.