UNPKG

@ucloud-pccl/react-components

Version:
623 lines (622 loc) 25.5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _newArrowCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/newArrowCheck")); var _isNaN2 = _interopRequireDefault(require("lodash/isNaN")); var _find2 = _interopRequireDefault(require("lodash/find")); var _isObject2 = _interopRequireDefault(require("lodash/isObject")); var _each2 = _interopRequireDefault(require("lodash/each")); var _keys2 = _interopRequireDefault(require("lodash/keys")); var _sortBy2 = _interopRequireDefault(require("lodash/sortBy")); var _isEmpty2 = _interopRequireDefault(require("lodash/isEmpty")); var _isEqual2 = _interopRequireDefault(require("lodash/isEqual")); var _isFunction2 = _interopRequireDefault(require("lodash/isFunction")); var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _rcSlider = _interopRequireDefault(require("rc-slider")); var _Tooltip = _interopRequireDefault(require("../../components/Tooltip")); var _NumberInput = _interopRequireDefault(require("../../components/NumberInput")); var _uncontrolled = _interopRequireDefault(require("../../decorators/uncontrolled")); var _localeConsumerDecorator = _interopRequireDefault(require("../../components/LocaleProvider/localeConsumerDecorator")); var _style = require("./style"); var _zh_CN = _interopRequireDefault(require("./locale/zh_CN")); var _excluded = ["value", "dragging", "index", "tipFormatter"], _excluded2 = ["value", "defaultValue", "onChange", "className", "style", "disabled", "min", "max", "step", "sliderClassName", "sliderStyle", "numberInput", "numberInputTipFormatter", "tipFormatter", "size", "marks", "isSensitive", "locale", "onLastChange"]; var _this = void 0, _dec, _dec2, _class, _Slider; function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } var Handle = _rcSlider.default.Handle; var Size = ['sm', 'md', 'lg']; var handle = function handle(props) { var _this2 = this; (0, _newArrowCheck2.default)(this, _this); var value = props.value, dragging = props.dragging, index = props.index, tipFormatter = props.tipFormatter, restProps = (0, _objectWithoutProperties2.default)(props, _excluded); return /*#__PURE__*/_react.default.createElement(_Tooltip.default, { popupClassName: "".concat(_style.prefixCls, "-tooltip"), popup: (0, _isFunction2.default)(tipFormatter) ? tipFormatter(value) : value == null ? '' : value, visible: dragging && tipFormatter !== null, placement: "top", key: index, theme: "dark", getPopupContainer: function (triggerNode) { (0, _newArrowCheck2.default)(this, _this2); return triggerNode; }.bind(this) }, /*#__PURE__*/_react.default.createElement(Handle, (0, _extends2.default)({ value: value }, restProps))); }.bind(void 0); handle.propTypes = { value: _propTypes.default.number, dragging: _propTypes.default.bool, index: _propTypes.default.number, tipFormatter: _propTypes.default.func }; var getPrecision = function getPrecision(n) { (0, _newArrowCheck2.default)(this, _this); var valueString = n.toString(); if (valueString.indexOf('e-') >= 0) { return parseInt(valueString.slice(valueString.indexOf('e-') + 2), 10); } var precision = 0; if (valueString.indexOf('.') >= 0) { precision = valueString.length - valueString.indexOf('.') - 1; } return precision; }.bind(void 0); var sliderSplit = 300; var Slider = (_dec = (0, _localeConsumerDecorator.default)({ defaultLocale: _zh_CN.default, localeName: 'Slider' }), _dec2 = (0, _uncontrolled.default)({}), _dec(_class = _dec2(_class = (_Slider = /*#__PURE__*/function (_Component) { function Slider(_props) { var _this4 = this; var _this3; (0, _classCallCheck2.default)(this, Slider); _this3 = _callSuper(this, Slider, [_props]); _this3.simpleClone = function () { var obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; return JSON.parse(JSON.stringify(obj)); }; _this3.resetCache = function () { (0, _newArrowCheck2.default)(this, _this4); _this3.cache = { valueToSliderValueMap: {}, sliderValueToValueMap: {}, numberInputValueToValueMap: {}, valueToValueStepMap: {} }; }.bind(this); _this3.computeMarks = function (_marks, props) { var _this5 = this; (0, _newArrowCheck2.default)(this, _this4); if ((0, _isEmpty2.default)(_marks)) { return null; } var min = props.min, max = props.max, step = props.step; var values = (0, _sortBy2.default)((0, _keys2.default)(_marks), function (v) { (0, _newArrowCheck2.default)(this, _this5); return +v; }.bind(this)); var l = values.length; var marks = []; var indexWithRatio = []; var indexWithoutRatio = []; var usedRatio = 0; var usedRange = 0; if (+values[l - 1] !== +max) { values.push(max); } (0, _each2.default)(values, function (v, i) { (0, _newArrowCheck2.default)(this, _this5); var info = _marks[v]; v = +v; if (!(0, _isObject2.default)(info)) { info = { label: info }; } else { info = _objectSpread({}, info); } var range = []; if (i === 0) { range[0] = min; } else { range[0] = +values[i - 1]; } range[1] = v; info.range = range; info.value = v; marks.push(info); if (info.ratio) { indexWithRatio.push(i); usedRatio += info.ratio; usedRange += range[1] - range[0]; } else { indexWithoutRatio.push(i); } if (!('step' in info)) { info.step = step; } }.bind(this)); var remainRange = max - min - usedRange; (0, _each2.default)(indexWithoutRatio, function (i) { (0, _newArrowCheck2.default)(this, _this5); var info = marks[i]; info.ratio = (info.range[1] - info.range[0]) / remainRange * (100 - usedRatio); }.bind(this)); var ratioBefore = 0; (0, _each2.default)(marks, function (mark) { (0, _newArrowCheck2.default)(this, _this5); mark.ratioBefore = ratioBefore; ratioBefore += mark.ratio; }.bind(this)); return marks; }.bind(this); _this3.computeMarksForSlider = function (_marks, props) { var _this6 = this; (0, _newArrowCheck2.default)(this, _this4); if ((0, _isEmpty2.default)(_marks)) { return null; } var max = props.max; var marks = {}; var baseRatio = 0; (0, _each2.default)(_marks, function (_mark) { (0, _newArrowCheck2.default)(this, _this6); if (_mark.label == null) { return; } var value = (baseRatio += _mark.ratio) / 100 * sliderSplit; var mark = { label: _mark.label, style: _objectSpread(_objectSpread({ transform: 'none' }, _mark.value == max ? { borderRight: 'none' } : {}), _mark.style) }; marks[value] = mark; }.bind(this)); return marks; }.bind(this); _this3.handleChange = function (v, latest) { (0, _newArrowCheck2.default)(this, _this4); var _this3$props = _this3.props, onChange = _this3$props.onChange, onLastChange = _this3$props.onLastChange, value = _this3$props.value; if (v + '' !== value + '') { onChange(v); } if (latest) { onLastChange(v); } }.bind(this); _this3.onNumberInputNumberChange = function (v) { (0, _newArrowCheck2.default)(this, _this4); _this3.handleChange(v, true); }.bind(this); _this3.onNumberInputChange = function (v) { (0, _newArrowCheck2.default)(this, _this4); var isSensitive = _this3.props.isSensitive; if (isSensitive) { var validValue = _this3.translateNumberInputValueToValue(v); if (validValue + '' === v + '') { _this3.handleChange(v); } } _this3.setState({ numberInputValue: v }); }.bind(this); _this3.onNumberInputFocus = function () { (0, _newArrowCheck2.default)(this, _this4); _this3.setState({ numberInputValue: _this3.props.value, isNumberInputFocused: true }); }.bind(this); _this3.onNumberInputBlur = function () { (0, _newArrowCheck2.default)(this, _this4); _this3.setState({ isNumberInputFocused: false }); }.bind(this); _this3.onSliderChange = function (v, latest) { (0, _newArrowCheck2.default)(this, _this4); var value = _this3.translateSliderValueToValue(v); _this3.handleChange(value, latest); }.bind(this); _this3.translateSliderValueToValue = function (v) { var _this7 = this; (0, _newArrowCheck2.default)(this, _this4); if (v in _this3.cache.sliderValueToValueMap) { return _this3.cache.sliderValueToValueMap[v]; } var marks = _this3.state.marks; var _this3$props2 = _this3.props, min = _this3$props2.min, max = _this3$props2.max, step = _this3$props2.step; var value; if ((0, _isEmpty2.default)(marks)) { value = _this3.computeValidNumber(min + (max - min) * v / sliderSplit, { step: step, min: min, max: max }); } else if (v == sliderSplit) { value = max; } else { var vRatio = v / sliderSplit * 100; var mark = (0, _find2.default)(marks, function (mark) { (0, _newArrowCheck2.default)(this, _this7); var ratioBefore = mark.ratioBefore, ratio = mark.ratio; if (vRatio >= ratioBefore && vRatio < ratioBefore + ratio) { return true; } }.bind(this)); if (!mark) mark = marks[0]; var _mark2 = mark, ratioBefore = _mark2.ratioBefore, range = _mark2.range, ratio = _mark2.ratio, _step = _mark2.step; value = _this3.computeValidNumber((vRatio - ratioBefore) / ratio * (range[1] - range[0]) + range[0], { min: range[0], max: range[1], step: _step }); } _this3.cache.sliderValueToValueMap[v] = value; return value; }.bind(this); _this3.translateValueToSliderValue = function (v) { var _this8 = this; (0, _newArrowCheck2.default)(this, _this4); if (v in _this3.cache.valueToSliderValueMap) { return _this3.cache.valueToSliderValueMap[v]; } var marks = _this3.state.marks; var _this3$props3 = _this3.props, min = _this3$props3.min, max = _this3$props3.max; var value; if (v == undefined) { value = 0; } else if ((0, _isEmpty2.default)(marks)) { value = (v - min) / (max - min) * sliderSplit; } else if (v == max) { value = sliderSplit; } else { var mark = (0, _find2.default)(marks, function (mark) { (0, _newArrowCheck2.default)(this, _this8); var range = mark.range; if (v >= range[0] && v < range[1]) { return true; } }.bind(this)); if (!mark) mark = marks[0]; var _mark3 = mark, range = _mark3.range, ratio = _mark3.ratio, ratioBefore = _mark3.ratioBefore; value = ((v - range[0]) / (range[1] - range[0]) * ratio + ratioBefore) / 100 * sliderSplit; } _this3.cache.valueToSliderValueMap[v] = value; return value; }.bind(this); _this3.translateNumberInputValueToValue = function (v) { (0, _newArrowCheck2.default)(this, _this4); if (v in _this3.cache.numberInputValueToValueMap) { return _this3.cache.numberInputValueToValueMap[v]; } var marks = _this3.state.marks; var _this3$props4 = _this3.props, min = _this3$props4.min, max = _this3$props4.max, step = _this3$props4.step; if (isNaN(v) || v + '' !== +v + '') { return min; } var value; if ((0, _isEmpty2.default)(marks)) { value = _this3.computeValidNumber(v, { step: step, min: min, max: max }); } else if (v === max) { value = max; } else { var mark = marks[0]; for (var i in marks) { i = +i; var _mark = marks[i]; var _range = _mark.range; if (v >= _range[0] && v < _range[1]) { mark = _mark; } } var _mark4 = mark, range = _mark4.range, _step2 = _mark4.step; value = _this3.computeValidNumber(v, { min: range[0], max: range[1], step: _step2 }); } _this3.cache.numberInputValueToValueMap[v] = value; return value; }.bind(this); _this3.getValueStep = function (v) { (0, _newArrowCheck2.default)(this, _this4); if (v in _this3.cache.valueToValueStepMap) { return _this3.cache.valueToValueStepMap[v]; } var marks = _this3.state.marks; var step = _this3.props.step; var valueStep = { step: step }; if (!(0, _isEmpty2.default)(marks)) { var l = marks.length; for (var i in marks) { i = +i; var mark = marks[i]; var range = mark.range, markStep = mark.step; if (+v === +range[0]) { valueStep = { upStep: markStep, downStep: i > 0 ? marks[i - 1].step : step }; break; } else if (v > range[0] && v < range[1]) { valueStep = { upStep: markStep, downStep: markStep }; break; } else if (+v === +range[1]) { valueStep = { upStep: i < l - 1 ? marks[i + 1].step : step, downStep: markStep }; break; } } } _this3.cache.valueToValueStepMap[v] = valueStep; return valueStep; }.bind(this); _this3.computeValidNumber = function (number, options) { (0, _newArrowCheck2.default)(this, _this4); var _ref = options || _this3.props, step = _ref.step, min = _ref.min, max = _ref.max; if (number < min) { return min; } if (number > max) { return max; } var stepPrecision = getPrecision(step); var maxPrecision = getPrecision(max); var minPrecision = getPrecision(min); var precision = Math.max(stepPrecision, maxPrecision, minPrecision); number = +(((number - min) / step).toFixed(0) * step + min).toFixed(precision); if (number < min) { return min; } if (number > max) { return max; } return (0, _isNaN2.default)(number) ? 0 : number; }.bind(this); _this3.state = {}; _this3.state.cacheMarks = _this3.simpleClone(_props.marks); _this3.state.marks = _this3.computeMarks(_props.marks, _props); _this3.state.marksForSlider = _this3.computeMarksForSlider(_this3.state.marks, _props); _this3.resetCache(); return _this3; } (0, _inherits2.default)(Slider, _Component); return (0, _createClass2.default)(Slider, [{ key: "componentWillReceiveProps", value: function componentWillReceiveProps(nextProps) { if (!(nextProps.marks == this.state.cacheMarks || (0, _isEqual2.default)(nextProps.marks, this.state.cacheMarks)) || nextProps.max !== this.props.max || nextProps.min !== this.props.min || nextProps.step !== this.props.step) { var marks = this.computeMarks(nextProps.marks, nextProps); this.setState({ cacheMarks: this.simpleClone(nextProps.marks), marks: marks, marksForSlider: this.computeMarksForSlider(marks, nextProps) }); this.resetCache(); } } }, { key: "render", value: function render() { var _this9 = this; /* eslint-disable no-unused-vars */ var _this$props = this.props, value = _this$props.value, defaultValue = _this$props.defaultValue, onChange = _this$props.onChange, className = _this$props.className, style = _this$props.style, disabled = _this$props.disabled, min = _this$props.min, max = _this$props.max, step = _this$props.step, sliderClassName = _this$props.sliderClassName, sliderStyle = _this$props.sliderStyle, _inputProps = _this$props.numberInput, numberInputTipFormatter = _this$props.numberInputTipFormatter, tipFormatter = _this$props.tipFormatter, size = _this$props.size, _marks = _this$props.marks, isSensitive = _this$props.isSensitive, locale = _this$props.locale, onLastChange = _this$props.onLastChange, rest = (0, _objectWithoutProperties2.default)(_this$props, _excluded2); /* eslint-enable no-unused-vars */ var _this$state = this.state, marksForSlider = _this$state.marksForSlider, isNumberInputFocused = _this$state.isNumberInputFocused, numberInputValue = _this$state.numberInputValue; var sharingProps = { disabled: disabled }; var sliderProps = _objectSpread(_objectSpread({}, rest), {}, { className: sliderClassName, style: sliderStyle, onChange: this.onSliderChange, onAfterChange: function onAfterChange() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } return _this9.onSliderChange.apply(_this9, args.concat([true])); } }); var inputProps = _objectSpread(_objectSpread(_objectSpread({}, _inputProps), {}, { min: min, max: max, size: size, value: isNumberInputFocused ? numberInputValue : value }, this.getValueStep(value)), {}, { onChange: this.onNumberInputChange, onNumberChange: this.onNumberInputNumberChange, onFocus: this.onNumberInputFocus, onBlur: this.onNumberInputBlur, computeValidNumber: this.translateNumberInputValueToValue }); var isNumberInputValid = numberInputValue + '' === value + ''; return /*#__PURE__*/_react.default.createElement(_style.SliderWrap, { disabled: disabled, style: style, className: className, size: size }, /*#__PURE__*/_react.default.createElement(_style.RcSliderWrap, null, /*#__PURE__*/_react.default.createElement(_rcSlider.default, (0, _extends2.default)({ min: 0, max: sliderSplit, step: 1, value: this.translateValueToSliderValue(value), prefixCls: _style.prefixCls, handle: function (handleProps) { (0, _newArrowCheck2.default)(this, _this9); return handle(_objectSpread(_objectSpread({}, handleProps), {}, { value: value, tipFormatter: tipFormatter })); }.bind(this), marks: marksForSlider || {} }, sliderProps, sharingProps))), _inputProps === null ? null : /*#__PURE__*/_react.default.createElement(_Tooltip.default, { popupClassName: "".concat(_style.prefixCls, "-tooltip"), popup: (0, _isFunction2.default)(numberInputTipFormatter) ? numberInputTipFormatter({ currentValue: value, inputValue: numberInputValue, isSensitive: isSensitive, locale: locale }) : "".concat(locale.currentValueIs).concat(value).concat(locale.comma).concat(locale.inputValueIs).concat(numberInputValue) + (isSensitive ? "".concat(locale.comma).concat(locale.input).concat(isNumberInputValid ? locale.isValid : locale.isInvalid).concat(isNumberInputValid ? '' : "".concat(locale.comma).concat(locale.tip)) : ''), visible: isNumberInputFocused && numberInputTipFormatter !== null, placement: "top", theme: "dark", getPopupContainer: function (triggerNode) { (0, _newArrowCheck2.default)(this, _this9); return triggerNode.parentNode; }.bind(this) }, /*#__PURE__*/_react.default.createElement(_NumberInput.default, (0, _extends2.default)({}, inputProps, sharingProps)))); } }]); }(_react.Component), _Slider.propTypes = { /** 值,受控 */ value: _propTypes.default.number, /** 默认值,非受控 */ defaultValue: _propTypes.default.number, /** 修改回调 */ onChange: _propTypes.default.func, /** 拖拽结束、输入回车、输入失焦、数字输入框上下按钮等时触发 */ onLastChange: _propTypes.default.func, /** 是否禁用 */ disabled: _propTypes.default.bool, /** 最小值 */ min: _propTypes.default.number, /** 最大值 */ max: _propTypes.default.number, /** 每次变动的大小,传入的(最大值-最小值)必须为step的整数倍,大于0 */ step: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]), /** 标记 */ marks: _propTypes.default.object, /** @ignore */ className: _propTypes.default.string, /** @ignore */ style: _propTypes.default.object, /** slider 类名 */ sliderClassName: _propTypes.default.string, /** slider 样式 */ sliderStyle: _propTypes.default.object, /** number input 的自定义 props,为null时隐藏 */ numberInput: _propTypes.default.object, /** 是否灵敏的触发onChange,为true时当NumberInput中实时输入有效值时会触发onChange */ isSensitive: _propTypes.default.bool, /** * 输入框提示语格式化,传入null隐藏 * @param option - 包含当前值、生效值等 */ numberInputTipFormatter: _propTypes.default.func, /** * 提示语格式化,传入null隐藏 * @param value - 当前值 */ tipFormatter: _propTypes.default.func, /** 尺寸 */ size: _propTypes.default.oneOf(Size), /** @ignore */ locale: _propTypes.default.object }, _Slider.defaultProps = { onChange: function onChange() { (0, _newArrowCheck2.default)(this, _this); }.bind(void 0), onLastChange: function onLastChange() { (0, _newArrowCheck2.default)(this, _this); }.bind(void 0), defaultValue: 0, step: 1, size: 'md', min: 0, max: 100 }, _Slider)) || _class) || _class); Slider.Size = Size; var _default = exports.default = Slider;