Skip to content

Commit 77e179e

Browse files
authored
Merge pull request meshery#13918 from falgunmpatel/refactor/grafana-metrics-compare-class-to-fc
[GrafanaMetricsCompare.js] Refactored GrafanaMetricsCompare to a functional component
2 parents 0575caf + 3607964 commit 77e179e

File tree

1 file changed

+77
-94
lines changed

1 file changed

+77
-94
lines changed

ui/components/telemetry/grafana/GrafanaMetricsCompare.js

Lines changed: 77 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Component } from 'react';
1+
import React, { useState, useEffect } from 'react';
22
import PropTypes from 'prop-types';
33
import { NoSsr } from '@layer5/sistent';
44
import { MenuItem, TextField, Box, styled } from '@layer5/sistent';
@@ -13,112 +13,95 @@ const StyledTextField = styled(TextField)(({ theme }) => ({
1313
marginBottom: theme.spacing(1),
1414
}));
1515

16-
class GrafanaMetricsCompare extends Component {
17-
constructor(props) {
18-
super(props);
19-
const { chartCompare } = props;
20-
const panels = this.computePanels(chartCompare);
21-
this.state = {
22-
chartCompare,
23-
panels,
24-
panel: '',
25-
selectedSeries: '',
26-
series: [],
16+
const GrafanaMetricsCompare = ({ chartCompare }) => {
17+
const [panels, setPanels] = useState({});
18+
const [panel, setPanel] = useState('');
19+
const [selectedSeries, setSelectedSeries] = useState('');
20+
const [series, setSeries] = useState([]);
21+
22+
useEffect(() => {
23+
const computePanels = (chartCompare) => {
24+
const panels = {};
25+
if (chartCompare && chartCompare.length > 0) {
26+
chartCompare.forEach((cc) => {
27+
if (cc.boardConfig && cc.boardConfig.panels) {
28+
cc.boardConfig.panels.forEach((panel) => {
29+
panels[panel.title] = panel;
30+
});
31+
}
32+
});
33+
}
34+
return panels;
2735
};
28-
}
2936

30-
computePanels(chartCompare) {
31-
const panels = {};
32-
if (chartCompare && chartCompare !== null && chartCompare.length > 0) {
33-
chartCompare.forEach((cc) => {
34-
if (
35-
cc.boardConfig &&
36-
cc.boardConfig !== null &&
37-
cc.boardConfig.panels &&
38-
cc.boardConfig.panels !== null
39-
) {
40-
cc.boardConfig.panels.forEach((panel) => {
41-
// if(panels.indexOf(panel.title) === -1){
42-
// panels.push(panel);
43-
// }
44-
panels[panel.title] = panel;
45-
});
46-
}
47-
});
48-
}
49-
return panels;
50-
}
37+
const computedPanels = computePanels(chartCompare);
38+
setPanels(computedPanels);
5139

52-
componentDidMount() {
53-
const { panels } = this.state;
54-
const panel = Object.keys(panels).length > 0 ? Object.keys(panels)[0] : '';
55-
let series = [];
56-
if (panels[panel] && panels[panel].targets) {
57-
series = panels[panel].targets.map((target) => target.expr);
40+
const initialPanel =
41+
Object.keys(computedPanels).length > 0 ? Object.keys(computedPanels)[0] : '';
42+
let initialSeries = [];
43+
if (computedPanels[initialPanel] && computedPanels[initialPanel].targets) {
44+
initialSeries = computedPanels[initialPanel].targets.map((target) => target.expr);
5845
}
59-
this.setState({ panel, series, selectedSeries: series.length > 0 ? series[0] : '' });
60-
}
46+
setPanel(initialPanel);
47+
setSeries(initialSeries);
48+
setSelectedSeries(initialSeries.length > 0 ? initialSeries[0] : '');
49+
}, [chartCompare]);
6150

62-
handleChange = (name) => (event) => {
63-
const { panels } = this.state;
51+
const handleChange = (name) => (event) => {
6452
if (name === 'panel') {
65-
let series = [];
66-
const panel = event.target.value;
67-
if (panels[panel] && panels[panel].targets) {
68-
series = panels[panel].targets.map((target) => target.expr);
53+
const selectedPanel = event.target.value;
54+
let newSeries = [];
55+
if (panels[selectedPanel] && panels[selectedPanel].targets) {
56+
newSeries = panels[selectedPanel].targets.map((target) => target.expr);
6957
}
70-
this.setState({ panel, series, selectedSeries: series.length > 0 ? series[0] : '' });
58+
setPanel(selectedPanel);
59+
setSeries(newSeries);
60+
setSelectedSeries(newSeries.length > 0 ? newSeries[0] : '');
7161
} else if (name === 'series') {
72-
this.setState({ selectedSeries: event.target.value });
62+
setSelectedSeries(event.target.value);
7363
}
7464
};
7565

76-
render() {
77-
const { panels, panel, selectedSeries, series } = this.state;
78-
79-
return (
80-
<NoSsr>
81-
<Root>
82-
<StyledTextField
83-
select
84-
fullWidth
85-
label="Panel"
86-
value={panel}
87-
onChange={this.handleChange('panel')}
88-
margin="dense"
89-
variant="outlined"
90-
>
91-
{panels &&
92-
Object.keys(panels).map((p) => (
93-
<MenuItem key={p} value={p}>
94-
{p}
95-
</MenuItem>
96-
))}
97-
</StyledTextField>
98-
<StyledTextField
99-
select
100-
fullWidth
101-
label="Series"
102-
value={selectedSeries}
103-
onChange={this.handleChange('series')}
104-
margin="dense"
105-
variant="outlined"
106-
>
107-
{series &&
108-
series.map((s) => (
109-
<MenuItem key={s} value={s}>
110-
{s}
111-
</MenuItem>
112-
))}
113-
</StyledTextField>
114-
</Root>
115-
</NoSsr>
116-
);
117-
}
118-
}
66+
return (
67+
<NoSsr>
68+
<Root>
69+
<StyledTextField
70+
select
71+
fullWidth
72+
label="Panel"
73+
value={panel}
74+
onChange={handleChange('panel')}
75+
margin="dense"
76+
variant="outlined"
77+
>
78+
{Object.keys(panels).map((p) => (
79+
<MenuItem key={p} value={p}>
80+
{p}
81+
</MenuItem>
82+
))}
83+
</StyledTextField>
84+
<StyledTextField
85+
select
86+
fullWidth
87+
label="Series"
88+
value={selectedSeries}
89+
onChange={handleChange('series')}
90+
margin="dense"
91+
variant="outlined"
92+
>
93+
{series.map((s) => (
94+
<MenuItem key={s} value={s}>
95+
{s}
96+
</MenuItem>
97+
))}
98+
</StyledTextField>
99+
</Root>
100+
</NoSsr>
101+
);
102+
};
119103

120104
GrafanaMetricsCompare.propTypes = {
121-
classes: PropTypes.object.isRequired,
122105
chartCompare: PropTypes.array.isRequired,
123106
};
124107

0 commit comments

Comments
 (0)