import { QuestionCircleOutlined } from '@ant-design/icons'; import { LabelInfo } from '@gpustack/core-ui'; import { useIntl } from '@umijs/max'; import { Flex, InputNumber, Tooltip } from 'antd'; import classNames from 'classnames'; import React, { useEffect, useState } from 'react'; import styles from './styles.less'; interface NumberSelectionProps { id?: string; step?: number; min?: number; max?: number; value?: number; disabled?: boolean; label?: React.ReactNode; required?: boolean; className?: string; style?: React.CSSProperties; styles?: { input?: React.CSSProperties; }; labelExtra?: React.ReactNode; maxCount?: number; tips?: string; onChange?: (value: number) => void; } const NumberSelection: React.FC = ({ id, step = 1, min = 1, max = 16, value, disabled, label, required, labelExtra, className, maxCount = 8, tips, style, onChange }) => { const intl = useIntl(); const showCustomInput = max > maxCount; const presetItems = Array.from( { length: Math.max(0, maxCount) }, (_, i) => i + 1 ); if (min <= 0) { presetItems.unshift(0); } const items = presetItems; const isItemDisabled = (num: number) => !!disabled || num > max || num < min; const [inputValue, setInputValue] = useState(() => value !== undefined && value !== null && !presetItems.includes(value) ? value : null ); useEffect(() => { if (value === undefined || value === null) { setInputValue(null); } else if (presetItems.includes(value)) { setInputValue(null); } else { setInputValue(value); } }, [value]); const handleSelect = (num: number) => { if (isItemDisabled(num) || num === value) { return; } setInputValue(null); onChange?.(num); }; const handleInputChange = (num: number | null) => { setInputValue(num); }; const commitInput = () => { if (disabled || inputValue === null || inputValue === value) { return; } onChange?.(inputValue); }; return (
{label !== undefined && label !== null && (
)}
{items.map((num) => { const itemDisabled = isItemDisabled(num); return (
handleSelect(num)} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handleSelect(num); } }} > {num} {num === 0 && ( )}
); })}
{showCustomInput && (
)}
); }; export default NumberSelection;