UNPKG

tdesign-react

Version:
354 lines (350 loc) 14.1 kB
/** * tdesign v1.15.1 * (c) 2025 tdesign * @license MIT */ import { _ as _objectWithoutProperties } from '../_chunks/dep-6b660ef0.js'; import { _ as _slicedToArray } from '../_chunks/dep-48805ab8.js'; import { _ as _defineProperty } from '../_chunks/dep-cb0a3966.js'; import React, { forwardRef, useRef, useEffect, useState, isValidElement } from 'react'; import classNames from 'classnames'; import { isFunction } from 'lodash-es'; import { CaretRightSmallIcon } from 'tdesign-icons-react'; import { Loading } from '../loading/index.js'; import useRipple from '../hooks/useRipple.js'; import useDomRefCallback from '../hooks/useDomRefCallback.js'; import useGlobalIcon from '../hooks/useGlobalIcon.js'; import { Checkbox } from '../checkbox/index.js'; import { useTreeConfig } from './hooks/useTreeConfig.js'; import useDraggable from './hooks/useDraggable.js'; import composeRefs from '../_util/composeRefs.js'; import useConfig from '../hooks/useConfig.js'; import '../_chunks/dep-026a4c6b.js'; import '../_chunks/dep-eca3a3de.js'; import '../loading/Loading.js'; import '../_chunks/dep-3a09424a.js'; import '../common/Portal.js'; import 'react-dom'; import '../hooks/useLayoutEffect.js'; import '../config-provider/ConfigContext.js'; import '../locale/zh_CN.js'; import '../_chunks/dep-e29214cb.js'; import 'dayjs'; import '../_chunks/dep-3c9ab31a.js'; import '../loading/gradient.js'; import '../_chunks/dep-c48e2ca1.js'; import '../_chunks/dep-1630b9b4.js'; import '../_chunks/dep-87d110df.js'; import '../loading/defaultProps.js'; import '../hooks/useDefaultProps.js'; import '../loading/plugin.js'; import '../_util/react-render.js'; import '../_chunks/dep-a74cc5e4.js'; import '../common/PluginContainer.js'; import '../config-provider/index.js'; import '../config-provider/ConfigProvider.js'; import '../config-provider/type.js'; import '../loading/style/index.js'; import '../loading/type.js'; import '../hooks/useAnimation.js'; import '../_chunks/dep-0030a252.js'; import '../_util/forwardRefWithStatics.js'; import 'hoist-non-react-statics'; import '../common/Check.js'; import '../_util/helper.js'; import '../hooks/useControlled.js'; import '../_util/noop.js'; import '../checkbox/defaultProps.js'; import '../checkbox/style/index.js'; import '../checkbox/type.js'; import '../locale/LocalReceiver.js'; import './hooks/TreeDraggableContext.js'; import '../_util/createHookContext.js'; import '../hooks/usePersistFn.js'; var _excluded = ["setData"]; function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } var TreeItem = /*#__PURE__*/forwardRef(function (props, ref) { var node = props.node, icon = props.icon, label = props.label, line = props.line, expandOnClickNode = props.expandOnClickNode, activable = props.activable, checkProps = props.checkProps, disableCheck = props.disableCheck, operations = props.operations, onClick = props.onClick, _onChange = props.onChange, isVirtual = props.isVirtual, onTreeItemMounted = props.onTreeItemMounted, allowDrop = props.allowDrop; var _useGlobalIcon = useGlobalIcon({ CaretRightSmallIcon: CaretRightSmallIcon }), CaretRightSmallIcon$1 = _useGlobalIcon.CaretRightSmallIcon; var level = node.level; var nodeRef = useRef(null); var _useTreeConfig = useTreeConfig(), treeClassNames = _useTreeConfig.treeClassNames, locale = _useTreeConfig.locale; var _useConfig = useConfig(), classPrefix = _useConfig.classPrefix; useEffect(function () { onTreeItemMounted === null || onTreeItemMounted === void 0 || onTreeItemMounted({ ref: nodeRef.current, data: node }); }, [isVirtual, nodeRef, node, onTreeItemMounted]); var handleClick = function handleClick(evt) { var _srcTarget$className, _srcTarget$className$; var srcTarget = evt.target; var isBranchTrigger = node.children && expandOnClickNode && (srcTarget.className === "".concat(classPrefix, "-checkbox__input") || srcTarget.tagName.toLowerCase() === "input"); if (isBranchTrigger) return; if (expandOnClickNode && node.children && ((_srcTarget$className = srcTarget.className) === null || _srcTarget$className === void 0 || (_srcTarget$className$ = _srcTarget$className.indexOf) === null || _srcTarget$className$ === void 0 ? void 0 : _srcTarget$className$.call(_srcTarget$className, "".concat(classPrefix, "-tree__label"))) !== -1) evt.preventDefault(); onClick === null || onClick === void 0 || onClick(node, { e: evt, expand: expandOnClickNode, active: activable, trigger: "node-click" }); }; var handleItemClick = function handleItemClick(evt) { if (node.loading) { return; } onClick === null || onClick === void 0 || onClick(node, { e: evt, expand: true, active: false, trigger: "icon-click" }); }; var handleIconClick = function handleIconClick(evt) { if (!icon) return; evt.stopPropagation(); handleItemClick(evt); }; var stopPropagation = function stopPropagation(e) { e.stopPropagation(); }; var renderIcon = function renderIcon() { var isDefaultIcon = false; var renderIconNode = function renderIconNode() { if (icon === false) { return null; } if (icon instanceof Function) { return icon(node.getModel()); } if (/*#__PURE__*/React.isValidElement(icon)) { return icon; } if (icon && icon !== true) { throw new Error("invalid type of icon"); } if (!node.isLeaf()) { isDefaultIcon = true; if (node.loading && node.expanded) { return /* @__PURE__ */React.createElement(Loading, { loading: true }); } return /* @__PURE__ */React.createElement(CaretRightSmallIcon$1, { className: treeClassNames.treeIconRight }); } return null; }; var iconNode = renderIconNode(); return /* @__PURE__ */React.createElement("span", { className: classNames(treeClassNames.treeIcon, treeClassNames.folderIcon, _defineProperty({}, treeClassNames.treeIconDefault, isDefaultIcon)), onClick: handleIconClick }, iconNode); }; var renderLine = function renderLine() { var iconVisible = icon !== false; if (line === false) { return null; } if (isFunction(line)) { return line(node.getModel()); } if (/*#__PURE__*/React.isValidElement(line)) { return line; } if (node.parent && node.tree) { var shadowStyles = []; var parents = node.getParents(); parents.pop(); parents.forEach(function (pnode, index) { if (!pnode.vmIsLast) { shadowStyles.push("calc(-".concat(index + 1, " * var(--space)) 0 var(--color)")); } }); var styles = { "--level": level, boxShadow: shadowStyles.join(",") }; return /* @__PURE__ */React.createElement("span", { className: classNames(treeClassNames.line, _defineProperty(_defineProperty({}, treeClassNames.lineIsLeaf, node.vmIsLeaf || !iconVisible), treeClassNames.lineIsFirst, node.vmIsFirst && iconVisible)), style: styles, onClick: stopPropagation }); } return null; }; var _useDomRefCallback = useDomRefCallback(), _useDomRefCallback2 = _slicedToArray(_useDomRefCallback, 2), labelDom = _useDomRefCallback2[0], setRefCurrent = _useDomRefCallback2[1]; useRipple(labelDom); var _useState = useState({}), _useState2 = _slicedToArray(_useState, 2), updateRender = _useState2[1]; var renderLabel = function renderLabel() { var _node$data, _node$data2; var emptyView = locale("empty"); var labelText = ""; if (label instanceof Function) { var _node$getModel = node.getModel(), nodeSetData = _node$getModel.setData, rest = _objectWithoutProperties(_node$getModel, _excluded); labelText = label(_objectSpread(_objectSpread({}, rest), {}, { setData: function setData(value) { nodeSetData(value); updateRender({}); } })) || emptyView; } else { labelText = node.label || emptyView; } var labelClasses = classNames(treeClassNames.treeLabel, treeClassNames.treeLabelStrictly, _defineProperty({}, treeClassNames.actived, node.isActivable() ? node.actived : false)); if (node.isCheckable()) { var checkboxDisabled; if (typeof disableCheck === "function") { checkboxDisabled = disableCheck(node.getModel()); } else { checkboxDisabled = !!disableCheck; } if (node.isDisabled()) { checkboxDisabled = true; } var checkboxProps; if (typeof checkProps === "function") { checkboxProps = checkProps(node.getModel()); } else { checkboxProps = checkProps; } return /* @__PURE__ */React.createElement(Checkbox, _objectSpread({ ref: setRefCurrent, checked: node.checked, indeterminate: node.indeterminate, disabled: checkboxDisabled, name: String(node.value), onChange: function onChange(checked, ctx) { return _onChange(node, ctx); }, className: labelClasses, stopLabelTrigger: expandOnClickNode && !!node.children }, checkboxProps), /* @__PURE__ */React.createElement("span", { "data-target": "label" }, labelText)); } return /* @__PURE__ */React.createElement("span", { ref: setRefCurrent, "data-target": "label", className: labelClasses, title: /*#__PURE__*/isValidElement(node.label) && !((_node$data = node.data) !== null && _node$data !== void 0 && _node$data.text) ? "" : String(((_node$data2 = node.data) === null || _node$data2 === void 0 ? void 0 : _node$data2.text) || node.label) }, /* @__PURE__ */React.createElement("span", { style: { position: "relative" } }, labelText)); }; var renderOperations = function renderOperations() { var operationsView = null; if (operations) { if (/*#__PURE__*/React.isValidElement(operations)) { operationsView = operations; } else if (operations instanceof Function) { var treeNodeModel = node === null || node === void 0 ? void 0 : node.getModel(); operationsView = operations(treeNodeModel); } else { throw new Error("invalid type of operations"); } } if (operationsView) { return /* @__PURE__ */React.createElement("span", { className: treeClassNames.treeOperations, "data-target": "operations" }, operationsView); } return null; }; var _useDraggable = useDraggable({ node: node, nodeRef: nodeRef, allowDrop: allowDrop }), setDragStatus = _useDraggable.setDragStatus, isDragging = _useDraggable.isDragging, dropPosition = _useDraggable.dropPosition, isDragOver = _useDraggable.isDragOver; var handleDragStart = function handleDragStart(evt) { var node2 = props.node; if (!node2.isDraggable()) return; evt.stopPropagation(); setDragStatus("dragStart", evt); try { var _evt$dataTransfer; (_evt$dataTransfer = evt.dataTransfer) === null || _evt$dataTransfer === void 0 || _evt$dataTransfer.setData("text/plain", ""); } catch (e) {} }; var handleDragEnd = function handleDragEnd(evt) { var node2 = props.node; if (!node2.isDraggable()) return; evt.stopPropagation(); setDragStatus("dragEnd", evt); }; var handleDragOver = function handleDragOver(evt) { var node2 = props.node; if (!node2.isDraggable()) return; evt.stopPropagation(); evt.preventDefault(); setDragStatus("dragOver", evt); }; var handleDragLeave = function handleDragLeave(evt) { var node2 = props.node; if (!node2.isDraggable()) return; evt.stopPropagation(); setDragStatus("dragLeave", evt); }; var handleDrop = function handleDrop(evt) { var node2 = props.node; if (!node2.isDraggable()) return; evt.stopPropagation(); evt.preventDefault(); setDragStatus("drop", evt); }; return /* @__PURE__ */React.createElement("div", { ref: composeRefs(ref, nodeRef), "data-value": node.value, "data-level": level, className: classNames(treeClassNames.treeNode, _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, treeClassNames.treeNodeOpen, node.expanded), treeClassNames.actived, node.isActivable() ? node.actived : false), treeClassNames.disabled, node.isDisabled()), treeClassNames.treeNodeDraggable, !node.isDisabled() && node.isDraggable()), treeClassNames.treeNodeDragging, isDragging), treeClassNames.treeNodeDragTipTop, isDragOver && dropPosition < 0), treeClassNames.treeNodeDragTipBottom, isDragOver && dropPosition > 0), treeClassNames.treeNodeDragTipHighlight, !isDragging && isDragOver && dropPosition === 0)), style: { "--level": level, boxShadow: "" }, onClick: handleClick, draggable: !node.isDisabled() && node.isDraggable(), onDragStart: handleDragStart, onDragEnd: handleDragEnd, onDragOver: handleDragOver, onDragLeave: handleDragLeave, onDrop: handleDrop }, renderLine(), renderIcon(), renderLabel(), renderOperations()); }); TreeItem.displayName = "TreeItem"; export { TreeItem as default }; //# sourceMappingURL=TreeItem.js.map