From 3c1a8b254fb6c104e63f835a8c64b7b8055f5a10 Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Fri, 10 Jul 2026 11:59:31 +0600 Subject: [PATCH 1/5] fix --- .../m_keyboard_navigation.ts | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/m_keyboard_navigation.ts b/packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/m_keyboard_navigation.ts index d6cab6e22ac0..b423c7f62225 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/m_keyboard_navigation.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/m_keyboard_navigation.ts @@ -29,6 +29,7 @@ import type { AdaptiveColumnsController } from '@ts/grids/grid_core/adaptivity/m import type { Column } from '@ts/grids/grid_core/columns_controller/types'; import type { DataController } from '@ts/grids/grid_core/data_controller/m_data_controller'; import type { EditingController } from '@ts/grids/grid_core/editing/m_editing'; +import type { NormalizedEditCellOptions } from '@ts/grids/grid_core/editing/types'; import type { RowsView } from '@ts/grids/grid_core/views/m_rows_view'; import { memoize } from '@ts/utils/memoize'; @@ -3080,12 +3081,25 @@ const editing = (Base: ModuleType) => class EditingController return false; } - const isCellEditing = super.editCell(rowIndex, columnIndex); - if (isCellEditing) { + return super.editCell(rowIndex, columnIndex); + } + + protected _prepareEditCell(parameters: NormalizedEditCellOptions): boolean { + const isPrepared = super._prepareEditCell(parameters); + + if (isPrepared) { + this._keyboardNavigationController.setCellFocusType(); this._keyboardNavigationController.setupFocusedView(); + + const rowIndexOffset = this._dataController.getRowIndexOffset(); + const columnIndexOffset = this._columnsController.getColumnIndexOffset(); + const globalRowIndex = parameters.rowIndex + rowIndexOffset; + const globalColumnIndex = parameters.columnIndex + columnIndexOffset; + + this._keyboardNavigationController.setFocusedCellPosition(globalRowIndex, globalColumnIndex); } - return isCellEditing; + return isPrepared; } public editRow(rowIndex) { From 17eda1e188f94bad53fde77b202ebdc001c48d61 Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Fri, 10 Jul 2026 14:40:15 +0600 Subject: [PATCH 2/5] refix --- .../m_keyboard_navigation.ts | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/m_keyboard_navigation.ts b/packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/m_keyboard_navigation.ts index b423c7f62225..91f518d750c9 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/m_keyboard_navigation.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/m_keyboard_navigation.ts @@ -3081,25 +3081,14 @@ const editing = (Base: ModuleType) => class EditingController return false; } - return super.editCell(rowIndex, columnIndex); - } - - protected _prepareEditCell(parameters: NormalizedEditCellOptions): boolean { - const isPrepared = super._prepareEditCell(parameters); + const isCellEditing = super.editCell(rowIndex, columnIndex); - if (isPrepared) { - this._keyboardNavigationController.setCellFocusType(); + if (isCellEditing) { this._keyboardNavigationController.setupFocusedView(); - - const rowIndexOffset = this._dataController.getRowIndexOffset(); - const columnIndexOffset = this._columnsController.getColumnIndexOffset(); - const globalRowIndex = parameters.rowIndex + rowIndexOffset; - const globalColumnIndex = parameters.columnIndex + columnIndexOffset; - - this._keyboardNavigationController.setFocusedCellPosition(globalRowIndex, globalColumnIndex); + this._keyboardNavigationController.setCellFocusType(); } - return isPrepared; + return isCellEditing; } public editRow(rowIndex) { From 8c0fcfc6c4628f2ee2a5a2305b5387820dd34f80 Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Fri, 10 Jul 2026 20:51:23 +0600 Subject: [PATCH 3/5] test --- .../tests/dataGrid/common/focus/focus.ts | 35 +++++++++++++++++++ .../m_keyboard_navigation.ts | 1 - 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/e2e/testcafe-devextreme/tests/dataGrid/common/focus/focus.ts b/e2e/testcafe-devextreme/tests/dataGrid/common/focus/focus.ts index 4b30c707b9eb..40328f077266 100644 --- a/e2e/testcafe-devextreme/tests/dataGrid/common/focus/focus.ts +++ b/e2e/testcafe-devextreme/tests/dataGrid/common/focus/focus.ts @@ -1,6 +1,7 @@ import DataGrid from 'devextreme-testcafe-models/dataGrid'; import { ClientFunction } from 'testcafe'; import TextBox from 'devextreme-testcafe-models/textBox'; +import { GridsEditMode } from 'devextreme/artifacts/npm/devextreme/common/grids'; import { createWidget } from '../../../../helpers/createWidget'; import url from '../../../../helpers/getPageUrl'; @@ -376,3 +377,37 @@ test('Focus method should focus the first data row when focusedRowEnabled = true }, ], })); + +(['batch', 'cell'] as GridsEditMode[]).forEach((editMode) => { + // T1331376 + test(`Tab should focus the next cell after editing a cell by API when focusedRowEnabled (editing.mode=${editMode})`, async (t) => { + const dataGrid = new DataGrid(GRID_SELECTOR); + await t.expect(dataGrid.isReady()).ok(); + + await dataGrid.apiEditCell(0, 0); + + await t + .expect(dataGrid.getDataCell(0, 0).getEditor().element.focused) + .ok(); + + await t.pressKey('tab'); + + await t + .expect(dataGrid.getDataCell(0, 1).isEditCell) + .ok() + .expect(dataGrid.getDataCell(0, 1).getEditor().element.focused) + .ok(); + }).before(async () => createWidget('dxDataGrid', { + dataSource: [ + { ID: 1, FirstName: 'John', LastName: 'Heart' }, + { ID: 2, FirstName: 'Olivia', LastName: 'Peyton' }, + ], + keyExpr: 'ID', + focusedRowEnabled: true, + editing: { + mode: editMode, + allowUpdating: true, + }, + columns: ['FirstName', 'LastName'], + })); +}); diff --git a/packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/m_keyboard_navigation.ts b/packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/m_keyboard_navigation.ts index 91f518d750c9..7d82f97064db 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/m_keyboard_navigation.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/m_keyboard_navigation.ts @@ -29,7 +29,6 @@ import type { AdaptiveColumnsController } from '@ts/grids/grid_core/adaptivity/m import type { Column } from '@ts/grids/grid_core/columns_controller/types'; import type { DataController } from '@ts/grids/grid_core/data_controller/m_data_controller'; import type { EditingController } from '@ts/grids/grid_core/editing/m_editing'; -import type { NormalizedEditCellOptions } from '@ts/grids/grid_core/editing/types'; import type { RowsView } from '@ts/grids/grid_core/views/m_rows_view'; import { memoize } from '@ts/utils/memoize'; From 9c09c2a547d4509000ed25fb10be993378fa07cf Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Fri, 10 Jul 2026 21:01:49 +0600 Subject: [PATCH 4/5] update import --- e2e/testcafe-devextreme/tests/dataGrid/common/focus/focus.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/e2e/testcafe-devextreme/tests/dataGrid/common/focus/focus.ts b/e2e/testcafe-devextreme/tests/dataGrid/common/focus/focus.ts index 40328f077266..95dab71ee5d7 100644 --- a/e2e/testcafe-devextreme/tests/dataGrid/common/focus/focus.ts +++ b/e2e/testcafe-devextreme/tests/dataGrid/common/focus/focus.ts @@ -1,7 +1,7 @@ import DataGrid from 'devextreme-testcafe-models/dataGrid'; import { ClientFunction } from 'testcafe'; import TextBox from 'devextreme-testcafe-models/textBox'; -import { GridsEditMode } from 'devextreme/artifacts/npm/devextreme/common/grids'; +import { GridsEditMode } from 'devextreme/ui/data_grid'; import { createWidget } from '../../../../helpers/createWidget'; import url from '../../../../helpers/getPageUrl'; @@ -380,7 +380,7 @@ test('Focus method should focus the first data row when focusedRowEnabled = true (['batch', 'cell'] as GridsEditMode[]).forEach((editMode) => { // T1331376 - test(`Tab should focus the next cell after editing a cell by API when focusedRowEnabled (editing.mode=${editMode})`, async (t) => { + test.only(`Tab should focus the next cell after editing a cell by API when focusedRowEnabled (editing.mode=${editMode})`, async (t) => { const dataGrid = new DataGrid(GRID_SELECTOR); await t.expect(dataGrid.isReady()).ok(); From ef86b89821e014959996eda0dd79b3cd0138630a Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Fri, 10 Jul 2026 21:10:26 +0600 Subject: [PATCH 5/5] remove .only --- e2e/testcafe-devextreme/tests/dataGrid/common/focus/focus.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/testcafe-devextreme/tests/dataGrid/common/focus/focus.ts b/e2e/testcafe-devextreme/tests/dataGrid/common/focus/focus.ts index 95dab71ee5d7..81411e77b62e 100644 --- a/e2e/testcafe-devextreme/tests/dataGrid/common/focus/focus.ts +++ b/e2e/testcafe-devextreme/tests/dataGrid/common/focus/focus.ts @@ -380,7 +380,7 @@ test('Focus method should focus the first data row when focusedRowEnabled = true (['batch', 'cell'] as GridsEditMode[]).forEach((editMode) => { // T1331376 - test.only(`Tab should focus the next cell after editing a cell by API when focusedRowEnabled (editing.mode=${editMode})`, async (t) => { + test(`Tab should focus the next cell after editing a cell by API when focusedRowEnabled (editing.mode=${editMode})`, async (t) => { const dataGrid = new DataGrid(GRID_SELECTOR); await t.expect(dataGrid.isReady()).ok();