react-toolbox
Version:
A set of complementary tools to ReactJS.
380 lines (328 loc) • 13.2 kB
JavaScript
'use strict';
var _reactTransformHmr2 = require('react-transform-hmr');
var _reactTransformHmr3 = _interopRequireDefault(_reactTransformHmr2);
var _react = require('react');
var _reactTransformCatchErrors2 = require('react-transform-catch-errors');
var _reactTransformCatchErrors3 = _interopRequireDefault(_reactTransformCatchErrors2);
var _redboxReact = require('redbox-react');
Object.defineProperty(exports, '__esModule', {
value: true
});
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _react2 = _interopRequireDefault(_react);
var _reactDom = require('react-dom');
var _reactDom2 = _interopRequireDefault(_reactDom);
var _style = require('./style');
var _style2 = _interopRequireDefault(_style);
var _utils = require('../utils');
var _utils2 = _interopRequireDefault(_utils);
var _progress_bar = require('../progress_bar');
var _progress_bar2 = _interopRequireDefault(_progress_bar);
var _input = require('../input');
var _input2 = _interopRequireDefault(_input);
var _components = {
_$Slider: {
displayName: 'Slider'
}
};
var _reactComponentWrapper = (0, _reactTransformHmr3['default'])({
filename: 'components/slider/index.jsx',
components: _components,
locals: [module],
imports: [_react]
});
var _reactComponentWrapper2 = (0, _reactTransformCatchErrors3['default'])({
filename: 'components/slider/index.jsx',
components: _components,
locals: [],
imports: [_react, _redboxReact]
});
function _wrapComponent(uniqueId) {
return function (ReactClass) {
return _reactComponentWrapper2(_reactComponentWrapper(ReactClass, uniqueId), uniqueId);
};
}
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var Slider = (function (_React$Component) {
_inherits(Slider, _React$Component);
function Slider() {
var _this = this;
_classCallCheck(this, _Slider);
_get(Object.getPrototypeOf(_Slider.prototype), 'constructor', this).apply(this, arguments);
this.state = {
sliderStart: 0,
sliderLength: 0,
value: this.props.value
};
this.handleResize = function (event, callback) {
var _ReactDOM$findDOMNode$getBoundingClientRect = _reactDom2['default'].findDOMNode(_this.refs.progressbar).getBoundingClientRect();
var left = _ReactDOM$findDOMNode$getBoundingClientRect.left;
var right = _ReactDOM$findDOMNode$getBoundingClientRect.right;
var cb = callback || function () {};
_this.setState({ sliderStart: left, sliderLength: right - left }, cb);
};
this.handleSliderFocus = function () {
_utils2['default'].events.addEventsToDocument(_this.getKeyboardEvents());
};
this.handleSliderBlur = function () {
_utils2['default'].events.removeEventsFromDocument(_this.getKeyboardEvents());
};
this.handleInputBlur = function () {
_this.setState({ value: _this.trimValue(_this.refs.input.getValue()) });
};
this.handleKeyDown = function (event) {
if ([13, 27].indexOf(event.keyCode) !== -1) {
_this.refs.input.blur();
_reactDom2['default'].findDOMNode(_this).blur();
}
if (event.keyCode === 38) _this.addToValue(_this.props.step);
if (event.keyCode === 40) _this.addToValue(-_this.props.step);
};
this.handleMouseDown = function (event) {
_utils2['default'].events.addEventsToDocument(_this.getMouseEventMap());
_this.start(_utils2['default'].events.getMousePosition(event));
_utils2['default'].events.pauseEvent(event);
};
this.handleTouchStart = function (event) {
_this.start(_utils2['default'].events.getTouchPosition(event));
_utils2['default'].events.addEventsToDocument(_this.getTouchEventMap());
_utils2['default'].events.pauseEvent(event);
};
this.handleMouseMove = function (event) {
_utils2['default'].events.pauseEvent(event);
_this.move(_utils2['default'].events.getMousePosition(event));
};
this.handleTouchMove = function (event) {
_this.move(_utils2['default'].events.getTouchPosition(event));
};
this.handleMouseUp = function () {
_this.end(_this.getMouseEventMap());
};
this.handleTouchEnd = function () {
_this.end(_this.getTouchEventMap());
};
}
_createClass(Slider, [{
key: 'componentDidMount',
value: function componentDidMount() {
window.addEventListener('resize', this.handleResize);
this.handleResize();
}
}, {
key: 'componentWillUnmount',
value: function componentWillUnmount() {
window.removeEventListener('resize', this.handleResize);
}
}, {
key: 'componentDidUpdate',
value: function componentDidUpdate(prevProps, prevState) {
if (prevState.value !== this.state.value) {
if (this.props.onChange) this.props.onChange(this);
if (this.refs.input) this.refs.input.setValue(this.valueForInput(this.state.value));
}
}
}, {
key: 'getMouseEventMap',
value: function getMouseEventMap() {
return {
mousemove: this.handleMouseMove,
mouseup: this.handleMouseUp
};
}
}, {
key: 'getTouchEventMap',
value: function getTouchEventMap() {
return {
touchmove: this.handleTouchMove,
touchend: this.handleTouchEnd
};
}
}, {
key: 'getKeyboardEvents',
value: function getKeyboardEvents() {
return {
keydown: this.handleKeyDown
};
}
}, {
key: 'start',
value: function start(position) {
var _this2 = this;
this.handleResize(null, function () {
_this2.setState({ pressed: true, value: _this2.positionToValue(position) });
});
}
}, {
key: 'move',
value: function move(position) {
this.setState({ value: this.positionToValue(position) });
}
}, {
key: 'end',
value: function end(revents) {
_utils2['default'].events.removeEventsFromDocument(revents);
this.setState({ pressed: false });
}
}, {
key: 'positionToValue',
value: function positionToValue(position) {
var _state = this.state;
var start = _state.sliderStart;
var length = _state.sliderLength;
var _props = this.props;
var max = _props.max;
var min = _props.min;
return this.trimValue((position.x - start) / length * (max - min) + min);
}
}, {
key: 'trimValue',
value: function trimValue(value) {
if (value < this.props.min) return this.props.min;
if (value > this.props.max) return this.props.max;
return _utils2['default'].round(value, this.stepDecimals());
}
}, {
key: 'stepDecimals',
value: function stepDecimals() {
return (this.props.step.toString().split('.')[1] || []).length;
}
}, {
key: 'addToValue',
value: function addToValue(value) {
this.setState({ value: this.trimValue(this.state.value + value) });
}
}, {
key: 'valueForInput',
value: function valueForInput(value) {
var decimals = this.stepDecimals();
return decimals > 0 ? value.toFixed(decimals) : value.toString();
}
}, {
key: 'knobOffset',
value: function knobOffset() {
var _props2 = this.props;
var max = _props2.max;
var min = _props2.min;
return this.state.sliderLength * (this.state.value - min) / (max - min);
}
}, {
key: 'renderSnaps',
value: function renderSnaps() {
if (this.props.snaps) {
return _react2['default'].createElement(
'div',
{ ref: 'snaps', className: _style2['default'].snaps },
_utils2['default'].range(0, (this.props.max - this.props.min) / this.props.step).map(function (i) {
return _react2['default'].createElement('div', { key: 'span-' + i, className: _style2['default'].snap });
})
);
}
}
}, {
key: 'renderInput',
value: function renderInput() {
if (this.props.editable) {
return _react2['default'].createElement(_input2['default'], {
ref: 'input',
className: _style2['default'].input,
onBlur: this.handleInputBlur,
value: this.valueForInput(this.state.value) });
}
}
}, {
key: 'render',
value: function render() {
var knobStyles = _utils2['default'].prefixer({ transform: 'translateX(' + this.knobOffset() + 'px)' });
var className = this.props.className;
if (this.props.editable) className += ' ' + _style2['default'].editable;
if (this.props.pinned) className += ' ' + _style2['default'].pinned;
if (this.state.pressed) className += ' ' + _style2['default'].pressed;
if (this.state.value === this.props.min) className += ' ' + _style2['default'].ring;
return _react2['default'].createElement(
'div',
{
'data-react-toolbox': 'slider',
className: _style2['default'].root + className,
tabIndex: '0',
onFocus: this.handleSliderFocus,
onBlur: this.handleSliderBlur },
_react2['default'].createElement(
'div',
{
ref: 'slider',
className: _style2['default'].container,
onTouchStart: this.handleTouchStart,
onMouseDown: this.handleMouseDown },
_react2['default'].createElement(
'div',
{
ref: 'knob',
className: _style2['default'].knob,
style: knobStyles,
onMouseDown: this.handleMouseDown,
onTouchStart: this.handleTouchStart },
_react2['default'].createElement('div', { className: _style2['default'].innerknob, 'data-value': parseInt(this.state.value) })
),
_react2['default'].createElement(
'div',
{ className: _style2['default'].progress },
_react2['default'].createElement(_progress_bar2['default'], {
ref: 'progressbar',
mode: 'determinate',
className: _style2['default'].innerprogress,
value: this.state.value,
max: this.props.max,
min: this.props.min }),
this.renderSnaps()
)
),
this.renderInput()
);
}
}, {
key: 'getValue',
value: function getValue() {
return this.state.value;
}
}, {
key: 'setValue',
value: function setValue(value) {
this.setState({ value: value });
}
}], [{
key: 'propTypes',
value: {
className: _react2['default'].PropTypes.string,
editable: _react2['default'].PropTypes.bool,
max: _react2['default'].PropTypes.number,
min: _react2['default'].PropTypes.number,
onChange: _react2['default'].PropTypes.func,
pinned: _react2['default'].PropTypes.bool,
snaps: _react2['default'].PropTypes.bool,
step: _react2['default'].PropTypes.number,
value: _react2['default'].PropTypes.number
},
enumerable: true
}, {
key: 'defaultProps',
value: {
className: '',
editable: false,
max: 100,
min: 0,
pinned: false,
snaps: false,
step: 0.01,
value: 0
},
enumerable: true
}]);
var _Slider = Slider;
Slider = _wrapComponent('_$Slider')(Slider) || Slider;
return Slider;
})(_react2['default'].Component);
exports['default'] = Slider;
module.exports = exports['default'];