Skip to content

Commit 245f308

Browse files
Add enter handler for textbox
Fixes: #372
1 parent 5104ef5 commit 245f308

File tree

3 files changed

+49
-0
lines changed

3 files changed

+49
-0
lines changed

py/examples/textbox.py

+6
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ async def serve(q: Q):
2222
ui.text(f'textbox_multiline={q.args.textbox_multiline}'),
2323
ui.button(name='show_form', label='Back', primary=True),
2424
]
25+
elif q.args.enter_key_handler:
26+
q.page['example'].items = [
27+
ui.text(f'textbox_enter_key_handler={q.args.enter_key_handler}'),
28+
ui.button(name='show_form', label='Back', primary=True),
29+
]
2530
else:
2631
q.page['example'] = ui.form_card(box='1 1 4 10', items=[
2732
ui.textbox(name='textbox', label='Standard'),
@@ -36,6 +41,7 @@ async def serve(q: Q):
3641
ui.textbox(name='textbox_placeholder', label='With placeholder', placeholder='I need some input'),
3742
ui.textbox(name='textbox_disabled_placeholder', label='Disabled with placeholder', disabled=True,
3843
placeholder='I am disabled'),
44+
ui.textbox(name='enter_key_handler', label='Submits the textbox value on Enter key', icon='Search'),
3945
ui.textbox(name='textbox_multiline', label='Multiline textarea', multiline=True),
4046
ui.button(name='show_inputs', label='Submit', primary=True),
4147
])

ui/src/textbox.test.tsx

+34
Original file line numberDiff line numberDiff line change
@@ -101,4 +101,38 @@ describe('Textbox.tsx', () => {
101101

102102
expect(syncMock).not.toBeCalled()
103103
})
104+
105+
it('Calls sync on key up - When the key is Enter key', () => {
106+
const { getByTestId } = render(<XTextbox model={textboxProps} />)
107+
108+
const syncMock = jest.fn()
109+
T.qd.sync = syncMock
110+
111+
fireEvent.keyUp(getByTestId(name), { key: 'Enter', target: { value: 'text' } })
112+
113+
expect(syncMock).toBeCalled()
114+
})
115+
116+
it('Does not call sync on key up - When the key is not Enter key', () => {
117+
const { getByTestId } = render(<XTextbox model={textboxProps} />)
118+
119+
const syncMock = jest.fn()
120+
T.qd.sync = syncMock
121+
122+
fireEvent.keyUp(getByTestId(name), { key: 'A', target: { value: 'text' } })
123+
124+
expect(syncMock).not.toBeCalled()
125+
})
126+
127+
it('Does not call sync on key up - When multiline is true', () => {
128+
const { getByTestId } = render(<XTextbox model={{ ...textboxProps, multiline: true}} />)
129+
130+
const syncMock = jest.fn()
131+
T.qd.sync = syncMock
132+
133+
fireEvent.keyUp(getByTestId(name), { key: 'Enter', target: { value: 'text' } })
134+
135+
expect(syncMock).not.toBeCalled()
136+
})
137+
104138
})

ui/src/textbox.tsx

+9
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,13 @@ export const
7575
qd.args[m.name] = v ?? (m.value || '')
7676
if (m.trigger) qd.sync()
7777
},
78+
onKeyUp = ( event: React.KeyboardEvent<HTMLInputElement>, v?: string) => {
79+
if ((event).key == "Enter" && event.target instanceof HTMLInputElement) {
80+
v = v || (event.target as HTMLInputElement).value
81+
qd.args[m.name] = v ?? (m.value || '')
82+
qd.sync()
83+
}
84+
},
7885
render = () => m.mask
7986
? (
8087
<Fluent.MaskedTextField
@@ -88,6 +95,7 @@ export const
8895
disabled={m.disabled}
8996
readOnly={m.readonly}
9097
onChange={m.trigger ? debounce(DEBOUNCE_TIMEOUT, onChange) : onChange}
98+
onKeyUp={onKeyUp}
9199
/>
92100
)
93101
: (
@@ -108,6 +116,7 @@ export const
108116
multiline={m.multiline}
109117
type={m.password ? 'password' : undefined}
110118
onChange={m.trigger ? debounce(DEBOUNCE_TIMEOUT, onChange) : onChange}
119+
onKeyUp={onKeyUp}
111120
/>
112121
)
113122

0 commit comments

Comments
 (0)