UNPKG

rsuite

Version:

A suite of react components

177 lines (160 loc) 6.46 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose"; import React, { forwardRef, useCallback } from 'react'; import PropTypes from 'prop-types'; import ArrowDown from '@rsuite/icons/legacy/ArrowDown'; import Spinner from '@rsuite/icons/legacy/Spinner'; import DropdownMenuCheckItem from '../Picker/DropdownMenuCheckItem'; import { getTreeNodeIndent } from '../utils/treeUtils'; import { useClassNames, CHECK_STATE, reactToString } from '../utils'; var CheckTreeNode = /*#__PURE__*/forwardRef(function (_ref, ref) { var _ref$as = _ref.as, Component = _ref$as === void 0 ? 'div' : _ref$as, style = _ref.style, className = _ref.className, _ref$classPrefix = _ref.classPrefix, classPrefix = _ref$classPrefix === void 0 ? 'check-tree-node' : _ref$classPrefix, _ref$visible = _ref.visible, visible = _ref$visible === void 0 ? true : _ref$visible, layer = _ref.layer, disabled = _ref.disabled, allUncheckable = _ref.allUncheckable, rtl = _ref.rtl, loading = _ref.loading, expand = _ref.expand, hasChildren = _ref.hasChildren, nodeData = _ref.nodeData, focus = _ref.focus, label = _ref.label, uncheckable = _ref.uncheckable, checkState = _ref.checkState, onExpand = _ref.onExpand, onSelect = _ref.onSelect, onRenderTreeIcon = _ref.onRenderTreeIcon, onRenderTreeNode = _ref.onRenderTreeNode, rest = _objectWithoutPropertiesLoose(_ref, ["as", "style", "className", "classPrefix", "visible", "layer", "disabled", "allUncheckable", "rtl", "loading", "expand", "hasChildren", "nodeData", "focus", "label", "uncheckable", "checkState", "onExpand", "onSelect", "onRenderTreeIcon", "onRenderTreeNode"]); var _useClassNames = useClassNames(classPrefix), prefix = _useClassNames.prefix, merge = _useClassNames.merge, withClassPrefix = _useClassNames.withClassPrefix; var getTitle = function getTitle() { if (typeof label === 'string') { return label; } else if ( /*#__PURE__*/React.isValidElement(label)) { var nodes = reactToString(label); return nodes.join(''); } }; var handleExpand = useCallback(function (event) { var _event$nativeEvent, _event$nativeEvent$st; // stop propagation when using custom loading icon event === null || event === void 0 ? void 0 : (_event$nativeEvent = event.nativeEvent) === null || _event$nativeEvent === void 0 ? void 0 : (_event$nativeEvent$st = _event$nativeEvent.stopImmediatePropagation) === null || _event$nativeEvent$st === void 0 ? void 0 : _event$nativeEvent$st.call(_event$nativeEvent); onExpand === null || onExpand === void 0 ? void 0 : onExpand(nodeData); }, [nodeData, onExpand]); var handleSelect = useCallback(function (_value, event) { if (disabled || uncheckable) { return; } var isChecked = false; if (checkState === CHECK_STATE.UNCHECK || checkState === CHECK_STATE.INDETERMINATE) { isChecked = true; } if (checkState === CHECK_STATE.CHECK) { isChecked = false; } var nextNodeData = _extends({}, nodeData, { check: isChecked }); onSelect === null || onSelect === void 0 ? void 0 : onSelect(nextNodeData, event); }, [disabled, checkState, uncheckable, nodeData, onSelect]); var renderIcon = function renderIcon() { var expandIconClasses = prefix('expand-icon', 'icon', { expanded: expand }); var expandIcon = /*#__PURE__*/React.createElement(ArrowDown, { className: expandIconClasses }); if (loading) { expandIcon = /*#__PURE__*/React.createElement("div", { className: prefix('loading-icon') }, /*#__PURE__*/React.createElement(Spinner, { spin: true })); } if (typeof onRenderTreeIcon === 'function') { var customIcon = onRenderTreeIcon(nodeData); expandIcon = customIcon !== null ? /*#__PURE__*/React.createElement("div", { className: prefix('custom-icon') }, customIcon) : expandIcon; } return hasChildren ? /*#__PURE__*/React.createElement("div", { role: "button", tabIndex: -1, "data-ref": nodeData.refKey, className: prefix('expand-icon-wrapper'), onClick: handleExpand }, expandIcon) : null; }; var renderLabel = function renderLabel() { return /*#__PURE__*/React.createElement(DropdownMenuCheckItem, { as: "div", active: checkState === CHECK_STATE.CHECK, indeterminate: checkState === CHECK_STATE.INDETERMINATE, focus: focus, checkable: !uncheckable, disabled: disabled, "data-layer": layer, value: nodeData.refKey, className: prefix('label'), title: getTitle(), onSelect: handleSelect }, /*#__PURE__*/React.createElement("span", { className: prefix('text-wrapper') }, typeof onRenderTreeNode === 'function' ? onRenderTreeNode(nodeData) : label)); }; var classes = merge(className, withClassPrefix({ disabled: disabled, 'all-uncheckable': !!allUncheckable, 'text-muted': disabled, focus: focus })); var styles = _extends({}, style, getTreeNodeIndent(rtl, layer - 1)); return visible ? /*#__PURE__*/React.createElement(Component, _extends({ role: "treeitem", "aria-label": label, "aria-expanded": expand, "aria-selected": checkState === CHECK_STATE.CHECK, "aria-disabled": disabled, "aria-level": layer }, rest, { style: styles, className: classes, ref: ref }), renderIcon(), renderLabel()) : null; }); CheckTreeNode.displayName = 'CheckTreeNode'; CheckTreeNode.propTypes = { as: PropTypes.elementType, rtl: PropTypes.bool, classPrefix: PropTypes.string, visible: PropTypes.bool, style: PropTypes.object, label: PropTypes.any, layer: PropTypes.number, loading: PropTypes.bool, value: PropTypes.any, focus: PropTypes.bool, expand: PropTypes.bool, nodeData: PropTypes.object, disabled: PropTypes.bool, className: PropTypes.string, checkState: PropTypes.oneOf([CHECK_STATE.UNCHECK, CHECK_STATE.CHECK, CHECK_STATE.INDETERMINATE]), hasChildren: PropTypes.bool, uncheckable: PropTypes.bool, allUncheckable: PropTypes.bool, onExpand: PropTypes.func, onSelect: PropTypes.func, onRenderTreeIcon: PropTypes.func, onRenderTreeNode: PropTypes.func }; export default CheckTreeNode;