sf-java-ui icon indicating copy to clipboard operation
sf-java-ui copied to clipboard

Question: OneOf

Open lbispham opened this issue 6 years ago • 0 comments

After the objects are serialized to JsonSchema, I need to add another field.

BEFORE:

{
  "schema": {
    "type": "object",
     "id": "urn:jsonschema:io:asfjava:ui:core:schema:Conditional",
    "properties": {
      "needColor": {
        "type": "boolean"
      },
      "color": {
        "type": "string",
        "title": "Color"
      },
      "length": {
        "type": "string",
        "title": "Length"
      }
    }
  },
  "form": [
    {
      "key": "length"
    },
    {
      "key": "color",
      "type": "select",
      "autofocus": false,
      "disabled": false,
      "multiple": false,
      "required": false,
      "size": 1,
      "titleMap": [
        {
          "name": "Red",
          "value": "red"
        },
        {
          "name": "Blue",
          "value": "blue"
        }
      ]
    }
  ]
}

AFTER

{
  "schema": {
    "type": "object",
    "id": "urn:jsonschema:io:asfjava:ui:core:schema:Conditional",
    "properties": {
      "needColor": {
        "type": "boolean"
      },
      "color": {
        "type": "string",
        "title": "Color"
      },
      "length": {
        "type": "string",
        "title": "Length"
      }
    },
    "oneOf": 
        [
            {
                "properties": {
                    "needColor": { "enum": [true] }
                },
                "required": ["color"]
            },
            {
                "properties": {
                    "needColor": { "enum": [false] }
                },
                "required": ["length"]
            }
        ]
  },
  "form": [
    {
      "key": "length"
    },
    {
      "key": "color",
      "type": "select",
      "autofocus": false,
      "disabled": false,
      "multiple": false,
      "required": false,
      "size": 1,
      "titleMap": [
        {
          "name": "Red",
          "value": "red"
        },
        {
          "name": "Blue",
          "value": "blue"
        }
       ]
    }
  ]
}

I found the following example (https://github.com/FasterXML/jackson-module-jsonSchema/blob/master/src/main/java/com/fasterxml/jackson/module/jsonSchema/customProperties/TitleSchemaFactoryWrapper.java) of injecting a new property into a JsonSchema but it uses the schema.asSimpleTypeSchema().setTitle() method which is not the same thing as injecting a brand new property.

The oneOf field would allow me to do some conditional validation on the front end. Do you know of a way to do this? I understand it's a little outside the scope of the current project. Side note: I am generating this schema for https://angular2-json-schema-form.firebaseapp.com (as opposed to Angular Schema Form). Angular2 supports the same schema format which is why I can use sf-java-ui, but also has a limited implementation of oneOf.

lbispham avatar Mar 14 '18 16:03 lbispham