UNPKG

@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
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, }; };