UNPKG

react-dagre-map-v2

Version:

okr align map, many-to-many relationship

618 lines (487 loc) 26.9 kB
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _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(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } import React, { useState, useEffect, useRef } from 'react'; import NodeCard from "./components/card"; import { ARROW_DIR, DEFAULT_STYLE } from "./enum"; /** * 思路 * 需求:多对多(g6完美契合),事件交互(g6不符合),ui细节(g6不符合)=》手撸 * 页面布局: * 每个初始O的层级为0,向上对齐的--1,被对齐的++1.数据解构 * [ * { 第一个大层级图块,整体高度决定下一图块的起始定位, * 因为每次动态的请求向上或者向下会更新最高高度, * 同时收缩也会更新高度 * [-2.-2.-2.-2.-2.-2], -2 * [-1,-1,-1,-1,-1,-1], -1 * 0, 0 * [1,1,1,1,1,1,1,1,1], 1 * [2,2,2,2,2,2,2,2,2] 2 * } * * { 第2个大层级图块,整体高度决定下一图块的起始定位,动态的 * [-2.-2.-2.-2.-2.-2], -2 * [-1,-1,-1,-1,-1,-1], -1 * 0, 0 * [1,1,1,1,1,1,1,1,1], 1 * [2,2,2,2,2,2,2,2,2] 2 * } * ] * * 每个高度124 ,宽度340,上下间距16,用padding 8,左右 * 高度用定位来做 起始高度+ * * 画曲线要主要 向上对齐的只有左边有收缩右边没有 * 向下的被对齐只有右边有收缩,左边没有 * * 收缩 展开 ,原始 ,操作后,怎么记录 * * * */ // let OFFSET_L = 40; // 整体距离页面左边的初始间距。 // let OFFSET_R = 40; // 整体距离页面右边的初始间距。 // let OFFSET_TOP = 20; // 图层组元素的初始纵向间距 // let NODE_OFFSET_Y = 30; // 每个图层组元素的纵向间距 // let NODE_OFFSET_X = 100; // 元素左右之间间距 100, // let CR = 8; // 收缩展开按钮圆形半径,是元素之外的位置 ,同时距离元素margin也是一个半径. // let NODE_WIDTH = 340; // 元素本身宽度,不包括 340 // let NODE_HEIGHT = 124; // 元素本身宽度,不包括 340 // const OVERALL_WIDTH = NODE_WIDTH + NODE_OFFSET_X; // const OVERALL_HEIGHT = NODE_HEIGHT + 2 * CR; import { jsx as _jsx } from "react/jsx-runtime"; import { jsxs as _jsxs } from "react/jsx-runtime"; var OkrMap = function OkrMap(props) { var _props$data = props.data, data = _props$data === void 0 ? [] : _props$data, renderChild = props.renderChild, _props$offset = props.offset, offset = _props$offset === void 0 ? {} : _props$offset, _props$nodeStyle = props.nodeStyle, nodeStyle = _props$nodeStyle === void 0 ? {} : _props$nodeStyle, _props$fieldNames = props.fieldNames, fieldNames = _props$fieldNames === void 0 ? {} : _props$fieldNames, fetchMoreData = props.fetchMoreData; var _offset$left = offset.left, OFFSET_L = _offset$left === void 0 ? DEFAULT_STYLE.OFFSET_L : _offset$left, _offset$top = offset.top, OFFSET_TOP = _offset$top === void 0 ? DEFAULT_STYLE.OFFSET_TOP : _offset$top, _offset$right = offset.right, OFFSET_R = _offset$right === void 0 ? DEFAULT_STYLE.OFFSET_R : _offset$right; var _nodeStyle$offsetY = nodeStyle.offsetY, NODE_OFFSET_Y = _nodeStyle$offsetY === void 0 ? DEFAULT_STYLE.NODE_OFFSET_Y : _nodeStyle$offsetY, _nodeStyle$offsetX = nodeStyle.offsetX, NODE_OFFSET_X = _nodeStyle$offsetX === void 0 ? DEFAULT_STYLE.NODE_OFFSET_X : _nodeStyle$offsetX, _nodeStyle$width = nodeStyle.width, NODE_WIDTH = _nodeStyle$width === void 0 ? DEFAULT_STYLE.NODE_WIDTH : _nodeStyle$width, _nodeStyle$height = nodeStyle.height, NODE_HEIGHT = _nodeStyle$height === void 0 ? DEFAULT_STYLE.NODE_HEIGHT : _nodeStyle$height, _nodeStyle$circleWidt = nodeStyle.circleWidth, CR = _nodeStyle$circleWidt === void 0 ? DEFAULT_STYLE.CR : _nodeStyle$circleWidt; var OVERALL_WIDTH = NODE_WIDTH + NODE_OFFSET_X; var OVERALL_HEIGHT = NODE_HEIGHT + 2 * CR; var FIELDNAMES = _objectSpread({ id: 'id', up: 'up', down: 'down', upLength: 'upLength', downLength: 'downLength' }, fieldNames); //唯一uuid var uuidRef = useRef(1); // 增加过节点信息的数据(这个数据也能用来初始化) var _useState = useState([]), _useState2 = _slicedToArray(_useState, 2), treeData = _useState2[0], setTreeData = _useState2[1]; // 扁平化的数据 var _useState3 = useState([]), _useState4 = _slicedToArray(_useState3, 2), nodeData = _useState4[0], setNodeData = _useState4[1]; var xRef = useRef(1); // 整体页面的最大排列columns,可以用来计算页面最小宽度,默认最小值有一层根节点(其实也有可能没有,问题不大) var yRef = useRef(OFFSET_TOP); // 整体页面的最大深度(高度) var _useState5 = useState(0), _useState6 = _slicedToArray(_useState5, 2), maxWid = _useState6[0], setMaxWid = _useState6[1]; var _useState7 = useState(0), _useState8 = _slicedToArray(_useState7, 2), maxHei = _useState8[0], setMaxHei = _useState8[1]; var _useState9 = useState({}), _useState10 = _slicedToArray(_useState9, 2), rankInfo = _useState10[0], setRankInfo = _useState10[1]; var _useState11 = useState([]), _useState12 = _slicedToArray(_useState11, 2), edges = _useState12[0], setEdges = _useState12[1]; // 计算div左右2个坐标,元素本身的(曲线起始结束点) var getLinePoint = function getLinePoint(obj) { if (obj.rank === 0) { // 根节点左右2边都有收缩展开的 obj.leftX = obj.left - 3 * CR; // 左边线x应该是 定位位置 - 展开球位置 obj.leftY = obj.top + NODE_HEIGHT / 2; // 左边线x应该是 定位位置 - 展开球位置 obj.rightX = obj.left + NODE_WIDTH + 3 * CR; // 右边线x应该是 定位位置 + 节点宽度+ 展开球位置 obj.rightY = obj.top + NODE_HEIGHT / 2; } else if (obj.rank > 0) { // 被对齐 只有右边的收缩展开球节点 obj.leftX = obj.left; // 左边线x应该是 定位位置 obj.leftY = obj.top + NODE_HEIGHT / 2; // 左边线x应该是 定位位置 - 展开球位置 obj.rightX = obj.left + NODE_WIDTH + 3 * CR; // 右边线x应该是 定位位置 + 节点宽度+ 展开球位置 obj.rightY = obj.top + NODE_HEIGHT / 2; } else if (obj.rank < 0) { // 对齐节点,只有左边收缩展开节点 obj.leftX = obj.left - 3 * CR; // 左边线x应该是 定位位置 - 展开球位置 obj.leftY = obj.top + NODE_HEIGHT / 2; // 左边线x应该是 定位位置 - 展开球位置 obj.rightX = obj.left + NODE_WIDTH; // 右边线x应该是 定位位置 + 节点宽度+ 展开球位置 obj.rightY = obj.top + NODE_HEIGHT / 2; } }; // 配置变现path,收集edges,不需要收集根节点 var configEdges = function configEdges(props) { var source = props.source, target = props.target, direction = props.direction, initEdges = props.initEdges; if (direction === ARROW_DIR.ROOT) { // 根节点不需要绘制 return; } var startX, startY, endX, endY, c1X, c1Y, c2X, c2Y; if (direction === ARROW_DIR.UP) { // target处于左边位置, startX = source.leftX; startY = source.leftY; endX = target.rightX; endY = target.rightY; } else { // target处于右边位置, startX = source.rightX; startY = source.rightY; endX = target.leftX; endY = target.leftY; } c1X = (startX + endX) / 2; c1Y = startY; c2X = c1X; c2Y = endY; var obj = { d: "M".concat(startX, ",").concat(startY, "C").concat(c1X, ",").concat(c1Y, ",").concat(c2X, ",").concat(c2Y, ",").concat(endX, ",").concat(endY), source: source, target: target, direction: direction, visible: target.visible }; initEdges.push(obj); }; // 初始化 var createPosition = function createPosition(orginData) { // 所有的边信息暂存数据 var initEdges = []; var tmpRankInfo = {}; var originArr = JSON.parse(JSON.stringify(orginData)); var endArr = []; uuidRef.current = 1; //设置初始值 initPositionn(originArr, null, ARROW_DIR.ROOT, tmpRankInfo, null, null); drawNode(originArr, null, ARROW_DIR.ROOT, initEdges, tmpRankInfo, endArr, null, -1); setTreeData(JSON.parse(JSON.stringify(originArr))); setEdges(initEdges); setNodeData(endArr); setRankInfo(tmpRankInfo); // 可存可不存,先存着吧,留着以后拓展用 setMaxWid(xRef.current * OVERALL_WIDTH + OFFSET_L + OFFSET_R); setMaxHei(yRef.current); }; // 初始化节点基本信息 var initPositionn = function initPositionn(originArr, parent, direction, tmpRankInfo, originId, originUuid) { // 设置初始值 yRef.current = OFFSET_TOP; // 遍历当前层级 for (var i = 0; i < originArr.length; i++) { var _curr$FIELDNAMES$up, _curr$FIELDNAMES$down, _tmpRankInfo$curr$ran; var curr = originArr[i]; // 递归遍历进入第一层 // 唯一标识id curr.uuid = uuidRef.current; uuidRef.current++; // 操作id curr.id = curr[FIELDNAMES['id']]; //赋值id if (direction === ARROW_DIR.ROOT) { originId = curr.id; originUuid = curr.uuid; curr.rank = 0; // 当前o是第几层,最初是0层 Reflect.set(tmpRankInfo, curr.uuid, { x: 1, y: 1, minRank: 0 }); } else if (direction === ARROW_DIR.UP) { curr.rank = (parent === null || parent === void 0 ? void 0 : parent.rank) - 1; } else if (direction === ARROW_DIR.DOWN) { curr.rank = (parent === null || parent === void 0 ? void 0 : parent.rank) + 1; } // 记录父级和根节点id(留着备用) curr.rootID = originId; curr.parentID = parent ? parent.id : null; // 根节点没有父级id curr.rootUUID = originUuid; curr.parentUUID = parent ? parent.uuid : null; // 权限部分 curr.visible = curr.visible || true; //是否可见(默认可见,备用) curr.hideUp = curr.hideUp || false; //默认都不隐藏,即为展开,控制左下级的 curr.hideDown = curr.hideDown || false; //默认都不隐藏,即为展开,控制右下级的 var upLen = ((_curr$FIELDNAMES$up = curr[FIELDNAMES['up']]) === null || _curr$FIELDNAMES$up === void 0 ? void 0 : _curr$FIELDNAMES$up.length) || 0; // 下节点的个数 var downLen = ((_curr$FIELDNAMES$down = curr[FIELDNAMES['down']]) === null || _curr$FIELDNAMES$down === void 0 ? void 0 : _curr$FIELDNAMES$down.length) || 0; // 上节点的个数 // 如果这一层级,没有数据,初始化数据,有的话用原来的 tmpRankInfo[originUuid][curr.rank] = (_tmpRankInfo$curr$ran = tmpRankInfo[originUuid][curr.rank]) !== null && _tmpRankInfo$curr$ran !== void 0 ? _tmpRankInfo$curr$ran : { status: false, // 没有被记录过 num: 0, startNum: 0, reNum: 0 }; // 既然进入这个节点,那么之前的num加1,更新num。 tmpRankInfo[originUuid][curr.rank].num = ++tmpRankInfo[originUuid][curr.rank].num; // 更新当前图层最大y,方便绘制图线 tmpRankInfo[originUuid]['y'] = Math.max( // upLen, // downLen, tmpRankInfo[originUuid]['y'], tmpRankInfo[originUuid][curr.rank].num); // 当前这个0的最大高度层级,每一个都记录下吧,用上一层和下一层做对比 xRef.current = Math.max(tmpRankInfo[originUuid]['x'], xRef.current); // 一个图层组,当前在一列排行第几 // curr.rankIndex = tmpRankInfo[originUuid as number][curr.rank].num - 1; if (upLen && curr.rank < 1 && !curr.hideUp) { var _tmpRankInfo; // 如果当前列,没有被记录 tmpRankInfo[originUuid][curr.rank - 1] = (_tmpRankInfo = tmpRankInfo[originUuid][curr.rank - 1]) !== null && _tmpRankInfo !== void 0 ? _tmpRankInfo : { status: false, // 当前列如果被记录过,那就是true,初始化时false,没被记录过 num: 0, startNum: 0, reNum: 0 }; if (!tmpRankInfo[originUuid][curr.rank - 1].status) { tmpRankInfo[originUuid]['x'] = tmpRankInfo[originUuid]['x'] + 1; // 当前这个0的最大宽度层级,每一个都记录下吧,用上一层和下一层做对比 tmpRankInfo[originUuid]['minRank'] = curr.rank - 1; tmpRankInfo[originUuid][curr.rank - 1].status = true; } initPositionn(curr[FIELDNAMES['up']], curr, ARROW_DIR.UP, tmpRankInfo, originUuid, originUuid); } else if (direction === ARROW_DIR.UP) { curr.hideUp = true; } if (downLen && curr.rank > -1 && !curr.hideDown) { var _tmpRankInfo2; tmpRankInfo[originUuid][curr.rank + 1] = (_tmpRankInfo2 = tmpRankInfo[originUuid][curr.rank + 1]) !== null && _tmpRankInfo2 !== void 0 ? _tmpRankInfo2 : { status: false, num: 0, startNum: 0, reNum: 0 }; // 如果当前列,没有被记录 if (!tmpRankInfo[originUuid][curr.rank + 1].status) { tmpRankInfo[originUuid]['x'] = tmpRankInfo[originUuid]['x'] + 1; // 当前这个0的最大宽度层级,每一个都记录下吧,用上一层和下一层做对比 tmpRankInfo[originUuid][curr.rank + 1].status = true; } initPositionn(curr[FIELDNAMES['down']], curr, ARROW_DIR.DOWN, tmpRankInfo, originId, originUuid); } else if (direction === ARROW_DIR.DOWN) { curr.hideDown = true; } } }; // 绘画div,更新div定位信息 var drawNode = function drawNode(originArr, parent, direction, initEdges, tmpRankInfo, endArr, originUuid, currentGroup) { var arrNum = originArr.length; // 遍历当前层级 for (var i = 0; i < arrNum; i++) { var _curr$FIELDNAMES$up2, _curr$FIELDNAMES$down2; var curr = originArr[i]; if (direction === ARROW_DIR.ROOT) { currentGroup++; originUuid = curr.uuid; yRef.current = tmpRankInfo[originUuid]['y'] * OVERALL_HEIGHT + yRef.current + NODE_OFFSET_Y; for (var key in tmpRankInfo[curr.uuid]) { if (tmpRankInfo[curr.uuid].hasOwnProperty(key) && !isNaN(Number(key))) { tmpRankInfo[curr.uuid][key].startNum = 0; // tmpRankInfo[curr.uuid][key].reNum = tmpRankInfo[curr.uuid][key].num; } } } // else if(direction === ARROW_DIR.UP && curr.hideUp){ // tmpRankInfo[originUuid as number][curr.rank].reNum = tmpRankInfo[originUuid as number][curr.rank].reNum - (curr?.align ? curr.align.length : 0); // }else if(direction === ARROW_DIR.DOWN && curr.hideDown){ // tmpRankInfo[originUuid as number][curr.rank].reNum = tmpRankInfo[originUuid as number][curr.rank].reNum - (curr?.be_align ? curr.be_align.length : 0); // } var upLen = ((_curr$FIELDNAMES$up2 = curr[FIELDNAMES['up']]) === null || _curr$FIELDNAMES$up2 === void 0 ? void 0 : _curr$FIELDNAMES$up2.length) || 0; // 下节点的个数 var downLen = ((_curr$FIELDNAMES$down2 = curr[FIELDNAMES['down']]) === null || _curr$FIELDNAMES$down2 === void 0 ? void 0 : _curr$FIELDNAMES$down2.length) || 0; // 上节点的个数 curr.rankIndex = tmpRankInfo[originUuid][curr.rank].startNum || 0, tmpRankInfo[originUuid][curr.rank].startNum++; // 当前节点left top curr.left = (curr.rank - tmpRankInfo[originUuid]['minRank']) * OVERALL_WIDTH + OFFSET_L; curr.top = (tmpRankInfo[originUuid]['y'] - tmpRankInfo[originUuid][curr.rank].num) / 2 * OVERALL_HEIGHT + curr.rankIndex * OVERALL_HEIGHT + yRef.current - tmpRankInfo[originUuid]['y'] * OVERALL_HEIGHT - NODE_OFFSET_Y; // 设置元素point x y getLinePoint(curr); // 绘制边 configEdges({ source: parent, target: curr, direction: direction, initEdges: initEdges }); // 输出扁平化数组 endArr.push(curr); if (upLen && curr.rank < 1 && !curr.hideUp) { drawNode(curr[FIELDNAMES['up']], curr, ARROW_DIR.UP, initEdges, tmpRankInfo, endArr, originUuid, currentGroup); } if (downLen && curr.rank > -1 && !curr.hideDown) { drawNode(curr[FIELDNAMES['down']], curr, ARROW_DIR.DOWN, initEdges, tmpRankInfo, endArr, originUuid, currentGroup); } } }; // 新增节点,处理各种信息 var addNode = function addNode(nodes, parent, direction, tmpRankInfo) { for (var i = 0; i < nodes.length; i++) { var _tmpRankInfo$curr$roo; var curr = nodes[i]; // 唯一标识id curr.uuid = uuidRef.current; uuidRef.current++; // 处理自身id,兼容性 curr.id = curr[FIELDNAMES['id']]; // 记录父级和根节点id(留着备用) curr.rootID = parent.rootID; curr.parentID = parent.id; curr.rootUUID = parent.rootUUID; curr.parentUUID = parent.uuid; // 权限部分 curr.visible = true; //是否可见(默认可见,备用) curr.hideUp = true; //默认隐藏下级,控制左下级的 curr.hideDown = true; //默认隐藏下级,控制右下级的 if (direction === ARROW_DIR.UP) { curr.rank = parent.rank - 1; } else if (direction === ARROW_DIR.DOWN) { curr.rank = parent.rank + 1; } // 如果这一层级,没有数据,初始化数据,有的话用原来的 tmpRankInfo[curr.rootUUID][curr.rank] = (_tmpRankInfo$curr$roo = tmpRankInfo[curr.rootUUID][curr.rank]) !== null && _tmpRankInfo$curr$roo !== void 0 ? _tmpRankInfo$curr$roo : { status: false, // 没有被记录过 num: 0, // 0 代表没有数据 reNum: 0 }; // 既然进入这个节点,那么之前的num加1,更新num。 tmpRankInfo[curr.rootUUID][curr.rank].num = ++tmpRankInfo[curr.rootUUID][curr.rank].num; // 更新当前图层最大y,方便绘制图线 tmpRankInfo[curr.rootUUID]['y'] = Math.max(tmpRankInfo[curr.rootUUID]['y'], tmpRankInfo[curr.rootUUID][curr.rank].num); // 更新当前rank信息 if (!tmpRankInfo[curr.rootUUID][curr.rank].status) { tmpRankInfo[curr.rootUUID]['x'] = tmpRankInfo[curr.rootUUID]['x'] + 1; // 当前这个0的最大宽度层级,每一个都记录下吧,用上一层和下一层做对比 tmpRankInfo[curr.rootUUID][curr.rank].status = true; if (direction === ARROW_DIR.UP) { tmpRankInfo[curr.rootUUID]['minRank'] = curr.rank; } } // 当前这个0的最大高度层级,每一个都记录下吧,用上一层和下一层做对比 xRef.current = Math.max(tmpRankInfo[curr.rootUUID]['x'], xRef.current); // 一个图层组,当前在一列排行第几(这个从0开始,所以要-1)(这点要注意,要对比父级的rankIndex,不然可能会出现交叉) // curr.rankIndex = tmpRankInfo[curr.rootUUID][curr.rank].num - 1; } }; // 收缩-更新节点(命中父节点) var updatePosition = function updatePosition(originArr, info, direction, initEdges, tmpRankInfo, endArr, initArr) { var curr; for (var i = 0; i < originArr.length; i++) { curr = originArr[i]; // 命中 if (curr.uuid === info.uuid) { if (direction === ARROW_DIR.DOWN) { if (info.hideDown) { var _info$FIELDNAMES$down; // 当前是隐藏的,现在需要展开 if (!info[FIELDNAMES['down']] || !((_info$FIELDNAMES$down = info[FIELDNAMES['down']]) !== null && _info$FIELDNAMES$down !== void 0 && _info$FIELDNAMES$down.length)) { // 如果树没有要展开的数据,那么去更新,请求数据 // 请求数据 fetchMoreData(info, direction).then(function (res) { if (res.data === []) { return; } addNode(res.data, info, direction, tmpRankInfo); curr[FIELDNAMES['down']] = res.data; curr.hideDown = false; batchSetData(initArr, initEdges, tmpRankInfo, endArr); }); } else { curr.hideDown = false; // batchSetData(initArr, initEdges, tmpRankInfo, endArr); createPosition(initArr); } } else { curr.hideDown = true; // batchSetData(initArr, initEdges, tmpRankInfo, endArr); createPosition(initArr); } } else { if (info.hideUp) { var _info$FIELDNAMES$up; // 当前是隐藏的,现在需要展开 if (!info[FIELDNAMES['up']] || !((_info$FIELDNAMES$up = info[FIELDNAMES['up']]) !== null && _info$FIELDNAMES$up !== void 0 && _info$FIELDNAMES$up.length)) { // 如果树没有要展开的数据,那么去更新,请求数据 // 请求数据 fetchMoreData(info, direction).then(function (res) { if (res.data === []) { return; } addNode(res.data, info, direction, tmpRankInfo); curr[FIELDNAMES['up']] = res.data; curr.hideUp = false; batchSetData(initArr, initEdges, tmpRankInfo, endArr); }); } else { curr.hideUp = false; // batchSetData(initArr, initEdges, tmpRankInfo, endArr); createPosition(initArr); } } else { curr.hideUp = true; // batchSetData(initArr, initEdges, tmpRankInfo, endArr); createPosition(initArr); } } break; } else { if (direction === ARROW_DIR.DOWN) { curr[FIELDNAMES['down']] && updatePosition(curr[FIELDNAMES['down']], info, direction, initEdges, tmpRankInfo, endArr, initArr); } else { curr[FIELDNAMES['up']] && updatePosition(curr[FIELDNAMES['up']], info, direction, initEdges, tmpRankInfo, endArr, initArr); } } } }; // 张开伸缩 var hideOrOpen = function hideOrOpen(info, direction) { var originArr = JSON.parse(JSON.stringify(treeData)); var tmpRankInfo = JSON.parse(JSON.stringify(rankInfo)); // 所有的边信息暂存数据 var initEdges = []; var endArr = []; updatePosition(originArr, info, direction, initEdges, tmpRankInfo, endArr, originArr); }; // 设置数据 var batchSetData = function batchSetData(originArr, initEdges, tmpRankInfo, endArr) { yRef.current = OFFSET_TOP; drawNode(originArr, null, ARROW_DIR.ROOT, initEdges, tmpRankInfo, endArr, null, -1); setTreeData(JSON.parse(JSON.stringify(originArr))); setEdges(initEdges); setNodeData(endArr); setRankInfo(tmpRankInfo); setMaxWid(xRef.current * OVERALL_WIDTH + OFFSET_L + OFFSET_R); setMaxHei(yRef.current); }; // 初始化 useEffect(function () { createPosition(data); }, [data]); return /*#__PURE__*/_jsx("div", { children: /*#__PURE__*/_jsxs("div", { style: { position: 'relative', minHeight: maxHei, minWidth: maxWid }, children: [nodeData.map(function (item) { if (!item.visible) { return null; } return /*#__PURE__*/_jsx(NodeCard, { hideOrOpen: hideOrOpen, info: item, style: { left: item.left, top: item.top, width: NODE_WIDTH, height: NODE_HEIGHT, position: 'absolute', boxSizing: 'border-box' }, renderChild: renderChild, width: NODE_WIDTH, height: NODE_HEIGHT, circleWidth: CR, fieldNames: FIELDNAMES }, item.uuid); }), /*#__PURE__*/_jsx("svg", { width: maxWid, height: maxHei, children: edges.map(function (item, index) { return /*#__PURE__*/_jsx("path", { fill: "none", stroke: "#C7C7D7", strokeWidth: "1", d: item.d }, index); }) })] }) }); }; export default OkrMap;