@@ -24,6 +24,12 @@ import { RecordingRuleCard } from './recording-rule-card';
2424import { RecordingRuleDetails } from './recording-rule-details' ;
2525import { RuleDetails } from './rule-details' ;
2626
27+ // Type guard to differentiate between ByResource and RecordingRulesByResource
28+ const isAlertResource = ( item : ByResource | RecordingRulesByResource ) : item is ByResource => {
29+ // ByResource has critical.firing, RecordingRulesByResource has critical as array
30+ return 'firing' in item . critical ;
31+ } ;
32+
2733export interface HealthDrawerContainerProps {
2834 title : string ;
2935 stats : ByResource [ ] ;
@@ -40,54 +46,37 @@ export const HealthDrawerContainer: React.FC<HealthDrawerContainerProps> = ({
4046 isDark
4147} ) => {
4248 const { t } = useTranslation ( 'plugin__netobserv-plugin' ) ;
43- const [ selectedResource , setSelectedResource ] = React . useState < ByResource | undefined > ( undefined ) ;
44- const [ selectedRecordingResource , setSelectedRecordingResource ] = React . useState < RecordingRulesByResource > ( ) ;
49+ const [ selectedItem , setSelectedItem ] = React . useState < ByResource | RecordingRulesByResource | undefined > ( undefined ) ;
4550 const drawerRef = React . useRef < HTMLDivElement > ( null ) ;
4651
4752 const onExpand = ( ) => {
4853 drawerRef . current && drawerRef . current . focus ( ) ;
4954 } ;
5055
51- // When selecting a violation, deselect recording rule
52- const handleSelectResource = ( r ?: ByResource ) => {
53- setSelectedResource ( r ) ;
54- if ( r ) {
55- setSelectedRecordingResource ( undefined ) ;
56- }
57- } ;
58-
59- // When selecting a recording rule, deselect violation
60- const handleSelectRecordingResource = ( r : RecordingRulesByResource | undefined ) => {
61- setSelectedRecordingResource ( r ) ;
62- if ( r ) {
63- setSelectedResource ( undefined ) ;
64- }
56+ const handleSelectItem = ( item ?: ByResource | RecordingRulesByResource ) => {
57+ setSelectedItem ( item ) ;
6558 } ;
6659
6760 React . useEffect ( ( ) => {
68- if ( selectedResource ) {
69- const fromStats = stats . find ( s => s . name === selectedResource . name ) ;
70- if ( fromStats !== selectedResource ) {
71- setSelectedResource ( fromStats ) ;
61+ if ( selectedItem ) {
62+ if ( isAlertResource ( selectedItem ) ) {
63+ const fromStats = stats . find ( s => s . name === selectedItem . name ) ;
64+ if ( fromStats !== selectedItem ) {
65+ setSelectedItem ( fromStats ) ;
66+ }
67+ } else if ( recordingRulesStats ) {
68+ const fromStats = recordingRulesStats . find ( s => s . name === selectedItem . name ) ;
69+ if ( fromStats !== selectedItem ) {
70+ setSelectedItem ( fromStats ) ;
71+ }
7272 }
7373 }
74- // we want to update selectedResource when stats changes, no more
74+ // we want to update selectedItem when stats or recordingRulesStats changes, no more
7575 // eslint-disable-next-line react-hooks/exhaustive-deps
76- } , [ stats ] ) ;
77-
78- React . useEffect ( ( ) => {
79- if ( selectedRecordingResource && recordingRulesStats ) {
80- const fromStats = recordingRulesStats . find ( s => s . name === selectedRecordingResource . name ) ;
81- if ( fromStats !== selectedRecordingResource ) {
82- setSelectedRecordingResource ( fromStats ) ;
83- }
84- }
85- // we want to update selectedRecordingResource when recordingRulesStats changes, no more
86- // eslint-disable-next-line react-hooks/exhaustive-deps
87- } , [ recordingRulesStats ] ) ;
76+ } , [ stats , recordingRulesStats ] ) ;
8877
8978 const hasRecordingRules = recordingRulesStats && recordingRulesStats . length > 0 ;
90- const isExpanded = selectedResource !== undefined || selectedRecordingResource !== undefined ;
79+ const isExpanded = selectedItem !== undefined ;
9180
9281 // Sort alerts by score (best score = lowest value)
9382 const sortedAlerts = React . useMemo ( ( ) => _ . orderBy ( stats , r => r . score , 'asc' ) , [ stats ] ) ;
@@ -123,26 +112,16 @@ export const HealthDrawerContainer: React.FC<HealthDrawerContainerProps> = ({
123112 >
124113 < DrawerHead >
125114 < span tabIndex = { isExpanded ? 0 : - 1 } ref = { drawerRef } >
126- { selectedResource !== undefined && (
127- < >
128- < ResourceLink inline = { true } kind = { kind } name = { selectedResource . name } />
129- </ >
130- ) }
131- { selectedRecordingResource !== undefined && (
132- < >
133- < ResourceLink inline = { true } kind = { kind } name = { selectedRecordingResource . name } />
134- </ >
135- ) }
115+ { selectedItem && < ResourceLink inline = { true } kind = { kind } name = { selectedItem . name } /> }
136116 </ span >
137117 </ DrawerHead >
138- { selectedResource && (
118+ { selectedItem && (
139119 < div className = "health-gallery-drawer-content" >
140- < RuleDetails kind = { kind } info = { selectedResource } wide = { false } />
141- </ div >
142- ) }
143- { selectedRecordingResource && (
144- < div className = "health-gallery-drawer-content" >
145- < RecordingRuleDetails kind = { kind } info = { selectedRecordingResource } wide = { false } />
120+ { isAlertResource ( selectedItem ) ? (
121+ < RuleDetails kind = { kind } info = { selectedItem } wide = { false } />
122+ ) : (
123+ < RecordingRuleDetails kind = { kind } info = { selectedItem } wide = { false } />
124+ ) }
146125 </ div >
147126 ) }
148127 </ DrawerPanelContent >
@@ -165,9 +144,9 @@ export const HealthDrawerContainer: React.FC<HealthDrawerContainerProps> = ({
165144 kind = { kind }
166145 isDark = { isDark }
167146 stats = { r }
168- isSelected = { r . name === selectedResource ?. name }
147+ isSelected = { r . name === selectedItem ?. name }
169148 onClick = { ( ) => {
170- handleSelectResource ( r . name !== selectedResource ?. name ? r : undefined ) ;
149+ handleSelectItem ( r . name !== selectedItem ?. name ? r : undefined ) ;
171150 } }
172151 />
173152 ) ) }
@@ -177,9 +156,9 @@ export const HealthDrawerContainer: React.FC<HealthDrawerContainerProps> = ({
177156 kind = { kind }
178157 isDark = { isDark }
179158 stats = { r }
180- isSelected = { r . name === selectedRecordingResource ?. name }
159+ isSelected = { r . name === selectedItem ?. name }
181160 onClick = { ( ) => {
182- handleSelectRecordingResource ( r . name !== selectedRecordingResource ?. name ? r : undefined ) ;
161+ handleSelectItem ( r . name !== selectedItem ?. name ? r : undefined ) ;
183162 } }
184163 />
185164 ) ) }
0 commit comments