Skip to content

Commit ae07974

Browse files
authored
DataGrid: fix Ctrl+Arrow movement when in the same page more than 1 DataGrid (T1285596) (DevExpress#29782) (DevExpress#29787)
1 parent 7071163 commit ae07974

File tree

3 files changed

+54
-4
lines changed

3 files changed

+54
-4
lines changed

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

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4767,3 +4767,45 @@ test('Cancel button in the last column cannot be focused via the Tab key (T12489
47674767
'FirstName',
47684768
],
47694769
}));
4770+
4771+
const getDataGridProps = () => ({
4772+
dataSource: getData(5, 2),
4773+
columns: ['field_0', 'field_1'],
4774+
filterRow: { visible: true },
4775+
});
4776+
4777+
// T1285421
4778+
test('Multiple DataGrids - Ctrl+Up/Down from filter row should focus data row in the same grid', async (t) => {
4779+
const firstGrid = new DataGrid('#container');
4780+
const secondGrid = new DataGrid('#otherContainer');
4781+
4782+
// Ensure both grids are ready
4783+
await t
4784+
.expect(firstGrid.isReady())
4785+
.ok('First grid is ready')
4786+
.expect(secondGrid.isReady())
4787+
.ok('Second grid is ready');
4788+
4789+
const firstDataGridFilterCell = firstGrid
4790+
.getHeaders().getFilterRow().getFilterCell(0).getEditorInput().element;
4791+
const secondDataGridFilterCell = secondGrid
4792+
.getHeaders().getFilterRow().getFilterCell(0).getEditorInput().element;
4793+
const firstGridDataCell = firstGrid.getDataRow(0).getDataCell(0).element;
4794+
const secondGridDataCell = secondGrid.getDataRow(0).getDataCell(0).element;
4795+
4796+
await t
4797+
.click(secondGridDataCell)
4798+
.pressKey('ctrl+up')
4799+
.expect(secondDataGridFilterCell.focused)
4800+
.ok('Second grid filter cell is focused')
4801+
.expect(firstDataGridFilterCell.focused)
4802+
.notOk('First grid data filter cell is not focused')
4803+
.pressKey('ctrl+down')
4804+
.expect(secondGridDataCell.focused)
4805+
.ok('Second grid data cell is focused')
4806+
.expect(firstGridDataCell.focused)
4807+
.notOk('First grid data cell is not focused');
4808+
}).before(async () => {
4809+
await createWidget('dxDataGrid', getDataGridProps());
4810+
await createWidget('dxDataGrid', getDataGridProps(), '#otherContainer');
4811+
});

packages/devextreme/js/ui/shared/accessibility.js

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,16 @@ function getActiveAccessibleElements(ariaLabel, viewElement) {
8080
return $activeElements;
8181
}
8282

83-
function findFocusedViewElement(viewSelectors, element) {
84-
const root = element?.getRootNode() || domAdapter.getDocument();
83+
function findFocusedViewElement(instanceRootDomNode, viewSelectors, element) {
84+
const root = instanceRootDomNode ?? element?.getRootNode() ?? domAdapter.getDocument();
85+
86+
if(!root) { return; }
87+
88+
const $root = $(root);
8589

8690
for(const index in viewSelectors) {
8791
const selector = viewSelectors[index];
88-
const $focusViewElement = $(root).find(selector).first();
92+
const $focusViewElement = $root.find(selector).first();
8993

9094
if($focusViewElement.length) {
9195
return $focusViewElement;
@@ -176,11 +180,13 @@ export function selectView(viewName, instance, event) {
176180
const viewNames = Object.keys(viewItemSelectorMap);
177181
let viewItemIndex = viewNames.indexOf(viewName);
178182

183+
const instanceRootDomNode = instance?.component?.element?.();
184+
179185
while(viewItemIndex >= 0 && viewItemIndex < viewNames.length) {
180186
viewItemIndex = keyName === 'upArrow' ? --viewItemIndex : ++viewItemIndex;
181187
const viewName = viewNames[viewItemIndex];
182188
const viewSelectors = viewItemSelectorMap[viewName];
183-
const $focusViewElement = findFocusedViewElement(viewSelectors, event.target);
189+
const $focusViewElement = findFocusedViewElement(instanceRootDomNode, viewSelectors, event.target);
184190
if($focusViewElement && $focusViewElement.length) {
185191
$focusViewElement.attr('tabindex', instance.option('tabindex') || 0);
186192
eventsEngine.trigger($focusViewElement, 'focus');

packages/devextreme/testing/helpers/gridBaseMocks.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -940,6 +940,8 @@ module.exports = function($, gridCore, columnResizingReordering, domUtils, commo
940940

941941
that.NAME = 'dx' + nameWidget;
942942

943+
that.element = () => $('#container');
944+
943945
that.focus = commonUtils.noop;
944946

945947
that.setAria = function(name, value, $target) {

0 commit comments

Comments
 (0)