Skip to content

Commit a15fffa

Browse files
authored
fix: mergeDefaultsWithFormData should treat null as a defined default value (#4745)
1 parent 374d440 commit a15fffa

File tree

4 files changed

+23
-1
lines changed

4 files changed

+23
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ should change the heading of the (upcoming) version to include a major version b
3737

3838
- BREAKING CHANGE: Removed `formContext` from the following interfaces because it is available on `registry`:
3939
- `ErrorListProps`, `FieldProps`, `FieldTemplateProps`, `ArrayFieldTemplateProps` and `WidgetProps`
40+
- Update `mergeDefaultsWithFormData` to properly handle overriding `undefined` formData with a `null` default value, fixing [#4734](https://github.com/rjsf-team/react-jsonschema-form/issues/4734)
4041

4142
## Dev / docs / playground
4243

packages/utils/src/mergeDefaultsWithFormData.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ export default function mergeDefaultsWithFormData<T = any>(
102102
*/
103103
if (
104104
(defaultSupercedesUndefined &&
105-
((!isNil(defaults) && isNil(formData)) || (typeof formData === 'number' && isNaN(formData)))) ||
105+
((!(defaults === undefined) && isNil(formData)) || (typeof formData === 'number' && isNaN(formData)))) ||
106106
(overrideFormDataWithDefaults && !isNil(formData))
107107
) {
108108
return defaults;

packages/utils/test/mergeDefaultsWithFormData.test.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,13 @@ describe('mergeDefaultsWithFormData()', () => {
2929
expect(mergeDefaultsWithFormData({}, null, undefined, true)).toEqual({});
3030
});
3131

32+
it('should return null if default is null and formData is undefined and defaultSupercedesUndefined is true', () => {
33+
const defaultValue = null;
34+
const formData = undefined;
35+
const defaultSupercedesUndefined = true;
36+
expect(mergeDefaultsWithFormData(defaultValue, formData, undefined, defaultSupercedesUndefined)).toBeNull();
37+
});
38+
3239
it('should return undefined when formData is undefined', () => {
3340
expect(mergeDefaultsWithFormData(undefined, undefined)).toBeUndefined();
3441
});

packages/utils/test/schema/getDefaultFormStateTest.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4990,5 +4990,19 @@ export default function getDefaultFormStateTest(testValidator: TestValidatorType
49904990
}),
49914991
).toEqual({ stringArray: [undefined], numberArray: [] });
49924992
});
4993+
it('handles a `null` default value', () => {
4994+
const schema: RJSFSchema = {
4995+
type: 'object',
4996+
properties: {
4997+
empty: {
4998+
type: 'null',
4999+
default: null,
5000+
},
5001+
},
5002+
};
5003+
expect(getDefaultFormState(testValidator, schema, {}, schema)).toEqual({
5004+
empty: null,
5005+
});
5006+
});
49935007
});
49945008
}

0 commit comments

Comments
 (0)