remoteoss / json-schema-form

https://json-schema-form.vercel.app
MIT License
85 stars 6 forks source link

WIP: Advanced validation proof of concept #26

Closed brennj closed 1 year ago

brennj commented 1 year ago

Combining everything for internal presentation.

Sample data ``` { "properties": { "field_a": { "type": "number", "x-jsf-validations": { "a_greater_than_b": { "errorMessage": "Field A must be bigger than field B", "rule": { ">": [ { "var": "field_a" }, { "var": "field_b" } ] } } } }, "field_b": { "type": "number" } }, "required": ["field_a", "field_b"] } ``` ``` { "properties": { "field_a": { "type": "number", "x-jsf-validations": { "a_less_than_b": { "errorMessage": "Field A must be smaller than field B", "rule": { "<": [ { "var": "field_a" }, { "var": "field_b" } ] } } } }, "field_b": { "type": "number" } }, "required": ["field_a", "field_b"] } ``` ``` { "properties": { "field_a": { "type": "number" }, "field_b": { "type": "number" }, "field_c": { "type": "number", "x-jsf-validations": { "add_fields_together": { "errorMessage": "Must be at least (field_a + field_b) * 2", "rule": { ">=": [ { "var": "field_c" }, { "*": [ { "+": [{ "var": "field_a" }, { "var": "field_b" }] }, 2 ] } ] } } } } }, "required": ["field_a", "field_b", "field_c"] } ``` ``` { "properties": { "field_a": { "type": "number" }, "field_b": { "type": "number" }, "field_c": { "type": "number" } }, "required": ["field_a", "field_b"], "allOf": [ { "if": { "x-jsf-validations": { "require_c": { "const": true } } }, "then": { "required": ["field_c"], "properties": { "field_c": { "x-jsf-validations": { "add_fields_together": { "errorMessage": "Must be at least (field_a + field_b) * 2", "rule": { ">=": [ { "var": "field_c" }, { "*": [ { "+": [{ "var": "field_a" }, { "var": "field_b" }] }, 2 ] } ] } } } } } }, "else": { "properties": { "field_c": false } } } ], "x-jsf-validations": { "require_c": { "rule": { "and": [ { "!==": [{ "var": "field_b" }, null] }, { "!==": [{ "var": "field_a" }, null] }, { ">": [{ "var": "field_a" }, { "var": "field_b" }] } ] } } } } ``` ``` { "properties": { "field_a": { "title": "Accept!", "const": "acknowledged", "type": "string", "x-jsf-presentation": { "inputType": "checkbox" } }, "field_b": { "type": "number" }, "field_c": { "type": "number" } }, "required": ["field_a", "field_b"], "allOf": [ { "if": { "properties": { "field_a": { "const": "acknowledged" } }, "required": ["field_a"] }, "then": { "required": ["field_c"], "properties": { "field_c": { "x-jsf-validations": { "add_fields_together": { "errorMessage": "Must be at least field_b * 2", "rule": { ">=": [ { "var": "field_c" }, { "*": [ { "var": "field_b" }, 2 ] } ] } } } } } }, "else": { "properties": { "field_c": false } } } ] } ```
jguddas commented 1 year ago

I'm kinda missing validation of the validation, and the JSON logic Schema that could be used for this is WIP since 2019.

https://github.com/jwadhams/json-logic-js/issues/55