UNPKG

amis

Version:

一种MIS页面生成工具

177 lines (176 loc) 6.01 kB
"use strict"; /** * @file Rating * @description * @author fex */ Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var react_1 = tslib_1.__importDefault(require("react")); var classnames_1 = tslib_1.__importDefault(require("classnames")); var theme_1 = require("../theme"); var Rating = /** @class */ (function (_super) { tslib_1.__extends(Rating, _super); function Rating(props) { var _this = _super.call(this, props) || this; _this.state = { value: props.value || 0, stars: [], halfStar: { at: Math.floor(props.value), hidden: props.half && props.value % 1 < 0.5 } }; _this.getRate = _this.getRate.bind(_this); _this.getStars = _this.getStars.bind(_this); _this.moreThanHalf = _this.moreThanHalf.bind(_this); _this.mouseOver = _this.mouseOver.bind(_this); _this.mouseLeave = _this.mouseLeave.bind(_this); _this.handleClick = _this.handleClick.bind(_this); return _this; } Rating.prototype.componentDidMount = function () { var value = this.state.value; this.setState({ stars: this.getStars(value) }); }; Rating.prototype.componentWillReceiveProps = function (props) { this.setState({ stars: this.getStars(props.value), value: props.value, halfStar: { at: Math.floor(props.value), hidden: props.half && props.value % 1 < 0.5 } }); }; Rating.prototype.getRate = function () { var stars; var value = this.state.value; var half = this.props.half; if (half) { stars = Math.floor(value); } else { stars = Math.round(value); } return stars; }; Rating.prototype.getStars = function (activeCount) { if (typeof activeCount === 'undefined') { activeCount = this.getRate(); } var stars = []; var count = this.props.count; for (var i = 0; i < count; i++) { stars.push({ active: i <= activeCount - 1 }); } return stars; }; Rating.prototype.mouseOver = function (event) { var _a = this.props, readOnly = _a.readOnly, size = _a.size, half = _a.half; if (readOnly) return; var index = Number(event.target.getAttribute('data-index')); if (half) { var isAtHalf = this.moreThanHalf(event, size); if (isAtHalf) index = index + 1; this.setState({ halfStar: { at: index, hidden: isAtHalf } }); } else { index = index + 1; } this.setState({ stars: this.getStars(index) }); }; Rating.prototype.moreThanHalf = function (event, size) { var target = event.target; var mouseAt = event.clientX - target.getBoundingClientRect().left; mouseAt = Math.round(Math.abs(mouseAt)); return mouseAt > size / 2; }; Rating.prototype.mouseLeave = function () { var value = this.state.value; var _a = this.props, half = _a.half, readOnly = _a.readOnly; if (readOnly) return; if (half) { this.setState({ halfStar: { at: Math.floor(value), hidden: value % 1 === 0 // check value is decimal or not } }); } this.setState({ stars: this.getStars() }); }; Rating.prototype.handleClick = function (event) { var _a = this.props, half = _a.half, readOnly = _a.readOnly, onChange = _a.onChange, size = _a.size; if (readOnly) return; var index = Number(event.target.getAttribute('data-index')); var value; if (half) { var isAtHalf = this.moreThanHalf(event, size); if (isAtHalf) index = index + 1; value = isAtHalf ? index : index + 0.5; this.setState({ halfStar: { at: index, hidden: isAtHalf } }); } else { value = index = index + 1; } this.setState({ value: value, stars: this.getStars(index) }); onChange && onChange(value); }; Rating.prototype.renderStars = function () { var _this = this; var _a = this.state, halfStar = _a.halfStar, stars = _a.stars; var _b = this.props, char = _b.char, half = _b.half, readOnly = _b.readOnly, cx = _b.classnames; return stars.map(function (star, i) { var className = cx('Rating', { 'Rating-half': half && !halfStar.hidden && halfStar.at === i, 'is-active': star.active, 'is-disabled': readOnly }); return (react_1.default.createElement("span", { className: className, key: i, "data-index": i, "data-forhalf": char, onMouseOver: _this.mouseOver, onMouseMove: _this.mouseOver, onMouseLeave: _this.mouseLeave, onClick: _this.handleClick }, char)); }); }; Rating.prototype.render = function () { var className = this.props.className; return react_1.default.createElement("div", { className: classnames_1.default(className ? className : '') }, this.renderStars()); }; Rating.defaultProps = { containerClass: 'rating', readOnly: false, half: true, value: 0, count: 5, char: '★', size: 24 }; return Rating; }(react_1.default.Component)); exports.Rating = Rating; exports.default = theme_1.themeable(Rating); //# sourceMappingURL=./components/Rating.js.map