diff --git a/packages/devextreme/js/__internal/grids/grid_core/data_controller/data_controller.ts b/packages/devextreme/js/__internal/grids/grid_core/data_controller/data_controller.ts index 3d1735dbfdba..e173d676b054 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/data_controller/data_controller.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/data_controller/data_controller.ts @@ -21,7 +21,7 @@ import errors from '@js/ui/widget/ui.errors'; import { findChanges } from '@ts/core/utils/m_array_compare'; import { fromPromise } from '@ts/core/utils/m_deferred'; import type { ChangingEvent, DataSource, StoreLoadOptions } from '@ts/data/data_source/types'; -import type { ColumnsChanges } from '@ts/grids/grid_core/columns_controller/types'; +import type { Column, ColumnsChanges } from '@ts/grids/grid_core/columns_controller/types'; import type DataSourceAdapter from '@ts/grids/grid_core/data_source_adapter/m_data_source_adapter'; import type { ChangedEvent, DataSourceAdapterProvider, LoadOperation, OperationTypes, RawItemData, @@ -30,10 +30,8 @@ import { isLocalStore } from '@ts/grids/grid_core/data_source_adapter/utils/stor import type { EditingController } from '@ts/grids/grid_core/editing/m_editing'; import type { EditorFactory } from '@ts/grids/grid_core/editor_factory/m_editor_factory'; import type { ErrorHandlingController } from '@ts/grids/grid_core/error_handling/m_error_handling'; -import type { ApplyFilterViewController } from '@ts/grids/grid_core/filter/m_filter_row'; import type { FilterSyncController } from '@ts/grids/grid_core/filter/m_filter_sync'; import type { FocusController } from '@ts/grids/grid_core/focus/m_focus'; -import type { HeaderFilterController } from '@ts/grids/grid_core/header_filter/m_header_filter'; import type { KeyboardNavigationController } from '@ts/grids/grid_core/keyboard_navigation/m_keyboard_navigation'; import modules from '@ts/grids/grid_core/m_modules'; import type { @@ -141,9 +139,7 @@ export class DataController extends DataHelperMixin(modules.Controller) { protected _filterSyncController!: FilterSyncController; - protected _headerFilterController!: HeaderFilterController; - - protected _applyFilterController!: ApplyFilterViewController; + private _filterExcludedColumn: Column | null = null; protected _keyboardNavigationController!: KeyboardNavigationController; @@ -168,10 +164,8 @@ export class DataController extends DataHelperMixin(modules.Controller) { this._editorFactoryController = this.getController('editorFactory'); this._errorHandlingController = this.getController('errorHandling'); this._filterSyncController = this.getController('filterSync'); - this._applyFilterController = this.getController('applyFilter'); this._keyboardNavigationController = this.getController('keyboardNavigation'); this._focusController = this.getController('focus'); - this._headerFilterController = this.getController('headerFilter'); this._selectionController = this.getController('selection'); this._stateStoringController = this.getController('stateStoring'); @@ -353,6 +347,22 @@ export class DataController extends DataHelperMixin(modules.Controller) { return this.combinedFilter(undefined, returnDataField); } + public getFilterExcludedColumn(): Column | null { + return this._filterExcludedColumn; + } + + public getCombinedFilterWithExcludedColumn( + excludedColumn: Column | null, + returnDataField?: boolean, + ): DataFilter { + this._filterExcludedColumn = excludedColumn; + try { + return this.getCombinedFilter(returnDataField); + } finally { + this._filterExcludedColumn = null; + } + } + private combinedFilter(filter: DataFilter, returnDataField?: boolean): DataFilter { if (!this._dataSource) { return filter; diff --git a/packages/devextreme/js/__internal/grids/grid_core/filter/m_filter_row.ts b/packages/devextreme/js/__internal/grids/grid_core/filter/m_filter_row.ts index b77cbc4ec3fd..64107ab183db 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/filter/m_filter_row.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/filter/m_filter_row.ts @@ -550,9 +550,7 @@ const columnHeadersView = (Base: ModuleType) => class ColumnH const dataSource = this._dataController.dataSource(); if (options.lookup && this.option('syncLookupFilterValues')) { - this._applyFilterViewController.setCurrentColumnForFiltering(options); - const filter = this._dataController.getCombinedFilter(); - this._applyFilterViewController.setCurrentColumnForFiltering(null); + const filter = this._dataController.getCombinedFilterWithExcludedColumn(options); const lookupDataSource = gridCoreUtils.getWrappedLookupDataSource(options, dataSource, filter); const lookupOptions = { @@ -766,7 +764,6 @@ const columnHeadersView = (Base: ModuleType) => class ColumnH const columns = this._columnsController.getVisibleColumns(); const dataSource = this._dataController.dataSource(); - const applyFilterViewController = this._applyFilterViewController; const rowIndex = this.element().find(`.${this.addWidgetPrefix(FILTER_ROW_CLASS)}`).index(); if (rowIndex === -1) { @@ -782,9 +779,7 @@ const columnHeadersView = (Base: ModuleType) => class ColumnH const editor = getEditorInstance($cell?.find('.dx-editor-container')); if (editor) { - applyFilterViewController.setCurrentColumnForFiltering(column); - const filter = this._dataController.getCombinedFilter() || null; - applyFilterViewController.setCurrentColumnForFiltering(null); + const filter = this._dataController.getCombinedFilterWithExcludedColumn(column) || null; const editorDataSource = editor.option('dataSource'); const shouldUpdateFilter = !filterChanged @@ -832,10 +827,10 @@ const data = (Base: ModuleType) => class DataControllerFilterRow const filters = [super._calculateAdditionalFilter()]; const columns = this._columnsController.getVisibleColumns(null, true); - const applyFilterController = this._applyFilterController; + const excludedColumn = this.getFilterExcludedColumn(); each(columns, function () { - const shouldSkip = applyFilterController.getCurrentColumnForFiltering()?.index === this.index; + const shouldSkip = excludedColumn?.index === this.index; if (this.allowFiltering && this.calculateFilterExpression && isDefined(this.filterValue) && !shouldSkip) { const filter = this.createFilterExpression(this.filterValue, this.selectedFilterOperation || this.defaultFilterOperation, 'filterRow'); filters.push(filter); @@ -849,8 +844,6 @@ const data = (Base: ModuleType) => class DataControllerFilterRow export class ApplyFilterViewController extends modules.ViewController { private _headerPanel: any; - private _currentColumn: any; - private _columnsController!: ColumnsController; public init() { @@ -901,14 +894,6 @@ export class ApplyFilterViewController extends modules.ViewController { this._getHeaderPanel().enableApplyButton(false); } } - - public setCurrentColumnForFiltering(column) { - this._currentColumn = column; - } - - public getCurrentColumnForFiltering() { - return this._currentColumn; - } } const columnsResizer = (Base: ModuleType) => class FilterRowColumnsResizerExtender extends Base { diff --git a/packages/devextreme/js/__internal/grids/grid_core/filter/m_filter_sync.ts b/packages/devextreme/js/__internal/grids/grid_core/filter/m_filter_sync.ts index b38fd2fbadbf..eaf3276aaf82 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/filter/m_filter_sync.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/filter/m_filter_sync.ts @@ -313,13 +313,11 @@ const data = (Base: ModuleType) => class DataControllerFilterSyn let filterValue = this.option('filterValue'); if (this.isFilterSyncActive()) { - const currentColumnForHeaderFilter = this._headerFilterController.getCurrentColumn(); - const currentColumnForFilterRow = this._applyFilterController.getCurrentColumnForFiltering(); - const currentColumn = currentColumnForHeaderFilter || currentColumnForFilterRow; - const needRemoveCurrentColumnFilter = currentColumnForHeaderFilter || isDefined(currentColumnForFilterRow?.filterValue); + const excludedColumn = this.getFilterExcludedColumn(); + const needRemoveCurrentColumnFilter = isDefined(excludedColumn); if (needRemoveCurrentColumnFilter && filterValue) { - filterValue = removeFieldConditionsFromFilter(filterValue, getColumnIdentifier(currentColumn)); + filterValue = removeFieldConditionsFromFilter(filterValue, getColumnIdentifier(excludedColumn)); } } const customOperations = this._filterSyncController.getCustomFilterOperations(); diff --git a/packages/devextreme/js/__internal/grids/grid_core/header_filter/m_header_filter.ts b/packages/devextreme/js/__internal/grids/grid_core/header_filter/m_header_filter.ts index 62084a795a05..81074f37c84e 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/header_filter/m_header_filter.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/header_filter/m_header_filter.ts @@ -124,8 +124,6 @@ export class HeaderFilterController extends Modules.ViewController { private _headerFilterView!: HeaderFilterView; - private _currentColumn: any; - public init() { this._columnsController = this.getController('columns'); this._dataController = this.getController('data'); @@ -253,9 +251,7 @@ export class HeaderFilterController extends Modules.ViewController { isLookup = true; if (this.option('syncLookupFilterValues')) { - this._currentColumn = column; - const filter = this._dataController.getCombinedFilter(); - this._currentColumn = null; + const filter = this._dataController.getCombinedFilterWithExcludedColumn(column); options.dataSource = gridCoreUtils.getWrappedLookupDataSource(column, dataSource, filter); } else { @@ -264,9 +260,7 @@ export class HeaderFilterController extends Modules.ViewController { } else { const cutoffLevel = Array.isArray(group) ? group.length - 1 : 0; - this._currentColumn = column; - const filter = this._dataController.getCombinedFilter(); - this._currentColumn = null; + const filter = this._dataController.getCombinedFilterWithExcludedColumn(column); options.dataSource = { filter, @@ -327,10 +321,6 @@ export class HeaderFilterController extends Modules.ViewController { return options.dataSource; } - public getCurrentColumn() { - return this._currentColumn; - } - public showHeaderFilterMenu(columnIndex, isGroupPanel) { const columnsController = this._columnsController; const column = extend(true, {}, this._columnsController.getColumns()[columnIndex]); @@ -516,13 +506,12 @@ const data = (Base: ModuleType) => class DataControllerFilterRow const that = this; const filters = [super._calculateAdditionalFilter()]; const columns = that._columnsController.getVisibleColumns(null, true); - const headerFilterController = this._headerFilterController; - const currentColumn = headerFilterController.getCurrentColumn(); + const excludedColumn = this.getFilterExcludedColumn(); each(columns, (_, column) => { let filter; - if (currentColumn && currentColumn.index === column.index) { + if (excludedColumn && excludedColumn.index === column.index) { return; } diff --git a/packages/devextreme/testing/helpers/gridBaseMocks.js b/packages/devextreme/testing/helpers/gridBaseMocks.js index 7479b2ed8e01..e7b67f35a179 100644 --- a/packages/devextreme/testing/helpers/gridBaseMocks.js +++ b/packages/devextreme/testing/helpers/gridBaseMocks.js @@ -236,6 +236,10 @@ module.exports = function($, gridCore, columnResizingReordering, domUtils, commo getCombinedFilter: commonUtils.noop, + getFilterExcludedColumn: commonUtils.noop, + + getCombinedFilterWithExcludedColumn: commonUtils.noop, + getRowIndexByKey: function(key) { return gridCore.getIndexByKey(key, options.items); }, diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.dataGrid/filterSync.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.dataGrid/filterSync.tests.js index e73cc9946799..72ad4f8c46d5 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.dataGrid/filterSync.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.dataGrid/filterSync.tests.js @@ -729,12 +729,8 @@ QUnit.module('getCombinedFilter', { filterValue: [['Test', 'anyof', [1, 2, 3]], 'and', filterRowFilter] }); - this.headerFilterController.getCurrentColumn = function() { - return { dataField: 'Test' }; - }; - // assert - assert.deepEqual(this.getCombinedFilter(true), undefined, 'combined filter'); + assert.deepEqual(this.dataController.getCombinedFilterWithExcludedColumn({ dataField: 'Test' }, true), undefined, 'combined filter'); }); QUnit.test('add currentColumn header filter value when filterSyncEnabled = false', function(assert) { @@ -749,12 +745,8 @@ QUnit.module('getCombinedFilter', { filterValue: [['Test', 'anyof', [1, 2, 3]], 'and', filterRowFilter] }); - this.headerFilterController.getCurrentColumn = function() { - return { dataField: 'Test' }; - }; - // assert - assert.deepEqual(this.getCombinedFilter(true), [ + assert.deepEqual(this.dataController.getCombinedFilterWithExcludedColumn({ dataField: 'Test' }, true), [ [ ['Test', '=', 1], 'or',