UNPKG

uxcore-rate

Version:
240 lines (193 loc) 11.1 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _classnames4 = require('classnames'); var _classnames5 = _interopRequireDefault(_classnames4); var _uxcoreTooltip = require('uxcore-tooltip'); var _uxcoreTooltip2 = _interopRequireDefault(_uxcoreTooltip); var _uxcoreIcon = require('uxcore-icon'); var _uxcoreIcon2 = _interopRequireDefault(_uxcoreIcon); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _reactLifecyclesCompat = require('react-lifecycles-compat'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return 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) : _defaults(subClass, superClass); } /** * Rate Component for uxcore * @author quanyun.mqy * * Copyright 2014-2015, Uxcore Team, Alinw. * All rights reserved. */ var makeNewArray = function makeNewArray(len) { var arr = []; for (var i = 0; i < len; i++) { arr.push(1); } return arr; }; var Rate = function (_React$Component) { _inherits(Rate, _React$Component); Rate.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, prevState) { if (nextProps.value !== prevState.lastValue) { return { hover: nextProps.value, lastValue: nextProps.value }; } return null; }; function Rate(props) { _classCallCheck(this, Rate); var _this = _possibleConstructorReturn(this, _React$Component.call(this, props)); _this.state = { hover: props.value, lastValue: props.value }; _this.handleItemLeave = _this.handleItemLeave.bind(_this); return _this; } Rate.prototype.componentDidMount = function componentDidMount() { var _this2 = this; if (this.props.total !== 5) { setTimeout(function () { // iconfont 会在 didMount 之后才加载进来,因此这里做了一个延时 _this2.resizeAlwaysTip(); }, 100); } }; Rate.prototype.componentDidUpdate = function componentDidUpdate(prevProps) { if (prevProps.total !== this.props.total) { this.resizeAlwaysTip(); } }; Rate.prototype.resizeAlwaysTip = function resizeAlwaysTip() { if (this.alwaysTip) { var tipWidth = this.star0.offsetWidth * parseInt(this.props.total, 10); this.alwaysTip.style.width = tipWidth + 'px'; } }; Rate.prototype.handleItemHover = function handleItemHover(i) { if (this.props.disabled) { return; } this.setState({ hover: i }); }; Rate.prototype.handleItemLeave = function handleItemLeave() { if (this.props.disabled) { return; } this.setState({ hover: this.props.value }); }; Rate.prototype.handleItemClick = function handleItemClick(v) { if (this.props.disabled) { return; } this.props.onChange(v); }; // when tipShow === 'always', render the tip Rate.prototype.renderAlwaysTip = function renderAlwaysTip() { var _this3 = this; var t = this; return _react2["default"].createElement( 'div', { className: t.props.prefixCls + '-always-tip-container', ref: function ref(c) { _this3.alwaysTip = c; } }, t.state.hover === 0 ? t.props.placeholder : t.props.scoreTips[parseInt(t.state.hover, 10) - 1] ); }; Rate.prototype.render = function render() { var _classnames, _this4 = this; var t = this; var classes = (0, _classnames5["default"])(t.props.prefixCls, (_classnames = {}, _defineProperty(_classnames, t.props.className, !!t.props.className), _defineProperty(_classnames, 'disabled', !!t.props.disabled), _defineProperty(_classnames, t.props.prefixCls + '-' + t.props.size, true), _classnames)); return _react2["default"].createElement( 'div', { className: classes, onMouseLeave: this.handleItemLeave }, makeNewArray(t.props.total).map(function (v, k) { var isActive = t.props.activeAll ? k + 1 <= t.state.hover : k + 1 === t.state.hover; var icon = _react2["default"].createElement(_uxcoreIcon2["default"], { name: '' + (isActive ? 'caozuo-xingji-full' : 'caozuo-xingji-line'), className: (0, _classnames5["default"])(_defineProperty({}, t.props.prefixCls + '-icon-active', isActive)) }); if (t.props.icons[k]) { icon = _react2["default"].cloneElement(isActive && t.props.activeIcons[k] ? t.props.activeIcons[k] : t.props.icons[k], { className: (0, _classnames5["default"])(_defineProperty({}, t.props.prefixCls + '-icon-active', isActive)) }); } return _react2["default"].createElement( 'div', { className: (0, _classnames5["default"])(t.props.prefixCls + '-item', { active: k + 1 <= t.state.hover }), key: k + 1, ref: function ref(c) { _this4['star' + k] = c; }, onClick: function onClick() { t.handleItemClick(k + 1); }, onMouseEnter: function onMouseEnter() { t.handleItemHover(k + 1); } }, t.props.tipShow === 'hover' && t.props.scoreTips[k] ? _react2["default"].createElement( _uxcoreTooltip2["default"], { placement: 'top', trigger: 'hover', overlay: t.props.scoreTips[k] }, icon ) : icon ); }), t.props.tipShow === 'always' ? t.renderAlwaysTip() : '' ); }; return Rate; }(_react2["default"].Component); Rate.defaultProps = { prefixCls: 'kuma-rate', disabled: false, total: 5, value: 0, scoreTips: [], tipShow: 'hover', onChange: function onChange() {}, size: 'normal', icons: [], activeIcons: [], activeAll: true, placeholder: '点击星星进行评分' }; // http://facebook.github.io/react/docs/reusable-components.html Rate.propTypes = { size: _propTypes2["default"].string, prefixCls: _propTypes2["default"].string, className: _propTypes2["default"].string, disabled: _propTypes2["default"].bool, total: _propTypes2["default"].number, value: _propTypes2["default"].number.isRequired, scoreTips: _propTypes2["default"].arrayOf(_propTypes2["default"].string), tipShow: _propTypes2["default"].oneOf(['hover', 'always', false]), onChange: _propTypes2["default"].func.isRequired, icons: _propTypes2["default"].array, activeAll: _propTypes2["default"].bool, placeholder: _propTypes2["default"].string }; Rate.displayName = 'uxcore-rate'; (0, _reactLifecyclesCompat.polyfill)(Rate); exports["default"] = Rate; module.exports = exports['default'];