From c88d512a9ab22347c855cbfe3deb6f69eeaae4ba Mon Sep 17 00:00:00 2001 From: Abdallah Al-Soqatri Date: Wed, 22 Jan 2025 12:35:57 +0100 Subject: [PATCH 1/3] Fixed issue with fields inside an array can't be set to empty when a default is set --- CHANGELOG.md | 1 + .../utils/src/mergeDefaultsWithFormData.ts | 2 +- .../test/mergeDefaultsWithFormData.test.ts | 32 +++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e0be4c35b7..f6d68721a7 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) # 5.24.1 diff --git a/packages/utils/src/mergeDefaultsWithFormData.ts b/packages/utils/src/mergeDefaultsWithFormData.ts index 03b076ab0a..0ff7d27fc6 100644 --- a/packages/utils/src/mergeDefaultsWithFormData.ts +++ b/packages/utils/src/mergeDefaultsWithFormData.ts @@ -41,7 +41,7 @@ export default function mergeDefaultsWithFormData( const overrideOppositeArray = overrideFormDataWithDefaults ? formData : defaultsArray; const mapped = overrideArray.map((value, idx) => { - if (overrideOppositeArray[idx]) { + if (typeof 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({}); }); From 9591698191c53a8013994deb47e8e52467d18fd6 Mon Sep 17 00:00:00 2001 From: Heath C <51679588+heath-freenome@users.noreply.github.com> Date: Fri, 24 Jan 2025 12:13:38 -0800 Subject: [PATCH 2/3] Update packages/utils/src/mergeDefaultsWithFormData.ts - Reviewer feedback --- packages/utils/src/mergeDefaultsWithFormData.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/utils/src/mergeDefaultsWithFormData.ts b/packages/utils/src/mergeDefaultsWithFormData.ts index 0ff7d27fc6..a63bd63e0f 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 (typeof overrideOppositeArray[idx] !== 'undefined') { + // 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], From 7511f10e56e7e8affce7c6a3eba1893b9433f736 Mon Sep 17 00:00:00 2001 From: Heath C <51679588+heath-freenome@users.noreply.github.com> Date: Fri, 24 Jan 2025 12:17:56 -0800 Subject: [PATCH 3/3] Update packages/utils/src/mergeDefaultsWithFormData.ts - Fix linting --- packages/utils/src/mergeDefaultsWithFormData.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/utils/src/mergeDefaultsWithFormData.ts b/packages/utils/src/mergeDefaultsWithFormData.ts index a63bd63e0f..dc7f8a2c54 100644 --- a/packages/utils/src/mergeDefaultsWithFormData.ts +++ b/packages/utils/src/mergeDefaultsWithFormData.ts @@ -41,7 +41,7 @@ export default function mergeDefaultsWithFormData( const overrideOppositeArray = overrideFormDataWithDefaults ? formData : defaultsArray; const mapped = overrideArray.map((value, idx) => { - // We want to explicitly make sure that the value is NOT undefined since null, 0 and empty space are valid values + // 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],