@logicflow/core 2.0.0-beta.2 → 2.0.0-beta.3

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 (258) hide show
  1. package/.turbo/turbo-build$colon$dev.log +2 -2
  2. package/.turbo/turbo-build.log +7 -7
  3. package/dist/index.min.js +9 -3
  4. package/es/LogicFlow.d.ts +8 -3
  5. package/es/LogicFlow.js +5 -4
  6. package/es/LogicFlow.js.map +1 -1
  7. package/es/common/drag.d.ts +51 -0
  8. package/es/common/drag.js +145 -0
  9. package/es/common/drag.js.map +1 -0
  10. package/es/common/history.d.ts +28 -0
  11. package/es/common/history.js +92 -0
  12. package/es/common/history.js.map +1 -0
  13. package/es/common/index.d.ts +5 -0
  14. package/es/common/index.js +6 -0
  15. package/es/common/index.js.map +1 -0
  16. package/es/common/keyboard.d.ts +34 -0
  17. package/es/common/keyboard.js +80 -0
  18. package/es/common/keyboard.js.map +1 -0
  19. package/es/common/matrix.d.ts +30 -0
  20. package/es/common/matrix.js +155 -0
  21. package/es/common/matrix.js.map +1 -0
  22. package/es/common/vector.d.ts +23 -0
  23. package/es/common/vector.js +97 -0
  24. package/es/common/vector.js.map +1 -0
  25. package/es/event/eventEmitter.js +1 -1
  26. package/es/event/eventEmitter.js.map +1 -1
  27. package/es/index.d.ts +1 -1
  28. package/es/index.js +1 -1
  29. package/es/index.js.map +1 -1
  30. package/es/model/SnaplineModel.d.ts +2 -0
  31. package/es/model/edge/BaseEdgeModel.d.ts +5 -9
  32. package/es/model/edge/BaseEdgeModel.js +26 -23
  33. package/es/model/edge/BaseEdgeModel.js.map +1 -1
  34. package/es/model/edge/BezierEdgeModel.d.ts +2 -0
  35. package/es/model/edge/LineEdgeModel.d.ts +2 -0
  36. package/es/model/edge/PolylineEdgeModel.d.ts +2 -0
  37. package/es/model/node/BaseNodeModel.js +22 -21
  38. package/es/model/node/BaseNodeModel.js.map +1 -1
  39. package/es/model/node/CircleNodeModel.d.ts +2 -0
  40. package/es/model/node/CircleNodeModel.js +2 -2
  41. package/es/model/node/CircleNodeModel.js.map +1 -1
  42. package/es/model/node/DiamondNodeModel.d.ts +2 -0
  43. package/es/model/node/DiamondNodeModel.js +2 -1
  44. package/es/model/node/DiamondNodeModel.js.map +1 -1
  45. package/es/model/node/EllipseNodeModel.d.ts +2 -0
  46. package/es/model/node/EllipseNodeModel.js +2 -1
  47. package/es/model/node/EllipseNodeModel.js.map +1 -1
  48. package/es/model/node/HtmlNodeModel.d.ts +2 -2
  49. package/es/model/node/HtmlNodeModel.js.map +1 -1
  50. package/es/model/node/PolygonNodeModel.d.ts +2 -0
  51. package/es/model/node/PolygonNodeModel.js +2 -2
  52. package/es/model/node/PolygonNodeModel.js.map +1 -1
  53. package/es/model/node/RectNodeModel.d.ts +3 -0
  54. package/es/model/node/RectNodeModel.js +8 -2
  55. package/es/model/node/RectNodeModel.js.map +1 -1
  56. package/es/model/node/TextNodeModel.d.ts +4 -2
  57. package/es/options.js +2 -11
  58. package/es/options.js.map +1 -1
  59. package/es/tool/tool.js.map +1 -1
  60. package/es/util/edge.d.ts +6 -0
  61. package/es/util/edge.js +15 -1
  62. package/es/util/edge.js.map +1 -1
  63. package/es/util/node.d.ts +6 -2
  64. package/es/util/node.js +22 -7
  65. package/es/util/node.js.map +1 -1
  66. package/es/view/Anchor.d.ts +1 -1
  67. package/es/view/Anchor.js +3 -3
  68. package/es/view/Anchor.js.map +1 -1
  69. package/es/view/Control.js +14 -2
  70. package/es/view/Control.js.map +1 -1
  71. package/es/view/Graph.d.ts +3 -0
  72. package/es/view/Graph.js +38 -3
  73. package/es/view/Graph.js.map +1 -1
  74. package/es/view/edge/AdjustPoint.js +3 -3
  75. package/es/view/edge/AdjustPoint.js.map +1 -1
  76. package/es/view/edge/BaseEdge.d.ts +2 -2
  77. package/es/view/edge/BaseEdge.js +5 -5
  78. package/es/view/node/BaseNode.d.ts +2 -2
  79. package/es/view/node/BaseNode.js +5 -5
  80. package/es/view/node/TextNode.js +1 -1
  81. package/es/view/node/TextNode.js.map +1 -1
  82. package/es/view/shape/Circle.d.ts +9 -1
  83. package/es/view/shape/Circle.js +5 -5
  84. package/es/view/shape/Circle.js.map +1 -1
  85. package/es/view/shape/Ellipse.d.ts +10 -1
  86. package/es/view/shape/Ellipse.js +5 -5
  87. package/es/view/shape/Ellipse.js.map +1 -1
  88. package/es/view/shape/Line.d.ts +14 -1
  89. package/es/view/shape/Line.js +5 -7
  90. package/es/view/shape/Line.js.map +1 -1
  91. package/es/view/shape/Path.d.ts +3 -2
  92. package/es/view/shape/Path.js +3 -3
  93. package/es/view/shape/Path.js.map +1 -1
  94. package/es/view/shape/Polygon.d.ts +5 -3
  95. package/es/view/shape/Polygon.js +6 -6
  96. package/es/view/shape/Polygon.js.map +1 -1
  97. package/es/view/shape/Polyline.d.ts +7 -1
  98. package/es/view/shape/Polyline.js +8 -6
  99. package/es/view/shape/Polyline.js.map +1 -1
  100. package/es/view/shape/Rect.d.ts +11 -13
  101. package/es/view/shape/Rect.js +6 -9
  102. package/es/view/shape/Rect.js.map +1 -1
  103. package/es/view/shape/Text.d.ts +19 -1
  104. package/es/view/shape/Text.js +28 -21
  105. package/es/view/shape/Text.js.map +1 -1
  106. package/es/view/text/BaseText.d.ts +12 -15
  107. package/es/view/text/BaseText.js +37 -27
  108. package/es/view/text/BaseText.js.map +1 -1
  109. package/es/view/text/LineText.d.ts +19 -7
  110. package/es/view/text/LineText.js +62 -54
  111. package/es/view/text/LineText.js.map +1 -1
  112. package/lib/LogicFlow.d.ts +8 -3
  113. package/lib/LogicFlow.js +5 -4
  114. package/lib/LogicFlow.js.map +1 -1
  115. package/lib/common/drag.d.ts +51 -0
  116. package/lib/common/drag.js +148 -0
  117. package/lib/common/drag.js.map +1 -0
  118. package/lib/common/history.d.ts +28 -0
  119. package/lib/common/history.js +95 -0
  120. package/lib/common/history.js.map +1 -0
  121. package/lib/common/index.d.ts +5 -0
  122. package/lib/common/index.js +22 -0
  123. package/lib/common/index.js.map +1 -0
  124. package/lib/common/keyboard.d.ts +34 -0
  125. package/lib/common/keyboard.js +86 -0
  126. package/lib/common/keyboard.js.map +1 -0
  127. package/lib/common/matrix.d.ts +30 -0
  128. package/lib/common/matrix.js +158 -0
  129. package/lib/common/matrix.js.map +1 -0
  130. package/lib/common/vector.d.ts +23 -0
  131. package/lib/common/vector.js +101 -0
  132. package/lib/common/vector.js.map +1 -0
  133. package/lib/event/eventEmitter.js +1 -1
  134. package/lib/event/eventEmitter.js.map +1 -1
  135. package/lib/index.d.ts +1 -1
  136. package/lib/index.js +2 -2
  137. package/lib/index.js.map +1 -1
  138. package/lib/model/SnaplineModel.d.ts +2 -0
  139. package/lib/model/edge/BaseEdgeModel.d.ts +5 -9
  140. package/lib/model/edge/BaseEdgeModel.js +25 -22
  141. package/lib/model/edge/BaseEdgeModel.js.map +1 -1
  142. package/lib/model/edge/BezierEdgeModel.d.ts +2 -0
  143. package/lib/model/edge/LineEdgeModel.d.ts +2 -0
  144. package/lib/model/edge/PolylineEdgeModel.d.ts +2 -0
  145. package/lib/model/node/BaseNodeModel.js +21 -20
  146. package/lib/model/node/BaseNodeModel.js.map +1 -1
  147. package/lib/model/node/CircleNodeModel.d.ts +2 -0
  148. package/lib/model/node/CircleNodeModel.js +2 -2
  149. package/lib/model/node/CircleNodeModel.js.map +1 -1
  150. package/lib/model/node/DiamondNodeModel.d.ts +2 -0
  151. package/lib/model/node/DiamondNodeModel.js +2 -1
  152. package/lib/model/node/DiamondNodeModel.js.map +1 -1
  153. package/lib/model/node/EllipseNodeModel.d.ts +2 -0
  154. package/lib/model/node/EllipseNodeModel.js +2 -1
  155. package/lib/model/node/EllipseNodeModel.js.map +1 -1
  156. package/lib/model/node/HtmlNodeModel.d.ts +2 -2
  157. package/lib/model/node/HtmlNodeModel.js.map +1 -1
  158. package/lib/model/node/PolygonNodeModel.d.ts +2 -0
  159. package/lib/model/node/PolygonNodeModel.js +2 -2
  160. package/lib/model/node/PolygonNodeModel.js.map +1 -1
  161. package/lib/model/node/RectNodeModel.d.ts +3 -0
  162. package/lib/model/node/RectNodeModel.js +8 -2
  163. package/lib/model/node/RectNodeModel.js.map +1 -1
  164. package/lib/model/node/TextNodeModel.d.ts +4 -2
  165. package/lib/options.js +2 -11
  166. package/lib/options.js.map +1 -1
  167. package/lib/tool/tool.js.map +1 -1
  168. package/lib/util/edge.d.ts +6 -0
  169. package/lib/util/edge.js +16 -1
  170. package/lib/util/edge.js.map +1 -1
  171. package/lib/util/node.d.ts +6 -2
  172. package/lib/util/node.js +24 -9
  173. package/lib/util/node.js.map +1 -1
  174. package/lib/view/Anchor.d.ts +1 -1
  175. package/lib/view/Anchor.js +2 -2
  176. package/lib/view/Anchor.js.map +1 -1
  177. package/lib/view/Control.js +14 -2
  178. package/lib/view/Control.js.map +1 -1
  179. package/lib/view/Graph.d.ts +3 -0
  180. package/lib/view/Graph.js +37 -2
  181. package/lib/view/Graph.js.map +1 -1
  182. package/lib/view/edge/AdjustPoint.js +2 -2
  183. package/lib/view/edge/AdjustPoint.js.map +1 -1
  184. package/lib/view/edge/BaseEdge.d.ts +2 -2
  185. package/lib/view/edge/BaseEdge.js +5 -5
  186. package/lib/view/node/BaseNode.d.ts +2 -2
  187. package/lib/view/node/BaseNode.js +5 -5
  188. package/lib/view/node/TextNode.js +1 -1
  189. package/lib/view/node/TextNode.js.map +1 -1
  190. package/lib/view/shape/Circle.d.ts +9 -1
  191. package/lib/view/shape/Circle.js +5 -5
  192. package/lib/view/shape/Circle.js.map +1 -1
  193. package/lib/view/shape/Ellipse.d.ts +10 -1
  194. package/lib/view/shape/Ellipse.js +5 -5
  195. package/lib/view/shape/Ellipse.js.map +1 -1
  196. package/lib/view/shape/Line.d.ts +14 -1
  197. package/lib/view/shape/Line.js +5 -7
  198. package/lib/view/shape/Line.js.map +1 -1
  199. package/lib/view/shape/Path.d.ts +3 -2
  200. package/lib/view/shape/Path.js +3 -3
  201. package/lib/view/shape/Path.js.map +1 -1
  202. package/lib/view/shape/Polygon.d.ts +5 -3
  203. package/lib/view/shape/Polygon.js +6 -6
  204. package/lib/view/shape/Polygon.js.map +1 -1
  205. package/lib/view/shape/Polyline.d.ts +7 -1
  206. package/lib/view/shape/Polyline.js +8 -6
  207. package/lib/view/shape/Polyline.js.map +1 -1
  208. package/lib/view/shape/Rect.d.ts +11 -13
  209. package/lib/view/shape/Rect.js +6 -9
  210. package/lib/view/shape/Rect.js.map +1 -1
  211. package/lib/view/shape/Text.d.ts +19 -1
  212. package/lib/view/shape/Text.js +29 -21
  213. package/lib/view/shape/Text.js.map +1 -1
  214. package/lib/view/text/BaseText.d.ts +12 -15
  215. package/lib/view/text/BaseText.js +40 -27
  216. package/lib/view/text/BaseText.js.map +1 -1
  217. package/lib/view/text/LineText.d.ts +19 -7
  218. package/lib/view/text/LineText.js +62 -57
  219. package/lib/view/text/LineText.js.map +1 -1
  220. package/package.json +2 -1
  221. package/src/LogicFlow.tsx +19 -7
  222. package/src/common/drag.ts +205 -0
  223. package/src/common/history.ts +108 -0
  224. package/src/common/index.ts +6 -0
  225. package/src/common/keyboard.ts +108 -0
  226. package/src/common/matrix.ts +122 -0
  227. package/src/common/vector.ts +93 -0
  228. package/src/event/eventEmitter.ts +1 -1
  229. package/src/index.ts +1 -1
  230. package/src/model/edge/BaseEdgeModel.ts +31 -21
  231. package/src/model/node/BaseNodeModel.ts +27 -19
  232. package/src/model/node/CircleNodeModel.ts +2 -2
  233. package/src/model/node/DiamondNodeModel.ts +2 -0
  234. package/src/model/node/EllipseNodeModel.ts +2 -0
  235. package/src/model/node/HtmlNodeModel.ts +2 -2
  236. package/src/model/node/PolygonNodeModel.ts +2 -2
  237. package/src/model/node/RectNodeModel.ts +9 -2
  238. package/src/options.ts +2 -11
  239. package/src/tool/tool.ts +1 -1
  240. package/src/util/edge.ts +26 -1
  241. package/src/util/node.ts +29 -8
  242. package/src/view/Anchor.tsx +4 -4
  243. package/src/view/Control.tsx +5 -2
  244. package/src/view/Graph.tsx +14 -2
  245. package/src/view/edge/AdjustPoint.tsx +3 -3
  246. package/src/view/edge/BaseEdge.tsx +7 -7
  247. package/src/view/node/BaseNode.tsx +7 -7
  248. package/src/view/node/TextNode.tsx +1 -1
  249. package/src/view/shape/Circle.tsx +21 -7
  250. package/src/view/shape/Ellipse.tsx +20 -6
  251. package/src/view/shape/Line.tsx +24 -9
  252. package/src/view/shape/Path.tsx +9 -6
  253. package/src/view/shape/Polygon.tsx +13 -10
  254. package/src/view/shape/Polyline.tsx +20 -8
  255. package/src/view/shape/Rect.tsx +19 -19
  256. package/src/view/shape/Text.tsx +64 -33
  257. package/src/view/text/BaseText.tsx +67 -41
  258. package/src/view/text/LineText.tsx +94 -80
@@ -1,4 +1,4 @@
1
- import { assign, cloneDeep, find } from 'lodash-es'
1
+ import { assign, cloneDeep, find, isUndefined } from 'lodash-es'
2
2
  import { action, computed, observable, toJS } from 'mobx'
3
3
  import { BaseNodeModel, GraphModel, Model } from '..'
4
4
  import LogicFlow from '../../LogicFlow'
@@ -20,6 +20,7 @@ import {
20
20
  import Point = LogicFlow.Point
21
21
  import EdgeData = LogicFlow.EdgeData
22
22
  import EdgeConfig = LogicFlow.EdgeConfig
23
+ import TextConfig = LogicFlow.TextConfig
23
24
 
24
25
  export interface IBaseEdgeModel extends Model.BaseModel {
25
26
  /**
@@ -56,7 +57,7 @@ export class BaseEdgeModel implements IBaseEdgeModel {
56
57
  @observable startPoint!: Point
57
58
  @observable endPoint!: Point
58
59
 
59
- @observable text = {
60
+ @observable text: Required<TextConfig> = {
60
61
  value: '',
61
62
  x: 0,
62
63
  y: 0,
@@ -431,8 +432,7 @@ export class BaseEdgeModel implements IBaseEdgeModel {
431
432
 
432
433
  /**
433
434
  * 设置边的属性,会触发重新渲染
434
- * @param key 属性名
435
- * @param val 属性值
435
+ * @param properties 要更新的 properties,会做合并
436
436
  */
437
437
  @action
438
438
  setProperties(properties: Record<string, any>): void {
@@ -497,28 +497,38 @@ export class BaseEdgeModel implements IBaseEdgeModel {
497
497
  * 内部方法,处理初始化文本格式
498
498
  */
499
499
  @action formatText(data: EdgeConfig) {
500
- // 暂时处理,只传入text的情况
501
500
  const { x, y } = this.textPosition
502
- if (!data.text || typeof data.text === 'string') {
503
- this.text = {
504
- value: data.text || '',
505
- x,
506
- y,
507
- draggable: this.text.draggable,
508
- editable: this.text.editable,
509
- }
510
- return
501
+ const { text } = data
502
+ let textConfig: Required<TextConfig> = {
503
+ value: '',
504
+ x,
505
+ y,
506
+ draggable: false,
507
+ editable: true,
511
508
  }
512
509
 
513
- if (Object.prototype.toString.call(data.text) === '[object Object]') {
514
- this.text = {
515
- x: data.text.x || x,
516
- y: data.text.y || y,
517
- value: data.text.value || '',
518
- draggable: this.text.draggable,
519
- editable: this.text.editable,
510
+ if (text) {
511
+ if (typeof text === 'string') {
512
+ textConfig = {
513
+ ...textConfig,
514
+ value: text,
515
+ }
516
+ } else {
517
+ textConfig = {
518
+ ...textConfig,
519
+ x: text.x ?? x,
520
+ y: text.y ?? y,
521
+ value: text.value ?? '',
522
+ }
523
+ if (!isUndefined(text.draggable)) {
524
+ textConfig.draggable = text.draggable
525
+ }
526
+ if (!isUndefined(text.editable)) {
527
+ textConfig.editable = text.editable
528
+ }
520
529
  }
521
530
  }
531
+ this.text = textConfig
522
532
  }
523
533
 
524
534
  /**
@@ -1,5 +1,5 @@
1
1
  import { action, computed, isObservable, observable, toJS } from 'mobx'
2
- import { assign, cloneDeep, has, isNil, mapKeys } from 'lodash-es'
2
+ import { assign, cloneDeep, has, isNil, isUndefined, mapKeys } from 'lodash-es'
3
3
  import { GraphModel, Model } from '..'
4
4
  import LogicFlow from '../../LogicFlow'
5
5
  import {
@@ -186,6 +186,7 @@ export class BaseNodeModel implements IBaseNodeModel {
186
186
  }
187
187
 
188
188
  this.formatText(data)
189
+ // 在下面又将 NodeConfig 中的数据赋值给了 this,应该会触发 setAttributes,确认是否符合预期
189
190
  assign(this, pickNodeConfig(data)) // TODO: 确认 constructor 中赋值 properties 是否必要
190
191
  const { overlapMode } = this.graphModel
191
192
  if (overlapMode === OverlapMode.INCREASE) {
@@ -219,27 +220,34 @@ export class BaseNodeModel implements IBaseNodeModel {
219
220
  * 始化文本属性
220
221
  */
221
222
  private formatText(data: NodeConfig): void {
222
- if (!data.text) {
223
- data.text = {
224
- value: '',
225
- x: data.x,
226
- y: data.y,
227
- draggable: false,
228
- editable: true,
229
- }
230
- } else {
231
- if (typeof data.text === 'string') {
232
- data.text = {
233
- value: data.text,
234
- x: data.x,
235
- y: data.y,
236
- draggable: false,
237
- editable: true,
238
- }
223
+ const { x, y, text } = data
224
+ let textConfig: TextConfig = {
225
+ value: '',
226
+ x,
227
+ y,
228
+ draggable: false,
229
+ editable: true,
230
+ }
231
+ if (text) {
232
+ if (typeof text === 'string') {
233
+ textConfig.value = text
239
234
  } else {
240
- data.text.editable = data.text.editable ?? true
235
+ textConfig = {
236
+ ...textConfig,
237
+ x: text.x ?? x,
238
+ y: text.y ?? y,
239
+ value: text.value ?? '',
240
+ }
241
+ if (!isUndefined(text.draggable)) {
242
+ textConfig.draggable = text.draggable
243
+ }
244
+ if (!isUndefined(text.editable)) {
245
+ textConfig.draggable = text.draggable
246
+ }
241
247
  }
242
248
  }
249
+
250
+ data.text = textConfig
243
251
  }
244
252
 
245
253
  /**
@@ -54,11 +54,11 @@ export class CircleNodeModel extends BaseNodeModel {
54
54
  theme: { circle },
55
55
  },
56
56
  } = this
57
- const { style: customStyle } = this.properties
57
+ const { style: customStyle = {} } = this.properties
58
58
  return {
59
59
  ...style,
60
- ...(customStyle ?? {}),
61
60
  ...cloneDeep(circle),
61
+ ...cloneDeep(customStyle),
62
62
  }
63
63
  }
64
64
 
@@ -53,9 +53,11 @@ export class DiamondNodeModel extends BaseNodeModel {
53
53
  theme: { diamond },
54
54
  },
55
55
  } = this
56
+ const { style: customStyle = {} } = this.properties
56
57
  return {
57
58
  ...style,
58
59
  ...cloneDeep(diamond),
60
+ ...cloneDeep(customStyle),
59
61
  }
60
62
  }
61
63
 
@@ -51,9 +51,11 @@ export class EllipseNodeModel extends BaseNodeModel {
51
51
  theme: { ellipse },
52
52
  },
53
53
  } = this
54
+ const { style: customStyle = {} } = this.properties
54
55
  return {
55
56
  ...style,
56
57
  ...cloneDeep(ellipse),
58
+ ...cloneDeep(customStyle),
57
59
  }
58
60
  }
59
61
 
@@ -7,7 +7,7 @@ import { observable } from 'mobx'
7
7
  import LogicFlow from '../../LogicFlow'
8
8
  import GraphModel from '../GraphModel'
9
9
 
10
- export type IHtmlNodeModel = {
10
+ export type IHtmlNodeProperties = {
11
11
  width?: number
12
12
  height?: number
13
13
  style?: LogicFlow.CommonTheme
@@ -18,7 +18,7 @@ export type IHtmlNodeModel = {
18
18
 
19
19
  export class HtmlNodeModel extends BaseNodeModel {
20
20
  modelType = ModelType.HTML_NODE
21
- @observable properties: IHtmlNodeModel = {}
21
+ @observable properties: IHtmlNodeProperties = {}
22
22
 
23
23
  constructor(data: LogicFlow.NodeConfig, graphModel: GraphModel) {
24
24
  super(data, graphModel)
@@ -66,11 +66,11 @@ export class PolygonNodeModel extends BaseNodeModel {
66
66
  theme: { polygon },
67
67
  },
68
68
  } = this
69
- const { style: customStyle } = this.properties
69
+ const { style: customStyle = {} } = this.properties
70
70
  return {
71
71
  ...style,
72
72
  ...cloneDeep(polygon),
73
- ...(cloneDeep(customStyle) || {}),
73
+ ...cloneDeep(customStyle),
74
74
  }
75
75
  }
76
76
 
@@ -8,6 +8,7 @@ import { ModelType } from '../../constant'
8
8
  export type IRectNodeModel = {
9
9
  width?: number
10
10
  height?: number
11
+ radius?: number
11
12
  style?: LogicFlow.CommonTheme
12
13
  textStyle?: LogicFlow.CommonTheme
13
14
 
@@ -21,17 +22,21 @@ export class RectNodeModel extends BaseNodeModel {
21
22
 
22
23
  constructor(data: LogicFlow.NodeConfig, graphModel: GraphModel) {
23
24
  super(data, graphModel)
24
- this.properties = data.properties || {}
25
25
 
26
+ // TODO:类字段初始化会覆盖 super、setAttributes 中设置的属性
27
+ this.properties = data.properties || {}
28
+ // TODO: bug here, 上面更新 properties 会触发 setAttributes,下面再主动调用,会导致触发两次
26
29
  this.setAttributes()
27
30
  }
28
31
 
29
32
  setAttributes() {
30
33
  super.setAttributes()
31
34
 
32
- const { width, height } = this.properties
35
+ const { width, height, radius } = this.properties
33
36
  if (width) this.width = width
34
37
  if (height) this.height = height
38
+ // 矩形特有
39
+ if (radius) this.radius = radius
35
40
  }
36
41
 
37
42
  getDefaultAnchor() {
@@ -47,9 +52,11 @@ export class RectNodeModel extends BaseNodeModel {
47
52
  getNodeStyle() {
48
53
  const style = super.getNodeStyle()
49
54
  const { rect } = this.graphModel.theme
55
+ const { style: customStyle = {} } = this.properties
50
56
  return {
51
57
  ...style,
52
58
  ...cloneDeep(rect),
59
+ ...cloneDeep(customStyle),
53
60
  }
54
61
  }
55
62
  }
package/src/options.ts CHANGED
@@ -111,22 +111,13 @@ export namespace Options {
111
111
  export function get(options: Partial<Manual>) {
112
112
  const { ...others } = options
113
113
  const container = options.container
114
- if (container != null) {
115
- if (options.width == null) {
116
- others.width = container.clientWidth
117
- }
118
- if (options.height == null) {
119
- others.height = container.clientHeight
120
- }
121
- } else {
114
+ if (!container) {
122
115
  throw new Error(
123
116
  'Ensure the container of LogicFlow is specified and valid.',
124
117
  )
125
118
  }
126
119
 
127
- const result = assign({}, defaults, others) as Options.Definition
128
-
129
- return result
120
+ return assign({}, defaults, others) as Options.Definition
130
121
  }
131
122
  }
132
123
 
package/src/tool/tool.ts CHANGED
@@ -3,8 +3,8 @@ import { VNode } from 'preact'
3
3
  import TextEdit from './TextEditTool'
4
4
  import MultipleSelect from './MultipleSelectTool'
5
5
  import LogicFlow from '../LogicFlow'
6
- import { GraphModel, BaseEdgeModel, BaseNodeModel } from '../model'
7
6
  import { ElementState, EventType } from '../constant'
7
+ import { GraphModel, BaseEdgeModel, BaseNodeModel } from '../model'
8
8
 
9
9
  export type IToolProps = {
10
10
  textEditElement?: BaseNodeModel | BaseEdgeModel
package/src/util/edge.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { pick } from 'lodash-es'
1
+ import { forEach, pick } from 'lodash-es'
2
2
  import { getNodeBBox, isInNode, distance, sampleCubic } from '.'
3
3
  import LogicFlow from '../LogicFlow'
4
4
  import { Options } from '../options'
@@ -1032,3 +1032,28 @@ export function createEdgeGenerator(
1032
1032
  return Object.assign({ type: result }, currentEdge)
1033
1033
  }
1034
1034
  }
1035
+
1036
+ // 获取 Svg 标签文案高度,自动换行
1037
+ export type IGetSvgTextSizeParams = {
1038
+ rows: string[]
1039
+ rowsLength: number
1040
+ fontSize: number
1041
+ }
1042
+ export const getSvgTextSize = ({
1043
+ rows,
1044
+ rowsLength,
1045
+ fontSize,
1046
+ }: IGetSvgTextSizeParams): LogicFlow.RectSize => {
1047
+ let longestBytes = 0
1048
+ forEach(rows, (row) => {
1049
+ const rowBytesLength = getBytesLength(row)
1050
+ longestBytes = rowBytesLength > longestBytes ? rowBytesLength : longestBytes
1051
+ })
1052
+
1053
+ // 背景框宽度,最长一行字节数/2 * fontsize + 2
1054
+ // 背景框宽度, 行数 * fontsize + 2
1055
+ return {
1056
+ width: Math.ceil(longestBytes / 2) * fontSize + fontSize / 4,
1057
+ height: rowsLength * (fontSize + 2) + fontSize / 4,
1058
+ }
1059
+ }
package/src/util/node.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { pick } from 'lodash-es'
2
+ import { createElement as h } from 'preact/compat'
2
3
  import { getBytesLength } from './edge'
3
4
  import LogicFlow from '../LogicFlow'
4
5
  import {
@@ -444,7 +445,26 @@ export const getNodeAnchorPosition = (
444
445
  }
445
446
  }
446
447
 
447
- // 获取文案高度,自动换行,利用dom计算高度
448
+ /*********************************************************
449
+ * Text 节点文本相关工具函数
450
+ ********************************************************/
451
+ // Text 相关节点工具函数
452
+ // TODO: 获取文案高度,设置自动换行,利用 dom 计算高度
453
+ // function getTextHeight(text: string, font: string): number {
454
+ // const span = document.createElement('span');
455
+ // span.textContent = text;
456
+ // span.style.font = font;
457
+
458
+ // const range = document.createRange();
459
+ // range.selectNodeContents(span);
460
+
461
+ // const rect = range.getBoundingClientRect();
462
+ // const height = rect.height;
463
+
464
+ // return height;
465
+ // }
466
+
467
+ // 获取文案高度,自动换行,利用 dom 计算高度
448
468
  export const getHtmlTextHeight = ({
449
469
  rows,
450
470
  style,
@@ -452,18 +472,18 @@ export const getHtmlTextHeight = ({
452
472
  className,
453
473
  }: {
454
474
  rows: string[]
455
- style: any // TODO: 完善类型
475
+ style: h.JSX.CSSProperties
456
476
  rowsLength: number
457
477
  className: string
458
478
  }) => {
459
479
  const dom = document.createElement('div')
460
- dom.style.fontSize = style.fontSize
461
- dom.style.width = style.width
462
480
  dom.className = className
463
- dom.style.lineHeight = style.lineHeight
464
- dom.style.padding = style.padding
481
+ dom.style.fontSize = `${style.fontSize}`
482
+ dom.style.width = `${style.width}`
483
+ dom.style.lineHeight = `${style.lineHeight}`
484
+ dom.style.padding = `${style.padding}`
465
485
  if (style.fontFamily) {
466
- dom.style.fontFamily = style.fontFamily
486
+ dom.style.fontFamily = `${style.fontFamily}`
467
487
  }
468
488
  if (rowsLength > 1) {
469
489
  rows.forEach((row) => {
@@ -479,6 +499,7 @@ export const getHtmlTextHeight = ({
479
499
  document.body.removeChild(dom)
480
500
  return height
481
501
  }
502
+
482
503
  // 获取文案高度,自动换行,利用dom计算高度
483
504
  export const getSvgTextWidthHeight = ({
484
505
  rows,
@@ -506,7 +527,7 @@ export const getSvgTextWidthHeight = ({
506
527
  /**
507
528
  * @description 格式化边校验信息
508
529
  */
509
- export const formateAnchorConnectValidateData = (
530
+ export const formatAnchorConnectValidateData = (
510
531
  data: Model.ConnectRuleResult,
511
532
  ) => {
512
533
  if (typeof data !== 'object') {
@@ -6,7 +6,7 @@ import { ElementState, EventType } from '../constant'
6
6
  import { GraphModel, BaseNodeModel, Model } from '../model'
7
7
  import {
8
8
  StepDrag,
9
- formateAnchorConnectValidateData,
9
+ formatAnchorConnectValidateData,
10
10
  targetNodeInfo,
11
11
  distance,
12
12
  cancelRaf,
@@ -29,7 +29,7 @@ interface IProps {
29
29
  anchorIndex: number
30
30
  graphModel: GraphModel
31
31
  nodeModel: BaseNodeModel
32
- setHoverOFF: (e: MouseEvent) => void
32
+ setHoverOff: (e: MouseEvent) => void
33
33
  }
34
34
 
35
35
  interface IState {
@@ -326,11 +326,11 @@ class Anchor extends Component<IProps, IState> {
326
326
  )
327
327
  this.sourceRuleResults.set(
328
328
  targetInfoId,
329
- formateAnchorConnectValidateData(sourceRuleResult),
329
+ formatAnchorConnectValidateData(sourceRuleResult),
330
330
  )
331
331
  this.targetRuleResults.set(
332
332
  targetInfoId,
333
- formateAnchorConnectValidateData(targetRuleResult),
333
+ formatAnchorConnectValidateData(targetRuleResult),
334
334
  )
335
335
  }
336
336
  const { isAllPass: isSourcePass } =
@@ -304,6 +304,7 @@ export class ResizeControl extends Component<
304
304
 
305
305
  // 由于将拖拽放大缩小改成丝滑模式,这个时候需要再拖拽结束的时候,将节点的位置更新到 grid 上。
306
306
  onDragEnd = () => {
307
+ // TODO: 确认下面该代码是否还需要(应该是默认让节点拖拽以 gridSize 为步长移动)
307
308
  // const { gridSize = 1 } = this.graphModel
308
309
  // const x = gridSize * Math.round(this.nodeModel.x / gridSize)
309
310
  // const y = gridSize * Math.round(this.nodeModel.y / gridSize)
@@ -319,14 +320,16 @@ export class ResizeControl extends Component<
319
320
 
320
321
  render(): h.JSX.Element {
321
322
  const { x, y, direction, model } = this.props
322
- const style = model.getResizeControlStyle()
323
+ const { width, height, ...restStyle } = model.getResizeControlStyle()
323
324
  return (
324
325
  <g className={`lf-resize-control lf-resize-control-${direction}`}>
325
326
  <Rect
326
327
  className="lf-resize-control-content"
327
328
  x={x}
328
329
  y={y}
329
- {...style}
330
+ width={width ?? 7}
331
+ height={height ?? 7}
332
+ {...restStyle}
330
333
  onMouseDown={this.dragHandler.handleMouseDown}
331
334
  />
332
335
  </g>
@@ -1,5 +1,5 @@
1
1
  import { Component, ComponentType } from 'preact/compat'
2
- import { map } from 'lodash-es'
2
+ import { map, throttle } from 'lodash-es'
3
3
  import {
4
4
  CanvasOverlay,
5
5
  ToolOverlay,
@@ -37,6 +37,18 @@ type ContainerStyle = {
37
37
 
38
38
  @observer
39
39
  class Graph extends Component<IGraphProps> {
40
+ handleResize = () => {
41
+ this.props.graphModel.resize()
42
+ }
43
+
44
+ componentDidMount() {
45
+ window.addEventListener('resize', throttle(this.handleResize, 200))
46
+ }
47
+
48
+ componentWillUnmount() {
49
+ window.removeEventListener('resize', throttle(this.handleResize, 200))
50
+ }
51
+
40
52
  getComponent(
41
53
  model: BaseEdgeModel | BaseNodeModel,
42
54
  graphModel: GraphModel,
@@ -73,7 +85,7 @@ class Graph extends Component<IGraphProps> {
73
85
  const { adjustEdge } = editConfigModel
74
86
 
75
87
  return (
76
- <div className="lf-graph" flow-id={graphModel.flowId} style={style}>
88
+ <div className="lf-graph" flow-id={graphModel.flowId}>
77
89
  <CanvasOverlay graphModel={graphModel} dnd={dnd}>
78
90
  <g className="lf-base">
79
91
  {map(graphModel.sortElements, (nodeModel) =>
@@ -4,7 +4,7 @@ import { GraphModel, BaseNodeModel, BaseEdgeModel, Model } from '../../model'
4
4
  import {
5
5
  IDragParams,
6
6
  StepDrag,
7
- formateAnchorConnectValidateData,
7
+ formatAnchorConnectValidateData,
8
8
  targetNodeInfo,
9
9
  NodeContaint,
10
10
  } from '../../util'
@@ -394,11 +394,11 @@ export class AdjustPoint extends Component<IProps, IState> {
394
394
  )
395
395
  this.sourceRuleResults.set(
396
396
  targetInfoId,
397
- formateAnchorConnectValidateData(sourceRuleResult),
397
+ formatAnchorConnectValidateData(sourceRuleResult),
398
398
  )
399
399
  this.targetRuleResults.set(
400
400
  targetInfoId,
401
- formateAnchorConnectValidateData(targetRuleResult),
401
+ formatAnchorConnectValidateData(targetRuleResult),
402
402
  )
403
403
  }
404
404
  const { isAllPass: isSourcePass, msg: sourceMsg } =
@@ -307,24 +307,24 @@ export abstract class BaseEdge<P extends IProps> extends Component<
307
307
  /**
308
308
  * 不支持重写,如果想要基于hover状态设置不同的样式,请在model中使用isHovered属性。
309
309
  */
310
- setHoverON = (ev: MouseEvent) => {
310
+ setHoverOn = (ev: MouseEvent) => {
311
311
  // ! hover多次触发, onMouseOver + onMouseEnter
312
312
  const {
313
313
  model: { isHovered },
314
314
  } = this.props
315
315
  if (isHovered) return
316
- this.textRef && this.textRef.current && this.textRef.current.setHoverON()
316
+ this.textRef && this.textRef.current && this.textRef.current.setHoverOn()
317
317
  this.handleHover(true, ev)
318
318
  }
319
319
  /**
320
320
  * 不支持重写,如果想要基于hover状态设置不同的样式,请在model中使用isHovered属性。
321
321
  */
322
- setHoverOFF = (ev: MouseEvent) => {
322
+ setHoverOff = (ev: MouseEvent) => {
323
323
  const {
324
324
  model: { isHovered },
325
325
  } = this.props
326
326
  if (!isHovered) return
327
- this.textRef && this.textRef.current && this.textRef.current.setHoverOFF()
327
+ this.textRef && this.textRef.current && this.textRef.current.setHoverOff()
328
328
  this.handleHover(false, ev)
329
329
  }
330
330
  /**
@@ -471,9 +471,9 @@ export abstract class BaseEdge<P extends IProps> extends Component<
471
471
  onMouseDown={this.handleMouseDown}
472
472
  onMouseUp={this.handleMouseUp}
473
473
  onContextMenu={this.handleContextMenu}
474
- onMouseOver={this.setHoverON}
475
- onMouseEnter={this.setHoverON}
476
- onMouseLeave={this.setHoverOFF}
474
+ onMouseOver={this.setHoverOn}
475
+ onMouseEnter={this.setHoverOn}
476
+ onMouseLeave={this.setHoverOff}
477
477
  >
478
478
  {this.getShape()}
479
479
  {this.getAppend()}
@@ -106,7 +106,7 @@ export abstract class BaseNode<P extends IProps> extends Component<P, IState> {
106
106
  anchorIndex={index}
107
107
  nodeModel={model}
108
108
  graphModel={graphModel}
109
- setHoverOFF={this.setHoverOFF}
109
+ setHoverOff={this.setHoverOff}
110
110
  />
111
111
  )
112
112
  })
@@ -395,7 +395,7 @@ export abstract class BaseNode<P extends IProps> extends Component<P, IState> {
395
395
  }
396
396
  // 为什么将hover状态放到model中?
397
397
  // 因为自定义节点的时候,可能会基于hover状态自定义不同的样式。
398
- setHoverON = (ev: MouseEvent) => {
398
+ setHoverOn = (ev: MouseEvent) => {
399
399
  const { model, graphModel } = this.props
400
400
  if (model.isHovered) return
401
401
  const nodeData = model.getData()
@@ -405,7 +405,7 @@ export abstract class BaseNode<P extends IProps> extends Component<P, IState> {
405
405
  e: ev,
406
406
  })
407
407
  }
408
- setHoverOFF = (ev: MouseEvent) => {
408
+ setHoverOff = (ev: MouseEvent) => {
409
409
  const { model, graphModel } = this.props
410
410
  const nodeData = model.getData()
411
411
  if (!model.isHovered) return
@@ -417,7 +417,7 @@ export abstract class BaseNode<P extends IProps> extends Component<P, IState> {
417
417
  }
418
418
  onMouseOut = (ev: MouseEvent) => {
419
419
  if (isIe) {
420
- this.setHoverOFF(ev)
420
+ this.setHoverOff(ev)
421
421
  }
422
422
  }
423
423
 
@@ -476,9 +476,9 @@ export abstract class BaseNode<P extends IProps> extends Component<P, IState> {
476
476
  onMouseDown={this.handleMouseDown}
477
477
  onMouseUp={this.handleMouseUp}
478
478
  onClick={this.handleClick}
479
- onMouseEnter={this.setHoverON}
480
- onMouseOver={this.setHoverON}
481
- onMouseLeave={this.setHoverOFF}
479
+ onMouseEnter={this.setHoverOn}
480
+ onMouseOver={this.setHoverOn}
481
+ onMouseLeave={this.setHoverOff}
482
482
  onMouseOut={this.onMouseOut}
483
483
  onContextMenu={this.handleContextMenu}
484
484
  {...restAttributes}
@@ -18,7 +18,7 @@ export class TextNode extends BaseNode<ITextNodeProps> {
18
18
  const rectAttr = {
19
19
  ...style.background,
20
20
  x,
21
- y: y - 1,
21
+ y,
22
22
  width,
23
23
  height,
24
24
  }