fix: allow float to be typed in float input (#7275)

Added local state for (.) to be allowed when inserting Float input
This commit is contained in:
Lucas Oliveira 2025-03-25 19:14:07 -03:00 • committed by GitHub
commit 9e480026b3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -23,6 +23,9 @@ export default function FloatComponent({
const min = rangeSpec?.min ?? -2; const min = rangeSpec?.min ?? -2;
const max = rangeSpec?.max ?? 2; const max = rangeSpec?.max ?? 2;
// Local state for input value
const [localValue, setLocalValue] = useState<string>(value.toString());
// Clear component state // Clear component state
useEffect(() => { useEffect(() => {
if (disabled && value !== 0) { if (disabled && value !== 0) {
@ -30,20 +33,29 @@ export default function FloatComponent({
} }
}, [disabled, handleOnNewValue]); }, [disabled, handleOnNewValue]);
// Update local value when prop changes
useEffect(() => {
setLocalValue(value.toString());
}, [value]);
const [cursor, setCursor] = useState<number | null>(null); const [cursor, setCursor] = useState<number | null>(null);
const ref = useRef<HTMLInputElement>(null); const ref = useRef<HTMLInputElement>(null);
useEffect(() => { useEffect(() => {
ref.current?.setSelectionRange(cursor, cursor); ref.current?.setSelectionRange(cursor, cursor);
}, [ref, cursor, value]); }, [ref, cursor, localValue]);
const handleChangeInput = (e: React.ChangeEvent<HTMLInputElement>) => { const handleChangeInput = (e: React.ChangeEvent<HTMLInputElement>) => {
setCursor(e.target.selectionStart); setCursor(e.target.selectionStart);
handleOnNewValue({ value: Number(e.target.value) }); setLocalValue(e.target.value);
};
const handleBlur = () => {
handleOnNewValue({ value: Number(localValue) });
}; };
const handleNumberChange = (newValue) => { const handleNumberChange = (newValue) => {
handleOnNewValue({ value: Number(newValue) }); setLocalValue(newValue);
}; };
const handleInputChange = (event) => { const handleInputChange = (event) => {
@ -79,17 +91,19 @@ export default function FloatComponent({
min={min} min={min}
max={max} max={max}
onChange={handleNumberChange} onChange={handleNumberChange}
value={value ?? ""} value={localValue ?? ""}
onBlur={handleBlur}
> >
<NumberInputField <NumberInputField
className={getInputClassName()} className={getInputClassName()}
onChange={handleChangeInput} onChange={handleChangeInput}
onKeyDown={(event) => handleKeyDown(event, value, "")} onKeyDown={(event) => handleKeyDown(event, localValue, "")}
onInput={handleInputChange} onInput={handleInputChange}
disabled={disabled} disabled={disabled}
placeholder={editNode ? "Float number" : "Type a float number"} placeholder={editNode ? "Float number" : "Type a float number"}
data-testid={id} data-testid={id}
ref={inputRef} ref={inputRef}
onBlur={handleBlur}
/> />
<NumberInputStepper className={stepperClassName}> <NumberInputStepper className={stepperClassName}>
<NumberIncrementStepper className={incrementStepperClassName}> <NumberIncrementStepper className={incrementStepperClassName}>