@adaptabletools/adaptable
Version:
Powerful data-agnostic HTML5 AG Grid extension which provides advanced, cutting-edge functionality to meet all DataGrid requirements
67 lines (66 loc) • 3.2 kB
JavaScript
import * as React from 'react';
import { useMemo } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import * as LayoutRedux from '../../../Redux/ActionsReducers/LayoutRedux';
import { getCurrentLayoutSelector } from '../../../Redux/ActionsReducers/LayoutRedux';
import { mapColumnDataTypeToExpressionFunctionType } from '../../../Utilities/adaptableQlUtils';
import { useAdaptable } from '../../AdaptableContext';
import { mapAdaptablePredicateDefToQlPredicateDef, mapColumnFilterToQlPredicate, mapQlPredicateToAdaptablePredicate, } from './utils';
export const useAdaptableFilterWrapper = (columnId, handleOnChangeOverride) => {
const adaptable = useAdaptable();
const dispatch = useDispatch();
const columnType = adaptable.api.columnApi.getColumnDataTypeForColumnId(columnId);
const column = adaptable.api.columnApi.getColumnWithColumnId(columnId);
const columnFilterOptions = adaptable.api.optionsApi.getFilterOptions().columnFilterOptions;
const qlPredicateDefs = React.useMemo(() => {
const predicateDefs = adaptable.api.filterApi.columnFilterApi.getFilterPredicateDefsForColumn(column);
const qlDataType = mapColumnDataTypeToExpressionFunctionType(columnType);
return predicateDefs.map((predDef) => mapAdaptablePredicateDefToQlPredicateDef(predDef, qlDataType));
}, [columnId]);
const currentLayout = useSelector(getCurrentLayoutSelector);
const columnFilter = useMemo(() => {
return currentLayout?.ColumnFilters?.find((cf) => cf.ColumnId === columnId);
}, [currentLayout?.ColumnFilters, columnId]);
const qlPredicate = column
? mapColumnFilterToQlPredicate(columnFilter, column, qlPredicateDefs, columnFilterOptions)
: null;
const handleOnChange = (adaptablePredicate, logic = 'AND') => {
// make sure we always have the latest columnFiler
const columnFilter = adaptable.api.filterApi.columnFilterApi.getColumnFilterForColumn(columnId);
const newFilter = {
...columnFilter,
ColumnId: columnId,
Predicates: adaptablePredicate,
PredicatesOperator: logic,
};
if (handleOnChangeOverride) {
handleOnChangeOverride(newFilter);
}
else {
dispatch(columnFilter?.Uuid
? LayoutRedux.LayoutColumnFilterEdit(newFilter)
: LayoutRedux.LayoutColumnFilterAdd(newFilter));
}
};
const handleClear = React.useCallback(() => dispatch(LayoutRedux.LayoutColumnFilterClear(columnId)), [columnId]);
/**
* Converts a QlPredicate to an AdaptablePredicate and dispatches the change.
*/
const handlePredicateChange = React.useCallback((newPredicate) => {
if (!newPredicate) {
handleClear();
return;
}
const newAdaptablePredicates = newPredicate.args.map(mapQlPredicateToAdaptablePredicate);
handleOnChange(newAdaptablePredicates, newPredicate.operator);
}, [columnId]);
return {
qlPredicate,
qlPredicateDefs,
columnFilter,
handleClear,
handlePredicateChange,
handleOnChange,
column,
};
};