JSON Schema Definitions - spencercrose/klamm GitHub Wiki

Forms Schema Specification

Reference: JSON Schema Specification

{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "$id": "https://klamm.social.gov.bc.ca/forms-schema.json",
    "title": "Forms Build Template",
    "description": "Schema for importing form definitions into the Kiln form builder.",
    "type": "object",
    "required": [
        "form_id",
        "title",
        "data"
    ],
    "properties": {
        "form_id": {
            "type": "string",
            "description": "A unique identifier for the form, used to find or create a Form record."
        },
        "title": {
            "type": "string",
            "description": "The title of the form."
        },
        "ministry_id": {
            "type": ["integer", "null"],
            "description": "Optional: The ID of the ministry associated with the form."
        },
        "deployed_to": {
            "type": ["string", "null"],
            "description": "Optional: The deployment target for this form version."
        },
        "dataSources": {
            "type": "array",
            "description": "Optional: List of data sources attached to this form version.",
            "items": {
                "type": "object",
                "required": ["name"],
                "properties": {
                    "name": {
                        "type": "string",
                        "description": "The name of the data source to attach."
                    }
                }
            }
        },
        "data": {
            "type": "object",
            "description": "The main content structure of the form.",
            "required": ["items"],
            "properties": {
                "items": {
                    "type": "array",
                    "description": "A list of top-level form elements (containers, groups, or fields).",
                    "items": {
                        "oneOf": [
                            { "$ref": "#/definitions/containerElement" },
                            { "$ref": "#/definitions/groupElement" },
                            { "$ref": "#/definitions/fieldElement" }
                        ]
                    }
                }
            }
        }
    },
    "definitions": {
        "baseElementProperties": {
            "type": "object",
            "properties": {
                "id": {
                    "type": "string",
                    "description": "A unique instance ID for the element. Can be 'element' + number or a custom ID."
                },
                "conditions": {
                    "type": "array",
                    "description": "Optional: Conditions that affect the element's visibility or other properties.",
                    "items": {
                        "type": "object",
                        "required": ["type", "value"],
                        "properties": {
                            "type": {
                                "type": "string",
                                "description": "Type of condition (e.g., 'visibility')."
                            },
                            "value": {
                                "type": ["string", "boolean", "number", "null"],
                                "description": "The value associated with the condition."
                            }
                        }
                    }
                },
                "webStyles": {
                    "type": "object",
                    "description": "Optional: Key-value pairs for web-specific CSS styles.",
                    "patternProperties": {
                        "^[a-zA-Z-]+$": { "type": "string" }
                    },
                    "additionalProperties": false
                },
                "pdfStyles": {
                    "type": "object",
                    "description": "Optional: Key-value pairs for PDF-specific CSS styles.",
                    "patternProperties": {
                        "^[a-zA-Z-]+$": { "type": "string" }
                    },
                    "additionalProperties": false
                }
            }
        },
        "containerElement": {
            "type": "object",
            "description": "A container element for grouping other form elements.",
            "allOf": [{ "$ref": "#/definitions/baseElementProperties" }],
            "required": ["type", "id", "containerItems"],
            "properties": {
                "type": {
                    "type": "string",
                    "enum": ["container"]
                },
                "containerItems": {
                    "type": "array",
                    "description": "A list of nested form elements (groups or fields) within this container.",
                    "items": {
                        "oneOf": [
                            { "$ref": "#/definitions/groupElement" },
                            { "$ref": "#/definitions/fieldElement" }
                        ]
                    }
                }
            }
        },
        "groupElement": {
            "type": "object",
            "description": "A field group element, potentially repeatable.",
            "allOf": [{ "$ref": "#/definitions/baseElementProperties" }],
            "required": ["type", "id", "codeContext", "groupItems"],
            "properties": {
                "type": {
                    "type": "string",
                    "enum": ["group"]
                },
                "codeContext": {
                    "type": "object",
                    "required": ["name"],
                    "properties": {
                        "name": {
                            "type": "string",
                            "description": "The programmatic name of the field group (e.g., 'generic_group')."
                        }
                    }
                },
                "label": {
                    "type": ["string", "null"],
                    "description": "Optional: Custom label for the group. If null, default is used."
                },
                "repeater": {
                    "type": "boolean",
                    "description": "Optional: True if this group can be repeated (default: false)."
                },
                "databindings": {
                    "type": "object",
                    "description": "Optional: Data binding information for the group.",
                    "properties": {
                        "source": { "type": ["string", "null"] },
                        "path": { "type": ["string", "null"] }
                    }
                },
                "repeaterItemLabel": {
                    "type": ["string", "null"],
                    "description": "Optional: Custom label for individual items in a repeater group."
                },
                "groupItems": {
                    "type": "array",
                    "description": "A list of items within the group. Expected to contain a single object with 'fields' array.",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                        "type": "object",
                        "required": ["fields"],
                        "properties": {
                            "fields": {
                                "type": "array",
                                "description": "A list of fields within this group.",
                                "items": {
                                    "$ref": "#/definitions/fieldElement"
                                }
                            }
                        }
                    }
                }
            }
        },
        "fieldElement": {
            "type": "object",
            "description": "A single form field element.",
            "allOf": [{ "$ref": "#/definitions/baseElementProperties" }],
            "required": ["type", "id", "codeContext"],
            "properties": {
                "type": {
                    "type": "string",
                    "description": "The type of the field (e.g., 'text-input', 'number-input', 'select')."
                },
                "codeContext": {
                    "type": "object",
                    "required": ["name"],
                    "properties": {
                        "name": {
                            "type": "string",
                            "description": "The programmatic name of the field (e.g., 'generic_text_input')."
                        }
                    }
                },
                "label": {
                    "type": ["string", "null"],
                    "description": "Optional: Custom label for the field. If null, default is used."
                },
                "databindings": {
                    "type": "object",
                    "description": "Optional: Data binding information for the field.",
                    "properties": {
                        "source": { "type": ["string", "null"] },
                        "path": { "type": ["string", "null"] }
                    }
                },
                "mask": {
                    "type": ["string", "null"],
                    "description": "Optional: Input mask for the field."
                },
                "helperText": {
                    "type": ["string", "null"],
                    "description": "Optional: Helper text or tooltip for the field."
                },
                "value": {
                    "type": ["string", "number", "boolean", "null"],
                    "description": "Optional: Default or initial value for the field."
                },
                "validation": {
                    "type": "array",
                    "description": "Optional: Validation rules for the field.",
                    "items": {
                        "type": "object",
                        "required": ["type", "value", "errorMessage"],
                        "properties": {
                            "type": { "type": "string", "description": "Type of validation (e.g., 'required', 'min', 'max')." },
                            "value": { "type": ["string", "number", "boolean", "null"], "description": "The value for the validation rule." },
                            "errorMessage": { "type": "string", "description": "Error message for this validation rule." }
                        }
                    }
                },
                "listItems": {
                    "type": "array",
                    "description": "Optional: For select/dropdown fields, the list of options.",
                    "items": {
                        "type": "object",
                        "required": ["name", "text", "value"],
                        "properties": {
                            "name": { "type": "string", "description": "Unique programmatic name for the option." },
                            "text": { "type": "string", "description": "Display text for the option." },
                            "value": { "type": "string", "description": "The actual value of the option." }
                        }
                    }
                }
            }
        }
    }
}