Skip to content

Commit 7b8279a

Browse files
Collection.Edit & selection strategies, Collection.Async, Collection.LiveUpdate, Collection.Hierarchical: convert into ES6 classes
1 parent d0a88ea commit 7b8279a

36 files changed

+868
-687
lines changed

packages/devextreme/js/__internal/core/widget/component.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { getPathParts } from '@js/core/utils/data';
1919
import { extend } from '@js/core/utils/extend';
2020
import { name as publicComponentName } from '@js/core/utils/public_component';
2121
import { isDefined, isFunction, isPlainObject } from '@js/core/utils/type';
22-
import type { EventInfo, InitializedEventInfo } from '@js/events';
22+
import type { DxEvent, EventInfo, InitializedEventInfo } from '@js/events';
2323

2424
import type { OptionChanged } from './types';
2525

@@ -29,6 +29,15 @@ const getEventName = (actionName): string => actionName.charAt(2).toLowerCase()
2929

3030
const isInnerOption = (optionName): boolean => optionName.indexOf('_', 0) === 0;
3131

32+
export interface ActionConfig {
33+
beforeExecute?: (e: Record<string, unknown>) => void;
34+
afterExecute?: (e: Record<string, unknown>) => void;
35+
excludeValidators?: ('disabled' | 'readOnly')[];
36+
element?: Element;
37+
validatingTargetName?: string;
38+
category?: 'rendering';
39+
}
40+
3241
export interface Properties<TComponent> extends ComponentOptions<
3342
EventInfo<TComponent>,
3443
InitializedEventInfo<TComponent>,
@@ -350,7 +359,7 @@ export class Component<
350359
}
351360

352361
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
353-
_createAction(actionSource, config): (e) => void {
362+
_createAction(actionSource, config?: ActionConfig): (e) => void {
354363
// eslint-disable-next-line @typescript-eslint/init-declarations
355364
let action;
356365

@@ -373,7 +382,7 @@ export class Component<
373382

374383
_createActionByOption(
375384
optionName: string,
376-
config?: Record<string, unknown>,
385+
config?: ActionConfig,
377386
): (event?: Record<string, unknown>) => void {
378387
// eslint-disable-next-line @typescript-eslint/init-declarations
379388
let action;

packages/devextreme/js/__internal/scheduler/appointments/m_appointment_collection.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ const COMPONENT_CLASS = 'dx-scheduler-scrollable-appointments';
4242
const DBLCLICK_EVENT_NAME = addNamespace(dblclickEvent, 'dxSchedulerAppointment');
4343

4444
const toMs = dateUtils.dateToMilliseconds;
45-
45+
// @ts-expect-error
4646
class SchedulerAppointments extends CollectionWidget {
4747
_virtualAppointments: any;
4848

packages/devextreme/js/__internal/ui/chat/chat.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,16 @@ import type {
1515
} from '@js/ui/chat';
1616
import type { OptionChanged } from '@ts/core/widget/types';
1717
import Widget from '@ts/core/widget/widget';
18-
19-
import AlertList from './alertlist';
18+
import AlertList from '@ts/ui/chat/alertlist';
2019
import type {
2120
MessageEnteredEvent as MessageBoxMessageEnteredEvent,
2221
Properties as MessageBoxProperties,
2322
TypingStartEvent as MessageBoxTypingStartEvent,
24-
} from './messagebox';
25-
import MessageBox from './messagebox';
26-
import type { Change, MessageTemplate, Properties as MessageListProperties } from './messagelist';
27-
import MessageList from './messagelist';
23+
} from '@ts/ui/chat/messagebox';
24+
import MessageBox from '@ts/ui/chat/messagebox';
25+
import type { MessageTemplate, Properties as MessageListProperties } from '@ts/ui/chat/messagelist';
26+
import MessageList from '@ts/ui/chat/messagelist';
27+
import type { DataChange } from '@ts/ui/collection/collection_widget.base';
2828

2929
const CHAT_CLASS = 'dx-chat';
3030
const TEXTEDITOR_INPUT_CLASS = 'dx-texteditor-input';
@@ -84,7 +84,10 @@ class Chat extends Widget<Properties> {
8484
this.option('items', []);
8585
}
8686

87-
_dataSourceChangedHandler(newItems: Message[], e?: { changes?: Change[] }): void {
87+
_dataSourceChangedHandler(
88+
newItems: Message[],
89+
e?: { changes?: DataChange<Message, number | string>[] },
90+
): void {
8891
if (e?.changes) {
8992
this._messageList._modifyByChanges(e.changes);
9093

packages/devextreme/js/__internal/ui/chat/messagelist.ts

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@ import { Guid } from '@js/common';
22
import type { Format } from '@js/common/core/localization';
33
import dateLocalization from '@js/common/core/localization/date';
44
import messageLocalization from '@js/common/core/localization/message';
5-
import type {
6-
DeepPartial,
7-
} from '@js/core/index';
85
import type { dxElementWrapper } from '@js/core/renderer';
96
import $ from '@js/core/renderer';
107
import resizeObserverSingleton from '@js/core/resize_observer';
@@ -21,6 +18,7 @@ import type { OptionChanged } from '@ts/core/widget/types';
2118
import Widget from '@ts/core/widget/widget';
2219
import { getScrollTopMax } from '@ts/ui/scroll_view/utils/get_scroll_top_max';
2320

21+
import type { DataChange } from '../collection/collection_widget.base';
2422
import { isElementVisible } from '../splitter/utils/layout';
2523
import MessageBubble, { CHAT_MESSAGEBUBBLE_CLASS } from './messagebubble';
2624
import type { MessageGroupAlignment } from './messagegroup';
@@ -50,13 +48,6 @@ const SCROLLABLE_CONTAINER_CLASS = 'dx-scrollable-container';
5048
export const MESSAGEGROUP_TIMEOUT = 5 * 1000 * 60;
5149

5250
export type MessageTemplate = ((data: Message, messageBubbleContainer: Element) => void) | null;
53-
54-
export interface Change {
55-
type: 'insert' | 'update' | 'remove';
56-
data?: DeepPartial<Message>;
57-
key?: string | number;
58-
index?: number;
59-
}
6051
export interface Properties extends WidgetOptions<MessageList> {
6152
items: Message[];
6253
currentUserId: number | string | undefined;
@@ -624,7 +615,7 @@ class MessageList extends Widget<Properties> {
624615
super._clean();
625616
}
626617

627-
_modifyByChanges(changes: Change[]): void {
618+
_modifyByChanges(changes: DataChange<Message, number | string>[]): void {
628619
changes.forEach((change) => {
629620
switch (change.type) {
630621
case 'update':

packages/devextreme/js/__internal/ui/collection/async.ts

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

packages/devextreme/js/__internal/ui/collection/collection_widget.base.ts

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ import messageLocalization from '@js/common/core/localization/message';
99
import Action from '@js/core/action';
1010
import domAdapter from '@js/core/dom_adapter';
1111
import Guid from '@js/core/guid';
12+
import type {
13+
DeepPartial,
14+
} from '@js/core/index';
1215
import type { dxElementWrapper } from '@js/core/renderer';
1316
import $ from '@js/core/renderer';
1417
import { BindableTemplate } from '@js/core/templates/bindable_template';
@@ -33,8 +36,10 @@ import type {
3336
import type { CollectionWidgetItem as CollectionWidgetItemProperties, CollectionWidgetOptions, ItemLike } from '@js/ui/collection/ui.collection_widget.base';
3437
import { focusable } from '@js/ui/widget/selectors';
3538
import { getPublicElement } from '@ts/core/m_element';
39+
import type { ActionConfig } from '@ts/core/widget/component';
3640
import type { OptionChanged } from '@ts/core/widget/types';
3741
import Widget from '@ts/core/widget/widget';
42+
import type CollectionItem from '@ts/ui/collection/m_item';
3843
import CollectionWidgetItem from '@ts/ui/collection/m_item';
3944

4045
const COLLECTION_CLASS = 'dx-collection';
@@ -62,10 +67,12 @@ const FOCUS_PAGE_DOWN = 'pagedown';
6267
const FOCUS_LAST = 'last';
6368
const FOCUS_FIRST = 'first';
6469

65-
interface ActionConfig {
66-
beforeExecute?: (e: DxEvent) => void;
67-
afterExecute?: (e: DxEvent) => void;
68-
excludeValidators?: ('disabled' | 'readOnly')[];
70+
export type DataChangeType = 'insert' | 'update' | 'remove';
71+
72+
export interface DataChange<TItem = CollectionItem, TKey = number | string> {
73+
key: TKey;
74+
type: DataChangeType;
75+
data: DeepPartial<TItem>;
6976
}
7077

7178
type ItemTemplate<TItem> = template | (
@@ -77,8 +84,17 @@ export interface ItemRenderInfo<TItem> {
7784
container: dxElementWrapper;
7885
contentClass: string;
7986
defaultTemplateName: ItemTemplate<TItem> | undefined;
87+
uniqueKey?: string;
8088
templateProperty?: string;
8189
}
90+
91+
export interface PostprocessRenderItemInfo<TItem> {
92+
itemElement: dxElementWrapper;
93+
itemContent: dxElementWrapper;
94+
itemData: TItem;
95+
itemIndex: number;
96+
}
97+
8298
export interface CollectionWidgetBaseProperties<
8399
// eslint-disable-next-line @typescript-eslint/no-explicit-any
84100
TComponent extends CollectionWidget<any, TItem, TKey> | any,
@@ -617,7 +633,7 @@ class CollectionWidget<
617633
property: string,
618634
value: unknown,
619635
// eslint-disable-next-line @typescript-eslint/no-unused-vars
620-
prevValue: unknown,
636+
prevValue?: unknown,
621637
): void {
622638
const $item = this._findItemElementByItem(item);
623639
if (!$item.length) {
@@ -761,7 +777,11 @@ class CollectionWidget<
761777
this._startIndexForAppendedItems = null;
762778
}
763779

764-
_dataSourceChangedHandler(newItems: TItem[]): void {
780+
_dataSourceChangedHandler(
781+
newItems: TItem[],
782+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
783+
e?: { changes?: DataChange<TItem>[] },
784+
): void {
765785
const items = this.option('items');
766786
if (this._initialized && items && this._shouldAppendItems()) {
767787
// @ts-expect-error ts-error
@@ -1081,7 +1101,6 @@ class CollectionWidget<
10811101
_renderItems(items: TItem[]): void {
10821102
if (items.length) {
10831103
each(items, (index, itemData) => {
1084-
// @ts-expect-error ts-error
10851104
// eslint-disable-next-line @typescript-eslint/restrict-plus-operands
10861105
this._renderItem(this._renderedItemsCount + index, itemData);
10871106
});
@@ -1110,7 +1129,7 @@ class CollectionWidget<
11101129
_renderItem(
11111130
index: { group: number; item: number } | number,
11121131
itemData: TItem,
1113-
$container: dxElementWrapper | null,
1132+
$container?: dxElementWrapper | null,
11141133
$itemToReplace?: dxElementWrapper,
11151134
): dxElementWrapper {
11161135
// @ts-expect-error ts-error
@@ -1264,12 +1283,7 @@ class CollectionWidget<
12641283
// eslint-disable-next-line class-methods-use-this
12651284
_postprocessRenderItem(
12661285
// eslint-disable-next-line @typescript-eslint/no-unused-vars
1267-
args: {
1268-
itemElement: dxElementWrapper;
1269-
itemContent: dxElementWrapper;
1270-
itemData: TItem;
1271-
itemIndex: number;
1272-
},
1286+
args: PostprocessRenderItemInfo<TItem>,
12731287
): void {}
12741288

12751289
_executeItemRenderAction(

packages/devextreme/js/__internal/ui/collection/edit.ts

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

packages/devextreme/js/__internal/ui/collection/hierarchical.ts

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

packages/devextreme/js/__internal/ui/collection/live_update.ts

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

0 commit comments

Comments
 (0)