
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# check out https://solara.dev/ for documentation
# or https://github.com/widgetti/solara/
# And check out https://py.cafe/maartenbreddels for more examples
import asyncio
import solara
import solara.lab
import ipyreact
import ipywidgets
from pathlib import Path
from traitlets import Unicode
class RJSFSchema(ipyreact.ValueWidget):
_esm = Path("react-jsonschema.jsx")
schema = {
"title": 'Todo',
"type": 'object',
"required": ['title'],
"properties": {
"title": { "type": 'string', "title": 'Title', "default": 'A new task' },
"done": { "type": 'boolean', "title": 'Done?', "default": False },
},
}
form_data = solara.reactive(None)
@solara.lab.task
async def do_stuff():
print("calculating...")
await asyncio.sleep(3)
print("Done")
@solara.component
def Page():
solara.Style(Path("style.css"))
RJSFSchema.element(value=form_data.value, on_value=form_data.set,
events={"onSubmit": do_stuff},
props={
"schema": schema,
})
solara.ProgressLinear(do_stuff.pending)
if form_data.value:
solara.Markdown(f"""
```
# Form data
{form_data.value}
```
""")
def reset():
form_data.value = {'title': 'A new task', 'done': False}
solara.Button("Reset", on_click=reset)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import * as React from "react";
import Form from 'https://esm.sh/@rjsf/core?external=react,react-dom';
import { RJSFSchema } from 'https://esm.sh/@rjsf/utils?external=react,react-dom';
import validator from 'https://esm.sh/@rjsf/validator-ajv8?external=react,react-dom';
const schema: RJSFSchema = {
title: 'Todo',
type: 'object',
required: ['title'],
properties: {
title: { type: 'string', title: 'Title', default: 'A new task' },
done: { type: 'boolean', title: 'Done?', default: false },
},
};
const log = (type) => console.log.bind(console, type);
export default function Test({value, setValue, onSubmit, schema}) {
const onChange = (data) => {
console.log("onChange", data)
setValue(data.formData)
}
return <Form
formData={value}
schema={schema}
validator={validator}
onChange={onChange}
onSubmit={() => onSubmit()} // remove the argument (does not serialize)
onError={log('errors')}
/>
}1
2
3
4
.rjsf {
background-color: red;
}