-
Notifications
You must be signed in to change notification settings - Fork 2.3k
feat: allow override form values with defaults #4625
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 2 commits
f359660
4337166
3591e80
f93b507
383f258
7d608b0
a2971e0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -16,6 +16,10 @@ should change the heading of the (upcoming) version to include a major version b | |
|
||
--> | ||
|
||
## @rjsf/util | ||
|
||
- Allow form value overrides with defaults [#4625](https://github.com/rjsf-team/react-jsonschema-form/pull/4625 | ||
|
||
|
||
# 6.0.0-beta.8 | ||
|
||
## @rjsf/util | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -141,13 +141,13 @@ describe('mergeDefaultsWithFormData()', () => { | |
expect(mergeDefaultsWithFormData(obj1, obj2)?.a).toBeInstanceOf(File); | ||
}); | ||
|
||
describe('test with overrideFormDataWithDefaults set to true', () => { | ||
describe('test with overrideFormDataWithDefaults set to `merge`', () => { | ||
it('should return data in formData when no defaults', () => { | ||
expect(mergeDefaultsWithFormData(undefined, [2], undefined, undefined, true)).toEqual([2]); | ||
expect(mergeDefaultsWithFormData(undefined, [2], undefined, undefined, 'merge')).toEqual([2]); | ||
}); | ||
|
||
it('should return formData when formData is undefined', () => { | ||
expect(mergeDefaultsWithFormData({}, undefined, undefined, undefined, true)).toEqual(undefined); | ||
expect(mergeDefaultsWithFormData({}, undefined, undefined, undefined, 'merge')).toEqual(undefined); | ||
}); | ||
|
||
it('should deeply merge and return formData when formData is undefined and defaultSupercedesUndefined false', () => { | ||
|
@@ -170,7 +170,7 @@ describe('mergeDefaultsWithFormData()', () => { | |
}, | ||
undefined, | ||
undefined, | ||
true, | ||
'merge', | ||
), | ||
).toEqual({ | ||
arrayWithDefaults: [null], | ||
|
@@ -183,42 +183,42 @@ describe('mergeDefaultsWithFormData()', () => { | |
}); | ||
|
||
it('should return default when formData is undefined and defaultSupercedesUndefined true', () => { | ||
expect(mergeDefaultsWithFormData({}, undefined, undefined, true, true)).toEqual({}); | ||
expect(mergeDefaultsWithFormData({}, undefined, undefined, true, 'merge')).toEqual({}); | ||
}); | ||
|
||
it('should return default when formData is null and defaultSupercedesUndefined true', () => { | ||
expect(mergeDefaultsWithFormData({}, null, undefined, true, true)).toEqual({}); | ||
expect(mergeDefaultsWithFormData({}, null, undefined, true, 'merge')).toEqual({}); | ||
}); | ||
|
||
it('should merge two one-level deep objects', () => { | ||
expect(mergeDefaultsWithFormData({ a: 1 }, { b: 2 }, undefined, undefined, true)).toEqual({ | ||
expect(mergeDefaultsWithFormData({ a: 1 }, { b: 2 }, undefined, undefined, 'merge')).toEqual({ | ||
a: 1, | ||
b: 2, | ||
}); | ||
}); | ||
|
||
it('should override the first object with the values from the second', () => { | ||
expect(mergeDefaultsWithFormData({ a: 1 }, { a: 2 }, undefined, undefined, true)).toEqual({ a: 1 }); | ||
expect(mergeDefaultsWithFormData({ a: 1 }, { a: 2 }, undefined, undefined, 'merge')).toEqual({ a: 1 }); | ||
}); | ||
|
||
it('should override non-existing values of the first object with the values from the second', () => { | ||
expect( | ||
mergeDefaultsWithFormData({ a: { b: undefined } }, { a: { b: { c: 1 } } }, undefined, undefined, true), | ||
mergeDefaultsWithFormData({ a: { b: undefined } }, { a: { b: { c: 1 } } }, undefined, undefined, 'merge'), | ||
).toEqual({ | ||
a: { b: { c: 1 } }, | ||
}); | ||
}); | ||
|
||
it('should merge arrays using entries from second', () => { | ||
expect(mergeDefaultsWithFormData([1, 2, 3], [4, 5], undefined, undefined, true)).toEqual([1, 2, 3]); | ||
expect(mergeDefaultsWithFormData([1, 2, 3], [4, 5], undefined, undefined, 'merge')).toEqual([1, 2, 3]); | ||
}); | ||
|
||
it('should merge arrays using entries from second and extra from the first', () => { | ||
expect(mergeDefaultsWithFormData([1, 2], [4, 5, 6], undefined, undefined, true)).toEqual([1, 2, 6]); | ||
expect(mergeDefaultsWithFormData([1, 2], [4, 5, 6], undefined, undefined, 'merge')).toEqual([1, 2, 6]); | ||
}); | ||
|
||
it('should deeply merge arrays with overlapping entries', () => { | ||
expect(mergeDefaultsWithFormData([{ a: 1 }], [{ b: 2 }, { c: 3 }], undefined, undefined, true)).toEqual([ | ||
expect(mergeDefaultsWithFormData([{ a: 1 }], [{ b: 2 }, { c: 3 }], undefined, undefined, 'merge')).toEqual([ | ||
{ a: 1, b: 2 }, | ||
{ c: 3 }, | ||
]); | ||
|
@@ -256,7 +256,7 @@ describe('mergeDefaultsWithFormData()', () => { | |
}, | ||
c: 2, | ||
}; | ||
expect(mergeDefaultsWithFormData<any>(obj1, obj2, undefined, undefined, true)).toEqual(expected); | ||
expect(mergeDefaultsWithFormData<any>(obj1, obj2, undefined, undefined, 'merge')).toEqual(expected); | ||
}); | ||
|
||
it('should recursively merge deeply nested objects, including extra array data', () => { | ||
|
@@ -293,7 +293,7 @@ describe('mergeDefaultsWithFormData()', () => { | |
c: 2, | ||
d: 4, | ||
}; | ||
expect(mergeDefaultsWithFormData<any>(obj1, obj2, undefined, undefined, true)).toEqual(expected); | ||
expect(mergeDefaultsWithFormData<any>(obj1, obj2, undefined, undefined, 'merge')).toEqual(expected); | ||
}); | ||
|
||
it('should recursively merge File objects', () => { | ||
|
@@ -307,4 +307,94 @@ describe('mergeDefaultsWithFormData()', () => { | |
expect(mergeDefaultsWithFormData(obj1, obj2)?.a).toBeInstanceOf(File); | ||
}); | ||
}); | ||
|
||
describe('test with overrideFormDataWithDefaults set to `replace`', () => { | ||
it('should return empty array even when no defaults', () => { | ||
expect(mergeDefaultsWithFormData(undefined, [2], undefined, undefined, 'replace')).toEqual([]); | ||
}); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe I'm misunderstanding the feature...why does this return an empty array? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That's because undefined will be treated as missing value for this, so replaced with proper default for arrays (empty). Do you think it's incorrect? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. My assumption was that |
||
|
||
it('should return default when formData is undefined', () => { | ||
expect(mergeDefaultsWithFormData({}, undefined, undefined, undefined, 'replace')).toEqual({}); | ||
}); | ||
|
||
it('should return default when formData is undefined and defaultSupercedesUndefined true', () => { | ||
expect(mergeDefaultsWithFormData({}, undefined, undefined, true, 'replace')).toEqual({}); | ||
}); | ||
|
||
it('should return default when formData is null and defaultSupercedesUndefined true', () => { | ||
expect(mergeDefaultsWithFormData({}, null, undefined, true, 'replace')).toEqual({}); | ||
}); | ||
|
||
it('should not merge two one-level deep objects', () => { | ||
expect(mergeDefaultsWithFormData({ a: 1 }, { b: 2 }, undefined, undefined, 'replace')).toEqual({ | ||
a: 1, | ||
}); | ||
}); | ||
|
||
it('should not override the first object with the values from the second', () => { | ||
expect(mergeDefaultsWithFormData({ a: 1 }, { a: 2 }, undefined, undefined, 'replace')).toEqual({ a: 1 }); | ||
}); | ||
|
||
it('should not return undefined from defaults', () => { | ||
expect( | ||
mergeDefaultsWithFormData({ a: { b: undefined } }, { a: { b: { c: 1 } } }, undefined, undefined, 'replace'), | ||
).toEqual({ | ||
a: { b: {} }, | ||
}); | ||
}); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I do not know actually how it might happen in JSON schema, I just tried to repeat existing tests. Here we wiill replace missing value (undefined from default arg) with proper default for object (empty one). Do you think it's incorect? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It looks like our |
||
|
||
it('should not merge arrays using entries from second', () => { | ||
expect(mergeDefaultsWithFormData([1, 2, 3], [4, 5], undefined, undefined, 'replace')).toEqual([1, 2, 3]); | ||
}); | ||
|
||
it('should not deeply merge arrays with overlapping entries', () => { | ||
expect(mergeDefaultsWithFormData([{ a: 1 }], [{ b: 2 }, { c: 3 }], undefined, undefined, 'replace')).toEqual([ | ||
{ a: 1 }, | ||
]); | ||
}); | ||
|
||
it('should replace objects', () => { | ||
const obj1 = { | ||
a: 1, | ||
b: { | ||
c: 3, | ||
d: [1, 2, 3], | ||
e: { f: { g: 1 } }, | ||
h: [{ i: 1 }, { i: 2 }], | ||
}, | ||
c: 2, | ||
}; | ||
const obj2 = { | ||
a: 1, | ||
b: { | ||
d: [3], | ||
e: { f: { h: 2 } }, | ||
g: 1, | ||
h: [{ i: 3 }, { i: 4 }, { i: 5 }], | ||
}, | ||
c: 3, | ||
d: 4, | ||
}; | ||
expect(mergeDefaultsWithFormData<any>(obj1, obj2, undefined, undefined, 'replace')).toEqual({ | ||
a: 1, | ||
b: { | ||
c: 3, | ||
d: [1, 2, 3], | ||
e: { f: { g: 1 } }, | ||
h: [{ i: 1 }, { i: 2 }], | ||
}, | ||
c: 2, | ||
}); | ||
}); | ||
|
||
it('should replace arrays', () => { | ||
expect(mergeDefaultsWithFormData([1, 2], [4, 5, 6], undefined, undefined, 'replace')).toEqual([1, 2]); | ||
}); | ||
|
||
it('should replace objects', () => { | ||
expect(mergeDefaultsWithFormData({ a: { b: 1 } }, { a: { b: 2 } }, undefined, undefined, 'replace')).toEqual({ | ||
a: { b: 1 }, | ||
}); | ||
}); | ||
}); | ||
}); |
Uh oh!
There was an error while loading. Please reload this page.