Skip to content

Commit b76d68a

Browse files
committed
feat(material/radio): allow focus origin to be optional input in focus method
1 parent cc503c4 commit b76d68a

File tree

3 files changed

+23
-6
lines changed

3 files changed

+23
-6
lines changed

src/material/expansion/expansion-panel-header.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,8 +190,12 @@ export class MatExpansionPanelHeader implements AfterViewInit, OnDestroy, Focusa
190190
* @param origin Origin of the action that triggered the focus.
191191
* @docs-private
192192
*/
193-
focus(origin: FocusOrigin = 'program', options?: FocusOptions) {
194-
this._focusMonitor.focusVia(this._element, origin, options);
193+
focus(origin?: FocusOrigin, options?: FocusOptions) {
194+
if (origin) {
195+
this._focusMonitor.focusVia(this._element, origin, options);
196+
} else {
197+
this._element.nativeElement.focus(options);
198+
}
195199
}
196200

197201
ngAfterViewInit() {

src/material/radio/radio.spec.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,7 @@ describe('MatRadio', () => {
598598
let seasonRadioInstances: MatRadioButton[];
599599
let weatherRadioInstances: MatRadioButton[];
600600
let fruitRadioInstances: MatRadioButton[];
601+
let fruitRadioNativeElements: HTMLElement[];
601602
let fruitRadioNativeInputs: HTMLElement[];
602603
let testComponent: StandaloneRadioButtons;
603604

@@ -618,7 +619,7 @@ describe('MatRadio', () => {
618619
.filter(debugEl => debugEl.componentInstance.name == 'fruit')
619620
.map(debugEl => debugEl.componentInstance);
620621

621-
const fruitRadioNativeElements = radioDebugElements
622+
fruitRadioNativeElements = radioDebugElements
622623
.filter(debugEl => debugEl.componentInstance.name == 'fruit')
623624
.map(debugEl => debugEl.nativeElement);
624625

@@ -732,6 +733,14 @@ describe('MatRadio', () => {
732733
}
733734
});
734735

736+
it('should not change focus origin if origin not specified', () => {
737+
fruitRadioInstances[0].focus('mouse');
738+
fruitRadioInstances[1].focus();
739+
740+
expect(fruitRadioNativeElements[1].classList).toContain('cdk-focused');
741+
expect(fruitRadioNativeElements[1].classList).toContain('cdk-mouse-focused');
742+
});
743+
735744
it('should not add the "name" attribute if it is not passed in', () => {
736745
const radio = fixture.debugElement.nativeElement.querySelector('#nameless input');
737746
expect(radio.hasAttribute('name')).toBe(false);

src/material/radio/radio.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* found in the LICENSE file at https://angular.io/license
77
*/
88

9-
import {FocusMonitor} from '@angular/cdk/a11y';
9+
import {FocusMonitor, FocusOrigin} from '@angular/cdk/a11y';
1010
import {
1111
BooleanInput,
1212
coerceBooleanProperty,
@@ -516,8 +516,12 @@ export abstract class _MatRadioButtonBase extends _MatRadioButtonMixinBase imple
516516
}
517517

518518
/** Focuses the radio button. */
519-
focus(options?: FocusOptions): void {
520-
this._focusMonitor.focusVia(this._inputElement, 'keyboard', options);
519+
focus(origin?: FocusOrigin, options?: FocusOptions): void {
520+
if (origin) {
521+
this._focusMonitor.focusVia(this._inputElement, origin, options);
522+
} else {
523+
this._inputElement.nativeElement.focus(options);
524+
}
521525
}
522526

523527
/**

0 commit comments

Comments
 (0)