Skip to content

Commit 212ab38

Browse files
TreeView: extend dts types to specify the type of custom item (#30407)
Co-authored-by: Mikhail Preyskurantov <[email protected]>
1 parent 9661fd2 commit 212ab38

File tree

5 files changed

+248
-209
lines changed

5 files changed

+248
-209
lines changed

packages/devextreme-angular/src/ui/tree-view/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,8 @@ import { DxiTreeViewItemComponent } from 'devextreme-angular/ui/tree-view/nested
7575
IterableDifferHelper
7676
]
7777
})
78-
export class DxTreeViewComponent<TKey = any> extends DxComponent implements OnDestroy, OnChanges, DoCheck {
79-
instance: DxTreeView<TKey> = null;
78+
export class DxTreeViewComponent<TItem = any, TKey = any> extends DxComponent implements OnDestroy, OnChanges, DoCheck {
79+
instance: DxTreeView<TItem, TKey> = null;
8080

8181
/**
8282
* [descr:WidgetOptions.accessKey]

packages/devextreme-react/src/tree-view.ts

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,34 +19,34 @@ type ReplaceFieldTypes<TSource, TReplacement> = {
1919
[P in keyof TSource]: P extends keyof TReplacement ? TReplacement[P] : TSource[P];
2020
}
2121

22-
type ITreeViewOptionsNarrowedEvents<TKey = any> = {
23-
onContentReady?: ((e: ContentReadyEvent<TKey>) => void);
24-
onDisposing?: ((e: DisposingEvent<TKey>) => void);
25-
onInitialized?: ((e: InitializedEvent<TKey>) => void);
26-
onItemClick?: ((e: ItemClickEvent<TKey>) => void);
27-
onItemCollapsed?: ((e: ItemCollapsedEvent<TKey>) => void);
28-
onItemContextMenu?: ((e: ItemContextMenuEvent<TKey>) => void);
29-
onItemExpanded?: ((e: ItemExpandedEvent<TKey>) => void);
30-
onItemHold?: ((e: ItemHoldEvent<TKey>) => void);
31-
onItemRendered?: ((e: ItemRenderedEvent<TKey>) => void);
32-
onSelectAllValueChanged?: ((e: SelectAllValueChangedEvent<TKey>) => void);
22+
type ITreeViewOptionsNarrowedEvents<TItem = any, TKey = any> = {
23+
onContentReady?: ((e: ContentReadyEvent<TItem, TKey>) => void);
24+
onDisposing?: ((e: DisposingEvent<TItem, TKey>) => void);
25+
onInitialized?: ((e: InitializedEvent<TItem, TKey>) => void);
26+
onItemClick?: ((e: ItemClickEvent<TItem, TKey>) => void);
27+
onItemCollapsed?: ((e: ItemCollapsedEvent<TItem, TKey>) => void);
28+
onItemContextMenu?: ((e: ItemContextMenuEvent<TItem, TKey>) => void);
29+
onItemExpanded?: ((e: ItemExpandedEvent<TItem, TKey>) => void);
30+
onItemHold?: ((e: ItemHoldEvent<TItem, TKey>) => void);
31+
onItemRendered?: ((e: ItemRenderedEvent<TItem, TKey>) => void);
32+
onSelectAllValueChanged?: ((e: SelectAllValueChangedEvent<TItem, TKey>) => void);
3333
}
3434

35-
type ITreeViewOptions<TKey = any> = React.PropsWithChildren<ReplaceFieldTypes<Properties<TKey>, ITreeViewOptionsNarrowedEvents<TKey>> & IHtmlOptions & {
36-
dataSource?: Properties<TKey>["dataSource"];
35+
type ITreeViewOptions<TItem = any, TKey = any> = React.PropsWithChildren<ReplaceFieldTypes<Properties<TItem, TKey>, ITreeViewOptionsNarrowedEvents<TItem, TKey>> & IHtmlOptions & {
36+
dataSource?: Properties<TItem, TKey>["dataSource"];
3737
itemRender?: (...params: any) => React.ReactNode;
3838
itemComponent?: React.ComponentType<any>;
3939
defaultItems?: Array<dxTreeViewItem>;
4040
onItemsChange?: (value: Array<dxTreeViewItem>) => void;
4141
}>
4242

43-
interface TreeViewRef<TKey = any> {
44-
instance: () => dxTreeView<TKey>;
43+
interface TreeViewRef<TItem = any, TKey = any> {
44+
instance: () => dxTreeView<TItem, TKey>;
4545
}
4646

4747
const TreeView = memo(
4848
forwardRef(
49-
<TKey = any>(props: React.PropsWithChildren<ITreeViewOptions<TKey>>, ref: ForwardedRef<TreeViewRef<TKey>>) => {
49+
<TItem = any, TKey = any>(props: React.PropsWithChildren<ITreeViewOptions<TItem, TKey>>, ref: ForwardedRef<TreeViewRef<TItem, TKey>>) => {
5050
const baseRef = useRef<ComponentRef>(null);
5151

5252
useImperativeHandle(ref, () => (
@@ -78,7 +78,7 @@ const TreeView = memo(
7878
]), []);
7979

8080
return (
81-
React.createElement(BaseComponent<React.PropsWithChildren<ITreeViewOptions<TKey>>>, {
81+
React.createElement(BaseComponent<React.PropsWithChildren<ITreeViewOptions<TItem, TKey>>>, {
8282
WidgetClass: dxTreeView,
8383
ref: baseRef,
8484
subscribableOptions,
@@ -91,7 +91,7 @@ const TreeView = memo(
9191
);
9292
},
9393
),
94-
) as <TKey = any>(props: React.PropsWithChildren<ITreeViewOptions<TKey>> & { ref?: Ref<TreeViewRef<TKey>> }) => ReactElement | null;
94+
) as <TItem = any, TKey = any>(props: React.PropsWithChildren<ITreeViewOptions<TItem, TKey>> & { ref?: Ref<TreeViewRef<TItem, TKey>> }) => ReactElement | null;
9595

9696

9797
// owners:

packages/devextreme/js/__internal/grids/new/grid_core/inferno_wrappers/tree_view.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,12 @@ import dxTreeView from '@js/ui/tree_view';
44

55
import { InfernoWrapper } from './widget_wrapper';
66

7-
export class TreeView extends InfernoWrapper<TreeViewProperties, dxTreeView> {
7+
export class TreeView<
8+
TItem extends TreeViewItemProperties = TreeViewItemProperties,
9+
> extends InfernoWrapper<
10+
TreeViewProperties,
11+
dxTreeView<TItem>
12+
> {
813
protected getComponentFabric(): typeof dxTreeView {
914
return dxTreeView;
1015
}
@@ -29,15 +34,15 @@ export class TreeView extends InfernoWrapper<TreeViewProperties, dxTreeView> {
2934
prevProps: TreeViewProperties,
3035
props: TreeViewProperties,
3136
): boolean {
32-
const oldItems = (prevProps.items ?? []).map(({ selected, ...restProps }) => restProps);
33-
const newItems = (props.items ?? []).map(({ selected, ...restProps }) => restProps);
37+
const oldItems = (prevProps.items ?? []).map(({ selected, ...restProps }: TItem) => restProps);
38+
const newItems = (props.items ?? []).map(({ selected, ...restProps }: TItem) => restProps);
3439

3540
const onlySelectionChanged = equalByValue(oldItems, newItems);
3641

3742
return onlySelectionChanged;
3843
}
3944

40-
private updateSelection(items: TreeViewItemProperties[]): void {
45+
private updateSelection(items: TItem[]): void {
4146
const treeView = this.component;
4247

4348
if (!treeView) {

0 commit comments

Comments
 (0)