@logicflow/core 2.0.0-beta.5 → 2.0.0-beta.7

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 (251) hide show
  1. package/.turbo/turbo-build$colon$dev.log +10 -10
  2. package/.turbo/turbo-build.log +36 -36
  3. package/dist/index.min.js +4 -4
  4. package/es/LogicFlow.d.ts +32 -6
  5. package/es/LogicFlow.js +15 -12
  6. package/es/LogicFlow.js.map +1 -1
  7. package/es/algorithm/edge.js.map +1 -1
  8. package/es/algorithm/index.d.ts +2 -0
  9. package/es/algorithm/index.js +2 -0
  10. package/es/algorithm/index.js.map +1 -1
  11. package/es/algorithm/outline.d.ts +1 -1
  12. package/es/common/drag.d.ts +2 -2
  13. package/es/common/drag.js.map +1 -1
  14. package/es/constant/index.d.ts +37 -1
  15. package/es/constant/index.js +40 -1
  16. package/es/constant/index.js.map +1 -1
  17. package/es/event/eventArgs.d.ts +88 -25
  18. package/es/index.d.ts +4 -0
  19. package/es/index.js +4 -0
  20. package/es/index.js.map +1 -1
  21. package/es/keyboard/shortcut.d.ts +4 -0
  22. package/es/keyboard/shortcut.js +9 -8
  23. package/es/keyboard/shortcut.js.map +1 -1
  24. package/es/model/BaseModel.d.ts +12 -16
  25. package/es/model/EditConfigModel.d.ts +97 -36
  26. package/es/model/EditConfigModel.js +166 -79
  27. package/es/model/EditConfigModel.js.map +1 -1
  28. package/es/model/GraphModel.d.ts +12 -1
  29. package/es/model/GraphModel.js +40 -9
  30. package/es/model/GraphModel.js.map +1 -1
  31. package/es/model/TransformModel.js +1 -1
  32. package/es/model/TransformModel.js.map +1 -1
  33. package/es/model/edge/BaseEdgeModel.d.ts +9 -3
  34. package/es/model/edge/BaseEdgeModel.js +33 -17
  35. package/es/model/edge/BaseEdgeModel.js.map +1 -1
  36. package/es/model/edge/BezierEdgeModel.d.ts +1 -1
  37. package/es/model/edge/BezierEdgeModel.js +5 -2
  38. package/es/model/edge/BezierEdgeModel.js.map +1 -1
  39. package/es/model/edge/PolylineEdgeModel.d.ts +3 -3
  40. package/es/model/edge/PolylineEdgeModel.js +20 -14
  41. package/es/model/edge/PolylineEdgeModel.js.map +1 -1
  42. package/es/model/node/BaseNodeModel.d.ts +28 -2
  43. package/es/model/node/BaseNodeModel.js +24 -12
  44. package/es/model/node/BaseNodeModel.js.map +1 -1
  45. package/es/model/node/CircleNodeModel.js.map +1 -1
  46. package/es/model/node/DiamondNodeModel.js.map +1 -1
  47. package/es/model/node/EllipseNodeModel.js.map +1 -1
  48. package/es/model/node/RectNodeModel.js.map +1 -1
  49. package/es/model/node/TextNodeModel.js +2 -1
  50. package/es/model/node/TextNodeModel.js.map +1 -1
  51. package/es/options.d.ts +4 -1
  52. package/es/options.js.map +1 -1
  53. package/es/tool/MultipleSelectTool.d.ts +1 -1
  54. package/es/tool/MultipleSelectTool.js +5 -5
  55. package/es/tool/MultipleSelectTool.js.map +1 -1
  56. package/es/tool/TextEditTool.d.ts +3 -3
  57. package/es/tool/TextEditTool.js +2 -2
  58. package/es/tool/TextEditTool.js.map +1 -1
  59. package/es/tool/index.d.ts +24 -2
  60. package/es/tool/index.js +82 -2
  61. package/es/tool/index.js.map +1 -1
  62. package/es/util/drag.d.ts +5 -5
  63. package/es/util/drag.js +3 -1
  64. package/es/util/drag.js.map +1 -1
  65. package/es/util/edge.d.ts +2 -1
  66. package/es/util/edge.js +9 -12
  67. package/es/util/edge.js.map +1 -1
  68. package/es/util/node.d.ts +2 -5
  69. package/es/util/node.js +1 -0
  70. package/es/util/node.js.map +1 -1
  71. package/es/view/Anchor.d.ts +1 -3
  72. package/es/view/Anchor.js +3 -0
  73. package/es/view/Anchor.js.map +1 -1
  74. package/es/view/Control.d.ts +1 -1
  75. package/es/view/Control.js +7 -7
  76. package/es/view/Control.js.map +1 -1
  77. package/es/view/Graph.d.ts +1 -1
  78. package/es/view/Rotate.js +2 -1
  79. package/es/view/Rotate.js.map +1 -1
  80. package/es/view/behavior/index.d.ts +2 -0
  81. package/es/view/behavior/index.js +3 -0
  82. package/es/view/behavior/index.js.map +1 -0
  83. package/es/view/behavior/snapline.d.ts +3 -0
  84. package/es/{tool → view/behavior}/snapline.js +0 -1
  85. package/es/view/behavior/snapline.js.map +1 -0
  86. package/es/view/edge/AdjustPoint.js +9 -20
  87. package/es/view/edge/AdjustPoint.js.map +1 -1
  88. package/es/view/edge/BaseEdge.js +25 -17
  89. package/es/view/edge/BaseEdge.js.map +1 -1
  90. package/es/view/node/BaseNode.js +14 -9
  91. package/es/view/node/BaseNode.js.map +1 -1
  92. package/es/view/node/HtmlNode.js +2 -2
  93. package/es/view/node/HtmlNode.js.map +1 -1
  94. package/es/view/overlay/CanvasOverlay.js +5 -4
  95. package/es/view/overlay/CanvasOverlay.js.map +1 -1
  96. package/es/view/overlay/ToolOverlay.d.ts +1 -1
  97. package/es/view/overlay/ToolOverlay.js +1 -1
  98. package/es/view/overlay/ToolOverlay.js.map +1 -1
  99. package/es/view/text/BaseText.js +7 -3
  100. package/es/view/text/BaseText.js.map +1 -1
  101. package/lib/LogicFlow.d.ts +32 -6
  102. package/lib/LogicFlow.js +17 -14
  103. package/lib/LogicFlow.js.map +1 -1
  104. package/lib/algorithm/edge.js.map +1 -1
  105. package/lib/algorithm/index.d.ts +2 -0
  106. package/lib/algorithm/index.js +17 -1
  107. package/lib/algorithm/index.js.map +1 -1
  108. package/lib/algorithm/outline.d.ts +1 -1
  109. package/lib/common/drag.d.ts +2 -2
  110. package/lib/common/drag.js.map +1 -1
  111. package/lib/constant/index.d.ts +37 -1
  112. package/lib/constant/index.js +41 -2
  113. package/lib/constant/index.js.map +1 -1
  114. package/lib/event/eventArgs.d.ts +88 -25
  115. package/lib/index.d.ts +4 -0
  116. package/lib/index.js +4 -0
  117. package/lib/index.js.map +1 -1
  118. package/lib/keyboard/shortcut.d.ts +4 -0
  119. package/lib/keyboard/shortcut.js +12 -9
  120. package/lib/keyboard/shortcut.js.map +1 -1
  121. package/lib/model/BaseModel.d.ts +12 -16
  122. package/lib/model/EditConfigModel.d.ts +97 -36
  123. package/lib/model/EditConfigModel.js +165 -78
  124. package/lib/model/EditConfigModel.js.map +1 -1
  125. package/lib/model/GraphModel.d.ts +12 -1
  126. package/lib/model/GraphModel.js +38 -7
  127. package/lib/model/GraphModel.js.map +1 -1
  128. package/lib/model/TransformModel.js +1 -1
  129. package/lib/model/TransformModel.js.map +1 -1
  130. package/lib/model/edge/BaseEdgeModel.d.ts +9 -3
  131. package/lib/model/edge/BaseEdgeModel.js +31 -15
  132. package/lib/model/edge/BaseEdgeModel.js.map +1 -1
  133. package/lib/model/edge/BezierEdgeModel.d.ts +1 -1
  134. package/lib/model/edge/BezierEdgeModel.js +4 -1
  135. package/lib/model/edge/BezierEdgeModel.js.map +1 -1
  136. package/lib/model/edge/PolylineEdgeModel.d.ts +3 -3
  137. package/lib/model/edge/PolylineEdgeModel.js +19 -13
  138. package/lib/model/edge/PolylineEdgeModel.js.map +1 -1
  139. package/lib/model/node/BaseNodeModel.d.ts +28 -2
  140. package/lib/model/node/BaseNodeModel.js +22 -10
  141. package/lib/model/node/BaseNodeModel.js.map +1 -1
  142. package/lib/model/node/CircleNodeModel.js.map +1 -1
  143. package/lib/model/node/DiamondNodeModel.js.map +1 -1
  144. package/lib/model/node/EllipseNodeModel.js.map +1 -1
  145. package/lib/model/node/RectNodeModel.js.map +1 -1
  146. package/lib/model/node/TextNodeModel.js +2 -1
  147. package/lib/model/node/TextNodeModel.js.map +1 -1
  148. package/lib/options.d.ts +4 -1
  149. package/lib/options.js.map +1 -1
  150. package/lib/tool/MultipleSelectTool.d.ts +1 -1
  151. package/lib/tool/MultipleSelectTool.js +5 -5
  152. package/lib/tool/MultipleSelectTool.js.map +1 -1
  153. package/lib/tool/TextEditTool.d.ts +3 -3
  154. package/lib/tool/TextEditTool.js +4 -4
  155. package/lib/tool/TextEditTool.js.map +1 -1
  156. package/lib/tool/index.d.ts +24 -2
  157. package/lib/tool/index.js +85 -15
  158. package/lib/tool/index.js.map +1 -1
  159. package/lib/util/drag.d.ts +5 -5
  160. package/lib/util/drag.js +3 -1
  161. package/lib/util/drag.js.map +1 -1
  162. package/lib/util/edge.d.ts +2 -1
  163. package/lib/util/edge.js +11 -14
  164. package/lib/util/edge.js.map +1 -1
  165. package/lib/util/node.d.ts +2 -5
  166. package/lib/util/node.js +1 -0
  167. package/lib/util/node.js.map +1 -1
  168. package/lib/view/Anchor.d.ts +1 -3
  169. package/lib/view/Anchor.js +3 -0
  170. package/lib/view/Anchor.js.map +1 -1
  171. package/lib/view/Control.d.ts +1 -1
  172. package/lib/view/Control.js +7 -7
  173. package/lib/view/Control.js.map +1 -1
  174. package/lib/view/Graph.d.ts +1 -1
  175. package/lib/view/Rotate.js +2 -1
  176. package/lib/view/Rotate.js.map +1 -1
  177. package/lib/view/behavior/index.d.ts +2 -0
  178. package/lib/view/behavior/index.js +19 -0
  179. package/lib/view/behavior/index.js.map +1 -0
  180. package/lib/view/behavior/snapline.d.ts +3 -0
  181. package/lib/{tool → view/behavior}/snapline.js +0 -1
  182. package/lib/view/behavior/snapline.js.map +1 -0
  183. package/lib/view/edge/AdjustPoint.js +9 -20
  184. package/lib/view/edge/AdjustPoint.js.map +1 -1
  185. package/lib/view/edge/BaseEdge.js +24 -16
  186. package/lib/view/edge/BaseEdge.js.map +1 -1
  187. package/lib/view/node/BaseNode.js +13 -8
  188. package/lib/view/node/BaseNode.js.map +1 -1
  189. package/lib/view/node/HtmlNode.js +2 -2
  190. package/lib/view/node/HtmlNode.js.map +1 -1
  191. package/lib/view/overlay/CanvasOverlay.js +5 -4
  192. package/lib/view/overlay/CanvasOverlay.js.map +1 -1
  193. package/lib/view/overlay/ToolOverlay.d.ts +1 -1
  194. package/lib/view/overlay/ToolOverlay.js +1 -1
  195. package/lib/view/overlay/ToolOverlay.js.map +1 -1
  196. package/lib/view/text/BaseText.js +6 -2
  197. package/lib/view/text/BaseText.js.map +1 -1
  198. package/package.json +1 -1
  199. package/src/LogicFlow.tsx +52 -14
  200. package/src/algorithm/edge.ts +1 -0
  201. package/src/algorithm/index.ts +2 -0
  202. package/src/algorithm/outline.ts +2 -2
  203. package/src/common/drag.ts +16 -2
  204. package/src/constant/index.ts +42 -1
  205. package/src/event/eventArgs.ts +155 -34
  206. package/src/index.ts +4 -0
  207. package/src/keyboard/shortcut.ts +12 -8
  208. package/src/model/BaseModel.ts +15 -17
  209. package/src/model/EditConfigModel.ts +206 -94
  210. package/src/model/GraphModel.ts +43 -8
  211. package/src/model/TransformModel.ts +1 -1
  212. package/src/model/edge/BaseEdgeModel.ts +28 -19
  213. package/src/model/edge/BezierEdgeModel.ts +5 -6
  214. package/src/model/edge/PolylineEdgeModel.ts +22 -18
  215. package/src/model/node/BaseNodeModel.ts +24 -14
  216. package/src/model/node/CircleNodeModel.ts +0 -1
  217. package/src/model/node/DiamondNodeModel.ts +0 -1
  218. package/src/model/node/EllipseNodeModel.ts +0 -1
  219. package/src/model/node/RectNodeModel.ts +0 -1
  220. package/src/model/node/TextNodeModel.ts +2 -0
  221. package/src/options.ts +6 -1
  222. package/src/tool/MultipleSelectTool.tsx +6 -6
  223. package/src/tool/TextEditTool.tsx +3 -3
  224. package/src/tool/index.ts +96 -2
  225. package/src/util/drag.ts +22 -6
  226. package/src/util/edge.ts +14 -13
  227. package/src/util/node.ts +3 -5
  228. package/src/view/Anchor.tsx +3 -1
  229. package/src/view/Control.tsx +16 -7
  230. package/src/view/Graph.tsx +1 -1
  231. package/src/view/Rotate.tsx +2 -1
  232. package/src/view/behavior/index.ts +2 -0
  233. package/src/{tool → view/behavior}/snapline.ts +3 -4
  234. package/src/view/edge/AdjustPoint.tsx +32 -46
  235. package/src/view/edge/BaseEdge.tsx +58 -38
  236. package/src/view/node/BaseNode.tsx +24 -10
  237. package/src/view/node/HtmlNode.tsx +2 -2
  238. package/src/view/overlay/CanvasOverlay.tsx +5 -4
  239. package/src/view/overlay/ToolOverlay.tsx +1 -1
  240. package/src/view/text/BaseText.tsx +11 -3
  241. package/es/tool/snapline.d.ts +0 -3
  242. package/es/tool/snapline.js.map +0 -1
  243. package/es/tool/tool.d.ts +0 -22
  244. package/es/tool/tool.js +0 -43
  245. package/es/tool/tool.js.map +0 -1
  246. package/lib/tool/snapline.d.ts +0 -3
  247. package/lib/tool/snapline.js.map +0 -1
  248. package/lib/tool/tool.d.ts +0 -22
  249. package/lib/tool/tool.js +0 -49
  250. package/lib/tool/tool.js.map +0 -1
  251. package/src/tool/tool.ts +0 -66
@@ -1,3 +1,4 @@
1
+ import { isEmpty } from 'lodash-es'
1
2
  import LogicFlow from '../LogicFlow'
2
3
  import GraphModel from '../model/GraphModel'
3
4
 
@@ -6,17 +7,19 @@ import EdgeData = LogicFlow.EdgeData
6
7
 
7
8
  let selected: LogicFlow.GraphData | null = null
8
9
 
9
- function translationNodeData(nodeData: NodeData, distance: number) {
10
+ export function translateNodeData(nodeData: NodeData, distance: number) {
10
11
  nodeData.x += distance
11
12
  nodeData.y += distance
12
- if (nodeData.text) {
13
+
14
+ if (!isEmpty(nodeData.text)) {
13
15
  nodeData.text.x += distance
14
16
  nodeData.text.y += distance
15
17
  }
18
+
16
19
  return nodeData
17
20
  }
18
21
 
19
- function translationEdgeData(edgeData: EdgeData, distance: number) {
22
+ export function translateEdgeData(edgeData: EdgeData, distance: number) {
20
23
  if (edgeData.startPoint) {
21
24
  edgeData.startPoint.x += distance
22
25
  edgeData.startPoint.y += distance
@@ -31,7 +34,8 @@ function translationEdgeData(edgeData: EdgeData, distance: number) {
31
34
  point.y += distance
32
35
  })
33
36
  }
34
- if (edgeData.text) {
37
+
38
+ if (!isEmpty(edgeData.text)) {
35
39
  edgeData.text.x += distance
36
40
  edgeData.text.y += distance
37
41
  }
@@ -65,10 +69,10 @@ export function initDefaultShortcut(lf: LogicFlow, graph: GraphModel) {
65
69
  }
66
70
  selected = elements
67
71
  selected.nodes.forEach((node) =>
68
- translationNodeData(node, TRANSLATION_DISTANCE),
72
+ translateNodeData(node, TRANSLATION_DISTANCE),
69
73
  )
70
74
  selected.edges.forEach((edge) =>
71
- translationEdgeData(edge, TRANSLATION_DISTANCE),
75
+ translateEdgeData(edge, TRANSLATION_DISTANCE),
72
76
  )
73
77
  return false
74
78
  })
@@ -86,10 +90,10 @@ export function initDefaultShortcut(lf: LogicFlow, graph: GraphModel) {
86
90
  addElements.nodes.forEach((node) => lf.selectElementById(node.id, true))
87
91
  addElements.edges.forEach((edge) => lf.selectElementById(edge.id, true))
88
92
  selected.nodes.forEach((node) =>
89
- translationNodeData(node, TRANSLATION_DISTANCE),
93
+ translateNodeData(node, TRANSLATION_DISTANCE),
90
94
  )
91
95
  selected.edges.forEach((edge) =>
92
- translationEdgeData(edge, TRANSLATION_DISTANCE),
96
+ translateEdgeData(edge, TRANSLATION_DISTANCE),
93
97
  )
94
98
  CHILDREN_TRANSLATION_DISTANCE =
95
99
  CHILDREN_TRANSLATION_DISTANCE + TRANSLATION_DISTANCE
@@ -63,33 +63,30 @@ export namespace Model {
63
63
  }
64
64
 
65
65
  // 定义边界数据结构,左上坐标 + 右下坐标定位一个矩形
66
+ // TODO: 在使用该类型的 API 中,都要做声明,返回值格式已更新
66
67
  export type BoxBoundsPoint = {
67
- x1: number // Left Top X
68
- y1: number // Left Top Y
69
- x2: number // Right Bottom X
70
- y2: number // Right Bottom Y
68
+ minX: number // Left Top X
69
+ minY: number // Left Top Y
70
+ maxX: number // Right Bottom X
71
+ maxY: number // Right Bottom Y
71
72
  }
72
73
 
73
- export type OutlineInfo = {
74
- x: number
75
- y: number
76
- x1: number
77
- y1: number
78
- }
79
-
80
- export interface BoxBounds {
74
+ export interface BoxBounds extends BoxBoundsPoint {
81
75
  x: number
82
76
  y: number
83
77
  width: number
84
78
  height: number
85
- minX: number
86
- minY: number
87
- maxX: number
88
- maxY: number
89
79
  centerX: number
90
80
  centerY: number
91
81
  }
92
82
 
83
+ export type OutlineInfo = {
84
+ x: number
85
+ y: number
86
+ x1: number
87
+ y1: number
88
+ }
89
+
93
90
  export interface BaseModel {
94
91
  /**
95
92
  * 节点或边对应的 ID.
@@ -139,10 +136,11 @@ export namespace Model {
139
136
  /**
140
137
  * 元素上的文本
141
138
  *
142
- * LogicFlow 中存在梁总文本:1. 脱离边和节点单独存在的问题;2. 必须和边、节点关联的文本
139
+ * LogicFlow 中存在两种文本:1. 脱离边和节点单独存在的问题;2. 必须和边、节点关联的文本
143
140
  * 此属性控制的是第二种。节点和边在删除、调整的同时,其关联的文本也会对应删除、调整。
144
141
  */
145
142
  text: LogicFlow.TextConfig
143
+
146
144
  properties: Record<string, unknown>
147
145
 
148
146
  isSelected: boolean // 元素是否被选中
@@ -1,19 +1,20 @@
1
- import { assign, pick } from 'lodash-es'
2
- import { observable, action } from '../util/mobx'
1
+ import { assign, isBoolean, pick } from 'lodash-es'
2
+ import { observable, action } from 'mobx'
3
+ import { TextMode } from '../constant'
3
4
 
4
- export interface EditConfigInterface {
5
+ export interface IEditConfigType {
5
6
  /**
6
7
  * 是否为静默模式
7
8
  */
8
- isSilentMode?: boolean
9
+ isSilentMode: boolean
9
10
  /**
10
11
  * 禁止缩放画布
11
12
  */
12
- stopZoomGraph?: boolean
13
+ stopZoomGraph: boolean
13
14
  /**
14
15
  * 禁止鼠标滚动移动画布
15
16
  */
16
- stopScrollGraph?: boolean
17
+ stopScrollGraph: boolean
17
18
  /**
18
19
  * 禁止拖动画布,默认为false
19
20
  * - true:完全禁止移动
@@ -21,7 +22,7 @@ export interface EditConfigInterface {
21
22
  * - horizontal:禁止水平方向拖动
22
23
  * - [number, number, number, number]:[minX, minY, maxX, maxY] 画布可拖动范围
23
24
  */
24
- stopMoveGraph?:
25
+ stopMoveGraph:
25
26
  | boolean
26
27
  | 'vertical'
27
28
  | 'horizontal'
@@ -29,70 +30,109 @@ export interface EditConfigInterface {
29
30
  /**
30
31
  * 允许调整边
31
32
  */
32
- adjustEdge?: boolean
33
+ adjustEdge: boolean
34
+ /**
35
+ * 允许调整边的中间点
36
+ */
37
+ adjustEdgeMiddle: boolean
33
38
  /**
34
39
  * 允许调整边起点和终点
35
40
  */
36
- adjustEdgeStartAndEnd?: boolean
41
+ adjustEdgeStartAndEnd: boolean
42
+ /**
43
+ * 允许调整边起点
44
+ */
45
+ adjustEdgeStart: boolean
46
+ /**
47
+ * 允许调整边的终点
48
+ */
49
+ adjustEdgeEnd: boolean
37
50
  /**
38
51
  * 允许拖动节点
39
52
  */
40
- adjustNodePosition?: boolean
53
+ adjustNodePosition: boolean
41
54
  /**
42
55
  * 隐藏节点所有锚点
43
56
  */
44
- hideAnchors?: boolean
57
+ hideAnchors: boolean
45
58
  /**
46
59
  * 是否允许节点旋转(旋转点的显隐)
47
60
  */
48
- allowRotate?: boolean
61
+ allowRotate: boolean
49
62
  /**
50
63
  * 是否允许节点缩放(缩放调整点的显隐)
51
64
  */
52
- allowResize?: boolean
65
+ allowResize: boolean
66
+ /**
67
+ * 是否自动展开
68
+ */
69
+ autoExpand: boolean
53
70
  /**
54
71
  * 显示节点悬浮时的外框
55
72
  */
56
- hoverOutline?: boolean
73
+ hoverOutline: boolean
57
74
  /**
58
75
  * 节点被选中时是否显示outline
59
76
  */
60
- nodeSelectedOutline?: boolean
77
+ nodeSelectedOutline: boolean
61
78
  /**
62
79
  * 边被选中时是否显示outline
63
80
  */
64
- edgeSelectedOutline?: boolean
81
+ edgeSelectedOutline: boolean
82
+ /**
83
+ * 允许文本可编辑
84
+ */
85
+ textEdit: boolean
65
86
  /**
66
87
  * 允许节点文本可以编辑
67
88
  */
68
- nodeTextEdit?: boolean
89
+ nodeTextEdit: boolean
69
90
  /**
70
91
  * 允许边文本可以编辑
71
92
  */
72
- edgeTextEdit?: boolean
93
+ edgeTextEdit: boolean
73
94
  /**
74
- * 允许文本编辑
95
+ * 允许文本可拖拽(文本包括Text、Label)
75
96
  */
76
- textEdit?: boolean
97
+ textDraggable: boolean
77
98
  /**
78
99
  * 允许节点文本可以拖拽
79
100
  */
80
- nodeTextDraggable?: boolean
101
+ nodeTextDraggable: boolean
81
102
  /**
82
103
  * 允许边文本可以拖拽
83
104
  */
84
- edgeTextDraggable?: boolean
105
+ edgeTextDraggable: boolean
85
106
  /**
86
107
  * 多选按键, 支持meta(cmd)、shift、alt
87
108
  * 不支持ctrl,ctrl会触发contextmenu
88
109
  */
89
- multipleSelectKey?: string
110
+ multipleSelectKey: string
111
+
112
+ /**
113
+ * 2.0.0 新增配置,启用 Label 后生效
114
+ * 是否支持多文本,文本文字是否垂直展示
115
+ * 当前文本类型
116
+ */
117
+ nodeTextMultiple: boolean
118
+ edgeTextMultiple: boolean
119
+ nodeTextVertical: boolean
120
+ edgeTextVertical: boolean
121
+ textMode: TextMode
122
+ // 节点文本类型
123
+ nodeTextMode: TextMode
124
+ // 边文本类型
125
+ edgeTextMode: TextMode
90
126
  }
91
127
 
92
- const SilentConfig = {
128
+ export type IConfigKeys = keyof IEditConfigType
129
+
130
+ const silentModeConfig = {
131
+ // SilentMode 下允许用户操作画布
93
132
  stopZoomGraph: false,
94
133
  stopScrollGraph: false,
95
134
  stopMoveGraph: false,
135
+ // 节点 & 边相关配置
96
136
  adjustEdge: false,
97
137
  adjustEdgeStartAndEnd: false,
98
138
  adjustNodePosition: false,
@@ -100,103 +140,144 @@ const SilentConfig = {
100
140
  allowRotate: false,
101
141
  allowResize: false,
102
142
  nodeSelectedOutline: true,
143
+ // 文本相关配置
144
+ textEdit: false,
103
145
  nodeTextEdit: false,
104
146
  edgeTextEdit: false,
147
+ textDraggable: false,
105
148
  nodeTextDraggable: false,
106
149
  edgeTextDraggable: false,
107
150
  }
108
151
 
109
- const keys = [
110
- 'isSilentMode',
111
- 'stopZoomGraph',
112
- 'stopScrollGraph',
113
- 'stopMoveGraph',
114
- 'adjustEdge',
115
- 'adjustEdgeMiddle',
116
- 'adjustEdgeStartAndEnd',
117
- 'adjustNodePosition',
118
- 'hideAnchors',
119
- 'allowRotate',
120
- 'allowResize',
121
- 'hoverOutline',
122
- 'nodeSelectedOutline',
123
- 'edgeSelectedOutline',
124
- 'nodeTextEdit',
125
- 'edgeTextEdit',
126
- 'nodeTextDraggable',
127
- 'edgeTextDraggable',
128
- 'multipleSelectKey',
129
- 'autoExpand',
130
- ]
152
+ const allKeys = [
153
+ 'isSilentMode', // 是否为静默模式
154
+ 'stopZoomGraph', // 禁止缩放画布
155
+ 'stopScrollGraph', // 禁止鼠标滚动移动画布
156
+ 'stopMoveGraph', // 禁止拖动画布
157
+ 'adjustEdge', // 允许调整边
158
+ 'adjustEdgeMiddle', // 允许调整边中点
159
+ 'adjustEdgeStartAndEnd', // 允许调整边起点和终点
160
+ 'adjustEdgeStart', // 允许调整边起点
161
+ 'adjustEdgeEnd', // 允许调整边终点
162
+ 'adjustNodePosition', // 允许拖动节点
163
+ 'hideAnchors', // 隐藏节点所有锚点
164
+ 'allowRotate', // 是否允许节点旋转
165
+ 'allowResize', // 是否允许节点缩放
166
+ 'autoExpand', // 是否自动展开
167
+ 'hoverOutline', // 显示节点悬浮时的外框
168
+ 'nodeSelectedOutline', // 节点被选中时是否显示 outline
169
+ 'edgeSelectedOutline', // 边被选中时是否显示 outline
170
+ 'textEdit', // 是否允许文本可编辑(全局)
171
+ 'nodeTextEdit', // 允许节点文本可以编辑
172
+ 'edgeTextEdit', // 允许边文本可以编辑
173
+ 'textDraggable', // 是否允许文本可拖拽(全局)
174
+ 'nodeTextDraggable', // 允许节点文本可以拖拽
175
+ 'edgeTextDraggable', // 允许边文本可以拖拽
176
+ 'multipleSelectKey', // 多选按键
177
+
178
+ // 2.0.0 新增配置
179
+ 'textMode', // 文本模式(全局)
180
+ 'nodeTextMode', // 节点文本模式
181
+ 'edgeTextMode', // 边文本模式
182
+ 'nodeTextMultiple', // 是否支持多个节点文本
183
+ 'edgeTextMultiple', // 是否支持多个边文本
184
+ 'nodeTextVertical', // 节点文本是否纵向显示
185
+ 'edgeTextVertical', // 边文本是否纵向显示
186
+ ] as const
187
+
131
188
  /**
132
189
  * 页面编辑配置
133
190
  */
134
191
  export class EditConfigModel {
192
+ stagedConfig?: Partial<IEditConfigType> // 暂存「设置为静默模式之前」的配置,在取消静默模式后恢复
193
+
194
+ /*********************************************************
195
+ * 画布相关配置
196
+ ********************************************************/
135
197
  @observable isSilentMode = false
136
198
  @observable stopZoomGraph = false
137
- @observable stopScrollGraph = false
138
199
  @observable stopMoveGraph = false
139
- @observable adjustEdge = true
140
- @observable adjustEdgeMiddle = false
141
- @observable adjustEdgeStartAndEnd = false
142
- @observable adjustNodePosition = true
200
+ @observable stopScrollGraph = false
201
+ /*********************************************************
202
+ * 文本相关配置(全局)
203
+ ********************************************************/
204
+ @observable textMode = TextMode.TEXT // 全局的 textMode 设置
205
+ @observable textEdit = true
206
+ @observable textDraggable = false
207
+ // 节点
208
+ @observable nodeTextEdit = true
209
+ @observable nodeTextDraggable = true
210
+ @observable nodeTextMultiple = false // 是否支持多个节点文本
211
+ @observable nodeTextVertical = false // 节点文本朝向是否是纵向
212
+ @observable nodeTextMode = TextMode.TEXT // 节点文本模式
213
+ // 边
214
+ @observable edgeTextMode = TextMode.TEXT // 边文本模式
215
+ @observable edgeTextEdit = true
216
+ @observable edgeTextDraggable = false
217
+ @observable edgeTextMultiple = false // 是否支持多个边文本
218
+ @observable edgeTextVertical = false // 边文本朝向是否是纵向
219
+ /*********************************************************
220
+ * 节点相关配置
221
+ ********************************************************/
143
222
  @observable hideAnchors = false
144
223
  @observable allowRotate = false
145
224
  @observable allowResize = false
146
225
  @observable hoverOutline = true
147
226
  @observable nodeSelectedOutline = true
148
- @observable edgeSelectedOutline = true
149
- @observable nodeTextEdit = true
150
- @observable edgeTextEdit = true
151
- @observable nodeTextDraggable = false
152
- @observable edgeTextDraggable = false
227
+ @observable adjustNodePosition = true
153
228
  @observable autoExpand = false
229
+ /*********************************************************
230
+ * 边相关配置
231
+ ********************************************************/
232
+ @observable adjustEdge = true
233
+ @observable adjustEdgeMiddle = false
234
+ @observable adjustEdgeStartAndEnd = false
235
+ @observable adjustEdgeStart = false
236
+ @observable adjustEdgeEnd = false
237
+ @observable edgeSelectedOutline = true
238
+ /*********************************************************
239
+ * 其他
240
+ ********************************************************/
154
241
  multipleSelectKey = ''
155
- defaultConfig = {} // 设置为静默模式之前的配置,在取消静默模式后恢复
156
- constructor(config: EditConfigInterface) {
157
- assign(this, this.getConfigDetail(config))
242
+
243
+ constructor(config: Partial<IEditConfigType>) {
244
+ assign(this, this.computeConfig(config))
158
245
  }
246
+
159
247
  @action
160
- updateEditConfig(config) {
161
- const newConfig = this.getConfigDetail(config)
248
+ updateEditConfig(config: Partial<IEditConfigType>) {
249
+ const newConfig = this.computeConfig(config)
162
250
  assign(this, newConfig)
163
251
  }
164
- getConfigDetail(config) {
165
- const { isSilentMode, textEdit } = config
166
- const conf = {}
167
- // false表示从静默模式恢复
252
+
253
+ // TODO: 确认一下这个函数的逻辑,是否会有误合并的问题
254
+ computeConfig(config: Partial<IEditConfigType>) {
255
+ const {
256
+ isSilentMode,
257
+ textDraggable,
258
+ textMode,
259
+ textEdit,
260
+ adjustEdgeStartAndEnd,
261
+ } = config
262
+ const conf: Partial<IEditConfigType> = {}
263
+
264
+ // false 表示从静默模式恢复
168
265
  if (isSilentMode === false) {
169
- assign(conf, this.defaultConfig)
266
+ assign(conf, this.stagedConfig)
170
267
  }
171
- // 如果不传,默认undefined表示非静默模式
268
+
269
+ // 如果不传,默认 undefined 表示非静默模式
172
270
  if (isSilentMode === true && isSilentMode !== this.isSilentMode) {
173
271
  // https://github.com/didi/LogicFlow/issues/1180
174
- // 如果重复调用isSilentMode=true多次,会导致this.defaultConfig状态保存错误:保存为修改之后的Config
175
- // 因此需要阻止重复赋值为true,使用config.isSilentMode !== this.isSilentMode
176
- const silentConfig = pick(SilentConfig, keys)
177
- // 在修改之前,
178
- this.defaultConfig = {
179
- stopZoomGraph: this.stopZoomGraph,
180
- stopScrollGraph: this.stopScrollGraph,
181
- stopMoveGraph: this.stopMoveGraph,
182
- adjustEdge: this.adjustEdge,
183
- adjustEdgeMiddle: this.adjustEdgeMiddle,
184
- adjustEdgeStartAndEnd: this.adjustEdgeStartAndEnd,
185
- adjustNodePosition: this.adjustNodePosition,
186
- hideAnchors: this.hideAnchors,
187
- allowRotate: this.allowRotate,
188
- allowResize: this.allowResize,
189
- hoverOutline: this.hoverOutline,
190
- nodeSelectedOutline: this.nodeSelectedOutline,
191
- edgeSelectedOutline: this.edgeSelectedOutline,
192
- nodeTextEdit: this.nodeTextEdit,
193
- edgeTextEdit: this.edgeTextEdit,
194
- nodeTextDraggable: this.nodeTextDraggable,
195
- edgeTextDraggable: this.edgeTextDraggable,
196
- autoExpand: this.autoExpand,
197
- }
272
+ // 如果重复调用 isSilentMode=true 多次,会导致 this.stagedConfig 状态保存错误:保存为修改之后的 Config
273
+ // 因此需要阻止重复赋值为 true,使用 config.isSilentMode !== this.isSilentMode
274
+ const silentConfig = pick(silentModeConfig, allKeys)
275
+ // 暂存修改之前的所有配置项
276
+ this.stagedConfig = pick(this, allKeys)
277
+
198
278
  assign(conf, silentConfig)
199
279
  }
280
+
200
281
  // 如果不传,默认undefined表示允许文本编辑
201
282
  if (textEdit === false) {
202
283
  assign(conf, {
@@ -204,11 +285,42 @@ export class EditConfigModel {
204
285
  edgeTextEdit: false,
205
286
  })
206
287
  }
207
- const userConfig = pick(config, keys)
288
+
289
+ if (textMode) {
290
+ assign(conf, {
291
+ nodeTextMode: textMode,
292
+ edgeTextMode: textMode,
293
+ })
294
+ }
295
+
296
+ if (textDraggable === false) {
297
+ assign(conf, {
298
+ nodeTextDraggable: false,
299
+ edgeTextDraggable: false,
300
+ })
301
+ }
302
+
303
+ if (isBoolean(adjustEdgeStartAndEnd)) {
304
+ assign(conf, {
305
+ adjustEdgeStart: adjustEdgeStartAndEnd,
306
+ adjustEdgeEnd: adjustEdgeStartAndEnd,
307
+ })
308
+ }
309
+
310
+ const userConfig = pick(config, allKeys)
208
311
  return assign(conf, userConfig)
209
312
  }
210
- getConfig() {
211
- return pick(this, keys)
313
+
314
+ @action
315
+ updateTextMode(textMode: TextMode) {
316
+ // 如果更新全局 textMode,同时更新节点和边的 textMode
317
+ this.textMode = textMode
318
+ this.edgeTextMode = textMode
319
+ this.nodeTextMode = textMode
320
+ }
321
+
322
+ getConfig(): IEditConfigType {
323
+ return pick(this, allKeys)
212
324
  }
213
325
  }
214
326
 
@@ -1,4 +1,4 @@
1
- import { find, forEach, map } from 'lodash-es'
1
+ import { find, forEach, isObject, map } from 'lodash-es'
2
2
  import { action, computed, observable } from 'mobx'
3
3
  import {
4
4
  BaseEdgeModel,
@@ -16,6 +16,7 @@ import {
16
16
  EventType,
17
17
  ModelType,
18
18
  OverlapMode,
19
+ TextMode,
19
20
  } from '../constant'
20
21
  import LogicFlow from '../LogicFlow'
21
22
  import { Options as LFOptions } from '../options'
@@ -35,7 +36,6 @@ import {
35
36
  updateTheme,
36
37
  } from '../util'
37
38
  import EventEmitter from '../event/eventEmitter'
38
-
39
39
  import Position = LogicFlow.Position
40
40
  import PointTuple = LogicFlow.PointTuple
41
41
  import GraphData = LogicFlow.GraphData
@@ -623,6 +623,40 @@ export class GraphModel {
623
623
  return newId
624
624
  }
625
625
 
626
+ /**
627
+ * 获取元素的文本模式
628
+ * @param model
629
+ */
630
+ getTextModel(model: BaseNodeModel): TextMode | undefined {
631
+ const { textMode, nodeTextMode, edgeTextMode } = this.editConfigModel
632
+
633
+ // textMode 的优先级:
634
+ // 元素自身 model.textMode > editConfigModel.node(edge)TextMode > editConfigModel.textMode
635
+ if (model.BaseType === ElementType.NODE) {
636
+ return model.textMode || nodeTextMode || textMode || TextMode.TEXT
637
+ }
638
+
639
+ // 同上
640
+ if (model.BaseType === ElementType.EDGE) {
641
+ return model.textMode || edgeTextMode || textMode || TextMode.TEXT
642
+ }
643
+ }
644
+
645
+ /**
646
+ * 更新元素的文本模式
647
+ * @param mode
648
+ * @param model
649
+ */
650
+ @action
651
+ setTextMode(mode: TextMode, model?: BaseNodeModel | BaseEdgeModel) {
652
+ // 如果有传入 model,则直接更新 model 的 textMode
653
+ if (model) {
654
+ // model.updateTextMode(mode)
655
+ }
656
+ // 调用 editConfigModel 的方法更新 textMode
657
+ this.editConfigModel.updateEditConfig({ textMode: mode })
658
+ }
659
+
626
660
  /**
627
661
  * 内部保留方法,请勿直接使用
628
662
  */
@@ -755,7 +789,7 @@ export class GraphModel {
755
789
  if (nodeX && nodeY) {
756
790
  node.x = snapToGrid(nodeX, this.gridSize)
757
791
  node.y = snapToGrid(nodeY, this.gridSize)
758
- if (typeof node.text === 'object') {
792
+ if (isObject(node.text)) {
759
793
  // 原来的处理是:node.text.x -= getGridOffset(nodeX, this.gridSize)
760
794
  // 由于snapToGrid()使用了Math.round()四舍五入的做法,因此无法判断需要执行
761
795
  // node.text.x = node.text.x + getGridOffset()
@@ -781,7 +815,7 @@ export class GraphModel {
781
815
  data.x += 30
782
816
  data.y += 30
783
817
  data.id = ''
784
- if (data.text) {
818
+ if (isObject(data.text)) {
785
819
  data.text.x += 30
786
820
  data.text.y += 30
787
821
  }
@@ -924,7 +958,9 @@ export class GraphModel {
924
958
  // 如果是自定义边文本位置,则移动节点的时候重新计算其位置
925
959
  if (edgeModel.customTextPosition) {
926
960
  edgeModel.resetTextPosition()
927
- } else if (
961
+ return
962
+ }
963
+ if (
928
964
  edgeModel.modelType === ModelType.POLYLINE_EDGE &&
929
965
  edgeModel.text?.value
930
966
  ) {
@@ -934,10 +970,9 @@ export class GraphModel {
934
970
  newPoint.x - textPosition.x,
935
971
  newPoint.y - textPosition.y,
936
972
  )
937
- } else {
938
- const { x: x1, y: y1 } = edgeModel.textPosition
939
- edgeModel.moveText(x1 - x, y1 - y)
940
973
  }
974
+ const { x: x1, y: y1 } = edgeModel.textPosition
975
+ edgeModel.moveText(x1 - x, y1 - y)
941
976
  }
942
977
 
943
978
  /**
@@ -40,7 +40,7 @@ export interface TransformInterface {
40
40
 
41
41
  const translateLimitsMap = {
42
42
  false: [-Infinity, -Infinity, Infinity, Infinity],
43
- true: [0, 0, 0, 0],
43
+ true: [-Infinity, -Infinity, Infinity, Infinity],
44
44
  vertical: [-Infinity, 0, Infinity, 0],
45
45
  horizontal: [0, -Infinity, 0, Infinity],
46
46
  }