mirror of
https://github.com/invoke-ai/InvokeAI
synced 2024-08-30 20:32:17 +00:00
fix(ui): allow decimals in number inputs
still some jank but eh
This commit is contained in:
parent
30e45eaf47
commit
f6752965b7
@ -28,7 +28,7 @@ import {
|
||||
useState,
|
||||
} from 'react';
|
||||
|
||||
const numberStringRegex = /^-?(0\.)?\.?$/;
|
||||
export const numberStringRegex = /^-?(0\.)?\.?$/;
|
||||
|
||||
interface Props extends Omit<NumberInputProps, 'onChange'> {
|
||||
label?: string;
|
||||
|
@ -6,6 +6,7 @@ import {
|
||||
NumberInputStepper,
|
||||
} from '@chakra-ui/react';
|
||||
import { useAppDispatch } from 'app/store/storeHooks';
|
||||
import { numberStringRegex } from 'common/components/IAINumberInput';
|
||||
import { fieldValueChanged } from 'features/nodes/store/nodesSlice';
|
||||
import {
|
||||
FloatInputFieldTemplate,
|
||||
@ -13,7 +14,7 @@ import {
|
||||
IntegerInputFieldTemplate,
|
||||
IntegerInputFieldValue,
|
||||
} from 'features/nodes/types/types';
|
||||
import { memo } from 'react';
|
||||
import { memo, useEffect, useState } from 'react';
|
||||
import { FieldComponentProps } from './types';
|
||||
|
||||
const NumberInputFieldComponent = (
|
||||
@ -23,17 +24,42 @@ const NumberInputFieldComponent = (
|
||||
>
|
||||
) => {
|
||||
const { nodeId, field } = props;
|
||||
|
||||
const dispatch = useAppDispatch();
|
||||
const [valueAsString, setValueAsString] = useState<string>(
|
||||
String(field.value)
|
||||
);
|
||||
|
||||
const handleValueChanged = (_: string, value: number) => {
|
||||
dispatch(fieldValueChanged({ nodeId, fieldName: field.name, value }));
|
||||
const handleValueChanged = (v: string) => {
|
||||
setValueAsString(v);
|
||||
// This allows negatives and decimals e.g. '-123', `.5`, `-0.2`, etc.
|
||||
if (!v.match(numberStringRegex)) {
|
||||
// Cast the value to number. Floor it if it should be an integer.
|
||||
dispatch(
|
||||
fieldValueChanged({
|
||||
nodeId,
|
||||
fieldName: field.name,
|
||||
value:
|
||||
props.template.type === 'integer'
|
||||
? Math.floor(Number(v))
|
||||
: Number(v),
|
||||
})
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
if (
|
||||
!valueAsString.match(numberStringRegex) &&
|
||||
field.value !== Number(valueAsString)
|
||||
) {
|
||||
setValueAsString(String(field.value));
|
||||
}
|
||||
}, [field.value, valueAsString]);
|
||||
|
||||
return (
|
||||
<NumberInput
|
||||
onChange={handleValueChanged}
|
||||
value={field.value}
|
||||
value={valueAsString}
|
||||
step={props.template.type === 'integer' ? 1 : 0.1}
|
||||
precision={props.template.type === 'integer' ? 0 : 3}
|
||||
>
|
||||
|
Loading…
Reference in New Issue
Block a user