Skip to content

Commit e303245

Browse files
Jessica Xujesscxu
Jessica Xu
andauthored
feat(material/radio): allow focus origin to be optional input in focus method (#20911)
Co-authored-by: Jessica Xu <[email protected]>
1 parent c052ab3 commit e303245

File tree

3 files changed

+18
-5
lines changed

3 files changed

+18
-5
lines changed

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(undefined, '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(options?: FocusOptions, origin?: FocusOrigin): void {
520+
if (origin) {
521+
this._focusMonitor.focusVia(this._inputElement, origin, options);
522+
} else {
523+
this._inputElement.nativeElement.focus(options);
524+
}
521525
}
522526

523527
/**

tools/public_api_guard/material/radio.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export declare abstract class _MatRadioButtonBase extends _MatRadioButtonMixinBa
2828
_onInputChange(event: Event): void;
2929
_onInputClick(event: Event): void;
3030
protected _setDisabled(value: boolean): void;
31-
focus(options?: FocusOptions): void;
31+
focus(options?: FocusOptions, origin?: FocusOrigin): void;
3232
ngAfterViewInit(): void;
3333
ngOnDestroy(): void;
3434
ngOnInit(): void;

0 commit comments

Comments
 (0)