Skip to content

Commit c5b2526

Browse files
committed
feat: add pin.put_actions()
1 parent cd4850d commit c5b2526

File tree

3 files changed

+25
-4
lines changed

3 files changed

+25
-4
lines changed

pywebio/pin.py

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@
8686
.. autofunction:: put_checkbox
8787
.. autofunction:: put_radio
8888
.. autofunction:: put_slider
89+
.. autofunction:: put_actions
8990
9091
Pin utils
9192
------------------
@@ -128,8 +129,8 @@
128129

129130
_html_value_chars = set(string.ascii_letters + string.digits + '_')
130131

131-
__all__ = ['put_input', 'put_textarea', 'put_select', 'put_checkbox', 'put_radio', 'put_slider', 'pin', 'pin_update',
132-
'pin_wait_change']
132+
__all__ = ['put_input', 'put_textarea', 'put_select', 'put_checkbox', 'put_radio', 'put_slider', 'put_actions',
133+
'pin', 'pin_update', 'pin_wait_change']
133134

134135

135136
def check_name(name):
@@ -204,6 +205,22 @@ def put_slider(name, *, label='', value=0, min_value=0, max_value=100, step=1, r
204205
return _pin_output(single_input_return, scope, position)
205206

206207

208+
def put_actions(name, *, label='', buttons=None, help_text=None,
209+
scope=Scope.Current, position=OutputPosition.BOTTOM) -> Output:
210+
"""Output a group of action button. Refer to: `pywebio.input.actions()`
211+
212+
Unlike the ``actions()``, ``put_actions()`` won't submit any form, it will only set the value of the pin widget.
213+
Only 'submit' type button is available in pin widget version.
214+
"""
215+
from pywebio.input import actions
216+
check_name(name)
217+
single_input_return = actions(name=name, label=label, buttons=buttons, help_text=help_text)
218+
input_kwargs = single_input_kwargs(single_input_return)
219+
for btn in input_kwargs['item_spec']['buttons']:
220+
assert btn['type'] == 'submit', "The `put_actions()` pin widget only accept 'submit' type button."
221+
return _pin_output(input_kwargs, scope, position)
222+
223+
207224
@chose_impl
208225
def get_client_val():
209226
res = yield next_client_event()

test/18.pin_test.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ def target():
3131
help_text='help_text')
3232
put_radio('radio', options=options, label='radio', inline=False, value=None, help_text='help_text')
3333
put_radio('radio_inline', options=options, label='radio_inline', inline=True, value='B', help_text='help_text')
34+
put_actions('actions', buttons=['action_a', 'action_b'], label='actions')
3435

3536
pin_update('input', help_text='This is help text')
3637
pin_update('select_multiple', value=['B', 'C'])
@@ -39,7 +40,7 @@ def target():
3940
assert (yield pin['radio']) == (yield pin.radio) == 'B'
4041

4142
names = ['input', 'textarea', 'code', 'select', 'select_multiple', 'checkbox', 'checkbox_inline', 'radio',
42-
'radio_inline']
43+
'radio_inline', 'actions']
4344
values = {}
4445

4546
while len(names) != len(values):
@@ -70,6 +71,7 @@ def test_one_page(browser: Chrome):
7071
browser.find_element_by_css_selector('[name=checkbox_inline]').click()
7172
browser.find_element_by_css_selector('[name=radio]').click()
7273
browser.find_element_by_css_selector('[name=radio_inline]').click()
74+
browser.find_element_by_css_selector('button').click()
7375
codeMirror = browser.find_element_by_css_selector(".CodeMirror pre")
7476
action_chains = ActionChains(browser)
7577
action_chains.move_to_element(codeMirror).click(codeMirror).send_keys('3').perform()

webiojs/src/models/input/actions.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,10 @@ export class Actions extends InputItem {
3434
this.element.find('button').on('click', function (e) {
3535
let btn = $(this);
3636
if (btn.data('type') === 'submit') {
37-
that.submit_value = JSON.parse(btn.val() as string);
3837
// 不可以使用 btn.parents('form').submit(), 会导致input 的required属性失效
38+
that.submit_value = JSON.parse(btn.val() as string);
39+
if(that.spec.onchange) // the `onchange` of spec will be only set in pin widget
40+
that.on_input_event("change", that);
3941
} else if (btn.data('type') === 'reset') {
4042
btn.parents('form').trigger("reset");
4143
} else if (btn.data('type') === 'cancel') {

0 commit comments

Comments
 (0)