diff --git a/CHANGELOG.md b/CHANGELOG.md index 358c85bcc9..d32b33ec8d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ should change the heading of the (upcoming) version to include a major version b ## @rjsf/utils - switch `lodash.isEqualWith` to `fast-equals.createCustomEqual` providing `areFunctionsEqual` assuming any functions are equal. +- Fixed issue with fields inside an array can't be set to empty when a default is set, fixing [#4456](https://github.com/rjsf-team/react-jsonschema-form/issues/4456) - Fixed issue with file accept attribute, fixing [#4404](https://github.com/rjsf-team/react-jsonschema-form/issues/4404). ## @rjsf/mui diff --git a/packages/utils/src/mergeDefaultsWithFormData.ts b/packages/utils/src/mergeDefaultsWithFormData.ts index 03b076ab0a..dc7f8a2c54 100644 --- a/packages/utils/src/mergeDefaultsWithFormData.ts +++ b/packages/utils/src/mergeDefaultsWithFormData.ts @@ -41,7 +41,8 @@ export default function mergeDefaultsWithFormData( const overrideOppositeArray = overrideFormDataWithDefaults ? formData : defaultsArray; const mapped = overrideArray.map((value, idx) => { - if (overrideOppositeArray[idx]) { + // We want to explicitly make sure that the value is NOT undefined since null, 0 and empty space are valid values + if (overrideOppositeArray[idx] !== undefined) { return mergeDefaultsWithFormData( defaultsArray[idx], formData[idx], diff --git a/packages/utils/test/mergeDefaultsWithFormData.test.ts b/packages/utils/test/mergeDefaultsWithFormData.test.ts index 060cee8e6b..d12395b5bd 100644 --- a/packages/utils/test/mergeDefaultsWithFormData.test.ts +++ b/packages/utils/test/mergeDefaultsWithFormData.test.ts @@ -150,6 +150,38 @@ describe('mergeDefaultsWithFormData()', () => { expect(mergeDefaultsWithFormData({}, undefined, undefined, undefined, true)).toEqual(undefined); }); + it('should deeply merge and return formData when formData is undefined and defaultSupercedesUndefined false', () => { + expect( + mergeDefaultsWithFormData( + { + arrayWithDefaults: ['Hello World'], + objectWidthDefaults: { + nestedField: 'Hello World!', + }, + stringField: 'Hello World!!', + }, + { + arrayWithDefaults: [null], + objectWidthDefaults: { + nestedField: undefined, + }, + stringField: undefined, + nonEmptyField: 'Hello World!!!', + }, + undefined, + undefined, + true + ) + ).toEqual({ + arrayWithDefaults: [null], + objectWidthDefaults: { + nestedField: undefined, + }, + stringField: undefined, + nonEmptyField: 'Hello World!!!', + }); + }); + it('should return default when formData is undefined and defaultSupercedesUndefined true', () => { expect(mergeDefaultsWithFormData({}, undefined, undefined, true, true)).toEqual({}); });