Skip to content

Commit 057cac8

Browse files
committed
fix(button-toggle): underlying input not disabled when group is disabled
Fixes the underlying `input` element inside a `mat-button-toggle` not being disabled when the parent toggle group is disabled via a data binding. Fixes #11608.
1 parent 4639a87 commit 057cac8

File tree

2 files changed

+25
-17
lines changed

2 files changed

+25
-17
lines changed

src/lib/button-toggle/button-toggle.spec.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,17 @@ describe('MatButtonToggle without forms', () => {
286286
expect(groupNativeElement.getAttribute('aria-disabled')).toBe('true');
287287
});
288288

289+
it('should disable the underlying input when the group is disabled', () => {
290+
const inputs = buttonToggleNativeElements.map(toggle => toggle.querySelector('input')!);
291+
292+
expect(inputs.every(input => input.disabled)).toBe(false);
293+
294+
testComponent.isGroupDisabled = true;
295+
fixture.detectChanges();
296+
297+
expect(inputs.every(input => input.disabled)).toBe(true);
298+
});
299+
289300
it('should update the group value when one of the toggles changes', () => {
290301
expect(groupInstance.value).toBeFalsy();
291302
buttonToggleLabelElements[0].click();

src/lib/button-toggle/button-toggle.ts

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -30,21 +30,14 @@ import {
3030
} from '@angular/core';
3131
import {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';
3232
import {
33-
CanDisable,
3433
CanDisableRipple,
35-
mixinDisabled,
3634
mixinDisableRipple
3735
} from '@angular/material/core';
3836
import {SelectionModel} from '@angular/cdk/collections';
3937

4038
/** Acceptable types for a button toggle. */
4139
export type ToggleType = 'checkbox' | 'radio';
4240

43-
// Boilerplate for applying mixins to MatButtonToggleGroup and MatButtonToggleGroupMultiple
44-
/** @docs-private */
45-
export class MatButtonToggleGroupBase {}
46-
export const _MatButtonToggleGroupMixinBase = mixinDisabled(MatButtonToggleGroupBase);
47-
4841
/**
4942
* Provider Expression that allows mat-button-toggle-group to register as a ControlValueAccessor.
5043
* This allows it to support [(ngModel)].
@@ -81,7 +74,6 @@ export class MatButtonToggleChange {
8174
MAT_BUTTON_TOGGLE_GROUP_VALUE_ACCESSOR,
8275
{provide: MatButtonToggleGroupMultiple, useExisting: MatButtonToggleGroup},
8376
],
84-
inputs: ['disabled'],
8577
host: {
8678
'role': 'group',
8779
'class': 'mat-button-toggle-group',
@@ -90,11 +82,11 @@ export class MatButtonToggleChange {
9082
},
9183
exportAs: 'matButtonToggleGroup',
9284
})
93-
export class MatButtonToggleGroup extends _MatButtonToggleGroupMixinBase implements
94-
ControlValueAccessor, CanDisable, OnInit, AfterContentInit {
85+
export class MatButtonToggleGroup implements ControlValueAccessor, OnInit, AfterContentInit {
9586

9687
private _vertical = false;
9788
private _multiple = false;
89+
private _disabled = false;
9890
private _selectionModel: SelectionModel<MatButtonToggle>;
9991

10092
/**
@@ -172,13 +164,22 @@ export class MatButtonToggleGroup extends _MatButtonToggleGroupMixinBase impleme
172164
this._multiple = coerceBooleanProperty(value);
173165
}
174166

167+
/** Whether multiple button toggle group is disabled. */
168+
@Input()
169+
get disabled(): boolean { return this._disabled; }
170+
set disabled(value: boolean) {
171+
this._disabled = coerceBooleanProperty(value);
172+
173+
if (this._buttonToggles) {
174+
this._buttonToggles.forEach(toggle => toggle._markForCheck());
175+
}
176+
}
177+
175178
/** Event emitted when the group's value changes. */
176179
@Output() readonly change: EventEmitter<MatButtonToggleChange> =
177180
new EventEmitter<MatButtonToggleChange>();
178181

179-
constructor(private _changeDetector: ChangeDetectorRef) {
180-
super();
181-
}
182+
constructor(private _changeDetector: ChangeDetectorRef) {}
182183

183184
ngOnInit() {
184185
this._selectionModel = new SelectionModel<MatButtonToggle>(this.multiple, undefined, false);
@@ -210,10 +211,6 @@ export class MatButtonToggleGroup extends _MatButtonToggleGroupMixinBase impleme
210211
// Implemented as part of ControlValueAccessor.
211212
setDisabledState(isDisabled: boolean): void {
212213
this.disabled = isDisabled;
213-
214-
if (this._buttonToggles) {
215-
this._buttonToggles.forEach(toggle => toggle._markForCheck());
216-
}
217214
}
218215

219216
/** Dispatch change event with current selection and group value. */

0 commit comments

Comments
 (0)