bpmn-js 18.8.0 → 18.9.0

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 (345) hide show
  1. package/LICENSE +23 -23
  2. package/README.md +95 -95
  3. package/dist/assets/bpmn-js.css +145 -145
  4. package/dist/bpmn-modeler.development.js +39465 -39235
  5. package/dist/bpmn-modeler.production.min.js +36 -36
  6. package/dist/bpmn-navigated-viewer.development.js +21216 -21199
  7. package/dist/bpmn-navigated-viewer.production.min.js +5 -5
  8. package/dist/bpmn-viewer.development.js +21170 -21153
  9. package/dist/bpmn-viewer.production.min.js +5 -5
  10. package/lib/BaseModeler.d.ts +15 -15
  11. package/lib/BaseModeler.js +79 -79
  12. package/lib/BaseViewer.d.ts +352 -352
  13. package/lib/BaseViewer.js +858 -858
  14. package/lib/Modeler.d.ts +86 -86
  15. package/lib/Modeler.js +208 -206
  16. package/lib/NavigatedViewer.d.ts +11 -11
  17. package/lib/NavigatedViewer.js +37 -37
  18. package/lib/Viewer.d.ts +47 -47
  19. package/lib/Viewer.js +76 -76
  20. package/lib/core/index.d.ts +10 -10
  21. package/lib/core/index.js +8 -8
  22. package/lib/draw/BpmnRenderUtil.d.ts +123 -123
  23. package/lib/draw/BpmnRenderUtil.js +256 -256
  24. package/lib/draw/BpmnRenderer.d.ts +116 -116
  25. package/lib/draw/BpmnRenderer.js +2419 -2412
  26. package/lib/draw/PathMap.d.ts +330 -330
  27. package/lib/draw/PathMap.js +478 -478
  28. package/lib/draw/TextRenderer.d.ts +74 -74
  29. package/lib/draw/TextRenderer.js +136 -136
  30. package/lib/draw/index.d.ts +10 -10
  31. package/lib/draw/index.js +11 -11
  32. package/lib/features/align-elements/AlignElementsContextPadProvider.d.ts +32 -32
  33. package/lib/features/align-elements/AlignElementsContextPadProvider.js +105 -105
  34. package/lib/features/align-elements/AlignElementsIcons.d.ts +10 -10
  35. package/lib/features/align-elements/AlignElementsIcons.js +43 -43
  36. package/lib/features/align-elements/AlignElementsMenuProvider.d.ts +32 -32
  37. package/lib/features/align-elements/AlignElementsMenuProvider.js +100 -100
  38. package/lib/features/align-elements/BpmnAlignElements.d.ts +9 -9
  39. package/lib/features/align-elements/BpmnAlignElements.js +45 -45
  40. package/lib/features/align-elements/index.d.ts +17 -17
  41. package/lib/features/align-elements/index.js +23 -23
  42. package/lib/features/append-preview/AppendPreview.d.ts +36 -36
  43. package/lib/features/append-preview/AppendPreview.js +108 -108
  44. package/lib/features/append-preview/index.d.ts +18 -18
  45. package/lib/features/append-preview/index.js +15 -15
  46. package/lib/features/auto-place/BpmnAutoPlace.d.ts +15 -15
  47. package/lib/features/auto-place/BpmnAutoPlace.js +22 -22
  48. package/lib/features/auto-place/BpmnAutoPlaceUtil.d.ts +52 -52
  49. package/lib/features/auto-place/BpmnAutoPlaceUtil.js +226 -226
  50. package/lib/features/auto-place/index.d.ts +10 -10
  51. package/lib/features/auto-place/index.js +8 -8
  52. package/lib/features/auto-resize/BpmnAutoResize.d.ts +25 -25
  53. package/lib/features/auto-resize/BpmnAutoResize.js +45 -45
  54. package/lib/features/auto-resize/BpmnAutoResizeProvider.d.ts +26 -26
  55. package/lib/features/auto-resize/BpmnAutoResizeProvider.js +69 -69
  56. package/lib/features/auto-resize/index.d.ts +8 -8
  57. package/lib/features/auto-resize/index.js +12 -12
  58. package/lib/features/context-pad/ContextPadProvider.d.ts +62 -62
  59. package/lib/features/context-pad/ContextPadProvider.js +592 -592
  60. package/lib/features/context-pad/index.d.ts +7 -7
  61. package/lib/features/context-pad/index.js +22 -22
  62. package/lib/features/copy-paste/BpmnCopyPaste.d.ts +17 -17
  63. package/lib/features/copy-paste/BpmnCopyPaste.js +192 -192
  64. package/lib/features/copy-paste/ModdleCopy.d.ts +45 -45
  65. package/lib/features/copy-paste/ModdleCopy.js +287 -287
  66. package/lib/features/copy-paste/index.d.ts +11 -11
  67. package/lib/features/copy-paste/index.js +13 -13
  68. package/lib/features/di-ordering/BpmnDiOrdering.d.ts +11 -11
  69. package/lib/features/di-ordering/BpmnDiOrdering.js +48 -48
  70. package/lib/features/di-ordering/index.d.ts +6 -6
  71. package/lib/features/di-ordering/index.js +7 -7
  72. package/lib/features/distribute-elements/BpmnDistributeElements.d.ts +10 -10
  73. package/lib/features/distribute-elements/BpmnDistributeElements.js +60 -60
  74. package/lib/features/distribute-elements/DistributeElementsIcons.d.ts +5 -5
  75. package/lib/features/distribute-elements/DistributeElementsIcons.js +18 -18
  76. package/lib/features/distribute-elements/DistributeElementsMenuProvider.d.ts +32 -32
  77. package/lib/features/distribute-elements/DistributeElementsMenuProvider.js +92 -92
  78. package/lib/features/distribute-elements/index.d.ts +13 -13
  79. package/lib/features/distribute-elements/index.js +19 -19
  80. package/lib/features/drilldown/DrilldownBreadcrumbs.d.ts +19 -19
  81. package/lib/features/drilldown/DrilldownBreadcrumbs.js +138 -138
  82. package/lib/features/drilldown/DrilldownCentering.d.ts +17 -17
  83. package/lib/features/drilldown/DrilldownCentering.js +122 -122
  84. package/lib/features/drilldown/DrilldownOverlayBehavior.d.ts +20 -20
  85. package/lib/features/drilldown/DrilldownOverlayBehavior.js +218 -218
  86. package/lib/features/drilldown/SubprocessCompatibility.d.ts +21 -21
  87. package/lib/features/drilldown/SubprocessCompatibility.js +266 -266
  88. package/lib/features/drilldown/index.d.ts +19 -19
  89. package/lib/features/drilldown/index.js +16 -16
  90. package/lib/features/editor-actions/BpmnEditorActions.d.ts +13 -13
  91. package/lib/features/editor-actions/BpmnEditorActions.js +187 -187
  92. package/lib/features/editor-actions/index.d.ts +8 -8
  93. package/lib/features/editor-actions/index.js +10 -10
  94. package/lib/features/grid-snapping/BpmnGridSnapping.d.ts +9 -9
  95. package/lib/features/grid-snapping/behavior/GridSnappingAutoPlaceBehavior.d.ts +14 -14
  96. package/lib/features/grid-snapping/behavior/GridSnappingLayoutConnectionBehavior.d.ts +27 -27
  97. package/lib/features/grid-snapping/behavior/GridSnappingLayoutConnectionBehavior.js +155 -155
  98. package/lib/features/grid-snapping/behavior/GridSnappingParticipantBehavior.d.ts +13 -13
  99. package/lib/features/grid-snapping/behavior/index.d.ts +10 -10
  100. package/lib/features/grid-snapping/index.d.ts +13 -13
  101. package/lib/features/interaction-events/BpmnInteractionEvents.d.ts +18 -18
  102. package/lib/features/interaction-events/BpmnInteractionEvents.js +146 -146
  103. package/lib/features/interaction-events/index.d.ts +6 -6
  104. package/lib/features/interaction-events/index.js +5 -5
  105. package/lib/features/keyboard/BpmnKeyboardBindings.d.ts +15 -15
  106. package/lib/features/keyboard/BpmnKeyboardBindings.js +179 -179
  107. package/lib/features/keyboard/index.d.ts +10 -10
  108. package/lib/features/keyboard/index.js +11 -11
  109. package/lib/features/label-editing/LabelEditingPreview.d.ts +13 -13
  110. package/lib/features/label-editing/LabelEditingPreview.js +145 -145
  111. package/lib/features/label-editing/LabelEditingProvider.d.ts +62 -62
  112. package/lib/features/label-editing/LabelEditingProvider.js +519 -519
  113. package/lib/features/label-editing/LabelUtil.d.ts +1 -1
  114. package/lib/features/label-editing/LabelUtil.js +4 -4
  115. package/lib/features/label-editing/cmd/UpdateLabelHandler.d.ts +22 -22
  116. package/lib/features/label-editing/cmd/UpdateLabelHandler.js +149 -149
  117. package/lib/features/label-editing/index.d.ts +9 -9
  118. package/lib/features/label-editing/index.js +21 -21
  119. package/lib/features/label-link/LabelLink.d.ts +27 -0
  120. package/lib/features/label-link/LabelLink.js +202 -0
  121. package/lib/features/label-link/index.d.ts +14 -0
  122. package/lib/features/label-link/index.js +15 -0
  123. package/lib/features/modeling/BpmnFactory.d.ts +73 -73
  124. package/lib/features/modeling/BpmnFactory.js +180 -180
  125. package/lib/features/modeling/BpmnLayouter.d.ts +30 -30
  126. package/lib/features/modeling/BpmnLayouter.js +488 -488
  127. package/lib/features/modeling/BpmnUpdater.d.ts +90 -90
  128. package/lib/features/modeling/BpmnUpdater.js +818 -818
  129. package/lib/features/modeling/ElementFactory.d.ts +117 -117
  130. package/lib/features/modeling/ElementFactory.js +412 -412
  131. package/lib/features/modeling/ElementFactory.test.ts +132 -132
  132. package/lib/features/modeling/Modeling.d.ts +150 -150
  133. package/lib/features/modeling/Modeling.js +309 -309
  134. package/lib/features/modeling/Modeling.test.ts +147 -147
  135. package/lib/features/modeling/behavior/AdaptiveLabelPositioningBehavior.d.ts +19 -19
  136. package/lib/features/modeling/behavior/AdaptiveLabelPositioningBehavior.js +288 -288
  137. package/lib/features/modeling/behavior/AppendBehavior.d.ts +6 -6
  138. package/lib/features/modeling/behavior/AppendBehavior.js +42 -42
  139. package/lib/features/modeling/behavior/AssociationBehavior.d.ts +11 -11
  140. package/lib/features/modeling/behavior/AttachEventBehavior.d.ts +15 -15
  141. package/lib/features/modeling/behavior/AttachEventBehavior.js +106 -106
  142. package/lib/features/modeling/behavior/BoundaryEventBehavior.d.ts +15 -15
  143. package/lib/features/modeling/behavior/BoundaryEventBehavior.js +74 -74
  144. package/lib/features/modeling/behavior/CompensateBoundaryEventBehavior.d.ts +17 -17
  145. package/lib/features/modeling/behavior/CompensateBoundaryEventBehavior.js +222 -222
  146. package/lib/features/modeling/behavior/CreateBehavior.d.ts +9 -9
  147. package/lib/features/modeling/behavior/CreateBehavior.js +33 -33
  148. package/lib/features/modeling/behavior/CreateDataObjectBehavior.d.ts +15 -15
  149. package/lib/features/modeling/behavior/CreateDataObjectBehavior.js +46 -46
  150. package/lib/features/modeling/behavior/CreateParticipantBehavior.d.ts +19 -19
  151. package/lib/features/modeling/behavior/CreateParticipantBehavior.js +237 -237
  152. package/lib/features/modeling/behavior/DataInputAssociationBehavior.d.ts +21 -21
  153. package/lib/features/modeling/behavior/DataInputAssociationBehavior.js +162 -162
  154. package/lib/features/modeling/behavior/DataStoreBehavior.d.ts +19 -19
  155. package/lib/features/modeling/behavior/DeleteLaneBehavior.d.ts +15 -15
  156. package/lib/features/modeling/behavior/DeleteLaneBehavior.js +162 -162
  157. package/lib/features/modeling/behavior/DetachEventBehavior.d.ts +15 -15
  158. package/lib/features/modeling/behavior/DetachEventBehavior.js +101 -101
  159. package/lib/features/modeling/behavior/DropOnFlowBehavior.d.ts +13 -13
  160. package/lib/features/modeling/behavior/DropOnFlowBehavior.js +221 -221
  161. package/lib/features/modeling/behavior/EventBasedGatewayBehavior.d.ts +11 -11
  162. package/lib/features/modeling/behavior/EventBasedGatewayBehavior.js +110 -110
  163. package/lib/features/modeling/behavior/FixHoverBehavior.d.ts +17 -17
  164. package/lib/features/modeling/behavior/GroupBehavior.d.ts +26 -26
  165. package/lib/features/modeling/behavior/ImportDockingFix.d.ts +13 -13
  166. package/lib/features/modeling/behavior/ImportDockingFix.js +83 -83
  167. package/lib/features/modeling/behavior/IsHorizontalFix.d.ts +10 -10
  168. package/lib/features/modeling/behavior/IsHorizontalFix.js +54 -54
  169. package/lib/features/modeling/behavior/LabelBehavior.d.ts +56 -56
  170. package/lib/features/modeling/behavior/LabelBehavior.js +364 -364
  171. package/lib/features/modeling/behavior/LayoutConnectionBehavior.d.ts +16 -16
  172. package/lib/features/modeling/behavior/LayoutConnectionBehavior.js +121 -121
  173. package/lib/features/modeling/behavior/MessageFlowBehavior.d.ts +15 -15
  174. package/lib/features/modeling/behavior/NonInterruptingBehavior.d.ts +4 -4
  175. package/lib/features/modeling/behavior/NonInterruptingBehavior.js +41 -41
  176. package/lib/features/modeling/behavior/RemoveElementBehavior.d.ts +13 -13
  177. package/lib/features/modeling/behavior/RemoveElementBehavior.js +91 -91
  178. package/lib/features/modeling/behavior/RemoveEmbeddedLabelBoundsBehavior.d.ts +16 -16
  179. package/lib/features/modeling/behavior/RemoveEmbeddedLabelBoundsBehavior.js +41 -41
  180. package/lib/features/modeling/behavior/RemoveParticipantBehavior.d.ts +15 -15
  181. package/lib/features/modeling/behavior/RemoveParticipantBehavior.js +59 -59
  182. package/lib/features/modeling/behavior/ReplaceConnectionBehavior.d.ts +15 -15
  183. package/lib/features/modeling/behavior/ReplaceConnectionBehavior.js +194 -194
  184. package/lib/features/modeling/behavior/ReplaceElementBehaviour.d.ts +23 -23
  185. package/lib/features/modeling/behavior/ReplaceElementBehaviour.js +144 -144
  186. package/lib/features/modeling/behavior/ResizeBehavior.d.ts +64 -64
  187. package/lib/features/modeling/behavior/ResizeBehavior.js +265 -265
  188. package/lib/features/modeling/behavior/ResizeLaneBehavior.d.ts +16 -16
  189. package/lib/features/modeling/behavior/ResizeLaneBehavior.js +70 -70
  190. package/lib/features/modeling/behavior/RootElementReferenceBehavior.d.ts +25 -25
  191. package/lib/features/modeling/behavior/SetCompensationActivityAfterPasteBehavior.d.ts +16 -16
  192. package/lib/features/modeling/behavior/SetCompensationActivityAfterPasteBehavior.js +66 -66
  193. package/lib/features/modeling/behavior/SpaceToolBehavior.d.ts +10 -10
  194. package/lib/features/modeling/behavior/SpaceToolBehavior.js +207 -207
  195. package/lib/features/modeling/behavior/SubProcessPlaneBehavior.d.ts +28 -28
  196. package/lib/features/modeling/behavior/SubProcessPlaneBehavior.js +588 -588
  197. package/lib/features/modeling/behavior/SubProcessStartEventBehavior.d.ts +15 -15
  198. package/lib/features/modeling/behavior/SubProcessStartEventBehavior.js +56 -56
  199. package/lib/features/modeling/behavior/TextAnnotationBehavior.d.ts +6 -6
  200. package/lib/features/modeling/behavior/TextAnnotationBehavior.js +42 -42
  201. package/lib/features/modeling/behavior/ToggleCollapseConnectionBehaviour.d.ts +14 -14
  202. package/lib/features/modeling/behavior/ToggleCollapseConnectionBehaviour.js +87 -87
  203. package/lib/features/modeling/behavior/ToggleElementCollapseBehaviour.d.ts +13 -13
  204. package/lib/features/modeling/behavior/ToggleElementCollapseBehaviour.js +156 -156
  205. package/lib/features/modeling/behavior/UnclaimIdBehavior.d.ts +19 -19
  206. package/lib/features/modeling/behavior/UnclaimIdBehavior.js +64 -64
  207. package/lib/features/modeling/behavior/UnsetDefaultFlowBehavior.d.ts +16 -16
  208. package/lib/features/modeling/behavior/UnsetDefaultFlowBehavior.js +59 -59
  209. package/lib/features/modeling/behavior/UpdateFlowNodeRefsBehavior.d.ts +15 -15
  210. package/lib/features/modeling/behavior/UpdateFlowNodeRefsBehavior.js +157 -157
  211. package/lib/features/modeling/behavior/index.d.ts +85 -85
  212. package/lib/features/modeling/behavior/index.js +131 -131
  213. package/lib/features/modeling/behavior/util/CategoryUtil.d.ts +49 -49
  214. package/lib/features/modeling/behavior/util/CategoryUtil.js +86 -86
  215. package/lib/features/modeling/behavior/util/ConnectionLayoutUtil.d.ts +19 -19
  216. package/lib/features/modeling/behavior/util/ConnectionLayoutUtil.js +22 -22
  217. package/lib/features/modeling/behavior/util/GeometricUtil.d.ts +1 -1
  218. package/lib/features/modeling/behavior/util/LabelLayoutUtil.d.ts +32 -32
  219. package/lib/features/modeling/behavior/util/LabelLayoutUtil.js +41 -41
  220. package/lib/features/modeling/behavior/util/LayoutUtil.d.ts +48 -48
  221. package/lib/features/modeling/behavior/util/LayoutUtil.js +259 -259
  222. package/lib/features/modeling/behavior/util/LineAttachmentUtil.d.ts +37 -37
  223. package/lib/features/modeling/behavior/util/LineAttachmentUtil.js +241 -241
  224. package/lib/features/modeling/behavior/util/LineIntersect.d.ts +13 -13
  225. package/lib/features/modeling/behavior/util/LineIntersect.js +39 -39
  226. package/lib/features/modeling/behavior/util/NonInterruptingUtil.d.ts +3 -3
  227. package/lib/features/modeling/behavior/util/NonInterruptingUtil.js +32 -32
  228. package/lib/features/modeling/behavior/util/ResizeUtil.d.ts +1 -1
  229. package/lib/features/modeling/cmd/AddLaneHandler.d.ts +22 -22
  230. package/lib/features/modeling/cmd/AddLaneHandler.js +187 -187
  231. package/lib/features/modeling/cmd/IdClaimHandler.d.ts +22 -22
  232. package/lib/features/modeling/cmd/IdClaimHandler.js +51 -51
  233. package/lib/features/modeling/cmd/ResizeLaneHandler.d.ts +39 -39
  234. package/lib/features/modeling/cmd/ResizeLaneHandler.js +146 -146
  235. package/lib/features/modeling/cmd/SetColorHandler.d.ts +18 -18
  236. package/lib/features/modeling/cmd/SplitLaneHandler.d.ts +20 -20
  237. package/lib/features/modeling/cmd/SplitLaneHandler.js +99 -99
  238. package/lib/features/modeling/cmd/UpdateCanvasRootHandler.d.ts +20 -20
  239. package/lib/features/modeling/cmd/UpdateCanvasRootHandler.js +99 -99
  240. package/lib/features/modeling/cmd/UpdateFlowNodeRefsHandler.d.ts +21 -21
  241. package/lib/features/modeling/cmd/UpdateFlowNodeRefsHandler.js +218 -218
  242. package/lib/features/modeling/cmd/UpdateModdlePropertiesHandler.d.ts +20 -20
  243. package/lib/features/modeling/cmd/UpdateModdlePropertiesHandler.js +107 -107
  244. package/lib/features/modeling/cmd/UpdatePropertiesHandler.d.ts +58 -58
  245. package/lib/features/modeling/cmd/UpdatePropertiesHandler.js +260 -260
  246. package/lib/features/modeling/cmd/UpdateSemanticParentHandler.d.ts +18 -18
  247. package/lib/features/modeling/index.d.ts +39 -39
  248. package/lib/features/modeling/index.js +45 -45
  249. package/lib/features/modeling/util/LaneUtil.d.ts +46 -46
  250. package/lib/features/modeling/util/LaneUtil.js +188 -188
  251. package/lib/features/modeling/util/ModelingUtil.d.ts +23 -23
  252. package/lib/features/modeling/util/ModelingUtil.js +88 -88
  253. package/lib/features/modeling-feedback/ModelingFeedback.d.ts +13 -13
  254. package/lib/features/modeling-feedback/ModelingFeedback.js +51 -51
  255. package/lib/features/modeling-feedback/index.d.ts +9 -9
  256. package/lib/features/modeling-feedback/index.js +12 -12
  257. package/lib/features/ordering/BpmnOrderingProvider.d.ts +19 -19
  258. package/lib/features/ordering/BpmnOrderingProvider.js +191 -191
  259. package/lib/features/ordering/index.d.ts +6 -6
  260. package/lib/features/ordering/index.js +5 -5
  261. package/lib/features/outline/OutlineProvider.d.ts +39 -39
  262. package/lib/features/outline/OutlineProvider.js +203 -189
  263. package/lib/features/outline/OutlineUtil.d.ts +23 -23
  264. package/lib/features/outline/OutlineUtil.js +35 -35
  265. package/lib/features/outline/index.d.ts +10 -10
  266. package/lib/features/outline/index.js +10 -10
  267. package/lib/features/palette/PaletteProvider.d.ts +34 -34
  268. package/lib/features/palette/PaletteProvider.js +214 -214
  269. package/lib/features/palette/index.d.ts +22 -22
  270. package/lib/features/palette/index.js +23 -23
  271. package/lib/features/popup-menu/ReplaceMenuProvider.d.ts +52 -52
  272. package/lib/features/popup-menu/ReplaceMenuProvider.js +656 -656
  273. package/lib/features/popup-menu/index.d.ts +13 -13
  274. package/lib/features/popup-menu/index.js +16 -16
  275. package/lib/features/popup-menu/util/Icons.d.ts +5 -5
  276. package/lib/features/popup-menu/util/Icons.js +14 -14
  277. package/lib/features/popup-menu/util/TypeUtil.d.ts +14 -14
  278. package/lib/features/popup-menu/util/TypeUtil.js +52 -52
  279. package/lib/features/replace/BpmnReplace.d.ts +45 -45
  280. package/lib/features/replace/BpmnReplace.js +391 -391
  281. package/lib/features/replace/ReplaceOptions.d.ts +85 -85
  282. package/lib/features/replace/ReplaceOptions.js +1198 -1198
  283. package/lib/features/replace/index.d.ts +16 -16
  284. package/lib/features/replace/index.js +14 -14
  285. package/lib/features/replace-preview/BpmnReplacePreview.d.ts +17 -17
  286. package/lib/features/replace-preview/BpmnReplacePreview.js +139 -139
  287. package/lib/features/replace-preview/index.d.ts +9 -9
  288. package/lib/features/replace-preview/index.js +11 -11
  289. package/lib/features/rules/BpmnRules.d.ts +181 -181
  290. package/lib/features/rules/BpmnRules.js +1191 -1191
  291. package/lib/features/rules/index.d.ts +9 -9
  292. package/lib/features/rules/index.js +11 -11
  293. package/lib/features/search/BpmnSearchProvider.d.ts +34 -34
  294. package/lib/features/search/BpmnSearchProvider.js +91 -91
  295. package/lib/features/search/index.d.ts +11 -11
  296. package/lib/features/search/index.js +14 -14
  297. package/lib/features/snapping/BpmnConnectSnapping.d.ts +17 -17
  298. package/lib/features/snapping/BpmnCreateMoveSnapping.d.ts +41 -41
  299. package/lib/features/snapping/BpmnCreateMoveSnapping.js +289 -289
  300. package/lib/features/snapping/BpmnSnappingUtil.d.ts +11 -11
  301. package/lib/features/snapping/index.d.ts +13 -13
  302. package/lib/features/snapping/index.js +12 -12
  303. package/lib/features/space-tool/BpmnSpaceTool.d.ts +24 -24
  304. package/lib/features/space-tool/BpmnSpaceTool.js +96 -96
  305. package/lib/features/space-tool/index.d.ts +9 -9
  306. package/lib/features/space-tool/index.js +7 -7
  307. package/lib/import/BpmnImporter.d.ts +51 -51
  308. package/lib/import/BpmnImporter.js +363 -363
  309. package/lib/import/BpmnTreeWalker.d.ts +20 -20
  310. package/lib/import/BpmnTreeWalker.js +452 -452
  311. package/lib/import/Importer.d.ts +25 -25
  312. package/lib/import/Importer.js +222 -222
  313. package/lib/import/Util.d.ts +1 -1
  314. package/lib/import/Util.js +6 -6
  315. package/lib/import/index.d.ts +8 -8
  316. package/lib/import/index.js +9 -9
  317. package/lib/index.d.ts +1 -1
  318. package/lib/index.js +2 -2
  319. package/lib/model/Types.d.ts +25 -25
  320. package/lib/model/Types.ts +40 -40
  321. package/lib/util/CompatibilityUtil.d.ts +8 -8
  322. package/lib/util/CompatibilityUtil.js +29 -29
  323. package/lib/util/DiUtil.d.ts +60 -60
  324. package/lib/util/DiUtil.js +122 -122
  325. package/lib/util/DrilldownUtil.d.ts +39 -39
  326. package/lib/util/DrilldownUtil.js +69 -69
  327. package/lib/util/LabelUtil.d.ts +92 -83
  328. package/lib/util/LabelUtil.js +277 -266
  329. package/lib/util/ModelUtil.d.ts +40 -40
  330. package/lib/util/ModelUtil.js +58 -58
  331. package/lib/util/PoweredByUtil.d.ts +8 -8
  332. package/lib/util/PoweredByUtil.js +99 -99
  333. package/lib/util/Types.js +4 -4
  334. package/lib/util/Types.ts +3 -3
  335. package/package.json +131 -131
  336. package/test/helper/TranslationCollector.js +15 -15
  337. package/test/helper/index.js +313 -313
  338. package/test/matchers/BoundsMatchers.js +252 -252
  339. package/test/matchers/ConnectionMatchers.js +165 -165
  340. package/test/matchers/JSONMatcher.js +19 -19
  341. package/test/util/KeyEvents.js +22 -22
  342. package/test/util/MockEvents.js +61 -61
  343. package/test/util/custom-rules/CustomRules.js +16 -16
  344. package/test/util/custom-rules/index.js +6 -6
  345. package/test/util/svgHelpers.js +52 -0
@@ -1,819 +1,819 @@
1
- import {
2
- assign,
3
- forEach
4
- } from 'min-dash';
5
-
6
- import inherits from 'inherits-browser';
7
-
8
- import {
9
- add as collectionAdd,
10
- remove as collectionRemove
11
- } from 'diagram-js/lib/util/Collections';
12
-
13
- import {
14
- getBusinessObject,
15
- getDi,
16
- is
17
- } from '../../util/ModelUtil';
18
-
19
- import { isAny } from './util/ModelingUtil';
20
-
21
- import {
22
- getLabel,
23
- isLabel,
24
- isLabelExternal
25
- } from '../../util/LabelUtil';
26
-
27
- import { isPlane } from '../../util/DrilldownUtil';
28
-
29
- import { delta } from 'diagram-js/lib/util/PositionUtil';
30
-
31
- import CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';
32
-
33
- /**
34
- * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus
35
- * @typedef {import('./BpmnFactory').default} BpmnFactory
36
- * @typedef {import('diagram-js/lib/layout/CroppingConnectionDocking').default} CroppingConnectionDocking
37
- *
38
- * @typedef {import('../../model/Types').Connection} Connection
39
- * @typedef {import('../../model/Types').Element} Element
40
- * @typedef {import('../../model/Types').Shape} Shape
41
- * @typedef {import('../../model/Types').Parent} Parent
42
- * @typedef {import('../../model/Types').ModdleElement} ModdleElement
43
- */
44
-
45
- /**
46
- * A handler responsible for updating the underlying BPMN 2.0 XML & DI
47
- * once changes on the diagram happen.
48
- *
49
- * @param {EventBus} eventBus
50
- * @param {BpmnFactory} bpmnFactory
51
- * @param {CroppingConnectionDocking} connectionDocking
52
- */
53
- export default function BpmnUpdater(
54
- eventBus,
55
- bpmnFactory,
56
- connectionDocking
57
- ) {
58
-
59
- CommandInterceptor.call(this, eventBus);
60
-
61
- this._bpmnFactory = bpmnFactory;
62
-
63
- var self = this;
64
-
65
-
66
- // connection cropping //////////////////////
67
-
68
- // crop connection ends during create/update
69
- function cropConnection(e) {
70
- var context = e.context,
71
- hints = context.hints || {},
72
- connection;
73
-
74
- if (!context.cropped && hints.createElementsBehavior !== false) {
75
- connection = context.connection;
76
- connection.waypoints = connectionDocking.getCroppedWaypoints(connection);
77
- context.cropped = true;
78
- }
79
- }
80
-
81
- this.executed([
82
- 'connection.layout',
83
- 'connection.create'
84
- ], cropConnection);
85
-
86
- this.reverted([ 'connection.layout' ], function(e) {
87
- delete e.context.cropped;
88
- });
89
-
90
-
91
-
92
- // BPMN + DI update //////////////////////
93
-
94
-
95
- // update parent
96
- function updateParent(e) {
97
- var context = e.context;
98
-
99
- self.updateParent(context.shape || context.connection, context.oldParent);
100
- }
101
-
102
- function reverseUpdateParent(e) {
103
- var context = e.context;
104
-
105
- var element = context.shape || context.connection,
106
-
107
- // oldParent is the (old) new parent, because we are undoing
108
- oldParent = context.parent || context.newParent;
109
-
110
- self.updateParent(element, oldParent);
111
- }
112
-
113
- this.executed([
114
- 'shape.move',
115
- 'shape.create',
116
- 'shape.delete',
117
- 'connection.create',
118
- 'connection.move',
119
- 'connection.delete'
120
- ], ifBpmn(updateParent));
121
-
122
- this.reverted([
123
- 'shape.move',
124
- 'shape.create',
125
- 'shape.delete',
126
- 'connection.create',
127
- 'connection.move',
128
- 'connection.delete'
129
- ], ifBpmn(reverseUpdateParent));
130
-
131
- /*
132
- * ## Updating Parent
133
- *
134
- * When morphing a Process into a Collaboration or vice-versa,
135
- * make sure that both the *semantic* and *di* parent of each element
136
- * is updated.
137
- *
138
- */
139
- function updateRoot(event) {
140
- var context = event.context,
141
- oldRoot = context.oldRoot,
142
- children = oldRoot.children;
143
-
144
- forEach(children, function(child) {
145
- if (is(child, 'bpmn:BaseElement')) {
146
- self.updateParent(child);
147
- }
148
- });
149
- }
150
-
151
- this.executed([ 'canvas.updateRoot' ], updateRoot);
152
- this.reverted([ 'canvas.updateRoot' ], updateRoot);
153
-
154
-
155
- // update bounds
156
- function updateBounds(e) {
157
- var shape = e.context.shape;
158
-
159
- if (!is(shape, 'bpmn:BaseElement')) {
160
- return;
161
- }
162
-
163
- self.updateBounds(shape);
164
- }
165
-
166
- this.executed([ 'shape.move', 'shape.create', 'shape.resize' ], ifBpmn(function(event) {
167
-
168
- // exclude labels because they're handled separately during shape.changed
169
- if (event.context.shape.type === 'label') {
170
- return;
171
- }
172
-
173
- updateBounds(event);
174
- }));
175
-
176
- this.reverted([ 'shape.move', 'shape.create', 'shape.resize' ], ifBpmn(function(event) {
177
-
178
- // exclude labels because they're handled separately during shape.changed
179
- if (event.context.shape.type === 'label') {
180
- return;
181
- }
182
-
183
- updateBounds(event);
184
- }));
185
-
186
- // Handle labels separately. This is necessary, because the label bounds have to be updated
187
- // every time its shape changes, not only on move, create and resize.
188
- eventBus.on('shape.changed', function(event) {
189
- if (event.element.type === 'label') {
190
- updateBounds({ context: { shape: event.element } });
191
- }
192
- });
193
-
194
- // attach / detach connection
195
- function updateConnection(e) {
196
- self.updateConnection(e.context);
197
- }
198
-
199
- this.executed([
200
- 'connection.create',
201
- 'connection.move',
202
- 'connection.delete',
203
- 'connection.reconnect'
204
- ], ifBpmn(updateConnection));
205
-
206
- this.reverted([
207
- 'connection.create',
208
- 'connection.move',
209
- 'connection.delete',
210
- 'connection.reconnect'
211
- ], ifBpmn(updateConnection));
212
-
213
-
214
- // update waypoints
215
- function updateConnectionWaypoints(e) {
216
- self.updateConnectionWaypoints(e.context.connection);
217
- }
218
-
219
- this.executed([
220
- 'connection.layout',
221
- 'connection.move',
222
- 'connection.updateWaypoints',
223
- ], ifBpmn(updateConnectionWaypoints));
224
-
225
- this.reverted([
226
- 'connection.layout',
227
- 'connection.move',
228
- 'connection.updateWaypoints',
229
- ], ifBpmn(updateConnectionWaypoints));
230
-
231
- // update conditional/default flows
232
- this.executed('connection.reconnect', ifBpmn(function(event) {
233
- var context = event.context,
234
- connection = context.connection,
235
- oldSource = context.oldSource,
236
- newSource = context.newSource,
237
- connectionBo = getBusinessObject(connection),
238
- oldSourceBo = getBusinessObject(oldSource),
239
- newSourceBo = getBusinessObject(newSource);
240
-
241
- // remove condition from connection on reconnect to new source
242
- // if new source can NOT have condional sequence flow
243
- if (connectionBo.conditionExpression && !isAny(newSourceBo, [
244
- 'bpmn:Activity',
245
- 'bpmn:ExclusiveGateway',
246
- 'bpmn:InclusiveGateway'
247
- ])) {
248
- context.oldConditionExpression = connectionBo.conditionExpression;
249
-
250
- delete connectionBo.conditionExpression;
251
- }
252
-
253
- // remove default from old source flow on reconnect to new source
254
- // if source changed
255
- if (oldSource !== newSource && oldSourceBo.default === connectionBo) {
256
- context.oldDefault = oldSourceBo.default;
257
-
258
- delete oldSourceBo.default;
259
- }
260
- }));
261
-
262
- this.reverted('connection.reconnect', ifBpmn(function(event) {
263
- var context = event.context,
264
- connection = context.connection,
265
- oldSource = context.oldSource,
266
- newSource = context.newSource,
267
- connectionBo = getBusinessObject(connection),
268
- oldSourceBo = getBusinessObject(oldSource),
269
- newSourceBo = getBusinessObject(newSource);
270
-
271
- // add condition to connection on revert reconnect to new source
272
- if (context.oldConditionExpression) {
273
- connectionBo.conditionExpression = context.oldConditionExpression;
274
- }
275
-
276
- // add default to old source on revert reconnect to new source
277
- if (context.oldDefault) {
278
- oldSourceBo.default = context.oldDefault;
279
-
280
- delete newSourceBo.default;
281
- }
282
- }));
283
-
284
- // update attachments
285
- function updateAttachment(e) {
286
- self.updateAttachment(e.context);
287
- }
288
-
289
- this.executed([ 'element.updateAttachment' ], ifBpmn(updateAttachment));
290
- this.reverted([ 'element.updateAttachment' ], ifBpmn(updateAttachment));
291
-
292
-
293
- // update BPMNLabel
294
- this.executed('element.updateLabel', ifBpmn(updateBPMNLabel));
295
- this.reverted('element.updateLabel', ifBpmn(updateBPMNLabel));
296
-
297
- function updateBPMNLabel(event) {
298
- const { element } = event.context,
299
- label = getLabel(element);
300
- const di = getDi(element),
301
- diLabel = di && di.get('label');
302
-
303
- if (isLabelExternal(element) || isPlane(element)) {
304
- return;
305
- }
306
-
307
- if (label && !diLabel) {
308
- di.set('label', bpmnFactory.create('bpmndi:BPMNLabel'));
309
- } else if (!label && diLabel) {
310
- di.set('label', undefined);
311
- }
312
- }
313
- }
314
-
315
- inherits(BpmnUpdater, CommandInterceptor);
316
-
317
- BpmnUpdater.$inject = [
318
- 'eventBus',
319
- 'bpmnFactory',
320
- 'connectionDocking'
321
- ];
322
-
323
-
324
- // implementation //////////////////////
325
-
326
- /**
327
- * @param { {
328
- * shape: Shape;
329
- * host: Shape;
330
- * } } context
331
- */
332
- BpmnUpdater.prototype.updateAttachment = function(context) {
333
-
334
- var shape = context.shape,
335
- businessObject = shape.businessObject,
336
- host = shape.host;
337
-
338
- businessObject.attachedToRef = host && host.businessObject;
339
- };
340
-
341
- /**
342
- * @param {Element} element
343
- * @param {Parent} oldParent
344
- */
345
- BpmnUpdater.prototype.updateParent = function(element, oldParent) {
346
-
347
- // do not update BPMN 2.0 label parent
348
- if (isLabel(element)) {
349
- return;
350
- }
351
-
352
- // data stores in collaborations are handled separately by DataStoreBehavior
353
- if (is(element, 'bpmn:DataStoreReference') &&
354
- element.parent &&
355
- is(element.parent, 'bpmn:Collaboration')) {
356
- return;
357
- }
358
-
359
- var parentShape = element.parent;
360
-
361
- var businessObject = element.businessObject,
362
- di = getDi(element),
363
- parentBusinessObject = parentShape && parentShape.businessObject,
364
- parentDi = getDi(parentShape);
365
-
366
- if (is(element, 'bpmn:FlowNode')) {
367
- this.updateFlowNodeRefs(businessObject, parentBusinessObject, oldParent && oldParent.businessObject);
368
- }
369
-
370
- if (is(element, 'bpmn:DataOutputAssociation')) {
371
- if (element.source) {
372
- parentBusinessObject = element.source.businessObject;
373
- } else {
374
- parentBusinessObject = null;
375
- }
376
- }
377
-
378
- if (is(element, 'bpmn:DataInputAssociation')) {
379
- if (element.target) {
380
- parentBusinessObject = element.target.businessObject;
381
- } else {
382
- parentBusinessObject = null;
383
- }
384
- }
385
-
386
- this.updateSemanticParent(businessObject, parentBusinessObject);
387
-
388
- if (is(element, 'bpmn:DataObjectReference') && businessObject.dataObjectRef) {
389
- this.updateSemanticParent(businessObject.dataObjectRef, parentBusinessObject);
390
- }
391
-
392
- this.updateDiParent(di, parentDi);
393
- };
394
-
395
- /**
396
- * @param {Shape} shape
397
- */
398
- BpmnUpdater.prototype.updateBounds = function(shape) {
399
-
400
- var di = getDi(shape),
401
- embeddedLabelBounds = getEmbeddedLabelBounds(shape);
402
-
403
- // update embedded label bounds if possible
404
- if (embeddedLabelBounds) {
405
- var embeddedLabelBoundsDelta = delta(embeddedLabelBounds, di.get('bounds'));
406
-
407
- assign(embeddedLabelBounds, {
408
- x: shape.x + embeddedLabelBoundsDelta.x,
409
- y: shape.y + embeddedLabelBoundsDelta.y
410
- });
411
- }
412
-
413
- var target = isLabel(shape) ? this._getLabel(di) : di;
414
-
415
- var bounds = target.bounds;
416
-
417
- if (!bounds) {
418
- bounds = this._bpmnFactory.createDiBounds();
419
- target.set('bounds', bounds);
420
- }
421
-
422
- assign(bounds, {
423
- x: shape.x,
424
- y: shape.y,
425
- width: shape.width,
426
- height: shape.height
427
- });
428
- };
429
-
430
- /**
431
- * @param {ModdleElement} businessObject
432
- * @param {ModdleElement} newContainment
433
- * @param {ModdleElement} oldContainment
434
- */
435
- BpmnUpdater.prototype.updateFlowNodeRefs = function(businessObject, newContainment, oldContainment) {
436
-
437
- if (oldContainment === newContainment) {
438
- return;
439
- }
440
-
441
- var oldRefs, newRefs;
442
-
443
- if (is (oldContainment, 'bpmn:Lane')) {
444
- oldRefs = oldContainment.get('flowNodeRef');
445
- collectionRemove(oldRefs, businessObject);
446
- }
447
-
448
- if (is(newContainment, 'bpmn:Lane')) {
449
- newRefs = newContainment.get('flowNodeRef');
450
- collectionAdd(newRefs, businessObject);
451
- }
452
- };
453
-
454
- /**
455
- * @param {Connection} connection
456
- * @param {Element} newSource
457
- * @param {Element} newTarget
458
- */
459
- BpmnUpdater.prototype.updateDiConnection = function(connection, newSource, newTarget) {
460
- var connectionDi = getDi(connection),
461
- newSourceDi = getDi(newSource),
462
- newTargetDi = getDi(newTarget);
463
-
464
- if (connectionDi.sourceElement && connectionDi.sourceElement.bpmnElement !== getBusinessObject(newSource)) {
465
- connectionDi.sourceElement = newSource && newSourceDi;
466
- }
467
-
468
- if (connectionDi.targetElement && connectionDi.targetElement.bpmnElement !== getBusinessObject(newTarget)) {
469
- connectionDi.targetElement = newTarget && newTargetDi;
470
- }
471
-
472
- };
473
-
474
- /**
475
- * @param {ModdleElement} di
476
- * @param {ModdleElement} parentDi
477
- */
478
- BpmnUpdater.prototype.updateDiParent = function(di, parentDi) {
479
-
480
- if (parentDi && !is(parentDi, 'bpmndi:BPMNPlane')) {
481
- parentDi = parentDi.$parent;
482
- }
483
-
484
- if (di.$parent === parentDi) {
485
- return;
486
- }
487
-
488
- var planeElements = (parentDi || di.$parent).get('planeElement');
489
-
490
- if (parentDi) {
491
- planeElements.push(di);
492
- di.$parent = parentDi;
493
- } else {
494
- collectionRemove(planeElements, di);
495
- di.$parent = null;
496
- }
497
- };
498
-
499
- /**
500
- * @param {ModdleElement} element
501
- *
502
- * @return {ModdleElement}
503
- */
504
- function getDefinitions(element) {
505
- while (element && !is(element, 'bpmn:Definitions')) {
506
- element = element.$parent;
507
- }
508
-
509
- return element;
510
- }
511
-
512
- /**
513
- * @param {ModdleElement} container
514
- *
515
- * @return {ModdleElement}
516
- */
517
- BpmnUpdater.prototype.getLaneSet = function(container) {
518
-
519
- var laneSet, laneSets;
520
-
521
- // bpmn:Lane
522
- if (is(container, 'bpmn:Lane')) {
523
- laneSet = container.childLaneSet;
524
-
525
- if (!laneSet) {
526
- laneSet = this._bpmnFactory.create('bpmn:LaneSet');
527
- container.childLaneSet = laneSet;
528
- laneSet.$parent = container;
529
- }
530
-
531
- return laneSet;
532
- }
533
-
534
- // bpmn:Participant
535
- if (is(container, 'bpmn:Participant')) {
536
- container = container.processRef;
537
- }
538
-
539
- // bpmn:FlowElementsContainer
540
- laneSets = container.get('laneSets');
541
- laneSet = laneSets[0];
542
-
543
- if (!laneSet) {
544
- laneSet = this._bpmnFactory.create('bpmn:LaneSet');
545
- laneSet.$parent = container;
546
- laneSets.push(laneSet);
547
- }
548
-
549
- return laneSet;
550
- };
551
-
552
- /**
553
- * @param {ModdleElement} businessObject
554
- * @param {ModdleElement} newParent
555
- * @param {ModdleElement} visualParent
556
- */
557
- BpmnUpdater.prototype.updateSemanticParent = function(businessObject, newParent, visualParent) {
558
-
559
- var containment;
560
-
561
- if (businessObject.$parent === newParent) {
562
- return;
563
- }
564
-
565
- if (is(businessObject, 'bpmn:DataInput') || is(businessObject, 'bpmn:DataOutput')) {
566
-
567
- if (is(newParent, 'bpmn:Participant') && 'processRef' in newParent) {
568
- newParent = newParent.processRef;
569
- }
570
-
571
- // already in correct ioSpecification
572
- if ('ioSpecification' in newParent && newParent.ioSpecification === businessObject.$parent) {
573
- return;
574
- }
575
- }
576
-
577
- if (is(businessObject, 'bpmn:Lane')) {
578
-
579
- if (newParent) {
580
- newParent = this.getLaneSet(newParent);
581
- }
582
-
583
- containment = 'lanes';
584
- } else if (is(businessObject, 'bpmn:FlowElement')) {
585
-
586
- if (newParent) {
587
-
588
- if (is(newParent, 'bpmn:Participant')) {
589
- newParent = newParent.processRef;
590
- } else if (is(newParent, 'bpmn:Lane')) {
591
- do {
592
-
593
- // unwrap Lane -> LaneSet -> (Lane | FlowElementsContainer)
594
- newParent = newParent.$parent.$parent;
595
- } while (is(newParent, 'bpmn:Lane'));
596
-
597
- }
598
- }
599
-
600
- containment = 'flowElements';
601
-
602
- } else if (is(businessObject, 'bpmn:Artifact')) {
603
-
604
- while (newParent &&
605
- !is(newParent, 'bpmn:Process') &&
606
- !is(newParent, 'bpmn:SubProcess') &&
607
- !is(newParent, 'bpmn:Collaboration')) {
608
-
609
- if (is(newParent, 'bpmn:Participant')) {
610
- newParent = newParent.processRef;
611
- break;
612
- } else {
613
- newParent = newParent.$parent;
614
- }
615
- }
616
-
617
- containment = 'artifacts';
618
- } else if (is(businessObject, 'bpmn:MessageFlow')) {
619
- containment = 'messageFlows';
620
- } else if (is(businessObject, 'bpmn:Participant')) {
621
- containment = 'participants';
622
-
623
- // make sure the participants process is properly attached / detached
624
- // from the XML document
625
-
626
- var process = businessObject.processRef,
627
- definitions;
628
-
629
- if (process) {
630
- definitions = getDefinitions(businessObject.$parent || newParent);
631
-
632
- if (businessObject.$parent) {
633
- collectionRemove(definitions.get('rootElements'), process);
634
- process.$parent = null;
635
- }
636
-
637
- if (newParent) {
638
- collectionAdd(definitions.get('rootElements'), process);
639
- process.$parent = definitions;
640
- }
641
- }
642
- } else if (is(businessObject, 'bpmn:DataOutputAssociation')) {
643
- containment = 'dataOutputAssociations';
644
- } else if (is(businessObject, 'bpmn:DataInputAssociation')) {
645
- containment = 'dataInputAssociations';
646
- }
647
-
648
- if (!containment) {
649
- throw new Error(`no parent for <${ businessObject.id }> in <${ newParent.id }>`);
650
- }
651
-
652
- var children;
653
-
654
- if (businessObject.$parent) {
655
-
656
- // remove from old parent
657
- children = businessObject.$parent.get(containment);
658
- collectionRemove(children, businessObject);
659
- }
660
-
661
- if (!newParent) {
662
- businessObject.$parent = null;
663
- } else {
664
-
665
- // add to new parent
666
- children = newParent.get(containment);
667
- children.push(businessObject);
668
- businessObject.$parent = newParent;
669
- }
670
-
671
- if (visualParent) {
672
- var diChildren = visualParent.get(containment);
673
-
674
- collectionRemove(children, businessObject);
675
-
676
- if (newParent) {
677
-
678
- if (!diChildren) {
679
- diChildren = [];
680
- newParent.set(containment, diChildren);
681
- }
682
-
683
- diChildren.push(businessObject);
684
- }
685
- }
686
- };
687
-
688
- /**
689
- * @param {Connection} connection
690
- */
691
- BpmnUpdater.prototype.updateConnectionWaypoints = function(connection) {
692
- var di = getDi(connection);
693
-
694
- di.set('waypoint', this._bpmnFactory.createDiWaypoints(connection.waypoints));
695
- };
696
-
697
- /**
698
- * @param { {
699
- * connection: Connection;
700
- * parent: Parent;
701
- * newParent: Parent;
702
- * } } context
703
- */
704
- BpmnUpdater.prototype.updateConnection = function(context) {
705
- var connection = context.connection,
706
- businessObject = getBusinessObject(connection),
707
- newSource = connection.source,
708
- newSourceBo = getBusinessObject(newSource),
709
- newTarget = connection.target,
710
- newTargetBo = getBusinessObject(connection.target),
711
- visualParent;
712
-
713
- if (!is(businessObject, 'bpmn:DataAssociation')) {
714
-
715
- var inverseSet = is(businessObject, 'bpmn:SequenceFlow');
716
-
717
- if (businessObject.sourceRef !== newSourceBo) {
718
- if (inverseSet) {
719
- collectionRemove(businessObject.sourceRef && businessObject.sourceRef.get('outgoing'), businessObject);
720
-
721
- if (newSourceBo && newSourceBo.get('outgoing')) {
722
- newSourceBo.get('outgoing').push(businessObject);
723
- }
724
- }
725
-
726
- businessObject.sourceRef = newSourceBo;
727
- }
728
-
729
- if (businessObject.targetRef !== newTargetBo) {
730
- if (inverseSet) {
731
- collectionRemove(businessObject.targetRef && businessObject.targetRef.get('incoming'), businessObject);
732
-
733
- if (newTargetBo && newTargetBo.get('incoming')) {
734
- newTargetBo.get('incoming').push(businessObject);
735
- }
736
- }
737
-
738
- businessObject.targetRef = newTargetBo;
739
- }
740
- } else if (is(businessObject, 'bpmn:DataInputAssociation')) {
741
-
742
- // handle obnoxious isMsome sourceRef
743
- businessObject.get('sourceRef')[0] = newSourceBo;
744
-
745
- visualParent = context.parent || context.newParent || newTargetBo;
746
-
747
- this.updateSemanticParent(businessObject, newTargetBo, visualParent);
748
- } else if (is(businessObject, 'bpmn:DataOutputAssociation')) {
749
- visualParent = context.parent || context.newParent || newSourceBo;
750
-
751
- this.updateSemanticParent(businessObject, newSourceBo, visualParent);
752
-
753
- // targetRef = new target
754
- businessObject.targetRef = newTargetBo;
755
- }
756
-
757
- this.updateConnectionWaypoints(connection);
758
-
759
- this.updateDiConnection(connection, newSource, newTarget);
760
- };
761
-
762
-
763
- // helpers //////////////////////
764
-
765
- BpmnUpdater.prototype._getLabel = function(di) {
766
- if (!di.label) {
767
- di.label = this._bpmnFactory.createDiLabel();
768
- }
769
-
770
- return di.label;
771
- };
772
-
773
-
774
- /**
775
- * Call function if shape or connection is BPMN element.
776
- *
777
- * @param {Function} fn
778
- *
779
- * @return {Function}
780
- */
781
- function ifBpmn(fn) {
782
-
783
- return function(event) {
784
-
785
- var context = event.context,
786
- element = context.shape || context.connection || context.element;
787
-
788
- if (is(element, 'bpmn:BaseElement')) {
789
- fn(event);
790
- }
791
- };
792
- }
793
-
794
- /**
795
- * Return dc:Bounds of bpmndi:BPMNLabel if exists.
796
- *
797
- * @param {Shape} shape
798
- *
799
- * @return {ModdleElement|undefined}
800
- */
801
- function getEmbeddedLabelBounds(shape) {
802
- if (!is(shape, 'bpmn:Activity')) {
803
- return;
804
- }
805
-
806
- var di = getDi(shape);
807
-
808
- if (!di) {
809
- return;
810
- }
811
-
812
- var label = di.get('label');
813
-
814
- if (!label) {
815
- return;
816
- }
817
-
818
- return label.get('bounds');
1
+ import {
2
+ assign,
3
+ forEach
4
+ } from 'min-dash';
5
+
6
+ import inherits from 'inherits-browser';
7
+
8
+ import {
9
+ add as collectionAdd,
10
+ remove as collectionRemove
11
+ } from 'diagram-js/lib/util/Collections';
12
+
13
+ import {
14
+ getBusinessObject,
15
+ getDi,
16
+ is
17
+ } from '../../util/ModelUtil';
18
+
19
+ import { isAny } from './util/ModelingUtil';
20
+
21
+ import {
22
+ getLabel,
23
+ isLabel,
24
+ isLabelExternal
25
+ } from '../../util/LabelUtil';
26
+
27
+ import { isPlane } from '../../util/DrilldownUtil';
28
+
29
+ import { delta } from 'diagram-js/lib/util/PositionUtil';
30
+
31
+ import CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';
32
+
33
+ /**
34
+ * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus
35
+ * @typedef {import('./BpmnFactory').default} BpmnFactory
36
+ * @typedef {import('diagram-js/lib/layout/CroppingConnectionDocking').default} CroppingConnectionDocking
37
+ *
38
+ * @typedef {import('../../model/Types').Connection} Connection
39
+ * @typedef {import('../../model/Types').Element} Element
40
+ * @typedef {import('../../model/Types').Shape} Shape
41
+ * @typedef {import('../../model/Types').Parent} Parent
42
+ * @typedef {import('../../model/Types').ModdleElement} ModdleElement
43
+ */
44
+
45
+ /**
46
+ * A handler responsible for updating the underlying BPMN 2.0 XML & DI
47
+ * once changes on the diagram happen.
48
+ *
49
+ * @param {EventBus} eventBus
50
+ * @param {BpmnFactory} bpmnFactory
51
+ * @param {CroppingConnectionDocking} connectionDocking
52
+ */
53
+ export default function BpmnUpdater(
54
+ eventBus,
55
+ bpmnFactory,
56
+ connectionDocking
57
+ ) {
58
+
59
+ CommandInterceptor.call(this, eventBus);
60
+
61
+ this._bpmnFactory = bpmnFactory;
62
+
63
+ var self = this;
64
+
65
+
66
+ // connection cropping //////////////////////
67
+
68
+ // crop connection ends during create/update
69
+ function cropConnection(e) {
70
+ var context = e.context,
71
+ hints = context.hints || {},
72
+ connection;
73
+
74
+ if (!context.cropped && hints.createElementsBehavior !== false) {
75
+ connection = context.connection;
76
+ connection.waypoints = connectionDocking.getCroppedWaypoints(connection);
77
+ context.cropped = true;
78
+ }
79
+ }
80
+
81
+ this.executed([
82
+ 'connection.layout',
83
+ 'connection.create'
84
+ ], cropConnection);
85
+
86
+ this.reverted([ 'connection.layout' ], function(e) {
87
+ delete e.context.cropped;
88
+ });
89
+
90
+
91
+
92
+ // BPMN + DI update //////////////////////
93
+
94
+
95
+ // update parent
96
+ function updateParent(e) {
97
+ var context = e.context;
98
+
99
+ self.updateParent(context.shape || context.connection, context.oldParent);
100
+ }
101
+
102
+ function reverseUpdateParent(e) {
103
+ var context = e.context;
104
+
105
+ var element = context.shape || context.connection,
106
+
107
+ // oldParent is the (old) new parent, because we are undoing
108
+ oldParent = context.parent || context.newParent;
109
+
110
+ self.updateParent(element, oldParent);
111
+ }
112
+
113
+ this.executed([
114
+ 'shape.move',
115
+ 'shape.create',
116
+ 'shape.delete',
117
+ 'connection.create',
118
+ 'connection.move',
119
+ 'connection.delete'
120
+ ], ifBpmn(updateParent));
121
+
122
+ this.reverted([
123
+ 'shape.move',
124
+ 'shape.create',
125
+ 'shape.delete',
126
+ 'connection.create',
127
+ 'connection.move',
128
+ 'connection.delete'
129
+ ], ifBpmn(reverseUpdateParent));
130
+
131
+ /*
132
+ * ## Updating Parent
133
+ *
134
+ * When morphing a Process into a Collaboration or vice-versa,
135
+ * make sure that both the *semantic* and *di* parent of each element
136
+ * is updated.
137
+ *
138
+ */
139
+ function updateRoot(event) {
140
+ var context = event.context,
141
+ oldRoot = context.oldRoot,
142
+ children = oldRoot.children;
143
+
144
+ forEach(children, function(child) {
145
+ if (is(child, 'bpmn:BaseElement')) {
146
+ self.updateParent(child);
147
+ }
148
+ });
149
+ }
150
+
151
+ this.executed([ 'canvas.updateRoot' ], updateRoot);
152
+ this.reverted([ 'canvas.updateRoot' ], updateRoot);
153
+
154
+
155
+ // update bounds
156
+ function updateBounds(e) {
157
+ var shape = e.context.shape;
158
+
159
+ if (!is(shape, 'bpmn:BaseElement')) {
160
+ return;
161
+ }
162
+
163
+ self.updateBounds(shape);
164
+ }
165
+
166
+ this.executed([ 'shape.move', 'shape.create', 'shape.resize' ], ifBpmn(function(event) {
167
+
168
+ // exclude labels because they're handled separately during shape.changed
169
+ if (event.context.shape.type === 'label') {
170
+ return;
171
+ }
172
+
173
+ updateBounds(event);
174
+ }));
175
+
176
+ this.reverted([ 'shape.move', 'shape.create', 'shape.resize' ], ifBpmn(function(event) {
177
+
178
+ // exclude labels because they're handled separately during shape.changed
179
+ if (event.context.shape.type === 'label') {
180
+ return;
181
+ }
182
+
183
+ updateBounds(event);
184
+ }));
185
+
186
+ // Handle labels separately. This is necessary, because the label bounds have to be updated
187
+ // every time its shape changes, not only on move, create and resize.
188
+ eventBus.on('shape.changed', function(event) {
189
+ if (event.element.type === 'label') {
190
+ updateBounds({ context: { shape: event.element } });
191
+ }
192
+ });
193
+
194
+ // attach / detach connection
195
+ function updateConnection(e) {
196
+ self.updateConnection(e.context);
197
+ }
198
+
199
+ this.executed([
200
+ 'connection.create',
201
+ 'connection.move',
202
+ 'connection.delete',
203
+ 'connection.reconnect'
204
+ ], ifBpmn(updateConnection));
205
+
206
+ this.reverted([
207
+ 'connection.create',
208
+ 'connection.move',
209
+ 'connection.delete',
210
+ 'connection.reconnect'
211
+ ], ifBpmn(updateConnection));
212
+
213
+
214
+ // update waypoints
215
+ function updateConnectionWaypoints(e) {
216
+ self.updateConnectionWaypoints(e.context.connection);
217
+ }
218
+
219
+ this.executed([
220
+ 'connection.layout',
221
+ 'connection.move',
222
+ 'connection.updateWaypoints',
223
+ ], ifBpmn(updateConnectionWaypoints));
224
+
225
+ this.reverted([
226
+ 'connection.layout',
227
+ 'connection.move',
228
+ 'connection.updateWaypoints',
229
+ ], ifBpmn(updateConnectionWaypoints));
230
+
231
+ // update conditional/default flows
232
+ this.executed('connection.reconnect', ifBpmn(function(event) {
233
+ var context = event.context,
234
+ connection = context.connection,
235
+ oldSource = context.oldSource,
236
+ newSource = context.newSource,
237
+ connectionBo = getBusinessObject(connection),
238
+ oldSourceBo = getBusinessObject(oldSource),
239
+ newSourceBo = getBusinessObject(newSource);
240
+
241
+ // remove condition from connection on reconnect to new source
242
+ // if new source can NOT have condional sequence flow
243
+ if (connectionBo.conditionExpression && !isAny(newSourceBo, [
244
+ 'bpmn:Activity',
245
+ 'bpmn:ExclusiveGateway',
246
+ 'bpmn:InclusiveGateway'
247
+ ])) {
248
+ context.oldConditionExpression = connectionBo.conditionExpression;
249
+
250
+ delete connectionBo.conditionExpression;
251
+ }
252
+
253
+ // remove default from old source flow on reconnect to new source
254
+ // if source changed
255
+ if (oldSource !== newSource && oldSourceBo.default === connectionBo) {
256
+ context.oldDefault = oldSourceBo.default;
257
+
258
+ delete oldSourceBo.default;
259
+ }
260
+ }));
261
+
262
+ this.reverted('connection.reconnect', ifBpmn(function(event) {
263
+ var context = event.context,
264
+ connection = context.connection,
265
+ oldSource = context.oldSource,
266
+ newSource = context.newSource,
267
+ connectionBo = getBusinessObject(connection),
268
+ oldSourceBo = getBusinessObject(oldSource),
269
+ newSourceBo = getBusinessObject(newSource);
270
+
271
+ // add condition to connection on revert reconnect to new source
272
+ if (context.oldConditionExpression) {
273
+ connectionBo.conditionExpression = context.oldConditionExpression;
274
+ }
275
+
276
+ // add default to old source on revert reconnect to new source
277
+ if (context.oldDefault) {
278
+ oldSourceBo.default = context.oldDefault;
279
+
280
+ delete newSourceBo.default;
281
+ }
282
+ }));
283
+
284
+ // update attachments
285
+ function updateAttachment(e) {
286
+ self.updateAttachment(e.context);
287
+ }
288
+
289
+ this.executed([ 'element.updateAttachment' ], ifBpmn(updateAttachment));
290
+ this.reverted([ 'element.updateAttachment' ], ifBpmn(updateAttachment));
291
+
292
+
293
+ // update BPMNLabel
294
+ this.executed('element.updateLabel', ifBpmn(updateBPMNLabel));
295
+ this.reverted('element.updateLabel', ifBpmn(updateBPMNLabel));
296
+
297
+ function updateBPMNLabel(event) {
298
+ const { element } = event.context,
299
+ label = getLabel(element);
300
+ const di = getDi(element),
301
+ diLabel = di && di.get('label');
302
+
303
+ if (isLabelExternal(element) || isPlane(element)) {
304
+ return;
305
+ }
306
+
307
+ if (label && !diLabel) {
308
+ di.set('label', bpmnFactory.create('bpmndi:BPMNLabel'));
309
+ } else if (!label && diLabel) {
310
+ di.set('label', undefined);
311
+ }
312
+ }
313
+ }
314
+
315
+ inherits(BpmnUpdater, CommandInterceptor);
316
+
317
+ BpmnUpdater.$inject = [
318
+ 'eventBus',
319
+ 'bpmnFactory',
320
+ 'connectionDocking'
321
+ ];
322
+
323
+
324
+ // implementation //////////////////////
325
+
326
+ /**
327
+ * @param { {
328
+ * shape: Shape;
329
+ * host: Shape;
330
+ * } } context
331
+ */
332
+ BpmnUpdater.prototype.updateAttachment = function(context) {
333
+
334
+ var shape = context.shape,
335
+ businessObject = shape.businessObject,
336
+ host = shape.host;
337
+
338
+ businessObject.attachedToRef = host && host.businessObject;
339
+ };
340
+
341
+ /**
342
+ * @param {Element} element
343
+ * @param {Parent} oldParent
344
+ */
345
+ BpmnUpdater.prototype.updateParent = function(element, oldParent) {
346
+
347
+ // do not update BPMN 2.0 label parent
348
+ if (isLabel(element)) {
349
+ return;
350
+ }
351
+
352
+ // data stores in collaborations are handled separately by DataStoreBehavior
353
+ if (is(element, 'bpmn:DataStoreReference') &&
354
+ element.parent &&
355
+ is(element.parent, 'bpmn:Collaboration')) {
356
+ return;
357
+ }
358
+
359
+ var parentShape = element.parent;
360
+
361
+ var businessObject = element.businessObject,
362
+ di = getDi(element),
363
+ parentBusinessObject = parentShape && parentShape.businessObject,
364
+ parentDi = getDi(parentShape);
365
+
366
+ if (is(element, 'bpmn:FlowNode')) {
367
+ this.updateFlowNodeRefs(businessObject, parentBusinessObject, oldParent && oldParent.businessObject);
368
+ }
369
+
370
+ if (is(element, 'bpmn:DataOutputAssociation')) {
371
+ if (element.source) {
372
+ parentBusinessObject = element.source.businessObject;
373
+ } else {
374
+ parentBusinessObject = null;
375
+ }
376
+ }
377
+
378
+ if (is(element, 'bpmn:DataInputAssociation')) {
379
+ if (element.target) {
380
+ parentBusinessObject = element.target.businessObject;
381
+ } else {
382
+ parentBusinessObject = null;
383
+ }
384
+ }
385
+
386
+ this.updateSemanticParent(businessObject, parentBusinessObject);
387
+
388
+ if (is(element, 'bpmn:DataObjectReference') && businessObject.dataObjectRef) {
389
+ this.updateSemanticParent(businessObject.dataObjectRef, parentBusinessObject);
390
+ }
391
+
392
+ this.updateDiParent(di, parentDi);
393
+ };
394
+
395
+ /**
396
+ * @param {Shape} shape
397
+ */
398
+ BpmnUpdater.prototype.updateBounds = function(shape) {
399
+
400
+ var di = getDi(shape),
401
+ embeddedLabelBounds = getEmbeddedLabelBounds(shape);
402
+
403
+ // update embedded label bounds if possible
404
+ if (embeddedLabelBounds) {
405
+ var embeddedLabelBoundsDelta = delta(embeddedLabelBounds, di.get('bounds'));
406
+
407
+ assign(embeddedLabelBounds, {
408
+ x: shape.x + embeddedLabelBoundsDelta.x,
409
+ y: shape.y + embeddedLabelBoundsDelta.y
410
+ });
411
+ }
412
+
413
+ var target = isLabel(shape) ? this._getLabel(di) : di;
414
+
415
+ var bounds = target.bounds;
416
+
417
+ if (!bounds) {
418
+ bounds = this._bpmnFactory.createDiBounds();
419
+ target.set('bounds', bounds);
420
+ }
421
+
422
+ assign(bounds, {
423
+ x: shape.x,
424
+ y: shape.y,
425
+ width: shape.width,
426
+ height: shape.height
427
+ });
428
+ };
429
+
430
+ /**
431
+ * @param {ModdleElement} businessObject
432
+ * @param {ModdleElement} newContainment
433
+ * @param {ModdleElement} oldContainment
434
+ */
435
+ BpmnUpdater.prototype.updateFlowNodeRefs = function(businessObject, newContainment, oldContainment) {
436
+
437
+ if (oldContainment === newContainment) {
438
+ return;
439
+ }
440
+
441
+ var oldRefs, newRefs;
442
+
443
+ if (is (oldContainment, 'bpmn:Lane')) {
444
+ oldRefs = oldContainment.get('flowNodeRef');
445
+ collectionRemove(oldRefs, businessObject);
446
+ }
447
+
448
+ if (is(newContainment, 'bpmn:Lane')) {
449
+ newRefs = newContainment.get('flowNodeRef');
450
+ collectionAdd(newRefs, businessObject);
451
+ }
452
+ };
453
+
454
+ /**
455
+ * @param {Connection} connection
456
+ * @param {Element} newSource
457
+ * @param {Element} newTarget
458
+ */
459
+ BpmnUpdater.prototype.updateDiConnection = function(connection, newSource, newTarget) {
460
+ var connectionDi = getDi(connection),
461
+ newSourceDi = getDi(newSource),
462
+ newTargetDi = getDi(newTarget);
463
+
464
+ if (connectionDi.sourceElement && connectionDi.sourceElement.bpmnElement !== getBusinessObject(newSource)) {
465
+ connectionDi.sourceElement = newSource && newSourceDi;
466
+ }
467
+
468
+ if (connectionDi.targetElement && connectionDi.targetElement.bpmnElement !== getBusinessObject(newTarget)) {
469
+ connectionDi.targetElement = newTarget && newTargetDi;
470
+ }
471
+
472
+ };
473
+
474
+ /**
475
+ * @param {ModdleElement} di
476
+ * @param {ModdleElement} parentDi
477
+ */
478
+ BpmnUpdater.prototype.updateDiParent = function(di, parentDi) {
479
+
480
+ if (parentDi && !is(parentDi, 'bpmndi:BPMNPlane')) {
481
+ parentDi = parentDi.$parent;
482
+ }
483
+
484
+ if (di.$parent === parentDi) {
485
+ return;
486
+ }
487
+
488
+ var planeElements = (parentDi || di.$parent).get('planeElement');
489
+
490
+ if (parentDi) {
491
+ planeElements.push(di);
492
+ di.$parent = parentDi;
493
+ } else {
494
+ collectionRemove(planeElements, di);
495
+ di.$parent = null;
496
+ }
497
+ };
498
+
499
+ /**
500
+ * @param {ModdleElement} element
501
+ *
502
+ * @return {ModdleElement}
503
+ */
504
+ function getDefinitions(element) {
505
+ while (element && !is(element, 'bpmn:Definitions')) {
506
+ element = element.$parent;
507
+ }
508
+
509
+ return element;
510
+ }
511
+
512
+ /**
513
+ * @param {ModdleElement} container
514
+ *
515
+ * @return {ModdleElement}
516
+ */
517
+ BpmnUpdater.prototype.getLaneSet = function(container) {
518
+
519
+ var laneSet, laneSets;
520
+
521
+ // bpmn:Lane
522
+ if (is(container, 'bpmn:Lane')) {
523
+ laneSet = container.childLaneSet;
524
+
525
+ if (!laneSet) {
526
+ laneSet = this._bpmnFactory.create('bpmn:LaneSet');
527
+ container.childLaneSet = laneSet;
528
+ laneSet.$parent = container;
529
+ }
530
+
531
+ return laneSet;
532
+ }
533
+
534
+ // bpmn:Participant
535
+ if (is(container, 'bpmn:Participant')) {
536
+ container = container.processRef;
537
+ }
538
+
539
+ // bpmn:FlowElementsContainer
540
+ laneSets = container.get('laneSets');
541
+ laneSet = laneSets[0];
542
+
543
+ if (!laneSet) {
544
+ laneSet = this._bpmnFactory.create('bpmn:LaneSet');
545
+ laneSet.$parent = container;
546
+ laneSets.push(laneSet);
547
+ }
548
+
549
+ return laneSet;
550
+ };
551
+
552
+ /**
553
+ * @param {ModdleElement} businessObject
554
+ * @param {ModdleElement} newParent
555
+ * @param {ModdleElement} visualParent
556
+ */
557
+ BpmnUpdater.prototype.updateSemanticParent = function(businessObject, newParent, visualParent) {
558
+
559
+ var containment;
560
+
561
+ if (businessObject.$parent === newParent) {
562
+ return;
563
+ }
564
+
565
+ if (is(businessObject, 'bpmn:DataInput') || is(businessObject, 'bpmn:DataOutput')) {
566
+
567
+ if (is(newParent, 'bpmn:Participant') && 'processRef' in newParent) {
568
+ newParent = newParent.processRef;
569
+ }
570
+
571
+ // already in correct ioSpecification
572
+ if ('ioSpecification' in newParent && newParent.ioSpecification === businessObject.$parent) {
573
+ return;
574
+ }
575
+ }
576
+
577
+ if (is(businessObject, 'bpmn:Lane')) {
578
+
579
+ if (newParent) {
580
+ newParent = this.getLaneSet(newParent);
581
+ }
582
+
583
+ containment = 'lanes';
584
+ } else if (is(businessObject, 'bpmn:FlowElement')) {
585
+
586
+ if (newParent) {
587
+
588
+ if (is(newParent, 'bpmn:Participant')) {
589
+ newParent = newParent.processRef;
590
+ } else if (is(newParent, 'bpmn:Lane')) {
591
+ do {
592
+
593
+ // unwrap Lane -> LaneSet -> (Lane | FlowElementsContainer)
594
+ newParent = newParent.$parent.$parent;
595
+ } while (is(newParent, 'bpmn:Lane'));
596
+
597
+ }
598
+ }
599
+
600
+ containment = 'flowElements';
601
+
602
+ } else if (is(businessObject, 'bpmn:Artifact')) {
603
+
604
+ while (newParent &&
605
+ !is(newParent, 'bpmn:Process') &&
606
+ !is(newParent, 'bpmn:SubProcess') &&
607
+ !is(newParent, 'bpmn:Collaboration')) {
608
+
609
+ if (is(newParent, 'bpmn:Participant')) {
610
+ newParent = newParent.processRef;
611
+ break;
612
+ } else {
613
+ newParent = newParent.$parent;
614
+ }
615
+ }
616
+
617
+ containment = 'artifacts';
618
+ } else if (is(businessObject, 'bpmn:MessageFlow')) {
619
+ containment = 'messageFlows';
620
+ } else if (is(businessObject, 'bpmn:Participant')) {
621
+ containment = 'participants';
622
+
623
+ // make sure the participants process is properly attached / detached
624
+ // from the XML document
625
+
626
+ var process = businessObject.processRef,
627
+ definitions;
628
+
629
+ if (process) {
630
+ definitions = getDefinitions(businessObject.$parent || newParent);
631
+
632
+ if (businessObject.$parent) {
633
+ collectionRemove(definitions.get('rootElements'), process);
634
+ process.$parent = null;
635
+ }
636
+
637
+ if (newParent) {
638
+ collectionAdd(definitions.get('rootElements'), process);
639
+ process.$parent = definitions;
640
+ }
641
+ }
642
+ } else if (is(businessObject, 'bpmn:DataOutputAssociation')) {
643
+ containment = 'dataOutputAssociations';
644
+ } else if (is(businessObject, 'bpmn:DataInputAssociation')) {
645
+ containment = 'dataInputAssociations';
646
+ }
647
+
648
+ if (!containment) {
649
+ throw new Error(`no parent for <${ businessObject.id }> in <${ newParent.id }>`);
650
+ }
651
+
652
+ var children;
653
+
654
+ if (businessObject.$parent) {
655
+
656
+ // remove from old parent
657
+ children = businessObject.$parent.get(containment);
658
+ collectionRemove(children, businessObject);
659
+ }
660
+
661
+ if (!newParent) {
662
+ businessObject.$parent = null;
663
+ } else {
664
+
665
+ // add to new parent
666
+ children = newParent.get(containment);
667
+ children.push(businessObject);
668
+ businessObject.$parent = newParent;
669
+ }
670
+
671
+ if (visualParent) {
672
+ var diChildren = visualParent.get(containment);
673
+
674
+ collectionRemove(children, businessObject);
675
+
676
+ if (newParent) {
677
+
678
+ if (!diChildren) {
679
+ diChildren = [];
680
+ newParent.set(containment, diChildren);
681
+ }
682
+
683
+ diChildren.push(businessObject);
684
+ }
685
+ }
686
+ };
687
+
688
+ /**
689
+ * @param {Connection} connection
690
+ */
691
+ BpmnUpdater.prototype.updateConnectionWaypoints = function(connection) {
692
+ var di = getDi(connection);
693
+
694
+ di.set('waypoint', this._bpmnFactory.createDiWaypoints(connection.waypoints));
695
+ };
696
+
697
+ /**
698
+ * @param { {
699
+ * connection: Connection;
700
+ * parent: Parent;
701
+ * newParent: Parent;
702
+ * } } context
703
+ */
704
+ BpmnUpdater.prototype.updateConnection = function(context) {
705
+ var connection = context.connection,
706
+ businessObject = getBusinessObject(connection),
707
+ newSource = connection.source,
708
+ newSourceBo = getBusinessObject(newSource),
709
+ newTarget = connection.target,
710
+ newTargetBo = getBusinessObject(connection.target),
711
+ visualParent;
712
+
713
+ if (!is(businessObject, 'bpmn:DataAssociation')) {
714
+
715
+ var inverseSet = is(businessObject, 'bpmn:SequenceFlow');
716
+
717
+ if (businessObject.sourceRef !== newSourceBo) {
718
+ if (inverseSet) {
719
+ collectionRemove(businessObject.sourceRef && businessObject.sourceRef.get('outgoing'), businessObject);
720
+
721
+ if (newSourceBo && newSourceBo.get('outgoing')) {
722
+ newSourceBo.get('outgoing').push(businessObject);
723
+ }
724
+ }
725
+
726
+ businessObject.sourceRef = newSourceBo;
727
+ }
728
+
729
+ if (businessObject.targetRef !== newTargetBo) {
730
+ if (inverseSet) {
731
+ collectionRemove(businessObject.targetRef && businessObject.targetRef.get('incoming'), businessObject);
732
+
733
+ if (newTargetBo && newTargetBo.get('incoming')) {
734
+ newTargetBo.get('incoming').push(businessObject);
735
+ }
736
+ }
737
+
738
+ businessObject.targetRef = newTargetBo;
739
+ }
740
+ } else if (is(businessObject, 'bpmn:DataInputAssociation')) {
741
+
742
+ // handle obnoxious isMsome sourceRef
743
+ businessObject.get('sourceRef')[0] = newSourceBo;
744
+
745
+ visualParent = context.parent || context.newParent || newTargetBo;
746
+
747
+ this.updateSemanticParent(businessObject, newTargetBo, visualParent);
748
+ } else if (is(businessObject, 'bpmn:DataOutputAssociation')) {
749
+ visualParent = context.parent || context.newParent || newSourceBo;
750
+
751
+ this.updateSemanticParent(businessObject, newSourceBo, visualParent);
752
+
753
+ // targetRef = new target
754
+ businessObject.targetRef = newTargetBo;
755
+ }
756
+
757
+ this.updateConnectionWaypoints(connection);
758
+
759
+ this.updateDiConnection(connection, newSource, newTarget);
760
+ };
761
+
762
+
763
+ // helpers //////////////////////
764
+
765
+ BpmnUpdater.prototype._getLabel = function(di) {
766
+ if (!di.label) {
767
+ di.label = this._bpmnFactory.createDiLabel();
768
+ }
769
+
770
+ return di.label;
771
+ };
772
+
773
+
774
+ /**
775
+ * Call function if shape or connection is BPMN element.
776
+ *
777
+ * @param {Function} fn
778
+ *
779
+ * @return {Function}
780
+ */
781
+ function ifBpmn(fn) {
782
+
783
+ return function(event) {
784
+
785
+ var context = event.context,
786
+ element = context.shape || context.connection || context.element;
787
+
788
+ if (is(element, 'bpmn:BaseElement')) {
789
+ fn(event);
790
+ }
791
+ };
792
+ }
793
+
794
+ /**
795
+ * Return dc:Bounds of bpmndi:BPMNLabel if exists.
796
+ *
797
+ * @param {Shape} shape
798
+ *
799
+ * @return {ModdleElement|undefined}
800
+ */
801
+ function getEmbeddedLabelBounds(shape) {
802
+ if (!is(shape, 'bpmn:Activity')) {
803
+ return;
804
+ }
805
+
806
+ var di = getDi(shape);
807
+
808
+ if (!di) {
809
+ return;
810
+ }
811
+
812
+ var label = di.get('label');
813
+
814
+ if (!label) {
815
+ return;
816
+ }
817
+
818
+ return label.get('bounds');
819
819
  }