UNPKG

acud

Version:

acg react 组件库

425 lines (424 loc) • 17.9 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _react = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _immutabilityHelper = _interopRequireDefault(require("immutability-helper")); var _OutlinedDrag = _interopRequireDefault(require("acud-icon/lib/icons/OutlinedDrag")); var _OutlinedEdit = _interopRequireDefault(require("acud-icon/lib/icons/OutlinedEdit")); var _OutlinedDelete = _interopRequireDefault(require("acud-icon/lib/icons/OutlinedDelete")); var _OutlinedPlus = _interopRequireDefault(require("acud-icon/lib/icons/OutlinedPlus")); var _rcTree = _interopRequireWildcard(require("rc-tree")); var _input = _interopRequireDefault(require("../input")); var _popover = _interopRequireDefault(require("../popover")); var _nodeHelper = require("./utils/nodeHelper"); var _iconHelper = require("./utils/iconHelper"); var _dragHelper = require("./utils/dragHelper"); var _configProvider = require("../config-provider"); var _PopoverComponent = _interopRequireDefault(require("./PopoverComponent")); function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); } var DataChangeType; (function (DataChangeType) { DataChangeType["SAVE"] = "save"; DataChangeType["EDITINPUTCHANGE"] = "editInputChange"; DataChangeType["DELETE"] = "delete"; DataChangeType["ADD"] = "add"; DataChangeType["DROP"] = "drop"; })(DataChangeType || (DataChangeType = {})); var UtilType; (function (UtilType) { UtilType["Add"] = "Add"; UtilType["Edit"] = "Edit"; UtilType["Delete"] = "Delete"; })(UtilType || (UtilType = {})); ; var generateList = function generateList(data) { var dataList = []; var _helper = function helper(data) { for (var i = 0; i < data.length; i++) { var node = data[i]; var key = node.key; dataList.push({ key: key, title: key }); if (node.children) { _helper(node.children); } } }; _helper(data); return dataList; }; var handleClickAndDbClick = function handleClickAndDbClick(clickFunc, dbClickFunc, time) { var count = 0; return function () { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } count++; setTimeout(function () { if (count === 1) { clickFunc.apply(void 0, args); } else if (count === 2) { dbClickFunc.apply(void 0, args); } ; count = 0; }, time); }; }; var isSearchTitle = function isSearchTitle(title) { return typeof title === 'string' || typeof title === 'number'; }; var isUtilType = function isUtilType(val) { return typeof val === 'string' && val in UtilType; }; var DEFAULT_POPOVER_UTIL = [{ text: '新建节点', onClick: UtilType.Add }, { text: '编辑节点', onClick: UtilType.Edit }, { text: '删除节点', onClick: UtilType.Delete }]; var Tree = /*#__PURE__*/_react["default"].forwardRef(function (props, ref) { var _props$selectable = props.selectable, selectable = _props$selectable === void 0 ? true : _props$selectable, searchable = props.searchable, searchPlaceholder = props.searchPlaceholder, _props$checkable = props.checkable, checkable = _props$checkable === void 0 ? false : _props$checkable, editable = props.editable, editInputProps = props.editInputProps, draggable = props.draggable, showIconUtil = props.showIconUtil, showPopoverUtil = props.showPopoverUtil, _props$customPopoverU = props.customPopoverUtil, customPopoverUtil = _props$customPopoverU === void 0 ? DEFAULT_POPOVER_UTIL : _props$customPopoverU, customizePrefixCls = props.prefixCls, className = props.className, showLine = props.showLine, _switcherIcon = props.switcherIcon, onDataChange = props.onDataChange, treeDataOrigin = props.treeData, defaultExpandedKeys = props.defaultExpandedKeys, expandedKeysInProps = props.expandedKeys, titleEllipsis = props.titleEllipsis, popoverZIndex = props.popoverZIndex; var _useState = (0, _react.useState)(expandedKeysInProps || defaultExpandedKeys || []), _useState2 = (0, _slicedToArray2["default"])(_useState, 2), expandedKeys = _useState2[0], setExpandedKeys = _useState2[1]; var _useState3 = (0, _react.useState)(true), _useState4 = (0, _slicedToArray2["default"])(_useState3, 2), autoExpandParent = _useState4[0], setAutoExpandParent = _useState4[1]; var _useState5 = (0, _react.useState)([]), _useState6 = (0, _slicedToArray2["default"])(_useState5, 2), treeData = _useState6[0], setTreeData = _useState6[1]; var _useState7 = (0, _react.useState)(), _useState8 = (0, _slicedToArray2["default"])(_useState7, 2), searchText = _useState8[0], setSearchText = _useState8[1]; var _useState9 = (0, _react.useState)(false), _useState0 = (0, _slicedToArray2["default"])(_useState9, 2), searchFound = _useState0[0], setSearchFound = _useState0[1]; var treeRef = /*#__PURE__*/_react["default"].createRef(); _react["default"].useImperativeHandle(ref, function () { return treeRef.current; }); var dataList = (0, _react.useMemo)(function () { return generateList(treeData); }, [treeData]); var draggableConfig = (0, _react.useMemo)(function () { if (!draggable) { return false; } return { icon: /*#__PURE__*/_react["default"].createElement(_OutlinedDrag["default"], null) }; }, [draggable]); var onExpand = function onExpand(expandedKeysValue, info) { var _a; setExpandedKeys(expandedKeysValue); setAutoExpandParent(false); return (_a = props.onExpand) === null || _a === void 0 ? void 0 : _a.call(props, expandedKeysValue, info); }; var onClick = function onClick(event, node) { var _a; if (node.children && !selectable) { treeRef.current.onNodeExpand(event, node); } (_a = props.onClick) === null || _a === void 0 ? void 0 : _a.call(props, event, node); }; var onSearchInputChange = function onSearchInputChange(event) { var value = event.target.value; var found = false; var expandedKeys = dataList.map(function (item) { if (isSearchTitle(item.title) && item.title.indexOf(value) > -1) { found = true; return (0, _nodeHelper.getParentKey)(item.key, treeData); } return null; }).filter(function (item, i, self) { return item && self.indexOf(item) === i; }); setExpandedKeys(expandedKeys); setSearchText(value); setAutoExpandParent(true); setSearchFound(found); }; var onEditInputChange = (0, _react.useCallback)(function (e, node) { setTreeData(function (treeData) { var newTreeData = (0, _nodeHelper.changeNode)(node, { title: e.target.value }, treeData); onDataChange === null || onDataChange === void 0 ? void 0 : onDataChange(newTreeData, node, DataChangeType.EDITINPUTCHANGE); return newTreeData; }); }, [onDataChange]); var onQuickEdit = function onQuickEdit(_, node) { if (editable) { setTreeData((0, _nodeHelper.editNode)(node, treeData)); } }; var onSave = (0, _react.useCallback)(function (node) { setTreeData(function (treeData) { var newTreeData = (0, _nodeHelper.saveNode)(node, treeData); onDataChange === null || onDataChange === void 0 ? void 0 : onDataChange(newTreeData, node, DataChangeType.SAVE); return newTreeData; }); }, [onDataChange]); var onDelete = (0, _react.useCallback)(function (node) { setTreeData(function (treeData) { var newTreeData = (0, _nodeHelper.deleteNode)(node, treeData).filter(function (item) { return item !== null; }); onDataChange === null || onDataChange === void 0 ? void 0 : onDataChange(newTreeData, node, DataChangeType.DELETE); return newTreeData; }); }, [onDataChange]); var onAdd = (0, _react.useCallback)(function (node) { setTreeData(function (treeData) { var newTreeData = (0, _nodeHelper.addNode)(node, treeData); onDataChange === null || onDataChange === void 0 ? void 0 : onDataChange(newTreeData, node, DataChangeType.ADD); return newTreeData; }); setExpandedKeys(function (expandedKeys) { return (0, _toConsumableArray2["default"])(new Set([].concat((0, _toConsumableArray2["default"])(expandedKeys), [node.key]))); }); }, [onDataChange]); var onDrop = function onDrop(info) { var _a, _b; var dropKey = info.node.key; var dragKey = info.dragNode.key; var dropPos = info.node.pos.split('-'); var dropPosition = info.dropPosition - Number(dropPos[dropPos.length - 1]); var _loop = function loop(data, key, callback) { for (var i = 0; i < data.length; i++) { if (data[i].key === key) { return callback(data[i], i, data); } var children = data[i].children; if (children) { _loop(children, key, callback); } } }; var data = (0, _toConsumableArray2["default"])(treeData); // Find dragObject var dragObj = data[0]; _loop(data, dragKey, function (item, index, arr) { arr.splice(index, 1); dragObj = item; }); if (dropPosition === 0) { // Drop on the content _loop(data, dropKey, function (item) { item.children = item.children || []; item.children.unshift(dragObj); }); } else { var ar = data; var i = 0; _loop(data, dropKey, function (_, index, arr) { ar = arr; i = index; }); if (dropPosition === -1) { ar.splice(i, 0, dragObj); } else { ar.splice(i + 1, 0, dragObj); } } setTreeData(data); (_a = props.onDataChange) === null || _a === void 0 ? void 0 : _a.call(props, data, info.node, DataChangeType.DROP); (_b = props.onDrop) === null || _b === void 0 ? void 0 : _b.call(props, info); }; var handleClick = handleClickAndDbClick(onClick, onQuickEdit, 200); var _React$useContext = _react["default"].useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls; var prefixCls = getPrefixCls('tree', customizePrefixCls); var formatTreeData = (0, _react.useCallback)(function (data) { if (Array.isArray(data)) { var res = []; for (var i = 0; i < data.length; i++) { res[i] = formatTreeData(data[i]); } return res; } var newItem; var renderTitle; if (data.isEditable && isSearchTitle(data.title)) { renderTitle = /*#__PURE__*/_react["default"].createElement("div", { className: "".concat(prefixCls, "-edit-input") }, /*#__PURE__*/_react["default"].createElement(_input["default"], (0, _extends2["default"])({}, editInputProps, { value: data.title, onChange: function onChange(e) { return onEditInputChange(e, data); }, onBlur: function onBlur() { return onSave(data); }, size: 'small', autoFocus: true }))); } else { var title = data.title; if (isSearchTitle(title) && searchText) { var index = title.indexOf(searchText); var beforeStr = title.substr(0, index); var afterStr = title.substr(index + searchText.length); title = index > -1 ? /*#__PURE__*/_react["default"].createElement("span", null, beforeStr, /*#__PURE__*/_react["default"].createElement("span", { className: "".concat(prefixCls, "-node-highlighttext") }, searchText), afterStr) : /*#__PURE__*/_react["default"].createElement("span", null, title); } var handleAdd = function handleAdd() { return onAdd(data); }; var handleEdit = function handleEdit() { setTreeData(function (treeData) { return (0, _nodeHelper.editNode)(data, treeData); }); }; var handleDelete = function handleDelete() { return onDelete(data); }; var onClickMap = { Add: handleAdd, Edit: handleEdit, Delete: handleDelete }; var customPopoverUtilArray = Array.isArray(customPopoverUtil) ? customPopoverUtil : customPopoverUtil(data); var popoverContent = customPopoverUtilArray.map(function (item) { var liProps = (0, _extends2["default"])((0, _extends2["default"])({ key: item.key || item.text }, !item.disabled && { onClick: isUtilType(item.onClick) ? onClickMap[item.onClick] : function () { return item.onClick(data, treeData); } }), item.disabled && { className: "".concat(prefixCls, "-popover-util-li-disabled") }); return /*#__PURE__*/_react["default"].createElement("li", liProps, item.text); }); var titleContent = /*#__PURE__*/_react["default"].createElement("span", { className: "".concat(prefixCls, "-title-titleContent") }, title); renderTitle = /*#__PURE__*/_react["default"].createElement("span", { className: "".concat(prefixCls, "-title-titleWithOps") }, titleEllipsis ? /*#__PURE__*/_react["default"].createElement(_popover["default"], { zIndex: popoverZIndex === undefined ? 1051 : popoverZIndex, content: title }, titleContent) : titleContent, showIconUtil && editable && /*#__PURE__*/_react["default"].createElement("span", { className: "".concat(prefixCls, "-icon-util") }, /*#__PURE__*/_react["default"].createElement(_OutlinedPlus["default"], { onClick: handleAdd }), /*#__PURE__*/_react["default"].createElement(_OutlinedEdit["default"], { onClick: handleEdit }), /*#__PURE__*/_react["default"].createElement(_OutlinedDelete["default"], { onClick: handleDelete })), (showPopoverUtil && editable || customPopoverUtil !== DEFAULT_POPOVER_UTIL) && /*#__PURE__*/_react["default"].createElement("span", { className: "".concat(prefixCls, "-icon-util") }, /*#__PURE__*/_react["default"].createElement(_PopoverComponent["default"], { prefixCls: prefixCls, popoverZIndex: popoverZIndex, popoverContent: popoverContent }))); } newItem = (0, _immutabilityHelper["default"])(data, { $merge: { title: renderTitle } }); if (data.children) { newItem = (0, _immutabilityHelper["default"])(newItem, { $merge: { children: formatTreeData(data.children) } }); } return newItem; }, [editable, onDelete, onSave, onAdd, onEditInputChange, showIconUtil, showPopoverUtil, searchText, prefixCls, customPopoverUtil, titleEllipsis, popoverZIndex]); var formatedTreeData = (0, _react.useMemo)(function () { return formatTreeData(treeData); }, [treeData, formatTreeData]); var classes = (0, _classnames["default"])(prefixCls, className, titleEllipsis ? "".concat(prefixCls, "-with-title-ellipsis") : ''); // 兼容不传treeData数据直接传treeNode子组件的场景 var newProps = (0, _extends2["default"])({}, props); if (treeDataOrigin) { newProps.treeData = formatedTreeData; } // expandedKeys和defaultExpandAll冲突需动态赋值 if (props && props.defaultExpandAll) { if (expandedKeys.length) { newProps.expandedKeys = expandedKeys; } } else { newProps.expandedKeys = expandedKeys; } (0, _react.useEffect)(function () { if (Array.isArray(treeDataOrigin)) { setTreeData(treeDataOrigin); } }, [treeDataOrigin]); (0, _react.useEffect)(function () { Array.isArray(expandedKeysInProps) && setExpandedKeys(expandedKeysInProps); }, [expandedKeysInProps]); return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, searchable && /*#__PURE__*/_react["default"].createElement(_input["default"], { placeholder: searchPlaceholder, className: "".concat(prefixCls, "-search-input"), onChange: onSearchInputChange }), searchText && !searchFound ? "\u672A\u627E\u5230\u4E0E".concat(searchText, "\u76F8\u5173\u7684\u7ED3\u679C") : (!treeDataOrigin || !!formatedTreeData.length) && /*#__PURE__*/_react["default"].createElement(_rcTree["default"], (0, _extends2["default"])({ ref: treeRef }, newProps, { className: classes, prefixCls: prefixCls, onClick: handleClick, onExpand: onExpand, onDrop: onDrop, checkable: checkable ? /*#__PURE__*/_react["default"].createElement("span", { className: "".concat(prefixCls, "-checkbox-inner") }) : checkable, autoExpandParent: autoExpandParent, switcherIcon: function switcherIcon(nodeProps) { return (0, _iconHelper.renderSwitcherIcon)(prefixCls, _switcherIcon, showLine, nodeProps); }, dropIndicatorRender: _dragHelper.dropIndicatorRender, draggable: draggableConfig }))); }); Tree.TreeNode = _rcTree.TreeNode; var _default = exports["default"] = Tree;