@logicflow/extension 2.2.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/README.md +16 -0
  2. package/dist/index.css +1 -1
  3. package/dist/index.min.js +1 -1
  4. package/dist/index.min.js.map +1 -1
  5. package/es/NodeResize/node/RectResize.d.ts +0 -6
  6. package/es/NodeResize/node/RectResize.js +2 -11
  7. package/es/bpmn-elements-adapter/json2xml.d.ts +2 -1
  8. package/es/bpmn-elements-adapter/json2xml.js +18 -4
  9. package/es/bpmn-elements-adapter/xml2json.js +2 -7
  10. package/es/components/control/index.d.ts +1 -0
  11. package/es/components/control/index.js +24 -11
  12. package/es/components/mini-map/index.js +1 -1
  13. package/es/dynamic-group/model.d.ts +2 -1
  14. package/es/dynamic-group/model.js +28 -11
  15. package/es/dynamic-group/node.js +1 -0
  16. package/es/index.css +1 -1
  17. package/es/index.d.ts +1 -0
  18. package/es/index.js +2 -0
  19. package/es/insert-node-in-polyline/index.js +11 -35
  20. package/es/materials/curved-edge/index.js +49 -21
  21. package/es/materials/group/GroupNode.d.ts +0 -6
  22. package/es/materials/group/GroupNode.js +1 -6
  23. package/es/pool/LaneModel.d.ts +90 -0
  24. package/es/pool/LaneModel.js +252 -0
  25. package/es/pool/LaneView.d.ts +40 -0
  26. package/es/pool/LaneView.js +202 -0
  27. package/es/pool/PoolModel.d.ts +120 -0
  28. package/es/pool/PoolModel.js +586 -0
  29. package/es/pool/PoolView.d.ts +17 -0
  30. package/es/pool/PoolView.js +76 -0
  31. package/es/pool/constant.d.ts +15 -0
  32. package/es/pool/constant.js +17 -0
  33. package/es/pool/index.d.ts +89 -0
  34. package/es/pool/index.js +524 -0
  35. package/es/pool/utils.d.ts +19 -0
  36. package/es/pool/utils.js +33 -0
  37. package/es/style/index.css +1 -1
  38. package/es/style/raw.d.ts +1 -1
  39. package/es/style/raw.js +1 -1
  40. package/es/tools/label/LabelOverlay.js +3 -3
  41. package/es/tools/label/mediumEditor.d.ts +1 -1
  42. package/es/tools/label/mediumEditor.js +89 -52
  43. package/es/tools/snapshot/index.d.ts +7 -3
  44. package/es/tools/snapshot/index.js +72 -77
  45. package/lib/NodeResize/node/RectResize.d.ts +0 -6
  46. package/lib/NodeResize/node/RectResize.js +1 -10
  47. package/lib/bpmn-elements-adapter/json2xml.d.ts +2 -1
  48. package/lib/bpmn-elements-adapter/json2xml.js +19 -4
  49. package/lib/bpmn-elements-adapter/xml2json.js +2 -7
  50. package/lib/components/control/index.d.ts +1 -0
  51. package/lib/components/control/index.js +24 -11
  52. package/lib/components/mini-map/index.js +1 -1
  53. package/lib/dynamic-group/model.d.ts +2 -1
  54. package/lib/dynamic-group/model.js +28 -11
  55. package/lib/dynamic-group/node.js +1 -0
  56. package/lib/index.css +1 -1
  57. package/lib/index.d.ts +1 -0
  58. package/lib/index.js +2 -0
  59. package/lib/insert-node-in-polyline/index.js +10 -34
  60. package/lib/materials/curved-edge/index.js +49 -21
  61. package/lib/materials/group/GroupNode.d.ts +0 -6
  62. package/lib/materials/group/GroupNode.js +1 -6
  63. package/lib/pool/LaneModel.d.ts +90 -0
  64. package/lib/pool/LaneModel.js +255 -0
  65. package/lib/pool/LaneView.d.ts +40 -0
  66. package/lib/pool/LaneView.js +205 -0
  67. package/lib/pool/PoolModel.d.ts +120 -0
  68. package/lib/pool/PoolModel.js +589 -0
  69. package/lib/pool/PoolView.d.ts +17 -0
  70. package/lib/pool/PoolView.js +79 -0
  71. package/lib/pool/constant.d.ts +15 -0
  72. package/lib/pool/constant.js +20 -0
  73. package/lib/pool/index.d.ts +89 -0
  74. package/lib/pool/index.js +527 -0
  75. package/lib/pool/utils.d.ts +19 -0
  76. package/lib/pool/utils.js +38 -0
  77. package/lib/style/index.css +1 -1
  78. package/lib/style/raw.d.ts +1 -1
  79. package/lib/style/raw.js +1 -1
  80. package/lib/tools/label/LabelOverlay.js +2 -2
  81. package/lib/tools/label/mediumEditor.d.ts +1 -1
  82. package/lib/tools/label/mediumEditor.js +91 -53
  83. package/lib/tools/snapshot/index.d.ts +7 -3
  84. package/lib/tools/snapshot/index.js +72 -77
  85. package/package.json +10 -7
  86. package/.turbo/turbo-build.log +0 -38
  87. package/CHANGELOG.md +0 -1766
  88. package/__test__/bpmn-adapter.test.js +0 -227
  89. package/es/materials/curved-edge/__test__/curved-edge.test.d.ts +0 -1
  90. package/es/materials/curved-edge/__test__/curved-edge.test.js +0 -18
  91. package/jest.config.js +0 -198
  92. package/lib/materials/curved-edge/__test__/curved-edge.test.d.ts +0 -1
  93. package/lib/materials/curved-edge/__test__/curved-edge.test.js +0 -20
  94. package/rollup.config.js +0 -52
  95. package/src/NodeResize/BasicShape/Ellipse.tsx +0 -22
  96. package/src/NodeResize/BasicShape/Polygon.tsx +0 -24
  97. package/src/NodeResize/BasicShape/Rect.tsx +0 -44
  98. package/src/NodeResize/control/Control.tsx +0 -537
  99. package/src/NodeResize/control/ControlGroup.tsx +0 -76
  100. package/src/NodeResize/control/Util.ts +0 -206
  101. package/src/NodeResize/index.ts +0 -26
  102. package/src/NodeResize/node/DiamondResize.tsx +0 -149
  103. package/src/NodeResize/node/EllipseResize.tsx +0 -140
  104. package/src/NodeResize/node/HtmlResize.tsx +0 -125
  105. package/src/NodeResize/node/RectResize.tsx +0 -146
  106. package/src/NodeResize/node/index.ts +0 -4
  107. package/src/bpmn/constant.ts +0 -56
  108. package/src/bpmn/events/EndEvent.ts +0 -73
  109. package/src/bpmn/events/StartEvent.ts +0 -52
  110. package/src/bpmn/events/index.ts +0 -2
  111. package/src/bpmn/flow/SequenceFlow.ts +0 -25
  112. package/src/bpmn/flow/index.ts +0 -1
  113. package/src/bpmn/gateways/ExclusiveGateway.ts +0 -71
  114. package/src/bpmn/gateways/index.ts +0 -1
  115. package/src/bpmn/getBpmnId.ts +0 -31
  116. package/src/bpmn/index.ts +0 -60
  117. package/src/bpmn/tasks/ServiceTask.ts +0 -63
  118. package/src/bpmn/tasks/UserTask.ts +0 -64
  119. package/src/bpmn/tasks/index.ts +0 -2
  120. package/src/bpmn-adapter/bpmnIds.ts +0 -31
  121. package/src/bpmn-adapter/index.ts +0 -835
  122. package/src/bpmn-adapter/json2xml.ts +0 -127
  123. package/src/bpmn-adapter/xml2json.ts +0 -544
  124. package/src/bpmn-elements/README.md +0 -223
  125. package/src/bpmn-elements/__tests__/definition.test.js +0 -72
  126. package/src/bpmn-elements/index.d.ts +0 -26
  127. package/src/bpmn-elements/index.ts +0 -107
  128. package/src/bpmn-elements/presets/Event/EndEventFactory.ts +0 -114
  129. package/src/bpmn-elements/presets/Event/IntermediateCatchEvent.ts +0 -108
  130. package/src/bpmn-elements/presets/Event/IntermediateThrowEvent.ts +0 -109
  131. package/src/bpmn-elements/presets/Event/StartEventFactory.ts +0 -114
  132. package/src/bpmn-elements/presets/Event/boundaryEventFactory.ts +0 -117
  133. package/src/bpmn-elements/presets/Event/index.ts +0 -14
  134. package/src/bpmn-elements/presets/Flow/flow.d.ts +0 -6
  135. package/src/bpmn-elements/presets/Flow/index.ts +0 -8
  136. package/src/bpmn-elements/presets/Flow/manhattan.ts +0 -691
  137. package/src/bpmn-elements/presets/Flow/sequenceFlow.ts +0 -65
  138. package/src/bpmn-elements/presets/Gateway/gateway.ts +0 -107
  139. package/src/bpmn-elements/presets/Gateway/index.ts +0 -23
  140. package/src/bpmn-elements/presets/Pool/Lane.ts +0 -211
  141. package/src/bpmn-elements/presets/Pool/Pool.ts +0 -284
  142. package/src/bpmn-elements/presets/Pool/index.ts +0 -89
  143. package/src/bpmn-elements/presets/Task/index.ts +0 -122
  144. package/src/bpmn-elements/presets/Task/subProcess.ts +0 -189
  145. package/src/bpmn-elements/presets/Task/task.ts +0 -193
  146. package/src/bpmn-elements/presets/icons.ts +0 -155
  147. package/src/bpmn-elements/utils.ts +0 -52
  148. package/src/bpmn-elements-adapter/README.md +0 -293
  149. package/src/bpmn-elements-adapter/__tests__/adapter_in.test.js +0 -528
  150. package/src/bpmn-elements-adapter/__tests__/adapter_out.test.js +0 -569
  151. package/src/bpmn-elements-adapter/constant.ts +0 -76
  152. package/src/bpmn-elements-adapter/index.ts +0 -1134
  153. package/src/bpmn-elements-adapter/json2xml.ts +0 -91
  154. package/src/bpmn-elements-adapter/xml2json.ts +0 -548
  155. package/src/components/context-menu/index.ts +0 -253
  156. package/src/components/control/index.ts +0 -141
  157. package/src/components/dnd-panel/index.ts +0 -137
  158. package/src/components/highlight/index.ts +0 -227
  159. package/src/components/menu/index.ts +0 -748
  160. package/src/components/mini-map/index.ts +0 -686
  161. package/src/components/selection-select/index.ts +0 -387
  162. package/src/dynamic-group/index.ts +0 -775
  163. package/src/dynamic-group/model.ts +0 -562
  164. package/src/dynamic-group/node.ts +0 -288
  165. package/src/dynamic-group/utils.ts +0 -46
  166. package/src/index.less +0 -1
  167. package/src/index.ts +0 -45
  168. package/src/insert-node-in-polyline/edge.ts +0 -175
  169. package/src/insert-node-in-polyline/index.ts +0 -187
  170. package/src/materials/curved-edge/__test__/curved-edge.test.ts +0 -46
  171. package/src/materials/curved-edge/index.ts +0 -185
  172. package/src/materials/group/GroupNode.ts +0 -442
  173. package/src/materials/group/index.ts +0 -542
  174. package/src/materials/node-selection/index.ts +0 -380
  175. package/src/mindmap/fakerRoot.ts +0 -19
  176. package/src/mindmap/index.ts +0 -328
  177. package/src/mindmap/markContent.ts +0 -81
  178. package/src/mindmap/markContentOption.ts +0 -81
  179. package/src/mindmap/markEntity.ts +0 -82
  180. package/src/mindmap/markRoot.ts +0 -83
  181. package/src/mindmap/theme.ts +0 -11
  182. package/src/rect-label-node/RectLabelNodeView.ts +0 -33
  183. package/src/rect-label-node/index.ts +0 -15
  184. package/src/style/index.less +0 -342
  185. package/src/style/raw.ts +0 -295
  186. package/src/tools/auto-layout/index.ts +0 -282
  187. package/src/tools/flow-path/index.ts +0 -233
  188. package/src/tools/label/Label.tsx +0 -357
  189. package/src/tools/label/LabelModel.ts +0 -83
  190. package/src/tools/label/LabelOverlay.tsx +0 -158
  191. package/src/tools/label/algorithm.ts +0 -42
  192. package/src/tools/label/index.ts +0 -479
  193. package/src/tools/label/mediumEditor.ts +0 -94
  194. package/src/tools/label/utils.ts +0 -395
  195. package/src/tools/proximity-connect/index.ts +0 -435
  196. package/src/tools/snapshot/README.md +0 -145
  197. package/src/tools/snapshot/index.ts +0 -718
  198. package/src/tools/snapshot/utils.ts +0 -163
  199. package/src/turbo-adapter/index.ts +0 -212
  200. package/stats.html +0 -4842
  201. package/tsconfig.json +0 -18
@@ -1,233 +0,0 @@
1
- /**
2
- * 路径插件,此插件支持获取绘制的图中所有的路径。
3
- * 需要指定开始节点类型。
4
- */
5
-
6
- import LogicFlow from '@logicflow/core'
7
- import { getBpmnId } from '../../bpmn/getBpmnId'
8
-
9
- type Path = {
10
- routeId: string
11
- name: string
12
- elements: string[]
13
- type: number
14
- }
15
-
16
- type RawPath = Path & {
17
- similarElement: RawPath
18
- weight: number
19
- }
20
-
21
- type PathNodeData = {
22
- id: string
23
- data: any
24
- nextNodes: string[]
25
- }
26
-
27
- export class FlowPath {
28
- lf: LogicFlow
29
- paths: RawPath[]
30
- startNodeType?: string
31
- static pluginName = 'flowPath'
32
-
33
- constructor({ lf }) {
34
- this.lf = lf
35
- this.paths = []
36
- // 给lf添加方法
37
- lf.getPathes = () => {
38
- if (!this.startNodeType) {
39
- throw new Error('需要预先指定开始节点类型')
40
- }
41
- return this.getPathes()
42
- }
43
-
44
- lf.setRawPaths = (paths: Path[]) => {
45
- this.setPathes(paths)
46
- }
47
-
48
- lf.getRawPathes = () => this.paths
49
-
50
- lf.setStartNodeType = (type: string) => {
51
- this.startNodeType = type
52
- }
53
- }
54
-
55
- setPathes(paths) {
56
- this.paths = paths.map(({ routeId, name, elements, type }) => ({
57
- routeId,
58
- name,
59
- elements,
60
- type,
61
- similarElement: null,
62
- weight: 0,
63
- }))
64
- }
65
-
66
- getPathes() {
67
- const graphData = this.lf.getGraphRawData()
68
- const nodesMap: Map<string, PathNodeData> = new Map()
69
- const startNodeIds: string[] = []
70
- graphData.nodes.forEach((node) => {
71
- nodesMap.set(node.id, {
72
- id: node.id,
73
- data: node,
74
- nextNodes: [],
75
- })
76
- if (node.type === this.startNodeType) {
77
- startNodeIds.push(node.id)
78
- }
79
- })
80
- graphData.edges.forEach((edge) => {
81
- const node = nodesMap.get(edge.sourceNodeId)
82
- node?.nextNodes.push(edge.targetNodeId)
83
- })
84
- let pathElements: string[][] = []
85
- startNodeIds.forEach((id) => {
86
- const node = nodesMap.get(id)
87
- if (node) {
88
- pathElements = pathElements.concat(
89
- this.findPathElements(node, nodesMap, []),
90
- )
91
- }
92
- })
93
- return this.getNewPathes(pathElements)
94
- }
95
-
96
- private findPathElements(
97
- node: PathNodeData,
98
- nodesMap: Map<string, PathNodeData>,
99
- elements: string[] = [],
100
- ) {
101
- const newPaths: string[] = [...elements]
102
- newPaths.push(node.id)
103
- if (node.nextNodes.length === 0) {
104
- return [newPaths]
105
- }
106
- let subPath = []
107
- for (let i = 0; i < node.nextNodes.length; i++) {
108
- const n = nodesMap.get(node.nextNodes[i])
109
- let p
110
- // 循环路径
111
- if (n) {
112
- const idx = newPaths.indexOf(n.id)
113
- if (idx !== -1) {
114
- p = [[...newPaths.slice(idx), n.id]]
115
- } else {
116
- p = this.findPathElements(n, nodesMap, [...newPaths])
117
- }
118
- subPath = subPath.concat(p)
119
- }
120
- }
121
- return subPath
122
- }
123
-
124
- /**
125
- * 设置路径id
126
- * 如果存在原始路径Id, 则需要比较新路径是否在原始路径中存在相似路径
127
- * 如果有,则尽量使用原始路径。
128
- * 相似路径
129
- * 1. 如果所有的节点都相同,则必定为同一路径。(包括顺序不同)
130
- * 2. 如果新路径比原来路径少了或者多了部分节点,则记录为相似路径。基于不同的差异,标记不同的权重。
131
- * 3. 基于新路径在旧路径占用权限,设置新路径Id.
132
- * 4. 如果某一条旧路径被多条新路径标记为相同的权重,则这两条新路径都使用新Id.
133
- */
134
- private getNewPathes(pathElements) {
135
- const paths: any = []
136
- // 由于循环路径不包括开始,所以存在重复的情况,此处去重。
137
- const LoopSet = new Set()
138
- pathElements.forEach((elements) => {
139
- const routeId = this.getNewId('path')
140
- const name = this.getNewId('路径')
141
- const isLoop = this.isLoopPath(elements)
142
- const elementStr = elements.join(',')
143
- if (!LoopSet.has(elementStr)) {
144
- LoopSet.add(elementStr)
145
- paths.push({
146
- routeId,
147
- name,
148
- elements,
149
- type: isLoop,
150
- weight: 0,
151
- similarElement: '',
152
- })
153
- }
154
- })
155
- const oldPaths = JSON.parse(JSON.stringify(this.paths))
156
- // 1) 找到所有路径最相似的路径, 给旧路径标记其最接近的路径
157
- paths.forEach((newPath) => {
158
- for (let i = 0; i < oldPaths.length; i++) {
159
- const oldPath = oldPaths[i]
160
- const weight = this.similar2Path(
161
- [...newPath.elements],
162
- [...oldPath.elements],
163
- )
164
- if (weight > newPath.weight && oldPath.weight <= weight) {
165
- newPath.weight = weight
166
- newPath.similarElement = oldPath
167
- if (weight === oldPath.weight && oldPath.similarElement) {
168
- // 特殊处理,如果两个路径都与同一条旧路径有相似的权重,则这两个路径的相似路径都置空
169
- oldPath.similarElement.similarElement = null
170
- oldPath.similarElement.weight = 0
171
- oldPath.similarElement = null
172
- oldPath.weight = 0
173
- } else {
174
- oldPath.similarElement = newPath
175
- oldPath.weight = weight
176
- }
177
- }
178
- }
179
- })
180
- // 2) 再次遍历所有路径,如果该路径的相似路径对应的相似路径是自己,那么就设置该路径id和name为其相似路径。
181
- paths.forEach((newPath) => {
182
- if (
183
- newPath.similarElement &&
184
- newPath.similarElement.similarElement === newPath
185
- ) {
186
- newPath.routeId = newPath.similarElement.routeId
187
- newPath.name = newPath.similarElement.name
188
- }
189
- delete newPath.similarElement
190
- delete newPath.weight
191
- })
192
-
193
- this.setPathes(paths)
194
- return paths
195
- }
196
-
197
- private similar2Path(x, y) {
198
- let z = 0
199
- const s = x.length + y.length
200
-
201
- x.sort()
202
- y.sort()
203
- let a = x.shift()
204
- let b = y.shift()
205
-
206
- while (a !== undefined && b !== undefined) {
207
- if (a === b) {
208
- z++
209
- a = x.shift()
210
- b = y.shift()
211
- } else if (a < b) {
212
- a = x.shift()
213
- } else if (a > b) {
214
- b = y.shift()
215
- }
216
- }
217
- return (z / s) * 200
218
- }
219
-
220
- private getNewId(prefix) {
221
- return `${prefix}_${getBpmnId()}`
222
- }
223
-
224
- /**
225
- * 判断是否为循环路径
226
- * 由于前面进行了特殊处理,将循环部分单独提出来作为路径
227
- * 所有循环路径必定开始节点等于结束节点。
228
- */
229
- private isLoopPath(elements) {
230
- const { length } = elements
231
- return elements.indexOf(elements[length - 1]) !== length - 1 ? 1 : 0
232
- }
233
- }
@@ -1,357 +0,0 @@
1
- import LogicFlow, {
2
- BaseEdgeModel,
3
- BaseNodeModel,
4
- Component,
5
- createRef,
6
- ElementState,
7
- GraphModel,
8
- IDragParams,
9
- observer,
10
- StepDrag,
11
- } from '@logicflow/core'
12
- import classNames from 'classnames'
13
- import LabelModel from './LabelModel'
14
- import { findIndex } from 'lodash-es'
15
-
16
- import LabelConfig = LogicFlow.LabelConfig
17
-
18
- export interface ILabelProps {
19
- label: LabelModel
20
- element: BaseNodeModel | BaseEdgeModel
21
- graphModel: GraphModel
22
- }
23
-
24
- export interface ILabelState {
25
- isEditing: boolean
26
- isHovered: boolean
27
- isDragging: boolean
28
- isSelected: boolean
29
- }
30
-
31
- @observer
32
- export class Label extends Component<ILabelProps, ILabelState> {
33
- textRef = createRef<HTMLDivElement>()
34
- stepDrag: StepDrag
35
-
36
- constructor(props: ILabelProps) {
37
- super(props)
38
- const {
39
- label,
40
- graphModel: { gridSize, eventCenter },
41
- } = props
42
-
43
- this.stepDrag = new StepDrag({
44
- onDragging: this.handleDragging,
45
- onDragEnd: this.handleDragEnd,
46
- step: gridSize,
47
- eventType: 'LABEL',
48
- model: label,
49
- eventCenter,
50
- })
51
-
52
- this.state = {
53
- isEditing: false,
54
- isHovered: false,
55
- isDragging: false,
56
- isSelected: false,
57
- }
58
- }
59
-
60
- setHoverOn = () => {
61
- const { element } = this.props
62
- if (element.isDragging || this.state.isHovered) return // 当节点或边在拖拽中时,不触发 hover 态
63
-
64
- this.setState({ isHovered: true })
65
- element.setHovered(true)
66
- }
67
- setHoverOff = () => {
68
- const { element } = this.props
69
- if (!this.state.isHovered) return
70
-
71
- this.setState({ isHovered: false })
72
- element.setHovered(false)
73
- }
74
-
75
- handleMouseDown = (e: PointerEvent) => {
76
- const { label, graphModel } = this.props
77
- const {
78
- editConfigModel: { nodeTextDraggable },
79
- } = graphModel
80
- // 当 label 允许拖拽 且不处于拖拽状态、不处于编辑状态时, StepDrag 开启拖拽
81
- if (
82
- (label.draggable ?? nodeTextDraggable) &&
83
- !this.state.isDragging &&
84
- !this.state.isEditing
85
- ) {
86
- this.stepDrag.handleMouseDown(e)
87
- }
88
- }
89
- handleMouseUp = (e: PointerEvent) => {
90
- if (this.state.isDragging) {
91
- this.stepDrag.handleMouseUp(e)
92
- }
93
- }
94
- handleDragging = ({ deltaX, deltaY }: IDragParams) => {
95
- if (!this.state.isDragging) {
96
- this.setState({ isDragging: true })
97
- }
98
- const { label, graphModel } = this.props
99
-
100
- // DONE: 添加缩放时拖拽的逻辑,对 deltaX 和 deltaY 进行按比例缩放
101
- const { transformModel } = graphModel
102
- const [curDeltaX, curDeltaY] = transformModel.fixDeltaXY(deltaX, deltaY)
103
-
104
- this.setElementModelLabelInfo({
105
- x: label.x + curDeltaX,
106
- y: label.y + curDeltaY,
107
- })
108
-
109
- graphModel.eventCenter.emit('label:drag', {
110
- data: label.getData(),
111
- model: label,
112
- })
113
- }
114
- handleDragEnd = () => {
115
- this.setState({ isDragging: false })
116
- }
117
-
118
- handleClick = (e: MouseEvent) => {
119
- const { label, element, graphModel } = this.props
120
- // 更新当前Label选中状态
121
- element.setSelected(!this.state.isSelected)
122
- this.setState({ isSelected: !this.state.isSelected })
123
- this.setElementModelLabelInfo({
124
- isSelected: true,
125
- })
126
- graphModel.eventCenter.emit('label:click', {
127
- data: label.getData(),
128
- e,
129
- model: element,
130
- })
131
- }
132
-
133
- handleDbClick = (e: MouseEvent) => {
134
- const { label, element, graphModel } = this.props
135
- graphModel.eventCenter.emit('label:dblclick', {
136
- data: label.getData(),
137
- e,
138
- model: element,
139
- })
140
-
141
- if (!label.editable) {
142
- element.setSelected(true)
143
- return
144
- }
145
- element.setSelected()
146
- element.setElementState(ElementState.TEXT_EDIT)
147
-
148
- this.setState({ isEditing: true })
149
-
150
- // DONE: 触发当前 label 的 focus 事件,设置内容可编辑,且在文本最后添加光标
151
- if (this.textRef.current) {
152
- this.textRef.current.contentEditable = 'true'
153
- this.textRef.current.focus()
154
-
155
- const range = document.createRange()
156
- const selection = window.getSelection()
157
- range.selectNodeContents(this.textRef.current)
158
- range.collapse(false)
159
- selection?.removeAllRanges()
160
- selection?.addRange(range)
161
- }
162
- }
163
- handleBlur = (e: FocusEvent) => {
164
- const {
165
- label,
166
- element,
167
- graphModel: { eventCenter },
168
- } = this.props
169
-
170
- // DONE: 触发 LABEL:BLUR 事件,并抛出相关的事件
171
- eventCenter.emit('label:blur', {
172
- e,
173
- model: element,
174
- data: label.getData(),
175
- element: this.textRef.current,
176
- })
177
-
178
- this.setState({
179
- isDragging: false,
180
- isHovered: false,
181
- isSelected: false,
182
- })
183
- }
184
-
185
- handleInput = (e: InputEvent) => {
186
- const { label, graphModel } = this.props
187
- graphModel.eventCenter.emit('label:input', {
188
- e,
189
- data: label.getData(),
190
- })
191
- }
192
-
193
- setElementModelLabelInfo(data) {
194
- const { label, element, graphModel } = this.props
195
- const {
196
- properties: { _label },
197
- } = element
198
- const elementLabel = _label as LabelConfig[]
199
- const idx = findIndex(elementLabel, (cur) => cur.id === label.id)
200
-
201
- const target = elementLabel[idx]
202
- elementLabel[idx] = {
203
- ...target,
204
- ...data,
205
- }
206
-
207
- const targetElem = graphModel.getElement(element.id)
208
- targetElem?.setProperty('_label', elementLabel)
209
- }
210
-
211
- // 重新计算 Label 大小
212
- reCalcLabelSize = () => {}
213
-
214
- // TODO:如何处理 Label zIndex 的问题, Label 永远会比节点层级高
215
- // 当 Label 被元素遮盖时,隐藏它
216
-
217
- componentDidMount() {
218
- const { label, element, graphModel } = this.props
219
-
220
- // 在点击元素、边或者画布 时,结束 Label 的编辑态
221
- graphModel.eventCenter.on(
222
- 'blank:click,node:click,edge:click,label:click',
223
- ({ data }) => {
224
- // 点击的不是label 、点击的不是当前label、点击的是当前label,且当前 label 处于选中态
225
- // 则取消选中态
226
- if (
227
- data?.type !== 'label' ||
228
- (data.type === 'label' && data.id !== label.id) ||
229
- this.state.isSelected
230
- ) {
231
- this.setState({ isSelected: false })
232
- }
233
- // 点击的不是label 、点击的不是当前label、点击的是当前label,且当前 label 处于编辑态
234
- // 则结束编辑态
235
- if (
236
- (data?.type !== 'label' ||
237
- (data.type == 'label' && data.id !== label.id)) &&
238
- this.state.isEditing
239
- ) {
240
- this.setState({ isEditing: false })
241
-
242
- const value = this.textRef.current?.innerText ?? ''
243
- const content = this.textRef.current?.innerHTML ?? ''
244
-
245
- this.setElementModelLabelInfo({
246
- value,
247
- content,
248
- isSelected: false,
249
- })
250
-
251
- element.setElementState(ElementState.DEFAULT)
252
- }
253
- // 点击的不是label 、点击的不是当前label、点击的是当前label,且当前 label 的文本DOM存在
254
- // 则结束文本DOM的编辑态
255
- if (
256
- (data?.type !== 'label' ||
257
- (data.type == 'label' && data.id !== label.id)) &&
258
- this.textRef.current
259
- ) {
260
- this.textRef.current.contentEditable = 'false'
261
- }
262
- },
263
- )
264
- // TODO: 节点拖拽结束后,更新 Label 的位置
265
- // eventCenter.on('node:drag', () => {})
266
- // eventCenter.on('node:drop', () => {})
267
- // eventCenter.on('node:mousemove', () => {})
268
- //
269
- // eventCenter.on('node:properties-change,node:properties-delete', () => {})
270
- }
271
-
272
- componentDidUpdate() {
273
- // snapshot: any, // previousState: Readonly<ILabelState>, // previousProps: Readonly<ILabelProps>,
274
- // console.log('Label componentDidUpdate')
275
- // console.log('previousProps', previousProps)
276
- // console.log('previousState', previousState)
277
- // console.log('snapshot', snapshot)
278
- }
279
-
280
- componentWillUnmount() {
281
- const { graphModel } = this.props
282
- graphModel.eventCenter.off('blank:click,node:click,edge:click')
283
- }
284
-
285
- // TODO: 当某一个标签更新时,如何避免其它标签的更新
286
- // shouldComponentUpdate or memo
287
-
288
- render() {
289
- const { label, element, graphModel } = this.props
290
- const { isDragging, isHovered, isSelected, isEditing } = this.state
291
- const { transformModel } = graphModel
292
- const { transform } = transformModel.getTransformStyle()
293
- const {
294
- id,
295
- x,
296
- y,
297
- zIndex,
298
- vertical,
299
- style,
300
- rotate,
301
- content,
302
- labelWidth,
303
- textOverflowMode,
304
- } = label
305
-
306
- const maxLabelWidth: number =
307
- labelWidth ?? (element.BaseType === 'node' ? element.width - 20 : 80)
308
- const containerStyle = {
309
- left: `${x - maxLabelWidth / 2}px`,
310
- top: `${y - 10}px`,
311
- width: `${maxLabelWidth}px`,
312
- height: '20px',
313
- zIndex: zIndex ?? 1,
314
- transform: rotate
315
- ? `${transform} rotate(${rotate}deg)`
316
- : `${transform} rotate(${vertical ? -0.25 : 0}turn)`,
317
- }
318
- return (
319
- <div
320
- id={`element-container-${id}`}
321
- className={classNames('lf-label-editor-container')}
322
- style={containerStyle}
323
- onPointerDown={this.handleMouseDown}
324
- onPointerUp={this.handleMouseUp}
325
- onClick={this.handleClick}
326
- onDblClick={this.handleDbClick}
327
- onBlur={this.handleBlur}
328
- onMouseEnter={this.setHoverOn}
329
- onMouseOver={this.setHoverOn}
330
- onMouseLeave={this.setHoverOff}
331
- >
332
- <div
333
- ref={this.textRef}
334
- id={`editor-container-${id}`}
335
- className={classNames('lf-label-editor', {
336
- 'lf-label-editor-dragging': isDragging,
337
- 'lf-label-editor-editing': isEditing,
338
- 'lf-label-editor-hover': !isEditing && (isHovered || isSelected),
339
- [`lf-label-editor-${textOverflowMode}`]: !isEditing,
340
- })}
341
- onInput={this.handleInput}
342
- style={{
343
- maxWidth: `${maxLabelWidth}px`,
344
- boxSizing: 'border-box',
345
- display: 'inline-block',
346
- background:
347
- isEditing || element.BaseType === 'edge' ? '#fff' : 'transparent',
348
- ...style,
349
- }}
350
- dangerouslySetInnerHTML={{ __html: content }}
351
- ></div>
352
- </div>
353
- )
354
- }
355
- }
356
-
357
- export default Label
@@ -1,83 +0,0 @@
1
- import LogicFlow, {
2
- BaseEdgeModel,
3
- BaseNodeModel,
4
- GraphModel,
5
- LogicFlowUtil,
6
- h,
7
- observable,
8
- toJS,
9
- } from '@logicflow/core'
10
- import { assign } from 'lodash-es'
11
-
12
- import LabelData = LogicFlow.LabelData
13
- import LabelConfig = LogicFlow.LabelConfig
14
- import GraphElement = LogicFlow.GraphElement
15
-
16
- // export type ILabelConfig = {}
17
- const { createUuid } = LogicFlowUtil
18
-
19
- export class LabelModel {
20
- id: string
21
- type: string = 'label' // 目前写死,后续可以根据业务需求进行扩展
22
-
23
- @observable x!: number
24
- @observable y!: number
25
- @observable content: string = ''
26
- @observable value: string = ''
27
- @observable rotate?: number
28
- @observable style: h.JSX.CSSProperties = {}
29
-
30
- @observable zIndex?: number
31
- @observable vertical: boolean = false // 文字是否垂直显示
32
- @observable editable: boolean = true // label 是否可编辑
33
- @observable draggable: boolean = true // label 是否可拖拽
34
- @observable labelWidth?: number
35
- @observable textOverflowMode:
36
- | 'ellipsis'
37
- | 'wrap'
38
- | 'clip'
39
- | 'nowrap'
40
- | 'default' = 'default' // Label 节点的文本溢出模式
41
-
42
- // TODO: 后续看 label 是否可以独立存在,不依赖节点 or 边
43
- element: BaseNodeModel | BaseEdgeModel // 当前节点关联的元素 Model
44
- graphModel: GraphModel
45
-
46
- constructor(
47
- config: LabelConfig,
48
- element: GraphElement,
49
- graphModel: GraphModel,
50
- ) {
51
- this.element = element
52
- this.graphModel = graphModel
53
- this.id = config.id ?? createUuid()
54
-
55
- this.initLabelData(config)
56
- }
57
-
58
- initLabelData(config: LabelConfig): void {
59
- assign(this, config)
60
- }
61
-
62
- getData(): LabelData {
63
- return {
64
- id: this.id,
65
- x: this.x,
66
- y: this.y,
67
- type: 'label',
68
- content: this.content,
69
- value: this.value,
70
- rotate: this.rotate,
71
- style: toJS(this.style),
72
-
73
- draggable: this.draggable,
74
- editable: this.editable,
75
- labelWidth: this.labelWidth,
76
- textOverflowMode: this.textOverflowMode,
77
-
78
- vertical: this.vertical,
79
- }
80
- }
81
- }
82
-
83
- export default LabelModel