UNPKG

gui-one-nutui-react-taro

Version:

京东风格的轻量级移动端 React 组件库,支持一套代码生成 H5 和小程序

250 lines (248 loc) 10.1 kB
import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray"; import _slicedToArray from "@babel/runtime/helpers/slicedToArray"; import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties"; import _defineProperty from "@babel/runtime/helpers/defineProperty"; var _excluded = ["className", "disabled", "onChange", "checkedValue", "max", "options"], _excluded2 = ["label", "value", "disabled", "onChange"], _excluded3 = ["iconName", "iconSize", "label", "className", "textPosition", "iconActiveName", "checked", "disabled", "onChange", "indeterminate", "iconClassPrefix", "iconFontClassName", "iconIndeterminateName", "getParentVals", "max"]; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } import React__default, { useState, useImperativeHandle, useEffect, useCallback } from 'react'; import { I as Icon } from './icon.taro-1d0d4fb7.js'; import { c as cn } from './bem-893ad28d.js'; import { C as ComponentDefaults } from './typings-1c5f2628.js'; var defaultProps$1 = { disabled: false, checkedValue: [], max: undefined, onChange: function onChange(value) {}, options: [] }; var CheckboxGroup = React__default.forwardRef(function (props, ref) { var _defaultProps$1$props = _objectSpread(_objectSpread({}, defaultProps$1), props), children = _defaultProps$1$props.children; var b = cn('checkboxgroup'); var className = props.className, disabled = props.disabled, onChange = props.onChange, checkedValue = props.checkedValue, max = props.max, options = props.options, rest = _objectWithoutProperties(props, _excluded); var _useState = useState(disabled), _useState2 = _slicedToArray(_useState, 2), innerDisabled = _useState2[0], setInnerDisabled = _useState2[1]; var _useState3 = useState(checkedValue), _useState4 = _slicedToArray(_useState3, 2), innerValue = _useState4[0], setInnerValue = _useState4[1]; useImperativeHandle(ref, function () { return { toggleAll: function toggleAll(state) { if (state === false) { setInnerValue([]); } else { var childrenLabel = []; React__default.Children.map(children, function (child) { var childProps = child.props; childrenLabel.push(childProps.label || child.children); }); setInnerValue(childrenLabel); } }, toggleReverse: function toggleReverse() { var childrenLabel = []; React__default.Children.map(children, function (child) { var childProps = child.props; childrenLabel.push(childProps.label || child.children); }); var reverse = childrenLabel.filter(function (c) { return (innerValue === null || innerValue === void 0 ? void 0 : innerValue.findIndex(function (v) { return v === c; })) === -1; }); setInnerValue(reverse); } }; }); useEffect(function () { setInnerDisabled(disabled); setInnerValue(checkedValue); }, [disabled, checkedValue]); function handleChildChange(state, label) { if (max !== undefined && innerValue && innerValue.length > max) return; if (innerValue) { var clippedValue = []; if (state) { clippedValue = [].concat(_toConsumableArray(innerValue), [label]); } else { innerValue === null || innerValue === void 0 ? void 0 : innerValue.splice(innerValue === null || innerValue === void 0 ? void 0 : innerValue.indexOf(label), 1); clippedValue = _toConsumableArray(innerValue); } setInnerValue(clippedValue); onChange && onChange(clippedValue); } } function validateChildChecked(child) { if (!innerValue) return false; return (innerValue === null || innerValue === void 0 ? void 0 : innerValue.indexOf(child.props.label || child.children)) > -1; } function validateChecked(value) { if (innerValue === null) return false; return innerValue === value; } function getParentVals() { return innerValue; } function cloneChildren() { return React__default.Children.map(children, function (child) { var childChecked = validateChildChecked(child); if (child.type.displayName !== 'NutCheckBox') { return React__default.cloneElement(child); } return React__default.cloneElement(child, { disabled: innerDisabled, checked: childChecked, onChange: handleChildChange, getParentVals: getParentVals, max: max }); }); } var renderOptionsChildren = useCallback(function () { return options === null || options === void 0 ? void 0 : options.map(function (_ref) { var label = _ref.label, value = _ref.value, disabled = _ref.disabled, onChange = _ref.onChange, rest = _objectWithoutProperties(_ref, _excluded2); var childChecked = validateChecked(value); return React__default.createElement(Checkbox, _objectSpread(_objectSpread({ key: value === null || value === void 0 ? void 0 : value.toString(), children: label, label: value, disabled: innerDisabled ? true : disabled, onChange: handleChildChange }, rest), {}, { max: max, getParentVals: getParentVals, checked: childChecked })); }); }, [innerValue, options]); return React__default.createElement("div", _objectSpread({ className: "".concat(b(), " ").concat(className || '') }, rest), options !== null && options !== void 0 && options.length ? renderOptionsChildren() : cloneChildren()); }); CheckboxGroup.defaultProps = defaultProps$1; CheckboxGroup.displayName = 'NutCheckboxGroup'; var defaultProps = _objectSpread(_objectSpread({}, ComponentDefaults), {}, { checked: false, disabled: false, textPosition: 'right', iconSize: 18, iconName: 'check-normal', iconActiveName: 'checked', iconClassPrefix: 'nut-icon', iconFontClassName: 'nutui-iconfont', iconIndeterminateName: 'check-disabled', onChange: function onChange(state, label) {} }); var Checkbox = function Checkbox(props) { var _defaultProps$props = _objectSpread(_objectSpread({}, defaultProps), props), children = _defaultProps$props.children; var b = cn('checkbox'); var iconName = props.iconName, iconSize = props.iconSize, label = props.label, className = props.className, textPosition = props.textPosition, iconActiveName = props.iconActiveName, checked = props.checked, disabled = props.disabled, onChange = props.onChange, indeterminate = props.indeterminate, iconClassPrefix = props.iconClassPrefix, iconFontClassName = props.iconFontClassName, iconIndeterminateName = props.iconIndeterminateName, getParentVals = props.getParentVals, max = props.max, rest = _objectWithoutProperties(props, _excluded3); var _useState5 = useState(checked), _useState6 = _slicedToArray(_useState5, 2), innerChecked = _useState6[0], setInnerChecked = _useState6[1]; var _useState7 = useState(disabled), _useState8 = _slicedToArray(_useState7, 2), innerDisabled = _useState8[0], setDisabled = _useState8[1]; var _useState9 = useState(indeterminate), _useState10 = _slicedToArray(_useState9, 2), _indeterminate = _useState10[0], setIndeterminate = _useState10[1]; useEffect(function () { setInnerChecked(checked); setDisabled(disabled); }, [disabled, checked]); useEffect(function () { setIndeterminate(indeterminate); }, [indeterminate]); var getIconName = function getIconName() { if (!innerChecked) { return iconName; } if (_indeterminate) { return iconIndeterminateName; } return iconActiveName; }; var renderIcon = function renderIcon() { return React__default.createElement(Icon, { classPrefix: iconClassPrefix, fontClassName: iconFontClassName, name: getIconName(), size: iconSize, className: color() }); }; var color = function color() { if (innerDisabled) { return 'nut-checkbox__icon--disable'; } if (innerChecked) { if (_indeterminate) { return 'nut-checkbox__icon--indeterminate'; } return 'nut-checkbox__icon'; } return 'nut-checkbox__icon--unchecked'; // return !innerDisabled ? (!innerChecked ? '#d6d6d6' : '#fa2c19') : '#f5f5f5' }; var renderLabel = function renderLabel() { return React__default.createElement("span", { className: "".concat(b('label', { disabled: innerDisabled }), " ") }, children || label); }; var handleClick = function handleClick() { if (!disabled) { var latest = !innerChecked; if (max !== undefined && latest && getParentVals().length >= max) return; onChange && onChange(latest, label || children); setInnerChecked(latest); } }; return React__default.createElement("div", _objectSpread(_objectSpread({ className: "".concat(b({ reverse: textPosition === 'left' }), " ").concat(className || '') }, rest), {}, { onClick: handleClick }), renderIcon(), renderLabel()); }; Checkbox.defaultProps = defaultProps; Checkbox.displayName = 'NutCheckBox'; Checkbox.Group = CheckboxGroup; export { Checkbox as C, CheckboxGroup as a };