zent
Version:
一套前端设计语言和基于React的实现
106 lines (94 loc) • 2.68 kB
text/typescript
import {
DEFAULT_RENDER_KEY,
TreeRootIdArray,
ITreeData,
ITreeRenderKey,
ITreeRootInfoMap,
} from './common';
// getJudgeInfo
export interface IJudgeInfoParams {
expandAll?: boolean;
checkable?: boolean;
loadMore?: (data: ITreeData) => Promise<any>;
tree: ITreeData[];
renderKey?: ITreeRenderKey;
}
export interface IJudgeInfoReturn {
expandNode: TreeRootIdArray;
rootInfoMap: ITreeRootInfoMap;
}
/**
* 获取必要的判断数据
*
* @param param
* @returns {object} rootInfoMap
* @returns {boolean} rootInfoMap.isExpand
* @returns {boolean} rootInfoMap.isParent
* @returns {number|string} rootInfoMap.id
* @returns {number|string} rootInfoMap.parentId
* @returns {object} rootInfoMap.root
* @returns {array} JudgeInfo.includes 节点的选择联动集合 { nodeId: id[] }
* id[]: [nodeId, nodeId.children[1]Id, nodeId.children[2]Id, .... nodeId.children[1][...].childrenn[N]Id]
* 可以根据当前node的id, 查找它将会影响的子孙节点
*/
export default function getJudgeInfo({
expandAll,
loadMore,
tree,
renderKey = DEFAULT_RENDER_KEY,
}: IJudgeInfoParams): IJudgeInfoReturn {
const expandNode: TreeRootIdArray = [];
const rootInfoMap: ITreeRootInfoMap = {};
const { children, id } = renderKey;
function collector({
nodeTree,
parentId,
}: {
nodeTree: ITreeData[];
parentId?: string | number;
}) {
nodeTree.forEach(item => {
const nodeId = item[id];
// 初始化
rootInfoMap[nodeId] = {
id: nodeId,
parentId,
root: item,
isExpand: false,
isParent: false,
son: (item[children] || []).map((t: ITreeData) => t[id]),
rootIncludeIds: [nodeId],
};
// 是否为父节点
const isParentNode = !!(
!item.isLeaf &&
(loadMore || (item[children] && item[children].length > 0))
);
rootInfoMap[nodeId].isParent = isParentNode;
// 收集expand节点
if (isParentNode && (expandAll || !!item.expand)) {
expandNode.push(nodeId);
}
if (item[children]) {
collector({
nodeTree: item[children],
parentId: nodeId,
});
}
// 收集当前节点能够影响的所有节点(self + children)
if (parentId !== undefined && rootInfoMap[parentId]) {
rootInfoMap[parentId].rootIncludeIds = rootInfoMap[
parentId
].rootIncludeIds.concat(rootInfoMap[nodeId].rootIncludeIds);
}
});
}
collector({
nodeTree: tree,
parentId: undefined,
});
return {
rootInfoMap,
expandNode,
};
}