Skip to content

Commit bd21f21

Browse files
crisbetojelbourn
authored andcommitted
fix(button-toggle): underlying input not disabled when group is disabled (#11610)
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 a7de64a commit bd21f21

File tree

2 files changed

+26
-20
lines changed

2 files changed

+26
-20
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 button when the group is disabled', () => {
290+
const buttons = buttonToggleNativeElements.map(toggle => toggle.querySelector('button')!);
291+
292+
expect(buttons.every(input => input.disabled)).toBe(false);
293+
294+
testComponent.isGroupDisabled = true;
295+
fixture.detectChanges();
296+
297+
expect(buttons.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: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -31,24 +31,15 @@ import {
3131
} from '@angular/core';
3232
import {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';
3333
import {
34-
CanDisable,
35-
CanDisableCtor,
3634
CanDisableRipple,
37-
CanDisableRippleCtor,
38-
mixinDisabled,
3935
mixinDisableRipple,
36+
CanDisableRippleCtor,
4037
} from '@angular/material/core';
4138

4239

4340
/** Acceptable types for a button toggle. */
4441
export type ToggleType = 'checkbox' | 'radio';
4542

46-
// Boilerplate for applying mixins to MatButtonToggleGroup and MatButtonToggleGroupMultiple
47-
/** @docs-private */
48-
export class MatButtonToggleGroupBase {}
49-
export const _MatButtonToggleGroupMixinBase: CanDisableCtor & typeof MatButtonToggleGroupBase =
50-
mixinDisabled(MatButtonToggleGroupBase);
51-
5243
/**
5344
* Provider Expression that allows mat-button-toggle-group to register as a ControlValueAccessor.
5445
* This allows it to support [(ngModel)].
@@ -85,7 +76,6 @@ export class MatButtonToggleChange {
8576
MAT_BUTTON_TOGGLE_GROUP_VALUE_ACCESSOR,
8677
{provide: MatButtonToggleGroupMultiple, useExisting: MatButtonToggleGroup},
8778
],
88-
inputs: ['disabled'],
8979
host: {
9080
'role': 'group',
9181
'class': 'mat-button-toggle-group',
@@ -94,11 +84,11 @@ export class MatButtonToggleChange {
9484
},
9585
exportAs: 'matButtonToggleGroup',
9686
})
97-
export class MatButtonToggleGroup extends _MatButtonToggleGroupMixinBase implements
98-
ControlValueAccessor, CanDisable, OnInit, AfterContentInit {
87+
export class MatButtonToggleGroup implements ControlValueAccessor, OnInit, AfterContentInit {
9988

10089
private _vertical = false;
10190
private _multiple = false;
91+
private _disabled = false;
10292
private _selectionModel: SelectionModel<MatButtonToggle>;
10393

10494
/**
@@ -176,13 +166,22 @@ export class MatButtonToggleGroup extends _MatButtonToggleGroupMixinBase impleme
176166
this._multiple = coerceBooleanProperty(value);
177167
}
178168

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

183-
constructor(private _changeDetector: ChangeDetectorRef) {
184-
super();
185-
}
184+
constructor(private _changeDetector: ChangeDetectorRef) {}
186185

187186
ngOnInit() {
188187
this._selectionModel = new SelectionModel<MatButtonToggle>(this.multiple, undefined, false);
@@ -214,10 +213,6 @@ export class MatButtonToggleGroup extends _MatButtonToggleGroupMixinBase impleme
214213
// Implemented as part of ControlValueAccessor.
215214
setDisabledState(isDisabled: boolean): void {
216215
this.disabled = isDisabled;
217-
218-
if (this._buttonToggles) {
219-
this._buttonToggles.forEach(toggle => toggle._markForCheck());
220-
}
221216
}
222217

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

0 commit comments

Comments
 (0)