import React from 'react'; import {Flex, Popover, Text} from '@gravity-ui/uikit'; import {isNil} from 'lodash'; import {HelpMarkWithDocs} from '../../../../../../components/HelpMarkWithDocs/HelpMarkWithDocs'; import {cn} from '../../../../../../utils/cn'; import {formatNumber} from '../../../../../../utils/dataFormatters/dataFormatters'; import {getDocsLink} from '../../../../../../utils/docs'; import {getPartitionsTooltip} from './helpers'; import i18n from './i18n'; import {FULL_FILL_VALUE, calcPartitionsProgress} from './utils'; import './PartitionsProgress.scss'; const b = cn('ydb-partitions-progress'); interface PartitionsProgressProps { minPartitions: number; maxPartitions?: number; partitionsCount: number; className?: string; } type SegmentPosition = 'main' | 'additional'; const SEGMENT_MODS: Record> = { additional: {additional: true}, main: {main: true}, }; interface SegmentProgressBarProps { position: SegmentPosition; value: number; withMinFill?: boolean; } const SegmentProgressBar = ({position, value, withMinFill}: SegmentProgressBarProps) => { const width = `${value}%`; return (
); }; export const PartitionsProgress = ({ minPartitions, maxPartitions, partitionsCount, className, }: PartitionsProgressProps) => { const { min, max, partitionsBelowMin, partitionsAboveMax, isBelowMin, isAboveMax, leftSegmentUnits, mainSegmentUnits, rightSegmentUnits, mainProgressValue, } = calcPartitionsProgress(minPartitions, maxPartitions, partitionsCount); const tooltip = getPartitionsTooltip({ count: partitionsCount, belowMin: partitionsBelowMin, aboveMax: partitionsAboveMax, isBelowMin: isBelowMin, isAboveMax: isAboveMax, }); const [isHelpHovered, setIsHelpHovered] = React.useState(false); const docsLink = getDocsLink('autoPartitioningMaxPartitionsCount'); const minLabel = formatNumber(min); const hasNoLimit = isNil(max); const maxLabel = hasNoLimit ? i18n('value_default') : formatNumber(max); const currentLabel = formatNumber(partitionsCount); const hasAdditionalSegments = isBelowMin || isAboveMax; const withMinFill = !hasAdditionalSegments; return ( {isBelowMin && ( {currentLabel} )} {minLabel} {maxLabel} {hasNoLimit ? ( setIsHelpHovered(true)} onMouseLeave={() => setIsHelpHovered(false)} > {i18n('context_no-limit')} ) : null} {isAboveMax && ( {currentLabel} )} ); };