tntd
Version:
tntd是基于 TNT Design 设计体系的 React UI 组件库,主要用于研发企业级中后台产品。
406 lines (404 loc) • 16.1 kB
JavaScript
;
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;