react-jsonschema-form icon indicating copy to clipboard operation
react-jsonschema-form copied to clipboard

Object defaults for "additionalProperties" result in rows that cannot be deleted and have side effects when modified

Open dd12440 opened this issue 2 years ago • 6 comments

Prerequisites

What theme are you using?

mui

Version

5.9.0

Current Behavior

For an object type, default values are seemingly assumed to map to "properties" rather than "additionalProperties," or at the very least, mapping them to "additionalProperties" does not seem to work as expected. Take the following JSONSchema example:

{
  "title": "Test Defaults",
  "default": {
    "test-key": "test-value"
  },
  "description": "A simple form with additional properties example.",
  "type": "object",
  "additionalProperties": {
    "type": "string"
  }
}

As the linked playground shows, when the form renders, it does render with an entry matching the "test-key" entry in the default. However, the following issues are present:

  1. It is not possible to delete the entry (despite it being an "additional" property)
  2. Changing the key and blurring results in additional rows being generated
  3. The initial key remains in formData but does not appear in the form anymore

Expected Behavior

Any object key specified within the default object should be understood to be an "additional" property if it does not match some property specified in "properties". Thus, the following conditions would hold:

  1. The entry would appear as it currently does
  2. The entry could be deleted
  3. The entry could have its key changed with no side effects e.g. generating additional rows

Steps To Reproduce

  1. View the shared playground here.
  2. Attempt to delete the defaulted row and observe that it is not possible
  3. Change "test-key" to "test-key2" and blur; observe the newly created row

Environment

Shared playground

Anything else?

No response

dd12440 avatar Jul 10 '23 22:07 dd12440

@dd12440 Wow! great bug find. Given how little time us few maintainers get to spend on the project (we volunteer a few hours a week generally), we could really use some help fixing this. Is this something you can help us with?

heath-freenome avatar Jul 14 '23 15:07 heath-freenome

@heath-freenome, I'm going to plan to try to find time to prioritize this. With that said, if anyone else is experiencing this issue and is motivated to address it, then there will be no complaints from me.

dd12440 avatar Aug 29 '23 18:08 dd12440

@dd12440 that would be awesome

heath-freenome avatar Aug 29 '23 19:08 heath-freenome

https://github.com/rjsf-team/react-jsonschema-form/blob/ef5afed2e86947c8b9d959a87e4749d31098d508/packages/utils/src/schema/getDefaultFormState.ts#L472-L474

When the above code called immediately after changing the form, the formData value come as { test-key1: 'test-value' }. But default value ({ "test-key": "test-value" }) is still in defaults. The result of merging the two values (formData and defaults) is {test-key: 'test-value', test-key1: 'test-value'}.

HanJaeJoon avatar Apr 26 '24 09:04 HanJaeJoon

Any update on this? I just ran into the same issue. Looks like onChange is regenerating the defaults and merging them every time something changes (edit/remove). Is that expected behavior?

Piotr-Debicki avatar Jun 07 '24 18:06 Piotr-Debicki

My only update here is that I have not and (unfortunately) do not expect to be able to work on this in the foreseeable future. If someone else has time, this would certainly be a major improvement to the library.

dd12440 avatar Jun 07 '24 18:06 dd12440