bpmn-js 18.7.0 → 18.8.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 (340) 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 +39037 -39033
  5. package/dist/bpmn-modeler.production.min.js +2 -2
  6. package/dist/bpmn-navigated-viewer.development.js +20869 -20869
  7. package/dist/bpmn-navigated-viewer.production.min.js +1 -1
  8. package/dist/bpmn-viewer.development.js +20807 -20807
  9. package/dist/bpmn-viewer.production.min.js +1 -1
  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 +206 -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 +2412 -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 -286
  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/modeling/BpmnFactory.d.ts +73 -73
  120. package/lib/features/modeling/BpmnFactory.js +180 -180
  121. package/lib/features/modeling/BpmnLayouter.d.ts +30 -30
  122. package/lib/features/modeling/BpmnLayouter.js +488 -488
  123. package/lib/features/modeling/BpmnUpdater.d.ts +90 -90
  124. package/lib/features/modeling/BpmnUpdater.js +818 -818
  125. package/lib/features/modeling/ElementFactory.d.ts +117 -117
  126. package/lib/features/modeling/ElementFactory.js +412 -412
  127. package/lib/features/modeling/ElementFactory.test.ts +132 -132
  128. package/lib/features/modeling/Modeling.d.ts +150 -150
  129. package/lib/features/modeling/Modeling.js +309 -309
  130. package/lib/features/modeling/Modeling.test.ts +147 -147
  131. package/lib/features/modeling/behavior/AdaptiveLabelPositioningBehavior.d.ts +19 -19
  132. package/lib/features/modeling/behavior/AdaptiveLabelPositioningBehavior.js +288 -288
  133. package/lib/features/modeling/behavior/AppendBehavior.d.ts +6 -6
  134. package/lib/features/modeling/behavior/AppendBehavior.js +42 -42
  135. package/lib/features/modeling/behavior/AssociationBehavior.d.ts +11 -11
  136. package/lib/features/modeling/behavior/AttachEventBehavior.d.ts +15 -15
  137. package/lib/features/modeling/behavior/AttachEventBehavior.js +106 -106
  138. package/lib/features/modeling/behavior/BoundaryEventBehavior.d.ts +15 -15
  139. package/lib/features/modeling/behavior/BoundaryEventBehavior.js +74 -74
  140. package/lib/features/modeling/behavior/CompensateBoundaryEventBehavior.d.ts +17 -17
  141. package/lib/features/modeling/behavior/CompensateBoundaryEventBehavior.js +222 -222
  142. package/lib/features/modeling/behavior/CreateBehavior.d.ts +9 -9
  143. package/lib/features/modeling/behavior/CreateBehavior.js +33 -33
  144. package/lib/features/modeling/behavior/CreateDataObjectBehavior.d.ts +15 -15
  145. package/lib/features/modeling/behavior/CreateDataObjectBehavior.js +46 -43
  146. package/lib/features/modeling/behavior/CreateParticipantBehavior.d.ts +19 -19
  147. package/lib/features/modeling/behavior/CreateParticipantBehavior.js +237 -237
  148. package/lib/features/modeling/behavior/DataInputAssociationBehavior.d.ts +21 -21
  149. package/lib/features/modeling/behavior/DataInputAssociationBehavior.js +162 -162
  150. package/lib/features/modeling/behavior/DataStoreBehavior.d.ts +19 -19
  151. package/lib/features/modeling/behavior/DeleteLaneBehavior.d.ts +15 -15
  152. package/lib/features/modeling/behavior/DeleteLaneBehavior.js +162 -162
  153. package/lib/features/modeling/behavior/DetachEventBehavior.d.ts +15 -15
  154. package/lib/features/modeling/behavior/DetachEventBehavior.js +101 -101
  155. package/lib/features/modeling/behavior/DropOnFlowBehavior.d.ts +13 -13
  156. package/lib/features/modeling/behavior/DropOnFlowBehavior.js +221 -221
  157. package/lib/features/modeling/behavior/EventBasedGatewayBehavior.d.ts +11 -11
  158. package/lib/features/modeling/behavior/EventBasedGatewayBehavior.js +110 -110
  159. package/lib/features/modeling/behavior/FixHoverBehavior.d.ts +17 -17
  160. package/lib/features/modeling/behavior/GroupBehavior.d.ts +26 -26
  161. package/lib/features/modeling/behavior/ImportDockingFix.d.ts +13 -13
  162. package/lib/features/modeling/behavior/ImportDockingFix.js +83 -83
  163. package/lib/features/modeling/behavior/IsHorizontalFix.d.ts +10 -10
  164. package/lib/features/modeling/behavior/IsHorizontalFix.js +54 -54
  165. package/lib/features/modeling/behavior/LabelBehavior.d.ts +56 -56
  166. package/lib/features/modeling/behavior/LabelBehavior.js +364 -364
  167. package/lib/features/modeling/behavior/LayoutConnectionBehavior.d.ts +16 -16
  168. package/lib/features/modeling/behavior/LayoutConnectionBehavior.js +121 -121
  169. package/lib/features/modeling/behavior/MessageFlowBehavior.d.ts +15 -15
  170. package/lib/features/modeling/behavior/NonInterruptingBehavior.d.ts +4 -4
  171. package/lib/features/modeling/behavior/NonInterruptingBehavior.js +41 -41
  172. package/lib/features/modeling/behavior/RemoveElementBehavior.d.ts +13 -13
  173. package/lib/features/modeling/behavior/RemoveElementBehavior.js +91 -91
  174. package/lib/features/modeling/behavior/RemoveEmbeddedLabelBoundsBehavior.d.ts +16 -16
  175. package/lib/features/modeling/behavior/RemoveEmbeddedLabelBoundsBehavior.js +41 -41
  176. package/lib/features/modeling/behavior/RemoveParticipantBehavior.d.ts +15 -15
  177. package/lib/features/modeling/behavior/RemoveParticipantBehavior.js +59 -59
  178. package/lib/features/modeling/behavior/ReplaceConnectionBehavior.d.ts +15 -15
  179. package/lib/features/modeling/behavior/ReplaceConnectionBehavior.js +194 -194
  180. package/lib/features/modeling/behavior/ReplaceElementBehaviour.d.ts +23 -23
  181. package/lib/features/modeling/behavior/ReplaceElementBehaviour.js +144 -144
  182. package/lib/features/modeling/behavior/ResizeBehavior.d.ts +64 -64
  183. package/lib/features/modeling/behavior/ResizeBehavior.js +265 -265
  184. package/lib/features/modeling/behavior/ResizeLaneBehavior.d.ts +16 -16
  185. package/lib/features/modeling/behavior/ResizeLaneBehavior.js +70 -70
  186. package/lib/features/modeling/behavior/RootElementReferenceBehavior.d.ts +25 -25
  187. package/lib/features/modeling/behavior/SetCompensationActivityAfterPasteBehavior.d.ts +16 -16
  188. package/lib/features/modeling/behavior/SetCompensationActivityAfterPasteBehavior.js +66 -66
  189. package/lib/features/modeling/behavior/SpaceToolBehavior.d.ts +10 -10
  190. package/lib/features/modeling/behavior/SpaceToolBehavior.js +207 -207
  191. package/lib/features/modeling/behavior/SubProcessPlaneBehavior.d.ts +28 -28
  192. package/lib/features/modeling/behavior/SubProcessPlaneBehavior.js +588 -588
  193. package/lib/features/modeling/behavior/SubProcessStartEventBehavior.d.ts +15 -15
  194. package/lib/features/modeling/behavior/SubProcessStartEventBehavior.js +56 -56
  195. package/lib/features/modeling/behavior/TextAnnotationBehavior.d.ts +6 -6
  196. package/lib/features/modeling/behavior/TextAnnotationBehavior.js +42 -42
  197. package/lib/features/modeling/behavior/ToggleCollapseConnectionBehaviour.d.ts +14 -14
  198. package/lib/features/modeling/behavior/ToggleCollapseConnectionBehaviour.js +87 -87
  199. package/lib/features/modeling/behavior/ToggleElementCollapseBehaviour.d.ts +13 -13
  200. package/lib/features/modeling/behavior/ToggleElementCollapseBehaviour.js +156 -156
  201. package/lib/features/modeling/behavior/UnclaimIdBehavior.d.ts +19 -19
  202. package/lib/features/modeling/behavior/UnclaimIdBehavior.js +64 -64
  203. package/lib/features/modeling/behavior/UnsetDefaultFlowBehavior.d.ts +16 -16
  204. package/lib/features/modeling/behavior/UnsetDefaultFlowBehavior.js +59 -59
  205. package/lib/features/modeling/behavior/UpdateFlowNodeRefsBehavior.d.ts +15 -15
  206. package/lib/features/modeling/behavior/UpdateFlowNodeRefsBehavior.js +157 -157
  207. package/lib/features/modeling/behavior/index.d.ts +85 -85
  208. package/lib/features/modeling/behavior/index.js +131 -131
  209. package/lib/features/modeling/behavior/util/CategoryUtil.d.ts +49 -49
  210. package/lib/features/modeling/behavior/util/CategoryUtil.js +86 -86
  211. package/lib/features/modeling/behavior/util/ConnectionLayoutUtil.d.ts +19 -19
  212. package/lib/features/modeling/behavior/util/ConnectionLayoutUtil.js +22 -22
  213. package/lib/features/modeling/behavior/util/GeometricUtil.d.ts +1 -1
  214. package/lib/features/modeling/behavior/util/LabelLayoutUtil.d.ts +32 -32
  215. package/lib/features/modeling/behavior/util/LabelLayoutUtil.js +41 -41
  216. package/lib/features/modeling/behavior/util/LayoutUtil.d.ts +48 -48
  217. package/lib/features/modeling/behavior/util/LayoutUtil.js +259 -259
  218. package/lib/features/modeling/behavior/util/LineAttachmentUtil.d.ts +37 -37
  219. package/lib/features/modeling/behavior/util/LineAttachmentUtil.js +241 -241
  220. package/lib/features/modeling/behavior/util/LineIntersect.d.ts +13 -13
  221. package/lib/features/modeling/behavior/util/LineIntersect.js +39 -39
  222. package/lib/features/modeling/behavior/util/NonInterruptingUtil.d.ts +3 -3
  223. package/lib/features/modeling/behavior/util/NonInterruptingUtil.js +32 -32
  224. package/lib/features/modeling/behavior/util/ResizeUtil.d.ts +1 -1
  225. package/lib/features/modeling/cmd/AddLaneHandler.d.ts +22 -22
  226. package/lib/features/modeling/cmd/AddLaneHandler.js +187 -187
  227. package/lib/features/modeling/cmd/IdClaimHandler.d.ts +22 -22
  228. package/lib/features/modeling/cmd/IdClaimHandler.js +51 -51
  229. package/lib/features/modeling/cmd/ResizeLaneHandler.d.ts +39 -39
  230. package/lib/features/modeling/cmd/ResizeLaneHandler.js +146 -146
  231. package/lib/features/modeling/cmd/SetColorHandler.d.ts +18 -18
  232. package/lib/features/modeling/cmd/SplitLaneHandler.d.ts +20 -20
  233. package/lib/features/modeling/cmd/SplitLaneHandler.js +99 -99
  234. package/lib/features/modeling/cmd/UpdateCanvasRootHandler.d.ts +20 -20
  235. package/lib/features/modeling/cmd/UpdateCanvasRootHandler.js +99 -99
  236. package/lib/features/modeling/cmd/UpdateFlowNodeRefsHandler.d.ts +21 -21
  237. package/lib/features/modeling/cmd/UpdateFlowNodeRefsHandler.js +218 -218
  238. package/lib/features/modeling/cmd/UpdateModdlePropertiesHandler.d.ts +20 -20
  239. package/lib/features/modeling/cmd/UpdateModdlePropertiesHandler.js +107 -107
  240. package/lib/features/modeling/cmd/UpdatePropertiesHandler.d.ts +58 -58
  241. package/lib/features/modeling/cmd/UpdatePropertiesHandler.js +260 -260
  242. package/lib/features/modeling/cmd/UpdateSemanticParentHandler.d.ts +18 -18
  243. package/lib/features/modeling/index.d.ts +39 -39
  244. package/lib/features/modeling/index.js +45 -45
  245. package/lib/features/modeling/util/LaneUtil.d.ts +46 -46
  246. package/lib/features/modeling/util/LaneUtil.js +188 -188
  247. package/lib/features/modeling/util/ModelingUtil.d.ts +23 -23
  248. package/lib/features/modeling/util/ModelingUtil.js +88 -88
  249. package/lib/features/modeling-feedback/ModelingFeedback.d.ts +13 -13
  250. package/lib/features/modeling-feedback/ModelingFeedback.js +51 -51
  251. package/lib/features/modeling-feedback/index.d.ts +9 -9
  252. package/lib/features/modeling-feedback/index.js +12 -12
  253. package/lib/features/ordering/BpmnOrderingProvider.d.ts +19 -19
  254. package/lib/features/ordering/BpmnOrderingProvider.js +191 -191
  255. package/lib/features/ordering/index.d.ts +6 -6
  256. package/lib/features/ordering/index.js +5 -5
  257. package/lib/features/outline/OutlineProvider.d.ts +39 -39
  258. package/lib/features/outline/OutlineProvider.js +189 -189
  259. package/lib/features/outline/OutlineUtil.d.ts +23 -23
  260. package/lib/features/outline/OutlineUtil.js +35 -35
  261. package/lib/features/outline/index.d.ts +10 -10
  262. package/lib/features/outline/index.js +10 -10
  263. package/lib/features/palette/PaletteProvider.d.ts +34 -34
  264. package/lib/features/palette/PaletteProvider.js +214 -214
  265. package/lib/features/palette/index.d.ts +22 -22
  266. package/lib/features/palette/index.js +23 -23
  267. package/lib/features/popup-menu/ReplaceMenuProvider.d.ts +52 -52
  268. package/lib/features/popup-menu/ReplaceMenuProvider.js +656 -656
  269. package/lib/features/popup-menu/index.d.ts +13 -13
  270. package/lib/features/popup-menu/index.js +16 -16
  271. package/lib/features/popup-menu/util/Icons.d.ts +5 -5
  272. package/lib/features/popup-menu/util/Icons.js +14 -14
  273. package/lib/features/popup-menu/util/TypeUtil.d.ts +14 -14
  274. package/lib/features/popup-menu/util/TypeUtil.js +52 -52
  275. package/lib/features/replace/BpmnReplace.d.ts +45 -45
  276. package/lib/features/replace/BpmnReplace.js +391 -391
  277. package/lib/features/replace/ReplaceOptions.d.ts +85 -85
  278. package/lib/features/replace/ReplaceOptions.js +1198 -1198
  279. package/lib/features/replace/index.d.ts +16 -16
  280. package/lib/features/replace/index.js +14 -14
  281. package/lib/features/replace-preview/BpmnReplacePreview.d.ts +17 -17
  282. package/lib/features/replace-preview/BpmnReplacePreview.js +139 -139
  283. package/lib/features/replace-preview/index.d.ts +9 -9
  284. package/lib/features/replace-preview/index.js +11 -11
  285. package/lib/features/rules/BpmnRules.d.ts +181 -181
  286. package/lib/features/rules/BpmnRules.js +1191 -1191
  287. package/lib/features/rules/index.d.ts +9 -9
  288. package/lib/features/rules/index.js +11 -11
  289. package/lib/features/search/BpmnSearchProvider.d.ts +34 -34
  290. package/lib/features/search/BpmnSearchProvider.js +91 -91
  291. package/lib/features/search/index.d.ts +11 -11
  292. package/lib/features/search/index.js +14 -14
  293. package/lib/features/snapping/BpmnConnectSnapping.d.ts +17 -17
  294. package/lib/features/snapping/BpmnCreateMoveSnapping.d.ts +41 -41
  295. package/lib/features/snapping/BpmnCreateMoveSnapping.js +289 -289
  296. package/lib/features/snapping/BpmnSnappingUtil.d.ts +11 -11
  297. package/lib/features/snapping/index.d.ts +13 -13
  298. package/lib/features/snapping/index.js +12 -12
  299. package/lib/features/space-tool/BpmnSpaceTool.d.ts +24 -24
  300. package/lib/features/space-tool/BpmnSpaceTool.js +96 -96
  301. package/lib/features/space-tool/index.d.ts +9 -9
  302. package/lib/features/space-tool/index.js +7 -7
  303. package/lib/import/BpmnImporter.d.ts +51 -51
  304. package/lib/import/BpmnImporter.js +363 -363
  305. package/lib/import/BpmnTreeWalker.d.ts +20 -20
  306. package/lib/import/BpmnTreeWalker.js +452 -452
  307. package/lib/import/Importer.d.ts +25 -25
  308. package/lib/import/Importer.js +222 -222
  309. package/lib/import/Util.d.ts +1 -1
  310. package/lib/import/Util.js +6 -6
  311. package/lib/import/index.d.ts +8 -8
  312. package/lib/import/index.js +9 -9
  313. package/lib/index.d.ts +1 -1
  314. package/lib/index.js +2 -2
  315. package/lib/model/Types.d.ts +25 -25
  316. package/lib/model/Types.ts +40 -40
  317. package/lib/util/CompatibilityUtil.d.ts +8 -8
  318. package/lib/util/CompatibilityUtil.js +29 -29
  319. package/lib/util/DiUtil.d.ts +60 -60
  320. package/lib/util/DiUtil.js +122 -122
  321. package/lib/util/DrilldownUtil.d.ts +39 -39
  322. package/lib/util/DrilldownUtil.js +69 -69
  323. package/lib/util/LabelUtil.d.ts +83 -83
  324. package/lib/util/LabelUtil.js +266 -266
  325. package/lib/util/ModelUtil.d.ts +40 -40
  326. package/lib/util/ModelUtil.js +58 -58
  327. package/lib/util/PoweredByUtil.d.ts +8 -8
  328. package/lib/util/PoweredByUtil.js +99 -99
  329. package/lib/util/Types.js +4 -4
  330. package/lib/util/Types.ts +3 -3
  331. package/package.json +131 -131
  332. package/test/helper/TranslationCollector.js +15 -15
  333. package/test/helper/index.js +313 -313
  334. package/test/matchers/BoundsMatchers.js +252 -252
  335. package/test/matchers/ConnectionMatchers.js +165 -165
  336. package/test/matchers/JSONMatcher.js +19 -19
  337. package/test/util/KeyEvents.js +22 -22
  338. package/test/util/MockEvents.js +61 -61
  339. package/test/util/custom-rules/CustomRules.js +16 -16
  340. package/test/util/custom-rules/index.js +6 -6
@@ -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
  }