Skip to content

Commit 67f2338

Browse files
authored
Merge pull request #775 from rvsia/convertInitialValue
fix(manager): convert initialValue/defaultValue when dataType
2 parents dc7b4bf + 971f5c6 commit 67f2338

File tree

4 files changed

+61
-6
lines changed

4 files changed

+61
-6
lines changed

packages/form-state-manager/src/files/use-field.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ import FormManagerContext from '../files/form-manager-context';
33
import UseField, { OnChangeEvent, UseFieldData, Format } from '../types/use-field';
44
import isEmpty from 'lodash/isEmpty';
55

6-
import convertType from '../utils/convert-type';
76
import generateId from '../utils/generate-id';
7+
import convertValue from '../utils/convert-value';
88

99
const checkboxTypes = ['checkbox', 'radio'];
1010

@@ -75,13 +75,13 @@ const useField = ({
7575

7676
registerField({
7777
name,
78-
initialValue,
78+
initialValue: dataType ? convertValue(initialValue, dataType) : initialValue,
7979
initializeOnMount,
8080
render,
8181
validate,
8282
subscription,
8383
internalId,
84-
defaultValue,
84+
defaultValue: dataType ? convertValue(defaultValue, dataType) : defaultValue,
8585
beforeSubmit,
8686
afterSubmit
8787
});
@@ -98,9 +98,7 @@ const useField = ({
9898
const hasClearedValue = Object.prototype.hasOwnProperty.call(props, 'clearedValue') || Object.prototype.hasOwnProperty.call(rest, 'clearedValue');
9999

100100
if (dataType) {
101-
sanitizedValue = Array.isArray(sanitizedValue)
102-
? sanitizedValue.map((item) => convertType(dataType, sanitizeValue(item)))
103-
: convertType(dataType, sanitizedValue);
101+
sanitizedValue = convertValue(sanitizedValue, dataType);
104102
}
105103

106104
if (hasClearedValue && checkEmpty(sanitizedValue) && typeof state?.meta.initial === 'undefined') {

packages/form-state-manager/src/tests/files/use-field.test.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -672,6 +672,36 @@ describe('useField', () => {
672672

673673
expect(managerApi().values.field).toEqual([1, 2, 45]);
674674
});
675+
676+
it('should parse initialValue - float', async () => {
677+
wrapper = mount(
678+
<FormManagerContext.Provider value={{ ...managerApi(), formOptions: managerApi }}>
679+
<Setter name="field" dataType="float" initialValue="12.34" />
680+
</FormManagerContext.Provider>
681+
);
682+
683+
expect(managerApi().values.field).toEqual(12.34);
684+
});
685+
686+
it('should parse defaultValue - float', async () => {
687+
wrapper = mount(
688+
<FormManagerContext.Provider value={{ ...managerApi(), formOptions: managerApi }}>
689+
<Setter name="field" dataType="float" defaultValue="12.34" />
690+
</FormManagerContext.Provider>
691+
);
692+
693+
expect(managerApi().values.field).toEqual(12.34);
694+
});
695+
696+
it('should parse defaultValue - objects', async () => {
697+
wrapper = mount(
698+
<FormManagerContext.Provider value={{ ...managerApi(), formOptions: managerApi }}>
699+
<Setter name="field" dataType="float" defaultValue={[{ value: '23.67' }, { value: '123.34' }]} />
700+
</FormManagerContext.Provider>
701+
);
702+
703+
expect(managerApi().values.field).toEqual([{ value: 23.67 }, { value: 123.34 }]);
704+
});
675705
});
676706

677707
describe('type', () => {

packages/form-state-manager/src/types/data-types.d.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1+
import AnyObject from './any-object';
2+
13
export type DataType = 'integer' | 'float' | 'number' | 'boolean' | 'string';
4+
export type BasicTypes = number | boolean | string;
5+
export type DataTypeTypes = BasicTypes | AnyObject | Array<BasicTypes>;
26

37
interface dataTypes {
48
INTEGER: 'integer';
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import convertType from './convert-type';
2+
import { DataType, DataTypeTypes } from '../types/data-types';
3+
4+
const convertValue = (value: any, dataType: DataType): DataTypeTypes => {
5+
if (value === undefined || !dataType) {
6+
return value;
7+
}
8+
9+
if (Array.isArray(value)) {
10+
return value.map((value) =>
11+
typeof value === 'object'
12+
? {
13+
...value,
14+
value: Object.prototype.hasOwnProperty.call(value, 'value') ? convertType(dataType, value.value) : value
15+
}
16+
: convertType(dataType, value)
17+
);
18+
}
19+
20+
return convertType(dataType, value);
21+
};
22+
23+
export default convertValue;

0 commit comments

Comments
 (0)