Skip to content

Commit 8c49422

Browse files
jwshinjwshinjelbourn
authored andcommitted
fix(slider): update styles when focus and dir change (#6700)
1 parent 2635cad commit 8c49422

File tree

2 files changed

+57
-5
lines changed

2 files changed

+57
-5
lines changed

src/lib/slider/slider.spec.ts

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {
1616
UP_ARROW,
1717
BACKSPACE
1818
} from '../core/keyboard/keycodes';
19-
import {dispatchKeyboardEvent, dispatchMouseEvent} from '@angular/cdk/testing';
19+
import {dispatchFakeEvent, dispatchKeyboardEvent, dispatchMouseEvent} from '@angular/cdk/testing';
2020

2121
describe('MdSlider without forms', () => {
2222
let gestureConfig: TestGestureConfig;
@@ -141,6 +141,28 @@ describe('MdSlider without forms', () => {
141141
expect(sliderNativeElement.classList).not.toContain('mat-slider-sliding');
142142
});
143143

144+
it('should reset active state upon blur', () => {
145+
sliderInstance._isActive = true;
146+
147+
dispatchFakeEvent(sliderNativeElement, 'blur');
148+
fixture.detectChanges();
149+
150+
expect(sliderInstance._isActive).toBe(false);
151+
});
152+
153+
it('should reset thumb gap when blurred on min value', () => {
154+
sliderInstance._isActive = true;
155+
sliderInstance.value = 0;
156+
fixture.detectChanges();
157+
158+
expect(sliderInstance._thumbGap).toBe(10);
159+
160+
dispatchFakeEvent(sliderNativeElement, 'blur');
161+
fixture.detectChanges();
162+
163+
expect(sliderInstance._thumbGap).toBe(7);
164+
});
165+
144166
it('should have thumb gap when at min value', () => {
145167
expect(trackFillElement.style.transform).toContain('translateX(-7px)');
146168
});
@@ -958,6 +980,24 @@ describe('MdSlider without forms', () => {
958980
expect(sliderInstance.value).toBe(30);
959981
});
960982

983+
it('should re-render slider with updated style upon directionality change', () => {
984+
testComponent.dir = 'rtl';
985+
fixture.detectChanges();
986+
987+
let initialTrackFillStyles = sliderInstance._trackFillStyles;
988+
let initialTicksContainerStyles = sliderInstance._ticksContainerStyles;
989+
let initialTicksStyles = sliderInstance._ticksStyles;
990+
let initialThumbContainerStyles = sliderInstance._thumbContainerStyles;
991+
992+
testComponent.dir = 'ltr';
993+
fixture.detectChanges();
994+
995+
expect(initialTrackFillStyles).not.toEqual(sliderInstance._trackFillStyles);
996+
expect(initialTicksContainerStyles).not.toEqual(sliderInstance._ticksContainerStyles);
997+
expect(initialTicksStyles).not.toEqual(sliderInstance._ticksStyles);
998+
expect(initialThumbContainerStyles).not.toEqual(sliderInstance._thumbContainerStyles);
999+
});
1000+
9611001
it('should increment inverted slider by 1 on right arrow pressed', () => {
9621002
testComponent.invert = true;
9631003
fixture.detectChanges();

src/lib/slider/slider.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import {
1919
Output,
2020
Renderer2,
2121
ViewEncapsulation,
22-
ViewChild,
22+
ViewChild, OnInit,
2323
} from '@angular/core';
2424
import {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';
2525
import {coerceBooleanProperty, coerceNumberProperty} from '@angular/cdk/coercion';
@@ -125,7 +125,7 @@ export const _MdSliderMixinBase = mixinColor(mixinDisabled(MdSliderBase), 'accen
125125
changeDetection: ChangeDetectionStrategy.OnPush,
126126
})
127127
export class MdSlider extends _MdSliderMixinBase
128-
implements ControlValueAccessor, OnDestroy, CanDisable, CanColor {
128+
implements ControlValueAccessor, OnDestroy, CanDisable, CanColor, OnInit {
129129
/** Whether the slider is inverted. */
130130
@Input()
131131
get invert() { return this._invert; }
@@ -410,13 +410,25 @@ export class MdSlider extends _MdSliderMixinBase
410410
private _changeDetectorRef: ChangeDetectorRef,
411411
@Optional() private _dir: Directionality) {
412412
super(renderer, elementRef);
413+
}
414+
415+
ngOnInit() {
413416
this._focusOriginMonitor
414-
.monitor(this._elementRef.nativeElement, renderer, true)
415-
.subscribe((origin: FocusOrigin) => this._isActive = !!origin && origin !== 'keyboard');
417+
.monitor(this._elementRef.nativeElement, this._renderer, true)
418+
.subscribe((origin: FocusOrigin) => {
419+
this._isActive = !!origin && origin !== 'keyboard';
420+
this._changeDetectorRef.detectChanges();
421+
});
422+
if (this._dir) {
423+
this._dir.change.subscribe(() => this._changeDetectorRef.markForCheck());
424+
}
416425
}
417426

418427
ngOnDestroy() {
419428
this._focusOriginMonitor.stopMonitoring(this._elementRef.nativeElement);
429+
if (this._dir) {
430+
this._dir.change.unsubscribe();
431+
}
420432
}
421433

422434
_onMouseenter() {

0 commit comments

Comments
 (0)