From cf6cf8d1a177bccb1713e16ad1e16ac9ebb4c496 Mon Sep 17 00:00:00 2001 From: Charles Renwick Date: Tue, 16 Jun 2015 04:07:39 -0400 Subject: [PATCH] [Slider] Take and use step props Sliders can take the prop step, which effects the granularity of the slider input. Commit includes the upgraded component and updated docs. --- .../components/pages/components/sliders.jsx | 14 +++++-- src/slider.jsx | 42 ++++++++++++++++++- 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/docs/src/app/components/pages/components/sliders.jsx b/docs/src/app/components/pages/components/sliders.jsx index f135d233eb047f..a81eee3117208c 100644 --- a/docs/src/app/components/pages/components/sliders.jsx +++ b/docs/src/app/components/pages/components/sliders.jsx @@ -15,7 +15,7 @@ class SlidersPage extends React.Component { '// Default\n' + '\n\n' + '// With starting value\n' + - '\n' + + '\n' + '\n\n' + '// Disabled with fixed value\n' + '\n' + @@ -40,6 +40,12 @@ class SlidersPage extends React.Component { desc: 'The minimum value the slider can slide to on a scale from ' + '0 to 1 inclusive.' }, + { + name: 'step', + type: 'number', + header: 'default: 0.01', + desc: 'The granularity the slider can step through values.' + }, { name: 'style', type: 'object', @@ -57,7 +63,7 @@ class SlidersPage extends React.Component { header: 'optional', desc: 'Callback function that is fired when the user changes the ' + 'slider\'s value.' - } + } ] }, ]; @@ -68,8 +74,8 @@ class SlidersPage extends React.Component { code={code} componentInfo={componentInfo}> - - + + diff --git a/src/slider.jsx b/src/slider.jsx index e746923a836509..0f82d0a58296c1 100644 --- a/src/slider.jsx +++ b/src/slider.jsx @@ -33,6 +33,7 @@ var Slider = React.createClass({ required: true, disabled: false, defaultValue: 0, + step: 0.01, min: 0, max: 1, dragging: false @@ -244,6 +245,7 @@ var Slider = React.createClass({ = step) { + alignValue += (valModStep > 0) ? step : (-step); + } + + return parseFloat(alignValue.toFixed(5)); + }, + + _constrain: function () { + var { min, max, step } = this.props; + return (pos) => { + var pixelMax = React.findDOMNode(this.refs.track).clientWidth; + var pixelStep = pixelMax / ((max - min) / step); + + var cursor = min; + var i; + for (i = 0; i < (max - min) / step; i++) { + var distance = (pos.left - cursor); + var nextDistance = (cursor + pixelStep) - pos.left + if (Math.abs(distance) > Math.abs(nextDistance)) { + cursor += pixelStep; + } else { + break; + } + } + return { + left: cursor + }; + }; + }, + _onFocus: function (e) { this.setState({focused: true}); if (this.props.onFocus) this.props.onFocus(e); @@ -349,7 +387,7 @@ var Slider = React.createClass({ _updateWithChangeEvent: function(e, percent) { if (this.state.percent === percent) return; this.setPercent(percent); - var value = this._percentToValue(percent); + var value = this._alignValue(this._percentToValue(percent)); if (this.props.onChange) this.props.onChange(e, value); },