Skip to content

Commit 9bb4f66

Browse files
feat(Nodes): add uptime filter
1 parent f1037fb commit 9bb4f66

File tree

3 files changed

+65
-20
lines changed

3 files changed

+65
-20
lines changed

src/containers/Nodes/Nodes.js

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,19 @@ import {Loader, TextInput, Label} from '@gravity-ui/uikit';
99
import ProblemFilter, {problemFilterType} from '../../components/ProblemFilter/ProblemFilter';
1010
import {Illustration} from '../../components/Illustration';
1111
import {AccessDenied} from '../../components/Errors/403';
12+
import {UptimeFilter} from '../../components/UptimeFIlter';
1213

1314
import {hideTooltip, showTooltip} from '../../store/reducers/tooltip';
1415
import {withSearch} from '../../HOCS';
1516
import {AUTO_RELOAD_INTERVAL, ALL, DEFAULT_TABLE_SETTINGS} from '../../utils/constants';
1617
import {getFilteredNodes} from '../../store/reducers/clusterNodes';
17-
import {getNodes} from '../../store/reducers/nodes';
18+
import {getNodes, setNodesUptimeFilter} from '../../store/reducers/nodes';
1819
import {changeFilter} from '../../store/reducers/settings';
1920
import {setHeader} from '../../store/reducers/header';
2021
import routes, {CLUSTER_PAGES, createHref} from '../../routes';
2122
import {calcUptime} from '../../utils';
2223
import {getNodesColumns} from '../../utils/getNodesColumns';
24+
import {NodesUptimeFilterValues} from '../../utils/nodes';
2325

2426
import './Nodes.scss';
2527

@@ -44,12 +46,14 @@ class Nodes extends React.Component {
4446
hideTooltip: PropTypes.func,
4547
searchQuery: PropTypes.string,
4648
handleSearchQuery: PropTypes.func,
47-
filter: problemFilterType,
49+
problemFilter: problemFilterType,
4850
changeFilter: PropTypes.func,
4951
setHeader: PropTypes.func,
5052
className: PropTypes.string,
5153
singleClusterMode: PropTypes.bool,
5254
additionalNodesInfo: PropTypes.object,
55+
nodesUptimeFilter: PropTypes.string,
56+
setNodesUptimeFilter: PropTypes.func,
5357
};
5458

5559
componentDidMount() {
@@ -73,12 +77,16 @@ class Nodes extends React.Component {
7377
this.props.handleSearchQuery(search);
7478
};
7579

76-
handleFilterChange = (filter) => {
77-
this.props.changeFilter(filter);
80+
handleProblemFilterChange = (value) => {
81+
this.props.changeFilter(value);
82+
};
83+
84+
handleUptimeFilterChange = (value) => {
85+
this.props.setNodesUptimeFilter(value);
7886
};
7987

8088
renderControls() {
81-
const {searchQuery, filter, nodes} = this.props;
89+
const {nodes, searchQuery, problemFilter, nodesUptimeFilter} = this.props;
8290

8391
return (
8492
<div className={b('controls')}>
@@ -90,7 +98,8 @@ class Nodes extends React.Component {
9098
hasClear
9199
autoFocus
92100
/>
93-
<ProblemFilter value={filter} onChange={this.handleFilterChange} />
101+
<ProblemFilter value={problemFilter} onChange={this.handleProblemFilterChange} />
102+
<UptimeFilter value={nodesUptimeFilter} onChange={this.handleUptimeFilterChange} />
94103
<Label theme="info" size="m">{`Nodes: ${nodes?.length}`}</Label>
95104
</div>
96105
);
@@ -99,7 +108,8 @@ class Nodes extends React.Component {
99108
renderTable = () => {
100109
const {
101110
nodes = [],
102-
filter,
111+
problemFilter,
112+
nodesUptimeFilter,
103113
searchQuery,
104114
showTooltip,
105115
hideTooltip,
@@ -126,7 +136,7 @@ class Nodes extends React.Component {
126136
}));
127137

128138
if (preparedNodes.length === 0) {
129-
if (filter !== ALL) {
139+
if (problemFilter !== ALL || nodesUptimeFilter !== NodesUptimeFilterValues.All) {
130140
return <Illustration name="thumbsUp" width="200" />;
131141
}
132142
}
@@ -177,7 +187,7 @@ class Nodes extends React.Component {
177187
}
178188

179189
const mapStateToProps = (state) => {
180-
const {wasLoaded, loading, error} = state.nodes;
190+
const {wasLoaded, loading, error, nodesUptimeFilter} = state.nodes;
181191

182192
const nodes = getFilteredNodes(state);
183193
return {
@@ -186,7 +196,8 @@ const mapStateToProps = (state) => {
186196
wasLoaded,
187197
loading,
188198
error,
189-
filter: state.settings.problemFilter,
199+
problemFilter: state.settings.problemFilter,
200+
nodesUptimeFilter,
190201
};
191202
};
192203

@@ -196,6 +207,7 @@ const mapDispatchToProps = {
196207
showTooltip,
197208
changeFilter,
198209
setHeader,
210+
setNodesUptimeFilter,
199211
};
200212

201213
export default withSearch(connect(mapStateToProps, mapDispatchToProps)(Nodes));

src/store/reducers/clusterNodes.js

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1-
import {createRequestActionTypes, createApiRequest} from '../utils';
21
import {createSelector} from 'reselect';
2+
33
import '../../services/api';
44
import {ALL} from '../../utils/constants';
5+
import {createRequestActionTypes, createApiRequest} from '../utils';
6+
7+
import {filterByUptime} from './storage';
8+
import {getNodesUptimeFilter} from './nodes';
59

610
const FETCH_NODES_LIST = createRequestActionTypes('tenants', 'FETCH_NODES_LIST');
711

@@ -47,23 +51,38 @@ export function getNodesList() {
4751
});
4852
}
4953

54+
const filterByProblemsStatus = (nodes = [], problemFilter) => {
55+
if (problemFilter === ALL) {
56+
return nodes;
57+
}
58+
59+
return nodes.filter(({Overall}) => {
60+
return Overall && Overall !== 'Green';
61+
});
62+
};
63+
64+
export const filterNodesByStatusAndUptime = (nodes = [], problemFilter, uptimeFilter) => {
65+
let result = filterByProblemsStatus(nodes, problemFilter);
66+
result = filterByUptime(result, uptimeFilter);
67+
68+
return result;
69+
};
70+
5071
export const getFilteredNodes = createSelector(
51-
(state) => state.nodes.data?.Tenants,
52-
(state) => state.settings.problemFilter,
53-
(tenants, filter) => {
72+
[
73+
(state) => state.nodes.data?.Tenants,
74+
(state) => state.settings.problemFilter,
75+
getNodesUptimeFilter,
76+
],
77+
(tenants, problemFilter, uptimeFilter) => {
5478
const nodes = tenants?.reduce((acc, item) => {
5579
if (Array.isArray(item.Nodes)) {
5680
return [...acc, ...item.Nodes.map((node) => ({...node, TenantName: item.Name}))];
5781
}
5882
return acc;
5983
}, []);
60-
if (filter === ALL) {
61-
return nodes;
62-
}
6384

64-
return nodes?.filter(({Overall}) => {
65-
return Overall && Overall !== 'Green';
66-
});
85+
return filterNodesByStatusAndUptime(nodes, problemFilter, uptimeFilter);
6786
},
6887
);
6988

src/store/reducers/nodes.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
import {createRequestActionTypes, createApiRequest} from '../utils';
22
import '../../services/api';
3+
import {NodesUptimeFilterValues} from '../../utils/nodes';
34

45
const FETCH_NODES = createRequestActionTypes('nodes', 'FETCH_NODES');
56

67
const CLEAR_NODES = 'nodes/CLEAR_NODES';
8+
const SET_NODES_UPTIME_FILTER = 'nodes/SET_NODES_UPTIME_FILTER';
79

810
const initialState = {
911
loading: true,
1012
wasLoaded: false,
13+
nodesUptimeFilter: NodesUptimeFilterValues.All,
1114
};
1215

1316
const nodes = (state = initialState, action) => {
@@ -45,6 +48,10 @@ const nodes = (state = initialState, action) => {
4548
error: undefined,
4649
};
4750
}
51+
52+
case SET_NODES_UPTIME_FILTER: {
53+
return {...state, nodesUptimeFilter: action.data};
54+
}
4855
default:
4956
return state;
5057
}
@@ -59,4 +66,11 @@ export function getNodes(path) {
5966

6067
export const clearNodes = () => ({type: CLEAR_NODES});
6168

69+
export const setNodesUptimeFilter = (value) => ({
70+
type: SET_NODES_UPTIME_FILTER,
71+
data: value,
72+
});
73+
74+
export const getNodesUptimeFilter = (state) => state.nodes.nodesUptimeFilter;
75+
6276
export default nodes;

0 commit comments

Comments
 (0)