@logicflow/core 2.2.0 → 2.2.1

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 (236) hide show
  1. package/dist/index.css +3 -2
  2. package/dist/index.min.js +1 -1
  3. package/dist/index.min.js.map +1 -1
  4. package/es/LogicFlow.d.ts +9 -0
  5. package/es/LogicFlow.js +0 -1
  6. package/es/constant/index.d.ts +1 -1
  7. package/es/constant/index.js +1 -1
  8. package/es/constant/theme.d.ts +136 -0
  9. package/es/constant/theme.js +680 -0
  10. package/es/index.css +3 -2
  11. package/es/model/GraphModel.d.ts +10 -2
  12. package/es/model/GraphModel.js +48 -14
  13. package/es/model/TransformModel.js +9 -9
  14. package/es/model/edge/BaseEdgeModel.js +7 -2
  15. package/es/model/edge/PolylineEdgeModel.d.ts +7 -0
  16. package/es/model/edge/PolylineEdgeModel.js +136 -7
  17. package/es/model/node/BaseNodeModel.d.ts +12 -1
  18. package/es/model/node/BaseNodeModel.js +9 -2
  19. package/es/model/node/HtmlNodeModel.d.ts +12 -0
  20. package/es/model/node/HtmlNodeModel.js +19 -0
  21. package/es/model/node/PolygonNodeModel.js +3 -3
  22. package/es/options.d.ts +4 -2
  23. package/es/style/index.css +3 -2
  24. package/es/style/index.less +3 -2
  25. package/es/style/raw.d.ts +1 -1
  26. package/es/style/raw.js +1 -1
  27. package/es/tool/MultipleSelectTool.js +10 -5
  28. package/es/util/drag.js +0 -1
  29. package/es/util/edge.d.ts +40 -1
  30. package/es/util/edge.js +43 -9
  31. package/es/util/geometry.d.ts +8 -0
  32. package/es/util/geometry.js +79 -0
  33. package/es/util/theme.d.ts +2 -65
  34. package/es/util/theme.js +4 -281
  35. package/es/view/Anchor.d.ts +1 -0
  36. package/es/view/Anchor.js +24 -21
  37. package/es/view/Control.d.ts +5 -0
  38. package/es/view/Control.js +44 -57
  39. package/es/view/edge/BaseEdge.js +9 -0
  40. package/es/view/edge/PolylineEdge.js +13 -2
  41. package/es/view/node/BaseNode.d.ts +1 -0
  42. package/es/view/node/BaseNode.js +23 -11
  43. package/es/view/node/HtmlNode.js +2 -4
  44. package/es/view/overlay/CanvasOverlay.js +5 -2
  45. package/es/view/overlay/Grid.d.ts +12 -1
  46. package/es/view/overlay/Grid.js +85 -23
  47. package/es/view/overlay/OutlineOverlay.d.ts +1 -0
  48. package/es/view/overlay/OutlineOverlay.js +18 -17
  49. package/es/view/overlay/gridConfig.d.ts +46 -0
  50. package/es/view/overlay/gridConfig.js +99 -0
  51. package/es/view/shape/Polygon.d.ts +0 -7
  52. package/es/view/shape/Polygon.js +12 -43
  53. package/lib/LogicFlow.d.ts +9 -0
  54. package/lib/LogicFlow.js +0 -1
  55. package/lib/constant/index.d.ts +1 -1
  56. package/lib/constant/index.js +16 -2
  57. package/lib/constant/theme.d.ts +136 -0
  58. package/lib/constant/theme.js +683 -0
  59. package/lib/index.css +3 -2
  60. package/lib/model/GraphModel.d.ts +10 -2
  61. package/lib/model/GraphModel.js +49 -15
  62. package/lib/model/TransformModel.js +9 -9
  63. package/lib/model/edge/BaseEdgeModel.js +7 -2
  64. package/lib/model/edge/PolylineEdgeModel.d.ts +7 -0
  65. package/lib/model/edge/PolylineEdgeModel.js +136 -7
  66. package/lib/model/node/BaseNodeModel.d.ts +12 -1
  67. package/lib/model/node/BaseNodeModel.js +9 -2
  68. package/lib/model/node/HtmlNodeModel.d.ts +12 -0
  69. package/lib/model/node/HtmlNodeModel.js +19 -0
  70. package/lib/model/node/PolygonNodeModel.js +3 -3
  71. package/lib/options.d.ts +4 -2
  72. package/lib/style/index.css +3 -2
  73. package/lib/style/index.less +3 -2
  74. package/lib/style/raw.d.ts +1 -1
  75. package/lib/style/raw.js +1 -1
  76. package/lib/tool/MultipleSelectTool.js +10 -5
  77. package/lib/util/drag.js +0 -1
  78. package/lib/util/edge.d.ts +40 -1
  79. package/lib/util/edge.js +43 -9
  80. package/lib/util/geometry.d.ts +8 -0
  81. package/lib/util/geometry.js +81 -1
  82. package/lib/util/theme.d.ts +2 -65
  83. package/lib/util/theme.js +15 -292
  84. package/lib/view/Anchor.d.ts +1 -0
  85. package/lib/view/Anchor.js +24 -21
  86. package/lib/view/Control.d.ts +5 -0
  87. package/lib/view/Control.js +44 -57
  88. package/lib/view/edge/BaseEdge.js +9 -0
  89. package/lib/view/edge/PolylineEdge.js +13 -2
  90. package/lib/view/node/BaseNode.d.ts +1 -0
  91. package/lib/view/node/BaseNode.js +22 -10
  92. package/lib/view/node/HtmlNode.js +1 -3
  93. package/lib/view/overlay/CanvasOverlay.js +5 -2
  94. package/lib/view/overlay/Grid.d.ts +12 -1
  95. package/lib/view/overlay/Grid.js +83 -21
  96. package/lib/view/overlay/OutlineOverlay.d.ts +1 -0
  97. package/lib/view/overlay/OutlineOverlay.js +18 -17
  98. package/lib/view/overlay/gridConfig.d.ts +46 -0
  99. package/lib/view/overlay/gridConfig.js +104 -0
  100. package/lib/view/shape/Polygon.d.ts +0 -7
  101. package/lib/view/shape/Polygon.js +13 -45
  102. package/package.json +6 -1
  103. package/.turbo/turbo-build$colon$dev.log +0 -10
  104. package/.turbo/turbo-build.log +0 -33
  105. package/CHANGELOG.md +0 -1849
  106. package/__tests__/algorithm/egde.test.ts +0 -131
  107. package/__tests__/algorithm/index.test.ts +0 -74
  108. package/__tests__/algorithm/outline.test.ts +0 -43
  109. package/__tests__/bugs/1545-spec.test.ts +0 -42
  110. package/__tests__/event/event.test.ts +0 -22
  111. package/__tests__/history/history.test.ts +0 -28
  112. package/__tests__/logicflow.test.ts +0 -575
  113. package/__tests__/model/graphmodel.test.ts +0 -87
  114. package/__tests__/util/compatible.test.ts +0 -48
  115. package/__tests__/util/edge.test.ts +0 -224
  116. package/__tests__/util/geometry.test.ts +0 -14
  117. package/__tests__/util/graph.test.ts +0 -16
  118. package/__tests__/util/matrix.test.ts +0 -41
  119. package/__tests__/util/node.test.ts +0 -68
  120. package/__tests__/util/sampling.test.ts +0 -12
  121. package/__tests__/util/vector.test.ts +0 -50
  122. package/__tests__/util/zIndex.test.ts +0 -10
  123. package/src/LogicFlow.tsx +0 -2008
  124. package/src/algorithm/edge.ts +0 -67
  125. package/src/algorithm/index.ts +0 -70
  126. package/src/algorithm/outline.ts +0 -77
  127. package/src/algorithm/rotate.ts +0 -55
  128. package/src/common/drag.ts +0 -219
  129. package/src/common/history.ts +0 -108
  130. package/src/common/index.ts +0 -6
  131. package/src/common/keyboard.ts +0 -108
  132. package/src/common/matrix.ts +0 -122
  133. package/src/common/vector.ts +0 -93
  134. package/src/constant/index.ts +0 -179
  135. package/src/event/event.md +0 -66
  136. package/src/event/eventArgs.ts +0 -643
  137. package/src/event/eventEmitter.ts +0 -156
  138. package/src/history/index.ts +0 -119
  139. package/src/index.less +0 -1
  140. package/src/index.ts +0 -26
  141. package/src/keyboard/index.ts +0 -112
  142. package/src/keyboard/shortcut.ts +0 -200
  143. package/src/model/BaseModel.ts +0 -250
  144. package/src/model/EditConfigModel.ts +0 -334
  145. package/src/model/GraphModel.ts +0 -1788
  146. package/src/model/NestedTransformModel.ts +0 -121
  147. package/src/model/SnaplineModel.ts +0 -256
  148. package/src/model/TransformModel.ts +0 -258
  149. package/src/model/edge/BaseEdgeModel.ts +0 -777
  150. package/src/model/edge/BezierEdgeModel.ts +0 -197
  151. package/src/model/edge/LineEdgeModel.ts +0 -36
  152. package/src/model/edge/PolylineEdgeModel.ts +0 -672
  153. package/src/model/edge/index.ts +0 -4
  154. package/src/model/index.ts +0 -9
  155. package/src/model/node/BaseNodeModel.ts +0 -949
  156. package/src/model/node/CircleNodeModel.ts +0 -91
  157. package/src/model/node/DiamondNodeModel.ts +0 -132
  158. package/src/model/node/EllipseNodeModel.ts +0 -98
  159. package/src/model/node/HtmlNodeModel.ts +0 -50
  160. package/src/model/node/PolygonNodeModel.ts +0 -150
  161. package/src/model/node/RectNodeModel.ts +0 -69
  162. package/src/model/node/TextNodeModel.ts +0 -54
  163. package/src/model/node/index.ts +0 -8
  164. package/src/options.ts +0 -145
  165. package/src/style/index.less +0 -261
  166. package/src/style/raw.ts +0 -220
  167. package/src/tool/MultipleSelectTool.tsx +0 -132
  168. package/src/tool/TextEditTool.tsx +0 -193
  169. package/src/tool/index.ts +0 -101
  170. package/src/typings.d.ts +0 -5
  171. package/src/util/animation.ts +0 -29
  172. package/src/util/browser.ts +0 -4
  173. package/src/util/compatible.ts +0 -15
  174. package/src/util/drag.ts +0 -220
  175. package/src/util/edge.ts +0 -1060
  176. package/src/util/geometry.ts +0 -55
  177. package/src/util/graph.ts +0 -46
  178. package/src/util/index.ts +0 -17
  179. package/src/util/matrix.ts +0 -129
  180. package/src/util/mobx.ts +0 -23
  181. package/src/util/node.ts +0 -543
  182. package/src/util/raf.ts +0 -28
  183. package/src/util/resize.ts +0 -606
  184. package/src/util/sampling.ts +0 -85
  185. package/src/util/theme.ts +0 -375
  186. package/src/util/uuid.ts +0 -26
  187. package/src/util/vector.ts +0 -93
  188. package/src/util/zIndex.ts +0 -6
  189. package/src/view/Anchor.tsx +0 -445
  190. package/src/view/Control.tsx +0 -512
  191. package/src/view/Graph.tsx +0 -141
  192. package/src/view/Rotate.tsx +0 -113
  193. package/src/view/behavior/dnd.ts +0 -162
  194. package/src/view/behavior/index.ts +0 -2
  195. package/src/view/behavior/snapline.ts +0 -16
  196. package/src/view/edge/AdjustPoint.tsx +0 -425
  197. package/src/view/edge/Arrow.tsx +0 -54
  198. package/src/view/edge/BaseEdge.tsx +0 -650
  199. package/src/view/edge/BezierEdge.tsx +0 -101
  200. package/src/view/edge/LineEdge.tsx +0 -81
  201. package/src/view/edge/PolylineEdge.tsx +0 -299
  202. package/src/view/edge/index.ts +0 -6
  203. package/src/view/index.ts +0 -8
  204. package/src/view/node/BaseNode.tsx +0 -571
  205. package/src/view/node/CircleNode.tsx +0 -21
  206. package/src/view/node/DiamondNode.tsx +0 -24
  207. package/src/view/node/EllipseNode.tsx +0 -22
  208. package/src/view/node/HtmlNode.tsx +0 -95
  209. package/src/view/node/PolygonNode.tsx +0 -28
  210. package/src/view/node/RectNode.tsx +0 -30
  211. package/src/view/node/TextNode.tsx +0 -39
  212. package/src/view/node/index.ts +0 -8
  213. package/src/view/overlay/BackgroundOverlay.tsx +0 -34
  214. package/src/view/overlay/BezierAdjustOverlay.tsx +0 -150
  215. package/src/view/overlay/CanvasOverlay.tsx +0 -288
  216. package/src/view/overlay/Grid.tsx +0 -162
  217. package/src/view/overlay/ModificationOverlay.tsx +0 -31
  218. package/src/view/overlay/OutlineOverlay.tsx +0 -170
  219. package/src/view/overlay/SnaplineOverlay.tsx +0 -44
  220. package/src/view/overlay/ToolOverlay.tsx +0 -65
  221. package/src/view/overlay/getTransformHoc.tsx +0 -50
  222. package/src/view/overlay/index.ts +0 -8
  223. package/src/view/shape/Circle.tsx +0 -41
  224. package/src/view/shape/Ellipse.tsx +0 -42
  225. package/src/view/shape/Line.tsx +0 -39
  226. package/src/view/shape/Path.tsx +0 -22
  227. package/src/view/shape/Polygon.tsx +0 -91
  228. package/src/view/shape/Polyline.tsx +0 -31
  229. package/src/view/shape/Rect.tsx +0 -44
  230. package/src/view/shape/Text.tsx +0 -169
  231. package/src/view/shape/index.ts +0 -8
  232. package/src/view/text/BaseText.tsx +0 -134
  233. package/src/view/text/LineText.tsx +0 -168
  234. package/src/view/text/index.ts +0 -2
  235. package/stats.html +0 -4842
  236. package/tsconfig.json +0 -18
@@ -1,445 +0,0 @@
1
- import { Component } from 'preact/compat'
2
- import { Circle, Line } from './shape'
3
- import { BaseNode } from './node'
4
- import LogicFlow from '../LogicFlow'
5
- import { ElementState, EventType } from '../constant'
6
- import { GraphModel, BaseNodeModel, Model } from '../model'
7
- import {
8
- StepDrag,
9
- formatAnchorConnectValidateData,
10
- targetNodeInfo,
11
- distance,
12
- cancelRaf,
13
- createRaf,
14
- IDragParams,
15
- } from '../util'
16
-
17
- import AnchorConfig = Model.AnchorConfig
18
- import NodeData = LogicFlow.NodeData
19
-
20
- interface IProps {
21
- // x: number;
22
- // y: number;
23
- // id?: string;
24
- anchorData: AnchorConfig
25
- node: BaseNode<any>
26
- style?: Record<string, any>
27
- hoverStyle?: Record<string, any>
28
- edgeStyle?: Record<string, any>
29
- anchorIndex: number
30
- graphModel: GraphModel
31
- nodeModel: BaseNodeModel
32
- setHoverOff: (e: PointerEvent) => void
33
- }
34
-
35
- interface IState {
36
- startX: number
37
- startY: number
38
- endX: number
39
- endY: number
40
- dragging: boolean
41
- }
42
-
43
- class Anchor extends Component<IProps, IState> {
44
- preTargetNode?: BaseNodeModel
45
- sourceRuleResults: Map<string, Model.ConnectRuleResult> // 不同的target,source的校验规则产生的结果不同
46
- targetRuleResults: Map<string, Model.ConnectRuleResult> // 不同的target,target的校验规则不同
47
- dragHandler: StepDrag
48
- t: any
49
-
50
- constructor() {
51
- super()
52
- this.sourceRuleResults = new Map()
53
- this.targetRuleResults = new Map()
54
-
55
- this.state = {
56
- startX: 0,
57
- startY: 0,
58
- endX: 0,
59
- endY: 0,
60
- dragging: false,
61
- }
62
- this.dragHandler = new StepDrag({
63
- onDragStart: this.onDragStart,
64
- onDragging: this.onDragging,
65
- onDragEnd: this.onDragEnd,
66
- })
67
- }
68
-
69
- getAnchorShape() {
70
- const { anchorData, style, node } = this.props
71
- const anchorShape = node.getAnchorShape(anchorData)
72
- if (anchorShape) return anchorShape
73
- const { x, y } = anchorData
74
- const hoverStyle = {
75
- ...style,
76
- ...style?.hover,
77
- }
78
- return (
79
- <g>
80
- <Circle
81
- className="lf-node-anchor-hover"
82
- {...hoverStyle}
83
- {...{
84
- x,
85
- y,
86
- }}
87
- />
88
- <Circle
89
- className="lf-node-anchor"
90
- {...style}
91
- {...{
92
- x,
93
- y,
94
- }}
95
- />
96
- </g>
97
- )
98
- }
99
-
100
- // TODO: 确定 event 是否会有 null 和 undefined 的情况,事件类型做相应的适配
101
- onDragStart = ({ event }: Partial<IDragParams>) => {
102
- const { anchorData, nodeModel, graphModel } = this.props
103
- graphModel.selectNodeById(nodeModel.id)
104
- if (nodeModel.autoToFront) {
105
- graphModel.toFront(nodeModel.id)
106
- }
107
- graphModel.eventCenter.emit(EventType.ANCHOR_DRAGSTART, {
108
- data: anchorData,
109
- e: event!,
110
- nodeModel,
111
- })
112
- this.setState({
113
- startX: anchorData.x,
114
- startY: anchorData.y,
115
- endX: anchorData.x,
116
- endY: anchorData.y,
117
- })
118
- }
119
- onDragging = ({ event }: IDragParams) => {
120
- const { graphModel, nodeModel, anchorData } = this.props
121
- const {
122
- transformModel,
123
- eventCenter,
124
- width,
125
- height,
126
- editConfigModel: { autoExpand, stopMoveGraph },
127
- } = graphModel
128
- // TODO:确认该方法是否有影响!理论上 onDragging 时 event 必有值
129
- if (!event) return
130
- const { clientX, clientY } = event
131
- const {
132
- domOverlayPosition: { x, y },
133
- canvasOverlayPosition: { x: x1, y: y1 },
134
- } = graphModel.getPointByClient({
135
- x: clientX,
136
- y: clientY,
137
- })
138
- if (this.t) {
139
- cancelRaf(this.t)
140
- }
141
- let nearBoundary: number[] = [] // TODO: 定义元组类型 Tuple
142
- const size = 10
143
- if (x < 10) {
144
- nearBoundary = [size, 0]
145
- } else if (x + 10 > width) {
146
- nearBoundary = [-size, 0]
147
- } else if (y < 10) {
148
- nearBoundary = [0, size]
149
- } else if (y + 10 > height) {
150
- nearBoundary = [0, -size]
151
- }
152
- this.setState({
153
- endX: x1,
154
- endY: y1,
155
- dragging: true,
156
- })
157
- this.moveAnchorEnd(x1, y1, event)
158
- if (nearBoundary.length > 0 && !stopMoveGraph && autoExpand) {
159
- this.t = createRaf(() => {
160
- const [translateX, translateY] = nearBoundary
161
- transformModel.translate(translateX, translateY)
162
- const { endX, endY } = this.state
163
- this.setState({
164
- endX: endX - translateX,
165
- endY: endY - translateY,
166
- })
167
- this.moveAnchorEnd(endX - translateX, endY - translateY, event)
168
- })
169
- }
170
- eventCenter.emit(EventType.ANCHOR_DRAG, {
171
- data: anchorData,
172
- e: event,
173
- nodeModel,
174
- })
175
- }
176
- onDragEnd = ({ event }: Partial<IDragParams>) => {
177
- if (this.t) {
178
- cancelRaf(this.t)
179
- }
180
- const edgeModel = this.checkEnd(event)
181
- this.setState({
182
- startX: 0,
183
- startY: 0,
184
- endX: 0,
185
- endY: 0,
186
- dragging: false,
187
- })
188
- // 清除掉缓存结果 fix:#320 因为创建边之后,会影响校验结果变化,所以需要重新校验
189
- this.sourceRuleResults.clear()
190
- this.targetRuleResults.clear()
191
- const { graphModel, nodeModel, anchorData } = this.props
192
- // 拖拽结束清理:取消悬浮态
193
- if (this.preTargetNode) {
194
- this.preTargetNode.setHovered(false)
195
- this.preTargetNode = undefined
196
- }
197
-
198
- graphModel.eventCenter.emit(EventType.ANCHOR_DRAGEND, {
199
- data: anchorData,
200
- e: event!,
201
- nodeModel,
202
- edgeModel: edgeModel ?? undefined,
203
- })
204
- }
205
-
206
- get customTrajectory() {
207
- const {
208
- graphModel: { customTrajectory },
209
- } = this.props
210
- return customTrajectory
211
- }
212
-
213
- get relateEdges() {
214
- const {
215
- graphModel: { getAnchorIncomingEdge, getAnchorOutgoingEdge },
216
- anchorData: { id },
217
- } = this.props
218
- return {
219
- incomingEdgeList: getAnchorIncomingEdge(id),
220
- outgoingEdgeList: getAnchorOutgoingEdge(id),
221
- }
222
- }
223
-
224
- checkEnd = (event: PointerEvent | null | undefined) => {
225
- const {
226
- graphModel,
227
- nodeModel,
228
- anchorData: { x, y, id },
229
- } = this.props
230
- // nodeModel.setSelected(false);
231
- /* 创建边 */
232
- const { endX, endY, dragging } = this.state
233
- const info = targetNodeInfo(
234
- {
235
- x: endX,
236
- y: endY,
237
- },
238
- graphModel,
239
- )
240
- // 为了保证鼠标离开的时候,将上一个节点状态重置为正常状态。
241
- if (
242
- this.preTargetNode &&
243
- this.preTargetNode.state !== ElementState.DEFAULT
244
- ) {
245
- this.preTargetNode.setElementState(ElementState.DEFAULT)
246
- }
247
- // 没有dragging就结束边
248
- if (!dragging) return
249
- if (info && info.node) {
250
- const targetNode = info.node
251
- const anchorId = info.anchor.id
252
- const targetInfoId = `${nodeModel.id}_${targetNode.id}_${anchorId}_${id}`
253
- const { isAllPass: isSourcePass, msg: sourceMsg } =
254
- this.sourceRuleResults.get(targetInfoId) || {}
255
- const { isAllPass: isTargetPass, msg: targetMsg } =
256
- this.targetRuleResults.get(targetInfoId) || {}
257
- if (isSourcePass && isTargetPass) {
258
- targetNode.setElementState(ElementState.DEFAULT)
259
- const targetNodeModel = graphModel.getNodeModelById(info.node.id)
260
- const edgeData = graphModel.edgeGenerator?.(
261
- nodeModel.getData(),
262
- targetNodeModel?.getData() as NodeData,
263
- )
264
- const edgeModel = graphModel.addEdge({
265
- ...edgeData,
266
- sourceNodeId: nodeModel.id,
267
- sourceAnchorId: id,
268
- startPoint: {
269
- x,
270
- y,
271
- },
272
- targetNodeId: info.node.id,
273
- targetAnchorId: info.anchor.id,
274
- endPoint: {
275
- x: info.anchor.x,
276
- y: info.anchor.y,
277
- },
278
- })
279
- const { anchorData } = this.props
280
- graphModel.eventCenter.emit(EventType.ANCHOR_DROP, {
281
- data: anchorData,
282
- e: event!,
283
- nodeModel,
284
- edgeModel,
285
- })
286
- return edgeModel
287
- }
288
- const nodeData = targetNode.getData()
289
- graphModel.eventCenter.emit(EventType.CONNECTION_NOT_ALLOWED, {
290
- data: nodeData,
291
- msg: targetMsg || sourceMsg || '不允许添加连线',
292
- })
293
- return null
294
- }
295
- }
296
-
297
- moveAnchorEnd(endX: number, endY: number, event?: PointerEvent) {
298
- const { graphModel, nodeModel, anchorData } = this.props
299
- const info = targetNodeInfo(
300
- {
301
- x: endX,
302
- y: endY,
303
- },
304
- graphModel,
305
- )
306
- if (info) {
307
- const targetNode = info.node
308
- const anchorId = info.anchor.id
309
- if (this.preTargetNode && this.preTargetNode !== info.node) {
310
- this.preTargetNode.setElementState(ElementState.DEFAULT)
311
- }
312
- // #500 不允许锚点自己连自己, 在锚点一开始连接的时候, 不触发自己连接自己的校验。
313
- if (anchorData.id === anchorId) {
314
- return
315
- }
316
- this.preTargetNode = targetNode
317
- // 支持节点的每个锚点单独设置是否可连接,因此规则key去nodeId + anchorId作为唯一值
318
- const targetInfoId = `${nodeModel.id}_${targetNode.id}_${anchorId}_${anchorData.id}`
319
-
320
- // 查看鼠标是否进入过target,若有检验结果,表示进入过, 就不重复计算了。
321
- if (!this.targetRuleResults.has(targetInfoId)) {
322
- const targetAnchor = info.anchor
323
- const sourceRuleResult = nodeModel.isAllowConnectedAsSource(
324
- targetNode,
325
- anchorData,
326
- targetAnchor,
327
- )
328
- const targetRuleResult = targetNode.isAllowConnectedAsTarget(
329
- nodeModel,
330
- anchorData,
331
- targetAnchor,
332
- )
333
- this.sourceRuleResults.set(
334
- targetInfoId,
335
- formatAnchorConnectValidateData(sourceRuleResult),
336
- )
337
- this.targetRuleResults.set(
338
- targetInfoId,
339
- formatAnchorConnectValidateData(targetRuleResult),
340
- )
341
- }
342
- const { isAllPass: isSourcePass } =
343
- this.sourceRuleResults.get(targetInfoId) ?? {}
344
- const { isAllPass: isTargetPass } =
345
- this.targetRuleResults.get(targetInfoId) ?? {}
346
- // 实时提示出即将链接的锚点
347
- if (isSourcePass && isTargetPass) {
348
- targetNode.setElementState(ElementState.ALLOW_CONNECT)
349
- } else {
350
- targetNode.setElementState(ElementState.NOT_ALLOW_CONNECT)
351
- }
352
- // 人工触发进入目标节点事件,同步设置 hovered 以驱动锚点显隐和样式
353
- if (!targetNode.isHovered) {
354
- const nodeData = targetNode.getData()
355
- if (event) {
356
- graphModel.eventCenter.emit(EventType.NODE_MOUSEENTER, {
357
- data: nodeData,
358
- e: event,
359
- })
360
- }
361
- targetNode.setHovered(true)
362
- }
363
- } else if (
364
- this.preTargetNode &&
365
- this.preTargetNode.state !== ElementState.DEFAULT
366
- ) {
367
- // 为了保证鼠标离开的时候,将上一个节点状态重置为正常状态。
368
- this.preTargetNode.setElementState(ElementState.DEFAULT)
369
- // 未命中任何节点:人工派发离开事件并取消悬浮,避免状态残留
370
- const prevData = this.preTargetNode.getData()
371
- if (event) {
372
- graphModel.eventCenter.emit(EventType.NODE_MOUSELEAVE, {
373
- data: prevData,
374
- e: event,
375
- })
376
- }
377
- this.preTargetNode.setHovered(false)
378
- this.preTargetNode = undefined
379
- }
380
- }
381
-
382
- isShowLine() {
383
- const { startX, startY, endX, endY } = this.state
384
- const v = distance(startX, startY, endX, endY)
385
- return v > 10
386
- }
387
-
388
- render() {
389
- const { startX, startY, endX, endY } = this.state
390
- const { anchorData, edgeStyle, nodeModel, graphModel } = this.props
391
- const { edgeAddable } = anchorData
392
- return (
393
- // className="lf-anchor" 作为下载时,需要将锚点删除的依据,不要修改类名
394
- <g className="lf-anchor">
395
- <g
396
- onClick={(ev) => {
397
- ev.stopPropagation()
398
- graphModel.eventCenter.emit(EventType.ANCHOR_CLICK, {
399
- data: anchorData,
400
- e: ev!,
401
- nodeModel,
402
- })
403
- }}
404
- onPointerDown={(ev) => {
405
- graphModel.eventCenter.emit(EventType.ANCHOR_MOUSEDOWN, {
406
- data: anchorData,
407
- e: ev!,
408
- nodeModel,
409
- })
410
- if (edgeAddable !== false) {
411
- this.dragHandler.handleMouseDown(ev)
412
- }
413
- }}
414
- >
415
- {this.getAnchorShape()}
416
- </g>
417
- {this.isShowLine() &&
418
- (this.customTrajectory ? (
419
- this.customTrajectory({
420
- sourcePoint: {
421
- x: startX,
422
- y: startY,
423
- },
424
- targetPoint: {
425
- x: endX,
426
- y: endY,
427
- },
428
- ...edgeStyle,
429
- })
430
- ) : (
431
- <Line
432
- x1={startX}
433
- y1={startY}
434
- x2={endX}
435
- y2={endY}
436
- {...edgeStyle}
437
- pointer-events="none"
438
- />
439
- ))}
440
- </g>
441
- )
442
- }
443
- }
444
-
445
- export default Anchor