Skip to content

Commit df30433

Browse files
authored
feat(material/slide-toggle): allow for icon to be hidden (#27330)
Adds an input that allows users to opt into hiding the slide toggle icon. Fixes #27321.
1 parent dd9300e commit df30433

File tree

6 files changed

+37
-23
lines changed

6 files changed

+37
-23
lines changed
Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,15 @@
11
<div class="demo-slide-toggle">
2-
3-
<mat-slide-toggle color="primary" [(ngModel)]="firstToggle">
4-
Default Slide Toggle
5-
</mat-slide-toggle>
6-
7-
<mat-slide-toggle [(ngModel)]="firstToggle" disabled>
8-
Disabled Slide Toggle
9-
</mat-slide-toggle>
10-
11-
<mat-slide-toggle [disabled]="firstToggle">
12-
Disable Bound
13-
</mat-slide-toggle>
2+
<mat-slide-toggle color="primary" [(ngModel)]="firstToggle">Default Slide Toggle</mat-slide-toggle>
3+
<mat-slide-toggle [(ngModel)]="firstToggle" disabled>Disabled Slide Toggle</mat-slide-toggle>
4+
<mat-slide-toggle [disabled]="firstToggle">Disable Bound</mat-slide-toggle>
5+
<mat-slide-toggle hideIcon [(ngModel)]="firstToggle">No icon</mat-slide-toggle>
146

157
<p>Example where the slide toggle is required inside of a form.</p>
168

179
<form #form="ngForm" (ngSubmit)="onFormSubmit()">
18-
19-
<mat-slide-toggle name="slideToggle" [(ngModel)]="formToggle">
20-
Slide Toggle
21-
</mat-slide-toggle>
22-
10+
<mat-slide-toggle name="slideToggle" [(ngModel)]="formToggle">Slide Toggle</mat-slide-toggle>
2311
<p>
2412
<button mat-raised-button type="submit">Submit Form</button>
2513
</p>
26-
2714
</form>
28-
29-
</div>
15+
</div>

src/material/slide-toggle/slide-toggle-config.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,16 @@ export interface MatSlideToggleDefaultOptions {
1515

1616
/** Default color for slide toggles. */
1717
color?: ThemePalette;
18+
19+
/** Whether to hide the icon inside the slide toggle. */
20+
hideIcon?: boolean;
1821
}
1922

2023
/** Injection token to be used to override the default options for `mat-slide-toggle`. */
2124
export const MAT_SLIDE_TOGGLE_DEFAULT_OPTIONS = new InjectionToken<MatSlideToggleDefaultOptions>(
2225
'mat-slide-toggle-default-options',
2326
{
2427
providedIn: 'root',
25-
factory: () => ({disableToggleValue: false}),
28+
factory: () => ({disableToggleValue: false, hideIcon: false}),
2629
},
2730
);

src/material/slide-toggle/slide-toggle.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
[matRippleDisabled]="disableRipple || disabled"
3232
[matRippleCentered]="true"></div>
3333
</div>
34-
<div class="mdc-switch__icons">
34+
<div class="mdc-switch__icons" *ngIf="!hideIcon">
3535
<svg
3636
class="mdc-switch__icon mdc-switch__icon--on"
3737
viewBox="0 0 24 24"

src/material/slide-toggle/slide-toggle.spec.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,15 @@ describe('MDC-based MatSlideToggle without forms', () => {
346346
const rippleElement = slideToggleElement.querySelector('.mat-mdc-slide-toggle-ripple')!;
347347
expect(rippleElement.classList).toContain('mat-mdc-focus-indicator');
348348
}));
349+
350+
it('should be able to hide the icon', fakeAsync(() => {
351+
expect(slideToggleElement.querySelector('.mdc-switch__icons')).toBeTruthy();
352+
353+
testComponent.hideIcon = true;
354+
fixture.detectChanges();
355+
356+
expect(slideToggleElement.querySelector('.mdc-switch__icons')).toBeFalsy();
357+
}));
349358
});
350359

351360
describe('custom template', () => {
@@ -798,6 +807,7 @@ describe('MDC-based MatSlideToggle with forms', () => {
798807
[tabIndex]="slideTabindex"
799808
[labelPosition]="labelPosition"
800809
[disableRipple]="disableRipple"
810+
[hideIcon]="hideIcon"
801811
(toggleChange)="onSlideToggleChange()"
802812
(dragChange)="onSlideDragChange()"
803813
(change)="onSlideChange($event)"
@@ -822,6 +832,7 @@ class SlideToggleBasic {
822832
toggleTriggered: number = 0;
823833
dragTriggered: number = 0;
824834
direction: Direction = 'ltr';
835+
hideIcon = false;
825836

826837
onSlideClick: (event?: Event) => void = () => {};
827838
onSlideChange = (event: MatSlideToggleChange) => (this.lastEvent = event);

src/material/slide-toggle/slide-toggle.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,16 @@ export abstract class _MatSlideToggleBase<T>
145145
this._changeDetectorRef.markForCheck();
146146
}
147147

148+
/** Whether to hide the icon inside of the slide toggle. */
149+
@Input()
150+
get hideIcon(): boolean {
151+
return this._hideIcon;
152+
}
153+
set hideIcon(value: BooleanInput) {
154+
this._hideIcon = coerceBooleanProperty(value);
155+
}
156+
private _hideIcon = false;
157+
148158
/** An event will be dispatched each time the slide-toggle changes its value. */
149159
@Output() readonly change: EventEmitter<T> = new EventEmitter<T>();
150160

@@ -174,6 +184,7 @@ export abstract class _MatSlideToggleBase<T>
174184
this.color = this.defaultColor = defaults.color || 'accent';
175185
this._noopAnimations = animationMode === 'NoopAnimations';
176186
this.id = this._uniqueId = `${idPrefix}${++nextUniqueId}`;
187+
this._hideIcon = defaults.hideIcon ?? false;
177188
}
178189

179190
ngAfterContentInit() {

tools/public_api_guard/material/slide-toggle.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ export abstract class _MatSlideToggleBase<T> extends _MatSlideToggleMixinBase im
8080
_focused: boolean;
8181
// (undocumented)
8282
protected _focusMonitor: FocusMonitor;
83+
get hideIcon(): boolean;
84+
set hideIcon(value: BooleanInput);
8385
id: string;
8486
get inputId(): string;
8587
labelPosition: 'before' | 'after';
@@ -102,7 +104,7 @@ export abstract class _MatSlideToggleBase<T> extends _MatSlideToggleMixinBase im
102104
protected _uniqueId: string;
103105
writeValue(value: any): void;
104106
// (undocumented)
105-
static ɵdir: i0.ɵɵDirectiveDeclaration<_MatSlideToggleBase<any>, never, never, { "name": { "alias": "name"; "required": false; }; "id": { "alias": "id"; "required": false; }; "labelPosition": { "alias": "labelPosition"; "required": false; }; "ariaLabel": { "alias": "aria-label"; "required": false; }; "ariaLabelledby": { "alias": "aria-labelledby"; "required": false; }; "ariaDescribedby": { "alias": "aria-describedby"; "required": false; }; "required": { "alias": "required"; "required": false; }; "checked": { "alias": "checked"; "required": false; }; }, { "change": "change"; "toggleChange": "toggleChange"; }, never, never, false, never>;
107+
static ɵdir: i0.ɵɵDirectiveDeclaration<_MatSlideToggleBase<any>, never, never, { "name": { "alias": "name"; "required": false; }; "id": { "alias": "id"; "required": false; }; "labelPosition": { "alias": "labelPosition"; "required": false; }; "ariaLabel": { "alias": "aria-label"; "required": false; }; "ariaLabelledby": { "alias": "aria-labelledby"; "required": false; }; "ariaDescribedby": { "alias": "aria-describedby"; "required": false; }; "required": { "alias": "required"; "required": false; }; "checked": { "alias": "checked"; "required": false; }; "hideIcon": { "alias": "hideIcon"; "required": false; }; }, { "change": "change"; "toggleChange": "toggleChange"; }, never, never, false, never>;
106108
// (undocumented)
107109
static ɵfac: i0.ɵɵFactoryDeclaration<_MatSlideToggleBase<any>, never>;
108110
}
@@ -120,6 +122,7 @@ export class MatSlideToggleChange {
120122
export interface MatSlideToggleDefaultOptions {
121123
color?: ThemePalette;
122124
disableToggleValue?: boolean;
125+
hideIcon?: boolean;
123126
}
124127

125128
// @public (undocumented)

0 commit comments

Comments
 (0)