11import React , { useState , useCallback , useMemo } from 'react' ;
2- import { ReactFlow , Background , Controls , MarkerType , Node } from '@xyflow/react' ;
2+ import { ReactFlow , Background , Controls , MarkerType , Node , Panel } from '@xyflow/react' ;
33import type { NodeProps } from '@xyflow/react' ;
44import { RadioButton , FlexBox , FlexBoxAlignItems } from '@ui5/webcomponents-react' ;
55import styles from './Graph.module.css' ;
66import '@xyflow/react/dist/style.css' ;
7- import { ManagedResourceItem , NodeData , ColorBy } from './types' ;
7+ import { NodeData , ColorBy } from './types' ;
88import CustomNode from './CustomNode' ;
99import { Legend , LegendItem } from './Legend' ;
1010import { YamlViewDialog } from '../Yaml/YamlViewDialog' ;
@@ -13,20 +13,25 @@ import { stringify } from 'yaml';
1313import { removeManagedFieldsProperty } from '../../utils/removeManagedFieldsProperty' ;
1414import { useTranslation } from 'react-i18next' ;
1515import { useGraph } from './useGraph' ;
16+ import { ManagedResourceItem } from '../../lib/shared/types' ;
17+ import { useTheme } from '../../hooks/useTheme' ;
1618
1719const nodeTypes = {
1820 custom : ( props : NodeProps < Node < NodeData , 'custom' > > ) => (
1921 < CustomNode
2022 label = { props . data . label }
2123 type = { props . data . type }
2224 status = { props . data . status }
25+ transitionTime = { props . data . transitionTime }
26+ statusMessage = { props . data . statusMessage }
2327 onYamlClick = { ( ) => props . data . onYamlClick ( props . data . item ) }
2428 />
2529 ) ,
2630} ;
2731
2832const Graph : React . FC = ( ) => {
2933 const { t } = useTranslation ( ) ;
34+ const { isDarkTheme } = useTheme ( ) ;
3035 const [ colorBy , setColorBy ] = useState < ColorBy > ( 'provider' ) ;
3136 const [ yamlDialogOpen , setYamlDialogOpen ] = useState ( false ) ;
3237 const [ yamlResource , setYamlResource ] = useState < ManagedResourceItem | null > ( null ) ;
@@ -51,11 +56,11 @@ const Graph: React.FC = () => {
5156
5257 const legendItems : LegendItem [ ] = useMemo (
5358 ( ) =>
54- Object . entries ( colorMap ) . map ( ( [ name , color ] ) => ( {
55- name : name === 'default' ? 'default' : name ,
56- color ,
57- } ) ) ,
58- [ colorMap ] ,
59+ Object . entries ( colorMap ) . map ( ( [ name , color ] ) => {
60+ const displayName = colorBy === 'flux' && ( name === 'default' || ! name ) ? t ( 'common.none' ) : name ;
61+ return { name : displayName , color } ;
62+ } ) ,
63+ [ colorMap , colorBy , t ] ,
5964 ) ;
6065
6166 if ( error ) {
@@ -71,26 +76,10 @@ const Graph: React.FC = () => {
7176 }
7277
7378 return (
74- < div className = { styles . graphContainer } >
79+ < div className = { styles . graphContainer } data-theme = { isDarkTheme ? 'dark' : 'light' } >
7580 < div className = { styles . graphColumn } >
76- < div className = { styles . graphHeader } >
77- < FlexBox alignItems = { FlexBoxAlignItems . Center } role = "radiogroup" >
78- < span className = { styles . colorizedTitle } > { t ( 'Graphs.colorizedTitle' ) } </ span >
79- < RadioButton
80- name = "colorBy"
81- text = { t ( 'Graphs.colorsProviderConfig' ) }
82- checked = { colorBy === 'provider' }
83- onChange = { ( ) => setColorBy ( 'provider' ) }
84- />
85- < RadioButton
86- name = "colorBy"
87- text = { t ( 'Graphs.colorsProvider' ) }
88- checked = { colorBy === 'source' }
89- onChange = { ( ) => setColorBy ( 'source' ) }
90- />
91- </ FlexBox >
92- </ div >
9381 < ReactFlow
82+ data-theme = { isDarkTheme ? 'dark' : 'light' }
9483 nodes = { nodes }
9584 edges = { edges }
9685 nodeTypes = { nodeTypes }
@@ -108,16 +97,45 @@ const Graph: React.FC = () => {
10897 zoomOnScroll = { true }
10998 panOnDrag = { true }
11099 >
111- < Controls />
100+ < Controls showInteractive = { false } />
112101 < Background />
102+ < Panel position = "top-left" >
103+ < FlexBox alignItems = { FlexBoxAlignItems . Center } role = "radiogroup" >
104+ < fieldset className = { styles . fieldsetReset } >
105+ < div className = { styles . graphHeader } >
106+ < span className = { styles . colorizedTitle } > { t ( 'Graphs.colorizedTitle' ) } </ span >
107+ < RadioButton
108+ name = "colorBy"
109+ text = { t ( 'Graphs.colorsProviderConfig' ) }
110+ checked = { colorBy === 'provider' }
111+ onChange = { ( ) => setColorBy ( 'provider' ) }
112+ />
113+ < RadioButton
114+ name = "colorBy"
115+ text = { t ( 'Graphs.colorsProvider' ) }
116+ checked = { colorBy === 'source' }
117+ onChange = { ( ) => setColorBy ( 'source' ) }
118+ />
119+ < RadioButton
120+ name = "colorBy"
121+ text = { t ( 'Graphs.colorsFlux' ) }
122+ checked = { colorBy === 'flux' }
123+ onChange = { ( ) => setColorBy ( 'flux' ) }
124+ />
125+ </ div >
126+ </ fieldset >
127+ </ FlexBox >
128+ </ Panel >
129+ < Panel position = "top-right" >
130+ < Legend legendItems = { legendItems } />
131+ </ Panel >
113132 </ ReactFlow >
114133 </ div >
115134 < YamlViewDialog
116135 isOpen = { yamlDialogOpen }
117136 setIsOpen = { setYamlDialogOpen }
118137 dialogContent = { < YamlViewer yamlString = { yamlString } filename = { yamlFilename } /> }
119138 />
120- < Legend legendItems = { legendItems } />
121139 </ div >
122140 ) ;
123141} ;
0 commit comments