Skip to content

Commit 96953dc

Browse files
authored
DataGrid: Fix cell focus behavior after grouping nested column using keyboard (#30165)
Co-authored-by: Alyar <>
1 parent 68ecf17 commit 96953dc

File tree

5 files changed

+67
-14
lines changed

5 files changed

+67
-14
lines changed

e2e/testcafe-devextreme/tests/dataGrid/common/keyboardNavigation/groupColumnReordering.functional.ts

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,50 @@ test('Group last nested column when pressing Ctrl + G', async (t) => {
237237
});
238238
});
239239

240+
test('Group last nested column when pressing Ctrl + G when there are several band columns', async (t) => {
241+
const dataGrid = new DataGrid(DATA_GRID_SELECTOR);
242+
const nestedSecondHeader = dataGrid.getHeaders().getHeaderRow(1).getHeaderCell(1);
243+
244+
await t
245+
.click(nestedSecondHeader.element)
246+
.pressKey('ctrl+g');
247+
248+
await t
249+
.expect(dataGrid.getGroupPanel().getHeadersCount())
250+
.eql(1)
251+
.expect(dataGrid.getHeaders().getHeaderRow(1).getHeaderCell(0).isFocused)
252+
.ok();
253+
}).before(async () => {
254+
await createWidget('dxDataGrid', {
255+
dataSource: [{
256+
field1: 'test1',
257+
field2: 'test2',
258+
field3: 'test3',
259+
field4: 'test4',
260+
field5: 'test5',
261+
field6: 'test6',
262+
}],
263+
grouping: {
264+
contextMenuEnabled: true,
265+
},
266+
groupPanel: {
267+
visible: true,
268+
},
269+
columns: [
270+
'field1',
271+
{
272+
caption: 'Band Column 1',
273+
columns: ['field2', 'field3'],
274+
},
275+
'field4',
276+
{
277+
caption: 'Band Column 2',
278+
columns: ['field5', 'field6'],
279+
},
280+
],
281+
});
282+
});
283+
240284
test('Group single nested column when pressing Ctrl + G', async (t) => {
241285
const dataGrid = new DataGrid(DATA_GRID_SELECTOR);
242286
const nestedLastHeader = dataGrid.getHeaders().getHeaderRow(1).getHeaderCell(0);
@@ -248,7 +292,7 @@ test('Group single nested column when pressing Ctrl + G', async (t) => {
248292
await t
249293
.expect(dataGrid.getGroupPanel().getHeadersCount())
250294
.eql(1)
251-
.expect(dataGrid.getHeaders().getHeaderRow(0).getHeaderCell(3).isFocused)
295+
.expect(dataGrid.getHeaders().getHeaderRow(0).getHeaderCell(2).isFocused)
252296
.ok();
253297
}).before(async () => {
254298
await createWidget('dxDataGrid', {

packages/devextreme/js/__internal/grids/data_grid/keyboard_navigation/m_headers_keyboard_navigation.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ const headersKeyboardNavigation = (
2121
return column;
2222
}
2323

24-
let focusableColumns = this.getFocusableColumns(rowIndex);
24+
const focusableColumns = this.getFocusableColumns(rowIndex, column.ownerBand);
2525

2626
if (focusableColumns.length === 1 && isDefined(column.ownerBand)) {
27-
focusableColumns = this.getFocusableColumns();
27+
return this._columnsController.getParentColumn(column, true);
2828
}
2929

3030
if (focusableColumns.length === 1) {

packages/devextreme/js/__internal/grids/grid_core/adaptivity/m_adaptivity.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import { isMaterial } from '@js/ui/themes';
2020
import type { ResizingController } from '@ts/grids/grid_core/views/m_grid_view';
2121

2222
import type { ExportController } from '../../data_grid/export/m_export';
23-
import type { ColumnsController } from '../columns_controller/m_columns_controller';
23+
import type { Column, ColumnsController } from '../columns_controller/m_columns_controller';
2424
import type { ColumnsResizerViewController, DraggingHeaderViewController } from '../columns_resizing_reordering/m_columns_resizing_reordering';
2525
import type { DataController } from '../data_controller/m_data_controller';
2626
import type { EditingController } from '../editing/m_editing';
@@ -1326,8 +1326,8 @@ const headersKeyboardNavigation = (Base: ModuleType<HeadersKeyboardNavigationCon
13261326
return indexCorrection;
13271327
}
13281328

1329-
protected getFocusableColumns(rowIndex?: number): any[] {
1330-
return super.getFocusableColumns(rowIndex)
1329+
protected getFocusableColumns(rowIndex?: number, bandColumnId?: number): Column[] {
1330+
return super.getFocusableColumns(rowIndex, bandColumnId)
13311331
.filter((col) => col.visibleWidth !== HIDDEN_COLUMNS_WIDTH);
13321332
}
13331333

packages/devextreme/js/__internal/grids/grid_core/columns_controller/m_columns_controller.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ import {
8484

8585
export interface Column extends ColumnBase {
8686
parseValue: (text: string) => unknown;
87+
index?: number;
88+
type?: string;
89+
visibleWidth?: string | number;
8790
}
8891

8992
export class ColumnsController extends modules.Controller {
@@ -1834,11 +1837,12 @@ export class ColumnsController extends modules.Controller {
18341837
return result;
18351838
}
18361839

1837-
public getParentColumn(column) {
1840+
public getParentColumn(column: Column, needDirectParent = false): Column {
18381841
const bandColumnsCache = this.getBandColumnsCache();
1839-
const bandColumns = getParentBandColumns(column.index, bandColumnsCache.columnParentByIndex);
1842+
const parentColumns = getParentBandColumns(column.index, bandColumnsCache.columnParentByIndex);
1843+
const parentColumnIndex = needDirectParent ? -1 : 0;
18401844

1841-
return bandColumns[0];
1845+
return parentColumns.at(parentColumnIndex);
18421846
}
18431847

18441848
public isFirstColumn(

packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/m_headers_keyboard_navigation.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import type { DxEvent } from '@js/events';
1010
import { getElementLocationInternal } from '@ts/ui/scroll_view/utils/get_element_location_internal';
1111

1212
import type { ColumnHeadersView } from '../column_headers/m_column_headers';
13+
import type { Column } from '../columns_controller/m_columns_controller';
1314
import type { ModuleType, Views } from '../m_types';
1415
import { StickyPosition } from '../sticky_columns/const';
1516
import { GridCoreStickyColumnsDom } from '../sticky_columns/dom';
@@ -148,13 +149,17 @@ export class HeadersKeyboardNavigationController extends ColumnKeyboardNavigatio
148149
return '.dx-header-row > td';
149150
}
150151

151-
protected getFocusableColumns(rowIndex?: number): any[] {
152+
protected getFocusableColumns(rowIndex?: number, bandColumnId?: number): Column[] {
152153
const visibleColumns = this._columnsController.getVisibleColumns(rowIndex);
154+
const isColumnFocusable = (column: Column): boolean => !isDefined(column.type)
155+
|| this._columnsController.isCustomCommandColumn(column);
156+
const result: Column[] = visibleColumns.filter(isColumnFocusable);
153157

154-
return visibleColumns.filter(
155-
(column) => !isDefined(column.type)
156-
|| this._columnsController.isCustomCommandColumn(column),
157-
);
158+
if (isDefined(bandColumnId)) {
159+
return result.filter((column: Column): boolean => column.ownerBand === bandColumnId);
160+
}
161+
162+
return result;
158163
}
159164

160165
protected getContainerBoundingRect($container: dxElementWrapper) {

0 commit comments

Comments
 (0)