React Data GridFilter Component

Filter components allow you to add your own filter types to AG Grid. Use them when the Provided Filters do not meet your requirements.

React Custom Filter Components thumbnail

The example below shows two custom filters. The first is on the Athlete column and demonstrates a filter with "fuzzy" matching and the second is on the Year column with preset options.

Implementing a Filter Component

Custom filter components are controlled components, which receive a filter model as part of the props, and pass model updates back to the grid via the onModelChange callback. A filter model of null means that no filter is applied (the filter displays as inactive). Note that the filter is applied immediately when onModelChange is called.

To implement the filtering logic, a custom filter needs to implement the doesFilterPass callback, and provide it to the useGridFilter hook.

export default ({ model, onModelChange, getValue }) => {
   const doesFilterPass = useCallback(({ node }) => {
       // filtering logic
       return getValue(node).contains(model);
   }, [model]);

   // register filter callbacks with the grid
   useGridFilter({ doesFilterPass });

   return (
       <div>
           <input
               type="text"
               value={model || ''}
               onChange={({ target: { value }}) => onModelChange(value === '' ? null : value)}
           />
       </div>
   );
}

In previous versions of the grid, custom components were declared in an imperative way. See Migrating to Use reactiveCustomComponents for details on how to migrate to the current format.

Custom Filter Parameters

Filter Props

The following props are passed to the custom filter components (CustomFilterProps interface). If custom props are provided via the colDef.filterParams property, these will be additionally added to the props object, overriding items of the same name if a name clash exists.

model
TModel | null
The current filter model for the component.
onModelChange
Function
Callback that should be called every time the model in the component changes.
onUiChange
Function
Callback that can be optionally called every time the filter UI changes. The grid will respond with emitting a FilterModifiedEvent. Apart from emitting the event, the grid takes no further action.
column
The column this filter is for.
colDef
The column definition for the column.
rowModel
IRowModel
The row model, helpful for looking up data values if needed. If the filter needs to know which rows are a) in the table, b) currently visible (i.e. not already filtered), c) which groups, d) what order - all of this can be read from the rowModel.
getValue
Function
Get the cell value for the given row node and column, which can be the column ID, definition, or Column object. If no column is provided, the column this filter is on will be used.
doesRowPassOtherFilter
Function
A function callback, call with a node to be told whether the node passes all filters except the current filter. This is useful if you want to only present to the user values that this filter can filter given the status of the other filters. The set filter uses this to remove from the list, items that are no longer available due to the state of other filters (like Excel type filtering).
The grid api.
context
TContext
Application context as set on gridOptions.context.

Filter Callbacks

The following callbacks can be passed to the useGridFilter hook (CustomFilterCallbacks interface). The hook must be used for filters to work. The doesFilterPass callback is mandatory, but all others are optional.

Note that doesFilterPass is only called with the Client-Side Row Model. If being used exclusively with other row models, it can just return true as the filtering logic is performed on the server.

doesFilterPass
Function
The grid will ask each active filter, in turn, whether each row in the grid passes. If any filter fails, then the row will be excluded from the final set. The method is provided a params object with attributes node (the rodNode the grid creates that wraps the data) and data (the data object that you provided to the grid for that row). Note that this is only called for the Client-Side Row Model, and can just return true if being used exclusively with other row models.
onNewRowsLoaded
Function
Optional: Gets called when new rows are inserted into the grid. If the filter needs to change its state after rows are loaded, it can do it here. For example the set filters uses this to update the list of available values to select from (e.g. 'Ireland', 'UK' etc for Country filter). To get the list of available values from within this method from the Client Side Row Model, use gridApi.forEachLeafNode(callback).
onAnyFilterChanged
Function
Optional: Called whenever any filter is changed.
getModelAsString
Function
Optional: Used by AG Grid when rendering floating filters and there isn't a floating filter associated for this filter, this will happen if you create a custom filter and NOT a custom floating filter.
afterGuiAttached
Function
Optional: A hook to perform any necessary operation just after the GUI for this component has been rendered on the screen. If a parent popup is closed and reopened (e.g. for filters), this method is called each time the component is shown. This is useful for any logic that requires attachment before executing, such as putting focus on a particular DOM element.
afterGuiDetached
Function
Optional: A hook to perform any necessary operation just after the GUI for this component has been removed from the screen. If a parent popup is opened and closed (e.g. for filters), this method is called each time the component is hidden. This is useful for any logic to reset the UI state back to the model before the component is reopened.

Associating Floating Filter

If you create your own filter you have two options to get floating filters working for that filter:

  1. You can create your own Custom Floating Filter.
  2. You can implement the getModelAsString() method in your custom filter. If you implement this method and don't provide a custom floating filter, AG Grid will automatically provide a read-only version of a floating filter. See Custom Filter And Read-Only Floating Filter.

If you don't provide either of these two options for your custom filter, the display area for the floating filter will be empty.

Custom Filters Containing a Popup Element

Sometimes you will need to create custom components for your filters that also contain popup elements. This is the case for Date Filter as it pops up a Date Picker. If the library you use anchors the popup element outside of the parent filter, then when you click on it the grid will think you clicked outside of the filter and hence close the column menu.

There are two ways you can get fix this problem:

  • Add a mouse click listener to your floating element and set it to preventDefault(). This way, the click event will not bubble up to the grid. This is the best solution, but you can only do this if you are writing the component yourself.
  • Add the ag-custom-component-popup CSS class to your floating element. An example of this usage can be found here: Custom Date Component

Accessing the Component Instance

AG Grid allows you to get a reference to the filter instances via api.getColumnFilterInstance(colKey). This returns a wrapper component that matches the provided grid filter components that implement IFilter. To get the React custom filter component, the helper function getInstance can be used with this. As React components are created asynchronously, it is necessary to use a callback for both methods.

// let's assume a React component as follows
export default forwardRef((props, ref) => {
   useImperativeHandle(ref, () => {
       return {
           ... // required filter methods

           // put a custom method on the filter
           myMethod() {
               // does something
           }
       }
   });

   ... // rest of component
}

// later in your app, if you want to execute myMethod()...
laterOnInYourApplicationSomewhere() {
   // get reference to the AG Grid Filter component on name column
   api.getColumnFilterInstance('name').then(filterInstance => {
       getInstance(filterInstance, comp => if (comp != null) {
           comp.myMethod();
       });
   });
}

The example below illustrates how a custom filter component can be accessed and methods on it invoked: