@@ -3,31 +3,52 @@ import React, { useCallback, useRef, useState } from 'react';
33import { TreeView } from 'devextreme-react/tree-view' ;
44import type { TreeViewTypes , TreeViewRef } from 'devextreme-react/tree-view' ;
55import { ContextMenu } from 'devextreme-react/context-menu' ;
6- import type { ContextMenuTypes , ContextMenuRef } from 'devextreme-react/context-menu' ;
6+ import type { ContextMenuTypes } from 'devextreme-react/context-menu' ;
77import List from 'devextreme-react/list' ;
88
99import { products , menuItems } from './data.ts' ;
10- import type { Product } from './types' ;
10+ import type { Product , MenuItem } from './types' ;
1111
1212const App = ( ) => {
13- const contextMenuRef = useRef < ContextMenuRef > ( null ) ;
14- const treeViewRef = useRef < TreeViewRef > ( null ) ;
13+ const [ contextMenuItems , setContextMenuItems ] = useState < MenuItem [ ] > ( [ ...menuItems ] ) ;
1514 const [ logItems , setLogItems ] = useState < string [ ] > ( [ ] ) ;
1615 const [ selectedTreeItem , setSelectedTreeItem ] = useState < Product | undefined > ( undefined ) ;
16+ const treeViewRef = useRef < TreeViewRef > ( null ) ;
1717
1818 const treeViewItemContextMenu = useCallback ( (
1919 e : TreeViewTypes . ItemContextMenuEvent < Product > ,
20- ) => {
20+ ) : void => {
2121 setSelectedTreeItem ( e . itemData ) ;
2222
2323 const isProductItem = ! e . itemData ?. items ;
24- contextMenuRef . current ?. instance ( ) . option ( 'items[0].visible' , ! isProductItem ) ;
25- contextMenuRef . current ?. instance ( ) . option ( 'items[1].visible' , ! isProductItem ) ;
26- contextMenuRef . current ?. instance ( ) . option ( 'items[2].visible' , isProductItem ) ;
27- contextMenuRef . current ?. instance ( ) . option ( 'items[3].visible' , isProductItem ) ;
24+ const isExpanded = e . node ?. expanded ;
25+ setContextMenuItems ( ( prev : MenuItem [ ] ) : MenuItem [ ] => prev . map ( ( item : MenuItem , index : number ) : MenuItem => {
26+ switch ( index ) {
27+ case 0 :
28+ return {
29+ ...item ,
30+ visible : ! isProductItem ,
31+ disabled : isExpanded ,
32+ } ;
2833
29- contextMenuRef . current ?. instance ( ) . option ( 'items[0].disabled' , e . node ?. expanded ) ;
30- contextMenuRef . current ?. instance ( ) . option ( 'items[1].disabled' , ! e . node ?. expanded ) ;
34+ case 1 :
35+ return {
36+ ...item ,
37+ visible : ! isProductItem ,
38+ disabled : ! isExpanded ,
39+ } ;
40+
41+ case 2 :
42+ case 3 :
43+ return {
44+ ...item ,
45+ visible : isProductItem ,
46+ } ;
47+
48+ default :
49+ return item ;
50+ }
51+ } ) ) ;
3152 } , [ ] ) ;
3253
3354 const contextMenuItemClick = useCallback ( (
@@ -84,8 +105,7 @@ const App = () => {
84105 />
85106 </ div >
86107 < ContextMenu
87- ref = { contextMenuRef }
88- dataSource = { menuItems }
108+ dataSource = { contextMenuItems }
89109 target = "#treeview .dx-treeview-item"
90110 onItemClick = { contextMenuItemClick }
91111 />
0 commit comments