Skip to content
This repository was archived by the owner on Sep 5, 2024. It is now read-only.

Commit a191a8e

Browse files
codymikolmmalerba
authored andcommitted
fix(checkbox): submit on enter rather than toggle (#11584)
make enter keypress submit form rather than toggle checkbox Fixes: #11583
1 parent 6515e6c commit a191a8e

File tree

2 files changed

+41
-4
lines changed

2 files changed

+41
-4
lines changed

src/components/checkbox/checkbox.js

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -171,10 +171,19 @@ function MdCheckboxDirective(inputDirective, $mdAria, $mdConstant, $mdTheming, $
171171

172172
function keypressHandler(ev) {
173173
var keyCode = ev.which || ev.keyCode;
174-
if (keyCode === $mdConstant.KEY_CODE.SPACE || keyCode === $mdConstant.KEY_CODE.ENTER) {
175-
ev.preventDefault();
176-
element.addClass('md-focused');
177-
listener(ev);
174+
ev.preventDefault();
175+
switch(keyCode) {
176+
case $mdConstant.KEY_CODE.SPACE:
177+
element.addClass('md-focused');
178+
listener(ev);
179+
break;
180+
case $mdConstant.KEY_CODE.ENTER:
181+
var form = $mdUtil.getClosest(ev.target, 'form');
182+
// We have to use a native event here as the form directive does not use jqlite
183+
if (form) {
184+
form.dispatchEvent(new Event('submit'));
185+
}
186+
break;
178187
}
179188
}
180189

src/components/checkbox/checkbox.spec.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,34 @@ describe('mdCheckbox', function() {
280280
expect(isChecked(checkbox)).toBe(true);
281281
});
282282

283+
it('should set the checkbox to checked when focused and SPACE keypress event fired', function () {
284+
var checkbox = compileAndLink('<md-checkbox ng-checked="value"></md-checkbox>');
285+
checkbox.triggerHandler({
286+
type: 'keypress',
287+
keyCode: $mdConstant.KEY_CODE.SPACE
288+
});
289+
expect(isChecked(checkbox)).toBe(true);
290+
});
291+
292+
it('should NOT set the checkbox to checked when focused and ENTER keypress event fired', function () {
293+
var checkbox = compileAndLink('<md-checkbox ng-checked="value"></md-checkbox>');
294+
checkbox.triggerHandler({
295+
type: 'keypress',
296+
keyCode: $mdConstant.KEY_CODE.ENTER
297+
});
298+
expect(isChecked(checkbox)).toBe(false);
299+
});
300+
301+
it('should submit a parent form when ENTER is pressed', function () {
302+
var form = compileAndLink('<form><md-checkbox ng-checked="value"></md-checkbox></form>');
303+
angular.element(form[0].getElementsByTagName('md-checkbox')[0]).triggerHandler({
304+
type: 'keypress',
305+
keyCode: $mdConstant.KEY_CODE.ENTER
306+
});
307+
pageScope.$apply();
308+
expect(form[0].classList.contains('ng-submitted')).toBe(true);
309+
});
310+
283311
it('should mark the checkbox as selected on load with ng-checked', function() {
284312
pageScope.isChecked = function() { return true; };
285313

0 commit comments

Comments
 (0)