Skip to content

Commit 58e5c5b

Browse files
committed
fix(renderer): fix numbers conversions
1 parent 8ddff97 commit 58e5c5b

File tree

3 files changed

+47
-7
lines changed

3 files changed

+47
-7
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './helpers';

packages/react-form-renderer/src/tests/form-renderer/data-types.test.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import FormRenderer from '../../form-renderer';
44
import FormTemplate from '../../../../../__mocks__/mock-form-template';
55
import componentTypes from '../../component-types';
66
import useFieldApi from '../../use-field-api';
7+
import convertType from '../../use-field-api/convert-type';
8+
import dataTypes from '../../data-types';
79

810
const DataTypeInput = (props) => {
911
const { input, type, label } = useFieldApi(props);
@@ -69,4 +71,28 @@ describe('data types', () => {
6971
expect.anything()
7072
);
7173
});
74+
75+
describe('converTypes', () => {
76+
describe('integer', () => {
77+
it('converts empty string', () => {
78+
expect(convertType(dataTypes.INTEGER, '')).toEqual('');
79+
});
80+
81+
it('converts zero', () => {
82+
expect(convertType(dataTypes.INTEGER, '0')).toEqual(0);
83+
});
84+
85+
it('converts an integer', () => {
86+
expect(convertType(dataTypes.INTEGER, '12132')).toEqual(12132);
87+
});
88+
89+
it('converts a string', () => {
90+
expect(convertType(dataTypes.INTEGER, 'abcd')).toEqual('abcd');
91+
});
92+
93+
it('converts a negative integer', () => {
94+
expect(convertType(dataTypes.INTEGER, '-12132')).toEqual(-12132);
95+
});
96+
});
97+
});
7298
});

packages/react-form-renderer/src/use-field-api/convert-type.js

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,30 @@ const castToBoolean = (value) => {
1212
return value === 'true';
1313
};
1414

15+
/**
16+
* Check if the value can be converted to number
17+
* @param {Any} value value to be checked
18+
*/
19+
const canBeConvertedToNumber = (value) => !isNaN(Number(value)) && value !== '';
20+
1521
/**
1622
* Changes the value type
1723
* @param {FieldDataTypes} dataType type for value conversion
1824
* @param {Any} value value to be converted
1925
*/
20-
const convertType = (dataType, value) =>
21-
({
22-
[dataTypes.INTEGER]: !isNaN(Number(value)) && parseInt(value),
23-
[dataTypes.FLOAT]: !isNaN(Number(value)) && parseFloat(value),
24-
[dataTypes.NUMBER]: Number(value),
25-
[dataTypes.BOOLEAN]: castToBoolean(value)
26-
}[dataType] || value);
26+
const convertType = (dataType, value) => {
27+
switch (dataType) {
28+
case dataTypes.INTEGER:
29+
return canBeConvertedToNumber(value) ? parseInt(value) : value;
30+
case dataTypes.FLOAT:
31+
return canBeConvertedToNumber(value) ? parseFloat(value) : value;
32+
case dataTypes.NUMBER:
33+
return canBeConvertedToNumber(value) ? Number(value) : value;
34+
case dataTypes.BOOLEAN:
35+
return castToBoolean(value);
36+
default:
37+
return value;
38+
}
39+
};
2740

2841
export default convertType;

0 commit comments

Comments
 (0)