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 5b58e6902297..71cd9a782397 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 @@ -956,15 +956,7 @@ export class DataController extends modules.Controller { const oldValue = oldRow.values[columnIndex]; const newValue = newRow.values[columnIndex]; - if (JSON.stringify(oldValue) !== JSON.stringify(newValue)) { - return true; - } - - const isCellModified = ( - row: ProcessedItem, - ): boolean => row.modifiedValues?.[columnIndex] !== undefined; - - return isCellModified(oldRow) !== isCellModified(newRow); + return JSON.stringify(oldValue) !== JSON.stringify(newValue); } /** diff --git a/packages/devextreme/js/__internal/grids/grid_core/editing/extenders/__tests__/editing_data_controller.row_changes.test.ts b/packages/devextreme/js/__internal/grids/grid_core/editing/extenders/__tests__/editing_data_controller.row_changes.test.ts index 77a44b18000c..50ca3a8b69fb 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/editing/extenders/__tests__/editing_data_controller.row_changes.test.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/editing/extenders/__tests__/editing_data_controller.row_changes.test.ts @@ -38,4 +38,14 @@ describe('Editing data controller row changes', () => { expect(change.changeTypes).toEqual(['update']); }, ); + + it('should report a cell whose modified mark appeared without a new value', async () => { + const change = await refreshRow( + dataRow(), + dataRow({ modified: true, modifiedValues: [undefined, 15] }), + ); + + expect(change.rowIndices).toEqual([0]); + expect(change.columnIndices).toEqual([[1]]); + }); }); diff --git a/packages/devextreme/js/__internal/grids/grid_core/editing/extenders/editing_data_controller.ts b/packages/devextreme/js/__internal/grids/grid_core/editing/extenders/editing_data_controller.ts index 999590624de4..8b8915a4171a 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/editing/extenders/editing_data_controller.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/editing/extenders/editing_data_controller.ts @@ -15,6 +15,7 @@ import gridCoreUtils from '@ts/grids/grid_core/m_utils'; import { EDITING_EDITROWKEY_OPTION_NAME } from '../const'; import type { EditingController } from '../m_editing'; +import { isCellModified } from '../m_editing_utils'; export interface EditingDataControllerExtension { _editingController: EditingController; @@ -147,6 +148,10 @@ export const editingDataControllerExtender = ( return true; } + if (isCellModified(oldRow, columnIndex) !== isCellModified(newRow, columnIndex)) { + return true; + } + return super._isCellChanged(oldRow, newRow, visibleRowIndex, columnIndex, isLiveUpdate); } diff --git a/packages/devextreme/js/__internal/grids/grid_core/editing/m_editing_utils.ts b/packages/devextreme/js/__internal/grids/grid_core/editing/m_editing_utils.ts index ddffd2ed0859..67632b7d5599 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/editing/m_editing_utils.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/editing/m_editing_utils.ts @@ -1,6 +1,8 @@ import Guid from '@js/core/guid'; import { isObject } from '@js/core/utils/type'; +import type { ProcessedItem } from '../data_controller/types'; + const NEW_ROW_TEMP_KEY_PREFIX = '_DX_KEY_'; const GUID_LENGTH = 36; @@ -80,3 +82,8 @@ export const forEachFormItems = (items, callBack) => { } }); }; + +export const isCellModified = ( + row: ProcessedItem, + columnIndex: number, +): boolean => row.modifiedValues?.[columnIndex] !== undefined;