Skip to content

Commit 80089b5

Browse files
author
Nikita Skvortsov
committed
fix: fix numbers with leading zeroes after decimal point
1 parent a70bb45 commit 80089b5

File tree

1 file changed

+25
-0
lines changed
  • src/lib/core/components/Form/Controller

1 file changed

+25
-0
lines changed

src/lib/core/components/Form/Controller/utils.tsx

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,14 @@ import type {
4242
UpdateStoreParams,
4343
} from './types';
4444

45+
/*
46+
* Stores original string representation of numbers
47+
* used for correct intermediate representations of number
48+
* to display in cases when they are otherwise changed by conversion
49+
* e.g., 0.0 -> 0
50+
*/
51+
const originalNumberStringMap = new Map<string, string>();
52+
4553
const isErrorMutatorCorrect = (errorMutator: {value: ValidateError} | typeof EMPTY_MUTATOR) =>
4654
errorMutator !== EMPTY_MUTATOR &&
4755
(isString(errorMutator.value) ||
@@ -144,6 +152,15 @@ export const getRender = <DirtyValue extends FieldValue, SpecType extends Spec>(
144152
Layout,
145153
}: GetRenderParams<DirtyValue, SpecType>) => {
146154
const render = (props: FieldRenderProps<DirtyValue>) => {
155+
if (originalNumberStringMap.has(name)) {
156+
const originalString = originalNumberStringMap.get(name);
157+
if (Number(originalString) === Number(props.input.value)) {
158+
props.input.value = originalString as DirtyValue;
159+
} else {
160+
originalNumberStringMap.delete(name);
161+
}
162+
}
163+
147164
if (inputEntity && isCorrectSpec(spec) && isString(name)) {
148165
if (!spec.viewSpec.hidden) {
149166
const {layoutProps, inputProps} = spec.viewSpec;
@@ -297,6 +314,12 @@ export const getFieldMethods = <
297314
const error = validate?.(transformArrOut(_value)) || errorMutator;
298315
let value = transformArrIn(_value);
299316

317+
if (typeof value === 'string' && /^[0-9]+.[0-9]*0+$/.test(value)) {
318+
originalNumberStringMap.set(store.name, value);
319+
} else {
320+
originalNumberStringMap.delete(store.name);
321+
}
322+
300323
if (isNumberSpec(spec) && !error) {
301324
value = (isNil(value) || value === '' ? undefined : Number(value)) as DirtyValue;
302325
}
@@ -383,6 +406,8 @@ export const getFieldMethods = <
383406
) => {
384407
const {name, spec} = store;
385408

409+
originalNumberStringMap.delete(store.name);
410+
386411
if (isArraySpec(spec) || isObjectSpec(spec)) {
387412
return onChange(store, {
388413
valOrSetter: (currentValue) =>

0 commit comments

Comments
 (0)