UNPKG

tntd

Version:

tntd是基于 TNT Design 设计体系的 React UI 组件库,主要用于研发企业级中后台产品。

406 lines (404 loc) 16.1 kB
"use strict"; function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _uniq2 = _interopRequireDefault(require("lodash/uniq")); var _react = _interopRequireWildcard(require("react")); var _LocaleReceiver = _interopRequireDefault(require("antd/lib/locale-provider/LocaleReceiver")); var _rcVirtualList = _interopRequireDefault(require("rc-virtual-list")); var _icon = _interopRequireDefault(require("../icon")); var _ellipsis = _interopRequireDefault(require("../ellipsis")); var _empty = _interopRequireDefault(require("../empty")); var _checkbox = _interopRequireDefault(require("../checkbox")); var _en_US = _interopRequireDefault(require("../locale/en_US")); var _utils = require("./utils"); require("./index.less"); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; } function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } /* * @Descripttion: 基于antd3 tree 部分api实现的tree,增加了虚拟滚动 * @Author: 郑泳健 * @Date: 2024-07-31 14:46:55 * @LastEditors: 郑泳健 * @LastEditTime: 2026-03-05 16:03:12 */ var VirtualTree = function VirtualTree(_ref) { var _ref$indent = _ref.indent, indent = _ref$indent === void 0 ? 24 : _ref$indent, isOrg = _ref.isOrg, showPrefixIcon = _ref.showPrefixIcon, value = _ref.value, _ref$itemHeight = _ref.itemHeight, itemHeight = _ref$itemHeight === void 0 ? 32 : _ref$itemHeight, height = _ref.height, filterKey = _ref.filterKey, treeData = _ref.treeData, checkable = _ref.checkable, checkStrictly = _ref.checkStrictly, checkedKeys = _ref.checkedKeys, _ref$defaultExpandAll = _ref.defaultExpandAll, defaultExpandAll = _ref$defaultExpandAll === void 0 ? true : _ref$defaultExpandAll, expandedKeys = _ref.expandedKeys, fieldNames = _ref.fieldNames, titleRender = _ref.titleRender, onCheck = _ref.onCheck, onExpand = _ref.onExpand, onSelect = _ref.onSelect; var ref = _react["default"].useRef(null); var expandChangedRef = (0, _react.useRef)(0); var checkedChangeRef = (0, _react.useRef)(0); // 展开的节点列表 var _useState = (0, _react.useState)([]), _useState2 = _slicedToArray(_useState, 2), expandedList = _useState2[0], setExpandedList = _useState2[1]; // checked 节点列表 var _useState3 = (0, _react.useState)([]), _useState4 = _slicedToArray(_useState3, 2), checkedList = _useState4[0], setCheckedList = _useState4[1]; // 当前被选中的节点 var _useState5 = (0, _react.useState)(undefined), _useState6 = _slicedToArray(_useState5, 2), choosedValue = _useState6[0], setChoosedValue = _useState6[1]; (0, _react.useEffect)(function () { if (!checkable) { setChoosedValue(value); } }, [value, checkable]); /** 给每个节点增加属性keys,值为其下面所有节点的集合 */ var treeDataWithKeys = (0, _react.useMemo)(function () { return (0, _utils.addTreeNodeAttrs)(treeData, fieldNames); }, [treeData, fieldNames]); /** 默认是否全部展开 */ var mergeDefaultExpandAll = (0, _react.useMemo)(function () { if (Array.isArray(expandedKeys)) { return false; } return defaultExpandAll; }, [defaultExpandAll, expandedKeys]); /** 获取到所有选中的节点,因为checkedKeys可能传入的是最后一级 */ (0, _react.useEffect)(function () { // 非第一次 if (checkedChangeRef.current > 0) { setCheckedList(checkedKeys); return; } if (checkable) { // 如果是受控 if (checkStrictly) { setCheckedList((0, _uniq2["default"])(Array.isArray(checkedKeys) ? checkedKeys : [])); return; } var transCheckedKeys = Array.isArray(checkedKeys) ? checkedKeys.reduce(function (total, item) { total.push(item); var _ref2 = (0, _utils.findNodeDetail)(treeDataWithKeys, item) || {}, needCheckedChildrenValues = _ref2.needCheckedChildrenValues; total = [].concat(_toConsumableArray(total), _toConsumableArray(needCheckedChildrenValues)); return total; }, []) : []; var _checkedKeys = (0, _utils.getFullCheckedKeys)(treeDataWithKeys, transCheckedKeys); setCheckedList((0, _uniq2["default"])(_checkedKeys)); } }, [treeDataWithKeys, checkStrictly, checkable, checkedKeys]); (0, _react.useEffect)(function () { setExpandedList(expandedKeys); }, [expandedKeys]); /** 初始化获取到所有展开的节点,因为初始化expandedKeys可能传入的是最后一级 */ (0, _react.useEffect)(function () { if (expandChangedRef.current === 0) { // 展开的节点 var transExpandedKeys = Array.isArray(expandedKeys) ? expandedKeys : []; var _expandedKeys = (0, _utils.getFullExpandedKeys)(treeDataWithKeys, transExpandedKeys, mergeDefaultExpandAll); setExpandedList(_expandedKeys); } }, [treeDataWithKeys, expandedKeys, mergeDefaultExpandAll]); /** 最终渲染的数据 */ var renderData = (0, _react.useMemo)(function () { return (0, _utils.flatTreeData)(treeDataWithKeys, filterKey, expandedList); }, [treeDataWithKeys, filterKey, expandedList]); /** 切换展开/收起 */ var handleToggle = function handleToggle(item) { expandChangedRef.current++; var _ref3 = item || {}, value = _ref3.value; var bool = Array.isArray(expandedList) ? expandedList.includes(value) : false; if (bool) { var list = Array.isArray(expandedList) ? expandedList.filter(function (i) { return i !== value; }) : []; if (onExpand) { onExpand((0, _uniq2["default"])(list), { node: item, expanded: !bool }); return; } setExpandedList((0, _uniq2["default"])(list)); } else { var arr = (0, _uniq2["default"])([].concat(_toConsumableArray(expandedList), [value])); if (onExpand) { onExpand(arr, { node: item, expanded: !bool }); return; } setExpandedList(arr); } }; var handleCheck = function handleCheck(item, isChecked) { var _value = item.value, children = item.children, disabled = item.disabled; if (disabled) { return; } checkedChangeRef.current++; // 需要增删的子节点 var itemChildrenValues = Array.isArray(children) && !!children.length ? item.needCheckedChildrenValues : []; if (isChecked) { // 需要删除的父节点 var itemParentValues = Array.isArray(item.needCheckedSiblingsValue) ? item.needCheckedSiblingsValue.map(function (i) { return i.key; }) : []; // 当前节点所有的父节点 var delList = checkStrictly ? [_value] : [].concat(_toConsumableArray(itemChildrenValues), _toConsumableArray(itemParentValues), [_value]); var _checkedList = checkedList.filter(function (i) { return !delList.includes(i); }); if (onCheck) { onCheck === null || onCheck === void 0 ? void 0 : onCheck((0, _uniq2["default"])(_checkedList), item, !isChecked); return; } setCheckedList((0, _uniq2["default"])(_checkedList)); } else { // 递归循环其上级是否也要被选中 var _itemParentValues = (0, _utils.getNodeParentChoosed)(item.needCheckedSiblingsValue, [].concat(_toConsumableArray(checkedList), _toConsumableArray(itemChildrenValues), [_value])); var addList = checkStrictly ? [_value] : [].concat(_toConsumableArray(itemChildrenValues), _toConsumableArray(_itemParentValues), [_value]); var _checkedList2 = [].concat(_toConsumableArray(checkedList), _toConsumableArray(addList)); if (onCheck) { onCheck === null || onCheck === void 0 ? void 0 : onCheck((0, _uniq2["default"])(_checkedList2), item, !isChecked); return; } setCheckedList((0, _uniq2["default"])(_checkedList2)); } }; var handleChoosed = function handleChoosed(item) { if (item.disabled) { return; } setChoosedValue(item.value); if (!checkable) { onSelect === null || onSelect === void 0 ? void 0 : onSelect(item.value); } }; var renderOrgItem = function renderOrgItem(item, locale) { var mapResult = { 1: { icon: 'crowd' }, 2: { icon: 'corporation' } }; var result = mapResult[item === null || item === void 0 ? void 0 : item.orgAttribute] || {}; return _react["default"].createElement("div", { className: "org-item-wrapper" }, showPrefixIcon ? _react["default"].createElement(_icon["default"], { type: result === null || result === void 0 ? void 0 : result['icon'], style: { marginTop: 3, marginRight: 4 } }) : '', _react["default"].createElement(_ellipsis["default"], { title: item.title, widthLimit: '100%' }), String(item.orgAttribute) === '1' && _react["default"].createElement("span", { className: "org-functional-departemt-marker" }, locale.functionalDep || '职能部门')); }; var defaultRenderItem = function defaultRenderItem(item) { var isOrg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; var locale = arguments.length > 2 ? arguments[2] : undefined; if (isOrg) { return renderOrgItem(item, locale); } return _react["default"].createElement(_ellipsis["default"], { title: item.title, widthLimit: '100%' }); }; var adjustHeight = (0, _react.useMemo)(function () { if (Array.isArray(renderData)) { if (renderData.length >= 10) { return height; } return itemHeight * renderData.length; } return 100; }, [renderData, itemHeight, height]); return _react["default"].createElement("div", { className: "tntd-virtual-tree" }, !Array.isArray(renderData) || !renderData.length ? _react["default"].createElement(_empty["default"], { size: "small" }) : _react["default"].createElement(_LocaleReceiver["default"], { componentName: "TntdVirtualTree", defaultLocale: _en_US["default"].TntdVirtualTree }, function (locale) { return _react["default"].createElement(_rcVirtualList["default"], { ref: ref, height: adjustHeight || 300, itemHeight: itemHeight, data: renderData, itemKey: 'value' }, function (item) { var indexLevel = item.indexLevel, children = item.children, disabled = item.disabled; var bool = Array.isArray(expandedList) ? expandedList.includes(item.value) : false; // 当前节点半选状态 var indeterminateStatus = (0, _utils.getIndeterminate)(item, checkedList); // 当前节点是否被选中 var checkedBingo = Array.isArray(checkedList) ? checkedList.includes(item.value) : false; var isChecked = !checkStrictly || disabled ? checkedBingo && !indeterminateStatus : checkedBingo; var hasChild = Array.isArray(children) && !!children.length; var checkBoxAttrs = { className: "".concat(disabled ? 'tntd-virtual-tree-checkbox-disabled' : ''), onChange: function onChange() { return handleCheck(item, isChecked); }, checked: isChecked, disabled: disabled }; // 状态没有半选模式 if (!checkStrictly) { checkBoxAttrs.indeterminate = indeterminateStatus; } return _react["default"].createElement("div", { className: "tntd-virtual-tree-item ".concat(disabled ? 'tntd-virtual-tree-item_disabled' : '', " ").concat(choosedValue === item.value ? 'tntd-virtual-tree-item_active' : ''), key: item.value }, _react["default"].createElement("div", { style: { paddingLeft: indexLevel !== 0 ? indexLevel * indent - 4 : 0, width: '100%' } }, _react["default"].createElement("div", { className: "tntd-virtual-tree-item-expand-icon" }, hasChild ? _react["default"].createElement(_icon["default"], { type: bool ? 'caret-down' : 'caret-right', onClick: function onClick() { return handleToggle(item); } }) : ''), checkable ? _react["default"].createElement("div", { className: "tntd-virtual-tree-item-checkbox" }, _react["default"].createElement(_checkbox["default"], Object.assign({}, checkBoxAttrs))) : '', _react["default"].createElement("div", { className: "tntd-virtual-tree-title", style: { marginLeft: isOrg && !hasChild ? 0 : 0 }, onClick: function onClick() { return handleChoosed(item); } }, titleRender ? titleRender(item) : defaultRenderItem(item, isOrg, locale)))); }); })); }; var _default = exports["default"] = VirtualTree;