@@ -46,19 +46,22 @@ const DX_ICON_WITH_URL_CLASS = 'dx-icon-with-url';
4646const ITEM_URL_CLASS = 'dx-item-url' ;
4747const DX_MENU_ITEM_DATA_KEY = 'dxMenuItemDataKey' ;
4848
49- type ItemClickEvent =
50- NativeEventInfo < dxMenuBase < MenuBaseProperties > , MouseEvent | PointerEvent | TouchEvent >
51- & ItemInfo < dxMenuBaseItem > ;
49+ type ItemClickEvent < TComponent , TItem > =
50+ NativeEventInfo < TComponent , MouseEvent | PointerEvent | TouchEvent >
51+ & ItemInfo < TItem > ;
5252export type HoverEvent = DxEvent < MouseEvent | PointerEvent > ;
5353export type ClickEvent = DxEvent < MouseEvent | PointerEvent | TouchEvent > ;
54- export type ItemClickActionArguments = ActionArguments <
55- dxMenuBase < MenuBaseProperties > ,
56- ItemClickEvent
54+ export type ItemClickActionArguments <
55+ TComponent extends dxMenuBase < MenuBaseProperties > = dxMenuBase < MenuBaseProperties > ,
56+ TItem extends dxMenuBaseItem = dxMenuBaseItem ,
57+ > = ActionArguments <
58+ TComponent ,
59+ ItemClickEvent < TComponent , TItem >
5760> ;
5861type MenuBaseNode = InternalNode & dxMenuBaseItem ;
5962
6063export interface MenuBaseProperties <
61- TItem extends dxMenuBaseItem = Item ,
64+ TItem extends dxMenuBaseItem = dxMenuBaseItem ,
6265 // @ts -expect-error ts-error
6366> extends dxMenuBaseOptions < MenuBase , TItem > {
6467 focusedElement ?: Element | null ;
@@ -272,7 +275,7 @@ class MenuBase<
272275 return ;
273276 }
274277
275- const node : Item | null = this . _dataAdapter . getNodeByKey ( selectedKey ) ;
278+ const node : MenuBaseNode | null = this . _dataAdapter . getNodeByKey ( selectedKey ) ;
276279
277280 if ( ! node || node . selectable === false ) {
278281 return ;
@@ -412,9 +415,8 @@ class MenuBase<
412415 return delay ;
413416 }
414417
415- // TODO: try to simplify
416418 _getItemElementByEventArgs (
417- eventArgs : HoverEvent | ClickEvent ,
419+ eventArgs : DxEvent ,
418420 ) : dxElementWrapper | null {
419421 let $target = $ ( eventArgs . target ) ;
420422
@@ -631,6 +633,10 @@ class MenuBase<
631633 e . _skipHandling = true ;
632634 }
633635
636+ _isUrlItem ( item : Item | dxMenuBaseItem | undefined ) : item is Item {
637+ return ! ! item && 'url' in item && ! ! item . url ;
638+ }
639+
634640 _itemClick ( actionArgs : ItemClickActionArguments ) : void {
635641 const { event, itemData } = actionArgs . args ?. [ 0 ] ?? { } ;
636642
@@ -641,7 +647,7 @@ class MenuBase<
641647 const $itemElement = this . _getItemElementByEventArgs ( event ) ;
642648 const link = $itemElement ?. find ( `.${ ITEM_URL_CLASS } ` ) [ 0 ] ;
643649
644- if ( ! itemData ?. url || ! link ) {
650+ if ( ! this . _isUrlItem ( itemData ) || ! link ) {
645651 return ;
646652 }
647653
@@ -667,7 +673,7 @@ class MenuBase<
667673 }
668674
669675 _updateSelectedItemOnClick ( actionArgs : ItemClickActionArguments ) : void {
670- const args : ItemClickEvent = actionArgs . args ? actionArgs . args [ 0 ] : actionArgs ;
676+ const args = actionArgs . args ? actionArgs . args [ 0 ] : actionArgs ;
671677
672678 const { itemData } = args ;
673679
@@ -793,7 +799,9 @@ class MenuBase<
793799 }
794800
795801 selectItem ( itemElement : Element | dxMenuBaseItem ) : void {
796- const itemData = itemElement . nodeType ? this . _getItemData ( itemElement as Element ) : itemElement ;
802+ const isElement = ( item : Element | dxMenuBaseItem ) : item is Element => typeof item === 'object' && 'nodeType' in item && ! ! item . nodeType ;
803+
804+ const itemData = isElement ( itemElement ) ? this . _getItemData ( itemElement ) : itemElement ;
797805 const selectedKey = this . _dataAdapter . getSelectedNodesKeys ( ) [ 0 ] ;
798806 const selectedItem = this . option ( 'selectedItem' ) ;
799807 const node = this . _dataAdapter . getNodeByItem ( itemData ) ;
0 commit comments