Skip to content

Commit b993033

Browse files
authored
fix(rangeSlider): round pips numbers when step is integer (#1255)
The default rounding strategy for pips in nouislider is to use Math.round(). We used Number(v).toLocaleString() but on safari this led to weird results because 10.100001.toLocaleString() => '10.1000001' and on chrome it's '10' for example. Thus now we will Math.round the number before passing it to toLocaleString only if the step parameter of the slider is an integer. We use an npm module for Number.isInteger() because no IE nor safari version has it. fixes #1254
1 parent 1521801 commit b993033

File tree

5 files changed

+18
-4
lines changed

5 files changed

+18
-4
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@
8989
"classnames": "^2.2.5",
9090
"events": "^1.1.0",
9191
"hogan.js": "^3.0.2",
92+
"is-integer": "^1.0.6",
9293
"lodash": "^4.15.0",
9394
"react": "^15.3.1",
9495
"react-dom": "^15.3.1",

src/components/Slider/Slider.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class Slider extends React.Component {
4040
values: [0, 50, 100],
4141
stepped: true,
4242
format: {
43-
to: v => Number(v).toLocaleString()
43+
to: this.props.pipsFormatter
4444
}
4545
};
4646
} else {
@@ -51,7 +51,7 @@ class Slider extends React.Component {
5151
<Nouislider
5252
// NoUiSlider also accepts a cssClasses prop, but we don't want to
5353
// provide one.
54-
{...omit(this.props, 'cssClasses')}
54+
{...omit(this.props, ['cssClasses', 'pipsFormatter'])}
5555
animate={false}
5656
behaviour={'snap'}
5757
connect
@@ -79,7 +79,8 @@ Slider.propTypes = {
7979
to: React.PropTypes.func
8080
})
8181
)
82-
])
82+
]),
83+
pipsFormatter: React.PropTypes.func.isRequired
8384
};
8485

8586
export default Slider;

src/components/Slider/__tests__/Slider-test.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ describe('Slider', () => {
2121
renderer = createRenderer();
2222

2323
props = {
24-
range: {min: 0, max: 5000}
24+
range: {min: 0, max: 5000},
25+
pipsFormatter: () => {}
2526
};
2627
});
2728

src/widgets/range-slider/__tests__/range-slider-test.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ describe('rangeSlider()', () => {
9898
transformData: undefined,
9999
useCustomCompileOptions: {footer: false, header: false}
100100
},
101+
pipsFormatter: () => {},
101102
tooltips: true
102103
};
103104

@@ -180,6 +181,7 @@ describe('rangeSlider()', () => {
180181
transformData: undefined,
181182
useCustomCompileOptions: {footer: false, header: false}
182183
},
184+
pipsFormatter: () => {},
183185
tooltips: true
184186
};
185187

@@ -241,6 +243,7 @@ describe('rangeSlider()', () => {
241243
transformData: undefined,
242244
useCustomCompileOptions: {footer: false, header: false}
243245
},
246+
pipsFormatter: () => {},
244247
tooltips: true
245248
};
246249

@@ -289,6 +292,7 @@ describe('rangeSlider()', () => {
289292
transformData: undefined,
290293
useCustomCompileOptions: {footer: false, header: false}
291294
},
295+
pipsFormatter: () => {},
292296
tooltips: true
293297
};
294298

@@ -339,6 +343,7 @@ describe('rangeSlider()', () => {
339343
transformData: undefined,
340344
useCustomCompileOptions: {footer: false, header: false}
341345
},
346+
pipsFormatter: () => {},
342347
tooltips: true
343348
};
344349

src/widgets/range-slider/range-slider.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import autoHideContainerHOC from '../../decorators/autoHideContainer.js';
1010
import headerFooterHOC from '../../decorators/headerFooter.js';
1111
import cx from 'classnames';
1212
import SliderComponent from '../../components/Slider/Slider.js';
13+
import isInteger from 'is-integer';
1314

1415
const bem = bemHelper('ais-range-slider');
1516
const defaultTemplates = {
@@ -161,6 +162,10 @@ function rangeSlider({
161162
max: null
162163
};
163164

165+
const pipsFormatter = isInteger(step) ?
166+
v => Math.round(Number(v)).toLocaleString() :
167+
v => Number(v).toLocaleString();
168+
164169
if (userMin !== undefined) stats.min = userMin;
165170
if (userMax !== undefined) stats.max = userMax;
166171

@@ -182,6 +187,7 @@ function rangeSlider({
182187
step={step}
183188
templateProps={this._templateProps}
184189
tooltips={tooltips}
190+
pipsFormatter={pipsFormatter}
185191
/>,
186192
containerNode
187193
);

0 commit comments

Comments
 (0)