UNPKG

wetrade-design

Version:

一款多语言支持Vue3的UI框架

956 lines (953 loc) 40.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.stgyGraphProps = exports.default = void 0; var _vue = require("vue"); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _type = require("../_util/type"); var _enum = require("../_util/enum"); var _types = require("./utils/types"); var _const = require("./utils/const"); var _useConfigInject2 = _interopRequireDefault(require("../_util/hooks/useConfigInject")); var _scrollbar = _interopRequireDefault(require("../scrollbar")); var _classNames2 = _interopRequireDefault(require("../_util/classNames")); var d3 = _interopRequireWildcard(require("d3")); var _graph = _interopRequireDefault(require("./utils/graph")); var _tools = require("./utils/tools"); var _raf = _interopRequireDefault(require("../_util/raf")); var _useApp = require("./utils/useApp"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } // import type { NodeProps } from './Node'; var stgyGraphProps = function stgyGraphProps() { return { relationMark: { type: String, default: 'id' }, startMark: { type: String, default: 'startId' }, endMark: { type: String, default: 'endId' }, draggable: { type: Boolean, default: false }, miniStartNode: { type: Boolean, default: false }, origin: { type: Array, default: function _default() { return [0, 0]; } }, nodeList: { type: Array, default: function _default() { return []; } }, linkList: { type: Array, default: function _default() { return []; } }, menus: { type: Array, default: function _default() { return [{ name: '条件', value: _types.TreeNodeType.CONDITION, disabled: false }, { name: '工具', value: _types.TreeNodeType.TOOLS, disabled: false }]; } }, // 选中的node id 集合 selectedNodeId: { type: Array, default: function _default() { return []; } }, // 选中的link的activeId selectedActiveId: { type: Number, default: -1 }, linkPadding: { type: Number, default: 50 }, merge: { type: Boolean, default: false }, readonly: { type: Boolean, default: false }, quotationColor: { type: Number, default: _enum.QuotationColor.RED_UP_GREEN_DOWN }, hiddenAppend: { type: Boolean, default: false } }; }; exports.stgyGraphProps = stgyGraphProps; var StgyGraph = (0, _vue.defineComponent)({ compatConfig: { MODE: 3 }, name: 'WdStgyGraph', props: stgyGraphProps(), emits: ['node-delete', 'node-shrink', 'menu-click', 'node-append', 'node-insert', 'node-click', 'link-click', 'node-drag-end'], slots: ['node-header', 'node-content'], setup: function setup(props, _ref) { var slots = _ref.slots, emit = _ref.emit, expose = _ref.expose; var _useConfigInject = (0, _useConfigInject2.default)('stgy-graph', props), prefixCls = _useConfigInject.prefixCls, configProvider = _useConfigInject.configProvider; var _toRefs = (0, _vue.toRefs)(props), relationMark = _toRefs.relationMark, startMark = _toRefs.startMark, endMark = _toRefs.endMark, origin = _toRefs.origin, menus = _toRefs.menus, readonly = _toRefs.readonly, draggable = _toRefs.draggable, selectedActiveId = _toRefs.selectedActiveId, selectedNodeId = _toRefs.selectedNodeId, miniStartNode = _toRefs.miniStartNode, hiddenAppend = _toRefs.hiddenAppend; var state = (0, _vue.reactive)({ graphRef: null, scrollRef: null, svgContainer: null, renderNodeList: [], renderLinkList: [], graph: new _graph.default({ relationMark: relationMark.value, startMark: startMark.value, endMark: endMark.value, origin: origin.value, readonly: readonly.value, hiddenAppend: hiddenAppend.value }), // 元素拖动配置 moveNodeConf: { sourceNode: null, startNode: null, targetNode: null, direction: null, disabledDrag: false, disabledDragging: false // 是否禁用拖动过程 }, rafRef: null, nodeList: [], linkList: [] }); var _toRefs2 = (0, _vue.toRefs)(state), graphRef = _toRefs2.graphRef, scrollRef = _toRefs2.scrollRef, svgContainer = _toRefs2.svgContainer, renderNodeList = _toRefs2.renderNodeList, renderLinkList = _toRefs2.renderLinkList, graph = _toRefs2.graph, moveNodeConf = _toRefs2.moveNodeConf, rafRef = _toRefs2.rafRef, nodeList = _toRefs2.nodeList, linkList = _toRefs2.linkList; var relationMap = { parentMap: {}, subMap: {}, relationList: [] }; var defaultLineColor = (0, _vue.computed)(function () { return (configProvider === null || configProvider === void 0 ? void 0 : configProvider.mode) === 'light' ? '#C7CBD6' : '#9094a9'; }); var activeLineColor = (0, _vue.computed)(function () { return (configProvider === null || configProvider === void 0 ? void 0 : configProvider.mode) === 'light' ? '#FF9917' : '#e8a33c'; }); // 拖拽颜色 var dragColor = (0, _vue.computed)(function () { return (configProvider === null || configProvider === void 0 ? void 0 : configProvider.mode) === 'light' ? '#2469F2' : '#3578fd'; }); (0, _vue.watch)(function () { return configProvider === null || configProvider === void 0 ? void 0 : configProvider.mode; }, function () { updateLinkColor(); // 更新连线颜色 updateLineColor(); // 更新线段颜色 }); (0, _vue.onMounted)(function () { var container = d3.select(graphRef.value); svgContainer.value = container.append('svg').attr('width', '100%').attr('height', '100%'); }); // 渲染函数 var render = function render(_ref2) { var linkArr = _ref2.linkArr, nodeArr = _ref2.nodeArr, changeNodeAttributes = _ref2.changeNodeAttributes; return new Promise(function (resolve) { (0, _vue.nextTick)(function () { handleRenderNode(); relationMap = (0, _tools.renderStgyGraph)({ linkList: linkArr, nodeList: nodeArr, changeNodeAttributes: changeNodeAttributes, renderLinkList: renderLinkList.value, nodeMap: graph.value.originPointMap(nodeArr), origin: origin.value, miniStartNode: miniStartNode.value }); resolve(relationMap); updateContainerRect(); scrollRef.value.update(); // 更新滚动条 createChart(); }); }); }; // 创建画布 var createChart = function createChart() { graph.value.initNode(renderNodeList.value); graph.value.initLink(renderLinkList.value); graph.value.initButtonAndLine(linkList.value); // 初始化按钮及线段 createLink(); createNode(); createShrink(); createShrinkLine(); createInsert(); createInsertLine(); createAppend(); }; var vueAppNodeInstances = {}; var nodePropsMap = {}; // nodeProps Map // 创建节点 var createNode = function createNode() { var _graph$value$nodeList; if (((_graph$value$nodeList = graph.value.nodeList) === null || _graph$value$nodeList === void 0 ? void 0 : _graph$value$nodeList.length) > 0) { var nodes = svgContainer.value.selectAll('.node-group').data(graph.value.nodeList, function (d) { return d.id; }); // 使用id作为唯一key; var enterSelection = nodes.enter().append('g').attr('class', 'node-group').each(function (d, nodeIndex, nodes) { var group = d3.select(nodes[nodeIndex]); group.append('foreignObject').attr('width', d.width).attr('height', d.height).style('border-radius', '8px').append('xhtml:div').attr('class', 'node-wrapper'); }); // 合并并更新数据 var updateSelection = enterSelection.merge(nodes); // update merge data updateSelection.select('foreignObject').attr('x', function (d) { return d.coordinate[0]; }).attr('y', function (d) { return d.coordinate[1]; }).attr('overflow', 'visible').select('.node-wrapper').each(function (node, nodeIndex, child) { var el = child[nodeIndex]; var key = node.id; var renderSlots = { header: function header() { var _slots$header; return slots === null || slots === void 0 ? void 0 : (_slots$header = slots.header) === null || _slots$header === void 0 ? void 0 : _slots$header.call(slots, node); } }; (slots === null || slots === void 0 ? void 0 : slots.content) && (0, _extends2.default)(renderSlots, { content: function content() { return slots.content(node); } }); (slots === null || slots === void 0 ? void 0 : slots.tools) && (0, _extends2.default)(renderSlots, { tools: function tools() { var _slots$tools; return slots === null || slots === void 0 ? void 0 : (_slots$tools = slots.tools) === null || _slots$tools === void 0 ? void 0 : _slots$tools.call(slots, { node: node, updateNodeData: updateNodeData }); } }); var nodeProps = { node: node, miniStartNode: miniStartNode.value, readonly: readonly.value, selectedNodeId: selectedNodeId.value }; if (!(0, _vue.isReactive)(nodePropsMap[key])) { nodePropsMap[key] = (0, _vue.reactive)(nodeProps); } else { (0, _extends2.default)(nodePropsMap[key], nodeProps); } (0, _useApp.useCreateVueApp)({ key: key, props: { nodeDelete: nodeDelete, nodeShrink: nodeShrink, menuClick: menuClick, nodeAppend: nodeAppend, nodeInsert: nodeInsert, nodeMousedown: nodeMousedown, nodeMouseup: nodeMouseup }, componentKey: _types.ComponentType.GRAPH_NODE, el: el, slots: renderSlots, vueAppInstances: vueAppNodeInstances, extParam: nodePropsMap[key] }); }); // 处理已删除的元素 nodes.exit().remove().each(function (node) { var _vueAppNodeInstances$; var key = node.id; (_vueAppNodeInstances$ = vueAppNodeInstances[key]) === null || _vueAppNodeInstances$ === void 0 ? void 0 : _vueAppNodeInstances$.destroy(); nodePropsMap[key] = null; }); } }; // 创建【添】 var vueAppAppendInstances = {}; var appendPropsMap = {}; var createAppend = function createAppend() { var appendNodeList = readonly.value || hiddenAppend.value ? [] : graph.value.appendNodeList; var appendNodes = svgContainer.value.selectAll('.node-append').data(appendNodeList, function (d) { return d.id; }); var enterSelection = appendNodes.enter().append('g').attr('class', 'node-append').each(function (_d, i, nodes) { var group = d3.select(nodes[i]); group.append('foreignObject').attr('width', _const.ICON_SIZE).attr('height', _const.ICON_SIZE).attr('overflow', 'visible').append('xhtml:div').attr('class', 'node-append-wrapper'); }); enterSelection.merge(appendNodes).select('foreignObject').attr('x', function (d) { // d表示node return d.coordinate[0] - _const.APPEND_X_GAP; }).attr('y', function (d) { return d.coordinate[1] + 6; }).select('.node-append-wrapper').each(function (node, i, child) { var el = child[i]; var key = node.id; var appendProps = { node: node, menus: menus.value }; if (!(0, _vue.isReactive)(appendPropsMap[key])) { appendPropsMap[key] = (0, _vue.reactive)(appendProps); } else { (0, _extends2.default)(appendPropsMap[key], appendProps); } (0, _useApp.useCreateVueApp)({ key: key, props: { menuClick: menuClick, nodeAppend: nodeAppend, getMenuPopupContainer: function getMenuPopupContainer() { return graphRef.value; } }, componentKey: _types.ComponentType.APPEND, el: el, vueAppInstances: vueAppAppendInstances, extParam: appendPropsMap[key] }); }); appendNodes.exit().remove().each(function (node) { var key = node.id; vueAppAppendInstances[key].destroy(); appendPropsMap[key] = null; }); }; // 创建【+】 var vueAppInsertInstances = {}; var insertPropsMap = {}; var createInsert = function createInsert() { var insertNodeList = readonly.value ? [] : graph.value.insertNodeList; var appendNodes = svgContainer.value.selectAll('.node-insert').data(insertNodeList, function (d) { return d.id; }); var enterSelection = appendNodes.enter().append('g').attr('class', 'node-insert').each(function (_d, i, nodes) { var group = d3.select(nodes[i]); group.append('foreignObject').attr('width', _const.ICON_SIZE).attr('height', _const.ICON_SIZE).attr('overflow', 'visible').append('xhtml:div').attr('class', 'node-insert-wrapper'); }); enterSelection.merge(appendNodes).select('foreignObject').attr('x', function (d) { var width = d.width, coordinate = d.coordinate, isMergeNode = d.meta.extParam.isMergeNode; var left = coordinate[0] + width; var hasNextNodeAndNotEmpty = linkList.value.some(function (link) { var _link$meta, _link$meta2; return link.startId === d.id && (link === null || link === void 0 ? void 0 : (_link$meta = link.meta) === null || _link$meta === void 0 ? void 0 : _link$meta.activeId) === -1 && !((_link$meta2 = link.meta) !== null && _link$meta2 !== void 0 && _link$meta2.isDragElement); }); var xGap = isMergeNode ? _const.INSERT_JOIN_X_GAP_MERGE : _const.INSERT_JOIN_X_GAP; var x = hasNextNodeAndNotEmpty ? left + xGap : left + _const.APPEND_EMPTY_X_GAP; return x; }).attr('y', function (d) { var coordinate = d.coordinate; var top = coordinate[1]; var y = 6 + top; return y; }).select('.node-insert-wrapper').each(function (node, i, child) { var el = child[i]; var key = node.id; var insertProps = { node: node, menus: menus.value }; if (!(0, _vue.isReactive)(insertPropsMap[key])) { insertPropsMap[key] = (0, _vue.reactive)(insertProps); } else { (0, _extends2.default)(insertPropsMap[key], insertProps); } (0, _useApp.useCreateVueApp)({ key: key, props: { menuClick: menuClick, nodeInsert: nodeInsert, getMenuPopupContainer: function getMenuPopupContainer() { return graphRef.value; } }, componentKey: _types.ComponentType.INSERT, el: el, vueAppInstances: vueAppInsertInstances, extParam: insertPropsMap[key] }); }); appendNodes.exit().remove().each(function (node) { var _vueAppInsertInstance; var key = node.id; (_vueAppInsertInstance = vueAppInsertInstances[key]) === null || _vueAppInsertInstance === void 0 ? void 0 : _vueAppInsertInstance.destroy(); insertPropsMap[key] = null; }); }; // 创建【展开收起】 var vueAppShrinkInstances = {}; var shrinkPropsMap = {}; var createShrink = function createShrink() { var shrinkNodeList = graph.value.shrinkNodeList; var appendNodes = svgContainer.value.selectAll('.node-shrink').data(shrinkNodeList, function (d) { return d.id; }); var enterSelection = appendNodes.enter().append('g').attr('class', 'node-shrink').each(function (_d, i, nodes) { var group = d3.select(nodes[i]); group.append('foreignObject').attr('width', _const.ICON_SIZE).attr('height', _const.ICON_SIZE).attr('overflow', 'visible').append('xhtml:div').attr('class', 'node-shrink-wrapper'); }); enterSelection.merge(appendNodes).select('foreignObject').attr('x', function (d) { var width = d.width, coordinate = d.coordinate, _d$meta$extParam = d.meta.extParam, isOpen = _d$meta$extParam.isOpen, isMergeNode = _d$meta$extParam.isMergeNode; var left = coordinate[0] + width; var openXGap = isMergeNode ? _const.SHRINK_OPEN_X_GAP_MERGE : _const.SHRINK_OPEN_X_GAP; var x = left + (isOpen ? openXGap : _const.SHRINK_CLOSE_X_GAP); return x; }).attr('y', function (d) { var coordinate = d.coordinate; var top = coordinate[1]; var y = 6 + top; return y; }).select('.node-shrink-wrapper').each(function (node, i, child) { var el = child[i]; var key = node.id; var shrinkProps = { node: node }; if (!(0, _vue.isReactive)(shrinkPropsMap[key])) { shrinkPropsMap[key] = (0, _vue.reactive)(shrinkProps); } else { (0, _extends2.default)(shrinkPropsMap[key], shrinkProps); } (0, _useApp.useCreateVueApp)({ key: key, props: { nodeShrink: nodeShrink }, componentKey: _types.ComponentType.SHRINK_EXPAND, el: el, vueAppInstances: vueAppShrinkInstances, extParam: shrinkPropsMap[key] }); }); appendNodes.exit().remove().each(function (node) { var _vueAppShrinkInstance; var key = node.id; (_vueAppShrinkInstance = vueAppShrinkInstances[key]) === null || _vueAppShrinkInstance === void 0 ? void 0 : _vueAppShrinkInstance.destroy(); shrinkPropsMap[key] = null; }); }; // 创建连线 var createLink = function createLink() { var links = svgContainer.value.selectAll('.link-group').lower().data(graph.value.linkList, function (d) { return d.id; }); // 使用id作为唯一key; var enterSelection = links.enter().append('g').attr('transform', 'translate(0.5,0.5)') // 处理dpr显示问题 .attr('class', 'link-group').attr('data-activeId', function (d) { return d.meta.activeId; }).classed('link-group-merge', function (d) { return d.meta.activeId !== -1; }).each(function (link, i, links) { var group = d3.select(links[i]); link.createLink({ g: group, style: { color: relationLineColor(link) } }, function () { var _link$meta3; if (props.merge || props.readonly || ((_link$meta3 = link.meta) === null || _link$meta3 === void 0 ? void 0 : _link$meta3.activeId) === -1) return; emit('link-click', link); }); }); var mergeSelection = enterSelection.merge(links); mergeSelection.select('.link-path-hot').attr('d', function (link) { return link.createPath(); }); mergeSelection.select('.link-path').attr('d', function (link) { return link.createPath(); }).attr('stroke', linkColor); mergeSelection.select('.link-start-point').attr('d', function (link) { return link.createArc().startPath; }).attr('fill', linkColor); mergeSelection.select('.link-end-point').attr('d', function (link) { return link.createArc().endPath; }).attr('fill', linkColor); mergeSelection.lower(); // 将当前点击的合并线层级调整至最高 if (selectedActiveId.value !== -1) { svgContainer.value.selectAll("[data-activeId='".concat(selectedActiveId.value, "']")).raise(); } links.exit().remove(); }; // 创建+的连线 var createInsertLine = function createInsertLine() { var insertLineList = readonly.value ? [] : graph.value.insertLineList; var lines = svgContainer.value.selectAll('.line-insert').data(insertLineList, function (d) { return d.id; }); // 使用id作为唯一key; var enterSelection = lines.enter().append('g').lower().attr('transform', 'translate(0.5,0.5)') // 处理dpr显示问题 .attr('class', 'line-insert').each(function (node, i, lines) { var group = d3.select(lines[i]); node.createLine({ g: group, style: { color: defaultLineColor.value }, type: _types.NodeLineType.INSERT }); }); var mergeSelection = enterSelection.merge(lines); mergeSelection.select('.line-path').attr('d', function (d) { return d.createPath({ type: _types.NodeLineType.INSERT }); }).attr('stroke', lineAndPointColor); mergeSelection.select('.line-start-point').attr('d', function (d) { return d.createArc(_types.NodeLineType.INSERT).startPath; }).attr('fill', lineAndPointColor); mergeSelection.select('.line-end-point').attr('d', function (d) { return d.createArc(_types.NodeLineType.INSERT).endPath; }).attr('fill', lineAndPointColor); mergeSelection.lower(); lines.exit().remove(); }; // 创建展开收起的连线 var createShrinkLine = function createShrinkLine() { var shrinkLineList = graph.value.shrinkLineList; var lines = svgContainer.value.selectAll('.line-shrink').data(shrinkLineList, function (d) { return d.id; }); // 使用id作为唯一key; var enterSelection = lines.enter().append('g').lower().attr('transform', 'translate(0.5,0.5)') // 处理dpr显示问题 .attr('class', 'line-shrink').each(function (node, i, lines) { var group = d3.select(lines[i]); node.createLine({ g: group, style: { color: defaultLineColor.value }, type: _types.NodeLineType.SHRINK }); }); var mergeSelection = enterSelection.merge(lines); mergeSelection.select('.line-path').attr('d', function (d) { return d.createPath({ type: _types.NodeLineType.SHRINK }); }).attr('stroke', lineAndPointColor); mergeSelection.select('.line-start-point').attr('d', function (d) { return d.createArc(_types.NodeLineType.SHRINK).startPath; }).attr('fill', lineAndPointColor); mergeSelection.select('.line-end-point').attr('d', function (d) { return d.createArc(_types.NodeLineType.SHRINK).endPath; }).attr('fill', lineAndPointColor); mergeSelection.lower(); lines.exit().remove(); }; // 获取线段以及端点颜色 var lineAndPointColor = function lineAndPointColor(node) { var _node$meta, _node$meta$extParam; return node !== null && node !== void 0 && (_node$meta = node.meta) !== null && _node$meta !== void 0 && (_node$meta$extParam = _node$meta.extParam) !== null && _node$meta$extParam !== void 0 && _node$meta$extParam.isHighLight ? activeLineColor.value : defaultLineColor.value; }; // 获取关系线段颜色 var relationLineColor = function relationLineColor(link) { var _link$meta4; return link !== null && link !== void 0 && (_link$meta4 = link.meta) !== null && _link$meta4 !== void 0 && _link$meta4.isDragElement ? dragColor.value : defaultLineColor.value; }; // 路径颜色 var linkColor = function linkColor(link) { var _link$meta5, _link$meta6, _link$meta7; if ((_link$meta5 = link.meta) !== null && _link$meta5 !== void 0 && _link$meta5.isHighLight || selectedActiveId.value === ((_link$meta6 = link.meta) === null || _link$meta6 === void 0 ? void 0 : _link$meta6.activeId) && ((_link$meta7 = link.meta) === null || _link$meta7 === void 0 ? void 0 : _link$meta7.activeId) !== -1) { return activeLineColor.value; } else { return relationLineColor(link); } }; // 更新路径颜色 var updateLinkColor = function updateLinkColor() { var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref3$path = _ref3.path, path = _ref3$path === void 0 ? '.link-path' : _ref3$path, _ref3$start = _ref3.start, start = _ref3$start === void 0 ? '.link-start-point' : _ref3$start, _ref3$end = _ref3.end, end = _ref3$end === void 0 ? '.link-end-point' : _ref3$end, _ref3$lineColor = _ref3.lineColor, lineColor = _ref3$lineColor === void 0 ? linkColor : _ref3$lineColor; svgContainer.value.selectAll(path).attr('stroke', lineColor); svgContainer.value.selectAll(start).attr('fill', lineColor); svgContainer.value.selectAll(end).attr('fill', lineColor); }; // 更新线段颜色 var updateLineColor = function updateLineColor() { updateLinkColor({ path: '.line-path', start: '.line-start-point', end: '.line-end-point', lineColor: lineAndPointColor }); }; // 更新容器宽高 var updateContainerRect = function updateContainerRect() { var _renderNodeList$value; var cacheWidth = 200; var cacheHeight = 150; var rect = (_renderNodeList$value = renderNodeList.value) === null || _renderNodeList$value === void 0 ? void 0 : _renderNodeList$value.reduce(function (prev, item) { var _item$coordinate = item === null || item === void 0 ? void 0 : item.coordinate, _item$coordinate2 = (0, _slicedToArray2.default)(_item$coordinate, 2), x = _item$coordinate2[0], y = _item$coordinate2[1]; var w = x + item.width || 0; if (w > prev.width) { prev.width = w; } var h = y + item.height || 0; if (h > prev.height) { prev.height = h; } return prev; }, { width: 0, height: 0 }); var d = graphRef.value; if (d) { d.style.width = "".concat(rect.width + cacheWidth, "px"); d.style.height = "".concat(rect.height + cacheHeight, "px"); } }; // 删除 var nodeDelete = function nodeDelete(node) { emit('node-delete', node); }; // 展开收起 var nodeShrink = function nodeShrink(node) { emit('node-shrink', node); }; // 处理需要渲染的数据 以及源数据赋值 var handleRenderNode = function handleRenderNode() { nodeList.value = props.nodeList; linkList.value = props.linkList; var obj = (0, _tools.initShrinkNode)({ linkList: linkList.value, nodeList: nodeList.value }); renderNodeList.value = obj.renderNodeList; renderLinkList.value = obj.renderLinkList; }; // 点击菜单 var menuClick = function menuClick(obj) { emit('menu-click', obj); }; // 点击【+】 var nodeInsert = function nodeInsert(node) { emit('node-insert', node); }; // 点击【添】 var nodeAppend = function nodeAppend(node) { emit('node-append', node); }; var nodeMouseup = function nodeMouseup(node) { emit('node-click', node); }; var deleteNodeLinkList = function deleteNodeLinkList(id, params) { var _relationMap, _relationMap$subMap; // 子节点的id集合 var subIdList = (_relationMap = relationMap) === null || _relationMap === void 0 ? void 0 : (_relationMap$subMap = _relationMap.subMap) === null || _relationMap$subMap === void 0 ? void 0 : _relationMap$subMap[id]; // 受影响的id (要被删除) var effectIds = [id]; // 浅拷贝 var newList = (0, _toConsumableArray2.default)(params.linkList); // 只有一个子节点 if ((subIdList === null || subIdList === void 0 ? void 0 : subIdList.length) === 1) { var _nodeMap$nextId, _nodeMap$nextId$meta, _nodeMap$nextId$meta$; // 子节点的id var nextId = subIdList[0]; // 节点Map var nodeMap = graph.value.originPointMap(nodeList.value); // 节点是否属于合并节点 var isSubMergeNode = (_nodeMap$nextId = nodeMap[nextId]) === null || _nodeMap$nextId === void 0 ? void 0 : (_nodeMap$nextId$meta = _nodeMap$nextId.meta) === null || _nodeMap$nextId$meta === void 0 ? void 0 : (_nodeMap$nextId$meta$ = _nodeMap$nextId$meta.extParam) === null || _nodeMap$nextId$meta$ === void 0 ? void 0 : _nodeMap$nextId$meta$.isMergeNode; if (isSubMergeNode) { var _relationMap$relation, _relationMap2, _relationMap2$parentM, _relationMap2$parentM2, _relationMap2$parentM3; // 经过合并节点的全部路线 var pathList = (_relationMap$relation = relationMap.relationList) === null || _relationMap$relation === void 0 ? void 0 : _relationMap$relation.filter(function (l) { return (l === null || l === void 0 ? void 0 : l.includes(nextId)) && l[0] !== nextId; }); // 被删除的节点的 第一个兄弟节点 var broId = (_relationMap2 = relationMap) === null || _relationMap2 === void 0 ? void 0 : (_relationMap2$parentM = _relationMap2.parentMap) === null || _relationMap2$parentM === void 0 ? void 0 : (_relationMap2$parentM2 = _relationMap2$parentM[nextId]) === null || _relationMap2$parentM2 === void 0 ? void 0 : (_relationMap2$parentM3 = _relationMap2$parentM2.filter(function (i) { return i !== id; })) === null || _relationMap2$parentM3 === void 0 ? void 0 : _relationMap2$parentM3[0]; // 路线是否小于2条 if ((pathList === null || pathList === void 0 ? void 0 : pathList.length) <= 2) { // 小于两条线 需要删除合并节点 并且把删除节点后续的关系拼接到 兄弟节点上 effectIds.push(nextId); newList = (0, _tools.deleteMergeNodeRelation)(id, { linkList: newList, mergeId: nextId, broId: broId, delMerge: true }); } else { // 大于两条线 找到兄弟节点然后做替换 不需要删除合并节点 newList = (0, _tools.deleteMergeNodeRelation)(id, { linkList: newList, mergeId: nextId, broId: broId }); } return { newList: newList, effectIds: effectIds }; } } // 删除单个的节点方法 newList = (0, _tools.deleteSingleNodeRelation)(id, { linkList: newList }); return { newList: newList, effectIds: effectIds }; }; // 开始拖拽 var offsetX = 0; var offsetY = 0; var offsetLeft = 0; var offsetTop = 0; var draggableEl = null; var dragFlag = false; var startClientX = null; var startClientY = null; // 定义一个阈值,用于判断是否为长按拖拽 var dragThreshold = 3; // 单位像素 var nodeMousedown = function nodeMousedown(evt, node) { evt.preventDefault(); dragFlag = false; var boxEl = evt.target.closest(".".concat(prefixCls.value, "-node")); var el = boxEl.children[0]; offsetX = evt.clientX - el.getBoundingClientRect().left; offsetY = evt.clientY - el.getBoundingClientRect().top; startClientX = evt.clientX; startClientY = evt.clientY; moveNodeConf.value.disabledDrag = (0, _tools.disabledNodeDrag)({ sourceNode: node, linkList: linkList.value, draggable: draggable.value }); if (!moveNodeConf.value.disabledDrag) { draggableEl = el.cloneNode(true); window.requestAnimationFrame(function () { var _graphRef$value; draggableEl.style.position = 'absolute'; draggableEl.style.zIndex = '10'; draggableEl.style.opacity = '0'; draggableEl.style.width = el.offsetWidth + 'px'; draggableEl.style.height = el.offsetHeight + 'px'; draggableEl && ((_graphRef$value = graphRef.value) === null || _graphRef$value === void 0 ? void 0 : _graphRef$value.appendChild(draggableEl)); }); } moveNodeConf.value.sourceNode = node; document.addEventListener('mousemove', docNodeMove); document.addEventListener('mouseup', doceNodeUp); }; // 拖动中 var docNodeMove = function docNodeMove(evt) { evt.preventDefault(); evt.stopPropagation(); if (moveNodeConf.value.disabledDrag) return; if (Math.abs(evt.clientX - startClientX) < dragThreshold && Math.abs(evt.clientY - startClientY) < dragThreshold) { draggableEl.style.pointerEvents = 'none'; return; } else { draggableEl.style.pointerEvents = 'auto'; } dragFlag = true; var scrollWrap = scrollRef.value.wrapRef; var boxLeft = scrollWrap.getBoundingClientRect().left; var boxTop = scrollWrap.getBoundingClientRect().top; offsetLeft = evt.clientX - offsetX - boxLeft + scrollWrap.scrollLeft; offsetTop = evt.clientY - offsetY - boxTop + scrollWrap.scrollTop; window.requestAnimationFrame(function () { if (!draggableEl) return; draggableEl.style.left = offsetLeft + 'px'; draggableEl.style.top = offsetTop + 'px'; draggableEl.style.opacity = '1'; onDrag({ offset: [offsetLeft, offsetTop], sourceNode: moveNodeConf.value.sourceNode }); }); }; // 拖动结束 var doceNodeUp = function doceNodeUp(evt) { var _graphRef$value2; evt.preventDefault(); draggableEl && ((_graphRef$value2 = graphRef.value) === null || _graphRef$value2 === void 0 ? void 0 : _graphRef$value2.removeChild(draggableEl)); draggableEl = null; dragFlag && onDragEnd(); document.removeEventListener('mousemove', docNodeMove); document.removeEventListener('mouseup', doceNodeUp); }; var onDrag = function onDrag(_ref4) { var sourceNode = _ref4.sourceNode, offset = _ref4.offset; _raf.default.cancel(rafRef.value); rafRef.value = (0, _raf.default)(function () { var _findNodeByCoordinate = (0, _tools.findNodeByCoordinate)({ nodeList: nodeList.value, linkList: linkList.value, offset: offset }), node = _findNodeByCoordinate.node, direction = _findNodeByCoordinate.direction; var _appendDragNode = (0, _tools.appendDragNode)({ sourceNode: sourceNode, direction: direction, targetNode: node, nodeList: nodeList.value, linkList: linkList.value, nodeMap: graph.value.nodeMap }), disabled = _appendDragNode.disabled, startNode = _appendDragNode.startNode; moveNodeConf.value.startNode = startNode; moveNodeConf.value.targetNode = node; moveNodeConf.value.direction = direction; moveNodeConf.value.disabledDragging = disabled; if (disabled) { (0, _tools.deleteDragNodeAndLink)({ nodeList: nodeList.value, linkList: linkList.value }); } handleRenderNode(); createChart(); }, 5); }; var onDragEnd = function onDragEnd() { _raf.default.cancel(rafRef.value); rafRef.value = null; (0, _tools.deleteDragNodeAndLink)({ nodeList: nodeList.value, linkList: linkList.value }); emit('node-drag-end'); }; // 更新拖动后的数据 var updateDragData = function updateDragData() { (0, _tools.updateDragNode)({ sourceNode: moveNodeConf.value.sourceNode, targetNode: moveNodeConf.value.targetNode, linkList: linkList.value, direction: moveNodeConf.value.direction, disabled: moveNodeConf.value.disabledDragging, nodeMap: graph.value.originPointMap(nodeList.value), nodeList: nodeList.value }); moveNodeConf.value.sourceNode = null; moveNodeConf.value.targetNode = null; }; // 旧组件copy来的 工具内更新数据的相关方法 var updateNodeData = function updateNodeData(node, newNode) { (0, _extends2.default)(node, newNode); }; // 展开收起方法 var shrinkOrExpand = function shrinkOrExpand(nodeId) { (0, _tools.shrinkOrExpandNode)({ nodeId: nodeId, nodeList: nodeList.value }); }; expose({ render: render, appendNode: _tools.appendNode, addModuleBrotherNode: _tools.addModuleBrotherNode, insertNode: _tools.insertNode, addModuleChildNode: _tools.addModuleChildNode, mergeNode: _tools.mergeNode, cancelMerge: _tools.cancelMerge, editMerge: _tools.editMerge, findLinkChildById: _tools.findLinkChildById, updateDragData: updateDragData, deleteNodeLinkList: deleteNodeLinkList, shrinkOrExpand: shrinkOrExpand, lightenPath: _tools.lightenPath, getCurrentFatherAdnSonNode: _tools.getCurrentFatherAdnSonNode, getCurrentFatherNode: _tools.getCurrentFatherNode, getCurrentChildrenNode: _tools.getCurrentChildrenNode, getCurrentBrother: _tools.getCurrentBrother, getCompletionPreRelationList: _tools.getCompletionPreRelationList }); return function () { var _classNames; return (0, _vue.createVNode)(_scrollbar.default, { "ref": scrollRef, "view-class": "".concat(prefixCls.value, "-view") }, { default: function _default() { return [(0, _vue.createVNode)("div", { "class": (0, _classNames2.default)((_classNames = {}, (0, _defineProperty2.default)(_classNames, "".concat(prefixCls.value), true), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls.value, "-readonly"), props.readonly), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls.value, "-gu"), props.quotationColor === _enum.QuotationColor.GREEN_UP_RED_DOWN), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls.value, "-merge"), props.merge), _classNames)), "ref": graphRef }, null)]; } }); }; } }); var _default2 = (0, _type.withInstall)(StgyGraph); exports.default = _default2;