@logicflow/core 2.1.3 → 2.2.0

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 (96) hide show
  1. package/.turbo/turbo-build$colon$dev.log +2 -2
  2. package/.turbo/turbo-build.log +6 -6
  3. package/CHANGELOG.md +15 -0
  4. package/dist/index.min.js +1 -1
  5. package/dist/index.min.js.map +1 -1
  6. package/es/LogicFlow.d.ts +2 -1
  7. package/es/LogicFlow.js +4 -1
  8. package/es/constant/index.d.ts +3 -1
  9. package/es/constant/index.js +2 -0
  10. package/es/model/EditConfigModel.d.ts +3 -1
  11. package/es/model/EditConfigModel.js +5 -0
  12. package/es/model/GraphModel.d.ts +9 -1
  13. package/es/model/GraphModel.js +35 -8
  14. package/es/model/edge/BaseEdgeModel.d.ts +2 -1
  15. package/es/model/edge/BaseEdgeModel.js +29 -5
  16. package/es/model/node/BaseNodeModel.d.ts +2 -1
  17. package/es/model/node/BaseNodeModel.js +29 -5
  18. package/es/tool/MultipleSelectTool.d.ts +1 -1
  19. package/es/tool/MultipleSelectTool.js +1 -1
  20. package/es/util/drag.d.ts +4 -4
  21. package/es/util/drag.js +12 -6
  22. package/es/view/Anchor.d.ts +3 -3
  23. package/es/view/Anchor.js +30 -4
  24. package/es/view/Control.js +1 -1
  25. package/es/view/Rotate.js +1 -1
  26. package/es/view/behavior/dnd.d.ts +4 -8
  27. package/es/view/behavior/dnd.js +50 -14
  28. package/es/view/edge/AdjustPoint.d.ts +1 -1
  29. package/es/view/edge/AdjustPoint.js +1 -1
  30. package/es/view/edge/BaseEdge.d.ts +2 -1
  31. package/es/view/edge/BaseEdge.js +18 -1
  32. package/es/view/edge/PolylineEdge.d.ts +1 -1
  33. package/es/view/edge/PolylineEdge.js +1 -1
  34. package/es/view/node/BaseNode.d.ts +2 -1
  35. package/es/view/node/BaseNode.js +30 -3
  36. package/es/view/overlay/BezierAdjustOverlay.js +1 -1
  37. package/es/view/overlay/CanvasOverlay.d.ts +12 -1
  38. package/es/view/overlay/CanvasOverlay.js +94 -15
  39. package/es/view/text/BaseText.d.ts +1 -1
  40. package/es/view/text/BaseText.js +1 -1
  41. package/lib/LogicFlow.d.ts +2 -1
  42. package/lib/LogicFlow.js +3 -0
  43. package/lib/constant/index.d.ts +3 -1
  44. package/lib/constant/index.js +2 -0
  45. package/lib/model/EditConfigModel.d.ts +3 -1
  46. package/lib/model/EditConfigModel.js +5 -0
  47. package/lib/model/GraphModel.d.ts +9 -1
  48. package/lib/model/GraphModel.js +35 -8
  49. package/lib/model/edge/BaseEdgeModel.d.ts +2 -1
  50. package/lib/model/edge/BaseEdgeModel.js +29 -5
  51. package/lib/model/node/BaseNodeModel.d.ts +2 -1
  52. package/lib/model/node/BaseNodeModel.js +29 -5
  53. package/lib/tool/MultipleSelectTool.d.ts +1 -1
  54. package/lib/tool/MultipleSelectTool.js +1 -1
  55. package/lib/util/drag.d.ts +4 -4
  56. package/lib/util/drag.js +12 -6
  57. package/lib/view/Anchor.d.ts +3 -3
  58. package/lib/view/Anchor.js +30 -4
  59. package/lib/view/Control.js +1 -1
  60. package/lib/view/Rotate.js +1 -1
  61. package/lib/view/behavior/dnd.d.ts +4 -8
  62. package/lib/view/behavior/dnd.js +50 -14
  63. package/lib/view/edge/AdjustPoint.d.ts +1 -1
  64. package/lib/view/edge/AdjustPoint.js +1 -1
  65. package/lib/view/edge/BaseEdge.d.ts +2 -1
  66. package/lib/view/edge/BaseEdge.js +18 -1
  67. package/lib/view/edge/PolylineEdge.d.ts +1 -1
  68. package/lib/view/edge/PolylineEdge.js +1 -1
  69. package/lib/view/node/BaseNode.d.ts +2 -1
  70. package/lib/view/node/BaseNode.js +30 -3
  71. package/lib/view/overlay/BezierAdjustOverlay.js +1 -1
  72. package/lib/view/overlay/CanvasOverlay.d.ts +12 -1
  73. package/lib/view/overlay/CanvasOverlay.js +94 -15
  74. package/lib/view/text/BaseText.d.ts +1 -1
  75. package/lib/view/text/BaseText.js +1 -1
  76. package/package.json +1 -1
  77. package/src/LogicFlow.tsx +9 -1
  78. package/src/constant/index.ts +2 -0
  79. package/src/model/EditConfigModel.ts +3 -0
  80. package/src/model/GraphModel.ts +37 -11
  81. package/src/model/edge/BaseEdgeModel.ts +32 -5
  82. package/src/model/node/BaseNodeModel.ts +30 -5
  83. package/src/tool/MultipleSelectTool.tsx +2 -2
  84. package/src/util/drag.ts +16 -12
  85. package/src/view/Anchor.tsx +32 -6
  86. package/src/view/Control.tsx +1 -1
  87. package/src/view/Rotate.tsx +1 -1
  88. package/src/view/behavior/dnd.ts +55 -16
  89. package/src/view/edge/AdjustPoint.tsx +2 -2
  90. package/src/view/edge/BaseEdge.tsx +23 -3
  91. package/src/view/edge/PolylineEdge.tsx +2 -2
  92. package/src/view/node/BaseNode.tsx +30 -4
  93. package/src/view/overlay/BezierAdjustOverlay.tsx +1 -1
  94. package/src/view/overlay/CanvasOverlay.tsx +110 -4
  95. package/src/view/text/BaseText.tsx +5 -2
  96. package/stats.html +1 -1
@@ -119,6 +119,7 @@ var GraphModel = /** @class */ (function () {
119
119
  this.edgeType = options.edgeType || 'polyline';
120
120
  this.animation = (0, util_1.setupAnimation)(animation);
121
121
  this.overlapMode = options.overlapMode || constant_1.OverlapMode.DEFAULT;
122
+ this.isMiniMap = options.isMiniMap || false;
122
123
  this.width = (_a = options.width) !== null && _a !== void 0 ? _a : this.rootEl.getBoundingClientRect().width;
123
124
  this.isContainerWidth = (0, lodash_es_1.isNil)(options.width);
124
125
  this.height = (_b = options.height) !== null && _b !== void 0 ? _b : this.rootEl.getBoundingClientRect().height;
@@ -199,7 +200,11 @@ var GraphModel = /** @class */ (function () {
199
200
  * todo: 性能优化
200
201
  */
201
202
  get: function () {
202
- var elements = __spreadArray(__spreadArray([], __read(this.nodes), false), __read(this.edges), false).sort(function (a, b) { return a.zIndex - b.zIndex; });
203
+ var sortElement = function (list) {
204
+ return __spreadArray([], __read(list), false).sort(function (a, b) { return a.zIndex - b.zIndex; });
205
+ };
206
+ // 默认情况下节点与边按照 zIndex 排序
207
+ var elements = sortElement(__spreadArray(__spreadArray([], __read(this.nodes), false), __read(this.edges), false));
203
208
  // 只显示可见区域的节点和边
204
209
  var visibleElements = [];
205
210
  // TODO: 缓存,优化计算效率 by xutao. So how?
@@ -643,6 +648,19 @@ var GraphModel = /** @class */ (function () {
643
648
  return model.textMode || edgeTextMode || textMode || constant_1.TextMode.TEXT;
644
649
  }
645
650
  };
651
+ /**
652
+ * 内部保留方法,请勿直接使用
653
+ */
654
+ /**
655
+ * 设置重叠模式
656
+ * @param mode 重叠模式
657
+ */
658
+ GraphModel.prototype.setOverlapMode = function (mode) {
659
+ this.overlapMode = mode;
660
+ this.eventCenter.emit('overlap:change', {
661
+ overlapMode: mode,
662
+ });
663
+ };
646
664
  /**
647
665
  * 更新元素的文本模式
648
666
  * @param mode
@@ -685,14 +703,19 @@ var GraphModel = /** @class */ (function () {
685
703
  var _a, _b, _c;
686
704
  var element = ((_a = this.nodesMap[id]) === null || _a === void 0 ? void 0 : _a.model) || ((_b = this.edgesMap[id]) === null || _b === void 0 ? void 0 : _b.model);
687
705
  if (element) {
688
- if (this.overlapMode === constant_1.OverlapMode.DEFAULT) {
689
- (_c = this.topElement) === null || _c === void 0 ? void 0 : _c.setZIndex();
690
- element.setZIndex(constant_1.ELEMENT_MAX_Z_INDEX);
691
- this.topElement = element;
706
+ // 静态模式toFront不做处理
707
+ if (this.overlapMode === constant_1.OverlapMode.STATIC) {
708
+ return;
692
709
  }
710
+ // 递增模式下,将需指定元素zIndex设置为当前最大zIndex + 1
693
711
  if (this.overlapMode === constant_1.OverlapMode.INCREASE) {
694
712
  this.setElementZIndex(id, 'top');
713
+ return;
695
714
  }
715
+ // 默认模式(节点在上)和边在上模式下,将原置顶元素重新恢复原有层级,将需指定元素zIndex设置为最大zIndex
716
+ (_c = this.topElement) === null || _c === void 0 ? void 0 : _c.setZIndex();
717
+ element.setZIndex(constant_1.ELEMENT_MAX_Z_INDEX);
718
+ this.topElement = element;
696
719
  }
697
720
  };
698
721
  /**
@@ -1079,12 +1102,13 @@ var GraphModel = /** @class */ (function () {
1079
1102
  var _a;
1080
1103
  this.selectElements.forEach(function (element) {
1081
1104
  element === null || element === void 0 ? void 0 : element.setSelected(false);
1105
+ element === null || element === void 0 ? void 0 : element.setHovered(false);
1082
1106
  });
1083
1107
  this.selectElements.clear();
1084
1108
  /**
1085
1109
  * 如果堆叠模式为默认模式,则将置顶元素重新恢复原有层级
1086
1110
  */
1087
- if (this.overlapMode === constant_1.OverlapMode.DEFAULT) {
1111
+ if ([constant_1.OverlapMode.DEFAULT, constant_1.OverlapMode.EDGE_TOP].includes(this.overlapMode)) {
1088
1112
  (_a = this.topElement) === null || _a === void 0 ? void 0 : _a.setZIndex();
1089
1113
  }
1090
1114
  };
@@ -1385,7 +1409,7 @@ var GraphModel = /** @class */ (function () {
1385
1409
  this.elementsModelMap.clear();
1386
1410
  };
1387
1411
  /**
1388
- * 获取图形区域虚拟矩型的尺寸和中心坐标
1412
+ * 获取图形区域虚拟矩形的尺寸和中心坐标
1389
1413
  * @returns
1390
1414
  */
1391
1415
  GraphModel.prototype.getVirtualRectSize = function () {
@@ -1409,7 +1433,7 @@ var GraphModel = /** @class */ (function () {
1409
1433
  var maxY = Math.max.apply(Math, __spreadArray([], __read(nodesY), false));
1410
1434
  var virtualRectWidth = maxX - minX || 0;
1411
1435
  var virtualRectHeight = maxY - minY || 0;
1412
- // 获取虚拟矩型的中心坐标
1436
+ // 获取虚拟矩形的中心坐标
1413
1437
  var virtualRectCenterPositionX = minX + virtualRectWidth / 2;
1414
1438
  var virtualRectCenterPositionY = minY + virtualRectHeight / 2;
1415
1439
  return {
@@ -1564,6 +1588,9 @@ var GraphModel = /** @class */ (function () {
1564
1588
  __decorate([
1565
1589
  mobx_1.computed
1566
1590
  ], GraphModel.prototype, "selectNodes", null);
1591
+ __decorate([
1592
+ mobx_1.action
1593
+ ], GraphModel.prototype, "setOverlapMode", null);
1567
1594
  __decorate([
1568
1595
  mobx_1.action
1569
1596
  ], GraphModel.prototype, "setTextMode", null);
@@ -1,6 +1,6 @@
1
1
  import { BaseNodeModel, GraphModel, Model } from '..';
2
2
  import LogicFlow from '../../LogicFlow';
3
- import { ElementState, ElementType, ModelType, TextMode } from '../../constant';
3
+ import { ElementState, ElementType, ModelType, OverlapMode, TextMode } from '../../constant';
4
4
  import Point = LogicFlow.Point;
5
5
  import EdgeData = LogicFlow.EdgeData;
6
6
  import EdgeConfig = LogicFlow.EdgeConfig;
@@ -271,5 +271,6 @@ export declare class BaseEdgeModel<P extends PropertiesType = PropertiesType> im
271
271
  getAdjustStart(): LogicFlow.Point;
272
272
  getAdjustEnd(): LogicFlow.Point;
273
273
  updateAfterAdjustStartAndEnd({ startPoint, endPoint, }: Record<'startPoint' | 'endPoint', Point>): void;
274
+ updateZIndexByOverlap(overlapMode: OverlapMode, defaultZIndex: any): void;
274
275
  }
275
276
  export default BaseEdgeModel;
@@ -76,6 +76,7 @@ var BaseEdgeModel = /** @class */ (function () {
76
76
  * setAttributes除了初始化调用外,还会在properties发生变化后调用。
77
77
  */
78
78
  BaseEdgeModel.prototype.initEdgeData = function (data) {
79
+ var _this = this;
79
80
  if (!data.properties) {
80
81
  data.properties = {};
81
82
  }
@@ -91,10 +92,8 @@ var BaseEdgeModel = /** @class */ (function () {
91
92
  var adjustEdgeStartAndEnd = this.graphModel.editConfigModel.adjustEdgeStartAndEnd;
92
93
  this.isShowAdjustPoint = adjustEdgeStartAndEnd;
93
94
  (0, lodash_es_1.assign)(this, (0, util_1.pickEdgeConfig)(data));
94
- var overlapMode = this.graphModel.overlapMode;
95
- if (overlapMode === constant_1.OverlapMode.INCREASE) {
96
- this.zIndex = data.zIndex || (0, util_1.getZIndex)();
97
- }
95
+ var _a = this.graphModel, overlapMode = _a.overlapMode, eventCenter = _a.eventCenter;
96
+ this.updateZIndexByOverlap(overlapMode, data.zIndex || (0, util_1.getZIndex)());
98
97
  // 设置边的 anchors,也就是边的两个端点
99
98
  // 端点依赖于 edgeData 的 sourceNode 和 targetNode
100
99
  this.setAnchors();
@@ -102,6 +101,10 @@ var BaseEdgeModel = /** @class */ (function () {
102
101
  this.initPoints();
103
102
  // 文本位置依赖于边上的所有拐点
104
103
  this.formatText(data);
104
+ eventCenter.on('overlap:change', function (data) {
105
+ var newMode = data.overlapMode;
106
+ _this.updateZIndexByOverlap(newMode, _this.zIndex || (0, util_1.getZIndex)());
107
+ });
105
108
  };
106
109
  /**
107
110
  * 设置model属性
@@ -325,7 +328,9 @@ var BaseEdgeModel = /** @class */ (function () {
325
328
  startPoint: (0, lodash_es_1.assign)({}, this.startPoint),
326
329
  endPoint: (0, lodash_es_1.assign)({}, this.endPoint),
327
330
  };
328
- if (this.graphModel.overlapMode === constant_1.OverlapMode.INCREASE) {
331
+ // 因为默认模式和边在上模式下,对节点的zIndex要求不高(因为渲染的时候会按照模式对所有元素进行排序)
332
+ // 所以只在递增模式和静态模式下设置zIndex
333
+ if ([constant_1.OverlapMode.INCREASE, constant_1.OverlapMode.STATIC].includes(this.graphModel.overlapMode)) {
329
334
  data.zIndex = this.zIndex;
330
335
  }
331
336
  var _a = this.text, x = _a.x, y = _a.y, value = _a.value;
@@ -589,6 +594,22 @@ var BaseEdgeModel = /** @class */ (function () {
589
594
  this.updateStartPoint({ x: startPoint.x, y: startPoint.y });
590
595
  this.updateEndPoint({ x: endPoint.x, y: endPoint.y });
591
596
  };
597
+ // 堆叠模式变化时,更新zIndex
598
+ BaseEdgeModel.prototype.updateZIndexByOverlap = function (overlapMode, defaultZIndex) {
599
+ switch (overlapMode) {
600
+ case constant_1.OverlapMode.DEFAULT:
601
+ this.zIndex = 0;
602
+ break;
603
+ case constant_1.OverlapMode.EDGE_TOP:
604
+ this.zIndex = 1;
605
+ break;
606
+ case constant_1.OverlapMode.INCREASE:
607
+ this.zIndex = defaultZIndex;
608
+ break;
609
+ default:
610
+ break;
611
+ }
612
+ };
592
613
  BaseEdgeModel.BaseType = constant_1.ElementType.EDGE;
593
614
  __decorate([
594
615
  mobx_1.observable
@@ -758,6 +779,9 @@ var BaseEdgeModel = /** @class */ (function () {
758
779
  __decorate([
759
780
  mobx_1.action
760
781
  ], BaseEdgeModel.prototype, "updateAfterAdjustStartAndEnd", null);
782
+ __decorate([
783
+ mobx_1.action
784
+ ], BaseEdgeModel.prototype, "updateZIndexByOverlap", null);
761
785
  return BaseEdgeModel;
762
786
  }());
763
787
  exports.BaseEdgeModel = BaseEdgeModel;
@@ -1,6 +1,6 @@
1
1
  import { GraphModel, Model } from '..';
2
2
  import LogicFlow from '../../LogicFlow';
3
- import { ElementState, ElementType, ModelType, TextMode } from '../../constant';
3
+ import { ElementState, ElementType, ModelType, OverlapMode, TextMode } from '../../constant';
4
4
  import { ResizeControl } from '../../view/Control';
5
5
  import AnchorConfig = Model.AnchorConfig;
6
6
  import GraphElements = LogicFlow.GraphElements;
@@ -288,6 +288,7 @@ export declare class BaseNodeModel<P extends PropertiesType = PropertiesType> im
288
288
  updateStyles(styles: Record<string, any>): void;
289
289
  setZIndex(zIndex?: number): void;
290
290
  updateAttributes(attributes: any): void;
291
+ updateZIndexByOverlap(overlapMode: OverlapMode, defaultZIndex: any): void;
291
292
  }
292
293
  export declare namespace BaseNodeModel {
293
294
  type PointTuple = [number, number];
@@ -175,6 +175,7 @@ var BaseNodeModel = /** @class */ (function () {
175
175
  * setAttributes 除了初始化调用外,还会在 properties 发生变化了调用。
176
176
  */
177
177
  BaseNodeModel.prototype.initNodeData = function (data) {
178
+ var _this = this;
178
179
  if (!data.properties) {
179
180
  data.properties = {};
180
181
  }
@@ -189,10 +190,12 @@ var BaseNodeModel = /** @class */ (function () {
189
190
  // 在下面又将 NodeConfig 中的数据赋值给了 this,应该会触发 setAttributes,确认是否符合预期
190
191
  // TODO: 确认 constructor 中赋值 properties 是否必要,此处将 NodeConfig 中所有属性赋值给 this,包括 rotate、rotatable,resizable 等
191
192
  (0, lodash_es_1.assign)(this, (0, util_1.pickNodeConfig)(data));
192
- var overlapMode = this.graphModel.overlapMode;
193
- if (overlapMode === constant_1.OverlapMode.INCREASE) {
194
- this.zIndex = data.zIndex || (0, util_1.getZIndex)();
195
- }
193
+ var _a = this.graphModel, overlapMode = _a.overlapMode, eventCenter = _a.eventCenter;
194
+ this.updateZIndexByOverlap(overlapMode, data.zIndex || (0, util_1.getZIndex)());
195
+ eventCenter.on('overlap:change', function (data) {
196
+ var newMode = data.overlapMode;
197
+ _this.updateZIndexByOverlap(newMode, _this.zIndex || (0, util_1.getZIndex)());
198
+ });
196
199
  };
197
200
  /**
198
201
  * 设置model属性,每次properties发生变化会触发
@@ -305,7 +308,9 @@ var BaseNodeModel = /** @class */ (function () {
305
308
  if (this.rotate) {
306
309
  data.rotate = this.rotate;
307
310
  }
308
- if (this.graphModel.overlapMode === constant_1.OverlapMode.INCREASE) {
311
+ // 因为默认模式和节点在上模式下,对边的zIndex要求不高(因为渲染的时候会按照模式对所有元素进行排序)
312
+ // 所以只在递增模式和静态模式下设置zIndex
313
+ if ([constant_1.OverlapMode.INCREASE, constant_1.OverlapMode.STATIC].includes(this.graphModel.overlapMode)) {
309
314
  data.zIndex = this.zIndex;
310
315
  }
311
316
  if (value) {
@@ -794,6 +799,22 @@ var BaseNodeModel = /** @class */ (function () {
794
799
  BaseNodeModel.prototype.updateAttributes = function (attributes) {
795
800
  (0, lodash_es_1.assign)(this, attributes);
796
801
  };
802
+ // 堆叠模式变化时,更新zIndex
803
+ BaseNodeModel.prototype.updateZIndexByOverlap = function (overlapMode, defaultZIndex) {
804
+ switch (overlapMode) {
805
+ case constant_1.OverlapMode.DEFAULT:
806
+ this.zIndex = 1;
807
+ break;
808
+ case constant_1.OverlapMode.EDGE_TOP:
809
+ this.zIndex = 0;
810
+ break;
811
+ case constant_1.OverlapMode.INCREASE:
812
+ this.zIndex = defaultZIndex;
813
+ break;
814
+ default:
815
+ break;
816
+ }
817
+ };
797
818
  BaseNodeModel.BaseType = constant_1.ElementType.NODE;
798
819
  __decorate([
799
820
  mobx_1.observable
@@ -948,6 +969,9 @@ var BaseNodeModel = /** @class */ (function () {
948
969
  __decorate([
949
970
  mobx_1.action
950
971
  ], BaseNodeModel.prototype, "updateAttributes", null);
972
+ __decorate([
973
+ mobx_1.action
974
+ ], BaseNodeModel.prototype, "updateZIndexByOverlap", null);
951
975
  return BaseNodeModel;
952
976
  }());
953
977
  exports.BaseNodeModel = BaseNodeModel;
@@ -5,7 +5,7 @@ export default class MultipleSelect extends Component<IToolProps> {
5
5
  static toolName: string;
6
6
  stepDrag: StepDrag;
7
7
  constructor(props: IToolProps);
8
- handleMouseDown: (ev: MouseEvent) => void;
8
+ handleMouseDown: (ev: PointerEvent) => void;
9
9
  handleWheelEvent: (ev: WheelEvent) => void;
10
10
  onDragging: ({ deltaX, deltaY }: IDragParams) => void;
11
11
  handleContextMenu: (ev: MouseEvent) => void;
@@ -149,7 +149,7 @@ var MultipleSelect = /** @class */ (function (_super) {
149
149
  height: "".concat(y1 - y + 20 * SCALE_Y, "px"),
150
150
  'border-width': "".concat(2 * SCALE_X, "px"),
151
151
  };
152
- return ((0, jsx_runtime_1.jsx)("div", { className: "lf-multiple-select", style: style, onMouseDown: this.handleMouseDown, onContextMenu: this.handleContextMenu, onWheel: this.handleWheelEvent }));
152
+ return ((0, jsx_runtime_1.jsx)("div", { className: "lf-multiple-select", style: style, onPointerDown: this.handleMouseDown, onContextMenu: this.handleContextMenu, onWheel: this.handleWheelEvent }));
153
153
  };
154
154
  MultipleSelect.toolName = 'multiple-select-tool';
155
155
  MultipleSelect = __decorate([
@@ -3,7 +3,7 @@ import EventEmitter from '../event/eventEmitter';
3
3
  export type IDragParams = {
4
4
  deltaX: number;
5
5
  deltaY: number;
6
- event?: MouseEvent;
6
+ event?: PointerEvent;
7
7
  [key: string]: unknown;
8
8
  };
9
9
  export type ICreateDragParams = {
@@ -40,9 +40,9 @@ export declare class StepDrag {
40
40
  constructor({ onDragStart, onDragging, onDragEnd, eventType, eventCenter, step, isStopPropagation, model, data, }: IStepperDragProps);
41
41
  setStep(step: number): void;
42
42
  setModel(model: Model.BaseModel): void;
43
- handleMouseDown: (e: MouseEvent) => void;
44
- handleMouseMove: (e: MouseEvent) => void;
45
- handleMouseUp: (e: MouseEvent) => void;
43
+ handleMouseDown: (e: PointerEvent) => void;
44
+ handleMouseMove: (e: PointerEvent) => void;
45
+ handleMouseUp: (e: PointerEvent) => void;
46
46
  cancelDrag: () => void;
47
47
  destroy: () => void;
48
48
  }
package/lib/util/drag.js CHANGED
@@ -26,11 +26,12 @@ var StepDrag = /** @class */ (function () {
26
26
  return;
27
27
  if (_this.isStopPropagation)
28
28
  e.stopPropagation();
29
+ e.preventDefault();
29
30
  _this.isStartDragging = true;
30
31
  _this.startX = e.clientX;
31
32
  _this.startY = e.clientY;
32
- DOC.addEventListener('mousemove', _this.handleMouseMove, false);
33
- DOC.addEventListener('mouseup', _this.handleMouseUp, false);
33
+ DOC.addEventListener('pointermove', _this.handleMouseMove, false);
34
+ DOC.addEventListener('pointerup', _this.handleMouseUp, false);
34
35
  var elementData = (_a = _this.model) === null || _a === void 0 ? void 0 : _a.getData();
35
36
  (_b = _this.eventCenter) === null || _b === void 0 ? void 0 : _b.emit(constant_1.EventType["".concat(_this.eventType, "_MOUSEDOWN")], {
36
37
  e: e,
@@ -42,6 +43,7 @@ var StepDrag = /** @class */ (function () {
42
43
  var _a, _b;
43
44
  if (_this.isStopPropagation)
44
45
  e.stopPropagation();
46
+ e.preventDefault();
45
47
  if (!_this.isStartDragging)
46
48
  return;
47
49
  _this.sumDeltaX += e.clientX - _this.startX;
@@ -97,11 +99,15 @@ var StepDrag = /** @class */ (function () {
97
99
  _this.isStartDragging = false;
98
100
  if (_this.isStopPropagation)
99
101
  e.stopPropagation();
102
+ var target = e.target;
103
+ if (target && typeof target.releasePointerCapture === 'function') {
104
+ target.releasePointerCapture(e.pointerId);
105
+ }
100
106
  // fix #568: 如果onDragging在下一个事件循环中触发,而drop在当前事件循环,会出现问题。
101
107
  Promise.resolve().then(function () {
102
108
  var _a, _b, _c;
103
- DOC.removeEventListener('mousemove', _this.handleMouseMove, false);
104
- DOC.removeEventListener('mouseup', _this.handleMouseUp, false);
109
+ DOC.removeEventListener('pointermove', _this.handleMouseMove, false);
110
+ DOC.removeEventListener('pointerup', _this.handleMouseUp, false);
105
111
  var elementData = (_a = _this.model) === null || _a === void 0 ? void 0 : _a.getData();
106
112
  (_b = _this.eventCenter) === null || _b === void 0 ? void 0 : _b.emit(constant_1.EventType["".concat(_this.eventType, "_MOUSEUP")], {
107
113
  e: e,
@@ -119,8 +125,8 @@ var StepDrag = /** @class */ (function () {
119
125
  };
120
126
  this.cancelDrag = function () {
121
127
  var DOC = window === null || window === void 0 ? void 0 : window.document;
122
- DOC.removeEventListener('mousemove', _this.handleMouseMove, false);
123
- DOC.removeEventListener('mouseup', _this.handleMouseUp, false);
128
+ DOC.removeEventListener('pointermove', _this.handleMouseMove, false);
129
+ DOC.removeEventListener('pointerup', _this.handleMouseUp, false);
124
130
  _this.onDragEnd({ event: undefined });
125
131
  _this.isDragging = false;
126
132
  };
@@ -13,7 +13,7 @@ interface IProps {
13
13
  anchorIndex: number;
14
14
  graphModel: GraphModel;
15
15
  nodeModel: BaseNodeModel;
16
- setHoverOff: (e: MouseEvent) => void;
16
+ setHoverOff: (e: PointerEvent) => void;
17
17
  }
18
18
  interface IState {
19
19
  startX: number;
@@ -38,8 +38,8 @@ declare class Anchor extends Component<IProps, IState> {
38
38
  incomingEdgeList: import("../model").BaseEdgeModel<LogicFlow.PropertiesType>[];
39
39
  outgoingEdgeList: import("../model").BaseEdgeModel<LogicFlow.PropertiesType>[];
40
40
  };
41
- checkEnd: (event: MouseEvent | null | undefined) => import("../model").BaseEdgeModel<LogicFlow.PropertiesType> | null | undefined;
42
- moveAnchorEnd(endX: number, endY: number): void;
41
+ checkEnd: (event: PointerEvent | null | undefined) => import("../model").BaseEdgeModel<LogicFlow.PropertiesType> | null | undefined;
42
+ moveAnchorEnd(endX: number, endY: number, event?: PointerEvent): void;
43
43
  isShowLine(): boolean;
44
44
  render(): import("preact/compat").JSX.Element;
45
45
  }
@@ -105,7 +105,7 @@ var Anchor = /** @class */ (function (_super) {
105
105
  endY: y1,
106
106
  dragging: true,
107
107
  });
108
- _this.moveAnchorEnd(x1, y1);
108
+ _this.moveAnchorEnd(x1, y1, event);
109
109
  if (nearBoundary.length > 0 && !stopMoveGraph && autoExpand) {
110
110
  _this.t = (0, util_1.createRaf)(function () {
111
111
  var _a = __read(nearBoundary, 2), translateX = _a[0], translateY = _a[1];
@@ -115,7 +115,7 @@ var Anchor = /** @class */ (function (_super) {
115
115
  endX: endX - translateX,
116
116
  endY: endY - translateY,
117
117
  });
118
- _this.moveAnchorEnd(endX - translateX, endY - translateY);
118
+ _this.moveAnchorEnd(endX - translateX, endY - translateY, event);
119
119
  });
120
120
  }
121
121
  eventCenter.emit(constant_1.EventType.ANCHOR_DRAG, {
@@ -141,6 +141,11 @@ 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
+ // 拖拽结束清理:取消悬浮态
145
+ if (_this.preTargetNode) {
146
+ _this.preTargetNode.setHovered(false);
147
+ _this.preTargetNode = undefined;
148
+ }
144
149
  graphModel.eventCenter.emit(constant_1.EventType.ANCHOR_DRAGEND, {
145
150
  data: anchorData,
146
151
  e: event,
@@ -244,7 +249,7 @@ var Anchor = /** @class */ (function (_super) {
244
249
  enumerable: false,
245
250
  configurable: true
246
251
  });
247
- Anchor.prototype.moveAnchorEnd = function (endX, endY) {
252
+ Anchor.prototype.moveAnchorEnd = function (endX, endY, event) {
248
253
  var _a, _b;
249
254
  var _c = this.props, graphModel = _c.graphModel, nodeModel = _c.nodeModel, anchorData = _c.anchorData;
250
255
  var info = (0, util_1.targetNodeInfo)({
@@ -281,11 +286,32 @@ var Anchor = /** @class */ (function (_super) {
281
286
  else {
282
287
  targetNode.setElementState(constant_1.ElementState.NOT_ALLOW_CONNECT);
283
288
  }
289
+ // 人工触发进入目标节点事件,同步设置 hovered 以驱动锚点显隐和样式
290
+ if (!targetNode.isHovered) {
291
+ var nodeData = targetNode.getData();
292
+ if (event) {
293
+ graphModel.eventCenter.emit(constant_1.EventType.NODE_MOUSEENTER, {
294
+ data: nodeData,
295
+ e: event,
296
+ });
297
+ }
298
+ targetNode.setHovered(true);
299
+ }
284
300
  }
285
301
  else if (this.preTargetNode &&
286
302
  this.preTargetNode.state !== constant_1.ElementState.DEFAULT) {
287
303
  // 为了保证鼠标离开的时候,将上一个节点状态重置为正常状态。
288
304
  this.preTargetNode.setElementState(constant_1.ElementState.DEFAULT);
305
+ // 未命中任何节点:人工派发离开事件并取消悬浮,避免状态残留
306
+ var prevData = this.preTargetNode.getData();
307
+ if (event) {
308
+ graphModel.eventCenter.emit(constant_1.EventType.NODE_MOUSELEAVE, {
309
+ data: prevData,
310
+ e: event,
311
+ });
312
+ }
313
+ this.preTargetNode.setHovered(false);
314
+ this.preTargetNode = undefined;
289
315
  }
290
316
  };
291
317
  Anchor.prototype.isShowLine = function () {
@@ -307,7 +333,7 @@ var Anchor = /** @class */ (function (_super) {
307
333
  e: ev,
308
334
  nodeModel: nodeModel,
309
335
  });
310
- }, onMouseDown: function (ev) {
336
+ }, onPointerDown: function (ev) {
311
337
  graphModel.eventCenter.emit(constant_1.EventType.ANCHOR_MOUSEDOWN, {
312
338
  data: anchorData,
313
339
  e: ev,
@@ -349,7 +349,7 @@ var ResizeControl = /** @class */ (function (_super) {
349
349
  ResizeControl.prototype.render = function () {
350
350
  var _a = this.props, x = _a.x, y = _a.y, direction = _a.direction, model = _a.model;
351
351
  var _b = model.getResizeControlStyle(), width = _b.width, height = _b.height, restStyle = __rest(_b, ["width", "height"]);
352
- return ((0, jsx_runtime_1.jsxs)("g", { className: "lf-resize-control lf-resize-control-".concat(direction), children: [(0, jsx_runtime_1.jsx)(shape_1.Rect, __assign({ className: "lf-resize-control-content", x: x, y: y, width: width !== null && width !== void 0 ? width : 7, height: height !== null && height !== void 0 ? height : 7 }, restStyle)), (0, jsx_runtime_1.jsx)(shape_1.Rect, { className: "lf-resize-control-content", x: x, y: y, width: 25, height: 25, fill: "transparent", stroke: "transparent", onMouseDown: this.dragHandler.handleMouseDown })] }));
352
+ return ((0, jsx_runtime_1.jsxs)("g", { className: "lf-resize-control lf-resize-control-".concat(direction), children: [(0, jsx_runtime_1.jsx)(shape_1.Rect, __assign({ className: "lf-resize-control-content", x: x, y: y, width: width !== null && width !== void 0 ? width : 7, height: height !== null && height !== void 0 ? height : 7 }, restStyle)), (0, jsx_runtime_1.jsx)(shape_1.Rect, { className: "lf-resize-control-content", x: x, y: y, width: 25, height: 25, fill: "transparent", stroke: "transparent", onPointerDown: this.dragHandler.handleMouseDown })] }));
353
353
  };
354
354
  return ResizeControl;
355
355
  }(compat_1.Component));
@@ -104,7 +104,7 @@ var RotateControlPoint = /** @class */ (function (_super) {
104
104
  this.normal = new util_1.Vector(1, 0);
105
105
  this.defaultAngle = this.normal.angle(new util_1.Vector(cx - x, cy - y));
106
106
  nodeModel.defaultAngle = this.defaultAngle;
107
- return ((0, jsx_runtime_1.jsx)("g", { className: "lf-rotate-control", children: (0, jsx_runtime_1.jsx)("g", { onMouseDown: function (ev) {
107
+ return ((0, jsx_runtime_1.jsx)("g", { className: "lf-rotate-control", children: (0, jsx_runtime_1.jsx)("g", { onPointerDown: function (ev) {
108
108
  _this.stepperDrag.handleMouseDown(ev);
109
109
  }, children: (0, jsx_runtime_1.jsx)(Circle_1.default, __assign({}, this.style, { cx: cx, cy: cy })) }) }));
110
110
  };
@@ -6,22 +6,18 @@ export declare class Dnd {
6
6
  nodeConfig: OnDragNodeConfig | null;
7
7
  lf: LogicFlow;
8
8
  fakeNode: BaseNodeModel | null;
9
+ docPointerMove?: (e: PointerEvent) => void;
10
+ docPointerUp?: (e: PointerEvent) => void;
9
11
  constructor(params: {
10
12
  lf: LogicFlow;
11
13
  });
12
14
  clientToLocalPoint({ x, y }: Position): Position;
15
+ isInsideCanvas(e: PointerEvent): boolean;
13
16
  startDrag(nodeConfig: OnDragNodeConfig): void;
14
17
  stopDrag: () => void;
15
- dragEnter: (e: MouseEvent) => void;
18
+ dragEnter: (e: PointerEvent) => void;
16
19
  onDragOver: (e: MouseEvent) => boolean;
17
20
  onDragLeave: () => void;
18
21
  onDrop: (e: MouseEvent) => void;
19
- eventMap(): {
20
- onMouseEnter: (e: MouseEvent) => void;
21
- onMouseOver: (e: MouseEvent) => void;
22
- onMouseMove: (e: MouseEvent) => boolean;
23
- onMouseLeave: () => void;
24
- onMouseUp: (e: MouseEvent) => void;
25
- };
26
22
  }
27
23
  export default Dnd;
@@ -22,7 +22,12 @@ var Dnd = /** @class */ (function () {
22
22
  this.fakeNode = null;
23
23
  this.stopDrag = function () {
24
24
  _this.nodeConfig = null;
25
- window.document.removeEventListener('mouseup', _this.stopDrag);
25
+ if (_this.docPointerMove) {
26
+ window.document.removeEventListener('pointermove', _this.docPointerMove);
27
+ }
28
+ if (_this.docPointerUp) {
29
+ window.document.removeEventListener('pointerup', _this.docPointerUp);
30
+ }
26
31
  };
27
32
  this.dragEnter = function (e) {
28
33
  if (!_this.nodeConfig || _this.fakeNode)
@@ -94,22 +99,53 @@ var Dnd = /** @class */ (function () {
94
99
  y: (0, util_1.snapToGrid)(y1, gridSize, snapGrid),
95
100
  };
96
101
  };
102
+ Dnd.prototype.isInsideCanvas = function (e) {
103
+ var overlay = this.lf.graphModel.rootEl.querySelector('[name="canvas-overlay"]');
104
+ var topEl = window.document.elementFromPoint(e.clientX, e.clientY);
105
+ return (topEl === overlay ||
106
+ (topEl !== null && !!overlay && overlay.contains(topEl)));
107
+ };
97
108
  Dnd.prototype.startDrag = function (nodeConfig) {
109
+ var _this = this;
98
110
  var editConfigModel = this.lf.graphModel.editConfigModel;
99
- if (!(editConfigModel === null || editConfigModel === void 0 ? void 0 : editConfigModel.isSilentMode)) {
100
- this.nodeConfig = nodeConfig;
101
- window.document.addEventListener('mouseup', this.stopDrag);
102
- }
103
- };
104
- Dnd.prototype.eventMap = function () {
105
- return {
106
- onMouseEnter: this.dragEnter,
107
- onMouseOver: this.dragEnter, // IE11
108
- onMouseMove: this.onDragOver,
109
- onMouseLeave: this.onDragLeave,
110
- // onMouseOut: this.onDragLeave, // IE11
111
- onMouseUp: this.onDrop,
111
+ if (editConfigModel === null || editConfigModel === void 0 ? void 0 : editConfigModel.isSilentMode)
112
+ return;
113
+ this.nodeConfig = nodeConfig;
114
+ // 指针移动:根据命中结果判断是否在画布覆盖层上,驱动假节点创建/移动或清理
115
+ this.docPointerMove = function (e) {
116
+ if (!_this.nodeConfig)
117
+ return;
118
+ // 离开画布:清理吸附线与假节点
119
+ if (!_this.isInsideCanvas(e)) {
120
+ _this.onDragLeave();
121
+ return;
122
+ }
123
+ // 首次进入画布:创建假节点并初始化位置
124
+ if (!_this.fakeNode) {
125
+ _this.dragEnter(e);
126
+ return;
127
+ }
128
+ // 在画布内移动:更新假节点位置与吸附线
129
+ _this.onDragOver(e);
130
+ };
131
+ // 指针抬起:在画布内落点生成节点,否则清理假节点
132
+ this.docPointerUp = function (e) {
133
+ if (!_this.nodeConfig)
134
+ return;
135
+ if (_this.isInsideCanvas(e)) {
136
+ _this.onDrop(e);
137
+ }
138
+ else {
139
+ _this.onDragLeave();
140
+ }
141
+ // 阻止默认行为与冒泡,避免滚动/点击穿透
142
+ e.preventDefault();
143
+ e.stopPropagation();
144
+ // 结束拖拽并移除监听
145
+ _this.stopDrag();
112
146
  };
147
+ window.document.addEventListener('pointermove', this.docPointerMove);
148
+ window.document.addEventListener('pointerup', this.docPointerUp);
113
149
  };
114
150
  return Dnd;
115
151
  }());
@@ -34,7 +34,7 @@ export declare class AdjustPoint extends Component<IProps, IState> {
34
34
  targetRuleResults: Map<any, any>;
35
35
  sourceRuleResults: Map<any, any>;
36
36
  constructor(props: IProps);
37
- handleMouseDown: (ev: MouseEvent) => void;
37
+ handleMouseDown: (ev: PointerEvent) => void;
38
38
  onDragStart: () => void;
39
39
  onDragging: ({ deltaX, deltaY }: IDragParams) => void;
40
40
  onDragEnd: ({ event }: Partial<IDragParams>) => void;
@@ -351,7 +351,7 @@ var AdjustPoint = /** @class */ (function (_super) {
351
351
  AdjustPoint.prototype.render = function () {
352
352
  var _a = this.props, x = _a.x, y = _a.y, getAdjustPointShape = _a.getAdjustPointShape, edgeModel = _a.edgeModel;
353
353
  var dragging = this.state.dragging;
354
- return ((0, jsx_runtime_1.jsx)("g", { pointerEvents: dragging ? 'none' : '', onMouseDown: this.handleMouseDown, children: !dragging ? getAdjustPointShape(x, y, edgeModel) : '' }));
354
+ return ((0, jsx_runtime_1.jsx)("g", { pointerEvents: dragging ? 'none' : '', onPointerDown: this.handleMouseDown, children: !dragging ? getAdjustPointShape(x, y, edgeModel) : '' }));
355
355
  };
356
356
  return AdjustPoint;
357
357
  }(compat_1.Component));
@@ -17,6 +17,7 @@ export declare abstract class BaseEdge<P extends IProps> extends Component<P, IE
17
17
  startTime?: number;
18
18
  contextMenuTime?: number;
19
19
  clickTimer?: number;
20
+ longPressTimer?: number;
20
21
  textRef: import("preact").RefObject<any>;
21
22
  constructor();
22
23
  /**
@@ -131,7 +132,7 @@ export declare abstract class BaseEdge<P extends IProps> extends Component<P, IE
131
132
  /**
132
133
  * 不支持重写
133
134
  */
134
- handleMouseDown: (e: MouseEvent) => void;
135
+ handleMouseDown: (e: PointerEvent) => void;
135
136
  handleMouseUp: () => void;
136
137
  /**
137
138
  * 不支持重写