@logicflow/core 2.0.0-beta.4 → 2.0.0-beta.6

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 (246) hide show
  1. package/.turbo/turbo-build$colon$dev.log +2 -2
  2. package/.turbo/turbo-build.log +9 -15
  3. package/__tests__/bugs/1545-spec.test.ts +19 -15
  4. package/__tests__/util/edge.test.ts +57 -57
  5. package/dist/index.min.js +4 -4
  6. package/es/LogicFlow.d.ts +32 -6
  7. package/es/LogicFlow.js +15 -12
  8. package/es/LogicFlow.js.map +1 -1
  9. package/es/algorithm/edge.js.map +1 -1
  10. package/es/algorithm/index.d.ts +2 -0
  11. package/es/algorithm/index.js +2 -0
  12. package/es/algorithm/index.js.map +1 -1
  13. package/es/algorithm/outline.d.ts +1 -1
  14. package/es/common/drag.d.ts +2 -2
  15. package/es/common/drag.js.map +1 -1
  16. package/es/constant/index.d.ts +37 -1
  17. package/es/constant/index.js +40 -1
  18. package/es/constant/index.js.map +1 -1
  19. package/es/event/eventArgs.d.ts +88 -25
  20. package/es/index.d.ts +4 -0
  21. package/es/index.js +4 -0
  22. package/es/index.js.map +1 -1
  23. package/es/keyboard/shortcut.d.ts +4 -0
  24. package/es/keyboard/shortcut.js +9 -8
  25. package/es/keyboard/shortcut.js.map +1 -1
  26. package/es/model/BaseModel.d.ts +12 -16
  27. package/es/model/EditConfigModel.d.ts +97 -36
  28. package/es/model/EditConfigModel.js +166 -79
  29. package/es/model/EditConfigModel.js.map +1 -1
  30. package/es/model/GraphModel.d.ts +12 -1
  31. package/es/model/GraphModel.js +40 -9
  32. package/es/model/GraphModel.js.map +1 -1
  33. package/es/model/TransformModel.js +1 -1
  34. package/es/model/TransformModel.js.map +1 -1
  35. package/es/model/edge/BaseEdgeModel.d.ts +7 -1
  36. package/es/model/edge/BaseEdgeModel.js +33 -17
  37. package/es/model/edge/BaseEdgeModel.js.map +1 -1
  38. package/es/model/edge/BezierEdgeModel.d.ts +1 -1
  39. package/es/model/edge/BezierEdgeModel.js +5 -2
  40. package/es/model/edge/BezierEdgeModel.js.map +1 -1
  41. package/es/model/edge/PolylineEdgeModel.d.ts +3 -3
  42. package/es/model/edge/PolylineEdgeModel.js +20 -14
  43. package/es/model/edge/PolylineEdgeModel.js.map +1 -1
  44. package/es/model/node/BaseNodeModel.d.ts +7 -1
  45. package/es/model/node/BaseNodeModel.js +22 -11
  46. package/es/model/node/BaseNodeModel.js.map +1 -1
  47. package/es/model/node/CircleNodeModel.js.map +1 -1
  48. package/es/model/node/DiamondNodeModel.js.map +1 -1
  49. package/es/model/node/EllipseNodeModel.js.map +1 -1
  50. package/es/options.d.ts +4 -1
  51. package/es/options.js.map +1 -1
  52. package/es/tool/MultipleSelectTool.d.ts +1 -1
  53. package/es/tool/MultipleSelectTool.js +5 -5
  54. package/es/tool/MultipleSelectTool.js.map +1 -1
  55. package/es/tool/TextEditTool.d.ts +3 -3
  56. package/es/tool/TextEditTool.js +2 -2
  57. package/es/tool/TextEditTool.js.map +1 -1
  58. package/es/tool/index.d.ts +24 -2
  59. package/es/tool/index.js +82 -2
  60. package/es/tool/index.js.map +1 -1
  61. package/es/util/drag.d.ts +5 -5
  62. package/es/util/drag.js +3 -1
  63. package/es/util/drag.js.map +1 -1
  64. package/es/util/edge.d.ts +2 -1
  65. package/es/util/edge.js +9 -12
  66. package/es/util/edge.js.map +1 -1
  67. package/es/util/node.d.ts +2 -5
  68. package/es/util/node.js +1 -0
  69. package/es/util/node.js.map +1 -1
  70. package/es/view/Anchor.d.ts +1 -3
  71. package/es/view/Anchor.js +3 -0
  72. package/es/view/Anchor.js.map +1 -1
  73. package/es/view/Control.d.ts +1 -1
  74. package/es/view/Control.js +7 -7
  75. package/es/view/Control.js.map +1 -1
  76. package/es/view/Graph.d.ts +1 -1
  77. package/es/view/Rotate.js +2 -1
  78. package/es/view/Rotate.js.map +1 -1
  79. package/es/view/behavior/index.d.ts +2 -0
  80. package/es/view/behavior/index.js +3 -0
  81. package/es/view/behavior/index.js.map +1 -0
  82. package/es/view/behavior/snapline.d.ts +3 -0
  83. package/es/{tool → view/behavior}/snapline.js +0 -1
  84. package/es/view/behavior/snapline.js.map +1 -0
  85. package/es/view/edge/AdjustPoint.js +9 -20
  86. package/es/view/edge/AdjustPoint.js.map +1 -1
  87. package/es/view/edge/BaseEdge.js +25 -17
  88. package/es/view/edge/BaseEdge.js.map +1 -1
  89. package/es/view/node/BaseNode.js +14 -9
  90. package/es/view/node/BaseNode.js.map +1 -1
  91. package/es/view/node/HtmlNode.js +2 -2
  92. package/es/view/node/HtmlNode.js.map +1 -1
  93. package/es/view/overlay/CanvasOverlay.js +1 -0
  94. package/es/view/overlay/CanvasOverlay.js.map +1 -1
  95. package/es/view/overlay/ToolOverlay.d.ts +1 -1
  96. package/es/view/overlay/ToolOverlay.js +1 -1
  97. package/es/view/overlay/ToolOverlay.js.map +1 -1
  98. package/es/view/text/BaseText.js +7 -3
  99. package/es/view/text/BaseText.js.map +1 -1
  100. package/lib/LogicFlow.d.ts +32 -6
  101. package/lib/LogicFlow.js +17 -14
  102. package/lib/LogicFlow.js.map +1 -1
  103. package/lib/algorithm/edge.js.map +1 -1
  104. package/lib/algorithm/index.d.ts +2 -0
  105. package/lib/algorithm/index.js +17 -1
  106. package/lib/algorithm/index.js.map +1 -1
  107. package/lib/algorithm/outline.d.ts +1 -1
  108. package/lib/common/drag.d.ts +2 -2
  109. package/lib/common/drag.js.map +1 -1
  110. package/lib/constant/index.d.ts +37 -1
  111. package/lib/constant/index.js +41 -2
  112. package/lib/constant/index.js.map +1 -1
  113. package/lib/event/eventArgs.d.ts +88 -25
  114. package/lib/index.d.ts +4 -0
  115. package/lib/index.js +4 -0
  116. package/lib/index.js.map +1 -1
  117. package/lib/keyboard/shortcut.d.ts +4 -0
  118. package/lib/keyboard/shortcut.js +12 -9
  119. package/lib/keyboard/shortcut.js.map +1 -1
  120. package/lib/model/BaseModel.d.ts +12 -16
  121. package/lib/model/EditConfigModel.d.ts +97 -36
  122. package/lib/model/EditConfigModel.js +165 -78
  123. package/lib/model/EditConfigModel.js.map +1 -1
  124. package/lib/model/GraphModel.d.ts +12 -1
  125. package/lib/model/GraphModel.js +38 -7
  126. package/lib/model/GraphModel.js.map +1 -1
  127. package/lib/model/TransformModel.js +1 -1
  128. package/lib/model/TransformModel.js.map +1 -1
  129. package/lib/model/edge/BaseEdgeModel.d.ts +7 -1
  130. package/lib/model/edge/BaseEdgeModel.js +31 -15
  131. package/lib/model/edge/BaseEdgeModel.js.map +1 -1
  132. package/lib/model/edge/BezierEdgeModel.d.ts +1 -1
  133. package/lib/model/edge/BezierEdgeModel.js +4 -1
  134. package/lib/model/edge/BezierEdgeModel.js.map +1 -1
  135. package/lib/model/edge/PolylineEdgeModel.d.ts +3 -3
  136. package/lib/model/edge/PolylineEdgeModel.js +19 -13
  137. package/lib/model/edge/PolylineEdgeModel.js.map +1 -1
  138. package/lib/model/node/BaseNodeModel.d.ts +7 -1
  139. package/lib/model/node/BaseNodeModel.js +20 -9
  140. package/lib/model/node/BaseNodeModel.js.map +1 -1
  141. package/lib/model/node/CircleNodeModel.js.map +1 -1
  142. package/lib/model/node/DiamondNodeModel.js.map +1 -1
  143. package/lib/model/node/EllipseNodeModel.js.map +1 -1
  144. package/lib/options.d.ts +4 -1
  145. package/lib/options.js.map +1 -1
  146. package/lib/tool/MultipleSelectTool.d.ts +1 -1
  147. package/lib/tool/MultipleSelectTool.js +5 -5
  148. package/lib/tool/MultipleSelectTool.js.map +1 -1
  149. package/lib/tool/TextEditTool.d.ts +3 -3
  150. package/lib/tool/TextEditTool.js +4 -4
  151. package/lib/tool/TextEditTool.js.map +1 -1
  152. package/lib/tool/index.d.ts +24 -2
  153. package/lib/tool/index.js +85 -15
  154. package/lib/tool/index.js.map +1 -1
  155. package/lib/util/drag.d.ts +5 -5
  156. package/lib/util/drag.js +3 -1
  157. package/lib/util/drag.js.map +1 -1
  158. package/lib/util/edge.d.ts +2 -1
  159. package/lib/util/edge.js +11 -14
  160. package/lib/util/edge.js.map +1 -1
  161. package/lib/util/node.d.ts +2 -5
  162. package/lib/util/node.js +1 -0
  163. package/lib/util/node.js.map +1 -1
  164. package/lib/view/Anchor.d.ts +1 -3
  165. package/lib/view/Anchor.js +3 -0
  166. package/lib/view/Anchor.js.map +1 -1
  167. package/lib/view/Control.d.ts +1 -1
  168. package/lib/view/Control.js +7 -7
  169. package/lib/view/Control.js.map +1 -1
  170. package/lib/view/Graph.d.ts +1 -1
  171. package/lib/view/Rotate.js +2 -1
  172. package/lib/view/Rotate.js.map +1 -1
  173. package/lib/view/behavior/index.d.ts +2 -0
  174. package/lib/view/behavior/index.js +19 -0
  175. package/lib/view/behavior/index.js.map +1 -0
  176. package/lib/view/behavior/snapline.d.ts +3 -0
  177. package/lib/{tool → view/behavior}/snapline.js +0 -1
  178. package/lib/view/behavior/snapline.js.map +1 -0
  179. package/lib/view/edge/AdjustPoint.js +9 -20
  180. package/lib/view/edge/AdjustPoint.js.map +1 -1
  181. package/lib/view/edge/BaseEdge.js +24 -16
  182. package/lib/view/edge/BaseEdge.js.map +1 -1
  183. package/lib/view/node/BaseNode.js +13 -8
  184. package/lib/view/node/BaseNode.js.map +1 -1
  185. package/lib/view/node/HtmlNode.js +2 -2
  186. package/lib/view/node/HtmlNode.js.map +1 -1
  187. package/lib/view/overlay/CanvasOverlay.js +1 -0
  188. package/lib/view/overlay/CanvasOverlay.js.map +1 -1
  189. package/lib/view/overlay/ToolOverlay.d.ts +1 -1
  190. package/lib/view/overlay/ToolOverlay.js +1 -1
  191. package/lib/view/overlay/ToolOverlay.js.map +1 -1
  192. package/lib/view/text/BaseText.js +6 -2
  193. package/lib/view/text/BaseText.js.map +1 -1
  194. package/package.json +1 -1
  195. package/src/LogicFlow.tsx +52 -14
  196. package/src/algorithm/edge.ts +1 -0
  197. package/src/algorithm/index.ts +2 -0
  198. package/src/algorithm/outline.ts +2 -2
  199. package/src/common/drag.ts +16 -2
  200. package/src/constant/index.ts +42 -1
  201. package/src/event/eventArgs.ts +155 -34
  202. package/src/index.ts +4 -0
  203. package/src/keyboard/shortcut.ts +12 -8
  204. package/src/model/BaseModel.ts +15 -17
  205. package/src/model/EditConfigModel.ts +206 -94
  206. package/src/model/GraphModel.ts +43 -8
  207. package/src/model/TransformModel.ts +1 -1
  208. package/src/model/edge/BaseEdgeModel.ts +27 -18
  209. package/src/model/edge/BezierEdgeModel.ts +5 -6
  210. package/src/model/edge/PolylineEdgeModel.ts +22 -18
  211. package/src/model/node/BaseNodeModel.ts +19 -13
  212. package/src/model/node/CircleNodeModel.ts +0 -1
  213. package/src/model/node/DiamondNodeModel.ts +0 -1
  214. package/src/model/node/EllipseNodeModel.ts +0 -1
  215. package/src/options.ts +6 -1
  216. package/src/tool/MultipleSelectTool.tsx +6 -6
  217. package/src/tool/TextEditTool.tsx +3 -3
  218. package/src/tool/index.ts +96 -2
  219. package/src/util/drag.ts +22 -6
  220. package/src/util/edge.ts +14 -13
  221. package/src/util/node.ts +3 -5
  222. package/src/view/Anchor.tsx +3 -1
  223. package/src/view/Control.tsx +16 -7
  224. package/src/view/Graph.tsx +1 -1
  225. package/src/view/Rotate.tsx +2 -1
  226. package/src/view/behavior/index.ts +2 -0
  227. package/src/{tool → view/behavior}/snapline.ts +3 -4
  228. package/src/view/edge/AdjustPoint.tsx +32 -46
  229. package/src/view/edge/BaseEdge.tsx +58 -38
  230. package/src/view/node/BaseNode.tsx +24 -10
  231. package/src/view/node/HtmlNode.tsx +2 -2
  232. package/src/view/overlay/CanvasOverlay.tsx +1 -0
  233. package/src/view/overlay/ToolOverlay.tsx +1 -1
  234. package/src/view/text/BaseText.tsx +11 -3
  235. package/tsconfig.json +1 -1
  236. package/es/tool/snapline.d.ts +0 -3
  237. package/es/tool/snapline.js.map +0 -1
  238. package/es/tool/tool.d.ts +0 -22
  239. package/es/tool/tool.js +0 -43
  240. package/es/tool/tool.js.map +0 -1
  241. package/lib/tool/snapline.d.ts +0 -3
  242. package/lib/tool/snapline.js.map +0 -1
  243. package/lib/tool/tool.d.ts +0 -22
  244. package/lib/tool/tool.js +0 -49
  245. package/lib/tool/tool.js.map +0 -1
  246. package/src/tool/tool.ts +0 -66
@@ -1,5 +1,5 @@
1
1
  import { assign, cloneDeep, find, isUndefined } from 'lodash-es'
2
- import { action, computed, observable, toJS } from 'mobx'
2
+ import { action, computed, isObservable, observable, toJS } from 'mobx'
3
3
  import { BaseNodeModel, GraphModel, Model } from '..'
4
4
  import LogicFlow from '../../LogicFlow'
5
5
  import {
@@ -15,6 +15,7 @@ import {
15
15
  ElementType,
16
16
  ModelType,
17
17
  OverlapMode,
18
+ TextMode,
18
19
  } from '../../constant'
19
20
 
20
21
  import Point = LogicFlow.Point
@@ -57,6 +58,7 @@ export class BaseEdgeModel implements IBaseEdgeModel {
57
58
  @observable startPoint!: Point
58
59
  @observable endPoint!: Point
59
60
 
61
+ @observable textMode = TextMode.TEXT
60
62
  @observable text: Required<TextConfig> = {
61
63
  value: '',
62
64
  x: 0,
@@ -84,7 +86,6 @@ export class BaseEdgeModel implements IBaseEdgeModel {
84
86
  graphModel: GraphModel
85
87
  @observable zIndex: number = 0
86
88
  @observable state = ElementState.DEFAULT
87
-
88
89
  modelType = ModelType.EDGE
89
90
  additionStateData?: Model.AdditionStateDataType
90
91
 
@@ -183,7 +184,6 @@ export class BaseEdgeModel implements IBaseEdgeModel {
183
184
  ...this.graphModel.theme.edgeAdjust,
184
185
  }
185
186
  }
186
-
187
187
  /**
188
188
  * 自定义边文本样式
189
189
  *
@@ -374,16 +374,23 @@ export class BaseEdgeModel implements IBaseEdgeModel {
374
374
  * @overridable 支持重写
375
375
  */
376
376
  getData(): EdgeData {
377
- const { x, y, value } = this.text
377
+ let { properties } = this
378
+ if (isObservable(properties)) {
379
+ properties = toJS(properties)
380
+ }
378
381
  const data: EdgeData = {
379
382
  id: this.id,
380
383
  type: this.type,
384
+ properties,
381
385
  sourceNodeId: this.sourceNode.id,
382
386
  targetNodeId: this.targetNode.id,
383
387
  startPoint: assign({}, this.startPoint),
384
388
  endPoint: assign({}, this.endPoint),
385
- properties: toJS(this.properties),
386
389
  }
390
+ if (this.graphModel.overlapMode === OverlapMode.INCREASE) {
391
+ data.zIndex = this.zIndex
392
+ }
393
+ const { x, y, value } = this.text
387
394
  if (value) {
388
395
  data.text = {
389
396
  x,
@@ -391,9 +398,6 @@ export class BaseEdgeModel implements IBaseEdgeModel {
391
398
  value,
392
399
  }
393
400
  }
394
- if (this.graphModel.overlapMode === OverlapMode.INCREASE) {
395
- data.zIndex = this.zIndex
396
- }
397
401
  return data
398
402
  }
399
403
 
@@ -493,6 +497,14 @@ export class BaseEdgeModel implements IBaseEdgeModel {
493
497
  }
494
498
  }
495
499
 
500
+ /**
501
+ * 设置当前元素的文本模式
502
+ * @param mode
503
+ */
504
+ @action setTextMode(mode: TextMode) {
505
+ this.textMode = mode
506
+ }
507
+
496
508
  /**
497
509
  * 内部方法,处理初始化文本格式
498
510
  */
@@ -530,7 +542,6 @@ export class BaseEdgeModel implements IBaseEdgeModel {
530
542
  }
531
543
  this.text = textConfig
532
544
  }
533
-
534
545
  /**
535
546
  * 重置文本位置
536
547
  */
@@ -544,15 +555,13 @@ export class BaseEdgeModel implements IBaseEdgeModel {
544
555
  * 移动边上的文本
545
556
  */
546
557
  @action moveText(deltaX: number, deltaY: number): void {
547
- if (this.text) {
548
- const { x, y, value, draggable, editable } = this.text
549
- this.text = {
550
- value,
551
- draggable,
552
- x: x + deltaX,
553
- y: y + deltaY,
554
- editable,
555
- }
558
+ const { x, y, value, draggable, editable } = this.text
559
+ this.text = {
560
+ value,
561
+ editable,
562
+ draggable,
563
+ x: x + deltaX,
564
+ y: y + deltaY,
556
565
  }
557
566
  }
558
567
 
@@ -1,11 +1,11 @@
1
- import { cloneDeep } from 'lodash-es'
1
+ import { assign, cloneDeep } from 'lodash-es'
2
2
  import { action, observable } from 'mobx'
3
3
  import BaseEdgeModel from './BaseEdgeModel'
4
4
  import { BaseNodeModel } from '../node'
5
5
  import LogicFlow from '../../LogicFlow'
6
+ import GraphModel from '../GraphModel'
6
7
  import { ModelType } from '../../constant'
7
8
  import { getBezierControlPoints, IBezierControls } from '../../util'
8
- import GraphModel from '../GraphModel'
9
9
 
10
10
  import Point = LogicFlow.Point
11
11
  import EdgeConfig = LogicFlow.EdgeConfig
@@ -15,14 +15,11 @@ export class BezierEdgeModel extends BaseEdgeModel {
15
15
 
16
16
  offset!: number
17
17
  @observable path = ''
18
-
19
18
  constructor(data: EdgeConfig, graphModel: GraphModel) {
20
19
  super(data, graphModel)
21
-
22
20
  this.initEdgeData(data)
23
21
  this.setAttributes()
24
22
  }
25
-
26
23
  initEdgeData(data: EdgeConfig): void {
27
24
  this.offset = 100
28
25
  super.initEdgeData(data)
@@ -155,7 +152,9 @@ export class BezierEdgeModel extends BaseEdgeModel {
155
152
  this.pointsList[2] = anchor
156
153
  }
157
154
  this.path = this.getPath(this.pointsList)
158
- this.setText(Object.assign({}, this.text, this.textPosition))
155
+ if (this.text?.value) {
156
+ this.setText(assign({}, this.text, this.textPosition))
157
+ }
159
158
  }
160
159
  // 获取边调整的起点
161
160
  @action
@@ -1,4 +1,4 @@
1
- import { cloneDeep } from 'lodash-es'
1
+ import { assign, cloneDeep } from 'lodash-es'
2
2
  import { observable, action } from 'mobx'
3
3
  import { BaseEdgeModel } from '.'
4
4
  import { BaseNodeModel, RectNodeModel, CircleNodeModel, Model } from '..'
@@ -25,7 +25,7 @@ import {
25
25
  import Point = LogicFlow.Point
26
26
  import Position = LogicFlow.Position
27
27
  import AppendConfig = LogicFlow.AppendConfig
28
- import ArchorConfig = Model.AnchorConfig
28
+ import AnchorConfig = Model.AnchorConfig
29
29
 
30
30
  export class PolylineEdgeModel extends BaseEdgeModel {
31
31
  modelType = ModelType.POLYLINE_EDGE
@@ -48,15 +48,13 @@ export class PolylineEdgeModel extends BaseEdgeModel {
48
48
  }
49
49
 
50
50
  getTextPosition() {
51
- // 在文案为空的情况下,文案位置为双击位置
51
+ // 在文本为空的情况下,文本位置为双击位置
52
52
  const textValue = this.text?.value
53
53
  if (this.dbClickPosition && !textValue) {
54
54
  const { x, y } = this.dbClickPosition
55
- return {
56
- x,
57
- y,
58
- }
55
+ return { x, y }
59
56
  }
57
+ // 文本不为空或者没有双击位置时,取最长边的中点作为文本位置
60
58
  const currentPositionList = points2PointsList(this.points)
61
59
  const [p1, p2] = getLongestEdge(currentPositionList)
62
60
  return {
@@ -69,9 +67,9 @@ export class PolylineEdgeModel extends BaseEdgeModel {
69
67
  getAfterAnchor(
70
68
  direction: SegmentDirection,
71
69
  position: Position,
72
- anchorList: ArchorConfig[],
70
+ anchorList: AnchorConfig[],
73
71
  ) {
74
- let anchor: ArchorConfig
72
+ let anchor: AnchorConfig
75
73
  let minDistance: number
76
74
  anchorList.forEach((item) => {
77
75
  let distanceX: number
@@ -186,7 +184,7 @@ export class PolylineEdgeModel extends BaseEdgeModel {
186
184
  direction: SegmentDirection,
187
185
  positionType: string,
188
186
  position: Position,
189
- anchorList: ArchorConfig[],
187
+ anchorList: AnchorConfig[],
190
188
  draggingPointList: Point[],
191
189
  ) {
192
190
  const pointList = draggingPointList.map((i) => i)
@@ -438,10 +436,13 @@ export class PolylineEdgeModel extends BaseEdgeModel {
438
436
  }
439
437
  this.updatePointsAfterDrag(draggingPointList)
440
438
  this.draggingPointList = draggingPointList
441
- this.setText(Object.assign({}, this.text, this.textPosition))
439
+ // TODO: 判断该逻辑是否需要
440
+ if (this.text?.value) {
441
+ this.setText(assign({}, this.text, this.textPosition))
442
+ }
442
443
  return {
443
- start: Object.assign({}, pointsList[startIndex]),
444
- end: Object.assign({}, pointsList[endIndex]),
444
+ start: assign({}, pointsList[startIndex]),
445
+ end: assign({}, pointsList[endIndex]),
445
446
  startIndex,
446
447
  endIndex,
447
448
  direction,
@@ -571,10 +572,13 @@ export class PolylineEdgeModel extends BaseEdgeModel {
571
572
  this.updatePointsAfterDrag(draggingPointList)
572
573
  this.draggingPointList = draggingPointList
573
574
  }
574
- this.setText(Object.assign({}, this.text, this.textPosition))
575
+ // TODO: 确认该判断逻辑是否需要
576
+ if (this.text?.value) {
577
+ this.setText(assign({}, this.text, this.textPosition))
578
+ }
575
579
  return {
576
- start: Object.assign({}, pointsList[startIndex]),
577
- end: Object.assign({}, pointsList[endIndex]),
580
+ start: assign({}, pointsList[startIndex]),
581
+ end: assign({}, pointsList[endIndex]),
578
582
  startIndex,
579
583
  endIndex,
580
584
  direction,
@@ -591,9 +595,9 @@ export class PolylineEdgeModel extends BaseEdgeModel {
591
595
  this.draggingPointList = []
592
596
  // 更新起终点
593
597
  const startPoint = pointsList[0]
594
- this.startPoint = Object.assign({}, startPoint)
598
+ this.startPoint = assign({}, startPoint)
595
599
  const endPoint = pointsList[pointsList.length - 1]
596
- this.endPoint = Object.assign({}, endPoint)
600
+ this.endPoint = assign({}, endPoint)
597
601
  }
598
602
  this.isDragging = false
599
603
  }
@@ -1,5 +1,5 @@
1
1
  import { action, computed, isObservable, observable, toJS } from 'mobx'
2
- import { assign, cloneDeep, has, isNil, isUndefined, mapKeys } from 'lodash-es'
2
+ import { assign, cloneDeep, has, isNil, mapKeys, isUndefined } from 'lodash-es'
3
3
  import { GraphModel, Model } from '..'
4
4
  import LogicFlow from '../../LogicFlow'
5
5
  import {
@@ -17,6 +17,7 @@ import {
17
17
  EventType,
18
18
  ModelType,
19
19
  OverlapMode,
20
+ TextMode,
20
21
  } from '../../constant'
21
22
  import { ResizeControl } from '../../view/Control'
22
23
  import AnchorConfig = Model.AnchorConfig
@@ -41,7 +42,6 @@ export interface IBaseNodeModel extends Model.BaseModel {
41
42
  isShowAnchor: boolean
42
43
  getNodeStyle: () => CommonTheme
43
44
  getTextStyle: () => LogicFlow.TextNodeTheme
44
-
45
45
  setIsShowAnchor: (isShowAnchor: boolean) => void
46
46
  }
47
47
 
@@ -54,6 +54,7 @@ export class BaseNodeModel implements IBaseNodeModel {
54
54
  @observable readonly type = ''
55
55
  @observable x = 0
56
56
  @observable y = 0
57
+ @observable textMode = TextMode.TEXT
57
58
  @observable text: TextConfig = {
58
59
  value: '',
59
60
  x: 0,
@@ -188,6 +189,7 @@ export class BaseNodeModel implements IBaseNodeModel {
188
189
  this.formatText(data)
189
190
  // 在下面又将 NodeConfig 中的数据赋值给了 this,应该会触发 setAttributes,确认是否符合预期
190
191
  assign(this, pickNodeConfig(data)) // TODO: 确认 constructor 中赋值 properties 是否必要
192
+
191
193
  const { overlapMode } = this.graphModel
192
194
  if (overlapMode === OverlapMode.INCREASE) {
193
195
  this.zIndex = data.zIndex || getZIndex()
@@ -216,6 +218,14 @@ export class BaseNodeModel implements IBaseNodeModel {
216
218
  return null
217
219
  }
218
220
 
221
+ /**
222
+ * 设置当前元素的文本模式
223
+ * @param mode
224
+ */
225
+ @action setTextMode(mode: TextMode) {
226
+ this.textMode = mode
227
+ }
228
+
219
229
  /**
220
230
  * 始化文本属性
221
231
  */
@@ -265,7 +275,6 @@ export class BaseNodeModel implements IBaseNodeModel {
265
275
  width,
266
276
  height,
267
277
  })
268
-
269
278
  return this.getData()
270
279
  }
271
280
 
@@ -584,10 +593,10 @@ export class BaseNodeModel implements IBaseNodeModel {
584
593
  */
585
594
  public getBounds(): Model.BoxBoundsPoint {
586
595
  return {
587
- x1: this.x - this.width / 2,
588
- y1: this.y - this.height / 2,
589
- x2: this.x + this.width / 2,
590
- y2: this.y + this.height / 2,
596
+ minX: this.x - this.width / 2,
597
+ minY: this.y - this.height / 2,
598
+ maxX: this.x + this.width / 2,
599
+ maxY: this.y + this.height / 2,
591
600
  }
592
601
  }
593
602
 
@@ -691,12 +700,9 @@ export class BaseNodeModel implements IBaseNodeModel {
691
700
  @action moveTo(x: number, y: number, isIgnoreRule = false): boolean {
692
701
  const deltaX = x - this.x
693
702
  const deltaY = y - this.y
694
- if (!isIgnoreRule && !this.isAllowMoveNode(deltaX, deltaY)) {
695
- return false
696
- }
697
- if (this.text) {
698
- this.text && this.moveText(deltaX, deltaY)
699
- }
703
+ if (!isIgnoreRule && !this.isAllowMoveNode(deltaX, deltaY)) return false
704
+
705
+ this.text && this.moveText(deltaX, deltaY)
700
706
  this.x = x
701
707
  this.y = y
702
708
  return true
@@ -81,7 +81,6 @@ export class CircleNodeModel extends BaseNodeModel {
81
81
  this.setProperties({
82
82
  r: width,
83
83
  })
84
-
85
84
  return this.getData()
86
85
  }
87
86
  }
@@ -122,7 +122,6 @@ export class DiamondNodeModel extends BaseNodeModel {
122
122
  rx: width,
123
123
  ry: height,
124
124
  })
125
-
126
125
  return this.getData()
127
126
  }
128
127
  }
@@ -88,7 +88,6 @@ export class EllipseNodeModel extends BaseNodeModel {
88
88
  rx: width,
89
89
  ry: height,
90
90
  })
91
-
92
91
  return this.getData()
93
92
  }
94
93
  }
package/src/options.ts CHANGED
@@ -2,7 +2,7 @@ import { assign } from 'lodash-es'
2
2
  import { createElement as h } from 'preact/compat'
3
3
  import LogicFlow from './LogicFlow'
4
4
  import { KeyboardDef } from './keyboard'
5
- import { OverlapMode } from './constant'
5
+ import { OverlapMode, TextMode } from './constant'
6
6
  import { Grid } from './view/overlay'
7
7
 
8
8
  import GridOptions = Grid.GridOptions
@@ -68,6 +68,11 @@ export namespace Options {
68
68
  edgeType?: EdgeType
69
69
  adjustEdge?: boolean
70
70
 
71
+ // 元素文本类型:text or label
72
+ textMode?: TextMode
73
+ edgeTextMode?: TextMode
74
+ nodeTextMode?: TextMode
75
+
71
76
  allowRotate?: boolean // 允许节点旋转
72
77
  allowResize?: boolean // 是否允许缩放
73
78
 
@@ -1,16 +1,16 @@
1
1
  import { Component } from 'preact/compat'
2
+ import { IToolProps } from '.'
2
3
  import { Model, observer } from '..'
3
4
  import LogicFlow from '../LogicFlow'
4
5
  import { StepDrag, IDragParams } from '../util'
5
6
  import { ElementType, EventType } from '../constant'
6
7
  import { getNodeOutline, getEdgeOutline } from '../algorithm/outline'
7
- import { IToolProps } from './tool'
8
8
 
9
9
  import GraphData = LogicFlow.GraphData
10
10
 
11
11
  @observer
12
12
  export default class MultipleSelect extends Component<IToolProps> {
13
- static toolName = 'multipleSelect'
13
+ static toolName = 'multiple-select-tool'
14
14
  stepDrag: StepDrag
15
15
 
16
16
  constructor(props: IToolProps) {
@@ -40,13 +40,13 @@ export default class MultipleSelect extends Component<IToolProps> {
40
40
  clientY,
41
41
  ctrlKey,
42
42
  })
43
- this.props.logicFlow.container
43
+ this.props.lf.container
44
44
  ?.querySelector('.lf-canvas-overlay[name="canvas-overlay"]')
45
45
  ?.dispatchEvent(newEvent)
46
46
  }
47
47
  onDragging = ({ deltaX, deltaY }: IDragParams) => {
48
- const { graphModel, logicFlow } = this.props
49
- const { SCALE_X, SCALE_Y } = logicFlow.getTransform()
48
+ const { graphModel, lf } = this.props
49
+ const { SCALE_X, SCALE_Y } = lf.getTransform()
50
50
  const selectElements = graphModel.getSelectElements(true)
51
51
  graphModel.moveNodes(
52
52
  selectElements.nodes.map((node) => node.id),
@@ -88,7 +88,7 @@ export default class MultipleSelect extends Component<IToolProps> {
88
88
  const {
89
89
  graphModel: { selectElements, transformModel },
90
90
  } = this.props
91
- const { SCALE_X, SCALE_Y } = this.props.logicFlow.getTransform()
91
+ const { SCALE_X, SCALE_Y } = this.props.lf.getTransform()
92
92
  if (selectElements.size <= 1) return
93
93
  let x = Number.MAX_SAFE_INTEGER
94
94
  let y = Number.MAX_SAFE_INTEGER
@@ -1,7 +1,7 @@
1
- import { createRef, Component } from 'preact'
1
+ import { createRef, Component } from 'preact/compat'
2
+ import { IToolProps } from '.'
2
3
  import { ElementState, observer } from '..'
3
4
  import { ElementType, EventType, ModelType } from '../constant'
4
- import { IToolProps } from './tool'
5
5
 
6
6
  type IState = {
7
7
  style: {
@@ -12,7 +12,7 @@ type IState = {
12
12
 
13
13
  @observer
14
14
  export class TextEditTool extends Component<IToolProps, IState> {
15
- static toolName = 'textEdit'
15
+ static toolName = 'text-edit-tool'
16
16
  ref = createRef()
17
17
  __prevText = {
18
18
  type: '',
package/src/tool/index.ts CHANGED
@@ -1,2 +1,96 @@
1
- export * from './tool'
2
- export * from './snapline'
1
+ import { Component, ReactElement } from 'preact/compat'
2
+ import { action, observable } from 'mobx'
3
+ import { forEach } from 'lodash-es'
4
+ import TextEdit from './TextEditTool'
5
+ import MultipleSelect from './MultipleSelectTool'
6
+ import LogicFlow from '../LogicFlow'
7
+ import { ElementState, EventType } from '../constant'
8
+ import { GraphModel, BaseEdgeModel, BaseNodeModel } from '../model'
9
+
10
+ export type IToolProps = {
11
+ lf: LogicFlow
12
+ graphModel: GraphModel
13
+ textEditElement?: BaseNodeModel | BaseEdgeModel
14
+ }
15
+
16
+ type ToolConstructor = new (props: IToolProps) => Component<IToolProps>
17
+
18
+ // 默认内置的工具
19
+ const defaultTools = [TextEdit, MultipleSelect]
20
+
21
+ export class Tool {
22
+ tools?: Component[]
23
+ components?: ReactElement<IToolProps>[]
24
+ @observable toolMap = new Map<string, ToolConstructor>()
25
+
26
+ disabledToolMap = new Map<string, ToolConstructor>()
27
+ instance: LogicFlow
28
+
29
+ constructor(instance: LogicFlow) {
30
+ this.instance = instance
31
+ forEach(defaultTools, (tool) => {
32
+ if (!this.isDisabled(tool.toolName)) {
33
+ this.registerTool(tool.toolName, tool)
34
+ }
35
+ })
36
+
37
+ // @see https://github.com/didi/LogicFlow/issues/152
38
+ const { graphModel } = instance
39
+ const { eventCenter } = graphModel
40
+ eventCenter.on(
41
+ `${EventType.GRAPH_TRANSFORM},${EventType.NODE_CLICK},${EventType.BLANK_CLICK} `,
42
+ () => {
43
+ const {
44
+ textEditElement,
45
+ editConfigModel: { edgeTextEdit, nodeTextEdit },
46
+ } = graphModel
47
+ // fix #826, 保留之前的文本可以编辑点击空白才设置为不可编辑。如果以后有其他需求再改。
48
+ if ((edgeTextEdit || nodeTextEdit) && textEditElement) {
49
+ graphModel.textEditElement?.setElementState(ElementState.DEFAULT)
50
+ }
51
+ },
52
+ )
53
+ }
54
+
55
+ private isDisabled(toolName) {
56
+ return this.instance.options.disabledTools?.indexOf(toolName) !== -1
57
+ }
58
+
59
+ // 注册工具
60
+ registerTool(name: string, component: ToolConstructor) {
61
+ this.toolMap.set(name, component)
62
+ }
63
+
64
+ // 禁用工具
65
+ @action
66
+ disableTool(name: string): boolean | Error {
67
+ const tool = this.toolMap.get(name)
68
+ if (tool) {
69
+ this.disabledToolMap.set(name, tool)
70
+ this.toolMap.delete(name)
71
+ return true
72
+ }
73
+ throw new Error('禁用失败,不存在名为 ${tool} 的工具')
74
+ }
75
+
76
+ @action
77
+ enableTool(name: string): boolean | Error {
78
+ const tool = this.disabledToolMap.get(name)
79
+ if (tool) {
80
+ this.toolMap.set(name, tool)
81
+ this.disabledToolMap.delete(name)
82
+ return true
83
+ }
84
+ throw new Error('不存在名为 ${tool} 的工具')
85
+ }
86
+
87
+ getTools() {
88
+ return Array.from(this.toolMap.values())
89
+ }
90
+
91
+ getInstance() {
92
+ return this.instance
93
+ }
94
+ }
95
+
96
+ export default Tool
package/src/util/drag.ts CHANGED
@@ -10,7 +10,7 @@ const LEFT_MOUSE_BUTTON_CODE = 0
10
10
  export type IDragParams = {
11
11
  deltaX: number
12
12
  deltaY: number
13
- event: MouseEvent | null
13
+ event?: MouseEvent
14
14
  [key: string]: unknown
15
15
  }
16
16
 
@@ -23,9 +23,16 @@ export type ICreateDragParams = {
23
23
  }
24
24
 
25
25
  export type IStepperDragProps = {
26
- eventType?: 'NODE' | 'BLANK' | 'SELECTION' | 'ADJUST_POINT' | ''
26
+ eventType?:
27
+ | 'NODE'
28
+ | 'BLANK'
29
+ | 'SELECTION'
30
+ | 'ADJUST_POINT'
31
+ | 'TEXT'
32
+ | 'LABEL'
33
+ | ''
27
34
  eventCenter?: EventEmitter
28
- model?: Model.BaseModel | null
35
+ model?: Model.BaseModel | unknown
29
36
  data?: Record<string, unknown>
30
37
  [key: string]: unknown
31
38
  } & Partial<ICreateDragParams>
@@ -39,9 +46,16 @@ export class StepDrag {
39
46
 
40
47
  step: number
41
48
  isStopPropagation: boolean
42
- eventType: 'NODE' | 'BLANK' | 'SELECTION' | 'ADJUST_POINT' | ''
49
+ eventType:
50
+ | 'NODE'
51
+ | 'BLANK'
52
+ | 'SELECTION'
53
+ | 'ADJUST_POINT'
54
+ | 'TEXT'
55
+ | 'LABEL'
56
+ | ''
43
57
  eventCenter?: EventEmitter
44
- model?: Model.BaseModel | null
58
+ model?: Model.BaseModel | any // TODO: 如何兼容 LabelModel 类型。 LabelModel 能否是 BaseModel 的实现呢?
45
59
  data?: Record<string, unknown>
46
60
 
47
61
  // 运行时
@@ -141,6 +155,8 @@ export class StepDrag {
141
155
  event: e,
142
156
  })
143
157
  this.eventCenter?.emit(EventType[`${this.eventType}_MOUSEMOVE`], {
158
+ deltaX,
159
+ deltaY,
144
160
  e,
145
161
  data: this.data || elementData,
146
162
  })
@@ -180,7 +196,7 @@ export class StepDrag {
180
196
 
181
197
  DOC.removeEventListener('mousemove', this.handleMouseMove, false)
182
198
  DOC.removeEventListener('mouseup', this.handleMouseUp, false)
183
- this.onDragEnd({ event: null })
199
+ this.onDragEnd({ event: undefined })
184
200
  this.isDragging = false
185
201
  }
186
202
  }