bridebook-ui-library
Version:
Bridebook UI Library
496 lines (427 loc) • 16.3 kB
JavaScript
'use strict';
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 _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _rcUtil = require('rc-util');
var _track = require('./track.react');
var _track2 = _interopRequireDefault(_track);
var _handle = require('./handle.react');
var _handle2 = _interopRequireDefault(_handle);
var _dots = require('./dots.react');
var _dots2 = _interopRequireDefault(_dots);
var _marks = require('./marks.react');
var _marks2 = _interopRequireDefault(_marks);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
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; }
function noop() {}
function isNotTouchEvent(e) {
return e.touches.length > 1 || e.type.toLowerCase() === 'touchend' && e.touches.length > 0;
}
function getTouchPosition(e) {
return e.touches[0].pageX;
}
function getMousePosition(e) {
return e.pageX;
}
function pauseEvent(e) {
e.stopPropagation();
e.preventDefault();
}
var Slider = function (_React$Component) {
_inherits(Slider, _React$Component);
function Slider(props) {
_classCallCheck(this, Slider);
var _this = _possibleConstructorReturn(this, (Slider.__proto__ || Object.getPrototypeOf(Slider)).call(this, props));
var range = props.range,
min = props.min,
max = props.max;
var initialValue = range ? [min, min] : min;
var defaultValue = 'defaultValue' in props ? props.defaultValue : initialValue;
var value = 'value' in props ? props.value : defaultValue;
var upperBound = void 0;
var lowerBound = void 0;
if (props.range) {
lowerBound = _this.trimAlignValue(value[0]);
upperBound = _this.trimAlignValue(value[1]);
} else {
upperBound = _this.trimAlignValue(value);
}
var recent = void 0;
if (props.range && upperBound === lowerBound) {
if (lowerBound === max) {
recent = 'lowerBound';
}
if (upperBound === min) {
recent = 'upperBound';
}
} else {
recent = 'upperBound';
}
_this.state = {
handle: null,
recent: recent,
upperBound: upperBound,
// If Slider is not range, set `lowerBound` equal to `min`.
lowerBound: lowerBound || min
};
return _this;
}
_createClass(Slider, [{
key: 'componentWillReceiveProps',
value: function componentWillReceiveProps(nextProps) {
if (nextProps.range) {
var value = nextProps.value;
if (value) {
this.setState({
upperBound: value[1],
lowerBound: value[0]
});
}
} else if ('value' in nextProps) {
this.setState({
upperBound: nextProps.value
});
}
}
}, {
key: 'onChange',
value: function onChange(handle, value) {
var props = this.props;
var isNotControlled = !('value' in props);
if (isNotControlled) {
this.setState(_defineProperty({}, handle, value));
}
var state = this.state;
var data = {
upperBound: state.upperBound,
lowerBound: state.lowerBound
};
data[handle] = value;
var changedValue = props.range ? [data.lowerBound, data.upperBound] : data.upperBound;
props.onChange(changedValue);
}
}, {
key: 'onMouseMove',
value: function onMouseMove(e) {
var position = getMousePosition(e);
this.onMove(e, position);
}
}, {
key: 'onTouchMove',
value: function onTouchMove(e) {
if (isNotTouchEvent(e)) {
this.end('touch');
return;
}
var position = getTouchPosition(e);
this.onMove(e, position);
}
}, {
key: 'onMove',
value: function onMove(e, position) {
pauseEvent(e);
var props = this.props;
var state = this.state;
var diffPosition = position - this.startPosition;
var diffValue = diffPosition / this.getSliderLength() * (props.max - props.min);
var value = this.trimAlignValue(this.startValue + diffValue);
var oldValue = state[state.handle];
if (value === oldValue) return;
this.onChange(state.handle, value);
}
}, {
key: 'onTouchStart',
value: function onTouchStart(e) {
if (isNotTouchEvent(e)) return;
var position = getTouchPosition(e);
this.onStart(position);
this.addDocumentEvents('touch');
pauseEvent(e);
}
}, {
key: 'onMouseDown',
value: function onMouseDown(e) {
var position = getMousePosition(e);
this.onStart(position);
this.addDocumentEvents('mouse');
pauseEvent(e);
}
}, {
key: 'onStart',
value: function onStart(position) {
var props = this.props;
props.onBeforeChange(this.getValue());
var value = this.calcValueByPos(position);
this.startValue = value;
this.startPosition = position;
var state = this.state;
var upperBound = state.upperBound,
lowerBound = state.lowerBound;
var valueNeedChanging = 'upperBound';
if (this.props.range) {
var isLowerBoundCloser = Math.abs(upperBound - value) > Math.abs(lowerBound - value);
if (isLowerBoundCloser) {
valueNeedChanging = 'lowerBound';
}
var isAtTheSamePoint = upperBound === lowerBound;
if (isAtTheSamePoint) {
valueNeedChanging = state.recent;
}
if (isAtTheSamePoint && value !== upperBound) {
valueNeedChanging = value < upperBound ? 'lowerBound' : 'upperBound';
}
}
this.setState({
handle: valueNeedChanging,
recent: valueNeedChanging
});
var oldValue = state[valueNeedChanging];
if (value === oldValue) return;
this.onChange(valueNeedChanging, value);
}
}, {
key: 'getValue',
value: function getValue() {
var _state = this.state,
lowerBound = _state.lowerBound,
upperBound = _state.upperBound;
return this.props.range ? [lowerBound, upperBound] : upperBound;
}
}, {
key: 'getSliderLength',
value: function getSliderLength() {
var slider = this.refs.slider;
if (!slider) {
return 0;
}
return slider.getDOMNode().clientWidth;
}
}, {
key: 'getSliderStart',
value: function getSliderStart() {
var slider = this.refs.slider.getDOMNode();
var rect = slider.getBoundingClientRect();
return rect.left;
}
}, {
key: 'getPrecision',
value: function getPrecision() {
var props = this.props;
var stepString = props.step.toString();
var precision = 0;
if (stepString.indexOf('.') >= 0) {
precision = stepString.length - stepString.indexOf('.') - 1;
}
return precision;
}
}, {
key: 'trimAlignValue',
value: function trimAlignValue(v) {
var state = this.state || {};
var handle = state.handle,
lowerBound = state.lowerBound,
upperBound = state.upperBound;
var _props = this.props,
marks = _props.marks,
step = _props.step,
min = _props.min,
max = _props.max;
var val = v;
if (val <= min) {
val = min;
}
if (val >= max) {
val = max;
}
if (handle === 'upperBound' && val <= lowerBound) {
val = lowerBound;
}
if (handle === 'lowerBound' && val >= upperBound) {
val = upperBound;
}
var points = Object.keys(marks).map(parseFloat);
if (step !== null) {
var closestStep = Math.round(val / step) * step;
points.push(closestStep);
}
var diffs = points.map(function (point) {
return Math.abs(val - point);
});
var closestPoint = points[diffs.indexOf(Math.min.apply(Math, diffs))];
return step !== null ? parseFloat(closestPoint.toFixed(this.getPrecision())) : closestPoint;
}
}, {
key: 'calcOffset',
value: function calcOffset(value) {
var _props2 = this.props,
min = _props2.min,
max = _props2.max;
var ratio = (value - min) / (max - min);
return ratio * 100;
}
}, {
key: 'calcValue',
value: function calcValue(offset) {
var _props3 = this.props,
min = _props3.min,
max = _props3.max;
var ratio = offset / this.getSliderLength();
return ratio * (max - min) + min;
}
}, {
key: 'calcValueByPos',
value: function calcValueByPos(position) {
var pixelOffset = position - this.getSliderStart();
var nextValue = this.trimAlignValue(this.calcValue(pixelOffset));
return nextValue;
}
}, {
key: 'addDocumentEvents',
value: function addDocumentEvents(type) {
if (type === 'touch') {
// just work for chrome iOS Safari and Android Browser
this.onTouchMoveListener = _rcUtil.Dom.addEventListener(document, 'touchmove', this.onTouchMove.bind(this));
this.onTouchUpListener = _rcUtil.Dom.addEventListener(document, 'touchend', this.end.bind(this, 'touch'));
} else if (type === 'mouse') {
this.onMouseMoveListener = _rcUtil.Dom.addEventListener(document, 'mousemove', this.onMouseMove.bind(this));
this.onMouseUpListener = _rcUtil.Dom.addEventListener(document, 'mouseup', this.end.bind(this, 'mouse'));
}
}
}, {
key: 'removeEvents',
value: function removeEvents(type) {
if (type === 'touch') {
this.onTouchMoveListener.remove();
this.onTouchUpListener.remove();
} else if (type === 'mouse') {
this.onMouseMoveListener.remove();
this.onMouseUpListener.remove();
}
}
}, {
key: 'end',
value: function end(type) {
this.removeEvents(type);
this.props.onAfterChange(this.getValue());
this.setState({ handle: null });
}
}, {
key: 'render',
value: function render() {
var _classSet;
var _state2 = this.state,
handle = _state2.handle,
upperBound = _state2.upperBound,
lowerBound = _state2.lowerBound;
var _props4 = this.props,
className = _props4.className,
prefixCls = _props4.prefixCls,
minLabel = _props4.minLabel,
maxLabel = _props4.maxLabel,
disabled = _props4.disabled,
dots = _props4.dots,
included = _props4.included,
range = _props4.range,
step = _props4.step,
marks = _props4.marks,
max = _props4.max,
min = _props4.min,
tipTransitionName = _props4.tipTransitionName,
tipFormatter = _props4.tipFormatter,
children = _props4.children;
var upperOffset = this.calcOffset(upperBound);
var lowerOffset = this.calcOffset(lowerBound);
var handleClassName = prefixCls + '-handle';
var isNoTip = step === null && !tipFormatter;
var upper = _react2.default.createElement(_handle2.default, { className: handleClassName,
noTip: isNoTip, tipTransitionName: tipTransitionName, tipFormatter: tipFormatter,
offset: upperOffset, value: upperBound, dragging: handle === 'upperBound' });
var lower = null;
if (range) {
lower = _react2.default.createElement(_handle2.default, { className: handleClassName,
noTip: isNoTip, tipTransitionName: tipTransitionName, tipFormatter: tipFormatter,
offset: lowerOffset, value: lowerBound, dragging: handle === 'lowerBound' });
}
var sliderClassName = (0, _rcUtil.classSet)((_classSet = {}, _defineProperty(_classSet, prefixCls, true), _defineProperty(_classSet, prefixCls + '-disabled', disabled), _defineProperty(_classSet, className, !!className), _classSet));
var isIncluded = included || range;
return _react2.default.createElement(
'div',
{ className: 'range-slider-wrap' },
_react2.default.createElement(
'span',
{ className: 'range-min' },
minLabel
),
_react2.default.createElement(
'div',
{ ref: 'slider', className: sliderClassName,
onTouchStart: disabled ? noop : this.onTouchStart.bind(this),
onMouseDown: disabled ? noop : this.onMouseDown.bind(this) },
upper,
lower,
_react2.default.createElement(_track2.default, { className: prefixCls + '-track', included: isIncluded,
offset: lowerOffset, length: upperOffset - lowerOffset }),
_react2.default.createElement(_dots2.default, { prefixCls: prefixCls, marks: marks, dots: dots, step: step,
included: isIncluded, lowerBound: lowerBound,
upperBound: upperBound, max: max, min: min }),
_react2.default.createElement(_marks2.default, { className: prefixCls + '-mark', marks: marks,
included: isIncluded, lowerBound: lowerBound,
upperBound: upperBound, max: max, min: min }),
children
),
_react2.default.createElement(
'span',
{ className: 'range-max' },
maxLabel
)
);
}
}]);
return Slider;
}(_react2.default.Component);
Slider.propTypes = {
min: _react2.default.PropTypes.number,
max: _react2.default.PropTypes.number,
minLabel: _react2.default.PropTypes.string,
maxLabel: _react2.default.PropTypes.string,
step: _react2.default.PropTypes.number,
defaultValue: _react2.default.PropTypes.oneOfType([_react2.default.PropTypes.number, _react2.default.PropTypes.arrayOf(_react2.default.PropTypes.number)]),
value: _react2.default.PropTypes.oneOfType([_react2.default.PropTypes.number, _react2.default.PropTypes.arrayOf(_react2.default.PropTypes.number)]),
marks: _react2.default.PropTypes.object,
included: _react2.default.PropTypes.bool,
className: _react2.default.PropTypes.string,
prefixCls: _react2.default.PropTypes.string,
disabled: _react2.default.PropTypes.bool,
children: _react2.default.PropTypes.any,
onBeforeChange: _react2.default.PropTypes.func,
onChange: _react2.default.PropTypes.func,
onAfterChange: _react2.default.PropTypes.func,
tipTransitionName: _react2.default.PropTypes.string,
tipFormatter: _react2.default.PropTypes.func,
dots: _react2.default.PropTypes.bool,
range: _react2.default.PropTypes.bool
};
Slider.defaultProps = {
prefixCls: 'rc-slider',
className: '',
tipTransitionName: '',
min: 0,
max: 100,
step: 1,
marks: {},
onBeforeChange: noop,
onChange: noop,
onAfterChange: noop,
included: true,
disabled: false,
dots: false,
range: false
};
exports.default = Slider;
//# sourceMappingURL=slider.react.js.map