From 1944cbea1ebb7e0b5bd2f06fe6965e9718f90a5c Mon Sep 17 00:00:00 2001 From: Cody Mikol Date: Tue, 8 Jan 2019 18:23:24 -0500 Subject: [PATCH] fix(checkbox): submit on enter rather than toggle make enter keypress submit form rather than toggle checkbox Fixes: #11583 --- src/components/checkbox/checkbox.js | 17 ++++++++++---- src/components/checkbox/checkbox.spec.js | 28 ++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/components/checkbox/checkbox.js b/src/components/checkbox/checkbox.js index a1ba4b7bc2..c46eb80585 100644 --- a/src/components/checkbox/checkbox.js +++ b/src/components/checkbox/checkbox.js @@ -168,10 +168,19 @@ function MdCheckboxDirective(inputDirective, $mdAria, $mdConstant, $mdTheming, $ function keypressHandler(ev) { var keyCode = ev.which || ev.keyCode; - if (keyCode === $mdConstant.KEY_CODE.SPACE || keyCode === $mdConstant.KEY_CODE.ENTER) { - ev.preventDefault(); - element.addClass('md-focused'); - listener(ev); + ev.preventDefault(); + switch(keyCode) { + case $mdConstant.KEY_CODE.SPACE: + element.addClass('md-focused'); + listener(ev); + break; + case $mdConstant.KEY_CODE.ENTER: + var form = $mdUtil.getClosest(ev.target, 'form'); + // We have to use a native event here as the form directive does not use jqlite + if (form) { + form.dispatchEvent(new Event('submit')); + } + break; } } diff --git a/src/components/checkbox/checkbox.spec.js b/src/components/checkbox/checkbox.spec.js index b95af96e8c..f010fe6d4d 100644 --- a/src/components/checkbox/checkbox.spec.js +++ b/src/components/checkbox/checkbox.spec.js @@ -280,6 +280,34 @@ describe('mdCheckbox', function() { expect(isChecked(checkbox)).toBe(true); }); + it('should set the checkbox to checked when focused and SPACE keypress event fired', function () { + var checkbox = compileAndLink(''); + checkbox.triggerHandler({ + type: 'keypress', + keyCode: $mdConstant.KEY_CODE.SPACE + }); + expect(isChecked(checkbox)).toBe(true); + }); + + it('should NOT set the checkbox to checked when focused and ENTER keypress event fired', function () { + var checkbox = compileAndLink(''); + checkbox.triggerHandler({ + type: 'keypress', + keyCode: $mdConstant.KEY_CODE.ENTER + }); + expect(isChecked(checkbox)).toBe(false); + }); + + it('should submit a parent form when ENTER is pressed', function () { + var form = compileAndLink('
'); + angular.element(form[0].getElementsByTagName('md-checkbox')[0]).triggerHandler({ + type: 'keypress', + keyCode: $mdConstant.KEY_CODE.ENTER + }); + pageScope.$apply(); + expect(form[0].classList.contains('ng-submitted')).toBe(true); + }); + it('should mark the checkbox as selected on load with ng-checked', function() { pageScope.isChecked = function() { return true; };