Skip to content

Commit 8815846

Browse files
mmalerbajelbourn
authored andcommitted
fix(slider): use percent values for the track (#1663)
fixes #1389 fixes #1304 fixes #1234
1 parent 309d54c commit 8815846

File tree

11 files changed

+512
-641
lines changed

11 files changed

+512
-641
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@
8181
"run-sequence": "^1.2.2",
8282
"sass": "^0.5.0",
8383
"strip-ansi": "^3.0.0",
84-
"stylelint": "^6.9.0",
84+
"stylelint": "^7.5.0",
8585
"symlink-or-copy": "^1.0.1",
8686
"ts-node": "^0.7.3",
8787
"tslint": "^3.13.0",

src/demo-app/slider/slider-demo.html

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,9 @@ <h1>Slider with one-way binding</h1>
3333
<h1>Slider with two-way binding</h1>
3434
<md-slider [(ngModel)]="demo" step="40"></md-slider>
3535
<input [(ngModel)]="demo">
36+
37+
<md-tab-group>
38+
<md-tab label="One">
39+
<md-slider min="1" max="5" value="3"></md-slider>
40+
</md-tab>
41+
</md-tab-group>
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import {coerceNumberProperty} from './number-property';
2+
3+
4+
describe('coerceNumberProperty', () => {
5+
it('should coerce undefined to 0 or default', () => {
6+
expect(coerceNumberProperty(undefined)).toBe(0);
7+
expect(coerceNumberProperty(undefined, 111)).toBe(111);
8+
});
9+
10+
it('should coerce null to 0 or default', () => {
11+
expect(coerceNumberProperty(null)).toBe(0);
12+
expect(coerceNumberProperty(null, 111)).toBe(111);
13+
});
14+
15+
it('should coerce true to 0 or default', () => {
16+
expect(coerceNumberProperty(true)).toBe(0);
17+
expect(coerceNumberProperty(true, 111)).toBe(111);
18+
});
19+
20+
it('should coerce false to 0 or default', () => {
21+
expect(coerceNumberProperty(false)).toBe(0);
22+
expect(coerceNumberProperty(false, 111)).toBe(111);
23+
24+
});
25+
26+
it('should coerce the empty string to 0 or default', () => {
27+
expect(coerceNumberProperty('')).toBe(0);
28+
expect(coerceNumberProperty('', 111)).toBe(111);
29+
30+
});
31+
32+
it('should coerce the string "1" to 1', () => {
33+
expect(coerceNumberProperty('1')).toBe(1);
34+
expect(coerceNumberProperty('1', 111)).toBe(1);
35+
});
36+
37+
it('should coerce the string "123.456" to 123.456', () => {
38+
expect(coerceNumberProperty('123.456')).toBe(123.456);
39+
expect(coerceNumberProperty('123.456', 111)).toBe(123.456);
40+
});
41+
42+
it('should coerce the string "-123.456" to -123.456', () => {
43+
expect(coerceNumberProperty('-123.456')).toBe(-123.456);
44+
expect(coerceNumberProperty('-123.456', 111)).toBe(-123.456);
45+
});
46+
47+
it('should coerce an arbitrary string to 0 or default', () => {
48+
expect(coerceNumberProperty('pink')).toBe(0);
49+
expect(coerceNumberProperty('pink', 111)).toBe(111);
50+
});
51+
52+
it('should coerce an arbitrary string prefixed with a number to 0 or default', () => {
53+
expect(coerceNumberProperty('123pink')).toBe(0);
54+
expect(coerceNumberProperty('123pink', 111)).toBe(111);
55+
});
56+
57+
it('should coerce the number 1 to 1', () => {
58+
expect(coerceNumberProperty(1)).toBe(1);
59+
expect(coerceNumberProperty(1, 111)).toBe(1);
60+
});
61+
62+
it('should coerce the number 123.456 to 123.456', () => {
63+
expect(coerceNumberProperty(123.456)).toBe(123.456);
64+
expect(coerceNumberProperty(123.456, 111)).toBe(123.456);
65+
});
66+
67+
it('should coerce the number -123.456 to -123.456', () => {
68+
expect(coerceNumberProperty(-123.456)).toBe(-123.456);
69+
expect(coerceNumberProperty(-123.456, 111)).toBe(-123.456);
70+
});
71+
72+
it('should coerce an object to 0 or default', () => {
73+
expect(coerceNumberProperty({})).toBe(0);
74+
expect(coerceNumberProperty({}, 111)).toBe(111);
75+
});
76+
77+
it('should coerce an array to 0 or default', () => {
78+
expect(coerceNumberProperty([])).toBe(0);
79+
expect(coerceNumberProperty([], 111)).toBe(111);
80+
});
81+
});
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
/** Coerces a data-bound value (typically a string) to a number. */
2+
export function coerceNumberProperty(value: any, fallbackValue = 0) {
3+
// parseFloat(value) handles most of the cases we're interested in (it treats null, empty string,
4+
// and other non-number values as NaN, where Number just uses 0) but it considers the string
5+
// '123hello' to be a valid number. Therefore we also check if Number(value) is NaN.
6+
return isNaN(parseFloat(value as any)) || isNaN(Number(value)) ? fallbackValue : Number(value);
7+
}

src/lib/core/core.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ export * from './animation/animation';
8383

8484
// Coersion
8585
export {coerceBooleanProperty} from './coersion/boolean-property';
86+
export {coerceNumberProperty} from './coersion/number-property';
8687

8788

8889
@NgModule({

src/lib/slider/_slider-theme.scss

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,8 @@
1818
background-color: md-color($accent);
1919
}
2020

21-
.md-slider-thumb::after {
21+
.md-slider-thumb {
2222
background-color: md-color($accent);
23-
border-color: md-color($accent);
2423
}
2524

2625
.md-slider-thumb-label {

src/lib/slider/slider.html

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,13 @@
1-
<div class="md-slider-wrapper">
2-
<div class="md-slider-container"
3-
[class.md-slider-sliding]="isSliding"
4-
[class.md-slider-active]="isActive"
5-
[class.md-slider-thumb-label-showing]="thumbLabel">
6-
<div class="md-slider-track-container">
7-
<div class="md-slider-track"></div>
8-
<div class="md-slider-track md-slider-track-fill"></div>
9-
<div class="md-slider-tick-container"></div>
10-
<div class="md-slider-last-tick-container"></div>
11-
</div>
12-
<div class="md-slider-thumb-container">
13-
<div class="md-slider-thumb-position">
14-
<div class="md-slider-thumb"></div>
15-
<div class="md-slider-thumb-label">
16-
<span class="md-slider-thumb-label-text">{{value}}</span>
17-
</div>
18-
</div>
1+
<div class="md-slider-track">
2+
<div class="md-slider-track-fill" [style.flexBasis]="trackFillFlexBasis"></div>
3+
<div class="md-slider-ticks-container" [style.marginLeft]="ticksContainerMarginLeft">
4+
<div class="md-slider-ticks" [style.marginLeft]="ticksMarginLeft"
5+
[style.backgroundSize]="ticksBackgroundSize"></div>
6+
</div>
7+
<div class="md-slider-thumb-container">
8+
<div class="md-slider-thumb"></div>
9+
<div class="md-slider-thumb-label">
10+
<span class="md-slider-thumb-label-text">{{value}}</span>
1911
</div>
2012
</div>
21-
</div>
13+
</div>

0 commit comments

Comments
 (0)