UNPKG

@coreui/react-pro

Version:

UI Components Library for React.js

132 lines (128 loc) 6.14 kB
'use strict'; var tslib_es6 = require('../../node_modules/tslib/tslib.es6.js'); var React = require('react'); var PropTypes = require('prop-types'); var index = require('../../_virtual/index.js'); var CTooltip = require('../tooltip/CTooltip.js'); const CConditionalTooltip = ({ children, content, tooltip, }) => { return tooltip ? (React.createElement(CTooltip.CTooltip, { content: content }, React.createElement("span", null, children))) : (children); }; const CRating = React.forwardRef((_a, ref) => { var { activeIcon, allowClear, className, disabled, highlightOnlySelected, icon, itemCount = 5, name, onChange, onHover, precision = 1, readOnly, size, tooltips, value } = _a, rest = tslib_es6.__rest(_a, ["activeIcon", "allowClear", "className", "disabled", "highlightOnlySelected", "icon", "itemCount", "name", "onChange", "onHover", "precision", "readOnly", "size", "tooltips", "value"]); const [cleared, setCleared] = React.useState(false); const [currentValue, setCurrentValue] = React.useState(value !== null && value !== void 0 ? value : null); const [hoverValue, setHoverValue] = React.useState(null); const [tooltipValue, setTooltipValue] = React.useState(null); const _name = name || React.useId(); React.useEffect(() => { value !== undefined && setCurrentValue(value); }, [value]); const handleMouseEnter = (value) => { if (disabled || readOnly) { return; } onHover && onHover(value); setHoverValue(value); value && setTooltipValue(value); }; const handleMouseLeave = () => { if (disabled || readOnly) { return; } onHover && onHover(null); setHoverValue(null); }; const handleOnChange = (value) => { if (disabled || readOnly) { return; } if (cleared) { setCleared(false); return; } setCurrentValue(value); onChange && onChange(value); }; const handleOnClick = (value) => { if (disabled || readOnly) { return; } if (allowClear && value === currentValue) { setCleared(true); onChange && onChange(null); setCurrentValue(null); setHoverValue(null); } }; return (React.createElement("div", Object.assign({ className: index.default('rating', { [`rating-${size}`]: size, disabled: disabled, readonly: readOnly, }, className), role: "radiogroup" }, rest, { ref: ref }), Array.from({ length: itemCount }, (_, index$1) => { const numberOfRadios = 1 / precision; return (React.createElement(CConditionalTooltip, Object.assign({ key: index$1 }, (tooltips && { content: Array.isArray(tooltips) ? tooltips[index$1] : precision ? tooltipValue : index$1 + 1, tooltip: true, })), React.createElement("div", { className: "rating-item" }, Array.from({ length: numberOfRadios }, (_, _index) => { var _a, _b; const isNotLastItem = _index + 1 < numberOfRadios; const value = numberOfRadios === 1 ? index$1 + 1 : index$1 + (_index + 1) * (1 * precision); const id = React.useId(); const isItemChecked = () => value === currentValue; const isItemActive = () => { if (highlightOnlySelected ? hoverValue === value : hoverValue && hoverValue >= value) { return true; } if (hoverValue === null && (highlightOnlySelected ? isItemChecked() : currentValue && currentValue >= value)) { return true; } return false; }; return (React.createElement(React.Fragment, { key: value }, React.createElement("label", Object.assign({ className: index.default('rating-item-label', { active: isItemActive(), }), htmlFor: id, onClick: () => handleOnClick(value), onMouseEnter: () => handleMouseEnter(value), onMouseLeave: () => handleMouseLeave() }, (isNotLastItem && { style: { zIndex: 1 / precision - _index, position: 'absolute', width: `${precision * (_index + 1) * 100}%`, overflow: 'hidden', opacity: 0, }, })), icon ? (React.createElement("div", { className: "rating-item-custom-icon" }, (_a = icon[value]) !== null && _a !== void 0 ? _a : icon)) : (React.createElement("div", { className: "rating-item-icon" })), activeIcon && (React.createElement("div", { className: "rating-item-custom-icon-active" }, (_b = activeIcon[value]) !== null && _b !== void 0 ? _b : activeIcon))), React.createElement("input", { className: "rating-item-input", checked: isItemChecked(), disabled: disabled || readOnly, id: id, name: _name, onBlur: () => handleMouseLeave(), onChange: () => handleOnChange(value), onFocus: () => handleMouseEnter(value), type: "radio", value: value }))); })))); }))); }); CRating.propTypes = { children: PropTypes.node, activeIcon: PropTypes.any, allowClear: PropTypes.bool, disabled: PropTypes.bool, highlightOnlySelected: PropTypes.bool, icon: PropTypes.any, itemCount: PropTypes.number, name: PropTypes.string, onChange: PropTypes.func, onHover: PropTypes.func, precision: PropTypes.number, readOnly: PropTypes.bool, size: PropTypes.oneOf(['sm', 'lg', 'custom']), value: PropTypes.number, }; CRating.displayName = 'CRating'; exports.CRating = CRating; //# sourceMappingURL=CRating.js.map