@@ -9,9 +9,10 @@ import {cn} from '../../utils/cn';
99import {
1010 formatStorageValuesToGb ,
1111 formatUptimeInSeconds ,
12+ stringifyVdiskId ,
1213} from '../../utils/dataFormatters/dataFormatters' ;
1314import { createVDiskDeveloperUILink } from '../../utils/developerUI/developerUI' ;
14- import { getSeverityColor } from '../../utils/disks/helpers' ;
15+ import { getSeverityColor , isFullVDiskData } from '../../utils/disks/helpers' ;
1516import type { PreparedVDisk } from '../../utils/disks/types' ;
1617import { useIsUserAllowedToMakeChanges } from '../../utils/hooks/useIsUserAllowedToMakeChanges' ;
1718import { bytesToSpeed } from '../../utils/utils' ;
@@ -52,6 +53,7 @@ export function VDiskInfo<T extends PreparedVDisk>({
5253 Replicated,
5354 ReplicationProgress,
5455 ReplicationSecondsRemaining,
56+ Donors,
5557 VDiskState,
5658 VDiskSlotId,
5759 Kind,
@@ -188,6 +190,32 @@ export function VDiskInfo<T extends PreparedVDisk>({
188190 } ) ;
189191 }
190192
193+ // Show donors list when replication is in progress
194+ if ( Replicated === false && VDiskState === EVDiskState . OK && Donors && Donors . length > 0 ) {
195+ const donorsList = Donors . map ( ( donor ) => {
196+ if ( isFullVDiskData ( donor ) ) {
197+ // Full VDisk data - use VDiskId if available
198+ return stringifyVdiskId ( donor . VDiskId ) ;
199+ } else {
200+ // TVSlotId data - construct from NodeId-PDiskId-VSlotId
201+ const { NodeId : dNodeId , PDiskId : dPDiskId , VSlotId} = donor ;
202+ if ( valueIsDefined ( dNodeId ) && valueIsDefined ( dPDiskId ) && valueIsDefined ( VSlotId ) ) {
203+ return `${ dNodeId } -${ dPDiskId } -${ VSlotId } ` ;
204+ }
205+ return null ;
206+ }
207+ } )
208+ . filter ( Boolean )
209+ . join ( ', ' ) ;
210+
211+ if ( donorsList ) {
212+ rightColumn . push ( {
213+ label : vDiskInfoKeyset ( 'donors' ) ,
214+ value : donorsList ,
215+ } ) ;
216+ }
217+ }
218+
191219 const diskParamsDefined =
192220 valueIsDefined ( PDiskId ) && valueIsDefined ( NodeId ) && valueIsDefined ( VDiskSlotId ) ;
193221
0 commit comments