@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,253 +0,0 @@
1
- import LogicFlow from '@logicflow/core'
2
-
3
- type MenuItem = {
4
- icon: string
5
- callback?: (data) => void
6
- type?: string
7
- className?: string
8
- properties: Record<string, any>
9
- }
10
-
11
- export type ContextMenuNodeData = {
12
- sourceId: string
13
- x: number
14
- y: number
15
- properties: Record<string, unknown>
16
- type?: string
17
- }
18
-
19
- const COMMON_TYPE_KEY = 'menu-common'
20
- const NEXT_X_DISTANCE = 200
21
- const NEXT_Y_DISTANCE = 100
22
-
23
- export class ContextMenu {
24
- static pluginName = 'contextMenu'
25
- private __menuDOM: HTMLElement
26
- private lf: LogicFlow
27
- private _activeData: any
28
- private menuTypeMap: Map<string, MenuItem[]> = new Map()
29
- container: any
30
- isShow?: boolean
31
-
32
- constructor({ lf }) {
33
- this.lf = lf
34
- this.__menuDOM = document.createElement('div')
35
- this.__menuDOM.className = 'lf-inner-context'
36
- this.menuTypeMap.set(COMMON_TYPE_KEY, [])
37
- this.lf.setContextMenuByType = (type, menus) => {
38
- this.setContextMenuByType(type, menus)
39
- }
40
- this.lf.setContextMenuItems = (menus) => {
41
- this.setContextMenuItems(menus)
42
- }
43
- this.lf.showContextMenu = (data) => {
44
- this.showContextMenu(data)
45
- }
46
- this.lf.hideContextMenu = () => {
47
- this.hideContextMenu()
48
- }
49
- }
50
-
51
- render(lf, container) {
52
- this.container = container
53
- lf.on('node:click', ({ data }) => {
54
- this._activeData = data
55
- this.createContextMenu()
56
- })
57
- lf.on('edge:click', ({ data }) => {
58
- // 获取右上角坐标
59
- this._activeData = data
60
- this.createContextMenu()
61
- })
62
- lf.on('blank:click', () => {
63
- this.hideContextMenu()
64
- })
65
- }
66
-
67
- setContextMenuByType(type, menus) {
68
- this.menuTypeMap.set(type, menus)
69
- }
70
-
71
- /**
72
- * 隐藏菜单
73
- */
74
- hideContextMenu() {
75
- this.__menuDOM.innerHTML = ''
76
- this.__menuDOM.style.display = 'none'
77
- if (this.isShow) {
78
- this.container.removeChild(this.__menuDOM)
79
- }
80
- this.lf.off(
81
- 'node:delete,edge:delete,node:drag,graph:transform',
82
- this.listenDelete,
83
- )
84
- this.isShow = false
85
- }
86
-
87
- /**
88
- * 显示指定元素菜单
89
- * @param data 节点id、节点类型、菜单位置
90
- */
91
- showContextMenu(data) {
92
- if (!data || !data.id) {
93
- console.warn('请检查传入的参数')
94
- return
95
- }
96
- this._activeData = data
97
- this.createContextMenu()
98
- }
99
-
100
- setContextMenuItems(menus) {
101
- this.menuTypeMap.set(COMMON_TYPE_KEY, menus)
102
- }
103
-
104
- /**
105
- * 获取新菜单位置
106
- */
107
- private getContextMenuPosition() {
108
- const data = this._activeData
109
- const Model = this.lf.graphModel.getElement(data.id)
110
- if (Model) {
111
- let x
112
- let y
113
- if (Model.BaseType === 'edge') {
114
- x = Number.MIN_SAFE_INTEGER
115
- y = Number.MAX_SAFE_INTEGER
116
- const edgeData = Model.getData()
117
- x = Math.max(edgeData.startPoint.x, x)
118
- y = Math.min(edgeData.startPoint.y, y)
119
- x = Math.max(edgeData.endPoint.x, x)
120
- y = Math.min(edgeData.endPoint.y, y)
121
- if (edgeData.pointsList) {
122
- edgeData.pointsList.forEach((point) => {
123
- x = Math.max(point.x, x)
124
- y = Math.min(point.y, y)
125
- })
126
- }
127
- }
128
- if (Model.BaseType === 'node') {
129
- x = data.x + Model.width / 2
130
- y = data.y - Model.height / 2
131
- }
132
- return this.lf.graphModel.transformModel.CanvasPointToHtmlPoint([x, y])
133
- }
134
- }
135
-
136
- private createContextMenu() {
137
- const { isSilentMode } = this.lf.options
138
- // 静默模式不显示菜单
139
- if (isSilentMode) {
140
- return
141
- }
142
- const items = [
143
- ...(this.menuTypeMap.get(this._activeData.type) || []),
144
- ...(this.menuTypeMap.get(COMMON_TYPE_KEY) || []),
145
- ]
146
-
147
- const menus = document.createDocumentFragment()
148
- items.forEach((item) => {
149
- const menuItem = document.createElement('div')
150
- menuItem.className = 'lf-context-item'
151
- const img = document.createElement('img')
152
- img.src = item.icon
153
- img.className = 'lf-context-img'
154
- if (item.className) {
155
- menuItem.className = `${menuItem.className} ${item.className}`
156
- }
157
- img.addEventListener('click', () => {
158
- this.hideContextMenu()
159
- if (item.callback) {
160
- item.callback(this._activeData)
161
- } else {
162
- this.addNode({
163
- sourceId: this._activeData.id,
164
- x: this._activeData.x,
165
- y: this._activeData.y,
166
- properties: item.properties,
167
- type: item.type,
168
- })
169
- }
170
- })
171
- menuItem.appendChild(img)
172
- menus.appendChild(menuItem)
173
- })
174
- this.__menuDOM.innerHTML = ''
175
- this.__menuDOM.appendChild(menus)
176
- this.showMenu()
177
- }
178
-
179
- private addNode(node: ContextMenuNodeData, y?: number) {
180
- const isDeep = y !== undefined
181
- if (y === undefined) {
182
- y = node.y
183
- }
184
-
185
- const nodeModel = this.lf.getNodeModelById(node.sourceId)
186
- if (nodeModel) {
187
- const leftTopX = node.x - nodeModel.width + NEXT_X_DISTANCE
188
- const leftTopY = y - node.y / 2 - 20
189
- const rightBottomX = node.x + nodeModel.width + NEXT_X_DISTANCE
190
- const rightBottomY = y + node.y / 2 + 20
191
-
192
- const existElements = this.lf.getAreaElement(
193
- [leftTopX, leftTopY],
194
- [rightBottomX, rightBottomY],
195
- )
196
- if (existElements.length) {
197
- y = y + NEXT_Y_DISTANCE
198
- this.addNode(node, y)
199
- return
200
- }
201
- if (node.type) {
202
- const newNode = this.lf.addNode({
203
- type: node.type,
204
- x: node.x + 200,
205
- y,
206
- properties: node.properties,
207
- })
208
- let startPoint
209
- let endPoint
210
- if (isDeep) {
211
- startPoint = {
212
- x: node.x,
213
- y: node.y + nodeModel.height / 2,
214
- }
215
- endPoint = {
216
- x: newNode.x - newNode.width / 2,
217
- y: newNode.y,
218
- }
219
- }
220
- this.lf.addEdge({
221
- sourceNodeId: node.sourceId,
222
- targetNodeId: newNode.id,
223
- startPoint,
224
- endPoint,
225
- })
226
- }
227
- }
228
- }
229
-
230
- private showMenu() {
231
- const menuPosition = this.getContextMenuPosition()
232
- if (menuPosition) {
233
- const [x, y] = menuPosition
234
- this.__menuDOM.style.display = 'flex'
235
- this.__menuDOM.style.top = `${y}px`
236
- this.__menuDOM.style.left = `${x + 10}px`
237
- this.container.appendChild(this.__menuDOM)
238
- // 菜单显示的时候,监听删除,同时隐藏
239
- !this.isShow &&
240
- this.lf.on(
241
- 'node:delete,edge:delete,node:drag,graph:transform',
242
- this.listenDelete,
243
- )
244
- this.isShow = true
245
- }
246
- }
247
-
248
- listenDelete = () => {
249
- this.hideContextMenu()
250
- }
251
- }
252
-
253
- export default ContextMenu
@@ -1,141 +0,0 @@
1
- import LogicFlow from '@logicflow/core'
2
-
3
- type ControlItem = {
4
- key: string
5
- iconClass: string
6
- title: string
7
- text: string
8
- onClick?: (lf: LogicFlow, e: MouseEvent) => void
9
- onMouseEnter?: (lf: LogicFlow, e: MouseEvent) => void
10
- onMouseLeave?: (lf: LogicFlow, e: MouseEvent) => void
11
- }
12
-
13
- export class Control {
14
- static pluginName = 'control'
15
-
16
- private readonly lf: LogicFlow
17
- private controlItems: ControlItem[] = [
18
- {
19
- key: 'zoom-out',
20
- iconClass: 'lf-control-zoomOut',
21
- title: '缩小流程图',
22
- text: '缩小',
23
- onClick: () => {
24
- this.lf.zoom(false)
25
- },
26
- },
27
- {
28
- key: 'zoom-in',
29
- iconClass: 'lf-control-zoomIn',
30
- title: '放大流程图',
31
- text: '放大',
32
- onClick: () => {
33
- this.lf.zoom(true)
34
- },
35
- },
36
- {
37
- key: 'reset',
38
- iconClass: 'lf-control-fit',
39
- title: '恢复流程原有尺寸',
40
- text: '适应',
41
- onClick: () => {
42
- this.lf.resetZoom()
43
- },
44
- },
45
- {
46
- key: 'undo',
47
- iconClass: 'lf-control-undo',
48
- title: '回到上一步',
49
- text: '上一步',
50
- onClick: () => {
51
- this.lf.undo()
52
- },
53
- },
54
- {
55
- key: 'redo',
56
- iconClass: 'lf-control-redo',
57
- title: '移到下一步',
58
- text: '下一步',
59
- onClick: () => {
60
- this.lf.redo()
61
- },
62
- },
63
- ]
64
- private domContainer?: HTMLElement
65
- private toolEl?: HTMLElement
66
-
67
- constructor({ lf }: LogicFlow.IExtensionProps) {
68
- this.lf = lf
69
- }
70
-
71
- render(_: LogicFlow, domContainer: HTMLElement) {
72
- this.destroy()
73
- const toolEl = this.getControlTool()
74
- this.toolEl = toolEl
75
- domContainer.appendChild(toolEl)
76
- this.domContainer = domContainer
77
- }
78
-
79
- destroy() {
80
- if (
81
- this.domContainer &&
82
- this.toolEl &&
83
- this.domContainer.contains(this.toolEl)
84
- ) {
85
- this.domContainer.removeChild(this.toolEl)
86
- }
87
- }
88
-
89
- addItem(item: ControlItem) {
90
- this.controlItems.push(item)
91
- }
92
-
93
- removeItem(key: string) {
94
- const index = this.controlItems.findIndex((item) => item.key === key)
95
- return index == -1 ? null : this.controlItems.splice(index, 1)[0]
96
- }
97
-
98
- private getControlTool(): HTMLElement {
99
- const NORMAL = 'lf-control-item'
100
- const DISABLED = 'lf-control-item disabled'
101
- const controlTool = document.createElement('div')
102
- const controlElements: HTMLDivElement[] = []
103
- controlTool.className = 'lf-control'
104
- this.controlItems.forEach((item) => {
105
- const itemContainer = document.createElement('div')
106
- const icon = document.createElement('i')
107
- const text = document.createElement('span')
108
- itemContainer.className = DISABLED
109
- item.onClick && (itemContainer.onclick = item.onClick.bind(null, this.lf))
110
- item.onMouseEnter &&
111
- (itemContainer.onmouseenter = item.onMouseEnter.bind(null, this.lf))
112
- item.onMouseLeave &&
113
- (itemContainer.onmouseleave = item.onMouseLeave.bind(null, this.lf))
114
- icon.className = item.iconClass
115
- text.className = 'lf-control-text'
116
- text.title = item.title
117
- text.innerText = item.text
118
- itemContainer.append(icon, text)
119
- switch (item.text) {
120
- case '上一步':
121
- this.lf.on('history:change', ({ data: { undoAble } }: any) => {
122
- itemContainer.className = undoAble ? NORMAL : DISABLED
123
- })
124
- break
125
- case '下一步':
126
- this.lf.on('history:change', ({ data: { redoAble } }: any) => {
127
- itemContainer.className = redoAble ? NORMAL : DISABLED
128
- })
129
- break
130
- default:
131
- itemContainer.className = NORMAL
132
- break
133
- }
134
- controlElements.push(itemContainer)
135
- })
136
- controlTool.append(...controlElements)
137
- return controlTool
138
- }
139
- }
140
-
141
- export default Control
@@ -1,137 +0,0 @@
1
- import LogicFlow from '@logicflow/core'
2
-
3
- export type ShapeItem = {
4
- type?: string
5
- text?: string
6
- icon?: string
7
- label?: string
8
- className?: string
9
- disabled?: boolean
10
- properties?: Record<string, unknown>
11
- callback?: (lf: LogicFlow, container?: HTMLElement) => void
12
- [key: string]: unknown
13
- }
14
-
15
- export class DndPanel {
16
- lf: LogicFlow
17
- static pluginName = 'dndPanel'
18
-
19
- shapeList?: ShapeItem[]
20
- panelEl?: HTMLDivElement
21
- domContainer?: HTMLElement
22
-
23
- constructor({ lf }) {
24
- this.lf = lf
25
- this.lf.setPatternItems = (shapeList) => {
26
- this.setPatternItems(shapeList)
27
- }
28
- }
29
-
30
- render(_lf: LogicFlow, domContainer) {
31
- this.destroy()
32
- if (!this.shapeList || this.shapeList.length === 0) {
33
- // 首次render后失败后,后续调用setPatternItems支持渲染
34
- this.domContainer = domContainer
35
- return
36
- }
37
- this.panelEl = document.createElement('div')
38
- this.panelEl.className = 'lf-dndpanel'
39
- this.panelEl.addEventListener(
40
- 'touchmove',
41
- (e) => {
42
- e.preventDefault()
43
- },
44
- { passive: false },
45
- )
46
- this.shapeList.forEach((shapeItem) => {
47
- this.panelEl?.appendChild(this.createDndItem(shapeItem))
48
- })
49
- domContainer.appendChild(this.panelEl)
50
- this.domContainer = domContainer
51
- }
52
-
53
- destroy() {
54
- if (
55
- this.domContainer &&
56
- this.panelEl &&
57
- this.domContainer.contains(this.panelEl)
58
- ) {
59
- this.domContainer.removeChild(this.panelEl)
60
- }
61
- }
62
-
63
- setPatternItems(shapeList) {
64
- this.shapeList = shapeList
65
- // 支持渲染后重新设置拖拽面板
66
- if (this.domContainer) {
67
- this.render(this.lf, this.domContainer)
68
- }
69
- }
70
-
71
- private createDndItem(shapeItem: ShapeItem): HTMLElement {
72
- const el = document.createElement('div')
73
- el.className = shapeItem.className
74
- ? `lf-dnd-item ${shapeItem.className}`
75
- : 'lf-dnd-item'
76
- const shape = document.createElement('div')
77
- shape.className = 'lf-dnd-shape'
78
- // if (typeof shapeItem.icon === 'string') {
79
- if (shapeItem.icon) {
80
- shape.style.backgroundImage = `url(${shapeItem.icon})`
81
- // shape.style.backgroundSize = 'contain'
82
- // } else {
83
- // shape.appendChild(shapeItem.icon);
84
- }
85
- el.appendChild(shape)
86
- if (shapeItem.label) {
87
- const text = document.createElement('div')
88
- text.innerText = shapeItem.label
89
- text.className = 'lf-dnd-text'
90
- el.appendChild(text)
91
- }
92
- if (shapeItem.disabled) {
93
- el.classList.add('disabled')
94
- // 保留callback的执行,可用于界面提示当前shapeItem的禁用状态
95
- el.onpointerdown = () => {
96
- if (shapeItem.callback) {
97
- shapeItem.callback(this.lf, this.domContainer)
98
- }
99
- }
100
- return el
101
- }
102
- el.onpointerdown = (e: PointerEvent) => {
103
- if (shapeItem.type) {
104
- this.lf.dnd.startDrag({
105
- type: shapeItem.type,
106
- properties: shapeItem.properties,
107
- text: shapeItem.text,
108
- })
109
- }
110
- if (shapeItem.callback) {
111
- shapeItem.callback(this.lf, this.domContainer)
112
- }
113
- e.preventDefault()
114
- }
115
- el.ondblclick = (e) => {
116
- this.lf.graphModel.eventCenter.emit('dnd:panel-dbclick', {
117
- e,
118
- data: shapeItem,
119
- })
120
- }
121
- el.onclick = (e) => {
122
- this.lf.graphModel.eventCenter.emit('dnd:panel-click', {
123
- e,
124
- data: shapeItem,
125
- })
126
- }
127
- el.oncontextmenu = (e) => {
128
- this.lf.graphModel.eventCenter.emit('dnd:panel-contextmenu', {
129
- e,
130
- data: shapeItem,
131
- })
132
- }
133
- return el
134
- }
135
- }
136
-
137
- export default DndPanel