1
1
import React from 'react' ;
2
2
import cn from 'bem-cn-lite' ;
3
3
import PropTypes from 'prop-types' ;
4
- import _ from 'lodash' ;
5
4
import { connect } from 'react-redux' ;
6
5
7
6
import { TextInput , Label } from '@gravity-ui/uikit' ;
8
7
import DataTable from '@yandex-cloud/react-data-table' ;
9
8
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' ;
11
12
12
13
import { withSearch } from '../../HOCS' ;
13
14
import { calcUptime } from '../../utils' ;
14
- import { ALL , DEFAULT_TABLE_SETTINGS } from '../../utils/constants' ;
15
+ import { DEFAULT_TABLE_SETTINGS } from '../../utils/constants' ;
15
16
import { changeFilter } from '../../store/reducers/settings' ;
17
+ import { filterNodesByStatusAndUptime } from '../../store/reducers/clusterNodes' ;
18
+ import { setNodesUptimeFilter } from '../../store/reducers/nodes' ;
16
19
import { hideTooltip , showTooltip } from '../../store/reducers/tooltip' ;
17
20
import { getNodesColumns } from '../../utils/getNodesColumns' ;
18
21
19
- import { Illustration } from '../Illustration' ;
20
-
21
22
import './NodesViewer.scss' ;
22
23
23
24
const b = cn ( 'nodes-viewer' ) ;
24
25
25
26
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
+
26
44
static propTypes = {
27
45
nodes : PropTypes . array . isRequired ,
28
46
className : PropTypes . string ,
29
47
searchQuery : PropTypes . string ,
30
48
handleSearchQuery : PropTypes . func ,
31
49
showTooltip : PropTypes . func ,
32
50
hideTooltip : PropTypes . func ,
33
- filter : problemFilterType ,
51
+ problemFilter : problemFilterType ,
52
+ nodesUptimeFilter : PropTypes . string ,
53
+ setNodesUptimeFilter : PropTypes . func ,
34
54
changeFilter : PropTypes . func ,
35
55
showControls : PropTypes . bool ,
36
56
additionalNodesInfo : PropTypes . object ,
@@ -42,60 +62,18 @@ class NodesViewer extends React.PureComponent {
42
62
showControls : true ,
43
63
} ;
44
64
45
- state = {
46
- filteredNodes : [ ] ,
47
- nodesToShow : [ ] ,
65
+ handleProblemFilterChange = ( value ) => {
66
+ this . props . changeFilter ( value ) ;
48
67
} ;
49
68
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 ) ;
94
71
} ;
95
72
96
73
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 ) ;
99
77
100
78
return (
101
79
< div className = { b ( 'controls' ) } >
@@ -108,7 +86,8 @@ class NodesViewer extends React.PureComponent {
108
86
hasClear
109
87
autoFocus
110
88
/>
111
- < ProblemFilter value = { filter } onChange = { this . onChangeProblemFilter } />
89
+ < ProblemFilter value = { problemFilter } onChange = { this . handleProblemFilterChange } />
90
+ < UptimeFilter value = { nodesUptimeFilter } onChange = { this . handleUptimeFilterChange } />
112
91
< Label theme = "info" size = "m" > { `Nodes: ${ nodesToShow . length } ` } </ Label >
113
92
</ div >
114
93
) ;
@@ -119,13 +98,13 @@ class NodesViewer extends React.PureComponent {
119
98
className,
120
99
searchQuery,
121
100
path,
122
- filter ,
101
+ problemFilter ,
123
102
showControls,
124
103
hideTooltip,
125
104
showTooltip,
126
105
additionalNodesInfo = { } ,
106
+ nodes,
127
107
} = this . props ;
128
- const { filteredNodes = [ ] } = this . state ;
129
108
130
109
const columns = getNodesColumns ( {
131
110
tabletsPath : path ,
@@ -134,7 +113,7 @@ class NodesViewer extends React.PureComponent {
134
113
getNodeRef : additionalNodesInfo . getNodeRef ,
135
114
} ) ;
136
115
137
- const nodesToShow = NodesViewer . selectNodesToShow ( filteredNodes , searchQuery ) ;
116
+ const nodesToShow = NodesViewer . selectNodesToShow ( nodes , searchQuery ) ;
138
117
139
118
return (
140
119
< div className = { `${ b ( ) } ${ className } ` } >
@@ -146,7 +125,7 @@ class NodesViewer extends React.PureComponent {
146
125
< div className = { b ( 'table-content' ) } >
147
126
< DataTable
148
127
theme = "yandex-cloud"
149
- key = { filter }
128
+ key = { problemFilter }
150
129
data = { nodesToShow }
151
130
columns = { columns }
152
131
settings = { DEFAULT_TABLE_SETTINGS }
@@ -160,16 +139,24 @@ class NodesViewer extends React.PureComponent {
160
139
}
161
140
}
162
141
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
+
164
148
return {
165
- filter : state . settings . problemFilter ,
149
+ problemFilter,
150
+ nodesUptimeFilter,
151
+ nodes,
166
152
} ;
167
153
} ;
168
154
169
155
const mapDispatchToProps = {
170
156
changeFilter,
171
157
hideTooltip,
172
158
showTooltip,
159
+ setNodesUptimeFilter,
173
160
} ;
174
161
175
162
const ConnectedNodesViewer = connect ( mapStateToProps , mapDispatchToProps ) ( NodesViewer ) ;
0 commit comments