Skip to content

Commit fe43490

Browse files
List, DropDownList: remove the use of DataConverterMixin (DevExpress#30648)
Co-authored-by: EugeniyKiyashko <[email protected]>
1 parent 17196e2 commit fe43490

File tree

4 files changed

+89
-65
lines changed

4 files changed

+89
-65
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import type { GroupItem } from '@js/common/data';
2+
import { isGroupItemsArray } from '@js/common/data';
3+
import { isObject } from '@js/core/utils/type';
4+
import type { DataSourceLike, DataSourceOptions } from '@js/data/data_source';
5+
6+
const groupKey = 'key';
7+
8+
export function getDataSourceOptions<TItem>(
9+
dataSource: DataSourceLike<TItem>,
10+
): DataSourceLike<TItem> | DataSourceOptions<GroupItem<TItem>> {
11+
if (!isGroupItemsArray<TItem>(dataSource)) {
12+
return dataSource;
13+
}
14+
15+
let hasSimpleItems = false;
16+
17+
const data = dataSource.reduce((
18+
accumulator: GroupItem<TItem>[],
19+
item: GroupItem<TItem>,
20+
) => {
21+
const items = item.items?.map((value: TItem | GroupItem<TItem>): GroupItem<TItem> => {
22+
let innerItem = value;
23+
if (!isObject(innerItem)) {
24+
// @ts-expect-error
25+
innerItem = { text: innerItem };
26+
hasSimpleItems = true;
27+
}
28+
29+
const objectItem = innerItem as Partial<GroupItem<TItem>>;
30+
31+
if (!(groupKey in objectItem)) {
32+
objectItem[groupKey] = item.key;
33+
}
34+
35+
return objectItem as GroupItem<TItem>;
36+
}) ?? [];
37+
return accumulator.concat(items);
38+
}, []);
39+
40+
return {
41+
store: {
42+
type: 'array',
43+
data,
44+
},
45+
group: {
46+
selector: groupKey,
47+
// @ts-expect-error
48+
keepInitialKeyOrder: true,
49+
},
50+
searchExpr: hasSimpleItems ? 'text' : undefined,
51+
};
52+
}

packages/devextreme/js/__internal/ui/drop_down_editor/m_drop_down_list.ts

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import type { SingleMultipleAllOrNone } from '@js/common';
22
import eventsEngine from '@js/common/core/events/core/events_engine';
33
import { addNamespace } from '@js/common/core/events/utils';
44
import messageLocalization from '@js/common/core/localization/message';
5+
import type { GroupItem } from '@js/common/data';
56
import dataQuery from '@js/common/data/query';
67
import registerComponent from '@js/core/component_registrator';
78
import devices from '@js/core/devices';
@@ -22,15 +23,17 @@ import { each } from '@js/core/utils/iterator';
2223
import { getOuterHeight } from '@js/core/utils/size';
2324
import { isDefined, isObject, isWindow } from '@js/core/utils/type';
2425
import { getWindow } from '@js/core/utils/window';
26+
import type { DataSourceLike, DataSourceOptions } from '@js/data/data_source';
2527
import type { dxDropDownListOptions } from '@js/ui/drop_down_editor/ui.drop_down_list';
2628
import DataExpressionMixin from '@js/ui/editor/ui.data_expression';
29+
import type { Item } from '@js/ui/list';
2730
import type { Properties as PopupProperties } from '@js/ui/popup';
2831
import errors from '@js/ui/widget/ui.errors';
2932
import type { OptionChanged } from '@ts/core/widget/types';
33+
import { getDataSourceOptions } from '@ts/data/data_converter/grouped';
3034
import DropDownEditor from '@ts/ui/drop_down_editor/m_drop_down_editor';
3135
import type { ListBaseProperties } from '@ts/ui/list/list.base';
3236
import List from '@ts/ui/list/list.edit.search';
33-
import DataConverterMixin from '@ts/ui/shared/m_grouped_data_converter_mixin';
3437

3538
const window = getWindow();
3639

@@ -87,8 +90,11 @@ class DropDownList<
8790
tab(e): void {
8891
if (this._allowSelectItemByTab()) {
8992
this._saveValueChangeEvent(e);
90-
const $focusedItem = $(this._list.option('focusedElement'));
91-
$focusedItem.length && this._setSelectedElement($focusedItem);
93+
const { focusedElement } = this._list.option();
94+
const $focusedItem = $(focusedElement);
95+
if ($focusedItem.length) {
96+
this._setSelectedElement($focusedItem);
97+
}
9298
}
9399

94100
parentSupportedKeys.tab(e);
@@ -381,7 +387,8 @@ class DropDownList<
381387

382388
_getPlainItems(items?) {
383389
let plainItems: any = [];
384-
const grouped = this._getGroupedOption();
390+
391+
const { grouped } = this.option();
385392

386393
items = items || this.option('items') || this._dataSource.items() || [];
387394

@@ -642,8 +649,17 @@ class DropDownList<
642649
};
643650
}
644651

645-
_getGroupedOption() {
646-
return this.option('grouped');
652+
_getSpecificDataSourceOption(): DataSourceLike<Item>
653+
| DataSourceOptions<GroupItem<Item>>
654+
| null
655+
| undefined {
656+
const { dataSource, grouped } = this.option();
657+
658+
if (dataSource && grouped) {
659+
return getDataSourceOptions(dataSource);
660+
}
661+
662+
return dataSource;
647663
}
648664

649665
_dataSourceFromUrlLoadMode(): string {
@@ -1038,7 +1054,7 @@ class DropDownList<
10381054
}
10391055

10401056
// @ts-expect-error ts-error
1041-
DropDownList.include(DataExpressionMixin, DataConverterMixin);
1057+
DropDownList.include(DataExpressionMixin);
10421058

10431059
registerComponent('dxDropDownList', DropDownList);
10441060

packages/devextreme/js/__internal/ui/list/list.base.ts

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import pointerEvents from '@js/common/core/events/pointer';
55
import { end as swipeEventEnd } from '@js/common/core/events/swipe';
66
import { addNamespace } from '@js/common/core/events/utils';
77
import messageLocalization from '@js/common/core/localization/message';
8-
import type { DataSourceOptions } from '@js/common/data';
8+
import type { DataSourceOptions, GroupItem } from '@js/common/data';
99
import devices from '@js/core/devices';
1010
import { getPublicElement } from '@js/core/element';
1111
import Guid from '@js/core/guid';
@@ -22,6 +22,7 @@ import { each } from '@js/core/utils/iterator';
2222
import { getHeight, getOuterHeight, setHeight } from '@js/core/utils/size';
2323
import { isDefined, isPlainObject } from '@js/core/utils/type';
2424
import { hasWindow } from '@js/core/utils/window';
25+
import type { DataSourceLike } from '@js/data/data_source';
2526
import type { DxEvent, NativeEventInfo } from '@js/events';
2627
import Button from '@js/ui/button';
2728
import type {
@@ -38,6 +39,7 @@ import { render } from '@ts/core/utils/m_ink_ripple';
3839
import supportUtils from '@ts/core/utils/m_support';
3940
import type { OptionChanged } from '@ts/core/widget/types';
4041
import type { SupportedKeys } from '@ts/core/widget/widget';
42+
import { getDataSourceOptions } from '@ts/data/data_converter/grouped';
4143
import type {
4244
CollectionItemInfo,
4345
CollectionItemKey,
@@ -46,6 +48,7 @@ import type {
4648
InkRippleEvent,
4749
PostprocessRenderItemInfo,
4850
} from '@ts/ui/collection/collection_widget.base';
51+
import type { CollectionItemIndex } from '@ts/ui/collection/collection_widget.edit.strategy';
4952
import type { CollectionWidgetLiveUpdateProperties } from '@ts/ui/collection/collection_widget.live_update';
5053
import CollectionWidget from '@ts/ui/collection/collection_widget.live_update';
5154
import ListItem from '@ts/ui/list/item';
@@ -57,9 +60,6 @@ import ScrollView from '@ts/ui/scroll_view/scroll_view';
5760
import { deviceDependentOptions } from '@ts/ui/scroll_view/scrollable.device';
5861
import type { ScrollOffset } from '@ts/ui/scroll_view/types';
5962
import { getElementMargin } from '@ts/ui/scroll_view/utils/get_element_style';
60-
import DataConverterMixin from '@ts/ui/shared/m_grouped_data_converter_mixin';
61-
62-
import type { CollectionItemIndex } from '../collection/collection_widget.edit.strategy';
6363

6464
const LIST_CLASS = 'dx-list';
6565
const LIST_ITEMS_CLASS = 'dx-list-items';
@@ -545,10 +545,17 @@ export class ListBase extends CollectionWidget<ListBaseProperties, Item> {
545545
};
546546
}
547547

548-
_getGroupedOption(): boolean | undefined {
549-
const { grouped } = this.option();
548+
_getSpecificDataSourceOption(): DataSourceLike<Item>
549+
| DataSourceOptions<GroupItem<Item>>
550+
| null
551+
| undefined {
552+
const { dataSource, grouped } = this.option();
553+
554+
if (dataSource && grouped) {
555+
return getDataSourceOptions<Item>(dataSource);
556+
}
550557

551-
return grouped;
558+
return dataSource;
552559
}
553560

554561
_getGroupContainerByIndex(groupIndex: number): dxElementWrapper {
@@ -1502,5 +1509,3 @@ export class ListBase extends CollectionWidget<ListBaseProperties, Item> {
15021509
this.updateDimensions();
15031510
}
15041511
}
1505-
// @ts-expect-error ts-error
1506-
ListBase.include(DataConverterMixin);

packages/devextreme/js/__internal/ui/shared/m_grouped_data_converter_mixin.ts

Lines changed: 0 additions & 49 deletions
This file was deleted.

0 commit comments

Comments
 (0)