UNPKG

gg-editor

Version:

A visual graph editor based on G6 and React

1,830 lines (1,500 loc) 106 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } var G6 = _interopDefault(require('@antv/g6')); var _extends = _interopDefault(require('@babel/runtime/helpers/extends')); var merge = _interopDefault(require('lodash/merge')); var isArray = _interopDefault(require('lodash/isArray')); var _inheritsLoose = _interopDefault(require('@babel/runtime/helpers/inheritsLoose')); var React = _interopDefault(require('react')); var pick = _interopDefault(require('lodash/pick')); var cloneDeep = _interopDefault(require('lodash/cloneDeep')); var _objectWithoutPropertiesLoose = _interopDefault(require('@babel/runtime/helpers/objectWithoutPropertiesLoose')); var _assertThisInitialized = _interopDefault(require('@babel/runtime/helpers/assertThisInitialized')); var omit = _interopDefault(require('lodash/omit')); var isPlainObject = _interopDefault(require('lodash/isPlainObject')); var ReactDOM = _interopDefault(require('react-dom')); var delay = _interopDefault(require('lodash/delay')); var FLOW_CONTAINER_ID = 'J_FlowContainer'; var MIND_CONTAINER_ID = 'J_MindContainer'; var LABEL_DEFAULT_TEXT = '新建节点'; var RendererType; (function (RendererType) { RendererType["Canvas"] = "canvas"; RendererType["Svg"] = "svg"; })(RendererType || (RendererType = {})); var ItemType; (function (ItemType) { ItemType["Node"] = "node"; ItemType["Edge"] = "edge"; })(ItemType || (ItemType = {})); var ItemState; (function (ItemState) { ItemState["Active"] = "active"; ItemState["ActiveAnchorPoints"] = "activeAnchorPoints"; ItemState["Selected"] = "selected"; ItemState["HighLight"] = "highLight"; ItemState["Error"] = "error"; })(ItemState || (ItemState = {})); var GraphType; (function (GraphType) { GraphType["Flow"] = "flow"; GraphType["Mind"] = "mind"; })(GraphType || (GraphType = {})); var GraphMode; (function (GraphMode) { GraphMode["Default"] = "default"; GraphMode["AddNode"] = "addNode"; GraphMode["Readonly"] = "readonly"; })(GraphMode || (GraphMode = {})); var GraphState; (function (GraphState) { GraphState["NodeSelected"] = "nodeSelected"; GraphState["EdgeSelected"] = "edgeSelected"; GraphState["MultiSelected"] = "multiSelected"; GraphState["CanvasSelected"] = "canvasSelected"; })(GraphState || (GraphState = {})); var LabelState; (function (LabelState) { LabelState["Hide"] = "hide"; LabelState["Show"] = "show"; })(LabelState || (LabelState = {})); var AnchorPointState; (function (AnchorPointState) { AnchorPointState["Enabled"] = "enabled"; AnchorPointState["Disabled"] = "disabled"; })(AnchorPointState || (AnchorPointState = {})); var EditorEvent; (function (EditorEvent) { /** 调用命令之前触发 */ EditorEvent["onBeforeExecuteCommand"] = "onBeforeExecuteCommand"; /** 调用命令之后触发 */ EditorEvent["onAfterExecuteCommand"] = "onAfterExecuteCommand"; /** 改变画面状态触发 */ EditorEvent["onGraphStateChange"] = "onGraphStateChange"; /** 改变标签状态触发 */ EditorEvent["onLabelStateChange"] = "onLabelStateChange"; })(EditorEvent || (EditorEvent = {})); var EditorCommand; (function (EditorCommand) { /** 撤销 */ EditorCommand["Undo"] = "undo"; /** 重做 */ EditorCommand["Redo"] = "redo"; /** 添加 */ EditorCommand["Add"] = "add"; /** 更新 */ EditorCommand["Update"] = "update"; /** 删除 */ EditorCommand["Remove"] = "remove"; /** 复制 */ EditorCommand["Copy"] = "copy"; /** 粘贴 */ EditorCommand["Paste"] = "paste"; /** 粘贴到这里 */ EditorCommand["PasteHere"] = "pasteHere"; /** 放大 */ EditorCommand["ZoomIn"] = "zoomIn"; /** 缩小 */ EditorCommand["ZoomOut"] = "zoomOut"; /** 插入主题 */ EditorCommand["Topic"] = "topic"; /** 插入子主题 */ EditorCommand["Subtopic"] = "subtopic"; /** 收起 */ EditorCommand["Fold"] = "fold"; /** 展开 */ EditorCommand["Unfold"] = "unfold"; })(EditorCommand || (EditorCommand = {})); var GraphCommonEvent; (function (GraphCommonEvent) { /** 单击鼠标左键或者按下回车键时触发 */ GraphCommonEvent["onClick"] = "click"; /** 双击鼠标左键时触发 */ GraphCommonEvent["onDoubleClick"] = "dblclick"; /** 鼠标移入元素范围内触发,该事件不冒泡,即鼠标移到其后代元素上时不会触发 */ GraphCommonEvent["onMouseEnter"] = "mouseenter"; /** 鼠标在元素内部移到时不断触发,不能通过键盘触发 */ GraphCommonEvent["onMouseMove"] = "mousemove"; /** 鼠标移出目标元素后触发 */ GraphCommonEvent["onMouseOut"] = "mouseout"; /** 鼠标移入目标元素上方,鼠标移到其后代元素上时会触发 */ GraphCommonEvent["onMouseOver"] = "mouseover"; /** 鼠标移出元素范围时触发,该事件不冒泡,即鼠标移到其后代元素时不会触发 */ GraphCommonEvent["onMouseLeave"] = "mouseleave"; /** 鼠标按钮被按下(左键或者右键)时触发,不能通过键盘触发 */ GraphCommonEvent["onMouseDown"] = "mousedown"; /** 鼠标按钮被释放弹起时触发,不能通过键盘触发 */ GraphCommonEvent["onMouseUp"] = "mouseup"; /** 用户右击鼠标时触发并打开上下文菜单 */ GraphCommonEvent["onContextMenu"] = "contextmenu"; /** 当拖拽元素开始被拖拽的时候触发的事件,此事件作用在被拖曳元素上 */ GraphCommonEvent["onDragStart"] = "dragstart"; /** 当拖拽元素在拖动过程中时触发的事件,此事件作用于被拖拽元素上 */ GraphCommonEvent["onDrag"] = "drag"; /** 当拖拽完成后触发的事件,此事件作用在被拖曳元素上 */ GraphCommonEvent["onDragEnd"] = "dragend"; /** 当拖曳元素进入目标元素的时候触发的事件,此事件作用在目标元素上 */ GraphCommonEvent["onDragEnter"] = "dragenter"; /** 当拖曳元素离开目标元素的时候触发的事件,此事件作用在目标元素上 */ GraphCommonEvent["onDragLeave"] = "dragleave"; /** 被拖拽的元素在目标元素上同时鼠标放开触发的事件,此事件作用在目标元素上 */ GraphCommonEvent["onDrop"] = "drop"; /** 按下键盘键触发该事件 */ GraphCommonEvent["onKeyDown"] = "keydown"; /** 释放键盘键触发该事件 */ GraphCommonEvent["onKeyUp"] = "keyup"; /** 当手指触摸屏幕时候触发,即使已经有一个手指放在屏幕上也会触发 */ GraphCommonEvent["onTouchStart"] = "touchstart"; /** 当手指在屏幕上滑动的时候连续地触发。在这个事件发生期间,调用 preventDefault() 事件可以阻止滚动。 */ GraphCommonEvent["onTouchMove"] = "touchmove"; /** 当手指从屏幕上离开的时候触发 */ GraphCommonEvent["onTouchEnd"] = "touchend"; })(GraphCommonEvent || (GraphCommonEvent = {})); var GraphNodeEvent; (function (GraphNodeEvent) { /** 鼠标左键单击节点时触发 */ GraphNodeEvent["onNodeClick"] = "node:click"; /** 鼠标双击左键节点时触发 */ GraphNodeEvent["onNodeDoubleClick"] = "node:dblclick"; /** 鼠标移入节点时触发 */ GraphNodeEvent["onNodeMouseEnter"] = "node:mouseenter"; /** 鼠标在节点内部移到时不断触发,不能通过键盘触发 */ GraphNodeEvent["onNodeMouseMove"] = "node:mousemove"; /** 鼠标移出节点后触发 */ GraphNodeEvent["onNodeMouseOut"] = "node:mouseout"; /** 鼠标移入节点上方时触发 */ GraphNodeEvent["onNodeMouseOver"] = "node:mouseover"; /** 鼠标移出节点时触发 */ GraphNodeEvent["onNodeMouseLeave"] = "node:mouseleave"; /** 鼠标按钮在节点上按下(左键或者右键)时触发,不能通过键盘触发 */ GraphNodeEvent["onNodeMouseDown"] = "node:mousedown"; /** 节点上按下的鼠标按钮被释放弹起时触发,不能通过键盘触发 */ GraphNodeEvent["onNodeMouseUp"] = "node:mouseup"; /** 用户在节点上右击鼠标时触发并打开右键菜单 */ GraphNodeEvent["onNodeContextMenu"] = "node:contextmenu"; /** 当节点开始被拖拽的时候触发的事件,此事件作用在被拖曳节点上 */ GraphNodeEvent["onNodeDragStart"] = "node:dragstart"; /** 当节点在拖动过程中时触发的事件,此事件作用于被拖拽节点上 */ GraphNodeEvent["onNodeDrag"] = "node:drag"; /** 当拖拽完成后触发的事件,此事件作用在被拖曳节点上 */ GraphNodeEvent["onNodeDragEnd"] = "node:dragend"; /** 当拖曳节点进入目标元素的时候触发的事件,此事件作用在目标元素上 */ GraphNodeEvent["onNodeDragEnter"] = "node:dragenter"; /** 当拖曳节点离开目标元素的时候触发的事件,此事件作用在目标元素上 */ GraphNodeEvent["onNodeDragLeave"] = "node:dragleave"; /** 被拖拽的节点在目标元素上同时鼠标放开触发的事件,此事件作用在目标元素上 */ GraphNodeEvent["onNodeDrop"] = "node:drop"; })(GraphNodeEvent || (GraphNodeEvent = {})); var GraphEdgeEvent; (function (GraphEdgeEvent) { /** 鼠标左键单击边时触发 */ GraphEdgeEvent["onEdgeClick"] = "edge:click"; /** 鼠标双击左键边时触发 */ GraphEdgeEvent["onEdgeDoubleClick"] = "edge:dblclick"; /** 鼠标移入边时触发 */ GraphEdgeEvent["onEdgeMouseEnter"] = "edge:mouseenter"; /** 鼠标在边上移到时不断触发,不能通过键盘触发 */ GraphEdgeEvent["onEdgeMouseMove"] = "edge:mousemove"; /** 鼠标移出边后触发 */ GraphEdgeEvent["onEdgeMouseOut"] = "edge:mouseout"; /** 鼠标移入边上方时触发 */ GraphEdgeEvent["onEdgeMouseOver"] = "edge:mouseover"; /** 鼠标移出边时触发 */ GraphEdgeEvent["onEdgeMouseLeave"] = "edge:mouseleave"; /** 鼠标按钮在边上按下(左键或者右键)时触发,不能通过键盘触发 */ GraphEdgeEvent["onEdgeMouseDown"] = "edge:mousedown"; /** 边上按下的鼠标按钮被释放弹起时触发,不能通过键盘触发 */ GraphEdgeEvent["onEdgeMouseUp"] = "edge:mouseup"; /** 用户在边上右击鼠标时触发并打开右键菜单 */ GraphEdgeEvent["onEdgeContextMenu"] = "edge:contextmenu"; })(GraphEdgeEvent || (GraphEdgeEvent = {})); var GraphCanvasEvent; (function (GraphCanvasEvent) { /** 鼠标左键单击画布时触发 */ GraphCanvasEvent["onCanvasClick"] = "canvas:click"; /** 鼠标双击左键画布时触发 */ GraphCanvasEvent["onCanvasDoubleClick"] = "canvas:dblclick"; /** 鼠标移入画布时触发 */ GraphCanvasEvent["onCanvasMouseEnter"] = "canvas:mouseenter"; /** 鼠标在画布内部移到时不断触发,不能通过键盘触发 */ GraphCanvasEvent["onCanvasMouseMove"] = "canvas:mousemove"; /** 鼠标移出画布后触发 */ GraphCanvasEvent["onCanvasMouseOut"] = "canvas:mouseout"; /** 鼠标移入画布上方时触发 */ GraphCanvasEvent["onCanvasMouseOver"] = "canvas:mouseover"; /** 鼠标移出画布时触发 */ GraphCanvasEvent["onCanvasMouseLeave"] = "canvas:mouseleave"; /** 鼠标按钮在画布上按下(左键或者右键)时触发,不能通过键盘触发 */ GraphCanvasEvent["onCanvasMouseDown"] = "canvas:mousedown"; /** 画布上按下的鼠标按钮被释放弹起时触发,不能通过键盘触发 */ GraphCanvasEvent["onCanvasMouseUp"] = "canvas:mouseup"; /** 用户在画布上右击鼠标时触发并打开右键菜单 */ GraphCanvasEvent["onCanvasContextMenu"] = "canvas:contextmenu"; /** 当画布开始被拖拽的时候触发的事件,此事件作用在被拖曳画布上 */ GraphCanvasEvent["onCanvasDragStart"] = "canvas:dragstart"; /** 当画布在拖动过程中时触发的事件,此事件作用于被拖拽画布上 */ GraphCanvasEvent["onCanvasDrag"] = "canvas:drag"; /** 当拖拽完成后触发的事件,此事件作用在被拖曳画布上 */ GraphCanvasEvent["onCanvasDragEnd"] = "canvas:dragend"; /** 当拖曳画布进入目标元素的时候触发的事件,此事件作用在目标元素上 */ GraphCanvasEvent["onCanvasDragEnter"] = "canvas:dragenter"; /** 当拖曳画布离开目标元素的时候触发的事件,此事件作用在目标元素上 */ GraphCanvasEvent["onCanvasDragLeave"] = "canvas:dragleave"; })(GraphCanvasEvent || (GraphCanvasEvent = {})); var GraphCustomEvent; (function (GraphCustomEvent) { /** 调用 add / addItem 方法之前触发 */ GraphCustomEvent["onBeforeAddItem"] = "beforeadditem"; /** 调用 add / addItem 方法之后触发 */ GraphCustomEvent["onAfterAddItem"] = "afteradditem"; /** 调用 remove / removeItem 方法之前触发 */ GraphCustomEvent["onBeforeRemoveItem"] = "beforeremoveitem"; /** 调用 remove / removeItem 方法之后触发 */ GraphCustomEvent["onAfterRemoveItem"] = "afterremoveitem"; /** 调用 update / updateItem 方法之前触发 */ GraphCustomEvent["onBeforeUpdateItem"] = "beforeupdateitem"; /** 调用 update / updateItem 方法之后触发 */ GraphCustomEvent["onAfterUpdateItem"] = "afterupdateitem"; /** 调用 showItem / hideItem 方法之前触发 */ GraphCustomEvent["onBeforeItemVisibilityChange"] = "beforeitemvisibilitychange"; /** 调用 showItem / hideItem 方法之后触发 */ GraphCustomEvent["onAfterItemVisibilityChange"] = "afteritemvisibilitychange"; /** 调用 setItemState 方法之前触发 */ GraphCustomEvent["onBeforeItemStateChange"] = "beforeitemstatechange"; /** 调用 setItemState 方法之后触发 */ GraphCustomEvent["onAfterItemStateChange"] = "afteritemstatechange"; /** 调用 refreshItem 方法之前触发 */ GraphCustomEvent["onBeforeRefreshItem"] = "beforerefreshitem"; /** 调用 refreshItem 方法之后触发 */ GraphCustomEvent["onAfterRefreshItem"] = "afterrefreshitem"; /** 调用 clearItemStates 方法之前触发 */ GraphCustomEvent["onBeforeItemStatesClear"] = "beforeitemstatesclear"; /** 调用 clearItemStates 方法之后触发 */ GraphCustomEvent["onAfterItemStatesClear"] = "afteritemstatesclear"; /** 布局前触发。调用 render 时会进行布局,因此 render 时会触发。或用户主动调用图的 layout 时触发 */ GraphCustomEvent["onBeforeLayout"] = "beforelayout"; /** 布局完成后触发。调用 render 时会进行布局,因此 render 时布局完成后会触发。或用户主动调用图的 layout 时布局完成后触发 */ GraphCustomEvent["onAfterLayout"] = "afterlayout"; /** 连线完成之后触发 */ GraphCustomEvent["onAfterConnect"] = "afterconnect"; })(GraphCustomEvent || (GraphCustomEvent = {})); var index = /*#__PURE__*/Object.freeze({ __proto__: null, FLOW_CONTAINER_ID: FLOW_CONTAINER_ID, MIND_CONTAINER_ID: MIND_CONTAINER_ID, LABEL_DEFAULT_TEXT: LABEL_DEFAULT_TEXT, get RendererType () { return RendererType; }, get ItemType () { return ItemType; }, get ItemState () { return ItemState; }, get GraphType () { return GraphType; }, get GraphMode () { return GraphMode; }, get GraphState () { return GraphState; }, get LabelState () { return LabelState; }, get AnchorPointState () { return AnchorPointState; }, get EditorEvent () { return EditorEvent; }, get EditorCommand () { return EditorCommand; }, get GraphCommonEvent () { return GraphCommonEvent; }, get GraphNodeEvent () { return GraphNodeEvent; }, get GraphEdgeEvent () { return GraphEdgeEvent; }, get GraphCanvasEvent () { return GraphCanvasEvent; }, get GraphCustomEvent () { return GraphCustomEvent; } }); function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } it = o[Symbol.iterator](); return it.next.bind(it); } 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; } var canvas = document.createElement('canvas'); var canvasContext = canvas.getContext('2d'); function getNodeSide(item) { var model = item.getModel(); if (model.side) { return model.side; } var parent = item.get('parent'); if (parent) { return getNodeSide(parent); } return 'right'; } function getRectPath(x, y, w, h, r) { if (r) { return [['M', +x + +r, y], ['l', w - r * 2, 0], ['a', r, r, 0, 0, 1, r, r], ['l', 0, h - r * 2], ['a', r, r, 0, 0, 1, -r, r], ['l', r * 2 - w, 0], ['a', r, r, 0, 0, 1, -r, -r], ['l', 0, r * 2 - h], ['a', r, r, 0, 0, 1, r, -r], ['z']]; } var res = [['M', x, y], ['l', w, 0], ['l', 0, h], ['l', -w, 0], ['z']]; res.toString = toString; return res; } function getFoldButtonPath() { var w = 14; var h = 14; var rect = getRectPath(0, 0, w, h, 2); var hp = "M" + w * 3 / 14 + "," + h / 2 + "L" + w * 11 / 14 + "," + h / 2; var vp = ''; return rect + hp + vp; } function getUnfoldButtonPath() { var w = 14; var h = 14; var rect = getRectPath(0, 0, w, h, 2); var hp = "M" + w * 3 / 14 + "," + h / 2 + "L" + w * 11 / 14 + "," + h / 2; var vp = "M" + w / 2 + "," + h * 3 / 14 + "L" + w / 2 + "," + h * 11 / 14; return rect + hp + vp; } function optimizeMultilineText(text, font, maxRows, maxWidth) { canvasContext.font = font; if (canvasContext.measureText(text).width <= maxWidth) { return text; } var multilineText = []; var tempText = ''; var tempTextWidth = 0; for (var _iterator = _createForOfIteratorHelperLoose(text), _step; !(_step = _iterator()).done;) { var _char2 = _step.value; var _canvasContext$measur2 = canvasContext.measureText(_char2), _width = _canvasContext$measur2.width; if (tempTextWidth + _width >= maxWidth) { multilineText.push(tempText); tempText = ''; tempTextWidth = 0; } tempText += _char2; tempTextWidth += _width; } if (tempText) { multilineText.push(tempText); } if (multilineText.length > maxRows) { var ellipsis = '...'; var ellipsisWidth = canvasContext.measureText(ellipsis).width; var _tempText = ''; var _tempTextWidth = 0; for (var _iterator2 = _createForOfIteratorHelperLoose(multilineText[maxRows - 1]), _step2; !(_step2 = _iterator2()).done;) { var _char = _step2.value; var _canvasContext$measur = canvasContext.measureText(_char), width = _canvasContext$measur.width; if (_tempTextWidth + width > maxWidth - ellipsisWidth) { break; } _tempText += _char; _tempTextWidth += width; } multilineText = multilineText.slice(0, maxRows - 1).concat("" + _tempText + ellipsis); } return multilineText.join('\n'); } var _stateStyles; var WRAPPER_BORDER_WIDTH = 2; var WRAPPER_HORIZONTAL_PADDING = 10; var WRAPPER_CLASS_NAME = 'node-wrapper'; var CONTENT_CLASS_NAME = 'node-content'; var LABEL_CLASS_NAME = 'node-label'; var bizNode = { options: { size: [120, 60], wrapperStyle: { fill: '#5487ea', radius: 8 }, contentStyle: { fill: '#ffffff', radius: 6 }, labelStyle: { fill: '#000000', textAlign: 'center', textBaseline: 'middle' }, stateStyles: (_stateStyles = {}, _stateStyles[ItemState.Active] = { wrapperStyle: {}, contentStyle: {}, labelStyle: {} }, _stateStyles[ItemState.Selected] = { wrapperStyle: {}, contentStyle: {}, labelStyle: {} }, _stateStyles) }, getOptions: function getOptions(model) { return merge({}, this.options, this.getCustomConfig(model) || {}, model); }, draw: function draw(model, group) { var keyShape = this.drawWrapper(model, group); this.drawContent(model, group); this.drawLabel(model, group); return keyShape; }, drawWrapper: function drawWrapper(model, group) { var _this$getSize = this.getSize(model), width = _this$getSize[0], height = _this$getSize[1]; var _this$getOptions = this.getOptions(model), wrapperStyle = _this$getOptions.wrapperStyle; var shape = group.addShape('rect', { className: WRAPPER_CLASS_NAME, draggable: true, attrs: _extends({ x: 0, y: -WRAPPER_BORDER_WIDTH * 2, width: width, height: height + WRAPPER_BORDER_WIDTH * 2 }, wrapperStyle) }); return shape; }, drawContent: function drawContent(model, group) { var _this$getSize2 = this.getSize(model), width = _this$getSize2[0], height = _this$getSize2[1]; var _this$getOptions2 = this.getOptions(model), contentStyle = _this$getOptions2.contentStyle; var shape = group.addShape('rect', { className: CONTENT_CLASS_NAME, draggable: true, attrs: _extends({ x: 0, y: 0, width: width, height: height }, contentStyle) }); return shape; }, drawLabel: function drawLabel(model, group) { var _this$getSize3 = this.getSize(model), width = _this$getSize3[0], height = _this$getSize3[1]; var _this$getOptions3 = this.getOptions(model), labelStyle = _this$getOptions3.labelStyle; var shape = group.addShape('text', { className: LABEL_CLASS_NAME, draggable: true, attrs: _extends({ x: width / 2, y: height / 2, text: model.label }, labelStyle) }); return shape; }, setLabelText: function setLabelText(model, group) { var shape = group.findByClassName(LABEL_CLASS_NAME); if (!shape) { return; } var _this$getSize4 = this.getSize(model), width = _this$getSize4[0]; var _shape$attr = shape.attr(), fontStyle = _shape$attr.fontStyle, fontWeight = _shape$attr.fontWeight, fontSize = _shape$attr.fontSize, fontFamily = _shape$attr.fontFamily; var text = model.label; var font = fontStyle + " " + fontWeight + " " + fontSize + "px " + fontFamily; shape.attr('text', optimizeMultilineText(text, font, 2, width - WRAPPER_HORIZONTAL_PADDING * 2)); }, update: function update(model, item) { var group = item.getContainer(); this.setLabelText(model, group); }, setState: function setState(name, value, item) { var _this = this; var group = item.getContainer(); var model = item.getModel(); var states = item.getStates(); [WRAPPER_CLASS_NAME, CONTENT_CLASS_NAME, LABEL_CLASS_NAME].forEach(function (className) { var shape = group.findByClassName(className); var options = _this.getOptions(model); var shapeName = className.split('-')[1]; shape.attr(_extends({}, options[shapeName + "Style"])); states.forEach(function (state) { if (options.stateStyles[state] && options.stateStyles[state][shapeName + "Style"]) { shape.attr(_extends({}, options.stateStyles[state][shapeName + "Style"])); } }); }); if (name === ItemState.Selected) { var wrapperShape = group.findByClassName(WRAPPER_CLASS_NAME); var _this$getSize5 = this.getSize(model), width = _this$getSize5[0], height = _this$getSize5[1]; if (value) { wrapperShape.attr({ x: -WRAPPER_BORDER_WIDTH, y: -WRAPPER_BORDER_WIDTH * 2, width: width + WRAPPER_BORDER_WIDTH * 2, height: height + WRAPPER_BORDER_WIDTH * 3 }); } else { wrapperShape.attr({ x: 0, y: -WRAPPER_BORDER_WIDTH * 2, width: width, height: height + WRAPPER_BORDER_WIDTH * 2 }); } } if (this.afterSetState) { this.afterSetState(name, value, item); } }, getSize: function getSize(model) { var _this$getOptions4 = this.getOptions(model), size = _this$getOptions4.size; if (!isArray(size)) { return [size, size]; } return size; }, getCustomConfig: function getCustomConfig() { return {}; }, getAnchorPoints: function getAnchorPoints() { return []; } }; G6.registerNode('bizNode', bizNode); var ANCHOR_POINT_NAME = 'anchorPoint'; var getAnchorPointDefaultStyle = function getAnchorPointDefaultStyle(item, anchorPoint) { var _item$getKeyShape$get = item.getKeyShape().getBBox(), width = _item$getKeyShape$get.width, height = _item$getKeyShape$get.height; var x = anchorPoint[0], y = anchorPoint[1]; return { x: width * x, y: height * y - 3, r: 3, lineWidth: 2, fill: '#FFFFFF', stroke: '#5AAAFF' }; }; var getAnchorPointDefaultDisabledStyle = function getAnchorPointDefaultDisabledStyle(item, anchorPoint) { var _item$getKeyShape$get2 = item.getKeyShape().getBBox(), width = _item$getKeyShape$get2.width, height = _item$getKeyShape$get2.height; var x = anchorPoint[0], y = anchorPoint[1]; return { img: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iOSIgaGVpZ2h0PSI4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xLjUxNSAxLjE3Mmw1LjY1NyA1LjY1Nm0wLTUuNjU2TDEuNTE1IDYuODI4IiBzdHJva2U9IiNGRjYwNjAiIHN0cm9rZS13aWR0aD0iMS42IiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIi8+PC9zdmc+', x: width * x - 4, y: height * y - 8, width: 8, height: 8 }; }; function drawAnchorPoints(item, getAnchorPointStyle, getAnchorPointDisabledStyle) { var group = item.getContainer(); var model = item.getModel(); var anchorPoints = this.getAnchorPoints ? this.getAnchorPoints(model) : []; var anchorPointsState = item.get('anchorPointsState') || []; anchorPoints.forEach(function (anchorPoint, index) { if (anchorPointsState[index] === AnchorPointState.Enabled) { group.addShape('circle', { name: ANCHOR_POINT_NAME, attrs: _extends({}, getAnchorPointDefaultStyle(item, anchorPoint), getAnchorPointStyle(item, anchorPoint)), isAnchorPoint: true, anchorPointIndex: index, anchorPointState: AnchorPointState.Enabled }); } else { group.addShape('image', { name: ANCHOR_POINT_NAME, attrs: _extends({}, getAnchorPointDefaultDisabledStyle(item, anchorPoint), getAnchorPointDisabledStyle(item, anchorPoint)), isAnchorPoint: true, anchorPointIndex: index, anchorPointState: AnchorPointState.Disabled }); } }); } function removeAnchorPoints(item) { var group = item.getContainer(); var anchorPoints = group.findAllByName(ANCHOR_POINT_NAME); anchorPoints.forEach(function (anchorPoint) { group.removeChild(anchorPoint); }); } function setAnchorPointsState(name, value, item, getAnchorPointStyle, getAnchorPointDisabledStyle) { if (getAnchorPointStyle === void 0) { getAnchorPointStyle = function getAnchorPointStyle() { return {}; }; } if (getAnchorPointDisabledStyle === void 0) { getAnchorPointDisabledStyle = function getAnchorPointDisabledStyle() { return {}; }; } if (name !== ItemState.ActiveAnchorPoints) { return; } if (value) { drawAnchorPoints.call(this, item, getAnchorPointStyle, getAnchorPointDisabledStyle); } else { removeAnchorPoints.call(this, item); } } var bizFlowNode = { afterSetState: function afterSetState(name, value, item) { setAnchorPointsState.call(this, name, value, item); }, getAnchorPoints: function getAnchorPoints() { return [[0.5, 0], [0.5, 1], [0, 0.5], [1, 0.5]]; } }; G6.registerNode('bizFlowNode', bizFlowNode, 'bizNode'); var FOLD_BUTTON_CLASS_NAME = 'node-fold-button'; var UNFOLD_BUTTON_CLASS_NAME = 'node-unfold-button'; var bizMindNode = { afterDraw: function afterDraw(model, group) { this.drawButton(model, group); }, afterUpdate: function afterUpdate(model, item) { var group = item.getContainer(); this.drawButton(model, group); this.adjustButton(model, item); }, drawButton: function drawButton(model, group) { var children = model.children, collapsed = model.collapsed; [FOLD_BUTTON_CLASS_NAME, UNFOLD_BUTTON_CLASS_NAME].forEach(function (className) { var shape = group.findByClassName(className); if (shape) { shape.destroy(); } }); if (!children || !children.length) { return; } if (!collapsed) { group.addShape('path', { className: FOLD_BUTTON_CLASS_NAME, attrs: { path: getFoldButtonPath(), fill: '#ffffff', stroke: '#ccc1d8' } }); } else { group.addShape('path', { className: UNFOLD_BUTTON_CLASS_NAME, attrs: { path: getUnfoldButtonPath(), fill: '#ffffff', stroke: '#ccc1d8' } }); } }, adjustButton: function adjustButton(model, item) { var children = model.children, collapsed = model.collapsed; if (!children || !children.length) { return; } var group = item.getContainer(); var shape = group.findByClassName(!collapsed ? FOLD_BUTTON_CLASS_NAME : UNFOLD_BUTTON_CLASS_NAME); var _this$getSize = this.getSize(model), width = _this$getSize[0], height = _this$getSize[1]; var x = getNodeSide(item) === 'left' ? -24 : width + 10; var y = height / 2 - 9; shape.translate(x, y); }, getAnchorPoints: function getAnchorPoints() { return [[0, 0.5], [1, 0.5]]; } }; G6.registerNode('bizMindNode', bizMindNode, 'bizNode'); var _stateStyles$1; var EDGE_LABEL_CLASS_NAME = 'edge-label'; var EDGE_LABEL_WRAPPER_CLASS_NAME = 'edge-label-wrapper-label'; var bizFlowEdge = { options: { style: { stroke: '#ccc1d8', lineWidth: 2, shadowColor: null, shadowBlur: 0, radius: 8, offset: 24, // startArrow: { // path: 'M 3,0 A 3,3,0,1,1,-3,0 A 3,3,0,1,1,3,0 Z', // d: 7, // }, // endArrow: { // path: 'M 3,0 L -3,-3 L -3,3 Z', // d: 5, // }, endArrow: { path: 'M 0,0 L 4,3 L 4,-3 Z' } }, labelCfg: { style: { fill: '#000000', fontSize: 10 } }, stateStyles: (_stateStyles$1 = {}, _stateStyles$1[ItemState.Selected] = { stroke: '#5aaaff', shadowColor: '#5aaaff', shadowBlur: 24 }, _stateStyles$1[ItemState.HighLight] = { stroke: '#5aaaff', shadowColor: '#5aaaff', shadowBlur: 24 }, _stateStyles$1) }, createLabelWrapper: function createLabelWrapper(group) { var label = group.findByClassName(EDGE_LABEL_CLASS_NAME); var labelWrapper = group.findByClassName(EDGE_LABEL_WRAPPER_CLASS_NAME); if (!label) { return; } if (labelWrapper) { return; } group.addShape('rect', { className: EDGE_LABEL_WRAPPER_CLASS_NAME, attrs: { fill: '#e1e5e8', radius: 2 } }); label.set('zIndex', 1); group.sort(); }, updateLabelWrapper: function updateLabelWrapper(group) { var label = group.findByClassName(EDGE_LABEL_CLASS_NAME); var labelWrapper = group.findByClassName(EDGE_LABEL_WRAPPER_CLASS_NAME); if (!label) { labelWrapper && labelWrapper.hide(); return; } else { labelWrapper && labelWrapper.show(); } if (!labelWrapper) { return; } var _label$getBBox = label.getBBox(), minX = _label$getBBox.minX, minY = _label$getBBox.minY, width = _label$getBBox.width, height = _label$getBBox.height; labelWrapper.attr({ x: minX - 5, y: minY - 3, width: width + 10, height: height + 6 }); }, afterDraw: function afterDraw(model, group) { this.createLabelWrapper(group); this.updateLabelWrapper(group); }, afterUpdate: function afterUpdate(model, item) { var group = item.getContainer(); this.createLabelWrapper(group); this.updateLabelWrapper(group); }, setState: function setState(name, value, item) { var shape = item.get('keyShape'); if (!shape) { return; } var _this$options = this.options, style = _this$options.style, stateStyles = _this$options.stateStyles; var stateStyle = stateStyles[name]; if (!stateStyle) { return; } if (value) { shape.attr(_extends({}, style, stateStyle)); } else { shape.attr(style); } } }; G6.registerEdge('bizFlowEdge', bizFlowEdge, 'polyline'); var _stateStyles$2; var bizMindEdge = { options: { style: { stroke: '#ccc1d8', lineWidth: 2, shadowColor: null, shadowBlur: 0 }, stateStyles: (_stateStyles$2 = {}, _stateStyles$2[ItemState.Selected] = { stroke: '#5aaaff', shadowColor: '#5aaaff', shadowBlur: 24 }, _stateStyles$2[ItemState.HighLight] = { stroke: '#5aaaff', shadowColor: '#5aaaff', shadowBlur: 24 }, _stateStyles$2) }, setState: function setState(name, value, item) { var shape = item.get('keyShape'); if (!shape) { return; } var _this$options = this.options, style = _this$options.style, stateStyles = _this$options.stateStyles; var stateStyle = stateStyles[name]; if (!stateStyle) { return; } if (value) { shape.attr(_extends({}, style, stateStyle)); } else { shape.attr(style); } } }; G6.registerEdge('bizMindEdge', bizMindEdge, 'cubic-horizontal'); /** 生成唯一标识 */ function guid() { return 'xxxxxxxx'.replace(/[xy]/g, function (c) { var r = Math.random() * 16 | 0; var v = c === 'x' ? r : r & 0x3 | 0x8; return v.toString(16); }); } /** 拼接查询字符 */ var toQueryString = function toQueryString(obj) { return Object.keys(obj).map(function (key) { return encodeURIComponent(key) + "=" + encodeURIComponent(obj[key]); }).join('&'); }; /** 执行批量处理 */ function executeBatch(graph, execute) { var autoPaint = graph.get('autoPaint'); graph.setAutoPaint(false); execute(); graph.paint(); graph.setAutoPaint(autoPaint); } /** 执行递归遍历 */ function recursiveTraversal(root, callback) { if (!root) { return; } callback(root); if (!root.children) { return; } root.children.forEach(function (item) { return recursiveTraversal(item, callback); }); } /** 判断是否流程图 */ function isFlow(graph) { return graph.constructor === G6.Graph; } /** 判断是否脑图 */ function isMind(graph) { return graph.constructor === G6.TreeGraph; } /** 判断是否节点 */ function isNode(item) { return item.getType() === ItemType.Node; } /** 判断是否边线 */ function isEdge(item) { return item.getType() === ItemType.Edge; } /** 获取选中节点 */ function getSelectedNodes(graph) { return graph.findAllByState(ItemType.Node, ItemState.Selected); } /** 获取选中边线 */ function getSelectedEdges(graph) { return graph.findAllByState(ItemType.Edge, ItemState.Selected); } /** 获取高亮边线 */ function getHighlightEdges(graph) { return graph.findAllByState(ItemType.Edge, ItemState.HighLight); } /** 获取图表状态 */ function getGraphState(graph) { var graphState = GraphState.MultiSelected; var selectedNodes = getSelectedNodes(graph); var selectedEdges = getSelectedEdges(graph); if (selectedNodes.length === 1 && !selectedEdges.length) { graphState = GraphState.NodeSelected; } if (selectedEdges.length === 1 && !selectedNodes.length) { graphState = GraphState.EdgeSelected; } if (!selectedNodes.length && !selectedEdges.length) { graphState = GraphState.CanvasSelected; } return graphState; } /** 设置选中元素 */ function setSelectedItems(graph, items) { executeBatch(graph, function () { var selectedNodes = getSelectedNodes(graph); var selectedEdges = getSelectedEdges(graph); [].concat(selectedNodes, selectedEdges).forEach(function (node) { graph.setItemState(node, ItemState.Selected, false); }); items.forEach(function (item) { graph.setItemState(item, ItemState.Selected, true); }); }); graph.emit(EditorEvent.onGraphStateChange, { graphState: getGraphState(graph) }); } /** 清除选中状态 */ function clearSelectedState(graph, shouldUpdate) { if (shouldUpdate === void 0) { shouldUpdate = function shouldUpdate() { return true; }; } var selectedNodes = getSelectedNodes(graph); var selectedEdges = getSelectedEdges(graph); executeBatch(graph, function () { [].concat(selectedNodes, selectedEdges).forEach(function (item) { if (shouldUpdate(item)) { graph.setItemState(item, ItemState.Selected, false); } }); }); } /** 获取回溯路径 - Flow */ function getFlowRecallEdges(graph, node, targetIds, edges) { if (targetIds === void 0) { targetIds = []; } if (edges === void 0) { edges = []; } var inEdges = node.getInEdges(); if (!inEdges.length) { return []; } inEdges.map(function (edge) { var sourceId = edge.getModel().source; var sourceNode = graph.findById(sourceId); edges.push(edge); var targetId = node.get('id'); targetIds.push(targetId); if (!targetIds.includes(sourceId)) { getFlowRecallEdges(graph, sourceNode, targetIds, edges); } }); return edges; } /** 获取回溯路径 - Mind */ function getMindRecallEdges(graph, node, edges) { if (edges === void 0) { edges = []; } var parentNode = node.get('parent'); if (!parentNode) { return edges; } node.getEdges().forEach(function (edge) { var source = edge.getModel().source; if (source.get('id') === parentNode.get('id')) { edges.push(edge); } }); return getMindRecallEdges(graph, parentNode, edges); } var index$1 = /*#__PURE__*/Object.freeze({ __proto__: null, guid: guid, toQueryString: toQueryString, executeBatch: executeBatch, recursiveTraversal: recursiveTraversal, isFlow: isFlow, isMind: isMind, isNode: isNode, isEdge: isEdge, getSelectedNodes: getSelectedNodes, getSelectedEdges: getSelectedEdges, getHighlightEdges: getHighlightEdges, getGraphState: getGraphState, setSelectedItems: setSelectedItems, clearSelectedState: clearSelectedState, getFlowRecallEdges: getFlowRecallEdges, getMindRecallEdges: getMindRecallEdges }); var Global = function Global() { /** 当前版本 */ this.version = "3.1.3"; /** 埋点开关 */ this.trackable = true; /** 剪贴板 */ this.clipboard = { point: { x: 0, y: 0 }, models: [] }; /** 组件数据 */ this.component = { itemPanel: { model: null, delegateShapeClassName: "delegateShape_" + guid() } }; /** 插件数据 */ this.plugin = { itemPopover: { state: 'hide' }, contextMenu: { state: 'hide' }, editableLabel: { state: 'hide' } }; }; var global = new Global(); var CommandManager = /*#__PURE__*/function () { function CommandManager() { this.command = {}; this.commandQueue = []; this.commandIndex = 0; } /** 注册命令 */ var _proto = CommandManager.prototype; _proto.register = function register(name, command) { this.command[name] = _extends({}, command, { name: name }); } /** 执行命令 */ ; _proto.execute = function execute(graph, name, params) { var Command = this.command[name]; if (!Command) { return; } var command = Object.create(Command); command.params = cloneDeep(Command.params); if (params) { command.params = _extends({}, command.params, params); } if (!command.canExecute(graph)) { return; } if (!command.shouldExecute(graph)) { return; } command.init(graph); graph.emit(EditorEvent.onBeforeExecuteCommand, { name: command.name, params: command.params }); command.execute(graph); graph.emit(EditorEvent.onAfterExecuteCommand, { name: command.name, params: command.params }); if (command.canUndo(graph)) { var commandQueue = this.commandQueue, commandIndex = this.commandIndex; commandQueue.splice(commandIndex, commandQueue.length - commandIndex, command); this.commandIndex += 1; } graph.emit(EditorEvent.onGraphStateChange, { graphState: getGraphState(graph) }); } /** 判断是否可以执行 */ ; _proto.canExecute = function canExecute(graph, name) { return this.command[name].canExecute(graph); } /** 注入是否应该执行 */ ; _proto.injectShouldExecute = function injectShouldExecute(name, shouldExecute) { this.command[name].shouldExecute = shouldExecute; }; return CommandManager; }(); function withContext (Context, shouldRender) { if (shouldRender === void 0) { shouldRender = function shouldRender() { return true; }; } return function (WrappedComponent) { var InjectContext = function InjectContext(props) { var forwardRef = props.forwardRef, rest = _objectWithoutPropertiesLoose(props, ["forwardRef"]); var refProp = {}; if (WrappedComponent.prototype.isReactComponent) { refProp = { ref: forwardRef }; } else { refProp = { forwardRef: forwardRef }; } return /*#__PURE__*/React.createElement(Context.Consumer, null, function (context) { return shouldRender(context) ? /*#__PURE__*/React.createElement(WrappedComponent, Object.assign({}, refProp, rest, context)) : null; }); }; return /*#__PURE__*/React.forwardRef(function (props, ref) { return /*#__PURE__*/React.createElement(InjectContext, Object.assign({ forwardRef: ref }, props)); }); }; } var EditorContext = /*#__PURE__*/React.createContext({}); var EditorPrivateContext = /*#__PURE__*/React.createContext({}); var withEditorContext = withContext(EditorContext, function (context) { return !!context.graph; }); var withEditorPrivateContext = withContext(EditorPrivateContext); var _Editor$defaultProps; var Editor = /*#__PURE__*/function (_React$Component) { _inheritsLoose(Editor, _React$Component); function Editor(props) { var _this; _this = _React$Component.call(this, props) || this; _this.lastMousedownTarget = null; _this.setGraph = function (graph) { _this.setState({ graph: graph }); _this.bindEvent(graph); _this.bindShortcut(graph); }; _this.executeCommand = function (name, params) { var _this$state = _this.state, graph = _this$state.graph, commandManager = _this$state.commandManager; if (graph) { commandManager.execute(graph, name, params); } }; _this.state = { graph: null, setGraph: _this.setGraph, executeCommand: _this.executeCommand, commandManager: new CommandManager() }; _this.lastMousedownTarget = null; return _this; } Editor.setTrackable = function setTrackable(trackable) { global.trackable = trackable; }; var _proto = Editor.prototype; _proto.shouldTriggerShortcut = function shouldTriggerShortcut(graph, target) { var renderer = graph.get('renderer'); var canvasElement = graph.get('canvas').get('el'); if (!target) { return false; } if (target === canvasElement) { return true; } if (renderer === RendererType.Svg) { if (target.nodeName === 'svg') { return true; } var parentNode = target.parentNode; while (parentNode && parentNode.nodeName !== 'BODY') { if (parentNode.nodeName === 'svg') { return true; } else { parentNode = parentNode.parentNode; } } return false; } }; _proto.bindEvent = function bindEvent(graph) { var props = this.props; graph.on(EditorEvent.onBeforeExecuteCommand, props[EditorEvent.onBeforeExecuteCommand]); graph.on(EditorEvent.onAfterExecuteCommand, props[EditorEvent.onAfterExecuteCommand]); }; _proto.bindShortcut = function bindShortcut(graph) { var _this2 = this; var commandManager = this.state.commandManager; window.addEventListener(GraphCommonEvent.onMouseDown, function (e) { _this2.lastMousedownTarget = e.target; }); graph.on(GraphCommonEvent.onKeyDown, function (e) { if (!_this2.shouldTriggerShortcut(graph, _this2.lastMousedownTarget)) { return; } Object.values(commandManager.command).some(function (command) { var name = command.name, shortcuts = command.shortcuts; var flag = shortcuts.some(function (shortcut) { var key = e.key; if (!isArray(shortcut)) { return shortcut === key; } return shortcut.every(function (item, index) { if (index === shortcut.length - 1) { return item === key; } return e[item]; }); }); if (flag) { if (commandManager.canExecute(graph, name)) { // Prevent default e.preventDefault(); // Execute command _this2.executeCommand(name); return true; } } return false; }); }); }; _proto.render = function render() { var children = this.props.children; var _this$state2 = this.state, graph = _this$state2.graph, setGraph = _this$state2.setGraph, executeCommand = _this$state2.executeCommand, commandManager = _this$state2.commandManager; return /*#__PURE__*/React.createElement(EditorContext.Provider, { value: { graph: graph, executeCommand: executeCommand, commandManager: commandManager } }, /*#__PURE__*/React.createElement(EditorPrivateContext.Provider, { value: { setGraph: setGraph, commandManager: commandManager } }, /*#__PURE__*/React.createElement("div", Object.assign({}, pick(this.props, ['className', 'style'])), children))); }; return Editor; }(React.Component); Editor.defaultProps = (_Editor$defaultProps = {}, _Editor$defaultProps[EditorEvent.onBeforeExecuteCommand] = function () {}, _Editor$defaultProps[EditorEvent.onAfterExecuteCommand] = function () {}, _Editor$defaultProps); var BehaviorManager = /*#__PURE__*/function () { function BehaviorManager() { this.behaviors = {}; } var _proto = BehaviorManager.prototype; _proto.getRegisteredBehaviors = function getRegisteredBehaviors(type) { var _this = this; var registeredBehaviors = {}; Object.keys(this.behaviors).forEach(function (name) { var behavior = _this.behaviors[name]; var graphType = behavior.graphType; if (graphType && graphType !== type) { return; } var _behavior$graphMode = behavior.graphMode, graphMode = _behavior$graphMode === void 0 ? 'default' : _behavior$graphMode; if (!registeredBehaviors[graphMode]) { registeredBehaviors[graphMode] = {}; } registeredBehaviors[graphMode][name] = name; }); return registeredBehaviors; }; _proto.wrapEventHandler = function wrapEventHandler(type, behavior) { var events = behavior.getEvents(); Object.keys(events).forEach(function (event) { var handlerName = events[event]; var handler = behavior[handlerName]; behavior[handlerName] = function () { var graph = this.graph; if (type === GraphType.Flow && isMind(graph) === false || type === GraphType.Mind && isMind(graph)) { for (var _len = arguments.length, params = new Array(_len), _key = 0; _key < _len; _key++) { params[_key] = arguments[_key]; } handler.apply(this, params); } }; }); return behavior; }; _proto.register = function register(name, behavior) { var graphType = behavior.graphType; this.behaviors[name] = behavior; switch (graphType) { case GraphType.Flow: G6.registerBehavior(name, this.wrapEventHandler(GraphType.Flow, behavior)); break; case GraphType.Mind: G6.registerBehavior(name, this.wrapEventHandler(GraphType.Mind, behavior)); break; default: G6.registerBehavior(name, behavior); break; } }; return BehaviorManager; }(); var behaviorManager = new BehaviorManager(); var BASE_URL = 'http://gm.mmstat.com/fsp.1.1'; function track(graphType) { var version = global.version; var trackable = global.trackable; if (!trackable) { return; } var _window = window, location = _window.location, navigator = _window.navigator; var image = new Image(); var params = toQueryString({ pid: 'ggeditor', code: '11', msg: 'syslog', page: location.protocol + "//" + location.host + location.pathname, hash: location.hash, ua: navigator.userAgent, rel: version, c1: graphType }); image.src = BASE_URL + "?" + params; } var redoCommand = { name: 'redo', params: {}, canExecute: function canExecute(graph) { var commandManager = graph.get('commandManager'); var commandQueue = commandManager.commandQueue, commandIndex = commandManager.commandIndex; return commandIndex < commandQueue.length; }, shouldExecute: function shouldExecute() { return true; }, canUndo: function canUndo() { return false; }, init: function init() {}, execute: function execute(graph) { var commandManager = graph.get('commandManager'); var commandQueue = commandManager.commandQueue, commandIndex = commandManager.commandIndex; commandQueue[commandIndex].execute(graph); commandManager.commandIndex += 1; }, undo: function undo() {}, shortcuts: [['metaKey', 'shiftKey', 'z'], ['ctrlKey', 'shiftKey', 'z']] }; var undoCommand = { name: 'undo', params: {}, canExecute: function canExecute(graph) { var commandManager = graph.get('commandManager'); var commandIndex = commandManager.commandIndex; return commandIndex > 0; }, shouldExecute: function shouldExecute() { return true; }, canUndo: function canUndo() { return false; }, init: function init() {}, execute: function execute(graph) { var commandManager = graph.get('commandManager'); var commandQueue = commandManager.commandQueue, commandIndex = commandManager.commandIndex; commandQueue[commandIndex - 1].undo(graph); commandManager.commandIndex -= 1; }, undo: function undo() {}, shortcuts: [['metaKey', 'z'], ['ctrlKey', 'z']] }; var baseCommand = { name: '', params: {}, canExecute: function canExecute() { return true; }, shouldExecute: function shouldExecute() { return true; }, canUndo: function canUndo() { return true; }, init: function init() {}, execute: function execute() {}, undo: function undo() {}, shortcuts: [], isMind: isMind, getSelectedNodes: getSelectedNodes, getSelectedEdges: getSelectedEdges, setSelectedItems: setSelectedItems, editSelectedNode: function editSelectedNode(graph) { graph.emit(EditorEvent.onLabelStateChange, { labelState: LabelState.Show }); } }; var addCommand = _extends({}, baseCommand, { params: { type: ItemType.Node, model: { id: '' } }, init: function init() { var model = this.params.model; if (model.id) { return; } model.id = guid(); }, execute: function execute(graph) { var _this$params = this.params, type = _this$params.type, model = _this$params.model; graph.add(type, model); this.setSelectedItems(graph, [model.id]); }, undo: function undo(graph) { var model = this.params.model; graph.remove(model.id); } }); var removeCommand = _extends({}, baseCommand, { params: { flow: { nodes: {}, edges: {} }, mind: { model: null, parent: '' } }, canExecute: function canExecute(graph) { var selectedNodes = this.getSelectedNodes(graph); var selectedEdges = this.getSelectedEdges(graph); return !!(selectedNodes.length || selectedEdges.length); }, init: function init(graph) { var selectedNodes = this.getSelectedNodes(graph); var selectedEdges = this.getSelectedEdges(graph); if (isMind(graph)) { var selectedNode = selectedNodes[0]; var selectedNodeModel = selectedNode.getModel(); var selectedNodeParent = selectedNode.get('parent'); var selectedNodeParentModel = selectedNodeParent ? selectedNodeParent.getModel() : {}; this.params.mind = { model: selectedNodeModel,