Skip to content

Commit 3bad064

Browse files
committed
GridCore: fix calculateGroupValue comparison on apply group and sort from dataSource (T1321187, T1308536)
1 parent 3b30510 commit 3bad064

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
@@ -1323,38 +1323,56 @@ export class ColumnsController extends modules.Controller {
13231323
updateColumnChanges(this, 'columns');
13241324
}
13251325

1326-
public updateSortingGrouping(dataSource, fromDataSource?) {
1326+
public updateSortingGrouping(dataSource, fromDataSource?: boolean): void {
1327+
// eslint-disable-next-line @typescript-eslint/no-this-alias
13271328
const that = this;
1328-
let isColumnsChanged;
1329-
const updateSortGroupParameterIndexes = function (columns, sortParameters, indexParameterName) {
1330-
each(columns, (index, column) => {
1329+
// eslint-disable-next-line @typescript-eslint/init-declarations
1330+
let isColumnsChanged: boolean | undefined;
1331+
// eslint-disable-next-line func-names
1332+
const updateSortGroupParameterIndexes = function (
1333+
columns,
1334+
sortParameters,
1335+
indexParameterName: string,
1336+
): void {
1337+
const referencedGroupValues: string[] = columns
1338+
.filter((column) => isString(column.calculateGroupValue))
1339+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
1340+
.map((column): string => column.calculateGroupValue);
1341+
1342+
each(columns, (_: number, column) => {
1343+
const isReferencedAsGroupValue = indexParameterName === 'groupIndex'
1344+
&& referencedGroupValues.some(
1345+
(groupValue) => column.dataField === groupValue || column.name === groupValue,
1346+
);
1347+
1348+
if (!isReferencedAsGroupValue) {
13311349
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
1332-
delete column[indexParameterName];
1333-
if (sortParameters) {
1334-
for (let i = 0; i < sortParameters.length; i++) {
1335-
const { selector } = sortParameters[i];
1336-
const { isExpanded } = sortParameters[i];
1337-
1338-
if (selector === column.dataField
1339-
|| selector === column.name
1340-
|| selector === column.displayField
1341-
|| gridCoreUtils.isEqualSelectors(selector, column.selector)
1342-
|| gridCoreUtils.isSelectorEqualWithCallback(selector, column.calculateCellValue)
1343-
|| gridCoreUtils.isSelectorEqualWithCallback(selector, column.calculateGroupValue)
1344-
|| gridCoreUtils.isSelectorEqualWithCallback(selector, column.calculateDisplayValue)
1345-
) {
1346-
if (fromDataSource) {
1347-
column.sortOrder = 'sortOrder' in column ? column.sortOrder : sortParameters[i].desc ? 'desc' : 'asc';
1348-
} else {
1349-
column.sortOrder = column.sortOrder || (sortParameters[i].desc ? 'desc' : 'asc');
1350-
}
1351-
1352-
if (isExpanded !== undefined) {
1353-
column.autoExpandGroup = isExpanded;
1350+
delete column[indexParameterName];
1351+
if (sortParameters) {
1352+
for (let i = 0; i < sortParameters.length; i += 1) {
1353+
const { selector, isExpanded } = sortParameters[i];
1354+
1355+
if (selector === column.dataField
1356+
|| selector === column.name
1357+
|| selector === column.displayField
1358+
|| gridCoreUtils.isEqualSelectors(selector, column.selector)
1359+
|| gridCoreUtils.isSelectorEqualWithCallback(selector, column.calculateCellValue)
1360+
|| gridCoreUtils.isEqualSelectors(selector, column.calculateGroupValue)
1361+
|| gridCoreUtils.isSelectorEqualWithCallback(selector, column.calculateDisplayValue)
1362+
) {
1363+
if (fromDataSource) {
1364+
column.sortOrder = 'sortOrder' in column ? column.sortOrder : sortParameters[i].desc ? 'desc' : 'asc';
1365+
} else {
1366+
column.sortOrder = column.sortOrder ?? (sortParameters[i].desc ? 'desc' : 'asc');
1367+
}
1368+
1369+
if (isExpanded !== undefined) {
1370+
column.autoExpandGroup = isExpanded;
1371+
}
1372+
1373+
column[indexParameterName] = i;
1374+
break;
13541375
}
1355-
1356-
column[indexParameterName] = i;
1357-
break;
13581376
}
13591377
}
13601378
}
@@ -1373,10 +1391,10 @@ export class ColumnsController extends modules.Controller {
13731391
const groupExpandingChanged = !groupingChanged && !gridCoreUtils.equalSortParameters(groupParameters, columnsGroupParameters);
13741392

13751393
if (!that._columns.length) {
1376-
each(groupParameters, (index, group) => {
1394+
each(groupParameters, (_: number, group) => {
13771395
that._columns.push(group.selector);
13781396
});
1379-
each(sortParameters, (index, sort) => {
1397+
each(sortParameters, (_: number, sort) => {
13801398
if (!isFunction(sort.selector)) {
13811399
that._columns.push(sort.selector);
13821400
}

0 commit comments

Comments
 (0)