@@ -13,7 +13,10 @@ import {createVDiskDeveloperUILink} from '../../utils/developerUI/developerUI';
1313import { isFullVDiskData } from '../../utils/disks/helpers' ;
1414import type { PreparedVDisk , UnavailableDonor } from '../../utils/disks/types' ;
1515import { useTypedSelector } from '../../utils/hooks' ;
16- import { useIsUserAllowedToMakeChanges } from '../../utils/hooks/useIsUserAllowedToMakeChanges' ;
16+ import {
17+ useIsUserAllowedToMakeChanges ,
18+ useIsViewerUser ,
19+ } from '../../utils/hooks/useIsUserAllowedToMakeChanges' ;
1720import { bytesToGB , bytesToSpeed } from '../../utils/utils' ;
1821import type { InfoViewerItem } from '../InfoViewer' ;
1922import { InfoViewer } from '../InfoViewer' ;
@@ -23,23 +26,27 @@ import {preparePDiskData} from '../PDiskPopup/PDiskPopup';
2326import { getVDiskLink } from '../VDisk/utils' ;
2427import { vDiskInfoKeyset } from '../VDiskInfo/i18n' ;
2528
29+ import { vDiskPopupKeyset } from './i18n' ;
30+
2631import './VDiskPopup.scss' ;
2732
2833const b = cn ( 'vdisk-storage-popup' ) ;
2934
3035const prepareUnavailableVDiskData = ( data : UnavailableDonor , withDeveloperUILink ?: boolean ) => {
3136 const { NodeId, PDiskId, VSlotId, StoragePoolName} = data ;
3237
33- const vdiskData : InfoViewerItem [ ] = [ { label : 'State' , value : 'not available' } ] ;
38+ const vdiskData : InfoViewerItem [ ] = [
39+ { label : vDiskPopupKeyset ( 'label_state' ) , value : vDiskPopupKeyset ( 'context_not-available' ) } ,
40+ ] ;
3441
3542 if ( StoragePoolName ) {
36- vdiskData . push ( { label : 'StoragePool' , value : StoragePoolName } ) ;
43+ vdiskData . push ( { label : vDiskPopupKeyset ( 'label_storage-pool' ) , value : StoragePoolName } ) ;
3744 }
3845
3946 vdiskData . push (
40- { label : 'NodeId' , value : NodeId ?? EMPTY_DATA_PLACEHOLDER } ,
41- { label : 'PDiskId' , value : PDiskId ?? EMPTY_DATA_PLACEHOLDER } ,
42- { label : 'VSlotId' , value : VSlotId ?? EMPTY_DATA_PLACEHOLDER } ,
47+ { label : vDiskPopupKeyset ( 'label_node-id' ) , value : NodeId ?? EMPTY_DATA_PLACEHOLDER } ,
48+ { label : vDiskPopupKeyset ( 'label_pdisk-id' ) , value : PDiskId ?? EMPTY_DATA_PLACEHOLDER } ,
49+ { label : vDiskPopupKeyset ( 'label_vslot-id' ) , value : VSlotId ?? EMPTY_DATA_PLACEHOLDER } ,
4350 ) ;
4451
4552 if (
@@ -55,7 +62,7 @@ const prepareUnavailableVDiskData = (data: UnavailableDonor, withDeveloperUILink
5562 } ) ;
5663
5764 vdiskData . push ( {
58- label : 'Links' ,
65+ label : vDiskPopupKeyset ( 'label_links' ) ,
5966 value : < LinkWithIcon title = { 'Developer UI' } url = { vDiskInternalViewerPath } /> ,
6067 } ) ;
6168 }
@@ -85,58 +92,61 @@ const prepareVDiskData = (data: PreparedVDisk, withDeveloperUILink?: boolean) =>
8592 } = data ;
8693
8794 const vdiskData : InfoViewerItem [ ] = [
88- { label : 'VDisk' , value : StringifiedId } ,
89- { label : 'State' , value : VDiskState ?? 'not available' } ,
95+ { label : vDiskPopupKeyset ( 'label_vdisk' ) , value : StringifiedId } ,
96+ {
97+ label : vDiskPopupKeyset ( 'label_state' ) ,
98+ value : VDiskState ?? vDiskPopupKeyset ( 'context_not-available' ) ,
99+ } ,
90100 ] ;
91101
92102 if ( StoragePoolName ) {
93- vdiskData . push ( { label : 'StoragePool' , value : StoragePoolName } ) ;
103+ vdiskData . push ( { label : vDiskPopupKeyset ( 'label_storage-pool' ) , value : StoragePoolName } ) ;
94104 }
95105
96106 if ( SatisfactionRank && SatisfactionRank . FreshRank ?. Flag !== EFlag . Green ) {
97107 vdiskData . push ( {
98- label : 'Fresh' ,
108+ label : vDiskPopupKeyset ( 'label_fresh' ) ,
99109 value : SatisfactionRank . FreshRank ?. Flag ,
100110 } ) ;
101111 }
102112
103113 if ( SatisfactionRank && SatisfactionRank . LevelRank ?. Flag !== EFlag . Green ) {
104114 vdiskData . push ( {
105- label : 'Level' ,
115+ label : vDiskPopupKeyset ( 'label_level' ) ,
106116 value : SatisfactionRank . LevelRank ?. Flag ,
107117 } ) ;
108118 }
109119
110120 if ( SatisfactionRank && SatisfactionRank . FreshRank ?. RankPercent ) {
111121 vdiskData . push ( {
112- label : 'Fresh' ,
122+ label : vDiskPopupKeyset ( 'label_fresh' ) ,
113123 value : SatisfactionRank . FreshRank . RankPercent ,
114124 } ) ;
115125 }
116126
117127 if ( SatisfactionRank && SatisfactionRank . LevelRank ?. RankPercent ) {
118128 vdiskData . push ( {
119- label : 'Level' ,
129+ label : vDiskPopupKeyset ( 'label_level' ) ,
120130 value : SatisfactionRank . LevelRank . RankPercent ,
121131 } ) ;
122132 }
123133
124134 if ( DiskSpace && DiskSpace !== EFlag . Green ) {
125- vdiskData . push ( { label : 'Space' , value : DiskSpace } ) ;
135+ vdiskData . push ( { label : vDiskPopupKeyset ( 'label_space' ) , value : DiskSpace } ) ;
126136 }
127137
128138 if ( FrontQueues && FrontQueues !== EFlag . Green ) {
129- vdiskData . push ( { label : 'FrontQueues' , value : FrontQueues } ) ;
139+ vdiskData . push ( { label : vDiskPopupKeyset ( 'label_front-queues' ) , value : FrontQueues } ) ;
130140 }
131141
132142 if ( Replicated === false && VDiskState === EVDiskState . OK ) {
133- vdiskData . push ( { label : 'Replicated' , value : 'NO' } ) ;
143+ vdiskData . push ( { label : vDiskPopupKeyset ( 'label_replicated' ) , value : 'NO' } ) ;
134144
135145 // Only show replication progress and time remaining when disk is not replicated and state is OK
136146 if ( valueIsDefined ( ReplicationProgress ) ) {
137147 const progressPercent = Math . round ( ReplicationProgress * 100 ) ;
138148 vdiskData . push ( {
139- label : 'Progress' ,
149+ label : vDiskPopupKeyset ( 'label_progress' ) ,
140150 value : `${ progressPercent } %` ,
141151 } ) ;
142152 }
@@ -145,31 +155,34 @@ const prepareVDiskData = (data: PreparedVDisk, withDeveloperUILink?: boolean) =>
145155 const timeRemaining = formatUptimeInSeconds ( ReplicationSecondsRemaining ) ;
146156 if ( timeRemaining ) {
147157 vdiskData . push ( {
148- label : 'Remaining' ,
158+ label : vDiskPopupKeyset ( 'label_remaining' ) ,
149159 value : timeRemaining ,
150160 } ) ;
151161 }
152162 }
153163 }
154164
155165 if ( UnsyncedVDisks ) {
156- vdiskData . push ( { label : 'UnsyncVDisks' , value : UnsyncedVDisks } ) ;
166+ vdiskData . push ( { label : vDiskPopupKeyset ( 'label_unsync-vdisks' ) , value : UnsyncedVDisks } ) ;
157167 }
158168
159169 if ( Number ( AllocatedSize ) ) {
160170 vdiskData . push ( {
161- label : 'Allocated' ,
171+ label : vDiskPopupKeyset ( 'label_allocated' ) ,
162172 value : bytesToGB ( AllocatedSize ) ,
163173 } ) ;
164174 }
165175
166176 if ( Number ( ReadThroughput ) ) {
167- vdiskData . push ( { label : 'Read' , value : bytesToSpeed ( ReadThroughput ) } ) ;
177+ vdiskData . push ( {
178+ label : vDiskPopupKeyset ( 'label_read' ) ,
179+ value : bytesToSpeed ( ReadThroughput ) ,
180+ } ) ;
168181 }
169182
170183 if ( Number ( WriteThroughput ) ) {
171184 vdiskData . push ( {
172- label : 'Write' ,
185+ label : vDiskPopupKeyset ( 'label_write' ) ,
173186 value : bytesToSpeed ( WriteThroughput ) ,
174187 } ) ;
175188 }
@@ -191,7 +204,7 @@ const prepareVDiskData = (data: PreparedVDisk, withDeveloperUILink?: boolean) =>
191204 const vDiskPagePath = getVDiskLink ( { VDiskSlotId, PDiskId, NodeId, StringifiedId} ) ;
192205 if ( vDiskPagePath ) {
193206 vdiskData . push ( {
194- label : 'Links' ,
207+ label : vDiskPopupKeyset ( 'label_links' ) ,
195208 value : (
196209 < Flex wrap = "wrap" gap = { 2 } >
197210 < LinkWithIcon
@@ -221,6 +234,7 @@ interface VDiskPopupProps {
221234
222235export const VDiskPopup = ( { data} : VDiskPopupProps ) => {
223236 const isFullData = isFullVDiskData ( data ) ;
237+ const isViewerUser = useIsViewerUser ( ) ;
224238
225239 const isUserAllowedToMakeChanges = useIsUserAllowedToMakeChanges ( ) ;
226240
@@ -247,7 +261,7 @@ export const VDiskPopup = ({data}: VDiskPopupProps) => {
247261 const donors = data . Donors ;
248262 for ( const donor of donors ) {
249263 donorsInfo . push ( {
250- label : 'VDisk' ,
264+ label : vDiskPopupKeyset ( 'label_vdisk' ) ,
251265 value : < InternalLink to = { getVDiskLink ( donor ) } > { donor . StringifiedId } </ InternalLink > ,
252266 } ) ;
253267 }
@@ -257,7 +271,7 @@ export const VDiskPopup = ({data}: VDiskPopupProps) => {
257271 < div className = { b ( ) } >
258272 { data . DonorMode && < Label className = { b ( 'donor-label' ) } > Donor</ Label > }
259273 < InfoViewer title = "VDisk" info = { vdiskInfo } size = "s" />
260- { pdiskInfo && < InfoViewer title = "PDisk" info = { pdiskInfo } size = "s" /> }
274+ { pdiskInfo && isViewerUser && < InfoViewer title = "PDisk" info = { pdiskInfo } size = "s" /> }
261275 { donorsInfo . length > 0 && < InfoViewer title = "Donors" info = { donorsInfo } size = "s" /> }
262276 </ div >
263277 ) ;
0 commit comments