Feat v0.9.5 typed forms SDK primitive
Extract typed form system from models/workflow.go into standalone server/forms/ package. Any package can now declare and validate forms, not just workflow stages. - New server/forms/ package (types + validation + condition evaluator) - REST POST /api/v1/forms/validate endpoint - Starlark forms.validate(template, data) module - Frontend sw.forms.render(), .validate(), .validateRemote() - Manifest form_template accepted at package level - 16 new tests (12 forms + 4 Starlark module) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -429,3 +429,30 @@ def on_run(ctx):
|
||||
|
||||
return {"advance": True, "data": {"needs_review": False}}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## `forms` Module (v0.9.5)
|
||||
|
||||
**Permission:** `forms.validate`
|
||||
|
||||
Validates form data against a typed form template.
|
||||
|
||||
### `forms.validate(template, data)`
|
||||
|
||||
Validates `data` (a dict) against a `template` (a dict matching the TypedFormTemplate schema).
|
||||
|
||||
Returns a dict: `{"valid": True/False, "errors": [{"key": "...", "message": "..."}]}`.
|
||||
|
||||
```python
|
||||
result = forms.validate(
|
||||
{"fields": [{"key": "name", "type": "text", "label": "Name", "required": True}]},
|
||||
{"name": "Alice"},
|
||||
)
|
||||
# result["valid"] == True
|
||||
# result["errors"] == []
|
||||
```
|
||||
|
||||
Field types: `text`, `email`, `select`, `number`, `date`, `textarea`, `checkbox`, `file`.
|
||||
|
||||
Supports: required checks, min/max length, pattern (regex), number range, date range, select option whitelist, conditional visibility (`condition.when`/`op`/`value`).
|
||||
|
||||
Reference in New Issue
Block a user