bpmn-js 17.6.0 → 17.6.2

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 (339) 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 +966 -969
  5. package/dist/bpmn-modeler.development.js +59330 -59198
  6. package/dist/bpmn-modeler.production.min.js +8 -8
  7. package/dist/bpmn-navigated-viewer.development.js +22449 -22449
  8. package/dist/bpmn-navigated-viewer.production.min.js +1 -1
  9. package/dist/bpmn-viewer.development.js +21433 -21433
  10. package/dist/bpmn-viewer.production.min.js +1 -1
  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/ContextPadProvider.js +591 -591
  62. package/lib/features/context-pad/index.d.ts +7 -7
  63. package/lib/features/context-pad/index.js +22 -22
  64. package/lib/features/copy-paste/BpmnCopyPaste.d.ts +17 -17
  65. package/lib/features/copy-paste/BpmnCopyPaste.js +192 -192
  66. package/lib/features/copy-paste/ModdleCopy.d.ts +45 -45
  67. package/lib/features/copy-paste/ModdleCopy.js +275 -275
  68. package/lib/features/copy-paste/index.d.ts +9 -9
  69. package/lib/features/copy-paste/index.js +13 -13
  70. package/lib/features/di-ordering/BpmnDiOrdering.d.ts +11 -11
  71. package/lib/features/di-ordering/BpmnDiOrdering.js +48 -48
  72. package/lib/features/di-ordering/index.d.ts +6 -6
  73. package/lib/features/di-ordering/index.js +7 -7
  74. package/lib/features/distribute-elements/BpmnDistributeElements.d.ts +10 -10
  75. package/lib/features/distribute-elements/BpmnDistributeElements.js +60 -60
  76. package/lib/features/distribute-elements/DistributeElementsIcons.d.ts +5 -5
  77. package/lib/features/distribute-elements/DistributeElementsIcons.js +18 -18
  78. package/lib/features/distribute-elements/DistributeElementsMenuProvider.d.ts +32 -32
  79. package/lib/features/distribute-elements/DistributeElementsMenuProvider.js +92 -92
  80. package/lib/features/distribute-elements/index.d.ts +9 -9
  81. package/lib/features/distribute-elements/index.js +19 -19
  82. package/lib/features/drilldown/DrilldownBreadcrumbs.d.ts +19 -19
  83. package/lib/features/drilldown/DrilldownBreadcrumbs.js +131 -131
  84. package/lib/features/drilldown/DrilldownCentering.d.ts +17 -17
  85. package/lib/features/drilldown/DrilldownCentering.js +122 -122
  86. package/lib/features/drilldown/DrilldownOverlayBehavior.d.ts +18 -18
  87. package/lib/features/drilldown/DrilldownOverlayBehavior.js +210 -210
  88. package/lib/features/drilldown/SubprocessCompatibility.d.ts +21 -21
  89. package/lib/features/drilldown/SubprocessCompatibility.js +268 -268
  90. package/lib/features/drilldown/index.d.ts +13 -13
  91. package/lib/features/drilldown/index.js +16 -16
  92. package/lib/features/editor-actions/BpmnEditorActions.d.ts +13 -13
  93. package/lib/features/editor-actions/BpmnEditorActions.js +187 -187
  94. package/lib/features/editor-actions/index.d.ts +6 -6
  95. package/lib/features/editor-actions/index.js +10 -10
  96. package/lib/features/grid-snapping/BpmnGridSnapping.d.ts +9 -9
  97. package/lib/features/grid-snapping/behavior/GridSnappingAutoPlaceBehavior.d.ts +12 -12
  98. package/lib/features/grid-snapping/behavior/GridSnappingLayoutConnectionBehavior.d.ts +27 -27
  99. package/lib/features/grid-snapping/behavior/GridSnappingLayoutConnectionBehavior.js +155 -155
  100. package/lib/features/grid-snapping/behavior/GridSnappingParticipantBehavior.d.ts +13 -13
  101. package/lib/features/grid-snapping/behavior/index.d.ts +10 -10
  102. package/lib/features/grid-snapping/index.d.ts +11 -11
  103. package/lib/features/interaction-events/BpmnInteractionEvents.d.ts +18 -18
  104. package/lib/features/interaction-events/BpmnInteractionEvents.js +150 -150
  105. package/lib/features/interaction-events/index.d.ts +6 -6
  106. package/lib/features/interaction-events/index.js +5 -5
  107. package/lib/features/keyboard/BpmnKeyboardBindings.d.ts +15 -15
  108. package/lib/features/keyboard/BpmnKeyboardBindings.js +179 -179
  109. package/lib/features/keyboard/index.d.ts +7 -7
  110. package/lib/features/keyboard/index.js +11 -11
  111. package/lib/features/label-editing/LabelEditingPreview.d.ts +13 -13
  112. package/lib/features/label-editing/LabelEditingPreview.js +144 -144
  113. package/lib/features/label-editing/LabelEditingProvider.d.ts +62 -62
  114. package/lib/features/label-editing/LabelEditingProvider.js +519 -519
  115. package/lib/features/label-editing/LabelUtil.d.ts +1 -1
  116. package/lib/features/label-editing/LabelUtil.js +4 -4
  117. package/lib/features/label-editing/cmd/UpdateLabelHandler.d.ts +22 -22
  118. package/lib/features/label-editing/cmd/UpdateLabelHandler.js +149 -149
  119. package/lib/features/label-editing/index.d.ts +9 -9
  120. package/lib/features/label-editing/index.js +21 -21
  121. package/lib/features/modeling/BpmnFactory.d.ts +73 -73
  122. package/lib/features/modeling/BpmnFactory.js +180 -180
  123. package/lib/features/modeling/BpmnLayouter.d.ts +26 -26
  124. package/lib/features/modeling/BpmnLayouter.js +481 -481
  125. package/lib/features/modeling/BpmnUpdater.d.ts +90 -90
  126. package/lib/features/modeling/BpmnUpdater.js +837 -837
  127. package/lib/features/modeling/ElementFactory.d.ts +117 -117
  128. package/lib/features/modeling/ElementFactory.js +406 -406
  129. package/lib/features/modeling/ElementFactory.test.ts +132 -132
  130. package/lib/features/modeling/Modeling.d.ts +150 -150
  131. package/lib/features/modeling/Modeling.js +307 -307
  132. package/lib/features/modeling/Modeling.test.ts +147 -147
  133. package/lib/features/modeling/behavior/AdaptiveLabelPositioningBehavior.d.ts +20 -20
  134. package/lib/features/modeling/behavior/AdaptiveLabelPositioningBehavior.js +284 -284
  135. package/lib/features/modeling/behavior/AppendBehavior.d.ts +6 -6
  136. package/lib/features/modeling/behavior/AppendBehavior.js +42 -42
  137. package/lib/features/modeling/behavior/AssociationBehavior.d.ts +11 -11
  138. package/lib/features/modeling/behavior/AttachEventBehavior.d.ts +15 -15
  139. package/lib/features/modeling/behavior/AttachEventBehavior.js +106 -106
  140. package/lib/features/modeling/behavior/BoundaryEventBehavior.d.ts +15 -15
  141. package/lib/features/modeling/behavior/BoundaryEventBehavior.js +74 -74
  142. package/lib/features/modeling/behavior/CompensateBoundaryEventBehavior.d.ts +17 -17
  143. package/lib/features/modeling/behavior/CompensateBoundaryEventBehavior.js +222 -222
  144. package/lib/features/modeling/behavior/CreateBehavior.d.ts +9 -9
  145. package/lib/features/modeling/behavior/CreateBehavior.js +33 -33
  146. package/lib/features/modeling/behavior/CreateDataObjectBehavior.d.ts +15 -15
  147. package/lib/features/modeling/behavior/CreateDataObjectBehavior.js +43 -43
  148. package/lib/features/modeling/behavior/CreateParticipantBehavior.d.ts +19 -19
  149. package/lib/features/modeling/behavior/CreateParticipantBehavior.js +237 -237
  150. package/lib/features/modeling/behavior/DataInputAssociationBehavior.d.ts +21 -21
  151. package/lib/features/modeling/behavior/DataInputAssociationBehavior.js +162 -162
  152. package/lib/features/modeling/behavior/DataStoreBehavior.d.ts +19 -19
  153. package/lib/features/modeling/behavior/DeleteLaneBehavior.d.ts +15 -15
  154. package/lib/features/modeling/behavior/DeleteLaneBehavior.js +162 -162
  155. package/lib/features/modeling/behavior/DetachEventBehavior.d.ts +15 -15
  156. package/lib/features/modeling/behavior/DetachEventBehavior.js +101 -101
  157. package/lib/features/modeling/behavior/DropOnFlowBehavior.d.ts +13 -13
  158. package/lib/features/modeling/behavior/DropOnFlowBehavior.js +221 -221
  159. package/lib/features/modeling/behavior/EventBasedGatewayBehavior.d.ts +11 -11
  160. package/lib/features/modeling/behavior/EventBasedGatewayBehavior.js +110 -110
  161. package/lib/features/modeling/behavior/FixHoverBehavior.d.ts +17 -17
  162. package/lib/features/modeling/behavior/GroupBehavior.d.ts +26 -26
  163. package/lib/features/modeling/behavior/GroupBehavior.js +332 -332
  164. package/lib/features/modeling/behavior/ImportDockingFix.d.ts +13 -13
  165. package/lib/features/modeling/behavior/ImportDockingFix.js +83 -83
  166. package/lib/features/modeling/behavior/IsHorizontalFix.d.ts +10 -10
  167. package/lib/features/modeling/behavior/IsHorizontalFix.js +54 -54
  168. package/lib/features/modeling/behavior/LabelBehavior.d.ts +56 -56
  169. package/lib/features/modeling/behavior/LabelBehavior.js +364 -364
  170. package/lib/features/modeling/behavior/LayoutConnectionBehavior.d.ts +16 -16
  171. package/lib/features/modeling/behavior/LayoutConnectionBehavior.js +121 -121
  172. package/lib/features/modeling/behavior/MessageFlowBehavior.d.ts +15 -15
  173. package/lib/features/modeling/behavior/NonInterruptingBehavior.d.ts +4 -4
  174. package/lib/features/modeling/behavior/NonInterruptingBehavior.js +41 -41
  175. package/lib/features/modeling/behavior/RemoveElementBehavior.d.ts +13 -13
  176. package/lib/features/modeling/behavior/RemoveElementBehavior.js +91 -91
  177. package/lib/features/modeling/behavior/RemoveEmbeddedLabelBoundsBehavior.d.ts +16 -16
  178. package/lib/features/modeling/behavior/RemoveEmbeddedLabelBoundsBehavior.js +41 -41
  179. package/lib/features/modeling/behavior/RemoveParticipantBehavior.d.ts +15 -15
  180. package/lib/features/modeling/behavior/RemoveParticipantBehavior.js +54 -54
  181. package/lib/features/modeling/behavior/ReplaceConnectionBehavior.d.ts +15 -15
  182. package/lib/features/modeling/behavior/ReplaceConnectionBehavior.js +194 -194
  183. package/lib/features/modeling/behavior/ReplaceElementBehaviour.d.ts +23 -23
  184. package/lib/features/modeling/behavior/ReplaceElementBehaviour.js +144 -144
  185. package/lib/features/modeling/behavior/ResizeBehavior.d.ts +67 -67
  186. package/lib/features/modeling/behavior/ResizeBehavior.js +262 -262
  187. package/lib/features/modeling/behavior/ResizeLaneBehavior.d.ts +16 -16
  188. package/lib/features/modeling/behavior/ResizeLaneBehavior.js +70 -70
  189. package/lib/features/modeling/behavior/RootElementReferenceBehavior.d.ts +25 -25
  190. package/lib/features/modeling/behavior/SpaceToolBehavior.d.ts +10 -10
  191. package/lib/features/modeling/behavior/SpaceToolBehavior.js +207 -207
  192. package/lib/features/modeling/behavior/SubProcessPlaneBehavior.d.ts +28 -28
  193. package/lib/features/modeling/behavior/SubProcessPlaneBehavior.js +588 -588
  194. package/lib/features/modeling/behavior/SubProcessStartEventBehavior.d.ts +15 -15
  195. package/lib/features/modeling/behavior/SubProcessStartEventBehavior.js +55 -55
  196. package/lib/features/modeling/behavior/TextAnnotationBehavior.d.ts +6 -6
  197. package/lib/features/modeling/behavior/TextAnnotationBehavior.js +42 -42
  198. package/lib/features/modeling/behavior/ToggleCollapseConnectionBehaviour.d.ts +14 -14
  199. package/lib/features/modeling/behavior/ToggleCollapseConnectionBehaviour.js +87 -87
  200. package/lib/features/modeling/behavior/ToggleElementCollapseBehaviour.d.ts +13 -13
  201. package/lib/features/modeling/behavior/ToggleElementCollapseBehaviour.js +156 -156
  202. package/lib/features/modeling/behavior/UnclaimIdBehavior.d.ts +19 -19
  203. package/lib/features/modeling/behavior/UnclaimIdBehavior.js +64 -64
  204. package/lib/features/modeling/behavior/UnsetDefaultFlowBehavior.d.ts +16 -16
  205. package/lib/features/modeling/behavior/UnsetDefaultFlowBehavior.js +59 -59
  206. package/lib/features/modeling/behavior/UpdateFlowNodeRefsBehavior.d.ts +15 -15
  207. package/lib/features/modeling/behavior/UpdateFlowNodeRefsBehavior.js +157 -157
  208. package/lib/features/modeling/behavior/index.d.ts +2 -2
  209. package/lib/features/modeling/behavior/index.js +128 -128
  210. package/lib/features/modeling/behavior/util/CategoryUtil.d.ts +49 -49
  211. package/lib/features/modeling/behavior/util/CategoryUtil.js +86 -86
  212. package/lib/features/modeling/behavior/util/ConnectionLayoutUtil.d.ts +19 -19
  213. package/lib/features/modeling/behavior/util/ConnectionLayoutUtil.js +22 -22
  214. package/lib/features/modeling/behavior/util/GeometricUtil.d.ts +1 -1
  215. package/lib/features/modeling/behavior/util/LabelLayoutUtil.d.ts +32 -32
  216. package/lib/features/modeling/behavior/util/LabelLayoutUtil.js +41 -41
  217. package/lib/features/modeling/behavior/util/LayoutUtil.d.ts +48 -48
  218. package/lib/features/modeling/behavior/util/LayoutUtil.js +259 -259
  219. package/lib/features/modeling/behavior/util/LineAttachmentUtil.d.ts +37 -37
  220. package/lib/features/modeling/behavior/util/LineAttachmentUtil.js +241 -241
  221. package/lib/features/modeling/behavior/util/LineIntersect.d.ts +13 -13
  222. package/lib/features/modeling/behavior/util/LineIntersect.js +39 -39
  223. package/lib/features/modeling/behavior/util/NonInterruptingUtil.d.ts +3 -3
  224. package/lib/features/modeling/behavior/util/NonInterruptingUtil.js +32 -32
  225. package/lib/features/modeling/behavior/util/ResizeUtil.d.ts +1 -1
  226. package/lib/features/modeling/cmd/AddLaneHandler.d.ts +22 -22
  227. package/lib/features/modeling/cmd/AddLaneHandler.js +192 -192
  228. package/lib/features/modeling/cmd/IdClaimHandler.d.ts +22 -22
  229. package/lib/features/modeling/cmd/IdClaimHandler.js +51 -51
  230. package/lib/features/modeling/cmd/ResizeLaneHandler.d.ts +39 -39
  231. package/lib/features/modeling/cmd/ResizeLaneHandler.js +146 -146
  232. package/lib/features/modeling/cmd/SetColorHandler.d.ts +18 -18
  233. package/lib/features/modeling/cmd/SplitLaneHandler.d.ts +20 -20
  234. package/lib/features/modeling/cmd/SplitLaneHandler.js +99 -99
  235. package/lib/features/modeling/cmd/UpdateCanvasRootHandler.d.ts +20 -20
  236. package/lib/features/modeling/cmd/UpdateCanvasRootHandler.js +99 -99
  237. package/lib/features/modeling/cmd/UpdateFlowNodeRefsHandler.d.ts +21 -21
  238. package/lib/features/modeling/cmd/UpdateFlowNodeRefsHandler.js +218 -218
  239. package/lib/features/modeling/cmd/UpdateModdlePropertiesHandler.d.ts +20 -20
  240. package/lib/features/modeling/cmd/UpdateModdlePropertiesHandler.js +107 -107
  241. package/lib/features/modeling/cmd/UpdatePropertiesHandler.d.ts +58 -58
  242. package/lib/features/modeling/cmd/UpdatePropertiesHandler.js +260 -260
  243. package/lib/features/modeling/cmd/UpdateSemanticParentHandler.d.ts +18 -18
  244. package/lib/features/modeling/index.d.ts +27 -27
  245. package/lib/features/modeling/index.js +45 -45
  246. package/lib/features/modeling/util/LaneUtil.d.ts +46 -46
  247. package/lib/features/modeling/util/LaneUtil.js +188 -188
  248. package/lib/features/modeling/util/ModelingUtil.d.ts +21 -21
  249. package/lib/features/modeling/util/ModelingUtil.js +54 -54
  250. package/lib/features/modeling-feedback/ModelingFeedback.d.ts +13 -13
  251. package/lib/features/modeling-feedback/ModelingFeedback.js +46 -46
  252. package/lib/features/modeling-feedback/index.d.ts +7 -7
  253. package/lib/features/modeling-feedback/index.js +12 -12
  254. package/lib/features/ordering/BpmnOrderingProvider.d.ts +19 -19
  255. package/lib/features/ordering/BpmnOrderingProvider.js +191 -191
  256. package/lib/features/ordering/index.d.ts +6 -6
  257. package/lib/features/ordering/index.js +5 -5
  258. package/lib/features/outline/OutlineProvider.d.ts +34 -34
  259. package/lib/features/outline/OutlineProvider.js +179 -179
  260. package/lib/features/outline/OutlineUtil.d.ts +18 -18
  261. package/lib/features/outline/OutlineUtil.js +31 -31
  262. package/lib/features/outline/index.d.ts +7 -7
  263. package/lib/features/outline/index.js +10 -10
  264. package/lib/features/palette/PaletteProvider.d.ts +34 -34
  265. package/lib/features/palette/PaletteProvider.js +214 -214
  266. package/lib/features/palette/index.d.ts +9 -9
  267. package/lib/features/palette/index.js +23 -23
  268. package/lib/features/popup-menu/ReplaceMenuProvider.d.ts +52 -52
  269. package/lib/features/popup-menu/ReplaceMenuProvider.js +679 -679
  270. package/lib/features/popup-menu/index.d.ts +11 -11
  271. package/lib/features/popup-menu/index.js +16 -16
  272. package/lib/features/popup-menu/util/Icons.d.ts +5 -5
  273. package/lib/features/popup-menu/util/Icons.js +14 -14
  274. package/lib/features/popup-menu/util/TypeUtil.d.ts +14 -14
  275. package/lib/features/popup-menu/util/TypeUtil.js +52 -52
  276. package/lib/features/replace/BpmnReplace.d.ts +47 -47
  277. package/lib/features/replace/BpmnReplace.js +382 -382
  278. package/lib/features/replace/ReplaceOptions.d.ts +75 -75
  279. package/lib/features/replace/ReplaceOptions.js +919 -919
  280. package/lib/features/replace/index.d.ts +9 -9
  281. package/lib/features/replace/index.js +14 -14
  282. package/lib/features/replace-preview/BpmnReplacePreview.d.ts +17 -17
  283. package/lib/features/replace-preview/BpmnReplacePreview.js +139 -139
  284. package/lib/features/replace-preview/index.d.ts +7 -7
  285. package/lib/features/replace-preview/index.js +11 -11
  286. package/lib/features/rules/BpmnRules.d.ts +181 -181
  287. package/lib/features/rules/BpmnRules.js +1191 -1191
  288. package/lib/features/rules/index.d.ts +7 -7
  289. package/lib/features/rules/index.js +11 -11
  290. package/lib/features/search/BpmnSearchProvider.d.ts +29 -29
  291. package/lib/features/search/BpmnSearchProvider.js +136 -136
  292. package/lib/features/search/index.d.ts +7 -7
  293. package/lib/features/search/index.js +12 -12
  294. package/lib/features/snapping/BpmnConnectSnapping.d.ts +17 -17
  295. package/lib/features/snapping/BpmnCreateMoveSnapping.d.ts +41 -41
  296. package/lib/features/snapping/BpmnCreateMoveSnapping.js +289 -289
  297. package/lib/features/snapping/BpmnSnappingUtil.d.ts +11 -11
  298. package/lib/features/snapping/index.d.ts +9 -9
  299. package/lib/features/snapping/index.js +12 -12
  300. package/lib/features/space-tool/BpmnSpaceTool.d.ts +21 -21
  301. package/lib/features/space-tool/BpmnSpaceTool.js +69 -69
  302. package/lib/features/space-tool/index.d.ts +6 -6
  303. package/lib/features/space-tool/index.js +7 -7
  304. package/lib/import/BpmnImporter.d.ts +51 -51
  305. package/lib/import/BpmnImporter.js +363 -363
  306. package/lib/import/BpmnTreeWalker.d.ts +20 -20
  307. package/lib/import/BpmnTreeWalker.js +453 -453
  308. package/lib/import/Importer.d.ts +25 -25
  309. package/lib/import/Importer.js +217 -217
  310. package/lib/import/Util.d.ts +1 -1
  311. package/lib/import/Util.js +6 -6
  312. package/lib/import/index.d.ts +6 -6
  313. package/lib/import/index.js +9 -9
  314. package/lib/model/Types.d.ts +25 -25
  315. package/lib/model/Types.ts +40 -40
  316. package/lib/util/CompatibilityUtil.d.ts +8 -8
  317. package/lib/util/CompatibilityUtil.js +29 -29
  318. package/lib/util/DiUtil.d.ts +60 -60
  319. package/lib/util/DiUtil.js +122 -122
  320. package/lib/util/DrilldownUtil.d.ts +39 -39
  321. package/lib/util/DrilldownUtil.js +69 -69
  322. package/lib/util/LabelUtil.d.ts +83 -83
  323. package/lib/util/LabelUtil.js +262 -262
  324. package/lib/util/ModelUtil.d.ts +40 -40
  325. package/lib/util/ModelUtil.js +58 -58
  326. package/lib/util/PoweredByUtil.d.ts +8 -8
  327. package/lib/util/PoweredByUtil.js +99 -99
  328. package/lib/util/Types.js +4 -4
  329. package/lib/util/Types.ts +3 -3
  330. package/package.json +132 -132
  331. package/test/helper/TranslationCollector.js +15 -15
  332. package/test/helper/index.js +313 -313
  333. package/test/matchers/BoundsMatchers.js +252 -252
  334. package/test/matchers/ConnectionMatchers.js +165 -165
  335. package/test/matchers/JSONMatcher.js +19 -19
  336. package/test/util/KeyEvents.js +22 -22
  337. package/test/util/MockEvents.js +61 -61
  338. package/test/util/custom-rules/CustomRules.js +16 -16
  339. 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
  }