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

Commit 03c7592

Browse files
author
Marcy Sutton
committed
feat(mdRadioGroup): Radio submits on keydown/enter
Closes #577
1 parent bfc947f commit 03c7592

File tree

5 files changed

+63
-9
lines changed

5 files changed

+63
-9
lines changed

src/components/radioButton/demoBasicUsage/index.html

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

2-
<div ng-controller="AppCtrl" >
2+
<form ng-submit="submit()" ng-controller="AppCtrl" >
33
<p>Selected Value: <span class="radioValue">{{ data.group1 }}</span> </p>
44

55
<md-radio-group ng-model="data.group1">
@@ -30,4 +30,4 @@
3030
<md-button ng-click="removeItem()">Remove</md-button>
3131
</p>
3232

33-
</div>
33+
</form>

src/components/radioButton/demoBasicUsage/script.js

+4
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ angular.module('radioDemo1', ['ngMaterial'])
1515
{ label: '4', value: '4' }
1616
];
1717

18+
$scope.submit = function() {
19+
alert('submit');
20+
};
21+
1822
$scope.addItem = function() {
1923
var r = Math.ceil(Math.random() * 1000);
2024
$scope.radioData.push({ label: r, value: r });

src/components/radioButton/radioButton.js

+19-7
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,25 @@ function mdRadioGroupDirective($mdUtil, $mdConstant, $mdTheming) {
6565
var ngModelCtrl = ctrls[1] || $mdUtil.fakeNgModel();
6666

6767
function keydownListener(ev) {
68-
if (ev.keyCode === $mdConstant.KEY_CODE.LEFT_ARROW || ev.keyCode === $mdConstant.KEY_CODE.UP_ARROW) {
69-
ev.preventDefault();
70-
rgCtrl.selectPrevious();
71-
}
72-
else if (ev.keyCode === $mdConstant.KEY_CODE.RIGHT_ARROW || ev.keyCode === $mdConstant.KEY_CODE.DOWN_ARROW) {
73-
ev.preventDefault();
74-
rgCtrl.selectNext();
68+
switch(ev.keyCode) {
69+
case $mdConstant.KEY_CODE.LEFT_ARROW:
70+
case $mdConstant.KEY_CODE.UP_ARROW:
71+
ev.preventDefault();
72+
rgCtrl.selectPrevious();
73+
break;
74+
75+
case $mdConstant.KEY_CODE.RIGHT_ARROW:
76+
case $mdConstant.KEY_CODE.DOWN_ARROW:
77+
ev.preventDefault();
78+
rgCtrl.selectNext();
79+
break;
80+
81+
case $mdConstant.KEY_CODE.ENTER:
82+
var form = angular.element($mdUtil.getClosest(element[0], 'form'));
83+
if (form.length > 0) {
84+
form.triggerHandler('submit');
85+
}
86+
break;
7587
}
7688
}
7789

src/components/radioButton/radioButton.spec.js

+23
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,29 @@ describe('radioButton', function() {
140140
expect($rootScope.color).toBe('blue');
141141
}));
142142

143+
it('should trigger a submit', inject(function($compile, $rootScope, $mdConstant) {
144+
145+
$rootScope.testValue = false;
146+
$rootScope.submitFn = function(){
147+
$rootScope.testValue = true;
148+
};
149+
var element = $compile('<div><form ng-submit="submitFn()">' +
150+
'<md-radio-group ng-model="color">' +
151+
'<md-radio-button value="white"></md-radio-button>' +
152+
'</md-radio-group>' +
153+
'</form></div>')($rootScope);
154+
155+
var formElement = element.find('form'),
156+
rbGroupElement = element.find('md-radio-group');
157+
158+
rbGroupElement.triggerHandler({
159+
type: 'keydown',
160+
keyCode: $mdConstant.KEY_CODE.ENTER
161+
});
162+
163+
expect($rootScope.testValue).toBe(true);
164+
}));
165+
143166
it('should be disabled', inject(function($compile, $rootScope) {
144167
var element = $compile('<md-radio-group ng-model="color">' +
145168
'<md-radio-button value="white" ng-disabled="isDisabled"></md-radio-button>' +

src/core/util/util.js

+15
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,21 @@ angular.module('material.core')
157157
} else {
158158
parent.$$childHead = parent.$$childTail = child;
159159
}
160+
},
161+
/*
162+
* getClosest replicates jQuery.closest() to walk up the DOM tree until it finds a matching nodeName
163+
*
164+
* @param el Element to start walking the DOM from
165+
* @param tagName Tag name to find closest to el, such as 'form'
166+
*/
167+
getClosest: function getClosest(el, tagName) {
168+
tagName = tagName.toUpperCase();
169+
do {
170+
if (el.nodeName === tagName) {
171+
return el;
172+
}
173+
} while (el = el.parentNode);
174+
return null;
160175
}
161176
};
162177

0 commit comments

Comments
 (0)