bpmn-js 18.2.0 → 18.3.0

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