import React from 'react'; import {Card, Flex, HelpMark, Label, Text} from '@gravity-ui/uikit'; import { SegmentedProgress, defaultNormalizePercent, } from '../../../../../components/SegmentedProgress/SegmentedProgress'; import {cn} from '../../../../../utils/cn'; import {formatNumber} from '../../../../../utils/dataFormatters/dataFormatters'; import i18n from '../../../i18n'; import type { PreparedClusterGroupsStats, PreparedDiskGroupsStats, PreparedErasureGroupsStats, } from './utils'; import './DiskGroupsStats.scss'; const b = cn('ydb-disk-groups-stats'); const ERASURE_COLORS: Record = { 'block-4-2': 'var(--g-color-base-info-heavy)', 'mirror-3-dc': 'var(--g-color-base-utility-heavy)', 'mirror-3of4': 'var(--g-color-base-utility-heavy)', none: 'var(--g-color-base-neutral-heavy)', }; function getErasureColor(erasure: string) { return ERASURE_COLORS[erasure] ?? 'var(--g-color-base-neutral-heavy)'; } function formatGroups(count: number) { return i18n('value_groups', { count, formattedCount: formatNumber(count), }); } function formatAvailableGroups({min, max}: PreparedDiskGroupsStats['availableGroups']) { if (min === max) { return formatGroups(min); } return i18n('value_available-groups-range', { min: formatNumber(min), max: formatNumber(max), }); } function getErasureTooltip(stats: PreparedErasureGroupsStats) { return i18n('context_available-groups-by-erasure', { count: stats.availableGroups, formattedCount: formatNumber(stats.availableGroups), erasure: stats.erasure, }); } function DiskGroupStats({stats}: {stats: PreparedDiskGroupsStats}) { const legendId = React.useId(); const {allocatedGroups, availableGroups, diskType, erasures, progressTotalGroups} = stats; const progressValue = progressTotalGroups > 0 ? allocatedGroups / progressTotalGroups : 0; const progressPercent = progressValue * 100; const progressLabel = i18n('context_storage-group-allocation-progress', { diskType, percent: defaultNormalizePercent(progressPercent), }); const availableGroupsContext = i18n('context_available-groups'); const segments = erasures.map((erasureStats, index) => ({ id: erasureStats.erasure, value: erasureStats.createdGroups, minWidth: 10, color: getErasureColor(erasureStats.erasure), className: b('progress-segment'), dataQa: 'cluster-storage-group-segment', tooltip: getErasureTooltip(erasureStats), ariaLabelledBy: `${legendId}-${index}`, })); return ( {diskType} } > {i18n('title_available')}
{erasures.map((erasureStats, index) => ( ))} {formatGroups(allocatedGroups)}
); } interface StorageGroupStatsProps { stats: PreparedClusterGroupsStats; } export function StorageGroupStats({stats}: StorageGroupStatsProps) { return ( {i18n('title_storage-groups')}{' '} {formatNumber(stats.allocatedGroups)} {stats.disks.map((diskStats) => ( ))} ); }