Skip to content
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

When type is an array, child id schema is lost #2044

Closed
3 tasks done
Vestride opened this issue Sep 11, 2020 · 1 comment · Fixed by #3593
Closed
3 tasks done

When type is an array, child id schema is lost #2044

Vestride opened this issue Sep 11, 2020 · 1 comment · Fixed by #3593
Assignees

Comments

@Vestride
Copy link

Vestride commented Sep 11, 2020

Prerequisites

Playground link. Notice both "People" and "names" have the same id attribute in the DOM.

Description

If a parent schema has "type": ["object", "null"], the idSchema passed to the child <SchemaField> is an empty object {}. Duplicate id attributes now exist.

Steps to Reproduce

Schema:

{
  "title": "People",
  "type": ["object", "null"],
  "properties": {
    "names": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  }
}

If "type" is changed to "object", the issue does not occur. The issue also happens when the names property is an object with a title instead of an array.

Expected behavior

The names title should not have the same id (root__title) as the People title.

Actual behavior

The names title has the same id (root__title) as the People title.

Version

2.3.0


Changing this line to use getSchemaType "fixed" the issue for me locally, but one of the tests fails with that change.

if (schema.type !== "object") {

@Vestride Vestride changed the title When type is an array, id schema is lost When type is an array, child id schema is lost Sep 11, 2020
@heath-freenome
Copy link
Member

Hmmm, This is still happening in 5.5.0

@heath-freenome heath-freenome self-assigned this Apr 9, 2023
heath-freenome added a commit to heath-freenome/react-jsonschema-form that referenced this issue Apr 11, 2023
Fixes rjsf-team#3512 by updating the `getFirstMatchingOption()` and `getClosestMatchingOption()` to take an optional discriminator property to use for drilling into one-of Objects to simplify selection detection
Fixes rjsf-team#2044 Fixing the `toIdSchema()` generation to use the `getSchemaType()` function rather than just using `schema.type`

- In `@rjsf/utils`, updated the `SchemaUtilsType`, its associated class implementation and several functions to fix both bug as follows:
  - Updated `SchemaUtilsType` to add an optional `discriminatorField?: string` parameter to the `get(First|Closest|)MatchingOption()` functions
  - Updated `createSchemaUtils()` to take the new `discriminatorField` parameter and forward it onto the underlying function `get(First|Closest|)MatchingOption() implementations
  - Updated the `getClosestMatchingOption()` and `getFirstMatchingOption()` to pass the new `discriminatorField` to the `getMatchingOption()` function
  - Updated `getMatchingOption()` to use `discriminatorField` when it is present in the `options` object properties to drill into the object to detect if that one field is valid
  - Also updated the `toIdSchemaInternal()` function to use `getSchemaType(schema) === 'object'` rather than `schema.type === 'object'` to get the proper pathing for ids
- In `@rjsf/core`, updated the `MultiSchemaField`, to get the `discriminator.propertyName` value for a `anyOf/oneOf` object and pass it into `getClosestMatchingOption()`
  - Updated the `oneOf` and `anyOf` tests to verify the `discriminator` property works
  - Also updated the `oneOf` and `form` tests to update the few ids that were fixed by the `toIdSchema()` fix
  - Moved a test that was once just in the `bootstrap-4` theme related to `additionalProperties` being defined as true for a non-object type schema
- In the other themes, updated the snapshots to include the new test that was moved from `bootstrap-4` into the `objectTests`
  - Updated `bootstrap-4` to delete the `AdditionalProperties.test.tsx` and its associated snapshot since it was moved to `core`
- Updated the `utility-functions` documentation to add the new `discriminatorField` prop to the `get(First|Closest|)MatchingOption()` functions
- Updated the `CHANGELOG.md` file accordingly
heath-freenome added a commit to heath-freenome/react-jsonschema-form that referenced this issue Apr 11, 2023
Fixes rjsf-team#3512 by updating the `getFirstMatchingOption()` and `getClosestMatchingOption()` to take an optional discriminator property to use for drilling into one-of Objects to simplify selection detection
Fixes rjsf-team#2044 Fixing the `toIdSchema()` generation to use the `getSchemaType()` function rather than just using `schema.type`

- In `@rjsf/utils`, updated the `SchemaUtilsType`, its associated class implementation and several functions to fix both bug as follows:
  - Updated `SchemaUtilsType` to add an optional `discriminatorField?: string` parameter to the `get(First|Closest|)MatchingOption()` functions
  - Updated `createSchemaUtils()` to take the new `discriminatorField` parameter and forward it onto the underlying function `get(First|Closest|)MatchingOption() implementations
  - Updated the `getClosestMatchingOption()` and `getFirstMatchingOption()` to pass the new `discriminatorField` to the `getMatchingOption()` function
  - Updated `getMatchingOption()` to use `discriminatorField` when it is present in the `options` object properties to drill into the object to detect if that one field is valid
  - Also updated the `toIdSchemaInternal()` function to use `getSchemaType(schema) === 'object'` rather than `schema.type === 'object'` to get the proper pathing for ids
- In `@rjsf/core`, updated the `MultiSchemaField`, to get the `discriminator.propertyName` value for a `anyOf/oneOf` object and pass it into `getClosestMatchingOption()`
  - Updated the `oneOf` and `anyOf` tests to verify the `discriminator` property works
  - Also updated the `oneOf` and `form` tests to update the few ids that were fixed by the `toIdSchema()` fix
  - Moved a test that was once just in the `bootstrap-4` theme related to `additionalProperties` being defined as true for a non-object type schema
- In the other themes, updated the snapshots to include the new test that was moved from `bootstrap-4` into the `objectTests`
  - Updated `bootstrap-4` to delete the `AdditionalProperties.test.tsx` and its associated snapshot since it was moved to `core`
- Updated the `utility-functions` documentation to add the new `discriminatorField` prop to the `get(First|Closest|)MatchingOption()` functions
- Updated the `CHANGELOG.md` file accordingly
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants