bpmn-js 17.6.4 → 17.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (338) hide show
  1. package/LICENSE +23 -23
  2. package/README.md +93 -93
  3. package/dist/assets/bpmn-js.css +145 -145
  4. package/dist/assets/diagram-js.css +24 -0
  5. package/dist/bpmn-modeler.development.js +36786 -36719
  6. package/dist/bpmn-modeler.production.min.js +49 -35
  7. package/dist/bpmn-navigated-viewer.development.js +21139 -21136
  8. package/dist/bpmn-navigated-viewer.production.min.js +3 -3
  9. package/dist/bpmn-viewer.development.js +21054 -21051
  10. package/dist/bpmn-viewer.production.min.js +3 -3
  11. package/index.js +2 -2
  12. package/lib/BaseModeler.d.ts +15 -15
  13. package/lib/BaseModeler.js +79 -79
  14. package/lib/BaseViewer.d.ts +352 -352
  15. package/lib/BaseViewer.js +858 -858
  16. package/lib/Modeler.d.ts +86 -86
  17. package/lib/Modeler.js +204 -204
  18. package/lib/NavigatedViewer.d.ts +11 -11
  19. package/lib/NavigatedViewer.js +37 -37
  20. package/lib/Viewer.d.ts +47 -47
  21. package/lib/Viewer.js +78 -78
  22. package/lib/core/index.d.ts +10 -10
  23. package/lib/core/index.js +8 -8
  24. package/lib/draw/BpmnRenderUtil.d.ts +123 -123
  25. package/lib/draw/BpmnRenderUtil.js +256 -256
  26. package/lib/draw/BpmnRenderer.d.ts +114 -114
  27. package/lib/draw/BpmnRenderer.js +2340 -2340
  28. package/lib/draw/PathMap.d.ts +330 -330
  29. package/lib/draw/PathMap.js +478 -478
  30. package/lib/draw/TextRenderer.d.ts +74 -74
  31. package/lib/draw/TextRenderer.js +136 -136
  32. package/lib/draw/index.d.ts +10 -10
  33. package/lib/draw/index.js +11 -11
  34. package/lib/features/align-elements/AlignElementsContextPadProvider.d.ts +32 -32
  35. package/lib/features/align-elements/AlignElementsContextPadProvider.js +105 -105
  36. package/lib/features/align-elements/AlignElementsIcons.d.ts +10 -10
  37. package/lib/features/align-elements/AlignElementsIcons.js +43 -43
  38. package/lib/features/align-elements/AlignElementsMenuProvider.d.ts +32 -32
  39. package/lib/features/align-elements/AlignElementsMenuProvider.js +100 -100
  40. package/lib/features/align-elements/BpmnAlignElements.d.ts +9 -9
  41. package/lib/features/align-elements/BpmnAlignElements.js +45 -45
  42. package/lib/features/align-elements/index.d.ts +11 -11
  43. package/lib/features/align-elements/index.js +23 -23
  44. package/lib/features/append-preview/AppendPreview.d.ts +36 -36
  45. package/lib/features/append-preview/AppendPreview.js +108 -108
  46. package/lib/features/append-preview/index.d.ts +16 -16
  47. package/lib/features/append-preview/index.js +15 -15
  48. package/lib/features/auto-place/BpmnAutoPlace.d.ts +13 -13
  49. package/lib/features/auto-place/BpmnAutoPlace.js +20 -20
  50. package/lib/features/auto-place/BpmnAutoPlaceUtil.d.ts +47 -47
  51. package/lib/features/auto-place/BpmnAutoPlaceUtil.js +225 -225
  52. package/lib/features/auto-place/index.d.ts +7 -7
  53. package/lib/features/auto-place/index.js +8 -8
  54. package/lib/features/auto-resize/BpmnAutoResize.d.ts +25 -25
  55. package/lib/features/auto-resize/BpmnAutoResize.js +45 -45
  56. package/lib/features/auto-resize/BpmnAutoResizeProvider.d.ts +26 -26
  57. package/lib/features/auto-resize/BpmnAutoResizeProvider.js +69 -69
  58. package/lib/features/auto-resize/index.d.ts +8 -8
  59. package/lib/features/auto-resize/index.js +12 -12
  60. package/lib/features/context-pad/ContextPadProvider.d.ts +73 -73
  61. package/lib/features/context-pad/index.d.ts +7 -7
  62. package/lib/features/context-pad/index.js +22 -22
  63. package/lib/features/copy-paste/BpmnCopyPaste.d.ts +17 -17
  64. package/lib/features/copy-paste/BpmnCopyPaste.js +192 -192
  65. package/lib/features/copy-paste/ModdleCopy.d.ts +45 -45
  66. package/lib/features/copy-paste/ModdleCopy.js +275 -275
  67. package/lib/features/copy-paste/index.d.ts +9 -9
  68. package/lib/features/copy-paste/index.js +13 -13
  69. package/lib/features/di-ordering/BpmnDiOrdering.d.ts +11 -11
  70. package/lib/features/di-ordering/BpmnDiOrdering.js +48 -48
  71. package/lib/features/di-ordering/index.d.ts +6 -6
  72. package/lib/features/di-ordering/index.js +7 -7
  73. package/lib/features/distribute-elements/BpmnDistributeElements.d.ts +10 -10
  74. package/lib/features/distribute-elements/BpmnDistributeElements.js +60 -60
  75. package/lib/features/distribute-elements/DistributeElementsIcons.d.ts +5 -5
  76. package/lib/features/distribute-elements/DistributeElementsIcons.js +18 -18
  77. package/lib/features/distribute-elements/DistributeElementsMenuProvider.d.ts +32 -32
  78. package/lib/features/distribute-elements/DistributeElementsMenuProvider.js +92 -92
  79. package/lib/features/distribute-elements/index.d.ts +9 -9
  80. package/lib/features/distribute-elements/index.js +19 -19
  81. package/lib/features/drilldown/DrilldownBreadcrumbs.d.ts +19 -19
  82. package/lib/features/drilldown/DrilldownBreadcrumbs.js +131 -131
  83. package/lib/features/drilldown/DrilldownCentering.d.ts +17 -17
  84. package/lib/features/drilldown/DrilldownCentering.js +122 -122
  85. package/lib/features/drilldown/DrilldownOverlayBehavior.d.ts +18 -18
  86. package/lib/features/drilldown/DrilldownOverlayBehavior.js +210 -210
  87. package/lib/features/drilldown/SubprocessCompatibility.d.ts +21 -21
  88. package/lib/features/drilldown/SubprocessCompatibility.js +266 -268
  89. package/lib/features/drilldown/index.d.ts +13 -13
  90. package/lib/features/drilldown/index.js +16 -16
  91. package/lib/features/editor-actions/BpmnEditorActions.d.ts +13 -13
  92. package/lib/features/editor-actions/BpmnEditorActions.js +187 -187
  93. package/lib/features/editor-actions/index.d.ts +6 -6
  94. package/lib/features/editor-actions/index.js +10 -10
  95. package/lib/features/grid-snapping/BpmnGridSnapping.d.ts +9 -9
  96. package/lib/features/grid-snapping/behavior/GridSnappingAutoPlaceBehavior.d.ts +12 -12
  97. package/lib/features/grid-snapping/behavior/GridSnappingLayoutConnectionBehavior.d.ts +27 -27
  98. package/lib/features/grid-snapping/behavior/GridSnappingLayoutConnectionBehavior.js +155 -155
  99. package/lib/features/grid-snapping/behavior/GridSnappingParticipantBehavior.d.ts +13 -13
  100. package/lib/features/grid-snapping/behavior/index.d.ts +10 -10
  101. package/lib/features/grid-snapping/index.d.ts +11 -11
  102. package/lib/features/interaction-events/BpmnInteractionEvents.d.ts +18 -18
  103. package/lib/features/interaction-events/BpmnInteractionEvents.js +150 -150
  104. package/lib/features/interaction-events/index.d.ts +6 -6
  105. package/lib/features/interaction-events/index.js +5 -5
  106. package/lib/features/keyboard/BpmnKeyboardBindings.d.ts +15 -15
  107. package/lib/features/keyboard/BpmnKeyboardBindings.js +179 -179
  108. package/lib/features/keyboard/index.d.ts +7 -7
  109. package/lib/features/keyboard/index.js +11 -11
  110. package/lib/features/label-editing/LabelEditingPreview.d.ts +13 -13
  111. package/lib/features/label-editing/LabelEditingPreview.js +144 -144
  112. package/lib/features/label-editing/LabelEditingProvider.d.ts +62 -62
  113. package/lib/features/label-editing/LabelEditingProvider.js +519 -519
  114. package/lib/features/label-editing/LabelUtil.d.ts +1 -1
  115. package/lib/features/label-editing/LabelUtil.js +4 -4
  116. package/lib/features/label-editing/cmd/UpdateLabelHandler.d.ts +22 -22
  117. package/lib/features/label-editing/cmd/UpdateLabelHandler.js +149 -149
  118. package/lib/features/label-editing/index.d.ts +9 -9
  119. package/lib/features/label-editing/index.js +21 -21
  120. package/lib/features/modeling/BpmnFactory.d.ts +73 -73
  121. package/lib/features/modeling/BpmnFactory.js +180 -180
  122. package/lib/features/modeling/BpmnLayouter.d.ts +26 -26
  123. package/lib/features/modeling/BpmnLayouter.js +481 -481
  124. package/lib/features/modeling/BpmnUpdater.d.ts +90 -90
  125. package/lib/features/modeling/BpmnUpdater.js +837 -837
  126. package/lib/features/modeling/ElementFactory.d.ts +117 -117
  127. package/lib/features/modeling/ElementFactory.js +406 -406
  128. package/lib/features/modeling/ElementFactory.test.ts +132 -132
  129. package/lib/features/modeling/Modeling.d.ts +150 -150
  130. package/lib/features/modeling/Modeling.js +307 -307
  131. package/lib/features/modeling/Modeling.test.ts +147 -147
  132. package/lib/features/modeling/behavior/AdaptiveLabelPositioningBehavior.d.ts +20 -20
  133. package/lib/features/modeling/behavior/AdaptiveLabelPositioningBehavior.js +284 -284
  134. package/lib/features/modeling/behavior/AppendBehavior.d.ts +6 -6
  135. package/lib/features/modeling/behavior/AppendBehavior.js +42 -42
  136. package/lib/features/modeling/behavior/AssociationBehavior.d.ts +11 -11
  137. package/lib/features/modeling/behavior/AttachEventBehavior.d.ts +15 -15
  138. package/lib/features/modeling/behavior/AttachEventBehavior.js +106 -106
  139. package/lib/features/modeling/behavior/BoundaryEventBehavior.d.ts +15 -15
  140. package/lib/features/modeling/behavior/BoundaryEventBehavior.js +74 -74
  141. package/lib/features/modeling/behavior/CompensateBoundaryEventBehavior.d.ts +17 -17
  142. package/lib/features/modeling/behavior/CompensateBoundaryEventBehavior.js +222 -222
  143. package/lib/features/modeling/behavior/CreateBehavior.d.ts +9 -9
  144. package/lib/features/modeling/behavior/CreateBehavior.js +33 -33
  145. package/lib/features/modeling/behavior/CreateDataObjectBehavior.d.ts +15 -15
  146. package/lib/features/modeling/behavior/CreateDataObjectBehavior.js +43 -43
  147. package/lib/features/modeling/behavior/CreateParticipantBehavior.d.ts +19 -19
  148. package/lib/features/modeling/behavior/CreateParticipantBehavior.js +237 -237
  149. package/lib/features/modeling/behavior/DataInputAssociationBehavior.d.ts +21 -21
  150. package/lib/features/modeling/behavior/DataInputAssociationBehavior.js +162 -162
  151. package/lib/features/modeling/behavior/DataStoreBehavior.d.ts +19 -19
  152. package/lib/features/modeling/behavior/DeleteLaneBehavior.d.ts +15 -15
  153. package/lib/features/modeling/behavior/DeleteLaneBehavior.js +162 -162
  154. package/lib/features/modeling/behavior/DetachEventBehavior.d.ts +15 -15
  155. package/lib/features/modeling/behavior/DetachEventBehavior.js +101 -101
  156. package/lib/features/modeling/behavior/DropOnFlowBehavior.d.ts +13 -13
  157. package/lib/features/modeling/behavior/DropOnFlowBehavior.js +221 -221
  158. package/lib/features/modeling/behavior/EventBasedGatewayBehavior.d.ts +11 -11
  159. package/lib/features/modeling/behavior/EventBasedGatewayBehavior.js +110 -110
  160. package/lib/features/modeling/behavior/FixHoverBehavior.d.ts +17 -17
  161. package/lib/features/modeling/behavior/GroupBehavior.d.ts +26 -26
  162. package/lib/features/modeling/behavior/GroupBehavior.js +332 -332
  163. package/lib/features/modeling/behavior/ImportDockingFix.d.ts +13 -13
  164. package/lib/features/modeling/behavior/ImportDockingFix.js +83 -83
  165. package/lib/features/modeling/behavior/IsHorizontalFix.d.ts +10 -10
  166. package/lib/features/modeling/behavior/IsHorizontalFix.js +54 -54
  167. package/lib/features/modeling/behavior/LabelBehavior.d.ts +56 -56
  168. package/lib/features/modeling/behavior/LabelBehavior.js +364 -364
  169. package/lib/features/modeling/behavior/LayoutConnectionBehavior.d.ts +16 -16
  170. package/lib/features/modeling/behavior/LayoutConnectionBehavior.js +121 -121
  171. package/lib/features/modeling/behavior/MessageFlowBehavior.d.ts +15 -15
  172. package/lib/features/modeling/behavior/NonInterruptingBehavior.d.ts +4 -4
  173. package/lib/features/modeling/behavior/NonInterruptingBehavior.js +41 -41
  174. package/lib/features/modeling/behavior/RemoveElementBehavior.d.ts +13 -13
  175. package/lib/features/modeling/behavior/RemoveElementBehavior.js +91 -91
  176. package/lib/features/modeling/behavior/RemoveEmbeddedLabelBoundsBehavior.d.ts +16 -16
  177. package/lib/features/modeling/behavior/RemoveEmbeddedLabelBoundsBehavior.js +41 -41
  178. package/lib/features/modeling/behavior/RemoveParticipantBehavior.d.ts +15 -15
  179. package/lib/features/modeling/behavior/RemoveParticipantBehavior.js +54 -54
  180. package/lib/features/modeling/behavior/ReplaceConnectionBehavior.d.ts +15 -15
  181. package/lib/features/modeling/behavior/ReplaceConnectionBehavior.js +194 -194
  182. package/lib/features/modeling/behavior/ReplaceElementBehaviour.d.ts +23 -23
  183. package/lib/features/modeling/behavior/ReplaceElementBehaviour.js +144 -144
  184. package/lib/features/modeling/behavior/ResizeBehavior.d.ts +67 -67
  185. package/lib/features/modeling/behavior/ResizeBehavior.js +262 -262
  186. package/lib/features/modeling/behavior/ResizeLaneBehavior.d.ts +16 -16
  187. package/lib/features/modeling/behavior/ResizeLaneBehavior.js +70 -70
  188. package/lib/features/modeling/behavior/RootElementReferenceBehavior.d.ts +25 -25
  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 +55 -55
  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 +2 -2
  208. package/lib/features/modeling/behavior/index.js +128 -128
  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 +192 -192
  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 +27 -27
  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 +21 -21
  248. package/lib/features/modeling/util/ModelingUtil.js +54 -54
  249. package/lib/features/modeling-feedback/ModelingFeedback.d.ts +13 -13
  250. package/lib/features/modeling-feedback/ModelingFeedback.js +46 -46
  251. package/lib/features/modeling-feedback/index.d.ts +7 -7
  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 +34 -34
  258. package/lib/features/outline/OutlineProvider.js +179 -179
  259. package/lib/features/outline/OutlineUtil.d.ts +18 -18
  260. package/lib/features/outline/OutlineUtil.js +31 -31
  261. package/lib/features/outline/index.d.ts +7 -7
  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 +9 -9
  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 +679 -679
  269. package/lib/features/popup-menu/index.d.ts +11 -11
  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 +47 -47
  276. package/lib/features/replace/BpmnReplace.js +382 -382
  277. package/lib/features/replace/ReplaceOptions.d.ts +75 -75
  278. package/lib/features/replace/ReplaceOptions.js +919 -919
  279. package/lib/features/replace/index.d.ts +9 -9
  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 +7 -7
  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 +7 -7
  288. package/lib/features/rules/index.js +11 -11
  289. package/lib/features/search/BpmnSearchProvider.d.ts +29 -29
  290. package/lib/features/search/BpmnSearchProvider.js +136 -136
  291. package/lib/features/search/index.d.ts +7 -7
  292. package/lib/features/search/index.js +12 -12
  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 +9 -9
  298. package/lib/features/snapping/index.js +12 -12
  299. package/lib/features/space-tool/BpmnSpaceTool.d.ts +21 -21
  300. package/lib/features/space-tool/BpmnSpaceTool.js +69 -69
  301. package/lib/features/space-tool/index.d.ts +6 -6
  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 +453 -453
  307. package/lib/import/Importer.d.ts +25 -25
  308. package/lib/import/Importer.js +222 -217
  309. package/lib/import/Util.d.ts +1 -1
  310. package/lib/import/Util.js +6 -6
  311. package/lib/import/index.d.ts +6 -6
  312. package/lib/import/index.js +9 -9
  313. package/lib/model/Types.d.ts +25 -25
  314. package/lib/model/Types.ts +40 -40
  315. package/lib/util/CompatibilityUtil.d.ts +8 -8
  316. package/lib/util/CompatibilityUtil.js +29 -29
  317. package/lib/util/DiUtil.d.ts +60 -60
  318. package/lib/util/DiUtil.js +122 -122
  319. package/lib/util/DrilldownUtil.d.ts +39 -39
  320. package/lib/util/DrilldownUtil.js +69 -69
  321. package/lib/util/LabelUtil.d.ts +83 -83
  322. package/lib/util/LabelUtil.js +262 -262
  323. package/lib/util/ModelUtil.d.ts +40 -40
  324. package/lib/util/ModelUtil.js +58 -58
  325. package/lib/util/PoweredByUtil.d.ts +8 -8
  326. package/lib/util/PoweredByUtil.js +99 -99
  327. package/lib/util/Types.js +4 -4
  328. package/lib/util/Types.ts +3 -3
  329. package/package.json +132 -132
  330. package/test/helper/TranslationCollector.js +15 -15
  331. package/test/helper/index.js +313 -313
  332. package/test/matchers/BoundsMatchers.js +252 -252
  333. package/test/matchers/ConnectionMatchers.js +165 -165
  334. package/test/matchers/JSONMatcher.js +19 -19
  335. package/test/util/KeyEvents.js +22 -22
  336. package/test/util/MockEvents.js +61 -61
  337. package/test/util/custom-rules/CustomRules.js +16 -16
  338. package/test/util/custom-rules/index.js +6 -6
@@ -1,838 +1,838 @@
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
585
-
586
- if (is(businessObject, 'bpmn:FlowElement')) {
587
-
588
- if (newParent) {
589
-
590
- if (is(newParent, 'bpmn:Participant')) {
591
- newParent = newParent.processRef;
592
- } else
593
-
594
- if (is(newParent, 'bpmn:Lane')) {
595
- do {
596
-
597
- // unwrap Lane -> LaneSet -> (Lane | FlowElementsContainer)
598
- newParent = newParent.$parent.$parent;
599
- } while (is(newParent, 'bpmn:Lane'));
600
-
601
- }
602
- }
603
-
604
- containment = 'flowElements';
605
-
606
- } else
607
-
608
- if (is(businessObject, 'bpmn:Artifact')) {
609
-
610
- while (newParent &&
611
- !is(newParent, 'bpmn:Process') &&
612
- !is(newParent, 'bpmn:SubProcess') &&
613
- !is(newParent, 'bpmn:Collaboration')) {
614
-
615
- if (is(newParent, 'bpmn:Participant')) {
616
- newParent = newParent.processRef;
617
- break;
618
- } else {
619
- newParent = newParent.$parent;
620
- }
621
- }
622
-
623
- containment = 'artifacts';
624
- } else
625
-
626
- if (is(businessObject, 'bpmn:MessageFlow')) {
627
- containment = 'messageFlows';
628
-
629
- } else
630
-
631
- if (is(businessObject, 'bpmn:Participant')) {
632
- containment = 'participants';
633
-
634
- // make sure the participants process is properly attached / detached
635
- // from the XML document
636
-
637
- var process = businessObject.processRef,
638
- definitions;
639
-
640
- if (process) {
641
- definitions = getDefinitions(businessObject.$parent || newParent);
642
-
643
- if (businessObject.$parent) {
644
- collectionRemove(definitions.get('rootElements'), process);
645
- process.$parent = null;
646
- }
647
-
648
- if (newParent) {
649
- collectionAdd(definitions.get('rootElements'), process);
650
- process.$parent = definitions;
651
- }
652
- }
653
- } else
654
-
655
- if (is(businessObject, 'bpmn:DataOutputAssociation')) {
656
- containment = 'dataOutputAssociations';
657
- } else
658
-
659
- if (is(businessObject, 'bpmn:DataInputAssociation')) {
660
- containment = 'dataInputAssociations';
661
- }
662
-
663
- if (!containment) {
664
- throw new Error(`no parent for <${ businessObject.id }> in <${ newParent.id }>`);
665
- }
666
-
667
- var children;
668
-
669
- if (businessObject.$parent) {
670
-
671
- // remove from old parent
672
- children = businessObject.$parent.get(containment);
673
- collectionRemove(children, businessObject);
674
- }
675
-
676
- if (!newParent) {
677
- businessObject.$parent = null;
678
- } else {
679
-
680
- // add to new parent
681
- children = newParent.get(containment);
682
- children.push(businessObject);
683
- businessObject.$parent = newParent;
684
- }
685
-
686
- if (visualParent) {
687
- var diChildren = visualParent.get(containment);
688
-
689
- collectionRemove(children, businessObject);
690
-
691
- if (newParent) {
692
-
693
- if (!diChildren) {
694
- diChildren = [];
695
- newParent.set(containment, diChildren);
696
- }
697
-
698
- diChildren.push(businessObject);
699
- }
700
- }
701
- };
702
-
703
- /**
704
- * @param {Connection} connection
705
- */
706
- BpmnUpdater.prototype.updateConnectionWaypoints = function(connection) {
707
- var di = getDi(connection);
708
-
709
- di.set('waypoint', this._bpmnFactory.createDiWaypoints(connection.waypoints));
710
- };
711
-
712
- /**
713
- * @param { {
714
- * connection: Connection;
715
- * parent: Parent;
716
- * newParent: Parent;
717
- * } } context
718
- */
719
- BpmnUpdater.prototype.updateConnection = function(context) {
720
- var connection = context.connection,
721
- businessObject = getBusinessObject(connection),
722
- newSource = connection.source,
723
- newSourceBo = getBusinessObject(newSource),
724
- newTarget = connection.target,
725
- newTargetBo = getBusinessObject(connection.target),
726
- visualParent;
727
-
728
- if (!is(businessObject, 'bpmn:DataAssociation')) {
729
-
730
- var inverseSet = is(businessObject, 'bpmn:SequenceFlow');
731
-
732
- if (businessObject.sourceRef !== newSourceBo) {
733
- if (inverseSet) {
734
- collectionRemove(businessObject.sourceRef && businessObject.sourceRef.get('outgoing'), businessObject);
735
-
736
- if (newSourceBo && newSourceBo.get('outgoing')) {
737
- newSourceBo.get('outgoing').push(businessObject);
738
- }
739
- }
740
-
741
- businessObject.sourceRef = newSourceBo;
742
- }
743
-
744
- if (businessObject.targetRef !== newTargetBo) {
745
- if (inverseSet) {
746
- collectionRemove(businessObject.targetRef && businessObject.targetRef.get('incoming'), businessObject);
747
-
748
- if (newTargetBo && newTargetBo.get('incoming')) {
749
- newTargetBo.get('incoming').push(businessObject);
750
- }
751
- }
752
-
753
- businessObject.targetRef = newTargetBo;
754
- }
755
- } else
756
-
757
- if (is(businessObject, 'bpmn:DataInputAssociation')) {
758
-
759
- // handle obnoxious isMsome sourceRef
760
- businessObject.get('sourceRef')[0] = newSourceBo;
761
-
762
- visualParent = context.parent || context.newParent || newTargetBo;
763
-
764
- this.updateSemanticParent(businessObject, newTargetBo, visualParent);
765
- } else
766
-
767
- if (is(businessObject, 'bpmn:DataOutputAssociation')) {
768
- visualParent = context.parent || context.newParent || newSourceBo;
769
-
770
- this.updateSemanticParent(businessObject, newSourceBo, visualParent);
771
-
772
- // targetRef = new target
773
- businessObject.targetRef = newTargetBo;
774
- }
775
-
776
- this.updateConnectionWaypoints(connection);
777
-
778
- this.updateDiConnection(connection, newSource, newTarget);
779
- };
780
-
781
-
782
- // helpers //////////////////////
783
-
784
- BpmnUpdater.prototype._getLabel = function(di) {
785
- if (!di.label) {
786
- di.label = this._bpmnFactory.createDiLabel();
787
- }
788
-
789
- return di.label;
790
- };
791
-
792
-
793
- /**
794
- * Call function if shape or connection is BPMN element.
795
- *
796
- * @param {Function} fn
797
- *
798
- * @return {Function}
799
- */
800
- function ifBpmn(fn) {
801
-
802
- return function(event) {
803
-
804
- var context = event.context,
805
- element = context.shape || context.connection || context.element;
806
-
807
- if (is(element, 'bpmn:BaseElement')) {
808
- fn(event);
809
- }
810
- };
811
- }
812
-
813
- /**
814
- * Return dc:Bounds of bpmndi:BPMNLabel if exists.
815
- *
816
- * @param {Shape} shape
817
- *
818
- * @return {ModdleElement|undefined}
819
- */
820
- function getEmbeddedLabelBounds(shape) {
821
- if (!is(shape, 'bpmn:Activity')) {
822
- return;
823
- }
824
-
825
- var di = getDi(shape);
826
-
827
- if (!di) {
828
- return;
829
- }
830
-
831
- var label = di.get('label');
832
-
833
- if (!label) {
834
- return;
835
- }
836
-
837
- 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
585
+
586
+ if (is(businessObject, 'bpmn:FlowElement')) {
587
+
588
+ if (newParent) {
589
+
590
+ if (is(newParent, 'bpmn:Participant')) {
591
+ newParent = newParent.processRef;
592
+ } else
593
+
594
+ if (is(newParent, 'bpmn:Lane')) {
595
+ do {
596
+
597
+ // unwrap Lane -> LaneSet -> (Lane | FlowElementsContainer)
598
+ newParent = newParent.$parent.$parent;
599
+ } while (is(newParent, 'bpmn:Lane'));
600
+
601
+ }
602
+ }
603
+
604
+ containment = 'flowElements';
605
+
606
+ } else
607
+
608
+ if (is(businessObject, 'bpmn:Artifact')) {
609
+
610
+ while (newParent &&
611
+ !is(newParent, 'bpmn:Process') &&
612
+ !is(newParent, 'bpmn:SubProcess') &&
613
+ !is(newParent, 'bpmn:Collaboration')) {
614
+
615
+ if (is(newParent, 'bpmn:Participant')) {
616
+ newParent = newParent.processRef;
617
+ break;
618
+ } else {
619
+ newParent = newParent.$parent;
620
+ }
621
+ }
622
+
623
+ containment = 'artifacts';
624
+ } else
625
+
626
+ if (is(businessObject, 'bpmn:MessageFlow')) {
627
+ containment = 'messageFlows';
628
+
629
+ } else
630
+
631
+ if (is(businessObject, 'bpmn:Participant')) {
632
+ containment = 'participants';
633
+
634
+ // make sure the participants process is properly attached / detached
635
+ // from the XML document
636
+
637
+ var process = businessObject.processRef,
638
+ definitions;
639
+
640
+ if (process) {
641
+ definitions = getDefinitions(businessObject.$parent || newParent);
642
+
643
+ if (businessObject.$parent) {
644
+ collectionRemove(definitions.get('rootElements'), process);
645
+ process.$parent = null;
646
+ }
647
+
648
+ if (newParent) {
649
+ collectionAdd(definitions.get('rootElements'), process);
650
+ process.$parent = definitions;
651
+ }
652
+ }
653
+ } else
654
+
655
+ if (is(businessObject, 'bpmn:DataOutputAssociation')) {
656
+ containment = 'dataOutputAssociations';
657
+ } else
658
+
659
+ if (is(businessObject, 'bpmn:DataInputAssociation')) {
660
+ containment = 'dataInputAssociations';
661
+ }
662
+
663
+ if (!containment) {
664
+ throw new Error(`no parent for <${ businessObject.id }> in <${ newParent.id }>`);
665
+ }
666
+
667
+ var children;
668
+
669
+ if (businessObject.$parent) {
670
+
671
+ // remove from old parent
672
+ children = businessObject.$parent.get(containment);
673
+ collectionRemove(children, businessObject);
674
+ }
675
+
676
+ if (!newParent) {
677
+ businessObject.$parent = null;
678
+ } else {
679
+
680
+ // add to new parent
681
+ children = newParent.get(containment);
682
+ children.push(businessObject);
683
+ businessObject.$parent = newParent;
684
+ }
685
+
686
+ if (visualParent) {
687
+ var diChildren = visualParent.get(containment);
688
+
689
+ collectionRemove(children, businessObject);
690
+
691
+ if (newParent) {
692
+
693
+ if (!diChildren) {
694
+ diChildren = [];
695
+ newParent.set(containment, diChildren);
696
+ }
697
+
698
+ diChildren.push(businessObject);
699
+ }
700
+ }
701
+ };
702
+
703
+ /**
704
+ * @param {Connection} connection
705
+ */
706
+ BpmnUpdater.prototype.updateConnectionWaypoints = function(connection) {
707
+ var di = getDi(connection);
708
+
709
+ di.set('waypoint', this._bpmnFactory.createDiWaypoints(connection.waypoints));
710
+ };
711
+
712
+ /**
713
+ * @param { {
714
+ * connection: Connection;
715
+ * parent: Parent;
716
+ * newParent: Parent;
717
+ * } } context
718
+ */
719
+ BpmnUpdater.prototype.updateConnection = function(context) {
720
+ var connection = context.connection,
721
+ businessObject = getBusinessObject(connection),
722
+ newSource = connection.source,
723
+ newSourceBo = getBusinessObject(newSource),
724
+ newTarget = connection.target,
725
+ newTargetBo = getBusinessObject(connection.target),
726
+ visualParent;
727
+
728
+ if (!is(businessObject, 'bpmn:DataAssociation')) {
729
+
730
+ var inverseSet = is(businessObject, 'bpmn:SequenceFlow');
731
+
732
+ if (businessObject.sourceRef !== newSourceBo) {
733
+ if (inverseSet) {
734
+ collectionRemove(businessObject.sourceRef && businessObject.sourceRef.get('outgoing'), businessObject);
735
+
736
+ if (newSourceBo && newSourceBo.get('outgoing')) {
737
+ newSourceBo.get('outgoing').push(businessObject);
738
+ }
739
+ }
740
+
741
+ businessObject.sourceRef = newSourceBo;
742
+ }
743
+
744
+ if (businessObject.targetRef !== newTargetBo) {
745
+ if (inverseSet) {
746
+ collectionRemove(businessObject.targetRef && businessObject.targetRef.get('incoming'), businessObject);
747
+
748
+ if (newTargetBo && newTargetBo.get('incoming')) {
749
+ newTargetBo.get('incoming').push(businessObject);
750
+ }
751
+ }
752
+
753
+ businessObject.targetRef = newTargetBo;
754
+ }
755
+ } else
756
+
757
+ if (is(businessObject, 'bpmn:DataInputAssociation')) {
758
+
759
+ // handle obnoxious isMsome sourceRef
760
+ businessObject.get('sourceRef')[0] = newSourceBo;
761
+
762
+ visualParent = context.parent || context.newParent || newTargetBo;
763
+
764
+ this.updateSemanticParent(businessObject, newTargetBo, visualParent);
765
+ } else
766
+
767
+ if (is(businessObject, 'bpmn:DataOutputAssociation')) {
768
+ visualParent = context.parent || context.newParent || newSourceBo;
769
+
770
+ this.updateSemanticParent(businessObject, newSourceBo, visualParent);
771
+
772
+ // targetRef = new target
773
+ businessObject.targetRef = newTargetBo;
774
+ }
775
+
776
+ this.updateConnectionWaypoints(connection);
777
+
778
+ this.updateDiConnection(connection, newSource, newTarget);
779
+ };
780
+
781
+
782
+ // helpers //////////////////////
783
+
784
+ BpmnUpdater.prototype._getLabel = function(di) {
785
+ if (!di.label) {
786
+ di.label = this._bpmnFactory.createDiLabel();
787
+ }
788
+
789
+ return di.label;
790
+ };
791
+
792
+
793
+ /**
794
+ * Call function if shape or connection is BPMN element.
795
+ *
796
+ * @param {Function} fn
797
+ *
798
+ * @return {Function}
799
+ */
800
+ function ifBpmn(fn) {
801
+
802
+ return function(event) {
803
+
804
+ var context = event.context,
805
+ element = context.shape || context.connection || context.element;
806
+
807
+ if (is(element, 'bpmn:BaseElement')) {
808
+ fn(event);
809
+ }
810
+ };
811
+ }
812
+
813
+ /**
814
+ * Return dc:Bounds of bpmndi:BPMNLabel if exists.
815
+ *
816
+ * @param {Shape} shape
817
+ *
818
+ * @return {ModdleElement|undefined}
819
+ */
820
+ function getEmbeddedLabelBounds(shape) {
821
+ if (!is(shape, 'bpmn:Activity')) {
822
+ return;
823
+ }
824
+
825
+ var di = getDi(shape);
826
+
827
+ if (!di) {
828
+ return;
829
+ }
830
+
831
+ var label = di.get('label');
832
+
833
+ if (!label) {
834
+ return;
835
+ }
836
+
837
+ return label.get('bounds');
838
838
  }