241 lines
11 KiB
JavaScript
241 lines
11 KiB
JavaScript
/**
|
||
* @author: clay
|
||
* @data: 2019/07/16
|
||
* @description: edit mode: 通过拖拽节点上的锚点添加连线
|
||
*/
|
||
import utils from "../../utils";
|
||
|
||
// 用来获取调用此js的vue组件实例(this)
|
||
let vm = null;
|
||
|
||
const sendThis = (_this) => {
|
||
vm = _this;
|
||
};
|
||
|
||
import theme from "../theme";
|
||
import {ElMessage} from "element-plus";
|
||
|
||
export default {
|
||
sendThis, // 暴露函数
|
||
name: "drag-add-edge",
|
||
options: {
|
||
getEvents() {
|
||
return {
|
||
"node:mousedown": "onNodeMousedown",
|
||
"node:mouseup": "onNodeMouseup",
|
||
"edge:mouseup": "onEdgeMouseup",
|
||
"mousemove": "onMousemove"
|
||
};
|
||
},
|
||
onNodeMousedown(event) {
|
||
let self = this;
|
||
// 交互过程中的信息
|
||
self.evtInfo = {
|
||
action: null,
|
||
node: event.item,
|
||
target: event.target,
|
||
};
|
||
if (self.evtInfo.target && self.evtInfo.target.attrs.name) {
|
||
// todo...未来可能针对锚点增加其它功能(例如拖拽调整大小)
|
||
switch (self.evtInfo.target.attrs.name) {
|
||
case "anchor":
|
||
self.evtInfo.action = "drawEdge";
|
||
break;
|
||
}
|
||
}
|
||
if (self.evtInfo && self.evtInfo.action) {
|
||
self[self.evtInfo.action].start.call(self, event);
|
||
}
|
||
},
|
||
onNodeMouseup(event) {
|
||
let self = this;
|
||
if (self.evtInfo && self.evtInfo.action) {
|
||
self[self.evtInfo.action].stop.call(self, event);
|
||
}
|
||
},
|
||
onEdgeMouseup(event) {
|
||
let self = this;
|
||
if (self.evtInfo && self.evtInfo.action === "drawEdge") {
|
||
self[self.evtInfo.action].stop.call(self, event);
|
||
}
|
||
},
|
||
onMousemove(event) {
|
||
let self = this;
|
||
if (self.evtInfo && self.evtInfo.action) {
|
||
self[self.evtInfo.action].move.call(self, event);
|
||
}
|
||
},
|
||
drawEdge: {
|
||
isMoving: false,
|
||
currentLine: null,
|
||
start: function (event) {
|
||
let self = this;
|
||
let themeStyle = theme.defaultStyle; // todo...先使用默认主题,后期可能增加其它风格的主体
|
||
|
||
// ************** 暂存【连线】前的数据状态 start **************
|
||
let graph = vm.getGraph();
|
||
self.historyData = JSON.stringify(graph.save());
|
||
// ************** 暂存【连线】前的数据状态 end **************
|
||
|
||
let sourceAnchor = self.evtInfo.node.getAnchorPoints();
|
||
let sourceNodeModel = toRaw(self.evtInfo.node.getModel());
|
||
// 锚点数据
|
||
let anchorPoints = self.evtInfo.node.getAnchorPoints();
|
||
// 处理线条目标点
|
||
if (anchorPoints && anchorPoints.length) {
|
||
// 获取距离指定坐标最近的一个锚点
|
||
sourceAnchor = self.evtInfo.node.getLinkPoint({
|
||
x: event.x,
|
||
y: event.y
|
||
})
|
||
}
|
||
// let relational = vm.getRelationalMap().get(sourceNodeModel.tableId)
|
||
let relational = vm.getRelationalMap().map(item => {
|
||
if (item.mainId === sourceNodeModel.tableId) {
|
||
return item
|
||
}
|
||
})
|
||
//item.columnName+':'+item.columnComment
|
||
let columns = []
|
||
for (let i = 0; i < sourceNodeModel.columns.length; i++) {
|
||
let column = {
|
||
columnName: sourceNodeModel.columns[i].columnName,
|
||
columnComment: sourceNodeModel.columns[i].columnComment
|
||
}
|
||
columns.push(column)
|
||
}
|
||
self.drawEdge.currentLine = self.graph.addItem("edge", {
|
||
// id: G6.Util.uniqueId(), // 这种生成id的方式有bug,会重复
|
||
id: utils.generateUUID(),
|
||
// 起始节点
|
||
source: sourceNodeModel.id,
|
||
sourceColumn: columns,
|
||
sourceAnchor: sourceAnchor ? sourceAnchor.anchorIndex : "",
|
||
// 终止节点/位置
|
||
relational: relational,
|
||
target: {
|
||
x: event.x,
|
||
y: event.y
|
||
},
|
||
type: self.graph.$C.edge.type || "top-cubic",
|
||
style: themeStyle.edgeStyle.default || self.graph.$C.edge.style
|
||
});
|
||
self.drawEdge.isMoving = true;
|
||
},
|
||
move(event) {
|
||
let self = this;
|
||
if (self.drawEdge.isMoving && self.drawEdge.currentLine) {
|
||
self.graph.updateItem(self.drawEdge.currentLine, {
|
||
target: {
|
||
x: event.x,
|
||
y: event.y
|
||
}
|
||
});
|
||
}
|
||
},
|
||
stop(event) {
|
||
let self = this;
|
||
if (self.drawEdge.isMoving) {
|
||
if (self.drawEdge.currentLine === event.item) {
|
||
// 画线过程中点击则移除当前画线
|
||
self.graph.removeItem(event.item);
|
||
} else {
|
||
let targetNode = event.item;
|
||
let targetNodeModel = toRaw(targetNode.getModel());
|
||
let targetAnchor = null;
|
||
// 锚点数据
|
||
let anchorPoints = targetNode.getAnchorPoints();
|
||
// 处理线条目标点
|
||
let relational = self.drawEdge.currentLine.getModel().relational
|
||
let starts = false;
|
||
let relationalItem = null;
|
||
if (relational) {
|
||
// let flag = false
|
||
// relational.forEach(item=>{
|
||
// flag = item.childId=== targetNodeModel.tableId
|
||
// })
|
||
// if(flag) {
|
||
// starts = true
|
||
// relationalItem = relational
|
||
// }
|
||
relational.map(item => {
|
||
if (item) {
|
||
if (item.childId === targetNodeModel.tableId) {
|
||
starts = true
|
||
relationalItem = item
|
||
}else {
|
||
starts = false
|
||
}
|
||
}
|
||
})
|
||
}
|
||
// 去掉关系验证
|
||
// starts = true
|
||
if (starts) {
|
||
if (anchorPoints && anchorPoints.length) {
|
||
// 获取距离指定坐标最近的一个锚点
|
||
targetAnchor = targetNode.getLinkPoint({
|
||
x: event.x,
|
||
y: event.y
|
||
});
|
||
}
|
||
let columns = []
|
||
for (let i = 0; i < targetNodeModel.columns.length; i++) {
|
||
let column = {
|
||
columnName: targetNodeModel.columns[i].columnName,
|
||
columnComment: targetNodeModel.columns[i].columnComment
|
||
}
|
||
columns.push(column)
|
||
}
|
||
self.graph.updateItem(self.drawEdge.currentLine, {
|
||
target: targetNodeModel.id,
|
||
relationalItem: relationalItem,
|
||
targetAnchor: targetAnchor ? targetAnchor.anchorIndex : "",
|
||
targetColumn: columns,
|
||
});
|
||
|
||
// ************** 记录historyData的逻辑 start **************
|
||
if (self.historyData) {
|
||
let graph = self.graph;
|
||
// 如果当前点过【撤销】了,拖拽节点后没有【重做】功能
|
||
// 重置undoCount,拖拽后的数据给(当前所在historyIndex + 1),且清空这个时间点之后的记录
|
||
if (vm.undoCount > 0) {
|
||
vm.historyIndex = vm.historyIndex - vm.undoCount;// 此时的historyIndex应当更新为【撤销】后所在的索引位置
|
||
|
||
for (let i = 1; i <= vm.undoCount; i++) {
|
||
let key = `graph_history_${vm.historyIndex + i}`;
|
||
vm.removeHistoryData(key);
|
||
}
|
||
vm.editUndoCount(0)
|
||
// vm.undoCount=0
|
||
} else {
|
||
// 正常顺序执行的情况,记录拖拽前的数据状态
|
||
let key = `graph_history_${vm.historyIndex}`;
|
||
vm.addHistoryData(key, self.historyData);
|
||
}
|
||
// 记录拖拽后的数据状态
|
||
vm.historyIndex += 1
|
||
vm.getHistoryIndex(vm.historyIndex);
|
||
let key = `graph_history_${vm.historyIndex}`;
|
||
let currentData = JSON.stringify(graph.save());
|
||
vm.addHistoryData(key, currentData);
|
||
}
|
||
} else {
|
||
if(self.evtInfo.node.getModel().tableId===targetNodeModel.tableId){
|
||
ElMessage.warning("不可连接自身")
|
||
}else {
|
||
ElMessage.warning("两表之间无关联关系")
|
||
}
|
||
self.graph.removeItem(self.drawEdge.currentLine);
|
||
}
|
||
// ************** 记录historyData的逻辑 end **************
|
||
}
|
||
}
|
||
self.drawEdge.currentLine = null;
|
||
self.drawEdge.isMoving = false;
|
||
self.evtInfo = null;
|
||
}
|
||
}
|
||
}
|
||
};
|