Skip to content

Commit a802442

Browse files
feat(NodesViewer): add uptime filter
1 parent 9bb4f66 commit a802442

File tree

3 files changed

+50
-63
lines changed

3 files changed

+50
-63
lines changed

src/components/NodesViewer/NodesViewer.js renamed to src/containers/NodesViewer/NodesViewer.js

Lines changed: 49 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,56 @@
11
import React from 'react';
22
import cn from 'bem-cn-lite';
33
import PropTypes from 'prop-types';
4-
import _ from 'lodash';
54
import {connect} from 'react-redux';
65

76
import {TextInput, Label} from '@gravity-ui/uikit';
87
import DataTable from '@yandex-cloud/react-data-table';
98

10-
import ProblemFilter, {problemFilterType} from '../ProblemFilter/ProblemFilter';
9+
import ProblemFilter, {problemFilterType} from '../../components/ProblemFilter/ProblemFilter';
10+
import {UptimeFilter} from '../../components/UptimeFIlter';
11+
import {Illustration} from '../../components/Illustration';
1112

1213
import {withSearch} from '../../HOCS';
1314
import {calcUptime} from '../../utils';
14-
import {ALL, DEFAULT_TABLE_SETTINGS} from '../../utils/constants';
15+
import {DEFAULT_TABLE_SETTINGS} from '../../utils/constants';
1516
import {changeFilter} from '../../store/reducers/settings';
17+
import {filterNodesByStatusAndUptime} from '../../store/reducers/clusterNodes';
18+
import {setNodesUptimeFilter} from '../../store/reducers/nodes';
1619
import {hideTooltip, showTooltip} from '../../store/reducers/tooltip';
1720
import {getNodesColumns} from '../../utils/getNodesColumns';
1821

19-
import {Illustration} from '../Illustration';
20-
2122
import './NodesViewer.scss';
2223

2324
const b = cn('nodes-viewer');
2425

2526
class NodesViewer extends React.PureComponent {
27+
static selectNodesToShow(nodes, searchQuery) {
28+
let preparedNodes = nodes;
29+
if (nodes && Array.isArray(nodes)) {
30+
preparedNodes = nodes
31+
.map((node) => {
32+
node.uptime = calcUptime(node.StartTime);
33+
return node;
34+
})
35+
/* Filter by nodes with the Host field.
36+
If a node does not have a Host field it is also
37+
included in the filter and displayed with a dash in the corresponding column
38+
*/
39+
.filter((node) => (node.Host ? node.Host.includes(searchQuery) : true));
40+
}
41+
return preparedNodes;
42+
}
43+
2644
static propTypes = {
2745
nodes: PropTypes.array.isRequired,
2846
className: PropTypes.string,
2947
searchQuery: PropTypes.string,
3048
handleSearchQuery: PropTypes.func,
3149
showTooltip: PropTypes.func,
3250
hideTooltip: PropTypes.func,
33-
filter: problemFilterType,
51+
problemFilter: problemFilterType,
52+
nodesUptimeFilter: PropTypes.string,
53+
setNodesUptimeFilter: PropTypes.func,
3454
changeFilter: PropTypes.func,
3555
showControls: PropTypes.bool,
3656
additionalNodesInfo: PropTypes.object,
@@ -42,60 +62,18 @@ class NodesViewer extends React.PureComponent {
4262
showControls: true,
4363
};
4464

45-
state = {
46-
filteredNodes: [],
47-
nodesToShow: [],
65+
handleProblemFilterChange = (value) => {
66+
this.props.changeFilter(value);
4867
};
4968

50-
static getDerivedStateFromProps(props, state) {
51-
const {nodes, filter} = props;
52-
if (!_.isEqual(nodes, state.nodes)) {
53-
return {
54-
nodes,
55-
filteredNodes: NodesViewer.filterNodes(nodes, filter),
56-
};
57-
}
58-
return null;
59-
}
60-
61-
static filterNodes(nodes, filter) {
62-
if (filter === ALL) {
63-
return nodes;
64-
}
65-
66-
return _.filter(nodes, (node) => {
67-
return node.Overall && node.Overall !== 'Green';
68-
});
69-
}
70-
71-
static selectNodesToShow(nodes, searchQuery) {
72-
let preparedNodes = nodes;
73-
if (nodes && Array.isArray(nodes)) {
74-
preparedNodes = nodes
75-
.map((node) => {
76-
node.uptime = calcUptime(node.StartTime);
77-
return node;
78-
})
79-
/* Filter by nodes with the Host field.
80-
If a node does not have a Host field it is also
81-
included in the filter and displayed with a dash in the corresponding column
82-
*/
83-
.filter((node) => (node.Host ? node.Host.includes(searchQuery) : true));
84-
}
85-
return preparedNodes;
86-
}
87-
88-
onChangeProblemFilter = (filter) => {
89-
const {nodes, changeFilter} = this.props;
90-
const filteredNodes = NodesViewer.filterNodes(nodes, filter);
91-
92-
changeFilter(filter);
93-
this.setState({filteredNodes});
69+
handleUptimeFilterChange = (value) => {
70+
this.props.setNodesUptimeFilter(value);
9471
};
9572

9673
renderControls() {
97-
const {searchQuery, handleSearchQuery, filter} = this.props;
98-
const nodesToShow = NodesViewer.selectNodesToShow(this.state.filteredNodes, searchQuery);
74+
const {nodes, searchQuery, handleSearchQuery, nodesUptimeFilter, problemFilter} =
75+
this.props;
76+
const nodesToShow = NodesViewer.selectNodesToShow(nodes, searchQuery);
9977

10078
return (
10179
<div className={b('controls')}>
@@ -108,7 +86,8 @@ class NodesViewer extends React.PureComponent {
10886
hasClear
10987
autoFocus
11088
/>
111-
<ProblemFilter value={filter} onChange={this.onChangeProblemFilter} />
89+
<ProblemFilter value={problemFilter} onChange={this.handleProblemFilterChange} />
90+
<UptimeFilter value={nodesUptimeFilter} onChange={this.handleUptimeFilterChange} />
11291
<Label theme="info" size="m">{`Nodes: ${nodesToShow.length}`}</Label>
11392
</div>
11493
);
@@ -119,13 +98,13 @@ class NodesViewer extends React.PureComponent {
11998
className,
12099
searchQuery,
121100
path,
122-
filter,
101+
problemFilter,
123102
showControls,
124103
hideTooltip,
125104
showTooltip,
126105
additionalNodesInfo = {},
106+
nodes,
127107
} = this.props;
128-
const {filteredNodes = []} = this.state;
129108

130109
const columns = getNodesColumns({
131110
tabletsPath: path,
@@ -134,7 +113,7 @@ class NodesViewer extends React.PureComponent {
134113
getNodeRef: additionalNodesInfo.getNodeRef,
135114
});
136115

137-
const nodesToShow = NodesViewer.selectNodesToShow(filteredNodes, searchQuery);
116+
const nodesToShow = NodesViewer.selectNodesToShow(nodes, searchQuery);
138117

139118
return (
140119
<div className={`${b()} ${className}`}>
@@ -146,7 +125,7 @@ class NodesViewer extends React.PureComponent {
146125
<div className={b('table-content')}>
147126
<DataTable
148127
theme="yandex-cloud"
149-
key={filter}
128+
key={problemFilter}
150129
data={nodesToShow}
151130
columns={columns}
152131
settings={DEFAULT_TABLE_SETTINGS}
@@ -160,16 +139,24 @@ class NodesViewer extends React.PureComponent {
160139
}
161140
}
162141

163-
const mapStateToProps = (state) => {
142+
const mapStateToProps = (state, ownProps) => {
143+
const {nodesUptimeFilter} = state.nodes;
144+
const {problemFilter} = state.settings;
145+
146+
const nodes = filterNodesByStatusAndUptime(ownProps.nodes, problemFilter, nodesUptimeFilter);
147+
164148
return {
165-
filter: state.settings.problemFilter,
149+
problemFilter,
150+
nodesUptimeFilter,
151+
nodes,
166152
};
167153
};
168154

169155
const mapDispatchToProps = {
170156
changeFilter,
171157
hideTooltip,
172158
showTooltip,
159+
setNodesUptimeFilter,
173160
};
174161

175162
const ConnectedNodesViewer = connect(mapStateToProps, mapDispatchToProps)(NodesViewer);

src/containers/Tenant/Diagnostics/Compute/Compute.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import qs from 'qs';
77

88
import {Loader} from '@gravity-ui/uikit';
99

10-
import NodesViewer from '../../../../components/NodesViewer/NodesViewer';
10+
import NodesViewer from '../../../NodesViewer/NodesViewer';
1111

1212
import {backend} from '../../../../store';
1313
import {hideTooltip, showTooltip} from '../../../../store/reducers/tooltip';

0 commit comments

Comments
 (0)