rsuite
Version:
A suite of react components
451 lines (353 loc) • 11.4 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports.shouldShowNodeByExpanded = shouldShowNodeByExpanded;
exports.flattenTree = flattenTree;
exports.getNodeParents = getNodeParents;
exports.getVirtualLisHeight = getVirtualLisHeight;
exports.hasVisibleChildren = hasVisibleChildren;
exports.treeDeprecatedWarning = treeDeprecatedWarning;
exports.compareArray = compareArray;
exports.getExpandAll = getExpandAll;
exports.getExpandItemValues = getExpandItemValues;
exports.getExpandState = getExpandState;
exports.getDragNodeKeys = getDragNodeKeys;
exports.calDropNodePosition = calDropNodePosition;
exports.removeDragNode = removeDragNode;
exports.createUpdateTreeDataFunction = createUpdateTreeDataFunction;
exports.findNodeOfTree = findNodeOfTree;
exports.filterNodesOfTree = filterNodesOfTree;
exports.getExpandWhenSearching = getExpandWhenSearching;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _isEmpty2 = _interopRequireDefault(require("lodash/isEmpty"));
var _clone2 = _interopRequireDefault(require("lodash/clone"));
var _isNil2 = _interopRequireDefault(require("lodash/isNil"));
var _isUndefined2 = _interopRequireDefault(require("lodash/isUndefined"));
var _isArray2 = _interopRequireDefault(require("lodash/isArray"));
var _intersection2 = _interopRequireDefault(require("lodash/intersection"));
var _shallowEqual = _interopRequireDefault(require("../utils/shallowEqual"));
var _shallowEqualArray = _interopRequireDefault(require("../utils/shallowEqualArray"));
var _constants = require("../constants");
var SEARCH_BAR_HEIGHT = 48;
var MENU_PADDING = 12; // Tree Node 之间的 间隔
var TREE_NODE_GAP = 4;
/**
* 判断当前节点是否应该显示
* @param {*} expandItemValues
* @param {*} parentKeys
*/
function shouldShowNodeByExpanded(expandItemValues, parentKeys) {
if (expandItemValues === void 0) {
expandItemValues = [];
}
if (parentKeys === void 0) {
parentKeys = [];
}
var intersectionKeys = (0, _intersection2.default)(expandItemValues, parentKeys);
if (intersectionKeys.length === parentKeys.length) {
return true;
}
return false;
}
/**
* 拍平树结构为数组
* @param {*} tree
* @param {*} childrenKey
* @param {*} executor
*/
function flattenTree(tree, childrenKey, executor) {
if (childrenKey === void 0) {
childrenKey = 'children';
}
var flattenData = [];
var traverse = function traverse(data, parent) {
if (!(0, _isArray2.default)(data)) {
return;
}
data.forEach(function (item, index) {
var node = typeof executor === 'function' ? executor(item, index) : item;
node.parent = parent;
flattenData.push((0, _extends2.default)({}, node));
if (item[childrenKey]) {
traverse(item[childrenKey], item);
}
});
};
traverse(tree, null);
return flattenData;
}
/**
* 获取树节点所有的祖先节点
* @param {*} node
*/
function getNodeParents(node, parentKey, valueKey) {
if (parentKey === void 0) {
parentKey = 'parent';
}
var parents = [];
var traverse = function traverse(node) {
if (node === null || node === void 0 ? void 0 : node[parentKey]) {
traverse(node[parentKey]);
if (valueKey) {
parents.push(node[parentKey][valueKey]);
} else {
parents.push(node[parentKey]);
}
}
};
traverse(node);
return parents;
}
/**
* 获取 VirtualList 的高度
* @param {*} inline
* @param {*} height
*/
function getVirtualLisHeight(inline, searchable, height) {
if (height === void 0) {
height = 0;
}
var searchBarHeight = searchable ? SEARCH_BAR_HEIGHT : 0;
return inline ? height - MENU_PADDING * 2 : height - searchBarHeight - MENU_PADDING * 2;
}
/**
* 判断节点是否存在可见的子节点。
* @param node
*/
function hasVisibleChildren(node, childrenKey) {
if (!Array.isArray(node[childrenKey])) {
return false;
}
return node[childrenKey].some(function (child) {
return child.visible;
});
}
/**
* 废弃 prop warning
* @param prop
*/
function treeDeprecatedWarning(props, keys) {
if (keys === void 0) {
keys = [];
}
keys.forEach(function (key) {
if (!(0, _isUndefined2.default)(props[key])) {
console.warn("'Warning: " + key + " is deprecated and will be removed in a future release.'");
}
});
}
/**
* 浅比较两个数组是否不一样
* @param a
* @param b
*/
function compareArray(a, b) {
return (0, _isArray2.default)(a) && (0, _isArray2.default)(b) && !(0, _shallowEqualArray.default)(a, b);
}
/**
* 获取 expandAll 的 value
* @param props
*/
function getExpandAll(props) {
var expandAll = props.expandAll,
defaultExpandAll = props.defaultExpandAll;
return !(0, _isUndefined2.default)(expandAll) ? expandAll : defaultExpandAll;
}
/**
* 获取 expandItemValues 的 value
* @param props
*/
function getExpandItemValues(props) {
var expandItemValues = props.expandItemValues,
defaultExpandItemValues = props.defaultExpandItemValues;
if (!(0, _isUndefined2.default)(expandItemValues) && Array.isArray(expandItemValues)) {
return expandItemValues;
}
if (!(0, _isUndefined2.default)(defaultExpandItemValues) && Array.isArray(defaultExpandItemValues)) {
return defaultExpandItemValues;
}
return [];
}
/**
* 获取节点展开状态
* @param node
* @param props
*/
function getExpandState(node, props) {
var _node$childrenKey;
var valueKey = props.valueKey,
childrenKey = props.childrenKey,
expandItemValues = props.expandItemValues;
var expandAll = getExpandAll(props);
var expand = getExpandItemValues(props).some(function (value) {
return (0, _shallowEqual.default)(node[valueKey], value);
});
if (!(0, _isUndefined2.default)(expandItemValues)) {
return expand;
} else if ((_node$childrenKey = node[childrenKey]) === null || _node$childrenKey === void 0 ? void 0 : _node$childrenKey.length) {
if (!(0, _isNil2.default)(node.expand)) {
return !!node.expand;
} else if (expandAll) {
return true;
}
return false;
}
return false;
}
/**
* 获取拖拽节点及子节点的key
* @param node
* @param childrenKey
* @param valueKey
*/
function getDragNodeKeys(dragNode, childrenKey, valueKey) {
var dragNodeKeys = [dragNode[valueKey]];
var traverse = function traverse(data) {
if ((data === null || data === void 0 ? void 0 : data.length) > 0) {
data.forEach(function (node) {
dragNodeKeys = dragNodeKeys.concat([node[valueKey]]);
if (node[childrenKey]) {
traverse(node[childrenKey]);
}
});
}
};
traverse(dragNode[childrenKey]);
return dragNodeKeys;
}
function calDropNodePosition(event, treeNodeElement) {
var clientY = event.clientY;
var _treeNodeElement$getB = treeNodeElement.getBoundingClientRect(),
top = _treeNodeElement$getB.top,
bottom = _treeNodeElement$getB.bottom;
var gap = TREE_NODE_GAP; // 处于节点下方
if (clientY >= bottom - gap && clientY <= bottom) {
return _constants.TREE_NODE_DROP_POSITION.DRAG_OVER_BOTTOM;
} // 处于节点上方
if (clientY <= top + gap && clientY >= top) {
return _constants.TREE_NODE_DROP_POSITION.DRAG_OVER_TOP;
}
if (clientY >= top + gap && clientY <= bottom - gap) {
return _constants.TREE_NODE_DROP_POSITION.DRAG_OVER;
}
return -1;
}
function removeDragNode(data, params, _ref) {
var valueKey = _ref.valueKey,
childrenKey = _ref.childrenKey;
var dragNode = params.dragNode;
var traverse = function traverse(items, parent) {
for (var _index = 0; _index < items.length; _index += 1) {
var item = items[_index];
if ((0, _shallowEqual.default)(item[valueKey], dragNode[valueKey])) {
items.splice(_index, 1); // 当 children 为空,需要删除 children 属性,不显示角标
if (items.length === 0 && parent) {
delete parent.children;
}
break;
}
if (Array.isArray(item[childrenKey])) {
traverse(item[childrenKey], item);
}
}
};
traverse(data);
}
/**
* 移动节点valueKey,先删除 dragNode 原本所在的数据,再将 dragNode 移动到拖动的位置
* @param data
* @param params
*/
function createUpdateTreeDataFunction(params, _ref2) {
var valueKey = _ref2.valueKey,
childrenKey = _ref2.childrenKey;
return function (tree) {
var data = [].concat(tree);
var dragNode = params.dragNode,
dropNode = params.dropNode,
dropNodePosition = params.dropNodePosition;
removeDragNode(data, params, {
valueKey: valueKey,
childrenKey: childrenKey
});
var updateTree = function updateTree(items) {
for (var _index2 = 0; _index2 < items.length; _index2 += 1) {
var item = items[_index2];
if ((0, _shallowEqual.default)(item[valueKey], dropNode[valueKey])) {
// 拖拽到 dropNode内,作为 dropNode 的子节点
if (dropNodePosition === _constants.TREE_NODE_DROP_POSITION.DRAG_OVER) {
item[childrenKey] = (0, _isNil2.default)(item[childrenKey]) ? [] : item[childrenKey];
item[childrenKey].push(dragNode);
break;
} else if (dropNodePosition === _constants.TREE_NODE_DROP_POSITION.DRAG_OVER_TOP) {
// 拖拽到 dropNode 的上面
items.splice(_index2, 0, dragNode);
break;
} else if (dropNodePosition === _constants.TREE_NODE_DROP_POSITION.DRAG_OVER_BOTTOM) {
// 拖拽到 dropNode 的下面
items.splice(_index2 + 1, 0, dragNode);
break;
}
}
if (Array.isArray(item[childrenKey]) && item[childrenKey].length > 0) {
updateTree(item[childrenKey]);
}
}
};
updateTree(data);
return [].concat(data);
};
}
function findNodeOfTree(data, check) {
var findNode = function findNode(nodes) {
if (nodes === void 0) {
nodes = [];
}
for (var i = 0; i < nodes.length; i += 1) {
var item = nodes[i];
if ((0, _isArray2.default)(item.children)) {
var _node = findNode(item.children);
if (_node) {
return _node;
}
}
if (check(item)) {
return item;
}
}
return undefined;
};
return findNode(data);
}
function filterNodesOfTree(data, check) {
var findNodes = function findNodes(nodes) {
if (nodes === void 0) {
nodes = [];
}
var nextNodes = [];
for (var i = 0; i < nodes.length; i += 1) {
if ((0, _isArray2.default)(nodes[i].children)) {
var nextChildren = findNodes(nodes[i].children);
if (nextChildren.length) {
var item = (0, _clone2.default)(nodes[i]);
item.children = nextChildren;
nextNodes.push(item);
continue;
}
}
if (check(nodes[i])) {
nextNodes.push(nodes[i]);
}
}
return nextNodes;
};
return findNodes(data);
}
/**
* 根据是否处于搜索状态来返回 expand 的值。如果处于搜索状态下,则展开所有的节点
* @param searchKeyword
* @param expand
*/
function getExpandWhenSearching(searchKeyword, expand) {
return !(0, _isEmpty2.default)(searchKeyword) ? true : expand;
}