feat(ui): number collection generator supports floats

This commit is contained in:
psychedelicious
2025-01-13 17:12:17 +11:00
parent acceac8304
commit d63ff560d6

View File

@@ -85,6 +85,42 @@ export const NumberFieldCollectionInputComponent = memo(
store.dispatch(fieldNumberCollectionValueChanged({ nodeId, fieldName: field.name, value: newValue }));
}, [field.value, field.name, store, nodeId]);
const min = useMemo(() => {
let min = -NUMPY_RAND_MAX;
if (!isNil(fieldTemplate.minimum)) {
min = fieldTemplate.minimum;
}
if (!isNil(fieldTemplate.exclusiveMinimum)) {
min = fieldTemplate.exclusiveMinimum + 0.01;
}
return min;
}, [fieldTemplate.exclusiveMinimum, fieldTemplate.minimum]);
const max = useMemo(() => {
let max = NUMPY_RAND_MAX;
if (!isNil(fieldTemplate.maximum)) {
max = fieldTemplate.maximum;
}
if (!isNil(fieldTemplate.exclusiveMaximum)) {
max = fieldTemplate.exclusiveMaximum - 0.01;
}
return max;
}, [fieldTemplate.exclusiveMaximum, fieldTemplate.maximum]);
const step = useMemo(() => {
if (isNil(fieldTemplate.multipleOf)) {
return isIntegerField ? 1 : 0.1;
}
return fieldTemplate.multipleOf;
}, [fieldTemplate.multipleOf, isIntegerField]);
const fineStep = useMemo(() => {
if (isNil(fieldTemplate.multipleOf)) {
return isIntegerField ? 1 : 0.01;
}
return fieldTemplate.multipleOf;
}, [fieldTemplate.multipleOf, isIntegerField]);
return (
<Flex
className="nodrag"
@@ -132,10 +168,28 @@ export const NumberFieldCollectionInputComponent = memo(
/>
</Flex>
{field.value && !Array.isArray(field.value) && (
<GeneratorEntry nodeId={nodeId} fieldName={field.name} value={field.value} fieldTemplate={fieldTemplate} />
<GeneratorEntry
nodeId={nodeId}
fieldName={field.name}
value={field.value}
fieldTemplate={fieldTemplate}
min={min}
max={max}
step={step}
fineStep={fineStep}
/>
)}
{field.value && Array.isArray(field.value) && field.value.length > 0 && (
<ManualEntry nodeId={nodeId} fieldName={field.name} value={field.value} fieldTemplate={fieldTemplate} />
<ManualEntry
nodeId={nodeId}
fieldName={field.name}
value={field.value}
fieldTemplate={fieldTemplate}
min={min}
max={max}
step={step}
fineStep={fineStep}
/>
)}
</Flex>
);
@@ -145,18 +199,22 @@ export const NumberFieldCollectionInputComponent = memo(
NumberFieldCollectionInputComponent.displayName = 'NumberFieldCollectionInputComponent';
const GeneratorEntry = ({
step,
fineStep,
nodeId,
fieldName,
value,
fieldTemplate,
}: {
min: number;
max: number;
step: number;
fineStep: number;
nodeId: string;
fieldName: string;
value: IntegerStartStepCountGenerator | FloatStartStepCountGenerator;
fieldTemplate: IntegerFieldCollectionInputTemplate | FloatFieldCollectionInputTemplate;
}) => {
const dispatch = useAppDispatch();
const isIntegerField = useMemo(() => fieldTemplate.type.name === 'IntegerField', [fieldTemplate.type]);
const onChangeStart = useCallback(
(v: number) => {
const newValue = { ...value, start: v };
@@ -183,7 +241,14 @@ const GeneratorEntry = ({
<Flex gap={2}>
<FormControl>
<FormLabel m={0}>Start</FormLabel>
<CompositeNumberInput value={value.start} onChange={onChangeStart} min={-Infinity} max={Infinity} />
<CompositeNumberInput
value={value.start}
onChange={onChangeStart}
min={-Infinity}
max={Infinity}
step={step}
fineStep={fineStep}
/>
</FormControl>
<FormControl>
<FormLabel m={0}>Count</FormLabel>
@@ -196,7 +261,8 @@ const GeneratorEntry = ({
onChange={onChangeStep}
min={-Infinity}
max={Infinity}
step={isIntegerField ? 1 : 0.1}
step={step}
fineStep={fineStep}
/>
</FormControl>
</Flex>
@@ -204,11 +270,19 @@ const GeneratorEntry = ({
};
const ManualEntry = ({
min,
max,
step,
fineStep,
nodeId,
fieldName,
value,
fieldTemplate,
}: {
min: number;
max: number;
step: number;
fineStep: number;
nodeId: string;
fieldName: string;
value: number[];
@@ -235,42 +309,6 @@ const ManualEntry = ({
[value, dispatch, nodeId, fieldName]
);
const min = useMemo(() => {
let min = -NUMPY_RAND_MAX;
if (!isNil(fieldTemplate.minimum)) {
min = fieldTemplate.minimum;
}
if (!isNil(fieldTemplate.exclusiveMinimum)) {
min = fieldTemplate.exclusiveMinimum + 0.01;
}
return min;
}, [fieldTemplate.exclusiveMinimum, fieldTemplate.minimum]);
const max = useMemo(() => {
let max = NUMPY_RAND_MAX;
if (!isNil(fieldTemplate.maximum)) {
max = fieldTemplate.maximum;
}
if (!isNil(fieldTemplate.exclusiveMaximum)) {
max = fieldTemplate.exclusiveMaximum - 0.01;
}
return max;
}, [fieldTemplate.exclusiveMaximum, fieldTemplate.maximum]);
const step = useMemo(() => {
if (isNil(fieldTemplate.multipleOf)) {
return isIntegerField ? 1 : 0.1;
}
return fieldTemplate.multipleOf;
}, [fieldTemplate.multipleOf, isIntegerField]);
const fineStep = useMemo(() => {
if (isNil(fieldTemplate.multipleOf)) {
return isIntegerField ? 1 : 0.01;
}
return fieldTemplate.multipleOf;
}, [fieldTemplate.multipleOf, isIntegerField]);
return (
<Box w="full" h="full">
<OverlayScrollbarsComponent