11import React from 'react' ;
22import cn from 'bem-cn-lite' ;
33import PropTypes from 'prop-types' ;
4- import _ from 'lodash' ;
54import { connect } from 'react-redux' ;
65
76import { TextInput , Label } from '@gravity-ui/uikit' ;
87import 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
1213import { withSearch } from '../../HOCS' ;
1314import { calcUptime } from '../../utils' ;
14- import { ALL , DEFAULT_TABLE_SETTINGS } from '../../utils/constants' ;
15+ import { DEFAULT_TABLE_SETTINGS } from '../../utils/constants' ;
1516import { changeFilter } from '../../store/reducers/settings' ;
17+ import { filterNodesByStatusAndUptime } from '../../store/reducers/clusterNodes' ;
18+ import { setNodesUptimeFilter } from '../../store/reducers/nodes' ;
1619import { hideTooltip , showTooltip } from '../../store/reducers/tooltip' ;
1720import { getNodesColumns } from '../../utils/getNodesColumns' ;
1821
19- import { Illustration } from '../Illustration' ;
20-
2122import './NodesViewer.scss' ;
2223
2324const b = cn ( 'nodes-viewer' ) ;
2425
2526class 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
169155const mapDispatchToProps = {
170156 changeFilter,
171157 hideTooltip,
172158 showTooltip,
159+ setNodesUptimeFilter,
173160} ;
174161
175162const ConnectedNodesViewer = connect ( mapStateToProps , mapDispatchToProps ) ( NodesViewer ) ;
0 commit comments