Skip to content

Commit 9a01b31

Browse files
Menu & ContextMenu: dts allow customize menu item type (DevExpress#30608)
Co-authored-by: EugeniyKiyashko <[email protected]>
1 parent a19b9a4 commit 9a01b31

File tree

21 files changed

+461
-362
lines changed

21 files changed

+461
-362
lines changed

packages/devextreme-angular/src/ui/context-menu/index.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,8 @@ import { DxiContextMenuItemComponent } from 'devextreme-angular/ui/context-menu/
9898
IterableDifferHelper
9999
]
100100
})
101-
export class DxContextMenuComponent<TKey = any> extends DxComponent implements OnDestroy, OnChanges, DoCheck {
102-
instance: DxContextMenu<TKey> = null;
101+
export class DxContextMenuComponent<TItem = any, TKey = any> extends DxComponent implements OnDestroy, OnChanges, DoCheck {
102+
instance: DxContextMenu<TItem, TKey> = null;
103103

104104
/**
105105
* [descr:WidgetOptions.accessKey]
@@ -288,10 +288,10 @@ export class DxContextMenuComponent<TKey = any> extends DxComponent implements O
288288
289289
*/
290290
@Input()
291-
get items(): Array<dxContextMenuItem> {
291+
get items(): Array<any | dxContextMenuItem> {
292292
return this._getOption('items');
293293
}
294-
set items(value: Array<dxContextMenuItem>) {
294+
set items(value: Array<any | dxContextMenuItem>) {
295295
this._setOption('items', value);
296296
}
297297

@@ -697,7 +697,7 @@ export class DxContextMenuComponent<TKey = any> extends DxComponent implements O
697697
* This member supports the internal infrastructure and is not intended to be used directly from your code.
698698
699699
*/
700-
@Output() itemsChange: EventEmitter<Array<dxContextMenuItem>>;
700+
@Output() itemsChange: EventEmitter<Array<any | dxContextMenuItem>>;
701701

702702
/**
703703

packages/devextreme-angular/src/ui/menu/index.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,8 @@ import { DxiMenuItemComponent } from 'devextreme-angular/ui/menu/nested';
9797
IterableDifferHelper
9898
]
9999
})
100-
export class DxMenuComponent<TKey = any> extends DxComponent implements OnDestroy, OnChanges, DoCheck {
101-
instance: DxMenu<TKey> = null;
100+
export class DxMenuComponent<TItem = any, TKey = any> extends DxComponent implements OnDestroy, OnChanges, DoCheck {
101+
instance: DxMenu<TItem, TKey> = null;
102102

103103
/**
104104
* [descr:WidgetOptions.accessKey]
@@ -300,10 +300,10 @@ export class DxMenuComponent<TKey = any> extends DxComponent implements OnDestro
300300
301301
*/
302302
@Input()
303-
get items(): Array<dxMenuItem> {
303+
get items(): Array<any | dxMenuItem> {
304304
return this._getOption('items');
305305
}
306-
set items(value: Array<dxMenuItem>) {
306+
set items(value: Array<any | dxMenuItem>) {
307307
this._setOption('items', value);
308308
}
309309

@@ -695,7 +695,7 @@ export class DxMenuComponent<TKey = any> extends DxComponent implements OnDestro
695695
* This member supports the internal infrastructure and is not intended to be used directly from your code.
696696
697697
*/
698-
@Output() itemsChange: EventEmitter<Array<dxMenuItem>>;
698+
@Output() itemsChange: EventEmitter<Array<any | dxMenuItem>>;
699699

700700
/**
701701

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -369,10 +369,10 @@ export class DxTreeViewComponent<TItem = any, TKey = any> extends DxComponent im
369369
370370
*/
371371
@Input()
372-
get items(): Array<dxTreeViewItem> {
372+
get items(): Array<any | dxTreeViewItem> {
373373
return this._getOption('items');
374374
}
375-
set items(value: Array<dxTreeViewItem>) {
375+
set items(value: Array<any | dxTreeViewItem>) {
376376
this._setOption('items', value);
377377
}
378378

@@ -964,7 +964,7 @@ export class DxTreeViewComponent<TItem = any, TKey = any> extends DxComponent im
964964
* This member supports the internal infrastructure and is not intended to be used directly from your code.
965965
966966
*/
967-
@Output() itemsChange: EventEmitter<Array<dxTreeViewItem>>;
967+
@Output() itemsChange: EventEmitter<Array<any | dxTreeViewItem>>;
968968

969969
/**
970970

packages/devextreme-react/src/context-menu.ts

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

21-
type IContextMenuOptionsNarrowedEvents<TKey = any> = {
22-
onContentReady?: ((e: ContentReadyEvent<TKey>) => void);
23-
onDisposing?: ((e: DisposingEvent<TKey>) => void);
24-
onHidden?: ((e: HiddenEvent<TKey>) => void);
25-
onHiding?: ((e: HidingEvent<TKey>) => void);
26-
onInitialized?: ((e: InitializedEvent<TKey>) => void);
27-
onItemClick?: ((e: ItemClickEvent<TKey>) => void);
28-
onItemContextMenu?: ((e: ItemContextMenuEvent<TKey>) => void);
29-
onItemRendered?: ((e: ItemRenderedEvent<TKey>) => void);
30-
onPositioning?: ((e: PositioningEvent<TKey>) => void);
31-
onShowing?: ((e: ShowingEvent<TKey>) => void);
32-
onShown?: ((e: ShownEvent<TKey>) => void);
21+
type IContextMenuOptionsNarrowedEvents<TItem = any, TKey = any> = {
22+
onContentReady?: ((e: ContentReadyEvent<TItem, TKey>) => void);
23+
onDisposing?: ((e: DisposingEvent<TItem, TKey>) => void);
24+
onHidden?: ((e: HiddenEvent<TItem, TKey>) => void);
25+
onHiding?: ((e: HidingEvent<TItem, TKey>) => void);
26+
onInitialized?: ((e: InitializedEvent<TItem, TKey>) => void);
27+
onItemClick?: ((e: ItemClickEvent<TItem, TKey>) => void);
28+
onItemContextMenu?: ((e: ItemContextMenuEvent<TItem, TKey>) => void);
29+
onItemRendered?: ((e: ItemRenderedEvent<TItem, TKey>) => void);
30+
onPositioning?: ((e: PositioningEvent<TItem, TKey>) => void);
31+
onShowing?: ((e: ShowingEvent<TItem, TKey>) => void);
32+
onShown?: ((e: ShownEvent<TItem, TKey>) => void);
3333
}
3434

35-
type IContextMenuOptions<TKey = any> = React.PropsWithChildren<ReplaceFieldTypes<Properties<TKey>, IContextMenuOptionsNarrowedEvents<TKey>> & IHtmlOptions & {
36-
dataSource?: Properties<TKey>["dataSource"];
35+
type IContextMenuOptions<TItem = any, TKey = any> = React.PropsWithChildren<ReplaceFieldTypes<Properties<TItem, TKey>, IContextMenuOptionsNarrowedEvents<TItem, TKey>> & IHtmlOptions & {
36+
dataSource?: Properties<TItem, TKey>["dataSource"];
3737
itemRender?: (...params: any) => React.ReactNode;
3838
itemComponent?: React.ComponentType<any>;
39-
defaultItems?: Array<dxContextMenuItem>;
39+
defaultItems?: Array<any | dxContextMenuItem>;
4040
defaultSelectedItem?: any;
4141
defaultVisible?: boolean;
42-
onItemsChange?: (value: Array<dxContextMenuItem>) => void;
42+
onItemsChange?: (value: Array<any | dxContextMenuItem>) => void;
4343
onSelectedItemChange?: (value: any) => void;
4444
onVisibleChange?: (value: boolean) => void;
4545
}>
4646

47-
interface ContextMenuRef<TKey = any> {
48-
instance: () => dxContextMenu<TKey>;
47+
interface ContextMenuRef<TItem = any, TKey = any> {
48+
instance: () => dxContextMenu<TItem, TKey>;
4949
}
5050

5151
const ContextMenu = memo(
5252
forwardRef(
53-
<TKey = any>(props: React.PropsWithChildren<IContextMenuOptions<TKey>>, ref: ForwardedRef<ContextMenuRef<TKey>>) => {
53+
<TItem = any, TKey = any>(props: React.PropsWithChildren<IContextMenuOptions<TItem, TKey>>, ref: ForwardedRef<ContextMenuRef<TItem, TKey>>) => {
5454
const baseRef = useRef<ComponentRef>(null);
5555

5656
useImperativeHandle(ref, () => (
@@ -87,7 +87,7 @@ const ContextMenu = memo(
8787
]), []);
8888

8989
return (
90-
React.createElement(BaseComponent<React.PropsWithChildren<IContextMenuOptions<TKey>>>, {
90+
React.createElement(BaseComponent<React.PropsWithChildren<IContextMenuOptions<TItem, TKey>>>, {
9191
WidgetClass: dxContextMenu,
9292
ref: baseRef,
9393
subscribableOptions,
@@ -100,7 +100,7 @@ const ContextMenu = memo(
100100
);
101101
},
102102
),
103-
) as <TKey = any>(props: React.PropsWithChildren<IContextMenuOptions<TKey>> & { ref?: Ref<ContextMenuRef<TKey>> }) => ReactElement | null;
103+
) as <TItem = any, TKey = any>(props: React.PropsWithChildren<IContextMenuOptions<TItem, TKey>> & { ref?: Ref<ContextMenuRef<TItem, TKey>> }) => ReactElement | null;
104104

105105

106106
// owners:

packages/devextreme-react/src/menu.ts

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

21-
type IMenuOptionsNarrowedEvents<TKey = any> = {
22-
onContentReady?: ((e: ContentReadyEvent<TKey>) => void);
23-
onDisposing?: ((e: DisposingEvent<TKey>) => void);
24-
onInitialized?: ((e: InitializedEvent<TKey>) => void);
25-
onItemClick?: ((e: ItemClickEvent<TKey>) => void);
26-
onItemContextMenu?: ((e: ItemContextMenuEvent<TKey>) => void);
27-
onItemRendered?: ((e: ItemRenderedEvent<TKey>) => void);
28-
onSubmenuHidden?: ((e: SubmenuHiddenEvent<TKey>) => void);
29-
onSubmenuHiding?: ((e: SubmenuHidingEvent<TKey>) => void);
30-
onSubmenuShowing?: ((e: SubmenuShowingEvent<TKey>) => void);
31-
onSubmenuShown?: ((e: SubmenuShownEvent<TKey>) => void);
21+
type IMenuOptionsNarrowedEvents<TItem = any, TKey = any> = {
22+
onContentReady?: ((e: ContentReadyEvent<TItem, TKey>) => void);
23+
onDisposing?: ((e: DisposingEvent<TItem, TKey>) => void);
24+
onInitialized?: ((e: InitializedEvent<TItem, TKey>) => void);
25+
onItemClick?: ((e: ItemClickEvent<TItem, TKey>) => void);
26+
onItemContextMenu?: ((e: ItemContextMenuEvent<TItem, TKey>) => void);
27+
onItemRendered?: ((e: ItemRenderedEvent<TItem, TKey>) => void);
28+
onSubmenuHidden?: ((e: SubmenuHiddenEvent<TItem, TKey>) => void);
29+
onSubmenuHiding?: ((e: SubmenuHidingEvent<TItem, TKey>) => void);
30+
onSubmenuShowing?: ((e: SubmenuShowingEvent<TItem, TKey>) => void);
31+
onSubmenuShown?: ((e: SubmenuShownEvent<TItem, TKey>) => void);
3232
}
3333

34-
type IMenuOptions<TKey = any> = React.PropsWithChildren<ReplaceFieldTypes<Properties<TKey>, IMenuOptionsNarrowedEvents<TKey>> & IHtmlOptions & {
35-
dataSource?: Properties<TKey>["dataSource"];
34+
type IMenuOptions<TItem = any, TKey = any> = React.PropsWithChildren<ReplaceFieldTypes<Properties<TItem, TKey>, IMenuOptionsNarrowedEvents<TItem, TKey>> & IHtmlOptions & {
35+
dataSource?: Properties<TItem, TKey>["dataSource"];
3636
itemRender?: (...params: any) => React.ReactNode;
3737
itemComponent?: React.ComponentType<any>;
38-
defaultItems?: Array<dxMenuItem>;
38+
defaultItems?: Array<any | dxMenuItem>;
3939
defaultSelectedItem?: any;
40-
onItemsChange?: (value: Array<dxMenuItem>) => void;
40+
onItemsChange?: (value: Array<any | dxMenuItem>) => void;
4141
onSelectedItemChange?: (value: any) => void;
4242
}>
4343

44-
interface MenuRef<TKey = any> {
45-
instance: () => dxMenu<TKey>;
44+
interface MenuRef<TItem = any, TKey = any> {
45+
instance: () => dxMenu<TItem, TKey>;
4646
}
4747

4848
const Menu = memo(
4949
forwardRef(
50-
<TKey = any>(props: React.PropsWithChildren<IMenuOptions<TKey>>, ref: ForwardedRef<MenuRef<TKey>>) => {
50+
<TItem = any, TKey = any>(props: React.PropsWithChildren<IMenuOptions<TItem, TKey>>, ref: ForwardedRef<MenuRef<TItem, TKey>>) => {
5151
const baseRef = useRef<ComponentRef>(null);
5252

5353
useImperativeHandle(ref, () => (
@@ -82,7 +82,7 @@ const Menu = memo(
8282
]), []);
8383

8484
return (
85-
React.createElement(BaseComponent<React.PropsWithChildren<IMenuOptions<TKey>>>, {
85+
React.createElement(BaseComponent<React.PropsWithChildren<IMenuOptions<TItem, TKey>>>, {
8686
WidgetClass: dxMenu,
8787
ref: baseRef,
8888
subscribableOptions,
@@ -95,7 +95,7 @@ const Menu = memo(
9595
);
9696
},
9797
),
98-
) as <TKey = any>(props: React.PropsWithChildren<IMenuOptions<TKey>> & { ref?: Ref<MenuRef<TKey>> }) => ReactElement | null;
98+
) as <TItem = any, TKey = any>(props: React.PropsWithChildren<IMenuOptions<TItem, TKey>> & { ref?: Ref<MenuRef<TItem, TKey>> }) => ReactElement | null;
9999

100100

101101
// owners:

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ type ITreeViewOptions<TItem = any, TKey = any> = React.PropsWithChildren<Replace
3636
dataSource?: Properties<TItem, TKey>["dataSource"];
3737
itemRender?: (...params: any) => React.ReactNode;
3838
itemComponent?: React.ComponentType<any>;
39-
defaultItems?: Array<dxTreeViewItem>;
40-
onItemsChange?: (value: Array<dxTreeViewItem>) => void;
39+
defaultItems?: Array<any | dxTreeViewItem>;
40+
onItemsChange?: (value: Array<any | dxTreeViewItem>) => void;
4141
}>
4242

4343
interface TreeViewRef<TItem = any, TKey = any> {

packages/devextreme-vue/src/context-menu.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ const componentConfig = {
114114
hideOnOutsideClick: [Boolean, Function] as PropType<boolean | (((event: event) => boolean))>,
115115
hint: String,
116116
hoverStateEnabled: Boolean,
117-
items: Array as PropType<Array<dxContextMenuItem>>,
117+
items: Array as PropType<Array<any | dxContextMenuItem>>,
118118
itemsExpr: [Function, String] as PropType<((() => void)) | string>,
119119
itemTemplate: {},
120120
onContentReady: Function as PropType<((e: ContentReadyEvent) => void)>,

packages/devextreme-vue/src/menu.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ const componentConfig = {
111111
hideSubmenuOnMouseLeave: Boolean,
112112
hint: String,
113113
hoverStateEnabled: Boolean,
114-
items: Array as PropType<Array<dxMenuItem>>,
114+
items: Array as PropType<Array<any | dxMenuItem>>,
115115
itemsExpr: [Function, String] as PropType<((() => void)) | string>,
116116
itemTemplate: {},
117117
onContentReady: Function as PropType<((e: ContentReadyEvent) => void)>,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ const componentConfig = {
167167
hint: String,
168168
hoverStateEnabled: Boolean,
169169
itemHoldTimeout: Number,
170-
items: Array as PropType<Array<dxTreeViewItem>>,
170+
items: Array as PropType<Array<any | dxTreeViewItem>>,
171171
itemsExpr: [Function, String] as PropType<((() => void)) | string>,
172172
itemTemplate: {},
173173
keyExpr: [Function, String] as PropType<((() => void)) | string>,

packages/devextreme/js/__internal/grids/grid_core/filter/m_filter_row.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -603,14 +603,12 @@ const columnHeadersView = (Base: ModuleType<ColumnHeadersView>) => class ColumnH
603603
}
604604
},
605605
onItemClick(properties) {
606-
// @ts-expect-error
607606
const selectedFilterOperation = properties.itemData.name;
608607
const columnSelectedFilterOperation = getColumnSelectedFilterOperation(that, column);
609608
let notFocusEditor = false;
610609
const isOnClickMode = isOnClickApplyFilterMode(that);
611610
const options = {};
612611

613-
// @ts-expect-error
614612
if (properties.itemData.items || (selectedFilterOperation && selectedFilterOperation === columnSelectedFilterOperation)) {
615613
return;
616614
}

0 commit comments

Comments
 (0)