UNPKG

@adaptabletools/adaptable

Version:

Powerful data-agnostic HTML5 AG Grid extension which provides advanced, cutting-edge functionality to meet all DataGrid requirements

207 lines (206 loc) 8.65 kB
import * as LayoutRedux from '../../Redux/ActionsReducers/LayoutRedux'; import * as ModuleConstants from '../../Utilities/Constants/ModuleConstants'; import ArrayExtensions, { areArraysEqual } from '../../Utilities/Extensions/ArrayExtensions'; import StringExtensions from '../../Utilities/Extensions/StringExtensions'; import { COLUMN_FILTER_WINDOW } from '../../View/Components/Popups/WindowPopups/windowFactory'; import { ApiBase } from '../Implementation/ApiBase'; export class ColumnFilterInternalApi extends ApiBase { /** * Returns Predicate Definition for given Column and Quick Filter shortcut * @param shortcut Quick Filter shortcut to lookup * @param column AdapTable Column being Filtered */ findPredicateDefByShortcut(shortcut, column) { return this.getColumnFilterApi() .getFilterPredicateDefsForColumn(column) .find((predicateDef) => this.getPredicateDefShortcuts(predicateDef)?.includes(shortcut)); } /** * Creates an Equality Filter based on given Grid Cells * @param gridCells cells to create Filter for */ createValuesColumnFilterForCells(gridCells) { if (!gridCells) { return null; } const filter = { ColumnId: gridCells[0].column.columnId, Predicates: [ { PredicateId: 'In', Inputs: [...new Set(gridCells.map((gc) => gc.displayValue))], }, ], }; const [savedFilter] = this.getColumnFilterApi().setColumnFilters([filter]) || [null]; return savedFilter; } /** * Creates an Equality Filter based on given Grid Cell * @param gridCell cell to create Filter for */ createEqualityColumnFilterForCell(gridCell) { if (!gridCell) { return null; } const column = gridCell.column; const filter = { ColumnId: column.columnId, Predicates: [ { PredicateId: this.getPredicateApi().internalApi.getEqualityPredicateForDataType(column.dataType), Inputs: [...new Set([gridCell.rawValue])], }, ], }; const [savedFilter] = this.getColumnFilterApi().setColumnFilters([filter]) || [null]; return savedFilter; } /** * Calls AdapTableQL to evaluate Filter for given Row * @param columnFilter Column Filter to use * @param node Row Node to evaluate */ evaluateColumnFilter(columnFilter, node) { if (!columnFilter.Predicates.length) { return true; } const someInputsAreEmpty = columnFilter.Predicates.some((predicate) => predicate.Inputs?.some((input) => { if (typeof input === 'string') { return StringExtensions.IsNullOrEmpty(input); } if (typeof input === 'number') { return isNaN(input); } return !input; })); if (someInputsAreEmpty) { return true; } const column = this.getColumnApi().getColumnWithColumnId(columnFilter.ColumnId); if (!column) { return true; } const gridCell = this.getGridApi().getGridCellFromRowNode(node, columnFilter.ColumnId); if (!gridCell) { return true; } let value = gridCell.normalisedValue; const predicateDefHandlerContext = { value: value, oldValue: null, displayValue: gridCell.displayValue, node, column, predicatesOperator: columnFilter.PredicatesOperator, ...this.getAdaptableInternalApi().buildBaseContext(), }; return this.getPredicateApi().handlePredicates(columnFilter.Predicates, predicateDefHandlerContext, true); } /** * Checks if the filter action should trigger Column Filtering * * @param action Filtering Action */ shouldNewColumnFilterTriggerColumnFiltering(action) { // trigger filter change only: // - new -> new filter is active // - clear -> previous filters was active // - clearAll -> a filter was active // - edit -> same => input change // - edit -> different & new is active // - edit -> different & old was active // - set -> new filter is active // filter -> suspend changes const isNewAndActive = action.type === LayoutRedux.LAYOUT_COLUMN_FILTER_ADD && this.getColumnFilterApi().isColumnFilterActive(action.columnFilter); const isClearAndPreviousWasActive = action.type === LayoutRedux.LAYOUT_COLUMN_FILTER_CLEAR && this.getColumnFilterApi().isColumnFilterActiveForColumn(action.columnId); const isClearAllAtLeastOneActiveFilter = action.type === LayoutRedux.LAYOUT_COLUMN_FILTER_CLEAR_ALL && this.getColumnFilterApi() .getColumnFilters() .some((columnFilter) => this.getColumnFilterApi().isColumnFilterActive(columnFilter)); let isEditTrigger = false; if (action.type === LayoutRedux.LAYOUT_COLUMN_FILTER_EDIT) { const newFilter = action.columnFilter; const previous = this.getColumnFilterApi().getColumnFilterForColumn(newFilter.ColumnId); // same filter edit, so always trigger if (previous && newFilter && // same predicates areArraysEqual(previous.Predicates.map((p) => p.PredicateId), newFilter.Predicates.map((p) => p.PredicateId))) { isEditTrigger = true; // new filter is active } else if (this.getColumnFilterApi().isColumnFilterActive(newFilter)) { isEditTrigger = true; } else if (this.getColumnFilterApi().isColumnFilterActive(previous)) { // previous filter was active isEditTrigger = true; } } const isSetAndActive = action.type === LayoutRedux.LAYOUT_COLUMN_FILTER_SET && this.getColumnFilterApi().isColumnFilterActive(action.columnFilter); const isSuspendChanged = [ LayoutRedux.LAYOUT_COLUMN_FILTER_SUSPEND, LayoutRedux.LAYOUT_COLUMN_FILTER_SUSPEND_ALL, LayoutRedux.LAYOUT_COLUMN_FILTER_UNSUSPEND, LayoutRedux.LAYOUT_COLUMN_FILTER_UNSUSPEND_ALL, ].includes(action.type); return (isNewAndActive || isClearAndPreviousWasActive || isClearAllAtLeastOneActiveFilter || isEditTrigger || isSetAndActive || isSuspendChanged); } /** * Compares to sets of Column Filters to see if they are identical * @param filters1 * @param filters2 */ areColumnFiltersDifferent(oldFilters, newFilters) { if (ArrayExtensions.IsNullOrEmpty(oldFilters) && ArrayExtensions.IsNullOrEmpty(newFilters)) { return false; } return ArrayExtensions.areArraysNotEqual(oldFilters, newFilters); } getPredicateDefShortcuts(predicateDef) { const shortcuts = this.getFilterOptions().columnFilterOptions.quickFilterWildcards; let predicateShortcuts = predicateDef.shortcuts; const predicateId = predicateDef.id; if (shortcuts?.[predicateId] && Array.isArray(shortcuts[predicateId])) { predicateShortcuts = shortcuts[predicateId]; } return predicateShortcuts; } showQuickFilterDropdown(columnId) { const hideQuickFilterDropdownFunction = this.getFilterOptions().columnFilterOptions.hideQuickFilterDropdown; if (hideQuickFilterDropdownFunction) { const column = this.getColumnApi().getColumnWithColumnId(columnId); const columnColumnContext = { column: column, ...this.getAdaptableInternalApi().buildBaseContext(), }; return !hideQuickFilterDropdownFunction(columnColumnContext); } return true; } openColumnFilterPopup(columnId, popupProps) { this.getAdaptableInternalApi().showPopupWindow({ id: COLUMN_FILTER_WINDOW, title: ModuleConstants.ColumnFilterFriendlyName, icon: 'filter', factoryId: COLUMN_FILTER_WINDOW, popupProps: { value: columnId, size: { width: 380, height: 450, }, ...popupProps, }, }); } }