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

Commit 1944cbe

Browse files
author
Cody Mikol
committed
fix(checkbox): submit on enter rather than toggle
make enter keypress submit form rather than toggle checkbox Fixes: #11583
1 parent 9c079aa commit 1944cbe

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
@@ -168,10 +168,19 @@ function MdCheckboxDirective(inputDirective, $mdAria, $mdConstant, $mdTheming, $
168168

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

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)