UNPKG

@6thquake/react-material

Version:

React components that implement Google's Material Design.

665 lines (589 loc) 22.7 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); 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 _react = _interopRequireWildcard(require("react")); var _withStyles = _interopRequireDefault(require("../styles/withStyles")); var _propTypes = _interopRequireDefault(require("prop-types")); var _classnames = _interopRequireDefault(require("classnames")); var _icons = require("@material-ui/icons"); var styles = { rmVote: { margin: '0', padding: '0', listStyle: 'none', fontSize: '24px', display: 'inline-block', verticalAlign: 'middle', fontWeight: '400', fontStyle: 'normal' }, rmVoteStar: { color: '#f5a623', margin: '0', padding: '0', cursor: 'pointer', display: 'inline-block', position: 'relative', transition: 'all .3s ease', '&:hover': { transform: 'scale(1.1)' } }, rmVoteDisabled: { '@global li': { '&:hover': { cursor: 'default', transform: 'scale(1)' } } }, rmVoteStarFull: {}, rmVoteStarZero: {}, rmVoteStarHalf: {}, rmVoteStarContent: { position: 'absolute', left: '0', top: '0', width: '50%', height: '100%', overflow: 'hidden' }, xs: { fontSize: 12 }, sm: { fontSize: 16 }, md: { fontSize: 24 }, lg: { fontSize: 32 } }; var StarVote = /*#__PURE__*/ function (_React$Component) { (0, _inherits2.default)(StarVote, _React$Component); function StarVote(props) { var _this; (0, _classCallCheck2.default)(this, StarVote); _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(StarVote).call(this, props)); _this.onMouseOver = function (key, e) { // li onMouseOver event e.nativeEvent.stopImmediatePropagation(); e.stopPropagation(); e.preventDefault(); var tagArray = []; if (!_this.state.disabled) { for (var i = 0; i < _this.state.count; i++) { if (i <= key) { tagArray.push(1); } else { tagArray.push(0); } } } _this.setState({ tagArrTemp: [].concat(tagArray) }); }; _this.onMouseOverContent = function (key, e) { //onMouseOver选一半 e.preventDefault(); e.nativeEvent.stopImmediatePropagation(); e.stopPropagation(); if (!_this.state.disabled) { var tagArray = []; if (!_this.state.disabled) { for (var i = 0; i < _this.state.count; i++) { if (i < key) { tagArray.push(1); } else if (i === key) { tagArray.push(0.5); } else { tagArray.push(0); } } } _this.setState({ tagArrTemp: [].concat(tagArray) }); } }; _this.onClick = function (key, e) { e.preventDefault(); e.nativeEvent.stopImmediatePropagation(); e.stopPropagation(); var tagArray = []; var tagArrayCopy = (0, _toConsumableArray2.default)(_this.state.tagArr); if (!_this.state.disabled) { for (var i = 0; i < _this.state.count; i++) { if (i < key) { tagArray.push(1); } else if (i === key) { if (_this.state.tagArr[key] === 1) { tagArray.push(0); } else { tagArray.push(1); } } else { tagArray.push(0); } } _this.setState({ tagArr: [].concat(tagArray) }); _this.props.onChange(key); } }; _this.onMouseOut = function (key, e) { //onMouseOut 清除 e.nativeEvent.stopImmediatePropagation(); e.stopPropagation(); if (!_this.state.disabled) { _this.setState({ tagArrTemp: [] }); } }; _this.onMouseOutContent = function (key, e) { e.nativeEvent.stopImmediatePropagation(); e.stopPropagation(); _this.setState({ tagArrTemp: [] }); }; _this.onClickContent = function (key, e) { // e.preventDefault(); e.nativeEvent.stopImmediatePropagation(); e.stopPropagation(); var tagArray = []; if (!_this.state.disabled) { for (var i = 0; i < _this.state.count; i++) { if (i < key) { tagArray.push(1); } else if (i === key) { if (_this.state.tagArr[key] === 0.5) { tagArray.push(0); } else { tagArray.push(0.5); } } else { tagArray.push(0); } } _this.setState({ tagArr: [].concat(tagArray) }); _this.state.onChange(key); } }; _this.state = { count: props.count, value: props.value, defaultValue: props.defaultValue, onChange: props.onChange, allowHalf: props.allowHalf, disabled: props.disabled, tagArr: [], tagArrTemp: [] }; try { if (Boolean(_this.state.allowHalf)) { //允许半选 _this.state.allowHalf = true; } else { _this.state.allowHalf = false; //默认不允许半选 } if (Boolean(_this.state.disabled)) { _this.state.disabled = true; // 只读,无法进行交互 } else { _this.state.disabled = false; // 默认为false 可以进行点击、取消等交互事件 } if (!_this.state.count) { _this.state.count = 5; // 未提供总数 默认 为 5 } else if (!parseInt(_this.state.count)) { throw new Error('the attribute count must be integer type!'); } else { _this.state.count = _this.state.count > 10 ? 10 : Math.abs(_this.state.count); } if (_this.state.value) { //存在当前数 if (!_this.state.allowHalf) { // 不允许半选,count 、 value等验证必须为整数 且受控值 value 必须小于 cout if (!parseInt(_this.state.value)) { throw new Error('not integer type of the attribute value!'); } else if (_this.state.value > _this.state.count) { throw new Error('attribute value must less than the attribute count'); } else { _this.state.value = Math.abs(_this.props.value); } } else { // 如果允许半选,存在当前数的情况 需要验证当前数是否是数值 必须是 0.5的倍数 且小于 count if (Math.sign(_this.state.value) != 'NaN') { if (!parseInt(Math.abs(_this.state.value) / 0.5)) { throw new Error('attribute value must be an integer or multiple of 0.5!'); } else { _this.state.value = Math.abs(_this.state.value); } } } } if (_this.state.defaultValue) { //存在defaultValue if (!_this.state.allowHalf) { // 不允许半选,defaultValue等验证必须为整数 且受控值 value 必须小于 cout if (!parseInt(_this.state.defaultValue)) { throw new Error('not integer type of the attribute value!'); } else if (_this.state.defaultValue > _this.state.count) { throw new Error('attribute value must less than the attribute count'); } else { _this.state.defaultValue = Math.abs(_this.props.defaultValue); } } else { // 如果允许半选,存在defaultValue的情况 需要验证 defaultValue 是否是数值 必须是 0.5的倍数 且小于 count if (Math.sign(_this.state.defaultValue) != 'NaN') { if (!parseInt(Math.abs(_this.state.defaultValue) / 0.5)) { throw new Error('attribute value must be an integer or multiple of 0.5!'); } else { _this.state.defaultValue = Math.abs(_this.state.defaultValue); } } } } else { _this.state.defaultValue = 0; } } catch (err) { console.log(err); } return _this; } (0, _createClass2.default)(StarVote, [{ key: "componentDidMount", value: function componentDidMount() { var tagArray = []; if (this.state.value) { // 如果存在当前数 按照当前数去渲染 for (var i = 0; i < this.state.count; i++) { if (this.state.value.toString().includes('.5')) { //当前数为半数 if (Math.floor(this.state.value) === i) { tagArray.push(0.5); } else if (Math.floor(this.state.value) > i) { tagArray.push(1); } else { tagArray.push(0); } } else { //当前数为整数 if (i < this.state.value) { tagArray.push(1); } else { //包括大于等于 tagArray.push(0); } } } } else if (this.state.defaultValue) { // 不存在当前数 按照defaultValue 处理 for (var i = 0; i < this.state.count; i++) { if (this.state.value.toString().includes('.5')) { //当前数为半数 if (Math.floor(this.state.defaultValue) === i) { tagArray.push(0.5); } else if (Math.floor(this.state.defaultValue) > i) { tagArray.push(1); } else { tagArray.push(0); } } else { //当前数为整数 if (i < this.state.defaultValue) { tagArray.push(1); } else { //包括大于等于 tagArray.push(0); } } } } this.setState({ tagArr: [].concat(tagArray) }); } }, { key: "render", value: function render() { var _this2 = this; var _this$props = this.props, classes = _this$props.classes, size = _this$props.size, spacing = _this$props.spacing, other = (0, _objectWithoutProperties2.default)(_this$props, ["classes", "size", "spacing"]); var tagArray = []; if (this.state.tagArrTemp.length != 0) { tagArray = (0, _toConsumableArray2.default)(this.state.tagArrTemp); } else { tagArray = (0, _toConsumableArray2.default)(this.state.tagArr); } var fontSize = ''; switch (size) { case 'xs': case 'sm': case 'md': case 'lg': fontSize = 'inherit'; break; case 'small': fontSize = 'small'; break; case 'large': fontSize = 'large'; break; case 'medium': default: fontSize = 'default'; break; } var listItems = tagArray.map(function (tag, index) { if (_this2.state.allowHalf) { // 允许半选 if (tag === 1) { var _classNames; return _react.default.createElement("li", { key: index, onMouseOver: function onMouseOver(e) { return _this2.onMouseOver(index, e); }, onMouseOut: function onMouseOut(e) { return _this2.onMouseOut(index, e); }, onClick: function onClick(e) { return _this2.onClick(index, e); }, className: (0, _classnames.default)((_classNames = {}, (0, _defineProperty2.default)(_classNames, classes.rmVoteStar, true), (0, _defineProperty2.default)(_classNames, classes.rmVoteStarFull, true), (0, _defineProperty2.default)(_classNames, classes.xs, size === 'xs'), (0, _defineProperty2.default)(_classNames, classes.sm, size === 'sm'), (0, _defineProperty2.default)(_classNames, classes.md, size === 'md'), (0, _defineProperty2.default)(_classNames, classes.lg, size === 'lg'), _classNames)), style: { margin: "0px ".concat(spacing, "px") } }, _react.default.createElement(_icons.Star, { fontSize: fontSize }), _react.default.createElement("div", { onMouseOver: function onMouseOver(e) { return _this2.onMouseOverContent(index, e); }, onMouseOut: function onMouseOut(e) { return _this2.onMouseOutContent(index, e); }, onClick: function onClick(e) { return _this2.onClickContent(index, e); }, className: classes.rmVoteStarContent })); } else if (tag === 0.5) { var _classNames2; return _react.default.createElement("li", { key: index, onMouseOver: function onMouseOver(e) { return _this2.onMouseOver(index, e); }, onMouseOut: function onMouseOut(e) { return _this2.onMouseOut(index, e); }, onClick: function onClick(e) { return _this2.onClick(index, e); }, className: (0, _classnames.default)((_classNames2 = {}, (0, _defineProperty2.default)(_classNames2, classes.rmVoteStar, true), (0, _defineProperty2.default)(_classNames2, classes.rmVoteStarHalf, true), (0, _defineProperty2.default)(_classNames2, classes.xs, size === 'xs'), (0, _defineProperty2.default)(_classNames2, classes.sm, size === 'sm'), (0, _defineProperty2.default)(_classNames2, classes.md, size === 'md'), (0, _defineProperty2.default)(_classNames2, classes.lg, size === 'lg'), _classNames2)), style: { margin: "0px ".concat(spacing, "px") } }, _react.default.createElement(_icons.StarHalf, { fontSize: fontSize }), _react.default.createElement("div", { onMouseOver: function onMouseOver(e) { return _this2.onMouseOverContent(index, e); }, onMouseOut: function onMouseOut(e) { return _this2.onMouseOutContent(index, e); }, onClick: function onClick(e) { return _this2.onClickContent(index, e); }, className: classes.rmVoteStarContent })); } else { var _classNames3; return _react.default.createElement("li", { key: index, onMouseOver: function onMouseOver(e) { return _this2.onMouseOver(index, e); }, onMouseOut: function onMouseOut(e) { return _this2.onMouseOut(index, e); }, onClick: function onClick(e) { return _this2.onClick(index, e); }, className: (0, _classnames.default)((_classNames3 = {}, (0, _defineProperty2.default)(_classNames3, classes.rmVoteStar, true), (0, _defineProperty2.default)(_classNames3, classes.rmVoteStarZero, true), (0, _defineProperty2.default)(_classNames3, classes.xs, size === 'xs'), (0, _defineProperty2.default)(_classNames3, classes.sm, size === 'sm'), (0, _defineProperty2.default)(_classNames3, classes.md, size === 'md'), (0, _defineProperty2.default)(_classNames3, classes.lg, size === 'lg'), _classNames3)), style: { margin: "0px ".concat(spacing, "px") } }, _react.default.createElement(_icons.StarBorder, { fontSize: fontSize }), _react.default.createElement("div", { onMouseOver: function onMouseOver(e) { return _this2.onMouseOverContent(index, e); }, onMouseOut: function onMouseOut(e) { return _this2.onMouseOutContent(index, e); }, onClick: function onClick(e) { return _this2.onClickContent(index, e); }, className: classes.rmVoteStarContent })); } } else { if (tag === 1) { var _classNames4; return _react.default.createElement("li", { key: index, onMouseOver: function onMouseOver(e) { return _this2.onMouseOver(index, e); }, onMouseOut: function onMouseOut(e) { return _this2.onMouseOut(index, e); }, onClick: function onClick(e) { return _this2.onClick(index, e); }, className: (0, _classnames.default)((_classNames4 = {}, (0, _defineProperty2.default)(_classNames4, classes.rmVoteStar, true), (0, _defineProperty2.default)(_classNames4, classes.rmVoteStarFull, true), (0, _defineProperty2.default)(_classNames4, classes.xs, size === 'xs'), (0, _defineProperty2.default)(_classNames4, classes.sm, size === 'sm'), (0, _defineProperty2.default)(_classNames4, classes.md, size === 'md'), (0, _defineProperty2.default)(_classNames4, classes.lg, size === 'lg'), _classNames4)), style: { margin: "0px ".concat(spacing, "px") } }, _react.default.createElement(_icons.Star, { fontSize: fontSize }), _react.default.createElement("div", { className: classes.rmVoteStarContent })); } else if (tag === 0.5) { var _classNames5; return _react.default.createElement("li", { key: index, onMouseOver: function onMouseOver(e) { return _this2.onMouseOver(index, e); }, onMouseOut: function onMouseOut(e) { return _this2.onMouseOut(index, e); }, onClick: function onClick(e) { return _this2.onClick(index, e); }, className: (0, _classnames.default)((_classNames5 = {}, (0, _defineProperty2.default)(_classNames5, classes.rmVoteStar, true), (0, _defineProperty2.default)(_classNames5, classes.rmVoteStarHalf, true), (0, _defineProperty2.default)(_classNames5, classes.xs, size === 'xs'), (0, _defineProperty2.default)(_classNames5, classes.sm, size === 'sm'), (0, _defineProperty2.default)(_classNames5, classes.md, size === 'md'), (0, _defineProperty2.default)(_classNames5, classes.lg, size === 'lg'), _classNames5)), style: { margin: "0px ".concat(spacing, "px") } }, _react.default.createElement(_icons.StarHalf, { fontSize: fontSize }), _react.default.createElement("div", { className: classes.rmVoteStarContent })); } else { var _classNames6; return _react.default.createElement("li", { key: index, onMouseOver: function onMouseOver(e) { return _this2.onMouseOver(index, e); }, onMouseOut: function onMouseOut(e) { return _this2.onMouseOut(index, e); }, onClick: function onClick(e) { return _this2.onClick(index, e); }, className: (0, _classnames.default)((_classNames6 = {}, (0, _defineProperty2.default)(_classNames6, classes.rmVoteStar, true), (0, _defineProperty2.default)(_classNames6, classes.rmVoteStarZero, true), (0, _defineProperty2.default)(_classNames6, classes.xs, size === 'xs'), (0, _defineProperty2.default)(_classNames6, classes.sm, size === 'sm'), (0, _defineProperty2.default)(_classNames6, classes.md, size === 'md'), (0, _defineProperty2.default)(_classNames6, classes.lg, size === 'lg'), _classNames6)), style: { margin: "0px ".concat(spacing, "px") } }, _react.default.createElement(_icons.StarBorder, { fontSize: fontSize }), _react.default.createElement("div", { className: classes.rmVoteStarContent })); } } }); if (this.state.disabled) { var _classNames7; return _react.default.createElement("ul", (0, _extends2.default)({ className: (0, _classnames.default)((_classNames7 = {}, (0, _defineProperty2.default)(_classNames7, classes.rmVoteDisabled, true), (0, _defineProperty2.default)(_classNames7, classes.rmVote, true), _classNames7)) }, other), listItems); } else { return _react.default.createElement("ul", (0, _extends2.default)({ className: classes.rmVote }, other), listItems); } } }]); return StarVote; }(_react.default.Component); StarVote.propTypes = { /** * Whether the value is allowed to be a decimal */ allowHalf: _propTypes.default.bool, /** * Total count of star */ count: _propTypes.default.number, /** * The default value */ defaultValue: _propTypes.default.number, /** * Read only, can not interact */ disabled: _propTypes.default.bool, /** * Callback fired after value changed */ onChange: _propTypes.default.func, /** * Size of each item. */ size: _propTypes.default.oneOf(['xs', 'sm', 'md', 'lg', 'small', 'medium', 'large']), /** * Spacing between items. */ spacing: _propTypes.default.number, /** * Current value,controlled value */ value: _propTypes.default.number }; StarVote.defaultProps = { count: 5, defaultValue: 0, allowHalf: false, disabled: false, size: 'medium', spacing: 4 }; var _default = (0, _withStyles.default)(styles, { name: 'RMStarVote' })(StarVote); exports.default = _default;