Skip to content

Commit 40ff0b4

Browse files
authored
DataGrid - Column reordering doesn't work when there are many columns and columnRenderingMode is 'virtual' (T1304328, T1305380) (DevExpress#31093)
1 parent cc3790c commit 40ff0b4

File tree

7 files changed

+123
-7
lines changed

7 files changed

+123
-7
lines changed

e2e/testcafe-devextreme/tests/dataGrid/common/accessibility/status.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,6 @@ test('Accessibility: DataGrid general status should contains correct text after
7575
const dataGrid = new DataGrid('#container');
7676
const filterEditor = dataGrid.getFilterEditor(0, FilterTextBox);
7777

78-
// await t.debug();
79-
8078
const applyFilterBtn = dataGrid.getHeaderPanel().getApplyFilterButton();
8179
await t.typeText(filterEditor.input(), 'A')
8280
.click(applyFilterBtn);
93.5 KB
Loading
64.3 KB
Loading
112 KB
Loading

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

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,96 @@ test('Columns should be rendered correctly after reinit of columns controller',
296296
},
297297
}));
298298

299+
test('Columns reordering should work with virtual columns', async (t) => {
300+
const dataGrid = new DataGrid('#container');
301+
const { takeScreenshot, compareResults } = createScreenshotsComparer(t);
302+
303+
await dataGrid.scrollTo(t, { x: 100000 });
304+
305+
await t.drag(
306+
dataGrid.getHeaders().getHeaderRow(0).getHeaderCell(499).element,
307+
-110,
308+
0,
309+
);
310+
311+
await t
312+
.expect(await takeScreenshot('data-grid__virtual-columns__reoder.png', dataGrid.element))
313+
.ok()
314+
.expect(compareResults.isValid())
315+
.ok(compareResults.errorMessages());
316+
}).before(async () => createWidget('dxDataGrid', {
317+
allowColumnReordering: true,
318+
height: 440,
319+
dataSource: generateData(150, 500),
320+
columns: generateColumns(500),
321+
columnWidth: 100,
322+
scrolling: {
323+
columnRenderingMode: 'virtual',
324+
},
325+
}));
326+
327+
test('Grouping should work with virtual columns', async (t) => {
328+
const dataGrid = new DataGrid('#container');
329+
const { takeScreenshot, compareResults } = createScreenshotsComparer(t);
330+
331+
await dataGrid.scrollTo(t, { x: 100000 });
332+
333+
await t.dragToElement(
334+
dataGrid.getHeaders().getHeaderRow(0).getHeaderCell(499).element,
335+
dataGrid.getGroupPanel().element,
336+
);
337+
338+
await t
339+
.expect(await takeScreenshot('data-grid__virtual-columns__grouping.png', dataGrid.element))
340+
.ok()
341+
.expect(compareResults.isValid())
342+
.ok(compareResults.errorMessages());
343+
}).before(async () => createWidget('dxDataGrid', {
344+
height: 440,
345+
groupPanel: {
346+
visible: true,
347+
},
348+
dataSource: generateData(150, 500),
349+
columns: generateColumns(500),
350+
columnWidth: 100,
351+
scrolling: {
352+
columnRenderingMode: 'virtual',
353+
},
354+
}));
355+
356+
test('Column chooser should work with virtual columns', async (t) => {
357+
const dataGrid = new DataGrid('#container');
358+
const { takeScreenshot, compareResults } = createScreenshotsComparer(t);
359+
360+
await dataGrid.scrollTo(t, { x: 100000 });
361+
362+
await t.click(dataGrid.getColumnChooserButton());
363+
await t.expect(
364+
dataGrid.getColumnChooser().isOpened,
365+
).ok();
366+
367+
await t.dragToElement(
368+
dataGrid.getHeaders().getHeaderRow(0).getHeaderCell(499).element,
369+
dataGrid.getColumnChooser().content,
370+
);
371+
await t
372+
.expect(await takeScreenshot('data-grid__virtual-columns__column-chooser.png', dataGrid.element))
373+
.ok()
374+
.expect(compareResults.isValid())
375+
.ok(compareResults.errorMessages());
376+
}).before(async () => createWidget('dxDataGrid', {
377+
height: 440,
378+
columnChooser: {
379+
enabled: true,
380+
},
381+
dataSource: generateData(150, 500),
382+
columns: generateColumns(500),
383+
columnWidth: 100,
384+
scrolling: {
385+
columnRenderingMode: 'virtual',
386+
},
387+
}));
388+
299389
test('Group row should have right colspan with summary, virtual columns and fixed columns (T1221369)', async (t) => {
300390
const grid = new DataGrid('#container');
301391
const { takeScreenshot, compareResults } = createScreenshotsComparer(t);

packages/devextreme/js/__internal/grids/grid_core/columns_resizing_reordering/m_columns_resizing_reordering.ts

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,11 @@ const allowReordering = function (that) {
6060
return that.option('allowColumnReordering') || that.getController('columns').isColumnOptionUsed('allowReordering');
6161
};
6262

63+
type ColumnIndex = number | {
64+
rowIndex: number;
65+
columnIndex: number;
66+
};
67+
6368
export class TrackerView extends modules.View {
6469
private _positionChanged: any;
6570

@@ -1513,7 +1518,12 @@ export class DraggingHeaderViewController extends modules.ViewController {
15131518
}
15141519

15151520
private allowDrop(parameters) {
1516-
return this._columnsController.allowMoveColumn(parameters.sourceColumnIndex, parameters.targetColumnIndex, parameters.sourceLocation, parameters.targetLocation);
1521+
return this._columnsController.allowMoveColumn(
1522+
this.addColumnIndexOffset(parameters.sourceColumnIndex),
1523+
this.addColumnIndexOffset(parameters.targetColumnIndex),
1524+
parameters.sourceLocation,
1525+
parameters.targetLocation,
1526+
);
15171527
}
15181528

15191529
public drag(parameters) {
@@ -1570,6 +1580,19 @@ export class DraggingHeaderViewController extends modules.ViewController {
15701580
}
15711581
}
15721582

1583+
private addColumnIndexOffset(columnIndex: ColumnIndex): ColumnIndex {
1584+
const offset = this._columnsController.getColumnIndexOffset();
1585+
1586+
if (isObject(columnIndex)) {
1587+
return {
1588+
...columnIndex,
1589+
columnIndex: columnIndex.columnIndex + offset,
1590+
};
1591+
}
1592+
1593+
return columnIndex + offset;
1594+
}
1595+
15731596
private drop(parameters) {
15741597
const { sourceColumnElement } = parameters;
15751598

@@ -1586,7 +1609,12 @@ export class DraggingHeaderViewController extends modules.ViewController {
15861609
separator.hide();
15871610
}
15881611

1589-
this._columnsController.moveColumn(parameters.sourceColumnIndex, parameters.targetColumnIndex, parameters.sourceLocation, parameters.targetLocation);
1612+
this._columnsController.moveColumn(
1613+
this.addColumnIndexOffset(parameters.sourceColumnIndex),
1614+
this.addColumnIndexOffset(parameters.targetColumnIndex),
1615+
parameters.sourceLocation,
1616+
parameters.targetLocation,
1617+
);
15901618
}
15911619
}
15921620
}

packages/testcafe-models/dataGrid/groupPanel.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ import { GroupPanelItem } from './groupPanelItem';
33
const ITEM_SELECTOR = '.dx-group-panel-item';
44

55
export class GroupPanel {
6-
constructor(private readonly selector: Selector) {}
6+
constructor(public readonly element: Selector) {}
77

88
getHeader(i: number): GroupPanelItem {
9-
return new GroupPanelItem(this.selector.find(ITEM_SELECTOR).nth(i));
9+
return new GroupPanelItem(this.element.find(ITEM_SELECTOR).nth(i));
1010
}
1111

1212
getHeadersCount(): Promise<number> {
13-
return this.selector.find(ITEM_SELECTOR).count;
13+
return this.element.find(ITEM_SELECTOR).count;
1414
}
1515
}

0 commit comments

Comments
 (0)