Skip to content

Commit 0dbb7e2

Browse files
authored
fix: Update form items client side if possible instead of recreate on data change. #150
1 parent a7e6c81 commit 0dbb7e2

35 files changed

+992
-31182
lines changed

py/examples/date_picker_trigger.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,22 @@
22
# To handle live changes to a date picker, enable the `trigger` attribute.
33
# #form #date_picker #trigger
44
# ---
5+
from typing import Optional
56
from h2o_wave import main, app, Q, ui
67

78

9+
def get_form_items(value: Optional[str]):
10+
return [
11+
ui.text(f'date_trigger={value}'),
12+
ui.date_picker(name='date_trigger', label='Pick a date', trigger=True),
13+
]
14+
15+
816
@app('/demo')
917
async def serve(q: Q):
1018
if not q.client.initialized:
11-
q.page['example'] = ui.form_card(box='1 1 4 10', items=[
12-
ui.text(f'date_trigger={q.args.date_trigger}'),
13-
ui.date_picker(name='date_trigger', label='Pick a date', trigger=True),
14-
])
19+
q.page['example'] = ui.form_card(box='1 1 4 10', items=get_form_items(None))
1520
q.client.initialized = True
1621
else:
17-
q.page['example'].items[0].text.content = f'Selected date: {q.args.date_trigger}'
18-
q.page['example'].items[1].date_picker.value = q.args.date_trigger
22+
q.page['example'].items = get_form_items(q.args.date_trigger)
1923
await q.page.save()

py/examples/spinbox_trigger.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
def get_form_items(value: Optional[float]):
1010
return [
1111
ui.text(f'spinbox_trigger={value}'),
12-
ui.spinbox(name='spinbox_trigger', label='Pick a number', trigger=True, value=value),
12+
ui.spinbox(name='spinbox_trigger', label='Pick a number', trigger=True),
1313
]
1414

1515

@@ -18,7 +18,7 @@ async def serve(q: Q):
1818
if not q.client.initialized:
1919
q.page['example'] = ui.form_card(box='1 1 4 4', items=get_form_items(None))
2020
q.client.initialized = True
21-
if q.args.spinbox_trigger:
21+
if q.args.spinbox_trigger is not None:
2222
q.page['example'].items = get_form_items(q.args.spinbox_trigger)
2323

2424
await q.page.save()

py/examples/table_filter_backend.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ def search_df(df: pd.DataFrame, term: str):
3535
@app('/demo')
3636
async def serve(q: Q):
3737
if not q.client.initialized:
38-
q.page['form'] = ui.form_card(box='1 1 -1 11', items=[
39-
ui.textbox(name='search', label='Search', placeholder='Enter a keyword...', trigger=True),
38+
q.page['form'] = ui.form_card(box='1 1 -1 9', items=[
39+
ui.textbox(name='search', label='Search address', placeholder='Enter a keyword...', trigger=True),
4040
ui.table(
4141
name='issues',
4242
columns=[ui.table_column(name=name, label=name) for name in column_names],
@@ -46,11 +46,9 @@ async def serve(q: Q):
4646
q.client.initialized = True
4747
else:
4848
items = q.page['form'].items
49-
search_box = items[0].textbox
5049
table = items[1].table
5150
term: str = q.args.search
5251
term = term.strip() if term else ''
53-
search_box.value = term
5452
table.rows = df_to_rows(search_df(addresses, term) if len(term) else addresses)
5553

5654
await q.page.save()

py/examples/textbox_trigger.py

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,39 @@
22
# To handle live changes to a #textbox, enable the `trigger` attribute.
33
# #form #trigger
44
# ---
5+
from typing import Optional
56
from h2o_wave import main, app, Q, ui
67

78

8-
def to_pig_latin(text: str):
9-
if text is None:
10-
return ''
11-
words = text.lower().strip().split(" ")
12-
text = []
9+
def to_pig_latin(text: Optional[str]):
10+
if not text:
11+
return '*Type in some text above to translate to Pig Latin!*'
12+
words = text.lower().strip().split(' ')
13+
texts = []
1314
for word in words:
1415
if word[0] in 'aeiou':
15-
text.append(f'{word}yay')
16+
texts.append(f'{word}yay')
1617
else:
1718
for letter in word:
1819
if letter in 'aeiou':
19-
text.append(f'{word[word.index(letter):]}{word[:word.index(letter)]}ay')
20+
texts.append(f'{word[word.index(letter):]}{word[:word.index(letter)]}ay')
2021
break
21-
return " ".join(text)
22+
return ' '.join(texts)
23+
24+
25+
def get_form_items(txt: Optional[str]):
26+
return [
27+
ui.textbox(name='text', label='English', multiline=True, trigger=True),
28+
ui.label('Pig Latin'),
29+
ui.text(to_pig_latin(txt)),
30+
]
2231

2332

2433
@app('/demo')
2534
async def serve(q: Q):
26-
q.page['example'] = ui.form_card(box='1 1 4 10', items=[
27-
ui.textbox(name='text', label='English', value=q.args.text or '', multiline=True, trigger=True),
28-
ui.label('Pig Latin'),
29-
ui.text(to_pig_latin(q.args.text) or '*Type in some text above to translate to Pig Latin!*'),
30-
])
35+
if not q.client.initialized:
36+
q.page['example'] = ui.form_card(box='1 1 4 10', items=get_form_items(None))
37+
q.client.initialized = True
38+
if q.args.text is not None:
39+
q.page['example'].items = get_form_items(q.args.text)
3140
await q.page.save()

ui/.eslintrc.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ module.exports = {
1414
"plugin:@typescript-eslint/eslint-recommended",
1515
"plugin:@typescript-eslint/recommended",
1616
"plugin:react/recommended",
17+
"plugin:react-hooks/recommended"
1718
],
1819
"globals": {
1920
"Atomics": "readonly",

0 commit comments

Comments
 (0)