UNPKG

@logicflow/extension

Version:
320 lines (319 loc) 12.4 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.MindMap = exports.FAKER_NODE = exports.ROOT_NODE = void 0; var hierarchy_1 = __importDefault(require("@antv/hierarchy")); var markEntity_1 = __importDefault(require("./markEntity")); var fakerRoot_1 = __importDefault(require("./fakerRoot")); var markRoot_1 = __importDefault(require("./markRoot")); var markContent_1 = __importDefault(require("./markContent")); var markContentOption_1 = __importDefault(require("./markContentOption")); var theme_1 = require("./theme"); exports.ROOT_NODE = 'mark:root'; exports.FAKER_NODE = 'faker:root'; var FIRST_ROOT_X = 10; var FIRST_ROOT_Y = 10; var MindMap = /** @class */ (function () { function MindMap(_a) { var lf = _a.lf; var _this = this; /** * 将传入的数据转换为logicflow格式的数据 */ this.adapterIn = function (trees) { var tree = { id: 'faker:root', type: 'faker:root', x: 0, y: 0, children: trees, }; var newtree = _this.layoutTree(tree); var graphData = _this.treeToGraph(newtree); return graphData; }; /** * 将logicflow格式的数据转换为mindmap需要的数据 */ this.adapterOut = function (graphData) { return _this.graphToTree(graphData).children; }; this.lf = lf; lf.adapterIn = this.adapterIn; lf.adapterOut = this.adapterOut; lf.setTheme(theme_1.theme); lf.register(fakerRoot_1.default); lf.register(markRoot_1.default); lf.register(markContent_1.default); lf.register(markContentOption_1.default); lf.register(markEntity_1.default); lf.setDefaultEdgeType('bezier'); lf.updateEditConfig({ hideAnchors: true, adjustNodePosition: false, edgeTextEdit: false, adjustEdge: false, }); lf.graphModel.transformModel.translate(200, 200); this.setContextMenu(); /** * 删除树上的某一个点和这个点后面所有的点 */ lf.removeTreeNode = function (nodeId) { var nodesMap = _this.getGraphTreeData().nodesMap; var node = nodesMap.get(nodeId); if (node.type === exports.ROOT_NODE) { return; } _this.removeNode(node); _this.renderTree(); }; /** * 重新排布树 */ lf.renderTree = function () { _this.renderTree(); }; /** * 监听删除 */ this.lf.keyboard.on('backspace', function () { var nodes = _this.lf.getSelectElements(true).nodes; if (nodes.length > 0) { _this.lf.clearSelectElements(); nodes.forEach(function (node) { _this.lf.removeTreeNode(node.id); }); } }); } MindMap.prototype.setContextMenu = function () { var _this = this; var menuItem = [ { icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAAA5NJREFUWEfNmOtRFEEQgHsiACIQIkAiADOQCMAI7I0AjOCaCMQIxAg4IlAjQCIQIhjrW3uuZvf2bmf2Vov+d3Xz+LbfPUFeuYS5+JqmOU1nxRhfzOzHHGdPAlTVwxDCaYzxvYicicj+BphnEbkLISxjjN/MjN9VUgWoqsB8FBHAkJ8ishSRXyLS11gCZ+0bX38rIp/MjPVFUgSoqmhoISKXIvIiIiYit6UXqepb/6grp7oWkZsSjY4Cuta+ighrAbOSg4fUg2uICHAXrvEPY766FVBV0dhnN+Xl2GFFNhMR/+g7EYki8m7buRsBM7gHzFOiNVXF357NDL/cKq5NIPHPjZCDgO4z92jOzHD2IlHVFqx0j/s2e4A8GfLpNUDf9N2D4axEc4m+FpB9rgwgH83spK+JIUBSQZvfan1uCqBDch+BSAoiiFbSAXS/eBxaWGLjqYAOiRaPReQot1ofMGnvsMa0u5g420uuxLU6WlwBuu/9nqq9TAvFQdK3iqqioFMzO0r/5YAp5xFNkwr9Lib2D1xjyAGhJzDI9pNkBkBKKlZsKFdA5ID88cXMdBLd35RRlQeH7umfkQNSdtbCvAZ2JkAseZxyYguYpZdzM6P8TJKZAMmDV2bWsiVAyhmljZq4qqNeW+n/SoVUsal5HTqDBrZTh1W1CjD1caWARCGCmUql074NArqZ8UH6s5rDOxD/zMQZ4GsIEmJgP3VEeRQzJyzNLJmp1ESrdTNpkHL3ZGbt3JMDkhgvzOygmsw37AqYZZOVq+WAqeXpRHIN7AyAFAmGMzqadvLrdzPtHDvVzDMAkuoOzIzs0UofsM1B+Rf8Lw1mM1Ankww1rHQy92Z2XgPnmWByLVZVGuXQb1aGWv6kxeqc6CZmqksvD0XfmJJzv5KtmTid5hfRfm+dWfu3+z5SVWeu2EaZmZZOai3FbRo76QkxNdWlMyOMXIaJiwGz8fbJe9G1x6VtgzuRxIWj03+mefZg4tHHIdccKWUj3EYT9y4Eci+EoIvF4qbIqUYWqSqZAjfgdWzr7F3yeET7RH3kgRJY6vXo08YQY9M0FzFGwHAhPvZ6bHocBcy0iQNTDvcADSHcxhgfxsyJn/ljJ1UCMEzKQ1TRRxYDep5Dm6QQLiPKEYIJ584vZB3+CFAawjAnvV9VO1cFmJvNCzudOMAAAZJeUtESgdJ2SF4+q59/R4NkjoDY9YzJGtz14tL9fwB50PM48Yfe+AAAAABJRU5ErkJggg==', className: 'lf-mindmap_addIcon', callback: function (data) { _this.addChild(data); }, }, ]; this.lf.setContextMenuByType(exports.ROOT_NODE, menuItem); this.lf.setContextMenuByType('mark:entity', menuItem); this.lf.setContextMenuByType('mark:content', menuItem); this.lf.setContextMenuByType('mark:content-option', menuItem); }; MindMap.prototype.addChild = function (data) { var type = 'mark:content-option'; switch (data.type) { case exports.ROOT_NODE: type = 'mark:entity'; break; case 'mark:entity': type = 'mark:content'; break; default: break; } var nodeModel = this.lf.addNode({ type: type, x: data.x, y: data.y, }); this.lf.addEdge({ sourceNodeId: data.id, targetNodeId: nodeModel.id, }); this.renderTree(); }; MindMap.prototype.removeNode = function (node) { var _this = this; if (node.children && node.children.length > 0) { node.children.forEach(function (subNode) { _this.removeNode(subNode); }); } this.lf.deleteNode(node.id); }; MindMap.prototype.getGraphTreeData = function () { var graphData = this.lf.getGraphRawData(); var nodesMap = new Map(); var rootNodes = []; var root = null; graphData.nodes.forEach(function (node) { var treeNode = { id: node.id, type: node.type, properties: node.properties, x: node.x, y: node.y, children: [], }; nodesMap.set(node.id, treeNode); if (node.type === exports.ROOT_NODE) { rootNodes.push(node.id); } if (node.type === exports.FAKER_NODE) { root = treeNode; } }); graphData.edges.forEach(function (edge) { var node = nodesMap.get(edge.sourceNodeId); node.children.push(nodesMap.get(edge.targetNodeId)); }); rootNodes.forEach(function (nodeId) { root.children.push(nodesMap.get(nodeId)); }); return { root: root, nodesMap: nodesMap, }; }; MindMap.prototype.renderTree = function () { var graphData = this.lf.getGraphRawData(); var tree = this.graphToTree(graphData); tree = this.layoutTree(tree); graphData = this.treeToGraph(tree); this.lf.graphModel.graphDataToModel(graphData); }; MindMap.prototype.graphToTree = function (graphData) { var tree = null; var nodesMap = new Map(); var roots = []; graphData.nodes.forEach(function (node) { var treeNode = { id: node.id, type: node.type, properties: node.proerties, text: node.text, children: [], }; nodesMap.set(node.id, treeNode); if (node.type === 'mark:root') { roots.push(node); } if (node.type === exports.FAKER_NODE) { tree = treeNode; } }); graphData.edges.forEach(function (edge) { var node = nodesMap.get(edge.sourceNodeId); node.children.push(nodesMap.get(edge.targetNodeId)); }); if (tree && tree.children) { tree.children = roots.map(function (root) { return nodesMap.get(root.id); }); } return tree; }; /** * 将树这种数据格式转换为图 */ MindMap.prototype.treeToGraph = function (rootNode) { var nodes = []; var edges = []; function getNode(current, parent) { if (parent === void 0) { parent = null; } var node = { id: current.id, x: current.x, y: current.y, type: current.type || current.data.type, properties: current.properties || {}, }; nodes.push(node); if (current.children) { current.children.forEach(function (subNode) { getNode(subNode, node); }); } if (parent && parent.type !== exports.FAKER_NODE) { var edge = { sourceNodeId: parent.id, targetNodeId: node.id, type: 'bezier', }; edges.push(edge); } } getNode(rootNode); return { nodes: nodes, edges: edges, }; }; /** * 由于树这种数据格式本身是没有坐标的 * 需要使用一些算法来将树转换为有坐标的树 */ MindMap.prototype.layoutTree = function (tree) { if (!tree || !tree.children || tree.children.length === 0) return tree; var NODE_SIZE = 40; var PEM = 20; tree.isRoot = true; var rootNode = hierarchy_1.default.compactBox(tree, { direction: 'LR', getId: function (d) { return d.id; }, getHeight: function (d) { if (d.type === exports.ROOT_NODE) { return NODE_SIZE * 4; } return NODE_SIZE; }, getWidth: function () { return 200 + PEM * 1.6; }, getHGap: function () { return PEM; }, getVGap: function () { return PEM; }, getSubTreeSep: function (d) { if (!d.children || !d.children.length) { return 0; } return PEM; }, }); // const { nodes, edges } = this.treeToGraph(rootNode); // 将根节点位置平移回原位置 // 保证第一个根节点在画布位置不变 // 为什么取第一个child呢,这里是因为一张图上存在多个树的情况下 // 我们需要使用一个虚拟的节点(faker:root)作为所有树的根节点 // 这样在使用树布局算法的时候方便统一处理。 // 但是为了在视觉上保证图形不抖动, // 我们需要把第一个真实的根节点位置保持不动 var x = tree.children[0].x || FIRST_ROOT_X; var y = tree.children[0].y || FIRST_ROOT_Y; var x1 = rootNode.children[0].x; var y1 = rootNode.children[0].y; var moveX = x - x1; var moveY = y - y1; var newTree = this.dfsTree(rootNode, function (currentNode) { return ({ id: currentNode.id, x: currentNode.x + moveX, y: currentNode.y + moveY, type: currentNode.data.type, }); }); return newTree; }; /** * 遍历树的每一项,已传入的回调方法重新构建一个新的树 */ MindMap.prototype.dfsTree = function (tree, callback) { var _this = this; var newTree = callback(tree); if (tree.children && tree.children.length > 0) { newTree.children = tree.children.map(function (treeNode) { return _this.dfsTree(treeNode, callback); }); } return newTree; }; MindMap.pluginName = 'MindMap'; return MindMap; }()); exports.MindMap = MindMap;