Skip to content

Commit 993a25f

Browse files
authored
DataGrid(T1278804): bounces to the top on an attempt to scroll down when an adaptive row is expanded and virtual scrolling is enabled (DevExpress#30716)
1 parent fd68667 commit 993a25f

File tree

2 files changed

+64
-3
lines changed

2 files changed

+64
-3
lines changed

e2e/testcafe-devextreme/tests/dataGrid/common/scrolling.ts

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ async function getRightScrollOffset(dataGrid: DataGrid): Promise<number> {
2020
return maxHorizontalOffset - scrollLeft;
2121
}
2222

23-
function getData(rowCount, colCount): Record<string, string>[] {
23+
function getData(rowCount: number, colCount: number): Record<string, string>[] {
2424
const items: Record<string, string>[] = [];
2525
for (let i = 0; i < rowCount; i += 1) {
2626
const item: Record<string, string> = {};
2727
for (let j = 0; j < colCount; j += 1) {
28-
item[`field_${i}_${j}`] = `val_${i}_${j}`;
28+
item[`field_${j}`] = `val_${i}_${j}`;
2929
}
3030
items.push(item);
3131
}
@@ -1824,3 +1824,62 @@ test('DataGrid - Scrolling position is reset to far right on an attempt to scrol
18241824
enabled: false,
18251825
},
18261826
}));
1827+
1828+
[true, false].forEach((nativeScroll) => {
1829+
type TestCaseWindow = typeof window & { dataGridScrollableEventValues?: number[] };
1830+
1831+
test(
1832+
`Should not scroll back on top with virtual scrolling and adaptive master detail (nativeScroll: ${nativeScroll}) [T1278804]`,
1833+
async (t) => {
1834+
// NOTE: idx + 1 logic inside POM
1835+
const adaptiveCellIdx = 101;
1836+
const scrollValuesThreshold = 100;
1837+
1838+
const dataGrid = new DataGrid('#container');
1839+
const firstRow = dataGrid.getDataRow(0);
1840+
const firstDataCell = firstRow.getDataCell(0);
1841+
const adaptiveCell = firstRow.getCommandCell(adaptiveCellIdx);
1842+
const scrollContainer = dataGrid.getScrollContainer();
1843+
1844+
await t
1845+
.click(firstDataCell.element)
1846+
.click(adaptiveCell.element);
1847+
1848+
await t
1849+
.scroll(scrollContainer, 0, 1000)
1850+
.scroll(scrollContainer, 0, 1000);
1851+
1852+
const scrollOffsets = await t
1853+
.eval(() => (window as TestCaseWindow).dataGridScrollableEventValues) as number[];
1854+
1855+
const hasSmallScrollValues = scrollOffsets.some((offset) => offset < scrollValuesThreshold);
1856+
await t.expect(hasSmallScrollValues).notOk();
1857+
},
1858+
).before(async () => {
1859+
await createWidget('dxDataGrid', {
1860+
dataSource: getData(3, 100).map((item, idx) => ({ ...item, id: idx })),
1861+
keyExpr: 'id',
1862+
columnHidingEnabled: true,
1863+
focusedRowEnabled: true,
1864+
scrolling: {
1865+
mode: 'virtual',
1866+
useNative: nativeScroll,
1867+
},
1868+
onContentReady: ({ component }) => {
1869+
const testWindow = window as TestCaseWindow;
1870+
1871+
component.getScrollable().on('scroll', ({ scrollOffset: { top } }) => {
1872+
if (!Array.isArray(testWindow.dataGridScrollableEventValues)) {
1873+
testWindow.dataGridScrollableEventValues = [];
1874+
}
1875+
1876+
testWindow.dataGridScrollableEventValues.push(top);
1877+
});
1878+
},
1879+
width: 400,
1880+
height: 400,
1881+
});
1882+
}).after(async (t) => t.eval(() => {
1883+
delete (window as TestCaseWindow).dataGridScrollableEventValues;
1884+
}));
1885+
});

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3006,7 +3006,9 @@ const adaptiveColumns = (Base: ModuleType<AdaptiveColumnsController>) => class A
30063006
protected _hideVisibleColumnInView({ view, isCommandColumn, visibleIndex }) {
30073007
super._hideVisibleColumnInView({ view, isCommandColumn, visibleIndex });
30083008
if (view.name === ROWS_VIEW) {
3009-
this._rowsView.renderFocusState(null);
3009+
this._rowsView.renderFocusState({
3010+
preventScroll: shouldPreventScroll(this),
3011+
});
30103012
}
30113013
}
30123014
};

0 commit comments

Comments
 (0)