Skip to content

Commit 7a79659

Browse files
committed
GridCore: fix calculateGroupValue comparison on apply group and sort from dataSource (T1321187, T1308536)
1 parent cc3016e commit 7a79659

File tree

2 files changed

+132
-31
lines changed

2 files changed

+132
-31
lines changed

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

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,89 @@ test('DataGrid loses grouping after the expandAll method if a grouped column has
298298
],
299299
}));
300300

301+
test('DataGrid should not lose grouping after the expandAll method if a grouped column has string calculateGroupValue (T1321187)', async (t) => {
302+
const dataGrid = new DataGrid('#container');
303+
304+
await dataGrid.apiExpandAll();
305+
306+
await t
307+
.expect(dataGrid.apiColumnOption('a', 'groupIndex'))
308+
.eql(0);
309+
}).before(async () => createWidget('dxDataGrid', {
310+
dataSource: [{
311+
id: 0, a: 0, aLabel: 'A_0', b: 'B_0', c: 'C_0',
312+
}],
313+
keyExpr: 'id',
314+
grouping: { autoExpandAll: false },
315+
columns: [{
316+
dataField: 'a',
317+
groupIndex: 0,
318+
calculateGroupValue: 'aLabel',
319+
},
320+
'b', 'c'],
321+
}));
322+
323+
test('DataGrid should not change group column after the expandAll method, string calculateGroupValue corresponds another column (T1308536)', async (t) => {
324+
const dataGrid = new DataGrid('#container');
325+
const firstGroupCellText = await dataGrid.getGroupRow(0).getCell(1).element.textContent;
326+
327+
await dataGrid.apiExpandAll();
328+
329+
await t
330+
.expect(dataGrid.apiColumnOption('a', 'groupIndex'))
331+
.eql(0)
332+
.expect(dataGrid.apiColumnOption('aLabel', 'groupIndex'))
333+
.eql(undefined)
334+
.expect(dataGrid.getGroupRow(0).getCell(1).element.textContent)
335+
.eql(firstGroupCellText);
336+
}).before(async () => createWidget('dxDataGrid', {
337+
dataSource: [{
338+
id: 0, a: 0, aLabel: 'A_0', b: 'B_0', c: 'C_0',
339+
}],
340+
keyExpr: 'id',
341+
grouping: { autoExpandAll: false },
342+
columns: [{
343+
dataField: 'a',
344+
groupIndex: 0,
345+
calculateGroupValue: 'aLabel',
346+
},
347+
{ dataField: 'aLabel', visible: false },
348+
349+
'b', 'c'],
350+
}));
351+
352+
test('DataGrid should not change group column after the expandAll method, string calculateGroupValue corresponds another unbound column (T1308536)', async (t) => {
353+
const dataGrid = new DataGrid('#container');
354+
const firstGroupCellText = await dataGrid.getGroupRow(0).getCell(1).element.textContent;
355+
356+
await dataGrid.apiExpandAll();
357+
358+
await t
359+
.expect(dataGrid.apiColumnOption('a', 'groupIndex'))
360+
.eql(0)
361+
.expect(dataGrid.apiColumnOption('aLabel', 'groupIndex'))
362+
.eql(undefined)
363+
.expect(dataGrid.getGroupRow(0).getCell(1).element.textContent)
364+
.eql(firstGroupCellText);
365+
}).before(async () => createWidget('dxDataGrid', {
366+
dataSource: [{
367+
id: 0, a: 0, aLabel: 'A_0', b: 'B_0', c: 'C_0',
368+
}],
369+
keyExpr: 'id',
370+
grouping: { autoExpandAll: false },
371+
columns: [{
372+
dataField: 'a',
373+
groupIndex: 0,
374+
calculateGroupValue: 'aLabel',
375+
},
376+
{
377+
name: 'aLabel',
378+
caption: 'aLabel',
379+
calculateCellValue(data) { return data.aLabel; },
380+
},
381+
'b', 'c'],
382+
}));
383+
301384
test('Grouping and filtering should be applied correctly when they change at runtime (T1237863)', async (t) => {
302385
const dataGrid = new DataGrid('#container');
303386
const { takeScreenshot, compareResults } = createScreenshotsComparer(t);

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

Lines changed: 49 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1289,38 +1289,56 @@ export class ColumnsController extends modules.Controller {
12891289
updateColumnChanges(this, 'columns');
12901290
}
12911291

1292-
public updateSortingGrouping(dataSource, fromDataSource?) {
1292+
public updateSortingGrouping(dataSource, fromDataSource?: boolean): void {
1293+
// eslint-disable-next-line @typescript-eslint/no-this-alias
12931294
const that = this;
1294-
let isColumnsChanged;
1295-
const updateSortGroupParameterIndexes = function (columns, sortParameters, indexParameterName) {
1296-
each(columns, (index, column) => {
1295+
// eslint-disable-next-line @typescript-eslint/init-declarations
1296+
let isColumnsChanged: boolean | undefined;
1297+
// eslint-disable-next-line func-names
1298+
const updateSortGroupParameterIndexes = function (
1299+
columns,
1300+
sortParameters,
1301+
indexParameterName: string,
1302+
): void {
1303+
const referencedGroupValues: string[] = columns
1304+
.filter((column) => isString(column.calculateGroupValue))
1305+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
1306+
.map((column): string => column.calculateGroupValue);
1307+
1308+
each(columns, (_: number, column) => {
1309+
const isReferencedAsGroupValue = indexParameterName === 'groupIndex'
1310+
&& referencedGroupValues.some(
1311+
(groupValue) => column.dataField === groupValue || column.name === groupValue,
1312+
);
1313+
1314+
if (!isReferencedAsGroupValue) {
12971315
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
1298-
delete column[indexParameterName];
1299-
if (sortParameters) {
1300-
for (let i = 0; i < sortParameters.length; i++) {
1301-
const { selector } = sortParameters[i];
1302-
const { isExpanded } = sortParameters[i];
1303-
1304-
if (selector === column.dataField
1305-
|| selector === column.name
1306-
|| selector === column.displayField
1307-
|| gridCoreUtils.isEqualSelectors(selector, column.selector)
1308-
|| gridCoreUtils.isSelectorEqualWithCallback(selector, column.calculateCellValue)
1309-
|| gridCoreUtils.isSelectorEqualWithCallback(selector, column.calculateGroupValue)
1310-
|| gridCoreUtils.isSelectorEqualWithCallback(selector, column.calculateDisplayValue)
1311-
) {
1312-
if (fromDataSource) {
1313-
column.sortOrder = 'sortOrder' in column ? column.sortOrder : sortParameters[i].desc ? 'desc' : 'asc';
1314-
} else {
1315-
column.sortOrder = column.sortOrder || (sortParameters[i].desc ? 'desc' : 'asc');
1316-
}
1317-
1318-
if (isExpanded !== undefined) {
1319-
column.autoExpandGroup = isExpanded;
1316+
delete column[indexParameterName];
1317+
if (sortParameters) {
1318+
for (let i = 0; i < sortParameters.length; i += 1) {
1319+
const { selector, isExpanded } = sortParameters[i];
1320+
1321+
if (selector === column.dataField
1322+
|| selector === column.name
1323+
|| selector === column.displayField
1324+
|| gridCoreUtils.isEqualSelectors(selector, column.selector)
1325+
|| gridCoreUtils.isSelectorEqualWithCallback(selector, column.calculateCellValue)
1326+
|| gridCoreUtils.isEqualSelectors(selector, column.calculateGroupValue)
1327+
|| gridCoreUtils.isSelectorEqualWithCallback(selector, column.calculateDisplayValue)
1328+
) {
1329+
if (fromDataSource) {
1330+
column.sortOrder = 'sortOrder' in column ? column.sortOrder : sortParameters[i].desc ? 'desc' : 'asc';
1331+
} else {
1332+
column.sortOrder = column.sortOrder ?? (sortParameters[i].desc ? 'desc' : 'asc');
1333+
}
1334+
1335+
if (isExpanded !== undefined) {
1336+
column.autoExpandGroup = isExpanded;
1337+
}
1338+
1339+
column[indexParameterName] = i;
1340+
break;
13201341
}
1321-
1322-
column[indexParameterName] = i;
1323-
break;
13241342
}
13251343
}
13261344
}
@@ -1339,10 +1357,10 @@ export class ColumnsController extends modules.Controller {
13391357
const groupExpandingChanged = !groupingChanged && !gridCoreUtils.equalSortParameters(groupParameters, columnsGroupParameters);
13401358

13411359
if (!that._columns.length) {
1342-
each(groupParameters, (index, group) => {
1360+
each(groupParameters, (_: number, group) => {
13431361
that._columns.push(group.selector);
13441362
});
1345-
each(sortParameters, (index, sort) => {
1363+
each(sortParameters, (_: number, sort) => {
13461364
if (!isFunction(sort.selector)) {
13471365
that._columns.push(sort.selector);
13481366
}

0 commit comments

Comments
 (0)