Skip to content

Commit f8fde13

Browse files
devversionmmalerba
authored andcommitted
feat(slide-toggle): add option to disable ripple (#3195)
* Adds an option to disable ripples for slide-toggle elements. Similar as for buttons, checkbox and other components.
1 parent 3edf105 commit f8fde13

File tree

3 files changed

+37
-1
lines changed

3 files changed

+37
-1
lines changed

src/lib/slide-toggle/slide-toggle.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
<div class="mat-slide-toggle-ripple" md-ripple
1313
[mdRippleTrigger]="label"
1414
[mdRippleCentered]="true"
15-
[mdRippleDisabled]="disabled"
15+
[mdRippleDisabled]="disableRipple || disabled"
1616
[mdRippleSpeedFactor]="0.3">
1717
</div>
1818
</div>

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,27 @@ describe('MdSlideToggle', () => {
367367
expect(slideToggleElement.classList).toContain('mat-slide-toggle-label-before');
368368
});
369369

370+
it('should show ripples on label mousedown', () => {
371+
expect(slideToggleElement.querySelectorAll('.mat-ripple-element').length).toBe(0);
372+
373+
dispatchFakeEvent(labelElement, 'mousedown');
374+
dispatchFakeEvent(labelElement, 'mouseup');
375+
376+
expect(slideToggleElement.querySelectorAll('.mat-ripple-element').length).toBe(1);
377+
});
378+
379+
it('should not show ripples when disableRipple is set', () => {
380+
testComponent.disableRipple = true;
381+
fixture.detectChanges();
382+
383+
expect(slideToggleElement.querySelectorAll('.mat-ripple-element').length).toBe(0);
384+
385+
dispatchFakeEvent(labelElement, 'mousedown');
386+
dispatchFakeEvent(labelElement, 'mouseup');
387+
388+
expect(slideToggleElement.querySelectorAll('.mat-ripple-element').length).toBe(0);
389+
});
390+
370391
});
371392

372393
describe('custom template', () => {
@@ -620,6 +641,7 @@ function dispatchFocusChangeEvent(eventName: string, element: HTMLElement): void
620641
[aria-labelledby]="slideLabelledBy"
621642
[tabIndex]="slideTabindex"
622643
[labelPosition]="labelPosition"
644+
[disableRipple]="disableRipple"
623645
(change)="onSlideChange($event)"
624646
(click)="onSlideClick($event)">
625647
@@ -630,6 +652,7 @@ function dispatchFocusChangeEvent(eventName: string, element: HTMLElement): void
630652
class SlideToggleTestApp {
631653
isDisabled: boolean = false;
632654
isRequired: boolean = false;
655+
disableRipple: boolean = false;
633656
slideModel: boolean = false;
634657
slideChecked: boolean = false;
635658
slideColor: string;
@@ -671,3 +694,10 @@ class SlideToggleFormsTestApp {
671694
class SlideToggleWithFormControl {
672695
formControl = new FormControl();
673696
}
697+
698+
// TODO(devversion): replace with global utility once pull request #2943 is merged.
699+
function dispatchFakeEvent(element: HTMLElement, eventName: string): void {
700+
let event = document.createEvent('Event');
701+
event.initEvent(eventName, true, true);
702+
element.dispatchEvent(event);
703+
}

src/lib/slide-toggle/slide-toggle.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ export class MdSlideToggle implements AfterContentInit, ControlValueAccessor {
7575
private _slideRenderer: SlideToggleRenderer = null;
7676
private _disabled: boolean = false;
7777
private _required: boolean = false;
78+
private _disableRipple: boolean = false;
7879

7980
// Needs to be public to support AOT compilation (as host binding).
8081
_hasFocus: boolean = false;
@@ -107,6 +108,11 @@ export class MdSlideToggle implements AfterContentInit, ControlValueAccessor {
107108
get required(): boolean { return this._required; }
108109
set required(value) { this._required = coerceBooleanProperty(value); }
109110

111+
/** Whether the ripple effect for this slide-toggle is disabled. */
112+
@Input()
113+
get disableRipple(): boolean { return this._disableRipple; }
114+
set disableRipple(value) { this._disableRipple = coerceBooleanProperty(value); }
115+
110116
private _change: EventEmitter<MdSlideToggleChange> = new EventEmitter<MdSlideToggleChange>();
111117
/** An event will be dispatched each time the slide-toggle changes its value. */
112118
@Output() change: Observable<MdSlideToggleChange> = this._change.asObservable();

0 commit comments

Comments
 (0)