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

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 (215) hide show
  1. package/.turbo/turbo-build$colon$dev.log +2 -2
  2. package/.turbo/turbo-build.log +8 -8
  3. package/dist/index.min.js +4 -4
  4. package/es/LogicFlow.d.ts +19 -14
  5. package/es/LogicFlow.js +1 -2
  6. package/es/LogicFlow.js.map +1 -1
  7. package/es/event/eventArgs.d.ts +13 -4
  8. package/es/event/eventEmitter.d.ts +2 -2
  9. package/es/index.d.ts +1 -0
  10. package/es/index.js +1 -0
  11. package/es/index.js.map +1 -1
  12. package/es/keyboard/index.d.ts +1 -0
  13. package/es/keyboard/index.js +1 -0
  14. package/es/keyboard/index.js.map +1 -1
  15. package/es/keyboard/shortcut.d.ts +4 -0
  16. package/es/keyboard/shortcut.js +61 -0
  17. package/es/keyboard/shortcut.js.map +1 -1
  18. package/es/model/BaseModel.d.ts +15 -2
  19. package/es/model/EditConfigModel.d.ts +1 -1
  20. package/es/model/EditConfigModel.js +11 -11
  21. package/es/model/EditConfigModel.js.map +1 -1
  22. package/es/model/GraphModel.d.ts +12 -12
  23. package/es/model/GraphModel.js +3 -3
  24. package/es/model/GraphModel.js.map +1 -1
  25. package/es/model/edge/BaseEdgeModel.d.ts +9 -7
  26. package/es/model/edge/BaseEdgeModel.js +5 -2
  27. package/es/model/edge/BaseEdgeModel.js.map +1 -1
  28. package/es/model/edge/BezierEdgeModel.d.ts +2 -2
  29. package/es/model/edge/BezierEdgeModel.js +2 -1
  30. package/es/model/edge/BezierEdgeModel.js.map +1 -1
  31. package/es/model/edge/LineEdgeModel.js +2 -1
  32. package/es/model/edge/LineEdgeModel.js.map +1 -1
  33. package/es/model/edge/PolylineEdgeModel.js +2 -1
  34. package/es/model/edge/PolylineEdgeModel.js.map +1 -1
  35. package/es/model/node/BaseNodeModel.d.ts +23 -21
  36. package/es/model/node/BaseNodeModel.js +17 -16
  37. package/es/model/node/BaseNodeModel.js.map +1 -1
  38. package/es/model/node/CircleNodeModel.d.ts +2 -3
  39. package/es/model/node/CircleNodeModel.js +2 -5
  40. package/es/model/node/CircleNodeModel.js.map +1 -1
  41. package/es/model/node/DiamondNodeModel.d.ts +3 -4
  42. package/es/model/node/DiamondNodeModel.js +2 -5
  43. package/es/model/node/DiamondNodeModel.js.map +1 -1
  44. package/es/model/node/EllipseNodeModel.d.ts +3 -4
  45. package/es/model/node/EllipseNodeModel.js +2 -5
  46. package/es/model/node/EllipseNodeModel.js.map +1 -1
  47. package/es/model/node/HtmlNodeModel.d.ts +3 -4
  48. package/es/model/node/HtmlNodeModel.js +2 -12
  49. package/es/model/node/HtmlNodeModel.js.map +1 -1
  50. package/es/model/node/PolygonNodeModel.d.ts +3 -4
  51. package/es/model/node/PolygonNodeModel.js +2 -5
  52. package/es/model/node/PolygonNodeModel.js.map +1 -1
  53. package/es/model/node/RectNodeModel.d.ts +4 -5
  54. package/es/model/node/RectNodeModel.js +2 -5
  55. package/es/model/node/RectNodeModel.js.map +1 -1
  56. package/es/model/node/TextNodeModel.d.ts +14 -8
  57. package/es/model/node/TextNodeModel.js.map +1 -1
  58. package/es/util/edge.d.ts +1 -1
  59. package/es/util/index.d.ts +1 -0
  60. package/es/util/index.js +1 -0
  61. package/es/util/index.js.map +1 -1
  62. package/es/util/node.js +3 -0
  63. package/es/util/node.js.map +1 -1
  64. package/es/util/resize.d.ts +32 -0
  65. package/es/util/resize.js +197 -0
  66. package/es/util/resize.js.map +1 -0
  67. package/es/view/Anchor.d.ts +4 -3
  68. package/es/view/Control.d.ts +1 -1
  69. package/es/view/Control.js +72 -35
  70. package/es/view/Control.js.map +1 -1
  71. package/es/view/Graph.js +2 -1
  72. package/es/view/Graph.js.map +1 -1
  73. package/es/view/node/BaseNode.d.ts +2 -2
  74. package/es/view/node/BaseNode.js +15 -11
  75. package/es/view/node/BaseNode.js.map +1 -1
  76. package/es/view/node/CircleNode.d.ts +1 -1
  77. package/es/view/node/CircleNode.js.map +1 -1
  78. package/es/view/node/DiamondNode.d.ts +1 -1
  79. package/es/view/node/DiamondNode.js.map +1 -1
  80. package/es/view/node/EllipseNode.d.ts +1 -1
  81. package/es/view/node/EllipseNode.js.map +1 -1
  82. package/es/view/node/HtmlNode.d.ts +1 -1
  83. package/es/view/node/HtmlNode.js.map +1 -1
  84. package/es/view/node/PolygonNode.d.ts +1 -1
  85. package/es/view/node/PolygonNode.js.map +1 -1
  86. package/es/view/node/RectNode.d.ts +1 -1
  87. package/es/view/node/RectNode.js.map +1 -1
  88. package/es/view/node/TextNode.d.ts +1 -1
  89. package/es/view/node/TextNode.js.map +1 -1
  90. package/es/view/text/BaseText.js +1 -1
  91. package/es/view/text/BaseText.js.map +1 -1
  92. package/lib/LogicFlow.d.ts +19 -14
  93. package/lib/LogicFlow.js +2 -3
  94. package/lib/LogicFlow.js.map +1 -1
  95. package/lib/event/eventArgs.d.ts +13 -4
  96. package/lib/event/eventEmitter.d.ts +2 -2
  97. package/lib/index.d.ts +1 -0
  98. package/lib/index.js +1 -0
  99. package/lib/index.js.map +1 -1
  100. package/lib/keyboard/index.d.ts +1 -0
  101. package/lib/keyboard/index.js +15 -0
  102. package/lib/keyboard/index.js.map +1 -1
  103. package/lib/keyboard/shortcut.d.ts +4 -0
  104. package/lib/keyboard/shortcut.js +64 -1
  105. package/lib/keyboard/shortcut.js.map +1 -1
  106. package/lib/model/BaseModel.d.ts +15 -2
  107. package/lib/model/EditConfigModel.d.ts +1 -1
  108. package/lib/model/EditConfigModel.js +10 -10
  109. package/lib/model/EditConfigModel.js.map +1 -1
  110. package/lib/model/GraphModel.d.ts +12 -12
  111. package/lib/model/GraphModel.js +2 -2
  112. package/lib/model/GraphModel.js.map +1 -1
  113. package/lib/model/edge/BaseEdgeModel.d.ts +9 -7
  114. package/lib/model/edge/BaseEdgeModel.js +5 -2
  115. package/lib/model/edge/BaseEdgeModel.js.map +1 -1
  116. package/lib/model/edge/BezierEdgeModel.d.ts +2 -2
  117. package/lib/model/edge/BezierEdgeModel.js +2 -1
  118. package/lib/model/edge/BezierEdgeModel.js.map +1 -1
  119. package/lib/model/edge/LineEdgeModel.js +2 -1
  120. package/lib/model/edge/LineEdgeModel.js.map +1 -1
  121. package/lib/model/edge/PolylineEdgeModel.js +2 -1
  122. package/lib/model/edge/PolylineEdgeModel.js.map +1 -1
  123. package/lib/model/node/BaseNodeModel.d.ts +23 -21
  124. package/lib/model/node/BaseNodeModel.js +17 -16
  125. package/lib/model/node/BaseNodeModel.js.map +1 -1
  126. package/lib/model/node/CircleNodeModel.d.ts +2 -3
  127. package/lib/model/node/CircleNodeModel.js +2 -5
  128. package/lib/model/node/CircleNodeModel.js.map +1 -1
  129. package/lib/model/node/DiamondNodeModel.d.ts +3 -4
  130. package/lib/model/node/DiamondNodeModel.js +2 -5
  131. package/lib/model/node/DiamondNodeModel.js.map +1 -1
  132. package/lib/model/node/EllipseNodeModel.d.ts +3 -4
  133. package/lib/model/node/EllipseNodeModel.js +2 -5
  134. package/lib/model/node/EllipseNodeModel.js.map +1 -1
  135. package/lib/model/node/HtmlNodeModel.d.ts +3 -4
  136. package/lib/model/node/HtmlNodeModel.js +2 -12
  137. package/lib/model/node/HtmlNodeModel.js.map +1 -1
  138. package/lib/model/node/PolygonNodeModel.d.ts +3 -4
  139. package/lib/model/node/PolygonNodeModel.js +2 -5
  140. package/lib/model/node/PolygonNodeModel.js.map +1 -1
  141. package/lib/model/node/RectNodeModel.d.ts +4 -5
  142. package/lib/model/node/RectNodeModel.js +2 -5
  143. package/lib/model/node/RectNodeModel.js.map +1 -1
  144. package/lib/model/node/TextNodeModel.d.ts +14 -8
  145. package/lib/model/node/TextNodeModel.js.map +1 -1
  146. package/lib/util/edge.d.ts +1 -1
  147. package/lib/util/index.d.ts +1 -0
  148. package/lib/util/index.js +1 -0
  149. package/lib/util/index.js.map +1 -1
  150. package/lib/util/node.js +3 -0
  151. package/lib/util/node.js.map +1 -1
  152. package/lib/util/resize.d.ts +32 -0
  153. package/lib/util/resize.js +204 -0
  154. package/lib/util/resize.js.map +1 -0
  155. package/lib/view/Anchor.d.ts +4 -3
  156. package/lib/view/Control.d.ts +1 -1
  157. package/lib/view/Control.js +71 -34
  158. package/lib/view/Control.js.map +1 -1
  159. package/lib/view/Graph.js +2 -1
  160. package/lib/view/Graph.js.map +1 -1
  161. package/lib/view/node/BaseNode.d.ts +2 -2
  162. package/lib/view/node/BaseNode.js +15 -11
  163. package/lib/view/node/BaseNode.js.map +1 -1
  164. package/lib/view/node/CircleNode.d.ts +1 -1
  165. package/lib/view/node/CircleNode.js.map +1 -1
  166. package/lib/view/node/DiamondNode.d.ts +1 -1
  167. package/lib/view/node/DiamondNode.js.map +1 -1
  168. package/lib/view/node/EllipseNode.d.ts +1 -1
  169. package/lib/view/node/EllipseNode.js.map +1 -1
  170. package/lib/view/node/HtmlNode.d.ts +1 -1
  171. package/lib/view/node/HtmlNode.js.map +1 -1
  172. package/lib/view/node/PolygonNode.d.ts +1 -1
  173. package/lib/view/node/PolygonNode.js.map +1 -1
  174. package/lib/view/node/RectNode.d.ts +1 -1
  175. package/lib/view/node/RectNode.js.map +1 -1
  176. package/lib/view/node/TextNode.d.ts +1 -1
  177. package/lib/view/node/TextNode.js.map +1 -1
  178. package/lib/view/text/BaseText.js +1 -1
  179. package/lib/view/text/BaseText.js.map +1 -1
  180. package/package.json +1 -1
  181. package/src/LogicFlow.tsx +18 -14
  182. package/src/event/eventArgs.ts +16 -4
  183. package/src/event/eventEmitter.ts +1 -1
  184. package/src/index.ts +1 -0
  185. package/src/keyboard/index.ts +2 -0
  186. package/src/keyboard/shortcut.ts +67 -0
  187. package/src/model/BaseModel.ts +16 -3
  188. package/src/model/EditConfigModel.ts +11 -11
  189. package/src/model/GraphModel.ts +3 -3
  190. package/src/model/edge/BaseEdgeModel.ts +17 -5
  191. package/src/model/edge/BezierEdgeModel.ts +2 -0
  192. package/src/model/edge/LineEdgeModel.ts +2 -0
  193. package/src/model/edge/PolylineEdgeModel.ts +2 -0
  194. package/src/model/node/BaseNodeModel.ts +23 -16
  195. package/src/model/node/CircleNodeModel.ts +6 -4
  196. package/src/model/node/DiamondNodeModel.ts +7 -5
  197. package/src/model/node/EllipseNodeModel.ts +7 -5
  198. package/src/model/node/HtmlNodeModel.ts +7 -6
  199. package/src/model/node/PolygonNodeModel.ts +7 -5
  200. package/src/model/node/RectNodeModel.ts +8 -6
  201. package/src/model/node/TextNodeModel.ts +13 -2
  202. package/src/util/index.ts +1 -0
  203. package/src/util/node.ts +4 -0
  204. package/src/util/resize.ts +286 -0
  205. package/src/view/Control.tsx +76 -57
  206. package/src/view/Graph.tsx +2 -1
  207. package/src/view/node/BaseNode.tsx +26 -13
  208. package/src/view/node/CircleNode.tsx +3 -1
  209. package/src/view/node/DiamondNode.tsx +3 -1
  210. package/src/view/node/EllipseNode.tsx +3 -1
  211. package/src/view/node/HtmlNode.tsx +3 -1
  212. package/src/view/node/PolygonNode.tsx +3 -1
  213. package/src/view/node/RectNode.tsx +3 -1
  214. package/src/view/node/TextNode.tsx +3 -1
  215. package/src/view/text/BaseText.tsx +1 -1
package/src/LogicFlow.tsx CHANGED
@@ -19,10 +19,9 @@ import { formatData } from './util'
19
19
  import { Dnd, snapline } from './view/behavior'
20
20
  import Tool from './tool'
21
21
  import History from './history'
22
- import Keyboard from './keyboard'
22
+ import Keyboard, { initDefaultShortcut } from './keyboard'
23
23
  import { EventCallback, CallbackArgs, EventArgs } from './event/eventEmitter'
24
24
  import { ElementType, EventType, SegmentDirection } from './constant'
25
- import { initDefaultShortcut } from './keyboard/shortcut'
26
25
 
27
26
  import Extension = LogicFlow.Extension
28
27
  import ExtensionConfig = LogicFlow.ExtensionConfig
@@ -692,10 +691,7 @@ export class LogicFlow {
692
691
  * @param edges
693
692
  * @param distance
694
693
  */
695
- addElements(
696
- { nodes, edges }: GraphConfigData,
697
- distance = 40,
698
- ): GraphElements | undefined {
694
+ addElements({ nodes, edges }: GraphConfigData, distance = 40): GraphElements {
699
695
  // TODO: 1. 解决下面方法中 distance 传参缺未使用的问题;该方法在快捷键中有调用
700
696
  // TODO: 2. review 一下本函数代码逻辑,确认 nodeIdMap 的作用,看是否有优化的空间
701
697
  console.log('distance', distance)
@@ -1387,12 +1383,17 @@ export namespace LogicFlow {
1387
1383
  [key: string]: string | undefined
1388
1384
  }
1389
1385
 
1390
- export type PropertiesType = {
1386
+ export interface PropertiesType {
1391
1387
  width?: number
1392
1388
  height?: number
1393
1389
  rx?: number
1394
1390
  ry?: number
1395
- } & Record<string, any>
1391
+
1392
+ style?: LogicFlow.CommonTheme
1393
+ textStyle?: LogicFlow.CommonTheme
1394
+
1395
+ [key: string]: any
1396
+ }
1396
1397
  export type AttributesType = Record<string, any>
1397
1398
 
1398
1399
  export type VectorData = {
@@ -1530,17 +1531,20 @@ export namespace LogicFlow {
1530
1531
  [key: string]: any
1531
1532
  }
1532
1533
 
1533
- export interface NodeConfig {
1534
+ export interface NodeConfig<P extends PropertiesType = PropertiesType> {
1534
1535
  id?: string
1535
1536
  type: string
1536
1537
  x: number
1537
1538
  y: number
1538
1539
  text?: TextConfig | string
1539
1540
  zIndex?: number
1540
- properties?: PropertiesType
1541
+ properties?: P
1541
1542
  virtual?: boolean // 是否虚拟节点
1542
1543
  rotate?: number
1543
1544
 
1545
+ rotatable?: boolean // 节点是否可旋转
1546
+ resizable?: boolean // 节点是否可缩放
1547
+
1544
1548
  [key: string]: any
1545
1549
  }
1546
1550
 
@@ -1550,7 +1554,7 @@ export namespace LogicFlow {
1550
1554
  [key: string]: unknown
1551
1555
  }
1552
1556
 
1553
- export interface EdgeConfig {
1557
+ export interface EdgeConfig<P extends PropertiesType = PropertiesType> {
1554
1558
  id?: string
1555
1559
  type?: string // TODO: 将所有类型选项列出来;LogicFlow 内部默认为 polyline
1556
1560
 
@@ -1563,7 +1567,7 @@ export namespace LogicFlow {
1563
1567
  text?: TextConfig | string
1564
1568
  pointsList?: Point[]
1565
1569
  zIndex?: number
1566
- properties?: PropertiesType
1570
+ properties?: P
1567
1571
  }
1568
1572
 
1569
1573
  export interface EdgeData extends EdgeConfig {
@@ -1828,8 +1832,8 @@ export namespace LogicFlow {
1828
1832
  }
1829
1833
  export type FocusOnArgsType = FocusOnById | FocusOnByCoordinate
1830
1834
 
1831
- export type BaseNodeModelCtor = typeof BaseNodeModel
1832
- export type BaseEdgeModelCtor = typeof BaseEdgeModel
1835
+ export type BaseNodeModelCtor = typeof BaseNodeModel<PropertiesType>
1836
+ export type BaseEdgeModelCtor = typeof BaseEdgeModel<PropertiesType>
1833
1837
 
1834
1838
  export type GraphElementCtor = BaseNodeModelCtor | BaseEdgeModelCtor
1835
1839
  export type GraphElement = BaseNodeModel | BaseEdgeModel
@@ -32,7 +32,8 @@ type NodeEventArgsPick<
32
32
  | 'e'
33
33
  | 'position'
34
34
  | 'deltaX'
35
- | 'deltaY',
35
+ | 'deltaY'
36
+ | 'index',
36
37
  > = Pick<
37
38
  {
38
39
  /**
@@ -63,6 +64,10 @@ type NodeEventArgsPick<
63
64
  * 鼠标Y轴移动的距离
64
65
  */
65
66
  deltaY: number
67
+ /**
68
+ * Resize 时调整的是哪个控制点
69
+ */
70
+ index: number
66
71
  },
67
72
  T
68
73
  >
@@ -159,7 +164,9 @@ interface NodeEventArgs {
159
164
  /**
160
165
  * 节点缩放
161
166
  */
162
- 'node:resize': NodeEventArgsPick<'preData' | 'data' | 'model'>
167
+ 'node:resize': NodeEventArgsPick<
168
+ 'preData' | 'data' | 'model' | 'deltaX' | 'deltaY' | 'index'
169
+ >
163
170
  }
164
171
 
165
172
  type EdgeEventArgsPick<T extends 'data' | 'e' | 'position'> = Pick<
@@ -403,11 +410,16 @@ interface CommonEventArgs {
403
410
  graphModel: GraphModel
404
411
  }
405
412
  /**
406
- * 画布重新更新后触发. 即 lf.render(graphData)方法被调用后或者改变画布(garphModel)上的属性后触发。
413
+ * 画布重新更新后触发. 即 lf.render(graphData)方法被调用后或者改变画布(graphModel)上的属性后触发。
407
414
  * 如果是主动修改某个特定属性导致画布更新,想要在画布更新后做一些操作,建议注册事件后在回调函数中及时注销该事件,或者使用once事件代替on事件。
408
415
  * 因为其他属性也可能导致画布更新,触发该事件。
409
416
  */
410
- 'graph:updated': Record<string, undefined>
417
+ 'graph:updated': {
418
+ /**
419
+ * 更新后的画布数据
420
+ */
421
+ data: GraphData
422
+ }
411
423
  }
412
424
 
413
425
  type AnchorEventArgsPick<T extends 'data' | 'e' | 'nodeModel' | 'edgeModel'> =
@@ -1,6 +1,6 @@
1
1
  import { EventArgs } from './eventArgs'
2
2
 
3
- export interface EventType<T extends string = string> {
3
+ export type EventType<T extends string = string> = {
4
4
  readonly callback: EventCallback<T>
5
5
  readonly once: boolean
6
6
  }
package/src/index.ts CHANGED
@@ -18,6 +18,7 @@ export * from './options'
18
18
  export * from './keyboard'
19
19
  export * from './constant'
20
20
  export * from './algorithm'
21
+ export * from './event/eventEmitter'
21
22
  export { ElementState, ModelType, ElementType, EventType } from './constant'
22
23
 
23
24
  export { formatAnchorConnectValidateData } from './util/node'
@@ -2,6 +2,8 @@ import { isArray } from 'lodash-es'
2
2
  import Mousetrap, { MousetrapInstance } from 'mousetrap'
3
3
  import LogicFlow from '../LogicFlow'
4
4
 
5
+ export * from './shortcut'
6
+
5
7
  export type Action = 'keypress' | 'keydown' | 'keyup'
6
8
  export type Handler = (e: KeyboardEvent) => void
7
9
 
@@ -1,9 +1,12 @@
1
1
  import { isEmpty } from 'lodash-es'
2
2
  import LogicFlow from '../LogicFlow'
3
+ import { map } from 'lodash-es'
3
4
  import GraphModel from '../model/GraphModel'
4
5
 
5
6
  import NodeData = LogicFlow.NodeData
6
7
  import EdgeData = LogicFlow.EdgeData
8
+ import NodeConfig = LogicFlow.NodeConfig
9
+ import EdgeConfig = LogicFlow.EdgeConfig
7
10
 
8
11
  let selected: LogicFlow.GraphData | null = null
9
12
 
@@ -42,6 +45,70 @@ export function translateEdgeData(edgeData: EdgeData, distance: number) {
42
45
  return edgeData
43
46
  }
44
47
 
48
+ export function transformNodeData(
49
+ nodeData: NodeData,
50
+ distance: number,
51
+ ): NodeConfig {
52
+ const { x, y, text } = nodeData
53
+ // 重新计算 text 的位置,保证粘贴后 text 位置和复制的原节点相对位置一致
54
+ const nextText = text
55
+ ? {
56
+ x: text.x + distance,
57
+ y: text.y + distance,
58
+ value: text.value,
59
+ }
60
+ : undefined
61
+
62
+ return {
63
+ ...nodeData,
64
+ id: '',
65
+ x: x + distance,
66
+ y: y + distance,
67
+ text: nextText,
68
+ }
69
+ }
70
+
71
+ export function transformEdgeData(
72
+ edgeData: EdgeData,
73
+ distance: number,
74
+ ): EdgeConfig {
75
+ const { startPoint, endPoint, pointsList, text, ...edgeConfig } = edgeData
76
+ // 清除原始边的 id
77
+ edgeConfig.id = ''
78
+
79
+ // 重新计算边的位置,包括 startPoint、endPoint、pointsList 以及 text
80
+ // TODO: 看这个是否可以提出一个通用方法,用于重新计算边的位置
81
+ const nextStartPoint = {
82
+ x: startPoint.x + distance,
83
+ y: startPoint.y + distance,
84
+ }
85
+ const nextEndPoint = {
86
+ x: endPoint.x + distance,
87
+ y: endPoint.y + distance,
88
+ }
89
+ const newPointsList: LogicFlow.Point[] = map(pointsList, (point) => {
90
+ return {
91
+ x: point.x + distance,
92
+ y: point.y + distance,
93
+ }
94
+ })
95
+ const nextText = text
96
+ ? {
97
+ ...text,
98
+ x: text.x + distance,
99
+ y: text.y + distance,
100
+ }
101
+ : undefined
102
+
103
+ return {
104
+ ...edgeConfig,
105
+ startPoint: nextStartPoint,
106
+ endPoint: nextEndPoint,
107
+ pointsList: newPointsList,
108
+ text: nextText,
109
+ }
110
+ }
111
+
45
112
  const TRANSLATION_DISTANCE = 40
46
113
  let CHILDREN_TRANSLATION_DISTANCE = 40
47
114
 
@@ -4,6 +4,7 @@ import LogicFlow from '../LogicFlow'
4
4
  import { ElementState } from '../constant'
5
5
 
6
6
  export namespace Model {
7
+ import PropertiesType = LogicFlow.PropertiesType
7
8
  export type AdditionStateDataType = Record<string, unknown>
8
9
  export type PropertyType = Record<string, unknown>
9
10
  export type VectorType = [number, number]
@@ -87,7 +88,20 @@ export namespace Model {
87
88
  y1: number
88
89
  }
89
90
 
90
- export interface BaseModel {
91
+ export interface BoxBounds {
92
+ x: number
93
+ y: number
94
+ width: number
95
+ height: number
96
+ minX: number
97
+ minY: number
98
+ maxX: number
99
+ maxY: number
100
+ centerX: number
101
+ centerY: number
102
+ }
103
+
104
+ export interface BaseModel<P extends PropertiesType = PropertiesType> {
91
105
  /**
92
106
  * 节点或边对应的 ID.
93
107
  *
@@ -140,8 +154,7 @@ export namespace Model {
140
154
  * 此属性控制的是第二种。节点和边在删除、调整的同时,其关联的文本也会对应删除、调整。
141
155
  */
142
156
  text: LogicFlow.TextConfig
143
-
144
- properties: Record<string, unknown>
157
+ properties: P
145
158
 
146
159
  isSelected: boolean // 元素是否被选中
147
160
  isHovered: boolean // 鼠标是否悬停在元素上
@@ -1,4 +1,4 @@
1
- import { assign, isBoolean, pick } from 'lodash-es'
1
+ import { assign, isBoolean, isUndefined, pick } from 'lodash-es'
2
2
  import { observable, action } from 'mobx'
3
3
  import { TextMode } from '../constant'
4
4
 
@@ -206,7 +206,7 @@ export class EditConfigModel {
206
206
  @observable textDraggable = false
207
207
  // 节点
208
208
  @observable nodeTextEdit = true
209
- @observable nodeTextDraggable = true
209
+ @observable nodeTextDraggable = false
210
210
  @observable nodeTextMultiple = false // 是否支持多个节点文本
211
211
  @observable nodeTextVertical = false // 节点文本朝向是否是纵向
212
212
  @observable nodeTextMode = TextMode.TEXT // 节点文本模式
@@ -279,24 +279,24 @@ export class EditConfigModel {
279
279
  }
280
280
 
281
281
  // 如果不传,默认undefined表示允许文本编辑
282
- if (textEdit === false) {
282
+ if (!isUndefined(textEdit)) {
283
283
  assign(conf, {
284
- nodeTextEdit: false,
285
- edgeTextEdit: false,
284
+ nodeTextEdit: textEdit,
285
+ edgeTextEdit: textEdit,
286
286
  })
287
287
  }
288
288
 
289
- if (textMode) {
289
+ if (!isUndefined(textDraggable)) {
290
290
  assign(conf, {
291
- nodeTextMode: textMode,
292
- edgeTextMode: textMode,
291
+ nodeTextDraggable: textDraggable,
292
+ edgeTextDraggable: textDraggable,
293
293
  })
294
294
  }
295
295
 
296
- if (textDraggable === false) {
296
+ if (textMode) {
297
297
  assign(conf, {
298
- nodeTextDraggable: false,
299
- edgeTextDraggable: false,
298
+ nodeTextMode: textMode,
299
+ edgeTextMode: textMode,
300
300
  })
301
301
  }
302
302
 
@@ -1,4 +1,4 @@
1
- import { find, forEach, isObject, map } from 'lodash-es'
1
+ import { find, forEach, map } from 'lodash-es'
2
2
  import { action, computed, observable } from 'mobx'
3
3
  import {
4
4
  BaseEdgeModel,
@@ -789,7 +789,7 @@ export class GraphModel {
789
789
  if (nodeX && nodeY) {
790
790
  node.x = snapToGrid(nodeX, this.gridSize)
791
791
  node.y = snapToGrid(nodeY, this.gridSize)
792
- if (isObject(node.text)) {
792
+ if (typeof node.text === 'object' && node.text !== null) {
793
793
  // 原来的处理是:node.text.x -= getGridOffset(nodeX, this.gridSize)
794
794
  // 由于snapToGrid()使用了Math.round()四舍五入的做法,因此无法判断需要执行
795
795
  // node.text.x = node.text.x + getGridOffset()
@@ -815,7 +815,7 @@ export class GraphModel {
815
815
  data.x += 30
816
816
  data.y += 30
817
817
  data.id = ''
818
- if (isObject(data.text)) {
818
+ if (typeof data.text === 'object' && data.text !== null) {
819
819
  data.text.x += 30
820
820
  data.text.y += 30
821
821
  }
@@ -22,12 +22,15 @@ import Point = LogicFlow.Point
22
22
  import EdgeData = LogicFlow.EdgeData
23
23
  import EdgeConfig = LogicFlow.EdgeConfig
24
24
  import TextConfig = LogicFlow.TextConfig
25
+ import PropertiesType = LogicFlow.PropertiesType
25
26
 
26
- export interface IBaseEdgeModel extends Model.BaseModel {
27
+ export interface IBaseEdgeModel<P extends PropertiesType>
28
+ extends Model.BaseModel<P> {
27
29
  /**
28
30
  * model 基础类型,固定为 edge
29
31
  */
30
32
  readonly BaseType: ElementType.EDGE
33
+ properties: P
31
34
 
32
35
  sourceNodeId: string
33
36
  targetNodeId: string
@@ -46,7 +49,9 @@ export interface IBaseEdgeModel extends Model.BaseModel {
46
49
  arrowConfig?: LogicFlow.ArrowConfig
47
50
  }
48
51
 
49
- export class BaseEdgeModel implements IBaseEdgeModel {
52
+ export class BaseEdgeModel<P extends PropertiesType = PropertiesType>
53
+ implements IBaseEdgeModel<P>
54
+ {
50
55
  readonly BaseType = ElementType.EDGE
51
56
  static BaseType: ElementType = ElementType.EDGE
52
57
 
@@ -66,7 +71,7 @@ export class BaseEdgeModel implements IBaseEdgeModel {
66
71
  draggable: false,
67
72
  editable: true,
68
73
  }
69
- @observable properties: Record<string, unknown> = {}
74
+ @observable properties: P
70
75
  @observable points = ''
71
76
  @observable pointsList: Point[] = []
72
77
 
@@ -104,8 +109,10 @@ export class BaseEdgeModel implements IBaseEdgeModel {
104
109
  };
105
110
  [propName: string]: unknown // 支持自定义
106
111
 
107
- constructor(data: EdgeConfig, graphModel: GraphModel) {
112
+ constructor(data: EdgeConfig<P>, graphModel: GraphModel) {
108
113
  this.graphModel = graphModel
114
+ this.properties = data.properties ?? ({} as P)
115
+
109
116
  this.initEdgeData(data)
110
117
  this.setAttributes()
111
118
  }
@@ -420,7 +427,12 @@ export class BaseEdgeModel implements IBaseEdgeModel {
420
427
  */
421
428
  @action
422
429
  setProperty(key: string, val: any): void {
423
- this.properties[key] = formatData(val)
430
+ const preProperties = toJS(this.properties)
431
+ this.properties = {
432
+ ...preProperties,
433
+ [key]: formatData(val),
434
+ }
435
+
424
436
  this.setAttributes()
425
437
  }
426
438
 
@@ -27,9 +27,11 @@ export class BezierEdgeModel extends BaseEdgeModel {
27
27
  getEdgeStyle() {
28
28
  const { bezier } = this.graphModel.theme
29
29
  const style = super.getEdgeStyle()
30
+ const { style: customStyle = {} } = this.properties
30
31
  return {
31
32
  ...style,
32
33
  ...cloneDeep(bezier),
34
+ ...cloneDeep(customStyle),
33
35
  }
34
36
  }
35
37
  getTextPosition(): Point {
@@ -10,9 +10,11 @@ export class LineEdgeModel extends BaseEdgeModel {
10
10
  getEdgeStyle() {
11
11
  const { line } = this.graphModel.theme
12
12
  const style = super.getEdgeStyle()
13
+ const { style: customStyle = {} } = this.properties
13
14
  return {
14
15
  ...style,
15
16
  ...cloneDeep(line),
17
+ ...cloneDeep(customStyle),
16
18
  }
17
19
  }
18
20
  getTextPosition(): Point {
@@ -41,9 +41,11 @@ export class PolylineEdgeModel extends BaseEdgeModel {
41
41
  getEdgeStyle() {
42
42
  const { polyline } = this.graphModel.theme
43
43
  const style = super.getEdgeStyle()
44
+ const { style: customStyle = {} } = this.properties
44
45
  return {
45
46
  ...style,
46
47
  ...cloneDeep(polyline),
48
+ ...cloneDeep(customStyle),
47
49
  }
48
50
  }
49
51
 
@@ -27,16 +27,19 @@ import NodeConfig = LogicFlow.NodeConfig
27
27
  import NodeData = LogicFlow.NodeData
28
28
  import Point = LogicFlow.Point
29
29
  import CommonTheme = LogicFlow.CommonTheme
30
+ import PropertiesType = LogicFlow.PropertiesType
30
31
 
31
32
  import ResizeInfo = ResizeControl.ResizeInfo
32
33
  import ResizeNodeData = ResizeControl.ResizeNodeData
33
34
  import PCTResizeParams = ResizeControl.PCTResizeParams
34
35
 
35
- export interface IBaseNodeModel extends Model.BaseModel {
36
+ export interface IBaseNodeModel<P extends PropertiesType>
37
+ extends Model.BaseModel<P> {
36
38
  /**
37
39
  * model基础类型,固定为node
38
40
  */
39
41
  readonly BaseType: ElementType.NODE
42
+ properties: P
40
43
 
41
44
  isDragging: boolean
42
45
  isShowAnchor: boolean
@@ -45,7 +48,9 @@ export interface IBaseNodeModel extends Model.BaseModel {
45
48
  setIsShowAnchor: (isShowAnchor: boolean) => void
46
49
  }
47
50
 
48
- export class BaseNodeModel implements IBaseNodeModel {
51
+ export class BaseNodeModel<P extends PropertiesType = PropertiesType>
52
+ implements IBaseNodeModel<P>
53
+ {
49
54
  readonly BaseType = ElementType.NODE
50
55
  static BaseType: ElementType = ElementType.NODE
51
56
 
@@ -62,7 +67,7 @@ export class BaseNodeModel implements IBaseNodeModel {
62
67
  draggable: false,
63
68
  editable: true,
64
69
  }
65
- @observable properties: Record<string, unknown> = {}
70
+ @observable properties: P
66
71
  // 形状属性
67
72
  @observable private _width = 100
68
73
  public get width() {
@@ -101,8 +106,9 @@ export class BaseNodeModel implements IBaseNodeModel {
101
106
  @observable isHittable = true // 细粒度控制节点是否对用户操作进行反应
102
107
  @observable draggable = true
103
108
  @observable visible = true
104
- @observable enableRotate = true
105
- @observable enableResize = true
109
+
110
+ @observable rotatable = true // 节点可旋转
111
+ @observable resizable = true // 节点可缩放
106
112
 
107
113
  // 其它属性
108
114
  graphModel: GraphModel
@@ -138,9 +144,9 @@ export class BaseNodeModel implements IBaseNodeModel {
138
144
  hasSetSourceRules = false; // 用来限制rules的重复值
139
145
  [propName: string]: any // 支持用户自定义属性
140
146
 
141
- constructor(data: NodeConfig, graphModel: GraphModel) {
147
+ constructor(data: NodeConfig<P>, graphModel: GraphModel) {
142
148
  this.graphModel = graphModel
143
- this.properties = data.properties || {}
149
+ this.properties = data.properties ?? ({} as P)
144
150
 
145
151
  this.initNodeData(data)
146
152
  this.setAttributes()
@@ -169,9 +175,9 @@ export class BaseNodeModel implements IBaseNodeModel {
169
175
  /**
170
176
  * @overridable 可以重写
171
177
  * 初始化节点数据
172
- * initNodeData和setAttributes的区别在于
173
- * initNodeData只在节点初始化的时候调用,用于初始化节点的所有属性。
174
- * setAttributes除了初始化调用外,还会在properties发生变化了调用。
178
+ * initNodeData setAttributes 的区别在于
179
+ * initNodeData 只在节点初始化的时候调用,用于初始化节点的所有属性。
180
+ * setAttributes 除了初始化调用外,还会在 properties 发生变化了调用。
175
181
  */
176
182
  public initNodeData(data: NodeConfig) {
177
183
  if (!data.properties) {
@@ -188,7 +194,8 @@ export class BaseNodeModel implements IBaseNodeModel {
188
194
 
189
195
  this.formatText(data)
190
196
  // 在下面又将 NodeConfig 中的数据赋值给了 this,应该会触发 setAttributes,确认是否符合预期
191
- assign(this, pickNodeConfig(data)) // TODO: 确认 constructor 中赋值 properties 是否必要
197
+ // TODO: 确认 constructor 中赋值 properties 是否必要,此处将 NodeConfig 中所有属性赋值给 this,包括 rotate、rotatable,resizable 等
198
+ assign(this, pickNodeConfig(data))
192
199
 
193
200
  const { overlapMode } = this.graphModel
194
201
  if (overlapMode === OverlapMode.INCREASE) {
@@ -363,7 +370,7 @@ export class BaseNodeModel implements IBaseNodeModel {
363
370
  const { textStyle = {} } = this.properties
364
371
  return {
365
372
  ...cloneDeep(nodeText),
366
- ...cloneDeep(textStyle as object),
373
+ ...cloneDeep(textStyle),
367
374
  }
368
375
  }
369
376
 
@@ -743,12 +750,12 @@ export class BaseNodeModel implements IBaseNodeModel {
743
750
  this.isShowAnchor = flag
744
751
  }
745
752
 
746
- @action setEnableRotate(flag = true): void {
747
- this.enableRotate = flag
753
+ @action setRotatable(flag = true): void {
754
+ this.rotatable = flag
748
755
  }
749
756
 
750
- @action setEnableResize(flag = true): void {
751
- this.enableResize = flag
757
+ @action setResizable(flag = true): void {
758
+ this.resizable = flag
752
759
  }
753
760
 
754
761
  @action setHitable(flag = true): void {
@@ -18,9 +18,11 @@ export type ICircleNodeProperties = {
18
18
  [key: string]: any
19
19
  }
20
20
 
21
- export class CircleNodeModel extends BaseNodeModel {
21
+ export class CircleNodeModel<
22
+ P extends ICircleNodeProperties = ICircleNodeProperties,
23
+ > extends BaseNodeModel<P> {
22
24
  modelType = ModelType.CIRCLE_NODE
23
- @observable properties: ICircleNodeProperties = {}
25
+ // @observable properties: ICircleNodeProperties = {}
24
26
  @observable r = 50
25
27
 
26
28
  @computed get width(): number {
@@ -31,9 +33,9 @@ export class CircleNodeModel extends BaseNodeModel {
31
33
  return this.r * 2
32
34
  }
33
35
 
34
- constructor(data: NodeConfig, graphModel: GraphModel) {
36
+ constructor(data: NodeConfig<P>, graphModel: GraphModel) {
35
37
  super(data, graphModel)
36
- this.properties = data.properties || {}
38
+ // this.properties = data.properties || {}
37
39
 
38
40
  this.setAttributes()
39
41
  }
@@ -18,18 +18,20 @@ export type IDiamondNodeProperties = {
18
18
  style?: LogicFlow.CommonTheme
19
19
  textStyle?: LogicFlow.CommonTheme
20
20
 
21
- [key: string]: any
21
+ [key: string]: unknown
22
22
  }
23
23
 
24
- export class DiamondNodeModel extends BaseNodeModel {
24
+ export class DiamondNodeModel<
25
+ P extends IDiamondNodeProperties = IDiamondNodeProperties,
26
+ > extends BaseNodeModel<P> {
25
27
  modelType = ModelType.DIAMOND_NODE
26
28
  @observable rx = 30
27
29
  @observable ry = 50
28
- @observable properties: IDiamondNodeProperties = {}
30
+ // @observable properties: IDiamondNodeProperties = {}
29
31
 
30
- constructor(data: NodeConfig, graphModel: GraphModel) {
32
+ constructor(data: NodeConfig<P>, graphModel: GraphModel) {
31
33
  super(data, graphModel)
32
- this.properties = data.properties || {}
34
+ // this.properties = data.properties || {}
33
35
 
34
36
  this.setAttributes()
35
37
  }
@@ -16,18 +16,20 @@ export type IEllipseNodeProperties = {
16
16
  style?: LogicFlow.CommonTheme
17
17
  textStyle?: LogicFlow.CommonTheme
18
18
 
19
- [key: string]: any
19
+ [key: string]: unknown
20
20
  }
21
21
 
22
- export class EllipseNodeModel extends BaseNodeModel {
22
+ export class EllipseNodeModel<
23
+ P extends IEllipseNodeProperties = IEllipseNodeProperties,
24
+ > extends BaseNodeModel<P> {
23
25
  modelType = ModelType.ELLIPSE_NODE
24
26
  @observable rx = 30
25
27
  @observable ry = 45
26
- @observable properties: IEllipseNodeProperties = {}
28
+ // @observable properties: IEllipseNodeProperties = {}
27
29
 
28
- constructor(data: NodeConfig, graphModel: GraphModel) {
30
+ constructor(data: NodeConfig<P>, graphModel: GraphModel) {
29
31
  super(data, graphModel)
30
- this.properties = data.properties || {}
32
+ // this.properties = data.properties || {}
31
33
 
32
34
  this.setAttributes()
33
35
  }