Skip to content

Commit 5c08d95

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

File tree

3 files changed

+47
-1
lines changed

3 files changed

+47
-1
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

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

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

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)