Skip to content

Commit 2d8462d

Browse files
authored
EDSC-2664: Preventing submission on enter (#128)
* Prevent submission on enter keypress within form elements, added Cypress Coverage * EDSC-2664: Preventing Submit on Enter * EDSC-2664: fixed eslint rule handling * EDSC: fixed comment issue
1 parent c2e721f commit 2d8462d

File tree

4 files changed

+64
-5
lines changed

4 files changed

+64
-5
lines changed

cypress/component/EDSCEchoForm.cy.js

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ import {
55
prepopulatedXml,
66
textfieldXml,
77
treeWithSimplifyOutputXml,
8-
notRelevantXml
8+
notRelevantXml,
9+
checkboxXml,
10+
selectXml
911
} from '../mocks/FormElement'
1012
import EDSCEchoform from '../../src'
1113

@@ -179,4 +181,46 @@ describe('EDSCEchoform component', () => {
179181
rawModel: '<prov:options xmlns:prov="http://www.example.com/orderoptions"><prov:textreference>New prepopulated value</prov:textreference></prov:options>'
180182
})
181183
})
184+
185+
it('calls preventDefault when Enter is pressed on any form element', () => {
186+
cy.window().then((win) => {
187+
cy.stub(win.Event.prototype, 'preventDefault').as('preventDefaultStub')
188+
})
189+
190+
const formTypes = [
191+
{
192+
xml: textfieldXml,
193+
selector: '#textinput'
194+
},
195+
{
196+
xml: checkboxXml,
197+
selector: '#boolinput'
198+
},
199+
{
200+
xml: selectXml,
201+
selector: '#selectinput'
202+
},
203+
{
204+
xml: treeWithSimplifyOutputXml,
205+
selector: '#ef-tree_filter_input'
206+
}
207+
]
208+
209+
formTypes.forEach(({ xml, selector }) => {
210+
setup(xml)
211+
212+
cy.get(selector).trigger('keydown', {
213+
key: 'Enter',
214+
code: 'Enter',
215+
which: 13,
216+
keyCode: 13,
217+
bubbles: true,
218+
cancelable: true
219+
})
220+
221+
cy.get('@preventDefaultStub').should('have.been.called')
222+
// Reset the spy's history between iterations so each check is independent
223+
cy.get('@preventDefaultStub').invoke('resetHistory')
224+
})
225+
})
182226
})

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"title": "Earthdata Search Components: ECHO Forms",
44
"description": "A React component implementation of the ECHO Forms specification.",
55
"main": "dist/index.js",
6-
"version": "1.1.18",
6+
"version": "1.1.19",
77
"scripts": {
88
"build": "webpack",
99
"start": "webpack serve --config example/webpack.config.js --mode development",

src/components/FormBody/FormBody.jsx

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,25 @@ export const FormBody = ({
1313

1414
let formBodyClassnames = 'form'
1515

16+
/**
17+
* Prevents form submission when Enter is pressed on any form element
18+
* @param {Object} keyPressEvent event object
19+
*/
20+
const onKeyDown = (keyPressEvent) => {
21+
if (keyPressEvent.key === 'Enter') {
22+
keyPressEvent.preventDefault()
23+
}
24+
}
25+
1626
formBodyClassnames += ` ${className}`
1727

1828
return (
19-
<div className={elementClasses(formBodyClassnames, 'card')}>
29+
// Disabling this rule because we want to capture events from bubbling up
30+
// eslint-disable-next-line jsx-a11y/no-static-element-interactions
31+
<div
32+
className={elementClasses(formBodyClassnames, 'card')}
33+
onKeyDown={onKeyDown}
34+
>
2035
<div className={elementClasses('form__body', 'card-body')}>
2136
{
2237
ui.childElementCount > 0 && Array.from(ui.children).map((element) => (

0 commit comments

Comments
 (0)