99 useEdgesState ,
1010 MarkerType ,
1111 Position ,
12+ NodeProps ,
1213} from 'reactflow' ;
1314import styles from './Graph.module.css' ;
1415import dagre from 'dagre' ;
@@ -21,14 +22,14 @@ import { NodeData, ManagedResourceGroup, ManagedResourceItem } from './types';
2122import CustomNode from './CustomNode' ;
2223import { Legend } from './Legend' ;
2324import { extractRefs , generateColorMap , getStatusFromConditions , resolveProviderType } from './graphUtils' ;
25+ import { YamlViewDialog } from '../Yaml/YamlViewDialog' ;
26+ import YamlViewer from '../Yaml/YamlViewer' ;
27+ import { stringify } from 'yaml' ;
28+ import { removeManagedFieldsProperty } from '../../utils/removeManagedFieldsProperty' ;
2429
2530const nodeWidth = 250 ;
2631const nodeHeight = 60 ;
2732
28- const nodeTypes = {
29- custom : CustomNode ,
30- } ;
31-
3233function buildGraph (
3334 treeData : NodeData [ ] ,
3435 colorBy : 'provider' | 'source' ,
@@ -106,6 +107,28 @@ const Graph: React.FC = () => {
106107 const [ edges , setEdges ] = useEdgesState < Edge [ ] > ( [ ] ) ;
107108 const [ colorBy , setColorBy ] = useState < 'provider' | 'source' > ( 'provider' ) ;
108109
110+ const [ yamlDialogOpen , setYamlDialogOpen ] = useState ( false ) ;
111+ const [ yamlResource , setYamlResource ] = useState < ManagedResourceItem | null > ( null ) ;
112+
113+ const handleYamlClick = ( item : ManagedResourceItem ) => {
114+ setYamlResource ( item ) ;
115+ setYamlDialogOpen ( true ) ;
116+ } ;
117+
118+ const nodeTypes = {
119+ custom : ( props : NodeProps < NodeData > ) => < CustomNode { ...props } onYamlClick = { handleYamlClick } /> ,
120+ } ;
121+
122+ const yamlString = useMemo (
123+ ( ) => ( yamlResource ? stringify ( removeManagedFieldsProperty ( yamlResource ) ) : '' ) ,
124+ [ yamlResource ] ,
125+ ) ;
126+ const yamlFilename = useMemo ( ( ) => {
127+ if ( ! yamlResource ) return '' ;
128+ const { kind, metadata } = yamlResource ;
129+ return `${ kind ?? '' } ${ metadata ?. name ? '_' : '' } ${ metadata ?. name ?? '' } ` ;
130+ } , [ yamlResource ] ) ;
131+
109132 const treeData = useMemo ( ( ) => {
110133 const allNodesMap = new Map < string , NodeData > ( ) ;
111134 if ( managedResources ) {
@@ -249,13 +272,20 @@ const Graph: React.FC = () => {
249272 nodesDraggable = { false }
250273 nodesConnectable = { false }
251274 elementsSelectable = { false }
252- zoomOnScroll = { false }
275+ zoomOnScroll = { true }
253276 panOnDrag = { true }
254277 >
255278 < Controls />
256279 < Background />
257280 </ ReactFlow >
258281 </ div >
282+ { yamlDialogOpen && yamlResource && (
283+ < YamlViewDialog
284+ isOpen = { yamlDialogOpen }
285+ setIsOpen = { setYamlDialogOpen }
286+ dialogContent = { < YamlViewer yamlString = { yamlString } filename = { yamlFilename } /> }
287+ />
288+ ) }
259289 < Legend nodes = { nodes . map ( ( n ) => n . data as NodeData ) } colorBy = { colorBy } generateColorMap = { generateColorMap } />
260290 </ div >
261291 ) ;
0 commit comments