diff --git a/.changeset/slimy-stingrays-type.md b/.changeset/slimy-stingrays-type.md new file mode 100644 index 0000000000..9c520cf1d0 --- /dev/null +++ b/.changeset/slimy-stingrays-type.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': patch +--- + +fix uiSchema generation when using complex dependencies diff --git a/plugins/scaffolder/src/components/MultistepJsonForm/schema.test.ts b/plugins/scaffolder/src/components/MultistepJsonForm/schema.test.ts index ef6b582021..af5bb7fac5 100644 --- a/plugins/scaffolder/src/components/MultistepJsonForm/schema.test.ts +++ b/plugins/scaffolder/src/components/MultistepJsonForm/schema.test.ts @@ -347,6 +347,128 @@ describe('transformSchemaToProps', () => { }); }); + it('transforms schema with complex dependencies', () => { + const inputSchema = { + type: 'object', + properties: { + conditional: { + title: 'Person', + type: 'object', + properties: { + 'Do you have any pets?': { + type: 'string', + enum: ['No', 'Yes: One', 'Yes: More than one'], + default: 'No', + 'ui:widget': 'radio', + }, + }, + required: ['Do you have any pets?'], + dependencies: { + 'Do you have any pets?': { + oneOf: [ + { + properties: { + 'Do you have any pets?': { + enum: ['No'], + }, + }, + }, + { + properties: { + 'Do you have any pets?': { + enum: ['Yes: One'], + }, + 'How old is your pet?': { + type: 'number', + }, + }, + required: ['How old is your pet?'], + }, + { + properties: { + 'Do you have any pets?': { + enum: ['Yes: More than one'], + }, + 'Do you want to get rid of any?': { + type: 'boolean', + }, + }, + required: ['Do you want to get rid of any?'], + }, + ], + }, + }, + }, + }, + }; + const expectedSchema = { + type: 'object', + properties: { + conditional: { + title: 'Person', + type: 'object', + properties: { + 'Do you have any pets?': { + type: 'string', + enum: ['No', 'Yes: One', 'Yes: More than one'], + default: 'No', + }, + }, + required: ['Do you have any pets?'], + dependencies: { + 'Do you have any pets?': { + oneOf: [ + { + properties: { + 'Do you have any pets?': { + enum: ['No'], + }, + }, + }, + { + properties: { + 'Do you have any pets?': { + enum: ['Yes: One'], + }, + 'How old is your pet?': { + type: 'number', + }, + }, + required: ['How old is your pet?'], + }, + { + properties: { + 'Do you have any pets?': { + enum: ['Yes: More than one'], + }, + 'Do you want to get rid of any?': { + type: 'boolean', + }, + }, + required: ['Do you want to get rid of any?'], + }, + ], + }, + }, + }, + }, + }; + const expectedUiSchema = { + conditional: { + 'Do you have any pets?': { + 'ui:widget': 'radio', + }, + 'Do you want to get rid of any?': {}, + 'How old is your pet?': {}, + }, + }; + + expect(transformSchemaToProps(inputSchema)).toEqual({ + schema: expectedSchema, + uiSchema: expectedUiSchema, + }); + }); + it('transforms schema with array items', () => { const inputSchema = { type: 'object', diff --git a/plugins/scaffolder/src/components/MultistepJsonForm/schema.ts b/plugins/scaffolder/src/components/MultistepJsonForm/schema.ts index 39592d314d..5842613f45 100644 --- a/plugins/scaffolder/src/components/MultistepJsonForm/schema.ts +++ b/plugins/scaffolder/src/components/MultistepJsonForm/schema.ts @@ -50,7 +50,7 @@ function extractUiSchema(schema: JsonObject, uiSchema: JsonObject) { continue; } const innerUiSchema = {}; - uiSchema[propName] = innerUiSchema; + uiSchema[propName] = uiSchema[propName] || innerUiSchema; extractUiSchema(schemaNode, innerUiSchema); } }