Search code examples
jsoneditorjsonschemaswig-template

JSON Schema Template and JSON Editor


I have been struggling for a few days, trying to use the JSON Editor Javascript plugin. I am using the SWIG JS engine, but I am open to propositions that will solve my issue.

I created a JSON Template that works fine so far, but that does not achieve entirely what I need to do, and I tried understanding and using the syntax provided by the JSON Editor github page, but no luck so far.

How can I make the template behave as follow :

If the value of features.type == "Point", then I want features.display to have a property of the type "#/definitions/marker". Otherwise (features.type == "Polygon") I want features.display to have a property of the type "#/definitions/area". The same goes for filter.display.

So far, I use the "oneOf" property, because it's the closest to what I want, but definitely not quite it.

Thanks for your help !

Kind regards.

Here is my JSON Schema so far :

{
    "type": "array",
    "title": "Layers",
    "items": {
        "title": "Layer",
        "type": "object",
        "headerTemplate": "{{table.id.public_name}}",
        "properties": {
            "table":{"$ref": "#/definitions/table"},
            "features":{"$ref": "#/definitions/features"}
        }
    },
    "definitions": {
        "table": {
            "title": "Table Information",
            "type": "object",
            "properties": {
                "id":{"$ref": "#/definitions/id"},
                "primary_key":{"$ref": "#/definitions/primary_key"},
                "read":{"$ref": "#/definitions/read"}
            }
        },
        "features": {
            "title": "Features Settings",
            "type": "object",
            "properties": {
                "type":{"$ref": "#/definitions/type"},
                "id":{"$ref": "#/definitions/id"},
                "cols":{"$ref": "#/definitions/cols"},
                "display": {
                    "type": "object",
                    "title": "Display",
                    "format": "grid",
                    "oneOf": [
                        {"$ref": "#/definitions/marker"},
                        {"$ref": "#/definitions/area"}
                    ]
                }
            }
        },
        "cols": {
            "title": "Table Columns",
            "type": "array",
            "items": {
                "type": "object",
                "title": "Column",
                "properties": {
                    "id":{"$ref": "#/definitions/id"},
                    "read":{"$ref": "#/definitions/read"},
                    "write":{"$ref": "#/definitions/write"},
                    "filter":{"$ref": "#/definitions/filter"}
                }
            }
        },
        "id": {
            "title": "Identifier",
            "type": "object",
            "format": "grid",
            "properties": {
                "name":{"$ref": "#/definitions/name"},
                "public_name":{"$ref": "#/definitions/public_name"}
            }
        },
        "name": {
            "title": "Name",
            "type": "string"
        },
        "public_name": {
            "title": "Public Name",
            "type": "string"
        },
        "primary_key": {
            "title": "Primary key",
            "type": "string",
            "format": "grid"
        },
        "write": {
            "title": "Editing",
            "type": "object",
            "format": "grid",
            "properties": {
                "read":{"$ref": "#/definitions/read"},
                "method":{"$ref": "#/definitions/method"}
            }
        },
        "read": {
            "title": "Reading",
            "type": "array",
            "items": {
                "type": "integer",
                "title": "Access Level",
                "format": "grid",
                "properties":{"$ref": "#/definitions/access_level"}
            }
        },
        "type": {
            "title": "Type",
            "type": "string",
            "enum": [ "Point", "Polygon" ]
        },
        "access_level": {
            "title": "Access Level",
            "type": "integer",
            "format": "number"
        },
        "method": {
            "title": "Method",
            "type": "object",
            "format": "grid",
            "properties": {
                "type":{"$ref": "#/definitions/method_type"},
                "data":{"$ref": "#/definitions/data"}
            }
        },
        "data": {
            "title": "Data",
            "type": "array",
            "items": {
                "type": "string",
                "title": "Data",
                "format": "grid",
                "properties":{"$ref": "#/definitions/value"}
            }
        },
        "value": {
            "title": "Value",
            "type": "string"
        },
        "filter": {
            "title": "Filter",
            "type": "array",
            "items": {
                "type": "object",
                "title": "Filter",
                "properties": {
                    "value":{"$ref": "#/definitions/value"},
                    "display": {
                        "type": "object",
                        "oneOf": [
                            {"$ref": "#/definitions/marker"},
                            {"$ref": "#/definitions/area"}
                        ]
                    }
                }
            }
        },
        "marker": {
            "title": "Marker",
            "type": "object",
            "format": "grid",
            "properties": {
                "color":{"$ref": "#/definitions/color"},
                "icon":{"$ref": "#/definitions/icon"}
            }
        },
        "color": {
            "title": "Color",
            "type": "string",
            "enum": ["red", "darkred", "orange", "green", "darkgreen", "blue", "purple", "darkpuple", "cadetblue"]
        },
        "css_color": {
            "title": "CSS Color",
            "type": "string",
            "format": "color"
        },
        "icon": {
            "title": "Icon",
            "type": "object",
            "format": "grid",
            "properties": {
                "name":{"$ref": "#/definitions/name"},
                "color":{"$ref": "#/definitions/css_color"}
            }
        },
        "area": {
            "title": "Area",
            "type": "object",
            "properties": {
                "color":{"$ref": "#/definitions/color"},
                "border":{"$ref": "#/definitions/border"}
            }
        },
        "border": {
            "title": "Border",
            "type": "object",
            "properties": {
                "border_color":{"$ref": "#/definitions/border_color"},
                "width":{"$ref": "#/definitions/width"}
            }
        },
        "border_color": {
            "title": "Color",
            "type": "object",
            "format": "grid",
            "properties": {
                "normal":{"$ref": "#/definitions/normal"},
                "hover":{"$ref": "#/definitions/hover"}
            }
        },
        "width": {
            "title": "Width",
            "type": "string"
        },
        "normal": {
            "title": "Normal",
            "type": "string",
            "format": "color"
        },
        "hover": {
            "title": "Hover",
            "type": "string",
            "format": "color"
        },
        "method_type": {
            "title": "Type",
            "type": "string",
            "enum": [ "text", "select" ]
        }
    }
}

Solution

  • The only way to enforce this (until appareance of jsonschema draft 5) is to use the enum as a discriminator. You can find an example in How to use dependencies in JSON schema (draft-04)