@logicflow/extension
Version:
LogicFlow Extensions
161 lines (160 loc) • 7.47 kB
JavaScript
var __read = (this && this.__read) || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
}
catch (error) { e = { error: error }; }
finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
}
finally { if (e) throw e.error; }
}
return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
import { EventType, formatAnchorConnectValidateData, } from '@logicflow/core';
import { cloneDeep } from 'lodash-es';
import { isNodeInSegment } from './edge';
var InsertNodeInPolyline = /** @class */ (function () {
function InsertNodeInPolyline(_a) {
var lf = _a.lf;
this._lf = lf;
// fix https://github.com/didi/LogicFlow/issues/754
this.deviation = 20;
this.dndAdd = true;
this.dropAdd = true;
this.eventHandler();
}
InsertNodeInPolyline.prototype.eventHandler = function () {
var _this = this;
// 监听事件
if (this.dndAdd) {
this._lf.on('node:dnd-add', function (_a) {
var data = _a.data;
_this.insetNode(data);
});
}
if (this.dropAdd) {
this._lf.on('node:drop', function (_a) {
var data = _a.data;
var edges = _this._lf.graphModel.edges;
var id = data.id;
// 只有游离节点才能插入到连线上
var pureNode = true;
for (var i = 0; i < edges.length; i++) {
if (edges[i].sourceNodeId === id || edges[i].targetNodeId === id) {
pureNode = false;
break;
}
}
if (pureNode) {
_this.insetNode(data);
}
});
}
};
/**
* 插入节点前校验规则
* @param sourceNodeId
* @param targetNodeId
* @param sourceAnchorId
* @param targetAnchorId
* @param nodeData
*/
// fix: https://github.com/didi/LogicFlow/issues/1078
InsertNodeInPolyline.prototype.checkRuleBeforeInsetNode = function (sourceNodeId, targetNodeId, sourceAnchorId, targetAnchorId, nodeData) {
var sourceNodeModel = this._lf.getNodeModelById(sourceNodeId);
var targetNodeModel = this._lf.getNodeModelById(targetNodeId);
var sourceAnchorInfo = sourceNodeModel.getAnchorInfo(sourceAnchorId);
var targetAnchorInfo = targetNodeModel.getAnchorInfo(targetAnchorId);
// TODO: nodeData 与 isAllowConnectedAsSource 方法需要的类型 BaseNodeModel 不一致,少了 target 属性等,需要验证是否可用。
var sourceRuleResultData = sourceNodeModel.isAllowConnectedAsSource(nodeData, sourceAnchorInfo, targetAnchorInfo);
var targetRuleResultData = targetNodeModel.isAllowConnectedAsTarget(nodeData, sourceAnchorInfo, targetAnchorInfo);
var _a = formatAnchorConnectValidateData(sourceRuleResultData), isSourcePass = _a.isAllPass, sourceMsg = _a.msg;
var _b = formatAnchorConnectValidateData(targetRuleResultData), isTargetPass = _b.isAllPass, targetMsg = _b.msg;
return {
isPass: isSourcePass && isTargetPass,
sourceMsg: sourceMsg,
targetMsg: targetMsg,
};
};
InsertNodeInPolyline.prototype.insetNode = function (nodeData) {
var _this = this;
var edges = this._lf.graphModel.edges;
var nodeModel = this._lf.getNodeModelById(nodeData.id);
// fix: https://github.com/didi/LogicFlow/issues/1077
// 参照https://github.com/didi/LogicFlow/issues/454=>当getDefaultAnchor(){return []}表示:不显示锚点,也不允许其他节点连接到此节点
// 当getDefaultAnchor=[],直接阻止下面进行edges的截断插入node相关逻辑
var anchorArray = nodeModel === null || nodeModel === void 0 ? void 0 : nodeModel.getDefaultAnchor();
var isNotAllowConnect = !anchorArray || anchorArray.length === 0;
if (isNotAllowConnect) {
this._lf.graphModel.eventCenter.emit(EventType.CONNECTION_NOT_ALLOWED, {
data: nodeData,
msg: '自定义类型节点不显示锚点,也不允许其他节点连接到此节点',
});
return;
}
if (!nodeModel)
return;
for (var i = 0; i < edges.length; i++) {
var _a = isNodeInSegment(nodeModel, edges[i], this.deviation), crossIndex = _a.crossIndex, crossPoints = _a.crossPoints;
if (crossIndex >= 0) {
var _b = edges[i], sourceNodeId = _b.sourceNodeId, targetNodeId = _b.targetNodeId, id = _b.id, type = _b.type, pointsList = _b.pointsList, sourceAnchorId = _b.sourceAnchorId, targetAnchorId = _b.targetAnchorId;
// fix https://github.com/didi/LogicFlow/issues/996
var startPoint = cloneDeep(pointsList[0]);
var endPoint = cloneDeep(crossPoints.startCrossPoint);
this._lf.deleteEdge(id);
var checkResult = this.checkRuleBeforeInsetNode(sourceNodeId, targetNodeId, sourceAnchorId, targetAnchorId, nodeData);
this._lf.addEdge({
type: type,
sourceNodeId: sourceNodeId,
targetNodeId: nodeData.id,
startPoint: startPoint,
endPoint: endPoint,
pointsList: __spreadArray(__spreadArray([], __read(pointsList.slice(0, crossIndex)), false), [
crossPoints.startCrossPoint,
], false),
});
this._lf.addEdge({
type: type,
sourceNodeId: nodeData.id,
targetNodeId: targetNodeId,
startPoint: cloneDeep(crossPoints.endCrossPoint),
endPoint: cloneDeep(pointsList[pointsList.length - 1]),
pointsList: __spreadArray([
crossPoints.endCrossPoint
], __read(pointsList.slice(crossIndex)), false),
});
if (!checkResult.isPass) {
this._lf.graphModel.eventCenter.emit(EventType.CONNECTION_NOT_ALLOWED, {
data: nodeData,
msg: checkResult.targetMsg || checkResult.sourceMsg,
});
// FIXME:在关闭了历史记录的情况下,撤销操作会不生效。
setTimeout(function () {
_this._lf.undo();
}, 200);
break;
}
else {
break;
}
}
}
};
InsertNodeInPolyline.pluginName = 'insertNodeInPolyline';
return InsertNodeInPolyline;
}());
export { InsertNodeInPolyline };
export default InsertNodeInPolyline;