@logicflow/core 2.0.6 → 2.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/.turbo/turbo-build$colon$dev.log +2 -2
  2. package/.turbo/turbo-build.log +3 -19
  3. package/CHANGELOG.md +31 -0
  4. package/__tests__/algorithm/egde.test.ts +36 -23
  5. package/dist/index.css +3 -0
  6. package/es/algorithm/edge.js +3 -5
  7. package/es/constant/index.d.ts +4 -0
  8. package/es/constant/index.js +4 -0
  9. package/es/event/eventArgs.d.ts +40 -30
  10. package/es/index.css +3 -0
  11. package/es/model/GraphModel.d.ts +13 -3
  12. package/es/model/GraphModel.js +54 -3
  13. package/es/model/edge/BaseEdgeModel.d.ts +1 -0
  14. package/es/model/edge/LineEdgeModel.d.ts +2 -0
  15. package/es/model/edge/LineEdgeModel.js +8 -0
  16. package/es/model/edge/PolylineEdgeModel.d.ts +1 -0
  17. package/es/model/edge/PolylineEdgeModel.js +4 -3
  18. package/es/model/node/BaseNodeModel.d.ts +2 -2
  19. package/es/model/node/BaseNodeModel.js +1 -1
  20. package/es/model/node/HtmlNodeModel.d.ts +2 -2
  21. package/es/model/node/TextNodeModel.d.ts +2 -2
  22. package/es/style/index.css +3 -0
  23. package/es/style/index.less +5 -0
  24. package/es/style/raw.d.ts +1 -1
  25. package/es/style/raw.js +1 -1
  26. package/es/util/drag.d.ts +1 -0
  27. package/es/util/drag.js +11 -0
  28. package/es/view/Anchor.js +6 -8
  29. package/es/view/Control.js +1 -1
  30. package/es/view/Graph.js +3 -15
  31. package/es/view/behavior/dnd.js +1 -0
  32. package/es/view/edge/BaseEdge.d.ts +5 -1
  33. package/es/view/edge/BaseEdge.js +20 -5
  34. package/es/view/node/BaseNode.d.ts +2 -0
  35. package/es/view/node/BaseNode.js +13 -1
  36. package/es/view/overlay/BackgroundOverlay.d.ts +4 -14
  37. package/es/view/overlay/BackgroundOverlay.js +12 -1
  38. package/es/view/overlay/Grid.d.ts +4 -3
  39. package/es/view/overlay/Grid.js +8 -31
  40. package/es/view/overlay/getTransformHoc.d.ts +1 -1
  41. package/es/view/text/BaseText.js +1 -1
  42. package/lib/algorithm/edge.js +3 -5
  43. package/lib/constant/index.d.ts +4 -0
  44. package/lib/constant/index.js +4 -0
  45. package/lib/event/eventArgs.d.ts +40 -30
  46. package/lib/index.css +3 -0
  47. package/lib/model/GraphModel.d.ts +13 -3
  48. package/lib/model/GraphModel.js +53 -2
  49. package/lib/model/edge/BaseEdgeModel.d.ts +1 -0
  50. package/lib/model/edge/LineEdgeModel.d.ts +2 -0
  51. package/lib/model/edge/LineEdgeModel.js +8 -0
  52. package/lib/model/edge/PolylineEdgeModel.d.ts +1 -0
  53. package/lib/model/edge/PolylineEdgeModel.js +4 -3
  54. package/lib/model/node/BaseNodeModel.d.ts +2 -2
  55. package/lib/model/node/BaseNodeModel.js +1 -1
  56. package/lib/model/node/HtmlNodeModel.d.ts +2 -2
  57. package/lib/model/node/TextNodeModel.d.ts +2 -2
  58. package/lib/style/index.css +3 -0
  59. package/lib/style/index.less +5 -0
  60. package/lib/style/raw.d.ts +1 -1
  61. package/lib/style/raw.js +1 -1
  62. package/lib/util/drag.d.ts +1 -0
  63. package/lib/util/drag.js +11 -0
  64. package/lib/view/Anchor.js +6 -8
  65. package/lib/view/Control.js +1 -1
  66. package/lib/view/Graph.js +3 -15
  67. package/lib/view/behavior/dnd.js +1 -0
  68. package/lib/view/edge/BaseEdge.d.ts +5 -1
  69. package/lib/view/edge/BaseEdge.js +20 -5
  70. package/lib/view/node/BaseNode.d.ts +2 -0
  71. package/lib/view/node/BaseNode.js +13 -1
  72. package/lib/view/overlay/BackgroundOverlay.d.ts +4 -14
  73. package/lib/view/overlay/BackgroundOverlay.js +12 -1
  74. package/lib/view/overlay/Grid.d.ts +4 -3
  75. package/lib/view/overlay/Grid.js +8 -31
  76. package/lib/view/overlay/getTransformHoc.d.ts +1 -1
  77. package/lib/view/text/BaseText.js +1 -1
  78. package/package.json +1 -1
  79. package/src/LogicFlow.tsx +6 -0
  80. package/src/algorithm/edge.ts +3 -5
  81. package/src/algorithm/outline.ts +1 -1
  82. package/src/constant/index.ts +4 -0
  83. package/src/event/eventArgs.ts +50 -30
  84. package/src/model/GraphModel.ts +122 -3
  85. package/src/model/edge/BaseEdgeModel.ts +1 -0
  86. package/src/model/edge/LineEdgeModel.ts +8 -0
  87. package/src/model/edge/PolylineEdgeModel.ts +5 -3
  88. package/src/model/node/BaseNodeModel.ts +1 -1
  89. package/src/model/node/HtmlNodeModel.ts +1 -1
  90. package/src/style/index.less +5 -0
  91. package/src/style/raw.ts +3 -0
  92. package/src/util/drag.ts +12 -0
  93. package/src/view/Anchor.tsx +7 -8
  94. package/src/view/Control.tsx +1 -1
  95. package/src/view/Graph.tsx +5 -7
  96. package/src/view/behavior/dnd.ts +1 -0
  97. package/src/view/edge/BaseEdge.tsx +24 -3
  98. package/src/view/node/BaseNode.tsx +17 -1
  99. package/src/view/overlay/BackgroundOverlay.tsx +11 -16
  100. package/src/view/overlay/Grid.tsx +13 -9
  101. package/src/view/overlay/OutlineOverlay.tsx +1 -1
  102. package/src/view/text/BaseText.tsx +1 -1
  103. package/stats.html +1 -1
  104. package/dist/index.min.js +0 -2
  105. package/dist/index.min.js.map +0 -1
@@ -97,7 +97,7 @@ interface NodeEventArgs {
97
97
  /**
98
98
  * 删除节点
99
99
  */
100
- 'node:delete': NodeEventArgsPick<'data'>;
100
+ 'node:delete': NodeEventArgsPick<'data' | 'model'>;
101
101
  /**
102
102
  * 添加外部拖入节点
103
103
  */
@@ -105,7 +105,7 @@ interface NodeEventArgs {
105
105
  /**
106
106
  * 拖拽外部拖入节点
107
107
  */
108
- 'node:dnd-drag': NodeEventArgsPick<'data'>;
108
+ 'node:dnd-drag': NodeEventArgsPick<'data' | 'e'>;
109
109
  /**
110
110
  * 开始拖拽节点
111
111
  */
@@ -130,6 +130,35 @@ interface NodeEventArgs {
130
130
  * 节点缩放
131
131
  */
132
132
  'node:resize': NodeEventArgsPick<'preData' | 'data' | 'model' | 'deltaX' | 'deltaY' | 'index'>;
133
+ /**
134
+ * 元素的 properties 发生改变
135
+ */
136
+ 'node:properties-change': {
137
+ /**
138
+ * 元素的 id
139
+ */
140
+ id: string;
141
+ /**
142
+ * 改变的 properties 的 key
143
+ */
144
+ keys: string[];
145
+ /**
146
+ * 改变前的 properties
147
+ */
148
+ preProperties: Record<string, any>;
149
+ /**
150
+ * 改变后的 properties
151
+ */
152
+ properties: Record<string, any>;
153
+ };
154
+ /**
155
+ * 节点获焦
156
+ */
157
+ 'node:focus': NodeEventArgsPick<'data'>;
158
+ /**
159
+ * 节点失焦
160
+ */
161
+ 'node:blur': NodeEventArgsPick<'data'>;
133
162
  }
134
163
  type EdgeEventArgsPick<T extends 'data' | 'e' | 'position'> = Pick<{
135
164
  /**
@@ -196,6 +225,14 @@ interface EdgeEventArgs {
196
225
  oldEdge: EdgeData;
197
226
  };
198
227
  };
228
+ /**
229
+ * 边获焦
230
+ */
231
+ 'edge:focus': EdgeEventArgsPick<'data'>;
232
+ /**
233
+ * 边失焦
234
+ */
235
+ 'edge:blur': EdgeEventArgsPick<'data'>;
199
236
  }
200
237
  /**
201
238
  * 文本事件
@@ -275,33 +312,6 @@ interface CommonEventArgs {
275
312
  */
276
313
  position: ClientPosition;
277
314
  };
278
- /**
279
- * 元素的 properties 发生改变
280
- */
281
- 'properties:change': {
282
- data: {
283
- /**
284
- * 元素的 id
285
- */
286
- id: string;
287
- /**
288
- * 元素的类型
289
- */
290
- type: string;
291
- /**
292
- * 改变的 properties 的 key
293
- */
294
- keys: string[];
295
- /**
296
- * 改变前的 properties
297
- */
298
- preProperties: Record<string, any>;
299
- /**
300
- * 改变后的 properties
301
- */
302
- properties: Record<string, any>;
303
- };
304
- };
305
315
  /**
306
316
  * 进行画布平移或缩放等变化操作时触发
307
317
  */
@@ -356,7 +366,7 @@ type AnchorEventArgsPick<T extends 'data' | 'e' | 'nodeModel' | 'edgeModel'> = P
356
366
  /**
357
367
  * 通过拖动锚点连线添加的边的数据
358
368
  */
359
- edgeModel: BaseEdgeModel;
369
+ edgeModel?: BaseEdgeModel;
360
370
  }, T>;
361
371
  /**
362
372
  * 锚点事件
package/lib/index.css CHANGED
@@ -15,6 +15,9 @@
15
15
  .lf-text-draggable {
16
16
  cursor: move;
17
17
  }
18
+ *:focus {
19
+ outline: none;
20
+ }
18
21
  .lf-node-anchor {
19
22
  cursor: crosshair;
20
23
  }
@@ -3,6 +3,7 @@ import { ElementState, EventType, OverlapMode, TextMode } from '../constant';
3
3
  import LogicFlow from '../LogicFlow';
4
4
  import { Options as LFOptions } from '../options';
5
5
  import EventEmitter from '../event/eventEmitter';
6
+ import { Grid } from '../view/overlay';
6
7
  import PointTuple = LogicFlow.PointTuple;
7
8
  import GraphData = LogicFlow.GraphData;
8
9
  import NodeConfig = LogicFlow.NodeConfig;
@@ -16,6 +17,7 @@ export declare class GraphModel {
16
17
  width: number;
17
18
  height: number;
18
19
  theme: LogicFlow.Theme;
20
+ grid: Grid.GridOptions;
19
21
  readonly eventCenter: EventEmitter;
20
22
  readonly modelMap: Map<string, LogicFlow.GraphElementCtor>;
21
23
  /**
@@ -68,15 +70,15 @@ export declare class GraphModel {
68
70
  * 基于zIndex对元素进行排序。
69
71
  * todo: 性能优化
70
72
  */
71
- get sortElements(): (BaseNodeModel<LogicFlow.PropertiesType> | BaseEdgeModel<LogicFlow.PropertiesType>)[];
73
+ get sortElements(): (BaseEdgeModel<LogicFlow.PropertiesType> | BaseNodeModel<LogicFlow.PropertiesType>)[];
72
74
  /**
73
75
  * 当前编辑的元素,低频操作,先循环找。
74
76
  */
75
- get textEditElement(): BaseNodeModel<LogicFlow.PropertiesType> | BaseEdgeModel<LogicFlow.PropertiesType> | undefined;
77
+ get textEditElement(): BaseEdgeModel<LogicFlow.PropertiesType> | BaseNodeModel<LogicFlow.PropertiesType> | undefined;
76
78
  /**
77
79
  * 当前画布所有被选中的元素
78
80
  */
79
- get selectElements(): Map<string, BaseNodeModel<LogicFlow.PropertiesType> | BaseEdgeModel<LogicFlow.PropertiesType>>;
81
+ get selectElements(): Map<string, BaseEdgeModel<LogicFlow.PropertiesType> | BaseNodeModel<LogicFlow.PropertiesType>>;
80
82
  get selectNodes(): BaseNodeModel<LogicFlow.PropertiesType>[];
81
83
  /**
82
84
  * 获取指定区域内的所有元素
@@ -383,6 +385,14 @@ export declare class GraphModel {
383
385
  * todo docs link
384
386
  */
385
387
  setTheme(style: Partial<LogicFlow.Theme>): void;
388
+ /**
389
+ * 更新网格配置
390
+ */
391
+ updateGridOptions(options: Partial<Grid.GridOptions>): void;
392
+ /**
393
+ * 更新网格配置
394
+ */
395
+ updateBackgroundOptions(options: boolean | Partial<LFOptions.BackgroundConfig>): void;
386
396
  /**
387
397
  * 重新设置画布的宽高
388
398
  */
@@ -52,6 +52,7 @@ var _1 = require(".");
52
52
  var constant_1 = require("../constant");
53
53
  var util_1 = require("../util");
54
54
  var eventEmitter_1 = __importDefault(require("../event/eventEmitter"));
55
+ var overlay_1 = require("../view/overlay");
55
56
  var GraphModel = /** @class */ (function () {
56
57
  function GraphModel(options) {
57
58
  // 维护所有节点和边类型对应的 model
@@ -94,6 +95,7 @@ var GraphModel = /** @class */ (function () {
94
95
  this.gridSize = grid.size || 1; // 默认 gridSize 设置为 1
95
96
  }
96
97
  this.theme = (0, util_1.setupTheme)(options.style);
98
+ this.grid = overlay_1.Grid.getGridOptions(grid !== null && grid !== void 0 ? grid : false);
97
99
  this.edgeType = options.edgeType || 'polyline';
98
100
  this.animation = (0, util_1.setupAnimation)(animation);
99
101
  this.overlapMode = options.overlapMode || constant_1.OverlapMode.DEFAULT;
@@ -379,6 +381,31 @@ var GraphModel = /** @class */ (function () {
379
381
  throw new Error("\u627E\u4E0D\u5230".concat(edge.type, "\u5BF9\u5E94\u7684\u8FB9\u3002"));
380
382
  }
381
383
  var edgeModel = new Model(edge, _this);
384
+ // 根据edgeModel中存储的数据找到当前画布上的起终锚点坐标
385
+ // 判断当前起终锚点数据和Model中存储的起终点数据是否一致,不一致更新起终点信息
386
+ var sourceNodeId = edgeModel.sourceNodeId, targetNodeId = edgeModel.targetNodeId, _b = edgeModel.sourceAnchorId, sourceAnchorId = _b === void 0 ? '' : _b, _c = edgeModel.targetAnchorId, targetAnchorId = _c === void 0 ? '' : _c, startPoint = edgeModel.startPoint, endPoint = edgeModel.endPoint, text = edgeModel.text, textPosition = edgeModel.textPosition;
387
+ var updateAnchorPoint = function (node, anchorId, point, updatePoint) {
388
+ var anchor = node === null || node === void 0 ? void 0 : node.anchors.find(function (anchor) { return anchor.id === anchorId; });
389
+ if (anchor && !(0, lodash_es_1.isEqual)(anchor, point)) {
390
+ updatePoint(anchor);
391
+ }
392
+ };
393
+ var sourceNode = _this.getNodeModelById(sourceNodeId);
394
+ var targetNode = _this.getNodeModelById(targetNodeId);
395
+ updateAnchorPoint(sourceNode, sourceAnchorId, startPoint, edgeModel.updateStartPoint.bind(edgeModel));
396
+ updateAnchorPoint(targetNode, targetAnchorId, endPoint, edgeModel.updateEndPoint.bind(edgeModel));
397
+ // 而文本需要先算一下文本与默认文本位置之间的相对位置差
398
+ // 再计算新路径的文本默认位置,加上相对位置差,得到调整后边的文本的位置
399
+ if (text) {
400
+ var x = text.x, y = text.y;
401
+ var defaultX = textPosition.x, defaultY = textPosition.y;
402
+ if (x && y && defaultX && defaultY) {
403
+ var deltaX = x - defaultX;
404
+ var deltaY = y - defaultY;
405
+ edgeModel.resetTextPosition();
406
+ edgeModel.moveText(deltaX, deltaY);
407
+ }
408
+ }
382
409
  _this.edgeModelMap.set(edgeModel.id, edgeModel);
383
410
  _this.elementsModelMap.set(edgeModel.id, edgeModel);
384
411
  return edgeModel;
@@ -670,11 +697,15 @@ var GraphModel = /** @class */ (function () {
670
697
  * @param {string} nodeId 节点Id
671
698
  */
672
699
  GraphModel.prototype.deleteNode = function (nodeId) {
673
- var nodeData = this.nodesMap[nodeId].model.getData();
700
+ var nodeModel = this.nodesMap[nodeId].model;
701
+ var nodeData = nodeModel.getData();
674
702
  this.deleteEdgeBySource(nodeId);
675
703
  this.deleteEdgeByTarget(nodeId);
676
704
  this.nodes.splice(this.nodesMap[nodeId].index, 1);
677
- this.eventCenter.emit(constant_1.EventType.NODE_DELETE, { data: nodeData });
705
+ this.eventCenter.emit(constant_1.EventType.NODE_DELETE, {
706
+ data: nodeData,
707
+ model: nodeModel,
708
+ });
678
709
  };
679
710
  /**
680
711
  * 添加节点
@@ -1244,6 +1275,23 @@ var GraphModel = /** @class */ (function () {
1244
1275
  GraphModel.prototype.setTheme = function (style) {
1245
1276
  this.theme = (0, util_1.updateTheme)(__assign(__assign({}, this.theme), style));
1246
1277
  };
1278
+ /**
1279
+ * 更新网格配置
1280
+ */
1281
+ GraphModel.prototype.updateGridOptions = function (options) {
1282
+ (0, lodash_es_1.merge)(this.grid, options);
1283
+ };
1284
+ /**
1285
+ * 更新网格配置
1286
+ */
1287
+ GraphModel.prototype.updateBackgroundOptions = function (options) {
1288
+ if ((0, lodash_es_1.isBoolean)(options) || (0, lodash_es_1.isBoolean)(this.background)) {
1289
+ this.background = options;
1290
+ }
1291
+ else {
1292
+ this.background = __assign(__assign({}, this.background), options);
1293
+ }
1294
+ };
1247
1295
  /**
1248
1296
  * 重新设置画布的宽高
1249
1297
  */
@@ -1371,6 +1419,9 @@ var GraphModel = /** @class */ (function () {
1371
1419
  __decorate([
1372
1420
  mobx_1.observable
1373
1421
  ], GraphModel.prototype, "height", void 0);
1422
+ __decorate([
1423
+ mobx_1.observable
1424
+ ], GraphModel.prototype, "grid", void 0);
1374
1425
  __decorate([
1375
1426
  mobx_1.observable
1376
1427
  ], GraphModel.prototype, "edgeType", void 0);
@@ -48,6 +48,7 @@ export declare class BaseEdgeModel<P extends PropertiesType = PropertiesType> im
48
48
  visible: boolean;
49
49
  isAnimation: boolean;
50
50
  isShowAdjustPoint: boolean;
51
+ isDragging?: boolean;
51
52
  graphModel: GraphModel;
52
53
  zIndex: number;
53
54
  state: ElementState;
@@ -16,6 +16,8 @@ export declare class LineEdgeModel extends BaseEdgeModel {
16
16
  height?: number | undefined;
17
17
  path?: string | undefined;
18
18
  };
19
+ initEdgeData(data: LogicFlow.EdgeConfig): void;
20
+ getPath(points: Point[]): string;
19
21
  getTextPosition(): Point;
20
22
  }
21
23
  export default LineEdgeModel;
@@ -71,6 +71,14 @@ var LineEdgeModel = /** @class */ (function (_super) {
71
71
  var _a = this.properties.style, customStyle = _a === void 0 ? {} : _a;
72
72
  return __assign(__assign(__assign({}, style), (0, lodash_es_1.cloneDeep)(line)), (0, lodash_es_1.cloneDeep)(customStyle));
73
73
  };
74
+ LineEdgeModel.prototype.initEdgeData = function (data) {
75
+ _super.prototype.initEdgeData.call(this, data);
76
+ this.points = this.getPath([this.startPoint, this.endPoint]);
77
+ };
78
+ LineEdgeModel.prototype.getPath = function (points) {
79
+ var _a = __read(points, 2), start = _a[0], end = _a[1];
80
+ return "".concat(start.x, ",").concat(start.y, " ").concat(end.x, ",").concat(end.y);
81
+ };
74
82
  LineEdgeModel.prototype.getTextPosition = function () {
75
83
  return {
76
84
  x: (this.startPoint.x + this.endPoint.x) / 2,
@@ -39,6 +39,7 @@ export declare class PolylineEdgeModel extends BaseEdgeModel {
39
39
  y: number;
40
40
  }[];
41
41
  };
42
+ getPath(points: Point[]): string;
42
43
  initPoints(): void;
43
44
  updatePoints(): void;
44
45
  updateStartPoint(anchor: Point): void;
@@ -298,11 +298,12 @@ var PolylineEdgeModel = /** @class */ (function (_super) {
298
298
  pointsList: pointsList,
299
299
  });
300
300
  };
301
+ PolylineEdgeModel.prototype.getPath = function (points) {
302
+ return points.map(function (point) { return "".concat(point.x, ",").concat(point.y); }).join(' ');
303
+ };
301
304
  PolylineEdgeModel.prototype.initPoints = function () {
302
305
  if (this.pointsList.length > 0) {
303
- this.points = this.pointsList
304
- .map(function (point) { return "".concat(point.x, ",").concat(point.y); })
305
- .join(' ');
306
+ this.points = this.getPath(this.pointsList);
306
307
  }
307
308
  else {
308
309
  this.updatePoints();
@@ -172,8 +172,8 @@ export declare class BaseNodeModel<P extends PropertiesType = PropertiesType> im
172
172
  color?: string | undefined;
173
173
  fontSize: number;
174
174
  lineHeight?: number | undefined;
175
- textAnchor?: "middle" | "start" | "end" | undefined;
176
- dominantBaseline?: "middle" | "central" | "auto" | "text-bottom" | "alphabetic" | "ideographic" | "mathematical" | "hanging" | "text-top" | undefined;
175
+ textAnchor?: "start" | "end" | "middle" | undefined;
176
+ dominantBaseline?: "middle" | "auto" | "text-bottom" | "alphabetic" | "ideographic" | "central" | "mathematical" | "hanging" | "text-top" | undefined;
177
177
  };
178
178
  /**
179
179
  * @overridable 支持重写
@@ -739,7 +739,7 @@ var BaseNodeModel = /** @class */ (function () {
739
739
  var preProperties = (0, mobx_1.toJS)(this.properties);
740
740
  this.properties = nextProperties;
741
741
  this.setAttributes();
742
- // 触发更新节点 properties:change 的事件
742
+ // 触发更新节点 node:properties-change 的事件
743
743
  this.graphModel.eventCenter.emit(constant_1.EventType.NODE_PROPERTIES_CHANGE, {
744
744
  id: this.id,
745
745
  keys: updateKeys,
@@ -4,13 +4,13 @@ import { ModelType } from '../../constant';
4
4
  import AnchorConfig = Model.AnchorConfig;
5
5
  import LogicFlow from '../../LogicFlow';
6
6
  import GraphModel from '../GraphModel';
7
- export type IHtmlNodeProperties = {
7
+ export interface IHtmlNodeProperties {
8
8
  width?: number;
9
9
  height?: number;
10
10
  style?: LogicFlow.CommonTheme;
11
11
  textStyle?: LogicFlow.CommonTheme;
12
12
  [key: string]: unknown;
13
- };
13
+ }
14
14
  export declare class HtmlNodeModel<P extends IHtmlNodeProperties = IHtmlNodeProperties> extends BaseNodeModel<P> {
15
15
  modelType: ModelType;
16
16
  constructor(data: LogicFlow.NodeConfig<P>, graphModel: GraphModel);
@@ -24,8 +24,8 @@ export declare class TextNodeModel<P extends ITextNodeProperties = ITextNodeProp
24
24
  fontSize: number;
25
25
  textWidth?: number | undefined;
26
26
  lineHeight?: number | undefined;
27
- textAnchor?: "middle" | "start" | "end" | undefined;
28
- dominantBaseline?: "middle" | "central" | "auto" | "text-bottom" | "alphabetic" | "ideographic" | "mathematical" | "hanging" | "text-top" | undefined;
27
+ textAnchor?: "start" | "end" | "middle" | undefined;
28
+ dominantBaseline?: "middle" | "auto" | "text-bottom" | "alphabetic" | "ideographic" | "central" | "mathematical" | "hanging" | "text-top" | undefined;
29
29
  overflowMode?: "default" | "autoWrap" | "ellipsis" | undefined;
30
30
  wrapPadding?: string | undefined;
31
31
  };
@@ -15,6 +15,9 @@
15
15
  .lf-text-draggable {
16
16
  cursor: move;
17
17
  }
18
+ *:focus {
19
+ outline: none;
20
+ }
18
21
  .lf-node-anchor {
19
22
  cursor: crosshair;
20
23
  }
@@ -19,6 +19,11 @@
19
19
  cursor: move;
20
20
  }
21
21
 
22
+ // 在元素focus时浏览器会给元素outline设置一个5像素宽的默认样式,这里先全局禁用一下,后续再根据需要再做调整
23
+ *:focus {
24
+ outline: none;
25
+ }
26
+
22
27
  .lf-node-anchor {
23
28
  cursor: crosshair;
24
29
  }
@@ -1,4 +1,4 @@
1
1
  /**
2
2
  * Auto generated file, do not modify it!
3
3
  */
4
- export declare const content = ".lf-graph {\n position: relative;\n z-index: 0;\n width: 100%;\n height: 100%;\n background: #fff;\n user-select: none;\n}\n.lf-element-text {\n cursor: text;\n}\n.lf-text-disabled {\n pointer-events: none;\n}\n.lf-text-draggable {\n cursor: move;\n}\n.lf-node-anchor {\n cursor: crosshair;\n}\n.lf-node-anchor-hover {\n visibility: hidden;\n}\n.lf-anchor:hover .lf-node-anchor-hover {\n visibility: visible;\n}\n.lf-edge.pointer-none {\n pointer-events: none;\n}\n.lf-edge-append {\n cursor: pointer;\n}\n.lf-edge-animation {\n stroke-dashoffset: 100%;\n animation: lf_animate_dash 5s linear infinite;\n}\n@keyframes lf_animate_dash {\n to {\n stroke-dashoffset: 0;\n }\n}\n/* node */\n.lf-node-not-allow {\n cursor: not-allowed;\n}\n.lf-polyline-append-ns-resize {\n cursor: ns-resize;\n}\n.lf-polyline-append-ew-resize {\n cursor: ew-resize;\n}\n.lf-dragging {\n cursor: move;\n}\n.lf-dragging .lf-element-text {\n cursor: move;\n}\n.lf-draggable {\n cursor: default;\n}\n.lf-bezier-adjust-anchor {\n cursor: pointer;\n}\n/* background */\n.lf-background,\n.lf-grid {\n position: absolute;\n inset: 0;\n z-index: -1;\n}\n.lf-background-area {\n width: 100%;\n height: 100%;\n}\n/* html-overlay */\n.lf-html-overlay {\n position: absolute;\n inset: 0;\n z-index: 1;\n overflow: hidden;\n user-select: none;\n pointer-events: none;\n}\n.lf-html-overlay__transform > * {\n pointer-events: all;\n}\n.lf-text-editable {\n pointer-events: all;\n}\n.lf-text-input {\n position: absolute;\n box-sizing: border-box;\n min-width: 100px;\n min-height: 20px;\n padding: 5px;\n line-height: 1.2;\n white-space: pre;\n text-align: center;\n background: #fff;\n border: 1px solid #edefed;\n border-radius: 3px;\n outline: none;\n transform: translate(-50%, -50%);\n resize: none;\n}\n.lf-get-text-height {\n display: inline-block;\n box-sizing: border-box;\n word-break: break-all;\n /* \u4E3A\u4E86\u8DDF\u8F93\u5165\u6548\u679C\u4FDD\u6301\u4E00\u81F4\uFF0C\u8BBE\u7F6E\u900F\u660E\u8FB9\u6846\u5360\u4F4D */\n border: 1px solid transparent;\n}\n.lf-node-text-auto-wrap {\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n /* border: 1px solid transparent; */\n}\n.lf-node-text-auto-wrap-content {\n width: 100%;\n line-height: 1.2;\n text-align: center;\n word-break: break-all;\n background: transparent;\n}\n.lf-node-text-ellipsis-content {\n width: 100%;\n line-height: 1.2;\n white-space: nowrap;\n text-align: center;\n background: transparent;\n /* overflow: hidden;\n text-overflow: ellipsis; */\n}\n.lf-node-text-ellipsis-content > div {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n/* tool-overlay */\n.lf-tool-overlay {\n position: absolute;\n inset: 0;\n z-index: 2;\n overflow: hidden;\n pointer-events: none;\n}\n.lf-tool-overlay > * {\n pointer-events: all;\n}\n/* modification-overlay */\n.modification-overlay {\n position: absolute;\n inset: 0;\n z-index: 1;\n overflow: hidden;\n pointer-events: none;\n}\n.modification-overlay > * {\n pointer-events: all;\n}\n.lf-outline,\n.lf-snapline {\n pointer-events: none;\n}\n.lf-keyboard-tips {\n float: right;\n}\n.lf-node-select-decorate {\n position: absolute;\n border: 1px dashed #343435;\n transform: translate(-50%, -50%);\n pointer-events: none;\n}\n.lf-multiple-select {\n position: absolute;\n border: 2px dashed #187dffcc;\n box-shadow: 0 0 3px 0 #187dff80;\n cursor: move;\n}\n.lf-edge-adjust-point {\n cursor: move;\n}\n.lf-rotate-control {\n cursor: grabbing;\n}\n.lf-resize-control-nw {\n cursor: nw-resize;\n}\n.lf-resize-control-n {\n cursor: n-resize;\n}\n.lf-resize-control-ne {\n cursor: ne-resize;\n}\n.lf-resize-control-e {\n cursor: e-resize;\n}\n.lf-resize-control-se {\n cursor: se-resize;\n}\n.lf-resize-control-s {\n cursor: s-resize;\n}\n.lf-resize-control-sw {\n cursor: sw-resize;\n}\n.lf-resize-control-w {\n cursor: w-resize;\n}\n";
4
+ export declare const content = ".lf-graph {\n position: relative;\n z-index: 0;\n width: 100%;\n height: 100%;\n background: #fff;\n user-select: none;\n}\n.lf-element-text {\n cursor: text;\n}\n.lf-text-disabled {\n pointer-events: none;\n}\n.lf-text-draggable {\n cursor: move;\n}\n*:focus {\n outline: none;\n}\n.lf-node-anchor {\n cursor: crosshair;\n}\n.lf-node-anchor-hover {\n visibility: hidden;\n}\n.lf-anchor:hover .lf-node-anchor-hover {\n visibility: visible;\n}\n.lf-edge.pointer-none {\n pointer-events: none;\n}\n.lf-edge-append {\n cursor: pointer;\n}\n.lf-edge-animation {\n stroke-dashoffset: 100%;\n animation: lf_animate_dash 5s linear infinite;\n}\n@keyframes lf_animate_dash {\n to {\n stroke-dashoffset: 0;\n }\n}\n/* node */\n.lf-node-not-allow {\n cursor: not-allowed;\n}\n.lf-polyline-append-ns-resize {\n cursor: ns-resize;\n}\n.lf-polyline-append-ew-resize {\n cursor: ew-resize;\n}\n.lf-dragging {\n cursor: move;\n}\n.lf-dragging .lf-element-text {\n cursor: move;\n}\n.lf-draggable {\n cursor: default;\n}\n.lf-bezier-adjust-anchor {\n cursor: pointer;\n}\n/* background */\n.lf-background,\n.lf-grid {\n position: absolute;\n inset: 0;\n z-index: -1;\n}\n.lf-background-area {\n width: 100%;\n height: 100%;\n}\n/* html-overlay */\n.lf-html-overlay {\n position: absolute;\n inset: 0;\n z-index: 1;\n overflow: hidden;\n user-select: none;\n pointer-events: none;\n}\n.lf-html-overlay__transform > * {\n pointer-events: all;\n}\n.lf-text-editable {\n pointer-events: all;\n}\n.lf-text-input {\n position: absolute;\n box-sizing: border-box;\n min-width: 100px;\n min-height: 20px;\n padding: 5px;\n line-height: 1.2;\n white-space: pre;\n text-align: center;\n background: #fff;\n border: 1px solid #edefed;\n border-radius: 3px;\n outline: none;\n transform: translate(-50%, -50%);\n resize: none;\n}\n.lf-get-text-height {\n display: inline-block;\n box-sizing: border-box;\n word-break: break-all;\n /* \u4E3A\u4E86\u8DDF\u8F93\u5165\u6548\u679C\u4FDD\u6301\u4E00\u81F4\uFF0C\u8BBE\u7F6E\u900F\u660E\u8FB9\u6846\u5360\u4F4D */\n border: 1px solid transparent;\n}\n.lf-node-text-auto-wrap {\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n /* border: 1px solid transparent; */\n}\n.lf-node-text-auto-wrap-content {\n width: 100%;\n line-height: 1.2;\n text-align: center;\n word-break: break-all;\n background: transparent;\n}\n.lf-node-text-ellipsis-content {\n width: 100%;\n line-height: 1.2;\n white-space: nowrap;\n text-align: center;\n background: transparent;\n /* overflow: hidden;\n text-overflow: ellipsis; */\n}\n.lf-node-text-ellipsis-content > div {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n/* tool-overlay */\n.lf-tool-overlay {\n position: absolute;\n inset: 0;\n z-index: 2;\n overflow: hidden;\n pointer-events: none;\n}\n.lf-tool-overlay > * {\n pointer-events: all;\n}\n/* modification-overlay */\n.modification-overlay {\n position: absolute;\n inset: 0;\n z-index: 1;\n overflow: hidden;\n pointer-events: none;\n}\n.modification-overlay > * {\n pointer-events: all;\n}\n.lf-outline,\n.lf-snapline {\n pointer-events: none;\n}\n.lf-keyboard-tips {\n float: right;\n}\n.lf-node-select-decorate {\n position: absolute;\n border: 1px dashed #343435;\n transform: translate(-50%, -50%);\n pointer-events: none;\n}\n.lf-multiple-select {\n position: absolute;\n border: 2px dashed #187dffcc;\n box-shadow: 0 0 3px 0 #187dff80;\n cursor: move;\n}\n.lf-edge-adjust-point {\n cursor: move;\n}\n.lf-rotate-control {\n cursor: grabbing;\n}\n.lf-resize-control-nw {\n cursor: nw-resize;\n}\n.lf-resize-control-n {\n cursor: n-resize;\n}\n.lf-resize-control-ne {\n cursor: ne-resize;\n}\n.lf-resize-control-e {\n cursor: e-resize;\n}\n.lf-resize-control-se {\n cursor: se-resize;\n}\n.lf-resize-control-s {\n cursor: s-resize;\n}\n.lf-resize-control-sw {\n cursor: sw-resize;\n}\n.lf-resize-control-w {\n cursor: w-resize;\n}\n";
package/lib/style/raw.js CHANGED
@@ -5,4 +5,4 @@ exports.content = void 0;
5
5
  /**
6
6
  * Auto generated file, do not modify it!
7
7
  */
8
- exports.content = ".lf-graph {\n position: relative;\n z-index: 0;\n width: 100%;\n height: 100%;\n background: #fff;\n user-select: none;\n}\n.lf-element-text {\n cursor: text;\n}\n.lf-text-disabled {\n pointer-events: none;\n}\n.lf-text-draggable {\n cursor: move;\n}\n.lf-node-anchor {\n cursor: crosshair;\n}\n.lf-node-anchor-hover {\n visibility: hidden;\n}\n.lf-anchor:hover .lf-node-anchor-hover {\n visibility: visible;\n}\n.lf-edge.pointer-none {\n pointer-events: none;\n}\n.lf-edge-append {\n cursor: pointer;\n}\n.lf-edge-animation {\n stroke-dashoffset: 100%;\n animation: lf_animate_dash 5s linear infinite;\n}\n@keyframes lf_animate_dash {\n to {\n stroke-dashoffset: 0;\n }\n}\n/* node */\n.lf-node-not-allow {\n cursor: not-allowed;\n}\n.lf-polyline-append-ns-resize {\n cursor: ns-resize;\n}\n.lf-polyline-append-ew-resize {\n cursor: ew-resize;\n}\n.lf-dragging {\n cursor: move;\n}\n.lf-dragging .lf-element-text {\n cursor: move;\n}\n.lf-draggable {\n cursor: default;\n}\n.lf-bezier-adjust-anchor {\n cursor: pointer;\n}\n/* background */\n.lf-background,\n.lf-grid {\n position: absolute;\n inset: 0;\n z-index: -1;\n}\n.lf-background-area {\n width: 100%;\n height: 100%;\n}\n/* html-overlay */\n.lf-html-overlay {\n position: absolute;\n inset: 0;\n z-index: 1;\n overflow: hidden;\n user-select: none;\n pointer-events: none;\n}\n.lf-html-overlay__transform > * {\n pointer-events: all;\n}\n.lf-text-editable {\n pointer-events: all;\n}\n.lf-text-input {\n position: absolute;\n box-sizing: border-box;\n min-width: 100px;\n min-height: 20px;\n padding: 5px;\n line-height: 1.2;\n white-space: pre;\n text-align: center;\n background: #fff;\n border: 1px solid #edefed;\n border-radius: 3px;\n outline: none;\n transform: translate(-50%, -50%);\n resize: none;\n}\n.lf-get-text-height {\n display: inline-block;\n box-sizing: border-box;\n word-break: break-all;\n /* \u4E3A\u4E86\u8DDF\u8F93\u5165\u6548\u679C\u4FDD\u6301\u4E00\u81F4\uFF0C\u8BBE\u7F6E\u900F\u660E\u8FB9\u6846\u5360\u4F4D */\n border: 1px solid transparent;\n}\n.lf-node-text-auto-wrap {\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n /* border: 1px solid transparent; */\n}\n.lf-node-text-auto-wrap-content {\n width: 100%;\n line-height: 1.2;\n text-align: center;\n word-break: break-all;\n background: transparent;\n}\n.lf-node-text-ellipsis-content {\n width: 100%;\n line-height: 1.2;\n white-space: nowrap;\n text-align: center;\n background: transparent;\n /* overflow: hidden;\n text-overflow: ellipsis; */\n}\n.lf-node-text-ellipsis-content > div {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n/* tool-overlay */\n.lf-tool-overlay {\n position: absolute;\n inset: 0;\n z-index: 2;\n overflow: hidden;\n pointer-events: none;\n}\n.lf-tool-overlay > * {\n pointer-events: all;\n}\n/* modification-overlay */\n.modification-overlay {\n position: absolute;\n inset: 0;\n z-index: 1;\n overflow: hidden;\n pointer-events: none;\n}\n.modification-overlay > * {\n pointer-events: all;\n}\n.lf-outline,\n.lf-snapline {\n pointer-events: none;\n}\n.lf-keyboard-tips {\n float: right;\n}\n.lf-node-select-decorate {\n position: absolute;\n border: 1px dashed #343435;\n transform: translate(-50%, -50%);\n pointer-events: none;\n}\n.lf-multiple-select {\n position: absolute;\n border: 2px dashed #187dffcc;\n box-shadow: 0 0 3px 0 #187dff80;\n cursor: move;\n}\n.lf-edge-adjust-point {\n cursor: move;\n}\n.lf-rotate-control {\n cursor: grabbing;\n}\n.lf-resize-control-nw {\n cursor: nw-resize;\n}\n.lf-resize-control-n {\n cursor: n-resize;\n}\n.lf-resize-control-ne {\n cursor: ne-resize;\n}\n.lf-resize-control-e {\n cursor: e-resize;\n}\n.lf-resize-control-se {\n cursor: se-resize;\n}\n.lf-resize-control-s {\n cursor: s-resize;\n}\n.lf-resize-control-sw {\n cursor: sw-resize;\n}\n.lf-resize-control-w {\n cursor: w-resize;\n}\n";
8
+ exports.content = ".lf-graph {\n position: relative;\n z-index: 0;\n width: 100%;\n height: 100%;\n background: #fff;\n user-select: none;\n}\n.lf-element-text {\n cursor: text;\n}\n.lf-text-disabled {\n pointer-events: none;\n}\n.lf-text-draggable {\n cursor: move;\n}\n*:focus {\n outline: none;\n}\n.lf-node-anchor {\n cursor: crosshair;\n}\n.lf-node-anchor-hover {\n visibility: hidden;\n}\n.lf-anchor:hover .lf-node-anchor-hover {\n visibility: visible;\n}\n.lf-edge.pointer-none {\n pointer-events: none;\n}\n.lf-edge-append {\n cursor: pointer;\n}\n.lf-edge-animation {\n stroke-dashoffset: 100%;\n animation: lf_animate_dash 5s linear infinite;\n}\n@keyframes lf_animate_dash {\n to {\n stroke-dashoffset: 0;\n }\n}\n/* node */\n.lf-node-not-allow {\n cursor: not-allowed;\n}\n.lf-polyline-append-ns-resize {\n cursor: ns-resize;\n}\n.lf-polyline-append-ew-resize {\n cursor: ew-resize;\n}\n.lf-dragging {\n cursor: move;\n}\n.lf-dragging .lf-element-text {\n cursor: move;\n}\n.lf-draggable {\n cursor: default;\n}\n.lf-bezier-adjust-anchor {\n cursor: pointer;\n}\n/* background */\n.lf-background,\n.lf-grid {\n position: absolute;\n inset: 0;\n z-index: -1;\n}\n.lf-background-area {\n width: 100%;\n height: 100%;\n}\n/* html-overlay */\n.lf-html-overlay {\n position: absolute;\n inset: 0;\n z-index: 1;\n overflow: hidden;\n user-select: none;\n pointer-events: none;\n}\n.lf-html-overlay__transform > * {\n pointer-events: all;\n}\n.lf-text-editable {\n pointer-events: all;\n}\n.lf-text-input {\n position: absolute;\n box-sizing: border-box;\n min-width: 100px;\n min-height: 20px;\n padding: 5px;\n line-height: 1.2;\n white-space: pre;\n text-align: center;\n background: #fff;\n border: 1px solid #edefed;\n border-radius: 3px;\n outline: none;\n transform: translate(-50%, -50%);\n resize: none;\n}\n.lf-get-text-height {\n display: inline-block;\n box-sizing: border-box;\n word-break: break-all;\n /* \u4E3A\u4E86\u8DDF\u8F93\u5165\u6548\u679C\u4FDD\u6301\u4E00\u81F4\uFF0C\u8BBE\u7F6E\u900F\u660E\u8FB9\u6846\u5360\u4F4D */\n border: 1px solid transparent;\n}\n.lf-node-text-auto-wrap {\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n /* border: 1px solid transparent; */\n}\n.lf-node-text-auto-wrap-content {\n width: 100%;\n line-height: 1.2;\n text-align: center;\n word-break: break-all;\n background: transparent;\n}\n.lf-node-text-ellipsis-content {\n width: 100%;\n line-height: 1.2;\n white-space: nowrap;\n text-align: center;\n background: transparent;\n /* overflow: hidden;\n text-overflow: ellipsis; */\n}\n.lf-node-text-ellipsis-content > div {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n/* tool-overlay */\n.lf-tool-overlay {\n position: absolute;\n inset: 0;\n z-index: 2;\n overflow: hidden;\n pointer-events: none;\n}\n.lf-tool-overlay > * {\n pointer-events: all;\n}\n/* modification-overlay */\n.modification-overlay {\n position: absolute;\n inset: 0;\n z-index: 1;\n overflow: hidden;\n pointer-events: none;\n}\n.modification-overlay > * {\n pointer-events: all;\n}\n.lf-outline,\n.lf-snapline {\n pointer-events: none;\n}\n.lf-keyboard-tips {\n float: right;\n}\n.lf-node-select-decorate {\n position: absolute;\n border: 1px dashed #343435;\n transform: translate(-50%, -50%);\n pointer-events: none;\n}\n.lf-multiple-select {\n position: absolute;\n border: 2px dashed #187dffcc;\n box-shadow: 0 0 3px 0 #187dff80;\n cursor: move;\n}\n.lf-edge-adjust-point {\n cursor: move;\n}\n.lf-rotate-control {\n cursor: grabbing;\n}\n.lf-resize-control-nw {\n cursor: nw-resize;\n}\n.lf-resize-control-n {\n cursor: n-resize;\n}\n.lf-resize-control-ne {\n cursor: ne-resize;\n}\n.lf-resize-control-e {\n cursor: e-resize;\n}\n.lf-resize-control-se {\n cursor: se-resize;\n}\n.lf-resize-control-s {\n cursor: s-resize;\n}\n.lf-resize-control-sw {\n cursor: sw-resize;\n}\n.lf-resize-control-w {\n cursor: w-resize;\n}\n";
@@ -44,4 +44,5 @@ export declare class StepDrag {
44
44
  handleMouseMove: (e: MouseEvent) => void;
45
45
  handleMouseUp: (e: MouseEvent) => void;
46
46
  cancelDrag: () => void;
47
+ destroy: () => void;
47
48
  }
package/lib/util/drag.js CHANGED
@@ -124,6 +124,17 @@ var StepDrag = /** @class */ (function () {
124
124
  _this.onDragEnd({ event: undefined });
125
125
  _this.isDragging = false;
126
126
  };
127
+ this.destroy = function () {
128
+ if (_this.isStartDragging) {
129
+ // https://github.com/didi/LogicFlow/issues/1934
130
+ // https://github.com/didi/LogicFlow/issues/1926
131
+ // cancelDrag()->onDragEnd()->updateEdgePointByAnchors()触发线的重新计算
132
+ // 我们的本意是为了防止mousemove和mouseup没有及时被移除
133
+ // 因此这里增加if(this.isStartDragging)的判断,isStartDragging=true代表没有触发handleMouseUp(),此时监听还没被移除
134
+ // 在拖拽情况下(isStartDragging=true),此时注册了监听,在组件突然销毁时,强制触发cancelDrag进行监听事件的移除
135
+ _this.cancelDrag();
136
+ }
137
+ };
127
138
  this.onDragStart = onDragStart;
128
139
  this.onDragging = onDragging;
129
140
  this.onDragEnd = onDragEnd;
@@ -141,14 +141,12 @@ var Anchor = /** @class */ (function (_super) {
141
141
  _this.sourceRuleResults.clear();
142
142
  _this.targetRuleResults.clear();
143
143
  var _b = _this.props, graphModel = _b.graphModel, nodeModel = _b.nodeModel, anchorData = _b.anchorData;
144
- if (edgeModel) {
145
- graphModel.eventCenter.emit(constant_1.EventType.ANCHOR_DRAGEND, {
146
- data: anchorData,
147
- e: event,
148
- nodeModel: nodeModel,
149
- edgeModel: edgeModel,
150
- });
151
- }
144
+ graphModel.eventCenter.emit(constant_1.EventType.ANCHOR_DRAGEND, {
145
+ data: anchorData,
146
+ e: event,
147
+ nodeModel: nodeModel,
148
+ edgeModel: edgeModel !== null && edgeModel !== void 0 ? edgeModel : undefined,
149
+ });
152
150
  };
153
151
  _this.checkEnd = function (event) {
154
152
  var _a;
@@ -319,7 +319,7 @@ var ResizeControl = /** @class */ (function (_super) {
319
319
  return _this;
320
320
  }
321
321
  ResizeControl.prototype.componentWillUnmount = function () {
322
- this.dragHandler.cancelDrag();
322
+ this.dragHandler.destroy();
323
323
  };
324
324
  ResizeControl.prototype.render = function () {
325
325
  var _a = this.props, x = _a.x, y = _a.y, direction = _a.direction, model = _a.model;
package/lib/view/Graph.js CHANGED
@@ -14,17 +14,6 @@ var __extends = (this && this.__extends) || (function () {
14
14
  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
15
  };
16
16
  })();
17
- var __assign = (this && this.__assign) || function () {
18
- __assign = Object.assign || function(t) {
19
- for (var s, i = 1, n = arguments.length; i < n; i++) {
20
- s = arguments[i];
21
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
22
- t[p] = s[p];
23
- }
24
- return t;
25
- };
26
- return __assign.apply(this, arguments);
27
- };
28
17
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
29
18
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
30
19
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -104,12 +93,11 @@ var Graph = /** @class */ (function (_super) {
104
93
  if (options.height) {
105
94
  style.height = "".concat(graphModel.height, "px");
106
95
  }
107
- var grid = options.grid && overlay_1.Grid.getGridOptions(options.grid);
108
- var fakeNode = graphModel.fakeNode, editConfigModel = graphModel.editConfigModel;
96
+ var fakeNode = graphModel.fakeNode, editConfigModel = graphModel.editConfigModel, background = graphModel.background;
109
97
  var adjustEdge = editConfigModel.adjustEdge;
110
- return ((0, jsx_runtime_1.jsxs)("div", { className: "lf-graph", "flow-id": graphModel.flowId, children: [(0, jsx_runtime_1.jsxs)(overlay_1.CanvasOverlay, { graphModel: graphModel, dnd: dnd, children: [(0, jsx_runtime_1.jsx)("g", { className: "lf-base", children: (0, lodash_es_1.map)(graphModel.sortElements, function (nodeModel) {
98
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "lf-graph", "flow-id": graphModel.flowId, style: style, children: [(0, jsx_runtime_1.jsxs)(overlay_1.CanvasOverlay, { graphModel: graphModel, dnd: dnd, children: [(0, jsx_runtime_1.jsx)("g", { className: "lf-base", children: (0, lodash_es_1.map)(graphModel.sortElements, function (nodeModel) {
111
99
  return _this.getComponent(nodeModel, graphModel);
112
- }) }), fakeNode ? this.getComponent(fakeNode, graphModel) : ''] }), (0, jsx_runtime_1.jsxs)(overlay_1.ModificationOverlay, { graphModel: graphModel, children: [(0, jsx_runtime_1.jsx)(overlay_1.OutlineOverlay, { graphModel: graphModel }), adjustEdge ? (0, jsx_runtime_1.jsx)(overlay_1.BezierAdjustOverlay, { graphModel: graphModel }) : '', options.snapline !== false ? ((0, jsx_runtime_1.jsx)(overlay_1.SnaplineOverlay, { snaplineModel: snaplineModel })) : ('')] }), (0, jsx_runtime_1.jsx)(overlay_1.ToolOverlay, { graphModel: graphModel, tool: tool }), options.background && ((0, jsx_runtime_1.jsx)(overlay_1.BackgroundOverlay, { background: options.background })), grid && (0, jsx_runtime_1.jsx)(overlay_1.Grid, __assign({}, grid, { graphModel: graphModel }))] }));
100
+ }) }), fakeNode ? this.getComponent(fakeNode, graphModel) : ''] }), (0, jsx_runtime_1.jsxs)(overlay_1.ModificationOverlay, { graphModel: graphModel, children: [(0, jsx_runtime_1.jsx)(overlay_1.OutlineOverlay, { graphModel: graphModel }), adjustEdge ? (0, jsx_runtime_1.jsx)(overlay_1.BezierAdjustOverlay, { graphModel: graphModel }) : '', options.snapline !== false ? ((0, jsx_runtime_1.jsx)(overlay_1.SnaplineOverlay, { snaplineModel: snaplineModel })) : ('')] }), (0, jsx_runtime_1.jsx)(overlay_1.ToolOverlay, { graphModel: graphModel, tool: tool }), background && (0, jsx_runtime_1.jsx)(overlay_1.BackgroundOverlay, { background: background }), (0, jsx_runtime_1.jsx)(overlay_1.Grid, { graphModel: graphModel })] }));
113
101
  };
114
102
  Graph = __decorate([
115
103
  __1.observer
@@ -44,6 +44,7 @@ var Dnd = /** @class */ (function () {
44
44
  _this.lf.setNodeSnapLine(nodeData);
45
45
  _this.lf.graphModel.eventCenter.emit(constant_1.EventType.NODE_DND_DRAG, {
46
46
  data: nodeData,
47
+ e: e,
47
48
  });
48
49
  }
49
50
  return false;
@@ -13,6 +13,7 @@ export type IEdgeState = {
13
13
  export declare abstract class BaseEdge<P extends IProps> extends Component<P, IEdgeState> {
14
14
  static isObserved: boolean;
15
15
  static extendsKey?: string;
16
+ mouseUpDrag?: boolean;
16
17
  startTime?: number;
17
18
  contextMenuTime?: number;
18
19
  clickTimer?: number;
@@ -127,10 +128,13 @@ export declare abstract class BaseEdge<P extends IProps> extends Component<P, IE
127
128
  * 不支持重写
128
129
  */
129
130
  handleMouseDown: (e: MouseEvent) => void;
131
+ handleMouseUp: () => void;
130
132
  /**
131
133
  * 不支持重写
132
134
  */
133
- handleMouseUp: (e: MouseEvent) => void;
135
+ handleClick: (e: MouseEvent) => void;
136
+ handleFocus: () => void;
137
+ handleBlur: () => void;
134
138
  /**
135
139
  * @overridable 支持重写, 此方法为获取边的形状,如果需要自定义边的形状,请重写此方法。
136
140
  * @example https://docs.logic-flow.cn/docs/#/zh/guide/basic/edge?id=%e5%9f%ba%e4%ba%8e-react-%e7%bb%84%e4%bb%b6%e8%87%aa%e5%ae%9a%e4%b9%89%e8%be%b9
@@ -149,15 +149,18 @@ var BaseEdge = /** @class */ (function (_super) {
149
149
  e.stopPropagation();
150
150
  _this.startTime = new Date().getTime();
151
151
  };
152
+ _this.handleMouseUp = function () {
153
+ var model = _this.props.model;
154
+ _this.mouseUpDrag = model.isDragging;
155
+ };
152
156
  /**
153
157
  * 不支持重写
154
158
  */
155
- _this.handleMouseUp = function (e) {
159
+ _this.handleClick = function (e) {
156
160
  if (!_this.startTime)
157
161
  return;
158
- var time = new Date().getTime() - _this.startTime;
159
- if (time > 200)
160
- return; // 事件大于200ms,认为是拖拽。
162
+ if (_this.mouseUpDrag)
163
+ return; // 如果是拖拽,不触发click事件。
161
164
  var isRightClick = e.button === 2;
162
165
  if (isRightClick)
163
166
  return;
@@ -217,6 +220,18 @@ var BaseEdge = /** @class */ (function (_super) {
217
220
  graphModel.selectEdgeById(model.id, (0, util_1.isMultipleSelect)(e, editConfigModel));
218
221
  _this.toFront();
219
222
  };
223
+ _this.handleFocus = function () {
224
+ var _a = _this.props, model = _a.model, graphModel = _a.graphModel;
225
+ graphModel.eventCenter.emit(constant_1.EventType.EDGE_FOCUS, {
226
+ data: model.getData(),
227
+ });
228
+ };
229
+ _this.handleBlur = function () {
230
+ var _a = _this.props, model = _a.model, graphModel = _a.graphModel;
231
+ graphModel.eventCenter.emit(constant_1.EventType.EDGE_BLUR, {
232
+ data: model.getData(),
233
+ });
234
+ };
220
235
  return _this;
221
236
  }
222
237
  /**
@@ -405,7 +420,7 @@ var BaseEdge = /** @class */ (function (_super) {
405
420
  isSelected && 'lf-edge-selected',
406
421
  ]
407
422
  .filter(Boolean)
408
- .join(' '), onMouseDown: this.handleMouseDown, onMouseUp: this.handleMouseUp, onContextMenu: this.handleContextMenu, onMouseOver: this.setHoverOn, onMouseEnter: this.setHoverOn, onMouseLeave: this.setHoverOff, children: [this.getShape(), this.getAppend(), this.getText(), this.getArrow()] }), isShowAdjustPoint && isSelected ? this.getAdjustPoints() : ''] }));
423
+ .join(' '), onMouseDown: this.handleMouseDown, onMouseUp: this.handleMouseUp, onClick: this.handleClick, onContextMenu: this.handleContextMenu, onMouseOver: this.setHoverOn, onMouseEnter: this.setHoverOn, onMouseLeave: this.setHoverOff, onFocus: this.handleFocus, onBlur: this.handleBlur, children: [this.getShape(), this.getAppend(), this.getText(), this.getArrow()] }), isShowAdjustPoint && isSelected ? this.getAdjustPoints() : ''] }));
409
424
  };
410
425
  BaseEdge.isObserved = false;
411
426
  return BaseEdge;
@@ -38,6 +38,8 @@ export declare abstract class BaseNode<P extends IProps = IProps> extends Compon
38
38
  handleClick: (e: MouseEvent) => void;
39
39
  handleContextMenu: (ev: MouseEvent) => void;
40
40
  handleMouseDown: (ev: MouseEvent) => void;
41
+ handleFocus: () => void;
42
+ handleBlur: () => void;
41
43
  setHoverOn: (ev: MouseEvent) => void;
42
44
  setHoverOff: (ev: MouseEvent) => void;
43
45
  /**