diff --git a/packages/devextreme/js/__internal/data/data_converter/grouped.ts b/packages/devextreme/js/__internal/data/data_converter/grouped.ts index 513b00a588c6..336cfaeb3bdf 100644 --- a/packages/devextreme/js/__internal/data/data_converter/grouped.ts +++ b/packages/devextreme/js/__internal/data/data_converter/grouped.ts @@ -8,7 +8,10 @@ const groupKey = 'key'; export function getDataSourceOptions( dataSource: DataSourceLike, ): DataSourceLike | DataSourceOptions> { - if (!isGroupItemsArray(dataSource)) { + if ( + !isGroupItemsArray(dataSource) + || (dataSource as GroupItem[]).some((item) => Object.keys(item).length !== 2) + ) { return dataSource; } diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/listParts/commonTests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/listParts/commonTests.js index 44545cec96c3..6372cb295413 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/listParts/commonTests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/listParts/commonTests.js @@ -3791,6 +3791,68 @@ QUnit.module('regressions', moduleSetup, () => { done(); }); }); + + QUnit.test('custom properties should be preserved in grouped items (T1319741)', function(assert) { + const data = [ + { key: 'Group 1', items: [{ text: 'Item 1' }], customProp: 'customValue' } + ]; + + const list = this.element.dxList({ + dataSource: data, + grouped: true + }).dxList('instance'); + + const dataSourceItems = list.getDataSource().items(); + + assert.strictEqual(dataSourceItems.length, 1, 'One group loaded'); + assert.strictEqual(dataSourceItems[0].key, 'Group 1', 'Key preserved'); + assert.strictEqual(dataSourceItems[0].customProp, 'customValue', 'Custom property preserved'); + }); + + QUnit.test('custom properties should be preserved in mixed grouped items (T1319741)', function(assert) { + const data = [ + { key: 'Group 1', items: [{ text: 'Item 1' }] }, + { key: 'Group 2', items: [{ text: 'Item 2' }], customProp: 'customValue' } + ]; + + const list = this.element.dxList({ + dataSource: data, + grouped: true + }).dxList('instance'); + + const dataSourceItems = list.getDataSource().items(); + + assert.strictEqual(dataSourceItems.length, 2, 'Two groups loaded'); + + assert.strictEqual(dataSourceItems[0].key, 'Group 1'); + assert.strictEqual(dataSourceItems[1].key, 'Group 2'); + assert.strictEqual(dataSourceItems[1].customProp, 'customValue', 'Custom property preserved in second group'); + + const $groups = $(list.element()).find(`.${LIST_GROUP_CLASS}`); + assert.strictEqual($groups.length, 2, 'Two groups rendered'); + assert.strictEqual($groups.eq(1).find(`.${LIST_ITEM_CLASS}`).text(), 'Item 2', 'Item in second group rendered'); + }); + + QUnit.test('custom properties should be available in groupTemplate (T1319741)', function(assert) { + const data = [ + { key: 'Group 1', customProp: 'customValue', items: [{ text: 'Item 1' }] } + ]; + + const groupTemplateStub = sinon.stub().returns($('
')); + + this.element.dxList({ + dataSource: data, + grouped: true, + groupTemplate: groupTemplateStub + }); + + assert.strictEqual(groupTemplateStub.callCount, 1, 'Template was called once'); + const groupItem = groupTemplateStub.getCall(0).args[0]; + + assert.strictEqual(groupItem.key, 'Group 1', 'Key is correct in template'); + assert.ok(Object.prototype.hasOwnProperty.call(groupItem, 'customProp'), 'Custom property is present in group item'); + assert.strictEqual(groupItem.customProp, 'customValue', 'Custom property value is correct'); + }); }); QUnit.module('widget sizing render', {}, () => {