Skip to content

Commit f2dcb65

Browse files
committed
refactor(material/button-toggle): remove mixin class usages
Replaces mixin class usages in the button toggle with input transforms.
1 parent baa9a8a commit f2dcb65

File tree

3 files changed

+39
-49
lines changed

3 files changed

+39
-49
lines changed

src/material/button-toggle/BUILD.bazel

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ ng_module(
2020
deps = [
2121
"//src:dev_mode_types",
2222
"//src/cdk/a11y",
23-
"//src/cdk/coercion",
2423
"//src/cdk/collections",
2524
"//src/material/core",
2625
"@npm//@angular/core",

src/material/button-toggle/button-toggle.ts

Lines changed: 19 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
*/
88

99
import {FocusMonitor} from '@angular/cdk/a11y';
10-
import {BooleanInput, coerceBooleanProperty} from '@angular/cdk/coercion';
1110
import {SelectionModel} from '@angular/cdk/collections';
1211
import {
1312
AfterContentInit,
@@ -31,9 +30,9 @@ import {
3130
InjectionToken,
3231
Inject,
3332
AfterViewInit,
33+
booleanAttribute,
3434
} from '@angular/core';
3535
import {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';
36-
import {CanDisableRipple, mixinDisableRipple} from '@angular/material/core';
3736

3837
/**
3938
* @deprecated No longer used.
@@ -115,7 +114,6 @@ export class MatButtonToggleChange {
115114
exportAs: 'matButtonToggleGroup',
116115
})
117116
export class MatButtonToggleGroup implements ControlValueAccessor, OnInit, AfterContentInit {
118-
private _vertical = false;
119117
private _multiple = false;
120118
private _disabled = false;
121119
private _selectionModel: SelectionModel<MatButtonToggle>;
@@ -160,13 +158,7 @@ export class MatButtonToggleGroup implements ControlValueAccessor, OnInit, After
160158
private _name = `mat-button-toggle-group-${uniqueIdCounter++}`;
161159

162160
/** Whether the toggle group is vertical. */
163-
@Input()
164-
get vertical(): boolean {
165-
return this._vertical;
166-
}
167-
set vertical(value: BooleanInput) {
168-
this._vertical = coerceBooleanProperty(value);
169-
}
161+
@Input({transform: booleanAttribute}) vertical: boolean;
170162

171163
/** Value of the toggle group. */
172164
@Input()
@@ -198,22 +190,22 @@ export class MatButtonToggleGroup implements ControlValueAccessor, OnInit, After
198190
}
199191

200192
/** Whether multiple button toggles can be selected. */
201-
@Input()
193+
@Input({transform: booleanAttribute})
202194
get multiple(): boolean {
203195
return this._multiple;
204196
}
205-
set multiple(value: BooleanInput) {
206-
this._multiple = coerceBooleanProperty(value);
197+
set multiple(value: boolean) {
198+
this._multiple = value;
207199
this._markButtonsForCheck();
208200
}
209201

210202
/** Whether multiple button toggle group is disabled. */
211-
@Input()
203+
@Input({transform: booleanAttribute})
212204
get disabled(): boolean {
213205
return this._disabled;
214206
}
215-
set disabled(value: BooleanInput) {
216-
this._disabled = coerceBooleanProperty(value);
207+
set disabled(value: boolean) {
208+
this._disabled = value;
217209
this._markButtonsForCheck();
218210
}
219211

@@ -385,10 +377,6 @@ export class MatButtonToggleGroup implements ControlValueAccessor, OnInit, After
385377
}
386378
}
387379

388-
// Boilerplate for applying mixins to the MatButtonToggle class.
389-
/** @docs-private */
390-
const _MatButtonToggleBase = mixinDisableRipple(class {});
391-
392380
/** Single button inside of a toggle group. */
393381
@Component({
394382
selector: 'mat-button-toggle',
@@ -397,7 +385,6 @@ const _MatButtonToggleBase = mixinDisableRipple(class {});
397385
encapsulation: ViewEncapsulation.None,
398386
exportAs: 'matButtonToggle',
399387
changeDetection: ChangeDetectionStrategy.OnPush,
400-
inputs: ['disableRipple'],
401388
host: {
402389
'[class.mat-button-toggle-standalone]': '!buttonToggleGroup',
403390
'[class.mat-button-toggle-checked]': 'checked',
@@ -412,10 +399,7 @@ const _MatButtonToggleBase = mixinDisableRipple(class {});
412399
'role': 'presentation',
413400
},
414401
})
415-
export class MatButtonToggle
416-
extends _MatButtonToggleBase
417-
implements OnInit, AfterViewInit, CanDisableRipple, OnDestroy
418-
{
402+
export class MatButtonToggle implements OnInit, AfterViewInit, OnDestroy {
419403
private _checked = false;
420404

421405
/**
@@ -452,6 +436,9 @@ export class MatButtonToggle
452436
/** Tabindex for the toggle. */
453437
@Input() tabIndex: number | null;
454438

439+
/** Whether ripples are disabled on the button toggle. */
440+
@Input({transform: booleanAttribute}) disableRipple: boolean;
441+
455442
/** The appearance style of the button. */
456443
@Input()
457444
get appearance(): MatButtonToggleAppearance {
@@ -463,15 +450,13 @@ export class MatButtonToggle
463450
private _appearance: MatButtonToggleAppearance;
464451

465452
/** Whether the button is checked. */
466-
@Input()
453+
@Input({transform: booleanAttribute})
467454
get checked(): boolean {
468455
return this.buttonToggleGroup ? this.buttonToggleGroup._isSelected(this) : this._checked;
469456
}
470-
set checked(value: BooleanInput) {
471-
const newValue = coerceBooleanProperty(value);
472-
473-
if (newValue !== this._checked) {
474-
this._checked = newValue;
457+
set checked(value: boolean) {
458+
if (value !== this._checked) {
459+
this._checked = value;
475460

476461
if (this.buttonToggleGroup) {
477462
this.buttonToggleGroup._syncButtonToggle(this, this._checked);
@@ -482,12 +467,12 @@ export class MatButtonToggle
482467
}
483468

484469
/** Whether the button is disabled. */
485-
@Input()
470+
@Input({transform: booleanAttribute})
486471
get disabled(): boolean {
487472
return this._disabled || (this.buttonToggleGroup && this.buttonToggleGroup.disabled);
488473
}
489-
set disabled(value: BooleanInput) {
490-
this._disabled = coerceBooleanProperty(value);
474+
set disabled(value: boolean) {
475+
this._disabled = value;
491476
}
492477
private _disabled: boolean = false;
493478

@@ -505,8 +490,6 @@ export class MatButtonToggle
505490
@Inject(MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS)
506491
defaultOptions?: MatButtonToggleDefaultOptions,
507492
) {
508-
super();
509-
510493
const parsedTabIndex = Number(defaultTabIndex);
511494
this.tabIndex = parsedTabIndex || parsedTabIndex === 0 ? parsedTabIndex : null;
512495
this.buttonToggleGroup = toggleGroup;

tools/public_api_guard/material/button-toggle.md

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,9 @@
44
55
```ts
66

7-
import { _AbstractConstructor } from '@angular/material/core';
87
import { AfterContentInit } from '@angular/core';
98
import { AfterViewInit } from '@angular/core';
10-
import { BooleanInput } from '@angular/cdk/coercion';
11-
import { CanDisableRipple } from '@angular/material/core';
129
import { ChangeDetectorRef } from '@angular/core';
13-
import { _Constructor } from '@angular/material/core';
1410
import { ControlValueAccessor } from '@angular/forms';
1511
import { ElementRef } from '@angular/core';
1612
import { EventEmitter } from '@angular/core';
@@ -32,7 +28,7 @@ export const MAT_BUTTON_TOGGLE_GROUP: InjectionToken<MatButtonToggleGroup>;
3228
export const MAT_BUTTON_TOGGLE_GROUP_VALUE_ACCESSOR: any;
3329

3430
// @public
35-
export class MatButtonToggle extends _MatButtonToggleBase implements OnInit, AfterViewInit, CanDisableRipple, OnDestroy {
31+
export class MatButtonToggle implements OnInit, AfterViewInit, OnDestroy {
3632
constructor(toggleGroup: MatButtonToggleGroup, _changeDetectorRef: ChangeDetectorRef, _elementRef: ElementRef<HTMLElement>, _focusMonitor: FocusMonitor, defaultTabIndex: string, defaultOptions?: MatButtonToggleDefaultOptions);
3733
get appearance(): MatButtonToggleAppearance;
3834
set appearance(value: MatButtonToggleAppearance);
@@ -43,15 +39,22 @@ export class MatButtonToggle extends _MatButtonToggleBase implements OnInit, Aft
4339
buttonToggleGroup: MatButtonToggleGroup;
4440
readonly change: EventEmitter<MatButtonToggleChange>;
4541
get checked(): boolean;
46-
set checked(value: BooleanInput);
42+
set checked(value: boolean);
4743
get disabled(): boolean;
48-
set disabled(value: BooleanInput);
44+
set disabled(value: boolean);
45+
disableRipple: boolean;
4946
focus(options?: FocusOptions): void;
5047
_getButtonName(): string | null;
5148
id: string;
5249
_markForCheck(): void;
5350
name: string;
5451
// (undocumented)
52+
static ngAcceptInputType_checked: unknown;
53+
// (undocumented)
54+
static ngAcceptInputType_disabled: unknown;
55+
// (undocumented)
56+
static ngAcceptInputType_disableRipple: unknown;
57+
// (undocumented)
5558
ngAfterViewInit(): void;
5659
// (undocumented)
5760
ngOnDestroy(): void;
@@ -61,7 +64,7 @@ export class MatButtonToggle extends _MatButtonToggleBase implements OnInit, Aft
6164
tabIndex: number | null;
6265
value: any;
6366
// (undocumented)
64-
static ɵcmp: i0.ɵɵComponentDeclaration<MatButtonToggle, "mat-button-toggle", ["matButtonToggle"], { "disableRipple": { "alias": "disableRipple"; "required": false; }; "ariaLabel": { "alias": "aria-label"; "required": false; }; "ariaLabelledby": { "alias": "aria-labelledby"; "required": false; }; "id": { "alias": "id"; "required": false; }; "name": { "alias": "name"; "required": false; }; "value": { "alias": "value"; "required": false; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; "appearance": { "alias": "appearance"; "required": false; }; "checked": { "alias": "checked"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "change": "change"; }, never, ["*"], false, never>;
67+
static ɵcmp: i0.ɵɵComponentDeclaration<MatButtonToggle, "mat-button-toggle", ["matButtonToggle"], { "ariaLabel": { "alias": "aria-label"; "required": false; }; "ariaLabelledby": { "alias": "aria-labelledby"; "required": false; }; "id": { "alias": "id"; "required": false; }; "name": { "alias": "name"; "required": false; }; "value": { "alias": "value"; "required": false; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; "disableRipple": { "alias": "disableRipple"; "required": false; }; "appearance": { "alias": "appearance"; "required": false; }; "checked": { "alias": "checked"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "change": "change"; }, never, ["*"], false, never>;
6568
// (undocumented)
6669
static ɵfac: i0.ɵɵFactoryDeclaration<MatButtonToggle, [{ optional: true; }, null, null, null, { attribute: "tabindex"; }, { optional: true; }]>;
6770
}
@@ -91,15 +94,21 @@ export class MatButtonToggleGroup implements ControlValueAccessor, OnInit, After
9194
readonly change: EventEmitter<MatButtonToggleChange>;
9295
_controlValueAccessorChangeFn: (value: any) => void;
9396
get disabled(): boolean;
94-
set disabled(value: BooleanInput);
97+
set disabled(value: boolean);
9598
_emitChangeEvent(toggle: MatButtonToggle): void;
9699
_isPrechecked(toggle: MatButtonToggle): boolean;
97100
_isSelected(toggle: MatButtonToggle): boolean;
98101
get multiple(): boolean;
99-
set multiple(value: BooleanInput);
102+
set multiple(value: boolean);
100103
get name(): string;
101104
set name(value: string);
102105
// (undocumented)
106+
static ngAcceptInputType_disabled: unknown;
107+
// (undocumented)
108+
static ngAcceptInputType_multiple: unknown;
109+
// (undocumented)
110+
static ngAcceptInputType_vertical: unknown;
111+
// (undocumented)
103112
ngAfterContentInit(): void;
104113
// (undocumented)
105114
ngOnInit(): void;
@@ -115,8 +124,7 @@ export class MatButtonToggleGroup implements ControlValueAccessor, OnInit, After
115124
get value(): any;
116125
set value(newValue: any);
117126
readonly valueChange: EventEmitter<any>;
118-
get vertical(): boolean;
119-
set vertical(value: BooleanInput);
127+
vertical: boolean;
120128
writeValue(value: any): void;
121129
// (undocumented)
122130
static ɵdir: i0.ɵɵDirectiveDeclaration<MatButtonToggleGroup, "mat-button-toggle-group", ["matButtonToggleGroup"], { "appearance": { "alias": "appearance"; "required": false; }; "name": { "alias": "name"; "required": false; }; "vertical": { "alias": "vertical"; "required": false; }; "value": { "alias": "value"; "required": false; }; "multiple": { "alias": "multiple"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "valueChange": "valueChange"; "change": "change"; }, ["_buttonToggles"], never, false, never>;

0 commit comments

Comments
 (0)