This section describes the Filter Conditions shared by the three Simple Filters provided by the
grid, Text Filter, Number Filter
and Date Filter.
Each Simple Filter follows the same layout. The filter consists of one or more Filter Conditions separated by zero or
more Join Operators.
The only layout difference is the type of input field presented to the user: a text field for Text Filters, a number
field for Number Filters, and a date picker field for Date Filters.
Each filter provides a dropdown list of filter options to select from. Each filter option represents a filtering
strategy, for example, ‘equals’, ‘not equals’, etc.
Each filter’s default filter options can be found on their respective pages:
Information on defining Custom Filter Options can be
found below.
Each filter option takes zero (a possibility with custom options), one (for most) or two (for ‘inRange’) values. The
value type depends on the filter type, for example, the Date Filter takes Date values.
By default, each filter initially only displays one Filter Condition. When the user completes all the visible Filter
Conditions, another Filter Condition becomes visible. When the user clears the last completed Filter Condition, any
empty Filter Conditions on either side are hidden if required. Additionally, when the filter is closed, any empty Filter
Conditions not at the end are removed if required.
The maximum number of Filter Conditions can be controlled by setting the Filter Parameter maxNumConditions
(the
default value is 2).
It is also possible to always display a certain number of Filter Conditions by setting the Filter
Parameter numAlwaysVisibleConditions
. In this case, Filter Conditions at the end will be disabled until the previous
Filter Condition has been completed.
maxNumConditions
(number, default: 2) Maximum number of conditions allowed in the filter.numAlwaysVisibleConditions
(number, default: 1) By default only one condition is shown, and additional conditionsmaxNumConditions
). To have more conditions shown bymaxNumConditions
- anything larger will be ignored.The Join Operator decides how the Filter Conditions are joined, using either AND
or OR
. All Join Operators have the
same value, with only the first one being editable when there are multiple.
The following example demonstrates Filter Condition configuration that can be applied to any Simple Filter.
filterOptions
set to show a different list of available options,defaultOption
set to change the default option selected.maxNumConditions
set to 10
so that up to ten conditions can benumAlwaysVisibleConditions
set to 2
so that two conditions are always shown.defaultJoinOperator
is also set to 'OR'
rather than the default ('AND'
).maxNumConditions
set to 1
, so that only the first condition is shown.For applications that have bespoke filtering requirements, it is also possible to add new custom filtering options to
the number, text and date filters. For example, a ‘Not Equal (with Nulls)’ filter option could be included alongside the
built-in ‘Not Equal’ option.
Custom filter options are supplied to the grid via filterParams.filterOptions
and must define the following
properties:
displayKey
(string) A unique key that does not clash with the built-in filter keys.displayName
(string) Display name for the filter. Can be replaced by a locale-specific value usinglocaleTextFunc
.predicate
(function) Custom filter logic that returns a boolean based on the filterValues
and cellValue
.numberOfInputs
(0 | 1 | 2) Number of inputs to display for this option. Defaults to 1
if unspecified.The displayKey
should contain a unique key value that doesn’t clash with the built-in filter keys. A default
displayName
should also be provided but can be replaced by a locale-specific value using
a getLocaleText.
The custom filter logic is implemented through the predicate
function, which receives the filterValues
typed by the
user along with the cellValue
from the grid, and returns True
or False
.
The number of filterValues
and corresponding inputs is controlled by the optional property numberOfInputs
:
0
, all inputs are hidden, and an empty array of filterValues
is provided to the predicate
function.1
, a single input is displayed, and one-element array of filterValues
are provided to thepredicate
function.2
, two inputs are displayed, and a two-element array of filterValues
is provided to the predicate
Custom FilterOptions
can be supplied alongside the built-in filter option string
keys as shown below:
columnDefs: [
{
"field": 'age',
"filter": 'agNumberColumnFilter',
"filterParams": {
"filterOptions": [
'lessThan', # built-in filter option
{
"displayKey": 'lessThanWithNulls',
"displayName": 'Less Than with Nulls',
# See below to define the "predicate" functions
"predicate": "lessThanWithNullsFilter",
},
'greaterThan',
{
"displayKey": 'greaterThanWithNulls',
"displayName": 'Greater Than with Nulls',
"predicate": "greaterThanWithNullsFilter",
},
{
"displayKey": 'betweenExclusive',
"displayName": 'Between (Exclusive)',
"predicate": "betweenExclusiveFilter",
"numberOfInputs": 2,
}
]
}
}
]
Using the following JavaScript functions for the predicate
parameters. These JavaScript functions must be added to
the dashAgGridFunctions.js
file in the assets folder.
See JavaScript Functions
for more information.
var dagfuncs = (window.dashAgGridFunctions = window.dashAgGridFunctions || {});
dagfuncs.lessThanWithNullsFilter = ([filterValue], cellValue) => cellValue == null || cellValue < filterValue;
dagfuncs.greaterThanWithNullsFilter = ([filterValue], cellValue) => cellValue == null || cellValue > filterValue;
dagfuncs.betweenExclusiveFilter = ([fv1, fv2], cellValue) => cellValue == null || fv1 < cellValue && fv2 > cellValue;
The following example demonstrates several custom filter options:
The Athlete column has the contains
built-in filter and four custom filter options managed by
a Text Filter:
Starts with "A"
and Starts with "N"
have no inputs; their predicate function is provided zero values.Regular Expression
has one input; its predicate function is provided one value. Try ^n.*n$
as Filter Value toBetween (Exclusive)
(case-insensitive) has two inputs; its predicate function is provided two values.The Age column has the Choose one
built-in filter (inactive filter option) and five custom filter options managed
by a Number Filter:
Even Numbers
, Odd Numbers
and Blanks
have no inputs; their predicate function is provided zero values.Age 5 Years Ago
has one input; its predicate function is provided one value.Between (Exclusive)
has two inputs; its predicate function is provided two values.Moreover, the maxNumConditions=1
option is used to only display one Filter Condition.
The Date column has the equals
built-in filter and three custom filter options managed by
a Date Filter:
Equals (with Nulls)
has one inputs; its predicate function is provided one value.Leap Year
has no inputs; its predicate function is provided zero values.Between (Exclusive)
has two inputs; its predicate function is provided two values.NOTE: a custom comparator
is still required for the built-in date filter options, for example equals
.
The Country column has the notEqual
built-in filter and one custom filter option:
Not Equals without Nulls
filter which also removes null values.It also demonstrates how localisation can be achieved via the gridOptions.getLocaleText(params)
function, where the
default displayName Does not equal
is replaced by ! Not Equals !
for the built-in filter option notEqual
.
View the JavaScript functions used for this example
These JavaScript functions must be added to the dashAgGridFunctions.js
file in the assets folder.
See JavaScript Functions
for more information.
var dagfuncs = (window.dashAgGridFunctions = window.dashAgGridFunctions || {});
// Custom filters
// athlete
dagfuncs.startsAFilter = (_, cellValue) => cellValue != null && cellValue.indexOf('A') === 0;
dagfuncs.startsNFilter = (_, cellValue) => cellValue != null && cellValue.indexOf('N') === 0;
dagfuncs.regExpFilter = ([filterValues], cellValue) => cellValue == null || new RegExp(filterValues, 'gi').test(cellValue);
dagfuncs.betweenExclusiveTextFilter = ([fv1, fv2], cellValue) => {
return cellValue == null || (fv1.toLowerCase() < cellValue.toLowerCase() && fv2.toLowerCase() > cellValue.toLowerCase())
};
// age
dagfuncs.evenNumbersFilter = (_, cellValue) => cellValue != null && cellValue % 2 === 0;
dagfuncs.oddNumbersFilter = (_, cellValue) => cellValue != null && cellValue % 2 !== 0;
dagfuncs.blanksFilter = (_, cellValue) => cellValue == null;
dagfuncs.age5YearsAgoFilter = ([fv1], cellValue) => cellValue == null || cellValue - 5 === fv1;
dagfuncs.betweenExclusiveNumberFilter = ([fv1, fv2], cellValue) => cellValue == null || (fv1 < cellValue && fv2 > cellValue);
// date
dagfuncs.equalsWithNullsFilter = ([filterValue], cellValue) => {
if (cellValue == null) return true;
const parts = cellValue.split('/');
const cellDate = new Date(
Number(parts[2]),
Number(parts[1] - 1),
Number(parts[0])
);
return cellDate.getTime() === filterValue.getTime();
};
dagfuncs.leapYearFilter = (_, cellValue) => {
if (cellValue == null) return true;
const year = Number(cellValue.split('/')[2]);
return year % 4 === 0 && year % 200 !== 0;
};
dagfuncs.betweenExclusiveDateFilter = ([fv1, fv2], cellValue) => {
if (cellValue == null) return true;
const parts = cellValue.split('/');
const cellDate = new Date(
Number(parts[2]),
Number(parts[1] - 1),
Number(parts[0])
);
return (
cellDate.getTime() > fv1.getTime() && cellDate.getTime() < fv2.getTime()
);
};
dagfuncs.dateComparator = (filterLocalDateAtMidnight, cellValue) => {
const dateAsString = cellValue;
if (dateAsString == null) return -1;
const dateParts = dateAsString.split('/');
const cellDate = new Date(
Number(dateParts[2]),
Number(dateParts[1]) - 1,
Number(dateParts[0])
);
if (filterLocalDateAtMidnight.getTime() === cellDate.getTime()) {
return 0;
}
if (cellDate < filterLocalDateAtMidnight) {
return -1;
}
if (cellDate > filterLocalDateAtMidnight) {
return 1;
}
return 0;
};
// country
dagfuncs.notEqualNoNullsFilter = ([filterValue], cellValue) => {
if (cellValue == null) return false;
return cellValue.toLowerCase() !== filterValue.toLowerCase();
};
Filter placeholder text can be customised on a per-column basis using filterParams.filterPlaceholder
in the Column
Definition. The placeholder can be either a string or a function as shown in the snippet below:
columnDefs: [
{
"field": 'age',
"filter": 'agNumberColumnFilter',
"filterParams": {
"filterPlaceholder": 'Age...'
}
},
{
"field": 'total',
"filter": 'agNumberColumnFilter',
"filterParams": {
"filterPlaceholder": {"function": "`${params.filterOptionKey} ${params.placeholder}`"}
}
}
]
When filterPlaceholder
is a function, the parameters are made up of the following:
filterOptionKey
The filter option key.filterOption
The filter option name as localised text.placeholder
The default placeholder text.The following example shows the various ways of specifying filter placeholders. Click on the filter menu for the
different columns in the header row to see the following:
Filter...
with no configurationCountry...
for all filter optionsDoes not contain
notContains - Filter...
.total
. For example, for the Does not equal
filterDoes not equal total
.