11import React , { useEffect , useState , useRef , useMemo } from 'react' ;
22import PropTypes from 'prop-types' ;
33import cn from 'bem-cn-lite' ;
4- import _ from 'lodash' ;
54import { Popup } from '@yandex-cloud/uikit' ;
65
76import { bytesToGB , bytesToSpeed } from '../../../utils/utils' ;
87import routes , { createHref } from '../../../routes' ;
98import { stringifyVdiskId , getPDiskId } from '../../../utils' ;
109import { getPDiskType } from '../../../utils/pdisk' ;
10+ import { InfoViewer } from '../../../components/InfoViewer' ;
1111import DiskStateProgressBar , {
1212 diskProgressColors ,
1313} from '../DiskStateProgressBar/DiskStateProgressBar' ;
@@ -97,62 +97,62 @@ function Vdisk(props) {
9797 ReadThroughput,
9898 WriteThroughput,
9999 } = props ;
100- const vdiskData = [ { property : 'VDisk' , value : stringifyVdiskId ( VDiskId ) } ] ;
101- vdiskData . push ( { property : 'State' , value : VDiskState ?? 'not available' } ) ;
102- PoolName && vdiskData . push ( { property : 'StoragePool' , value : PoolName } ) ;
100+ const vdiskData = [ { label : 'VDisk' , value : stringifyVdiskId ( VDiskId ) } ] ;
101+ vdiskData . push ( { label : 'State' , value : VDiskState ?? 'not available' } ) ;
102+ PoolName && vdiskData . push ( { label : 'StoragePool' , value : PoolName } ) ;
103103
104104 SatisfactionRank &&
105105 SatisfactionRank . FreshRank ?. Flag !== diskProgressColors [ colorSeverity . Green ] &&
106106 vdiskData . push ( {
107- property : 'Fresh' ,
107+ label : 'Fresh' ,
108108 value : SatisfactionRank . FreshRank . Flag ,
109109 } ) ;
110110
111111 SatisfactionRank &&
112112 SatisfactionRank . LevelRank ?. Flag !== diskProgressColors [ colorSeverity . Green ] &&
113113 vdiskData . push ( {
114- property : 'Level' ,
114+ label : 'Level' ,
115115 value : SatisfactionRank . LevelRank . Flag ,
116116 } ) ;
117117
118118 SatisfactionRank &&
119119 SatisfactionRank . FreshRank ?. RankPercent &&
120120 vdiskData . push ( {
121- property : 'Fresh' ,
121+ label : 'Fresh' ,
122122 value : SatisfactionRank . FreshRank . RankPercent ,
123123 } ) ;
124124
125125 SatisfactionRank &&
126126 SatisfactionRank . LevelRank ?. RankPercent &&
127127 vdiskData . push ( {
128- property : 'Level' ,
128+ label : 'Level' ,
129129 value : SatisfactionRank . LevelRank . RankPercent ,
130130 } ) ;
131131
132132 DiskSpace &&
133133 DiskSpace !== diskProgressColors [ colorSeverity . Green ] &&
134- vdiskData . push ( { property : 'Space' , value : DiskSpace } ) ;
134+ vdiskData . push ( { label : 'Space' , value : DiskSpace } ) ;
135135
136136 FrontQueues &&
137137 FrontQueues !== diskProgressColors [ colorSeverity . Green ] &&
138- vdiskData . push ( { property : 'FrontQueues' , value : FrontQueues } ) ;
138+ vdiskData . push ( { label : 'FrontQueues' , value : FrontQueues } ) ;
139139
140- ! Replicated && vdiskData . push ( { property : 'Replicated' , value : 'NO' } ) ;
140+ ! Replicated && vdiskData . push ( { label : 'Replicated' , value : 'NO' } ) ;
141141
142- UnsyncedVDisks && vdiskData . push ( { property : 'UnsyncVDisks' , value : UnsyncedVDisks } ) ;
142+ UnsyncedVDisks && vdiskData . push ( { label : 'UnsyncVDisks' , value : UnsyncedVDisks } ) ;
143143
144144 Boolean ( Number ( AllocatedSize ) ) &&
145145 vdiskData . push ( {
146- property : 'Allocated' ,
146+ label : 'Allocated' ,
147147 value : bytesToGB ( AllocatedSize ) ,
148148 } ) ;
149149
150150 Boolean ( Number ( ReadThroughput ) ) &&
151- vdiskData . push ( { property : 'Read' , value : bytesToSpeed ( ReadThroughput ) } ) ;
151+ vdiskData . push ( { label : 'Read' , value : bytesToSpeed ( ReadThroughput ) } ) ;
152152
153153 Boolean ( Number ( WriteThroughput ) ) &&
154154 vdiskData . push ( {
155- property : 'Write' ,
155+ label : 'Write' ,
156156 value : bytesToSpeed ( WriteThroughput ) ,
157157 } ) ;
158158
@@ -167,61 +167,53 @@ function Vdisk(props) {
167167 diskProgressColors [ colorSeverity . Yellow ] ,
168168 ] ;
169169 if ( PDisk && nodes ) {
170- const pdiskData = [ { property : 'PDisk' , value : getPDiskId ( PDisk ) } ] ;
170+ const pdiskData = [ { label : 'PDisk' , value : getPDiskId ( PDisk ) } ] ;
171171 pdiskData . push ( {
172- property : 'State' ,
172+ label : 'State' ,
173173 value : PDisk . State || 'not available' ,
174174 } ) ;
175- pdiskData . push ( { property : 'Type' , value : getPDiskType ( PDisk ) || 'unknown' } ) ;
176- PDisk . NodeId && pdiskData . push ( { property : 'Node Id' , value : PDisk . NodeId } ) ;
175+ pdiskData . push ( { label : 'Type' , value : getPDiskType ( PDisk ) || 'unknown' } ) ;
176+ PDisk . NodeId && pdiskData . push ( { label : 'Node Id' , value : PDisk . NodeId } ) ;
177177 PDisk . NodeId &&
178178 nodes [ PDisk . NodeId ] &&
179- pdiskData . push ( { property : 'Host' , value : nodes [ PDisk . NodeId ] } ) ;
180- PDisk . Path && pdiskData . push ( { property : 'Path' , value : PDisk . Path } ) ;
179+ pdiskData . push ( { label : 'Host' , value : nodes [ PDisk . NodeId ] } ) ;
180+ PDisk . Path && pdiskData . push ( { label : 'Path' , value : PDisk . Path } ) ;
181181 pdiskData . push ( {
182- property : 'Available' ,
182+ label : 'Available' ,
183183 value : `${ bytesToGB ( PDisk . AvailableSize ) } of ${ bytesToGB ( PDisk . TotalSize ) } ` ,
184184 } ) ;
185185 errorColors . includes ( PDisk . Realtime ) &&
186- pdiskData . push ( { property : 'Realtime' , value : PDisk . Realtime } ) ;
186+ pdiskData . push ( { label : 'Realtime' , value : PDisk . Realtime } ) ;
187187 errorColors . includes ( PDisk . Device ) &&
188- pdiskData . push ( { property : 'Device' , value : PDisk . Device } ) ;
188+ pdiskData . push ( { label : 'Device' , value : PDisk . Device } ) ;
189189 return pdiskData ;
190190 }
191191 return null ;
192192 } ;
193193 /* eslint-enable */
194194
195- const renderPopup = ( ) => {
196- const vdiskData = prepareVdiskData ( ) ;
197- const pdiskData = preparePdiskData ( ) ;
198- return (
199- < Popup
200- className = { b ( 'popup-wrapper' ) }
201- anchorRef = { anchor }
202- open = { isPopupVisible }
203- placement = { [ 'top' , 'bottom' ] }
204- hasArrow
205- >
206- < div className = { b ( 'popup-content' ) } >
207- < div className = { b ( 'popup-section-name' ) } > VDisk</ div >
208- { _ . map ( vdiskData , ( row ) => (
209- < React . Fragment key = { row . property } >
210- < div className = { b ( 'property' ) } > { row . property } </ div >
211- < div className = { b ( 'value' ) } > { row . value } </ div >
212- </ React . Fragment >
213- ) ) }
214- < div className = { b ( 'popup-section-name' ) } > PDisk</ div >
215- { _ . map ( pdiskData , ( row ) => (
216- < React . Fragment key = { row . property } >
217- < div className = { b ( 'property' ) } > { row . property } </ div >
218- < div className = { b ( 'value' ) } > { row . value } </ div >
219- </ React . Fragment >
220- ) ) }
221- </ div >
222- </ Popup >
223- ) ;
224- } ;
195+ const renderPopup = ( ) => (
196+ < Popup
197+ className = { b ( 'popup-wrapper' ) }
198+ anchorRef = { anchor }
199+ open = { isPopupVisible }
200+ placement = { [ 'top' , 'bottom' ] }
201+ // bigger offset for easier switching to neighbour nodes
202+ // matches the default offset for popup with arrow out of a sense of beauty
203+ offset = { [ 0 , 12 ] }
204+ >
205+ < InfoViewer
206+ title = "VDisk"
207+ info = { prepareVdiskData ( ) }
208+ size = "s"
209+ />
210+ < InfoViewer
211+ title = "PDisk"
212+ info = { preparePdiskData ( ) }
213+ size = "s"
214+ />
215+ </ Popup >
216+ ) ;
225217
226218 const vdiskAllocatedPercent = useMemo ( ( ) => {
227219 const { AvailableSize, AllocatedSize, PDisk} = props ;
@@ -245,13 +237,13 @@ function Vdisk(props) {
245237 href = {
246238 props . NodeId
247239 ? createHref (
248- routes . node ,
249- { id : props . NodeId , activeTab : STRUCTURE } ,
250- {
251- pdiskId : props . PDisk ?. PDiskId ,
252- vdiskId : stringifyVdiskId ( props . VDiskId ) ,
253- } ,
254- )
240+ routes . node ,
241+ { id : props . NodeId , activeTab : STRUCTURE } ,
242+ {
243+ pdiskId : props . PDisk ?. PDiskId ,
244+ vdiskId : stringifyVdiskId ( props . VDiskId ) ,
245+ } ,
246+ )
255247 : undefined
256248 }
257249 />
0 commit comments