GridCore: fix calculateGroupValue comparison on apply group and sort …#32472
GridCore: fix calculateGroupValue comparison on apply group and sort …#32472anna-shakhova wants to merge 5 commits intoDevExpress:26_1from
Conversation
…from dataSource (T1321187, T1308536)
…g and grouping after data reload
5aee64d to
60ce291
Compare
There was a problem hiding this comment.
Pull request overview
Fixes an internal DataGrid ColumnsController mapping issue where grouping/sorting parameters coming from the DataSource could be matched to the wrong column when calculateGroupValue is specified as a string (field name), which could cause grouping state to be lost/shifted after actions like expandAll.
Changes:
- Updated
ColumnsController.updateSortingGroupingselector matching to correctly handle stringcalculateGroupValueand avoid mis-assigning group/sort indexes to referenced columns. - Added TestCafe e2e coverage for scenarios with string
calculateGroupValue(including when the referenced field also exists as a separate column).
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
packages/devextreme/js/__internal/grids/grid_core/columns_controller/m_columns_controller.ts |
Adjusts selector comparison and index assignment logic to prevent incorrect grouping/sorting mapping when calculateGroupValue is a string. |
e2e/testcafe-devextreme/tests/dataGrid/common/grouping/grouping.ts |
Adds regression e2e tests for T1321187 and T1308536 covering expandAll behavior with string calculateGroupValue. |
packages/devextreme/js/__internal/grids/grid_core/columns_controller/m_columns_controller.ts
Outdated
Show resolved
Hide resolved
packages/devextreme/js/__internal/grids/grid_core/columns_controller/m_columns_controller.ts
Outdated
Show resolved
Hide resolved
e2e/testcafe-devextreme/tests/dataGrid/common/grouping/grouping.ts
Outdated
Show resolved
Hide resolved
packages/devextreme/js/__internal/grids/grid_core/columns_controller/m_columns_controller.ts
Outdated
Show resolved
Hide resolved
fe70ac2 to
89f1310
Compare
89f1310 to
fe2f3b7
Compare
| each(columns, (_: number, column) => { | ||
| const isReferencedAsGroupValue = indexParameterName === 'groupIndex' | ||
| && referencedGroupValues.some( | ||
| (groupValue) => column.dataField === groupValue || column.name === groupValue, | ||
| ); | ||
|
|
||
| if (!isReferencedAsGroupValue) { | ||
| // eslint-disable-next-line @typescript-eslint/no-dynamic-delete | ||
| delete column[indexParameterName]; | ||
| if (sortParameters) { | ||
| for (let i = 0; i < sortParameters.length; i++) { | ||
| const { selector } = sortParameters[i]; | ||
| const { isExpanded } = sortParameters[i]; | ||
|
|
||
| if (selector === column.dataField | ||
| || selector === column.name | ||
| || selector === column.displayField | ||
| || gridCoreUtils.isEqualSelectors(selector, column.selector) | ||
| || gridCoreUtils.isSelectorEqualWithCallback(selector, column.calculateCellValue) | ||
| || gridCoreUtils.isSelectorEqualWithCallback(selector, column.calculateGroupValue) | ||
| || gridCoreUtils.isSelectorEqualWithCallback(selector, column.calculateDisplayValue) | ||
| ) { | ||
| if (fromDataSource) { | ||
| column.sortOrder = 'sortOrder' in column ? column.sortOrder : sortParameters[i].desc ? 'desc' : 'asc'; | ||
| } else { | ||
| column.sortOrder = column.sortOrder || (sortParameters[i].desc ? 'desc' : 'asc'); | ||
| } | ||
|
|
||
| if (isExpanded !== undefined) { | ||
| column.autoExpandGroup = isExpanded; | ||
| delete column[indexParameterName]; | ||
| if (sortParameters) { | ||
| for (let i = 0; i < sortParameters.length; i += 1) { |
There was a problem hiding this comment.
updateSortGroupParameterIndexes skips all processing (including delete column[groupIndex]) for columns whose dataField/name matches another column’s string calculateGroupValue. This can leave a stale groupIndex on the referenced column (e.g., if it was previously grouped and the dataSource grouping is later cleared/changed), because the cleanup never runs. Consider always deleting column[indexParameterName] for every column, and only skipping the assignment step for referenced columns (or gating the skip to cases where the current dataSource groupParameters selector matches a string calculateGroupValue).
…from dataSource (T1321187, T1308536)