From 5ec57ce76d727e61a35f2e4068066d07eed2b108 Mon Sep 17 00:00:00 2001 From: Abdallah Al-Soqatri Date: Fri, 1 Nov 2024 00:36:09 +0100 Subject: [PATCH 1/3] Fixed issue with array schema defaults not applying properly when formData is an empty array. --- CHANGELOG.md | 8 +++- .../utils/src/schema/getDefaultFormState.ts | 19 +++++--- .../test/schema/getDefaultFormStateTest.ts | 43 +++++++++++++++++++ 3 files changed, 64 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ddc02ffd3..3bd28518c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,11 +16,17 @@ should change the heading of the (upcoming) version to include a major version b --> +# 5.22.4 + +## @rjsf/utils + +- Fixed issue with array schema defaults not applying properly when formData is an empty array, fixing [#4335](https://github.com/rjsf-team/react-jsonschema-form/issues/4335). + # 5.22.3 ## @rjsf/utils -- Fixed deep nested dependencies issue with assigning values to formData, fixing [[#4334](https://github.com/rjsf-team/react-jsonschema-form/issues/4334)] +- Fixed deep nested dependencies issue with assigning values to formData, fixing [#4334](https://github.com/rjsf-team/react-jsonschema-form/issues/4334) # 5.22.2 diff --git a/packages/utils/src/schema/getDefaultFormState.ts b/packages/utils/src/schema/getDefaultFormState.ts index b82462fb99..1e39ef2878 100644 --- a/packages/utils/src/schema/getDefaultFormState.ts +++ b/packages/utils/src/schema/getDefaultFormState.ts @@ -432,11 +432,15 @@ export function getArrayDefaults false); const isSkipEmptyDefaults = experimental_defaultFormStateBehavior?.emptyObjectFields === 'skipEmptyDefaults'; - const computeSkipPopulate = - experimental_defaultFormStateBehavior?.arrayMinItems?.computeSkipPopulate ?? (() => false); const emptyDefault = isSkipEmptyDefaults ? undefined : []; @@ -460,7 +464,7 @@ export function getArrayDefaults { + const itemDefaults = rawFormData.map((item: T, idx: number) => { return computeDefaults(validator, schemaItem, { rootSchema, _recurseList, @@ -470,6 +474,11 @@ export function getArrayDefaults { + const schema: RJSFSchema = { + type: 'array', + minItems: 4, + default: ['Raphael', 'Michaelangelo'], + items: { + type: 'string', + default: 'Unknown', + }, + }; + + expect( + computeDefaults(testValidator, schema, { + rootSchema: schema, + includeUndefinedValues: 'excludeObjectChildren', + }) + ).toEqual(['Raphael', 'Michaelangelo', 'Unknown', 'Unknown']); + }); + it('test an array with defaults with empty array as formData', () => { + const schema: RJSFSchema = { + type: 'array', + minItems: 4, + default: ['Raphael', 'Michaelangelo'], + items: { + type: 'string', + default: 'Unknown', + }, + }; + + expect( + computeDefaults(testValidator, schema, { + rootSchema: schema, + rawFormData: [], + includeUndefinedValues: 'excludeObjectChildren', + experimental_defaultFormStateBehavior: { + arrayMinItems: { + mergeExtraDefaults: true, + populate: 'all', + }, + }, + }) + ).toEqual(['Raphael', 'Michaelangelo', 'Unknown', 'Unknown']); + }); it('test computeDefaults handles an invalid property schema', () => { const schema: RJSFSchema = { type: 'object', From 24d34115843c683da15caf242627332c50d22596 Mon Sep 17 00:00:00 2001 From: Abdallah Al-Soqatri Date: Wed, 6 Nov 2024 23:22:20 +0100 Subject: [PATCH 2/3] improvement based on feedback --- packages/utils/src/schema/getDefaultFormState.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/utils/src/schema/getDefaultFormState.ts b/packages/utils/src/schema/getDefaultFormState.ts index 1e39ef2878..b765da2fab 100644 --- a/packages/utils/src/schema/getDefaultFormState.ts +++ b/packages/utils/src/schema/getDefaultFormState.ts @@ -432,9 +432,8 @@ export function getArrayDefaults Date: Wed, 6 Nov 2024 23:27:35 +0100 Subject: [PATCH 3/3] fixed docs error --- packages/docs/docs/api-reference/form-props.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/docs/docs/api-reference/form-props.md b/packages/docs/docs/api-reference/form-props.md index 7cda5b464b..e3aa52215a 100644 --- a/packages/docs/docs/api-reference/form-props.md +++ b/packages/docs/docs/api-reference/form-props.md @@ -181,7 +181,7 @@ render( schema={schema} validator={validator} experimental_defaultFormStateBehavior={{ - arrayMinItems: { populate: 'requiredOnly' }, + emptyObjectFields: 'populateRequiredDefaults', }} />, document.getElementById('app')