bpmn-js 0.20.6 → 0.22.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (410) hide show
  1. package/.eslintrc +33 -33
  2. package/.npmignore +8 -8
  3. package/.travis.yml +19 -17
  4. package/.wiredeps +88 -88
  5. package/CONTRIBUTING.md +55 -55
  6. package/Gruntfile.js +129 -129
  7. package/LICENSE +22 -22
  8. package/README.md +113 -113
  9. package/assets/bpmn-font/css/bpmn-embedded.css +159 -159
  10. package/assets/bpmn-font/css/bpmn.css +161 -161
  11. package/assets/bpmn-font/font/bpmn.svg +116 -116
  12. package/docs/architecture/overview.svg +48 -48
  13. package/docs/project/COMMIT_MESSAGES.md +82 -82
  14. package/docs/project/SETUP.md +66 -66
  15. package/docs/project/setup-alternative.sh +41 -41
  16. package/docs/project/setup.bat +45 -45
  17. package/docs/project/setup.sh +40 -40
  18. package/docs/translations.json +97 -97
  19. package/lib/Modeler.js +208 -208
  20. package/lib/NavigatedViewer.js +27 -27
  21. package/lib/Viewer.js +503 -503
  22. package/lib/core/index.js +5 -5
  23. package/lib/draw/BpmnRenderer.js +1934 -1934
  24. package/lib/draw/PathMap.js +478 -478
  25. package/lib/draw/index.js +5 -5
  26. package/lib/features/auto-resize/BpmnAutoResize.js +34 -34
  27. package/lib/features/auto-resize/BpmnAutoResizeProvider.js +51 -51
  28. package/lib/features/auto-resize/index.js +5 -5
  29. package/lib/features/context-pad/ContextPadProvider.js +374 -374
  30. package/lib/features/context-pad/index.js +11 -11
  31. package/lib/features/copy-paste/BpmnCopyPaste.js +157 -154
  32. package/lib/features/copy-paste/index.js +7 -7
  33. package/lib/features/distribute-elements/BpmnDistributeElements.js +34 -34
  34. package/lib/features/distribute-elements/index.js +7 -7
  35. package/lib/features/editor-actions/BpmnEditorActions.js +130 -130
  36. package/lib/features/editor-actions/index.js +15 -15
  37. package/lib/features/global-connect/BpmnGlobalConnect.js +49 -49
  38. package/lib/features/global-connect/index.js +7 -7
  39. package/lib/features/keyboard/BpmnKeyBindings.js +72 -72
  40. package/lib/features/keyboard/index.js +7 -7
  41. package/lib/features/label-editing/LabelEditingPreview.js +122 -0
  42. package/lib/features/label-editing/LabelEditingProvider.js +292 -193
  43. package/lib/features/label-editing/LabelUtil.js +43 -43
  44. package/lib/features/label-editing/cmd/UpdateLabelHandler.js +116 -112
  45. package/lib/features/label-editing/index.js +14 -9
  46. package/lib/features/modeling/BpmnFactory.js +97 -97
  47. package/lib/features/modeling/BpmnLayouter.js +191 -191
  48. package/lib/features/modeling/BpmnUpdater.js +692 -688
  49. package/lib/features/modeling/ElementFactory.js +218 -218
  50. package/lib/features/modeling/Modeling.js +183 -183
  51. package/lib/features/modeling/behavior/AppendBehavior.js +42 -42
  52. package/lib/features/modeling/behavior/CopyPasteBehavior.js +69 -69
  53. package/lib/features/modeling/behavior/CreateBoundaryEventBehavior.js +51 -51
  54. package/lib/features/modeling/behavior/CreateDataObjectBehavior.js +37 -37
  55. package/lib/features/modeling/behavior/CreateParticipantBehavior.js +91 -91
  56. package/lib/features/modeling/behavior/DataInputAssociationBehavior.js +151 -151
  57. package/lib/features/modeling/behavior/DeleteLaneBehavior.js +107 -107
  58. package/lib/features/modeling/behavior/DropOnFlowBehavior.js +165 -131
  59. package/lib/features/modeling/behavior/ImportDockingFix.js +80 -80
  60. package/lib/features/modeling/behavior/LabelBehavior.js +222 -222
  61. package/lib/features/modeling/behavior/ModelingFeedback.js +50 -50
  62. package/lib/features/modeling/behavior/RemoveElementBehavior.js +73 -73
  63. package/lib/features/modeling/behavior/RemoveParticipantBehavior.js +50 -50
  64. package/lib/features/modeling/behavior/ReplaceConnectionBehavior.js +128 -128
  65. package/lib/features/modeling/behavior/ReplaceElementBehaviour.js +118 -116
  66. package/lib/features/modeling/behavior/ResizeLaneBehavior.js +59 -59
  67. package/lib/features/modeling/behavior/ToggleElementCollapseBehaviour.js +138 -138
  68. package/lib/features/modeling/behavior/UnclaimIdBehavior.js +27 -27
  69. package/lib/features/modeling/behavior/UnsetDefaultFlowBehavior.js +54 -54
  70. package/lib/features/modeling/behavior/UpdateFlowNodeRefsBehavior.js +156 -156
  71. package/lib/features/modeling/behavior/index.js +44 -44
  72. package/lib/features/modeling/behavior/util/GeometricUtil.js +129 -129
  73. package/lib/features/modeling/behavior/util/LabelLayoutUtil.js +218 -218
  74. package/lib/features/modeling/behavior/util/LineAttachmentUtil.js +233 -233
  75. package/lib/features/modeling/behavior/util/LineIntersect.js +36 -36
  76. package/lib/features/modeling/cmd/AddLaneHandler.js +83 -83
  77. package/lib/features/modeling/cmd/IdClaimHandler.js +41 -41
  78. package/lib/features/modeling/cmd/ResizeLaneHandler.js +125 -125
  79. package/lib/features/modeling/cmd/SplitLaneHandler.js +82 -82
  80. package/lib/features/modeling/cmd/UpdateCanvasRootHandler.js +78 -78
  81. package/lib/features/modeling/cmd/UpdateFlowNodeRefsHandler.js +185 -185
  82. package/lib/features/modeling/cmd/UpdatePropertiesHandler.js +264 -264
  83. package/lib/features/modeling/index.js +23 -23
  84. package/lib/features/modeling/util/LaneUtil.js +157 -157
  85. package/lib/features/modeling/util/ModelingUtil.js +48 -48
  86. package/lib/features/ordering/BpmnOrderingProvider.js +147 -147
  87. package/lib/features/ordering/index.js +6 -6
  88. package/lib/features/palette/PaletteProvider.js +158 -158
  89. package/lib/features/palette/index.js +13 -13
  90. package/lib/features/popup-menu/ReplaceMenuProvider.js +479 -479
  91. package/lib/features/popup-menu/index.js +7 -7
  92. package/lib/features/popup-menu/util/TypeUtil.js +41 -41
  93. package/lib/features/replace/BpmnReplace.js +197 -197
  94. package/lib/features/replace/ReplaceOptions.js +787 -787
  95. package/lib/features/replace/index.js +7 -7
  96. package/lib/features/replace-preview/BpmnReplacePreview.js +113 -113
  97. package/lib/features/replace-preview/index.js +5 -5
  98. package/lib/features/rules/BpmnRules.js +807 -806
  99. package/lib/features/rules/index.js +7 -7
  100. package/lib/features/search/BpmnSearchProvider.js +128 -128
  101. package/lib/features/search/index.js +7 -7
  102. package/lib/features/snapping/BpmnSnapping.js +511 -495
  103. package/lib/features/snapping/BpmnSnappingUtil.js +159 -159
  104. package/lib/features/snapping/index.js +3 -3
  105. package/lib/import/BpmnImporter.js +302 -302
  106. package/lib/import/BpmnTreeWalker.js +445 -445
  107. package/lib/import/Importer.js +69 -69
  108. package/lib/import/Util.js +8 -8
  109. package/lib/import/index.js +5 -5
  110. package/lib/util/DiUtil.js +60 -60
  111. package/lib/util/LabelUtil.js +139 -139
  112. package/lib/util/ModelUtil.js +31 -31
  113. package/lib/util/PoweredByUtil.js +82 -82
  114. package/lib/util/model/ModelCloneHelper.js +201 -201
  115. package/lib/util/model/ModelCloneUtils.js +35 -35
  116. package/package.json +22 -22
  117. package/resources/initial.bpmn +12 -12
  118. package/resources/screencast.gif +0 -0
  119. package/tasks/banner.txt +11 -11
  120. package/tasks/bundle.js +162 -162
  121. package/test/TestHelper.js +17 -17
  122. package/test/config/karma.unit.js +46 -46
  123. package/test/config/translation-reporter.js +48 -48
  124. package/test/fixtures/bpmn/align-elements.bpmn +136 -136
  125. package/test/fixtures/bpmn/basic.bpmn +17 -17
  126. package/test/fixtures/bpmn/boundary-events.bpmn +59 -59
  127. package/test/fixtures/bpmn/collaboration/collaboration-empty-participant.bpmn +13 -13
  128. package/test/fixtures/bpmn/collaboration/collaboration-message-flows.bpmn +89 -89
  129. package/test/fixtures/bpmn/collaboration/collaboration-participant.bpmn +59 -59
  130. package/test/fixtures/bpmn/collaboration/process-empty.bpmn +6 -6
  131. package/test/fixtures/bpmn/collaboration/process.bpmn +47 -47
  132. package/test/fixtures/bpmn/collaboration-data-items.bpmn +81 -81
  133. package/test/fixtures/bpmn/collaboration-message-flows.bpmn +82 -82
  134. package/test/fixtures/bpmn/collaboration-sequence-flows.bpmn +83 -83
  135. package/test/fixtures/bpmn/collaboration.bpmn +50 -50
  136. package/test/fixtures/bpmn/complex.bpmn +2151 -2151
  137. package/test/fixtures/bpmn/conditions.bpmn +82 -82
  138. package/test/fixtures/bpmn/containers.bpmn +128 -128
  139. package/test/fixtures/bpmn/distribute-elements-filtering.bpmn +58 -58
  140. package/test/fixtures/bpmn/distribute-elements.bpmn +232 -232
  141. package/test/fixtures/bpmn/draw/activity-markers-combination.bpmn +141 -141
  142. package/test/fixtures/bpmn/draw/activity-markers-simple.bpmn +47 -47
  143. package/test/fixtures/bpmn/draw/activity-markers.bpmn +212 -212
  144. package/test/fixtures/bpmn/draw/associations.bpmn +55 -55
  145. package/test/fixtures/bpmn/draw/boundary-event-with-refnode.bpmn +81 -81
  146. package/test/fixtures/bpmn/draw/boundary-event-without-refnode.bpmn +81 -81
  147. package/test/fixtures/bpmn/draw/boundary-event-z-index.bpmn +82 -82
  148. package/test/fixtures/bpmn/draw/call-activity.bpmn +12 -12
  149. package/test/fixtures/bpmn/draw/colors.bpmn +411 -411
  150. package/test/fixtures/bpmn/draw/conditional-flow-default.bpmn +100 -100
  151. package/test/fixtures/bpmn/draw/conditional-flow-gateways.bpmn +72 -72
  152. package/test/fixtures/bpmn/draw/conditional-flow-typed-task.bpmn +33 -33
  153. package/test/fixtures/bpmn/draw/conditional-flow.bpmn +248 -248
  154. package/test/fixtures/bpmn/draw/data-objects.bpmn +265 -265
  155. package/test/fixtures/bpmn/draw/event-subprocesses-collapsed.bpmn +200 -200
  156. package/test/fixtures/bpmn/draw/event-subprocesses-expanded.bpmn +274 -274
  157. package/test/fixtures/bpmn/draw/events-interrupting.bpmn +370 -370
  158. package/test/fixtures/bpmn/draw/events.bpmn +374 -374
  159. package/test/fixtures/bpmn/draw/gateway-type-default.bpmn +45 -45
  160. package/test/fixtures/bpmn/draw/gateways.bpmn +61 -61
  161. package/test/fixtures/bpmn/draw/group.bpmn +24 -24
  162. package/test/fixtures/bpmn/draw/message-marker.bpmn +112 -112
  163. package/test/fixtures/bpmn/draw/pools-with-collection-marker.bpmn +104 -104
  164. package/test/fixtures/bpmn/draw/pools.bpmn +82 -82
  165. package/test/fixtures/bpmn/draw/task-types.bpmn +77 -77
  166. package/test/fixtures/bpmn/draw/text-annotation.bpmn +71 -71
  167. package/test/fixtures/bpmn/draw/xor.bpmn +45 -45
  168. package/test/fixtures/bpmn/empty-definitions.bpmn +4 -4
  169. package/test/fixtures/bpmn/error/categoryValue.bpmn +26 -26
  170. package/test/fixtures/bpmn/error/di-plane-no-bpmn-element.bpmn +9 -9
  171. package/test/fixtures/bpmn/error/duplicate-ids.bpmn +14 -14
  172. package/test/fixtures/bpmn/error/invalid-child.bpmn +6 -6
  173. package/test/fixtures/bpmn/error/missing-namespace.bpmn +12 -12
  174. package/test/fixtures/bpmn/event-sub-processes.bpmn +47 -47
  175. package/test/fixtures/bpmn/extension/camunda.bpmn +52 -52
  176. package/test/fixtures/bpmn/extension/custom-override.bpmn +53 -53
  177. package/test/fixtures/bpmn/extension/custom.bpmn +53 -53
  178. package/test/fixtures/bpmn/features/copy-paste/basic.bpmn +111 -111
  179. package/test/fixtures/bpmn/features/copy-paste/collaboration-multiple.bpmn +102 -102
  180. package/test/fixtures/bpmn/features/copy-paste/collaboration.bpmn +74 -74
  181. package/test/fixtures/bpmn/features/copy-paste/data-associations.bpmn +61 -61
  182. package/test/fixtures/bpmn/features/copy-paste/properties.bpmn +43 -43
  183. package/test/fixtures/bpmn/features/drop/drop.bpmn +41 -41
  184. package/test/fixtures/bpmn/features/drop/recursive-task.bpmn +37 -37
  185. package/test/fixtures/bpmn/features/label-editing/labels.bpmn +178 -248
  186. package/test/fixtures/bpmn/features/modeling/update-label.bpmn +24 -24
  187. package/test/fixtures/bpmn/features/replace/01_replace.bpmn +193 -193
  188. package/test/fixtures/bpmn/features/replace/association-gateways.bpmn +173 -173
  189. package/test/fixtures/bpmn/features/replace/cancel-events.bpmn +49 -49
  190. package/test/fixtures/bpmn/features/replace/clone-properties.bpmn +141 -141
  191. package/test/fixtures/bpmn/features/replace/connection.bpmn +42 -42
  192. package/test/fixtures/bpmn/features/rules/event-based-gateway-outgoing-edge.bpmn +72 -72
  193. package/test/fixtures/bpmn/features/rules/link-event.bpmn +35 -35
  194. package/test/fixtures/bpmn/features/rules/text-annotation-association.bpmn +30 -30
  195. package/test/fixtures/bpmn/flow-markers.bpmn +212 -212
  196. package/test/fixtures/bpmn/import/boundaryEvent.bpmn +33 -33
  197. package/test/fixtures/bpmn/import/collaboration.bpmn +50 -50
  198. package/test/fixtures/bpmn/import/collapsed/collaboration.bpmn +76 -76
  199. package/test/fixtures/bpmn/import/collapsed/process.bpmn +84 -84
  200. package/test/fixtures/bpmn/import/collapsed/processWithChildren.bpmn +273 -273
  201. package/test/fixtures/bpmn/import/default-attrs.bpmn +24 -24
  202. package/test/fixtures/bpmn/import/error/boundaryEvent-invalidAttachToRef.bpmn +30 -30
  203. package/test/fixtures/bpmn/import/error/boundaryEvent-missingAttachToRef.bpmn +33 -33
  204. package/test/fixtures/bpmn/import/error/dangling-process-message-flow.bpmn +81 -81
  205. package/test/fixtures/bpmn/import/error/invalid-flow-element.bpmn +35 -35
  206. package/test/fixtures/bpmn/import/error/multiple-dis.bpmn +23 -23
  207. package/test/fixtures/bpmn/import/labels/collaboration-message-flows.bpmn +41 -41
  208. package/test/fixtures/bpmn/import/labels/collaboration.bpmn +72 -72
  209. package/test/fixtures/bpmn/import/labels/embedded.bpmn +39 -39
  210. package/test/fixtures/bpmn/import/labels/external-no-di.bpmn +42 -42
  211. package/test/fixtures/bpmn/import/labels/external.bpmn +69 -69
  212. package/test/fixtures/bpmn/import/position/position-testcase.bpmn +57 -57
  213. package/test/fixtures/bpmn/import/process.bpmn +60 -60
  214. package/test/fixtures/bpmn/nested-subprocesses.bpmn +118 -118
  215. package/test/fixtures/bpmn/sequence-flows.bpmn +60 -60
  216. package/test/fixtures/bpmn/simple-cropping.bpmn +84 -84
  217. package/test/fixtures/bpmn/simple-resizable.bpmn +50 -50
  218. package/test/fixtures/bpmn/simple.bpmn +60 -60
  219. package/test/fixtures/json/model/camunda.json +1042 -1042
  220. package/test/fixtures/json/model/custom-override.json +39 -39
  221. package/test/fixtures/json/model/custom.json +39 -39
  222. package/test/helper/TranslationCollector.js +17 -17
  223. package/test/helper/index.js +249 -249
  224. package/test/integration/CustomElementsSpec.js +223 -223
  225. package/test/integration/ReimportSpec.js +89 -89
  226. package/test/integration/SimpleModelingSpec.js +29 -29
  227. package/test/integration/custom-elements/CustomElementFactory.js +77 -77
  228. package/test/integration/custom-elements/CustomRenderer.js +151 -151
  229. package/test/integration/custom-elements/CustomRules.js +148 -148
  230. package/test/integration/custom-elements/CustomUpdater.js +115 -115
  231. package/test/integration/custom-elements/index.js +7 -7
  232. package/test/integration/model/BpmnModdleSpec.js +65 -65
  233. package/test/matchers/JSONMatcher.js +19 -19
  234. package/test/spec/ModelerSpec.js +401 -401
  235. package/test/spec/NavigatedViewerSpec.js +58 -58
  236. package/test/spec/ViewerSpec.js +977 -977
  237. package/test/spec/draw/BpmnRendererSpec.js +311 -311
  238. package/test/spec/environment/MockingSpec.js +53 -53
  239. package/test/spec/features/align-elements/BpmnAlignElementsSpec.js +137 -137
  240. package/test/spec/features/auto-resize/AutoResize.lanes.bpmn +54 -54
  241. package/test/spec/features/auto-resize/AutoResize.multi-selection.bpmn +22 -22
  242. package/test/spec/features/auto-resize/AutoResize.nested-sub-processes.bpmn +47 -47
  243. package/test/spec/features/auto-resize/AutoResize.participant.bpmn +38 -38
  244. package/test/spec/features/auto-resize/AutoResize.space-tool.bpmn +38 -38
  245. package/test/spec/features/auto-resize/AutoResize.sub-processes.bpmn +37 -37
  246. package/test/spec/features/auto-resize/AutoResizeSpec.js +607 -607
  247. package/test/spec/features/context-pad/ContextPad.activation.bpmn +51 -51
  248. package/test/spec/features/context-pad/ContextPadProviderSpec.js +440 -440
  249. package/test/spec/features/copy-paste/BpmnCopyPasteSpec.js +763 -725
  250. package/test/spec/features/copy-paste/DescriptorTree.js +58 -58
  251. package/test/spec/features/distribute-elements/BpmnDistributeElementsSpec.js +113 -113
  252. package/test/spec/features/editor-actions/BpmnEditorActionsSpec.js +72 -72
  253. package/test/spec/features/global-connect/BpmnGlobalConnectSpec.js +61 -61
  254. package/test/spec/features/keyboard/BpmnKeyBindingsSpec.js +142 -142
  255. package/test/spec/features/label-editing/LabelEditingPreviewSpec.js +133 -0
  256. package/test/spec/features/label-editing/LabelEditingProviderSpec.js +636 -601
  257. package/test/spec/features/label-editing/TouchIntegrationSpec.js +40 -40
  258. package/test/spec/features/modeling/AppendShapeSpec.js +332 -332
  259. package/test/spec/features/modeling/BendpointsSpec.js +25 -25
  260. package/test/spec/features/modeling/BpmnFactorySpec.js +73 -73
  261. package/test/spec/features/modeling/BpmnUpdater.bpmn +99 -99
  262. package/test/spec/features/modeling/BpmnUpdaterSpec.js +79 -79
  263. package/test/spec/features/modeling/CreateConnectionSpec.js +171 -171
  264. package/test/spec/features/modeling/DeleteConnectionSpec.js +75 -75
  265. package/test/spec/features/modeling/DeleteParticipantSpec.js +97 -97
  266. package/test/spec/features/modeling/DeleteShapeSpec.js +75 -75
  267. package/test/spec/features/modeling/DropSpec.js +123 -123
  268. package/test/spec/features/modeling/IdClaim.bpmn +13 -13
  269. package/test/spec/features/modeling/IdClaimSpec.js +50 -50
  270. package/test/spec/features/modeling/LabelBoundsSpec.js +342 -340
  271. package/test/spec/features/modeling/LabelBoundsSpec.simple.bpmn +27 -27
  272. package/test/spec/features/modeling/LabelLayouting.initial.bpmn +37 -37
  273. package/test/spec/features/modeling/LabelLayouting.move.bpmn +99 -99
  274. package/test/spec/features/modeling/LabelLayouting.special.bpmn +76 -76
  275. package/test/spec/features/modeling/LabelLayoutingSpec.js +603 -603
  276. package/test/spec/features/modeling/MoveConnectionSpec.js +101 -101
  277. package/test/spec/features/modeling/MoveElements.flow-collaboration.bpmn +45 -45
  278. package/test/spec/features/modeling/MoveElementsSpec.js +70 -70
  279. package/test/spec/features/modeling/MoveRulesSpec.js +151 -151
  280. package/test/spec/features/modeling/MoveShapeSpec.js +353 -353
  281. package/test/spec/features/modeling/ResizeShapeSpec.js +73 -73
  282. package/test/spec/features/modeling/SpaceToolSpec.js +251 -251
  283. package/test/spec/features/modeling/UpdateAttachmentSpec.js +96 -96
  284. package/test/spec/features/modeling/UpdateLabelSpec.js +130 -130
  285. package/test/spec/features/modeling/UpdatePropertiesSpec.js +503 -503
  286. package/test/spec/features/modeling/append/TextAnnotationSpec.js +136 -136
  287. package/test/spec/features/modeling/behavior/CompensationAssociationBehavior.bpmn +26 -26
  288. package/test/spec/features/modeling/behavior/CompensationAssociationBehaviorSpec.js +43 -43
  289. package/test/spec/features/modeling/behavior/CreateBoundaryEventBehaviorSpec.js +58 -58
  290. package/test/spec/features/modeling/behavior/CreateParticipantBehaviorSpec.js +224 -224
  291. package/test/spec/features/modeling/behavior/DataInputAssociationBehavior.bpmn +33 -33
  292. package/test/spec/features/modeling/behavior/DataInputAssociationBehaviorSpec.js +146 -146
  293. package/test/spec/features/modeling/behavior/DataObjectBehavior.create-data-association.bpmn +21 -21
  294. package/test/spec/features/modeling/behavior/DataObjectBehavior.data-object-reference.bpmn +13 -13
  295. package/test/spec/features/modeling/behavior/DataObjectBehavior.remove-data-association.bpmn +41 -41
  296. package/test/spec/features/modeling/behavior/DataObjectBehaviorSpec.js +297 -297
  297. package/test/spec/features/modeling/behavior/DataStoreBehavior.bpmn +26 -26
  298. package/test/spec/features/modeling/behavior/DataStoreBehavior.connect.bpmn +57 -57
  299. package/test/spec/features/modeling/behavior/DataStoreBehaviorSpec.js +228 -228
  300. package/test/spec/features/modeling/behavior/DropOnFlowBehavior.bpmn +71 -67
  301. package/test/spec/features/modeling/behavior/DropOnFlowBehaviorSpec.js +591 -418
  302. package/test/spec/features/modeling/behavior/ImportDockingFix.bpmn +61 -61
  303. package/test/spec/features/modeling/behavior/ImportDockingFixSpec.js +37 -37
  304. package/test/spec/features/modeling/behavior/LabelBehaviorSpec.js +277 -277
  305. package/test/spec/features/modeling/behavior/ReconnectConnection.data-association.bpmn +41 -41
  306. package/test/spec/features/modeling/behavior/ReconnectConnectionSpec.js +120 -120
  307. package/test/spec/features/modeling/behavior/RemoveElementBehavior.bpmn +181 -181
  308. package/test/spec/features/modeling/behavior/RemoveElementBehavior.perpendicular.bpmn +159 -159
  309. package/test/spec/features/modeling/behavior/RemoveElementBehaviorSpec.js +251 -251
  310. package/test/spec/features/modeling/behavior/RemoveParticipantBehaviorSpec.js +125 -125
  311. package/test/spec/features/modeling/behavior/ReplaceConnectionBehavior.association.bpmn +26 -26
  312. package/test/spec/features/modeling/behavior/ReplaceConnectionBehavior.boundary-events.bpmn +40 -40
  313. package/test/spec/features/modeling/behavior/ReplaceConnectionBehavior.message-sequence-flow.bpmn +121 -121
  314. package/test/spec/features/modeling/behavior/ReplaceConnectionBehaviorSpec.js +439 -439
  315. package/test/spec/features/modeling/behavior/ReplaceElementBehaviourSpec.js +450 -450
  316. package/test/spec/features/modeling/behavior/ToggleElementCollapseBehaviourSpec.js +653 -653
  317. package/test/spec/features/modeling/behavior/UnsetDefaultFlowBehaviorSpec.bpmn +48 -48
  318. package/test/spec/features/modeling/behavior/UnsetDefaultFlowBehaviorSpec.js +77 -77
  319. package/test/spec/features/modeling/behavior/util/GeometricUtilSpec.js +127 -127
  320. package/test/spec/features/modeling/behavior/util/LabelLayoutUtilSpec.js +75 -75
  321. package/test/spec/features/modeling/behavior/util/LineAttachmentUtilSpec.js +294 -294
  322. package/test/spec/features/modeling/behavior/util/LineIntersectSpec.js +32 -32
  323. package/test/spec/features/modeling/lanes/AddLaneSpec.js +263 -263
  324. package/test/spec/features/modeling/lanes/DeleteLaneSpec.js +126 -126
  325. package/test/spec/features/modeling/lanes/ResizeLaneSpec.js +366 -366
  326. package/test/spec/features/modeling/lanes/SplitLaneSpec.js +216 -216
  327. package/test/spec/features/modeling/lanes/UpdateFlowNodeRefsSpec.js +271 -271
  328. package/test/spec/features/modeling/lanes/flowNodeRefs.bpmn +56 -56
  329. package/test/spec/features/modeling/lanes/lanes.bpmn +83 -83
  330. package/test/spec/features/modeling/lanes/participant-lane.bpmn +27 -27
  331. package/test/spec/features/modeling/lanes/participant-no-lane.bpmn +22 -22
  332. package/test/spec/features/modeling/layout/Helper.js +64 -64
  333. package/test/spec/features/modeling/layout/LayoutAssociationSpec.js +101 -101
  334. package/test/spec/features/modeling/layout/LayoutConnectionSpec.js +98 -98
  335. package/test/spec/features/modeling/layout/LayoutDataAssociationSpec.js +98 -98
  336. package/test/spec/features/modeling/layout/LayoutMessageFlowSpec.bpmn +119 -119
  337. package/test/spec/features/modeling/layout/LayoutMessageFlowSpec.js +313 -313
  338. package/test/spec/features/modeling/layout/LayoutSequenceFlowSpec.boundaryEvents.bpmn +65 -65
  339. package/test/spec/features/modeling/layout/LayoutSequenceFlowSpec.flowElements.bpmn +70 -70
  340. package/test/spec/features/modeling/layout/LayoutSequenceFlowSpec.js +323 -323
  341. package/test/spec/features/ordering/BpmnOrderingProviderSpec.js +231 -231
  342. package/test/spec/features/ordering/Helper.js +185 -185
  343. package/test/spec/features/ordering/ordering-start-event.bpmn +17 -17
  344. package/test/spec/features/ordering/ordering-subprocesses.bpmn +41 -41
  345. package/test/spec/features/ordering/ordering.bpmn +105 -105
  346. package/test/spec/features/palette/PaletteProviderSpec.js +33 -33
  347. package/test/spec/features/popup-menu/ReplaceMenuProvider.collapsedSubProcess.bpmn +13 -13
  348. package/test/spec/features/popup-menu/ReplaceMenuProvider.compensation-activity.bpmn +12 -12
  349. package/test/spec/features/popup-menu/ReplaceMenuProvider.conditionalFlows.bpmn +66 -66
  350. package/test/spec/features/popup-menu/ReplaceMenuProvider.defaultFlows.bpmn +126 -126
  351. package/test/spec/features/popup-menu/ReplaceMenuProvider.defaultFlowsFromComplexGateways.bpmn +48 -48
  352. package/test/spec/features/popup-menu/ReplaceMenuProvider.defaultFlowsFromInclusiveGateways.bpmn +48 -48
  353. package/test/spec/features/popup-menu/ReplaceMenuProviderSpec.js +1957 -1957
  354. package/test/spec/features/replace/BpmnReplace.collaboration.bpmn +70 -70
  355. package/test/spec/features/replace/BpmnReplace.compensation.bpmn +12 -12
  356. package/test/spec/features/replace/BpmnReplace.eventSubProcesses.bpmn +126 -126
  357. package/test/spec/features/replace/BpmnReplaceSpec.js +1302 -1302
  358. package/test/spec/features/replace/ReplaceRulesSpec.js +78 -78
  359. package/test/spec/features/replace/SubProcess-collapsed.bpmn +36 -36
  360. package/test/spec/features/replace-preview/BpmnReplacePreviewSpec.js +304 -304
  361. package/test/spec/features/rules/BpmnRules.boundaryEvent.bpmn +93 -93
  362. package/test/spec/features/rules/BpmnRules.collaboration-dataAssociation.bpmn +35 -35
  363. package/test/spec/features/rules/BpmnRules.collaboration-lanes.bpmn +79 -79
  364. package/test/spec/features/rules/BpmnRules.collaboration.bpmn +138 -138
  365. package/test/spec/features/rules/BpmnRules.compensation.bpmn +65 -65
  366. package/test/spec/features/rules/BpmnRules.dataAssociation.bpmn +33 -33
  367. package/test/spec/features/rules/BpmnRules.eventBasedGateway.bpmn +82 -82
  368. package/test/spec/features/rules/BpmnRules.messageFlow.bpmn +27 -27
  369. package/test/spec/features/rules/BpmnRules.multiSelectionPools.bpmn +37 -37
  370. package/test/spec/features/rules/BpmnRules.process.bpmn +91 -91
  371. package/test/spec/features/rules/BpmnRules.subProcess-dataAssociation.bpmn +44 -44
  372. package/test/spec/features/rules/BpmnRulesSpec.js +1468 -1424
  373. package/test/spec/features/rules/Helper.js +82 -82
  374. package/test/spec/features/search/BpmnSearchProviderSpec.js +158 -158
  375. package/test/spec/features/search/bpmn-search-collaboration.bpmn +106 -106
  376. package/test/spec/features/search/bpmn-search.bpmn +100 -100
  377. package/test/spec/features/snapping/BpmnSnapping.connect.bpmn +36 -36
  378. package/test/spec/features/snapping/BpmnSnapping.labels.bpmn +27 -27
  379. package/test/spec/features/snapping/BpmnSnapping.lanes-resize.bpmn +43 -43
  380. package/test/spec/features/snapping/BpmnSnapping.participant-resize.bpmn +50 -50
  381. package/test/spec/features/snapping/BpmnSnapping.sequenceFlow.bpmn +41 -0
  382. package/test/spec/features/snapping/BpmnSnapping.subProcess-resize.bpmn +21 -21
  383. package/test/spec/features/snapping/BpmnSnapping.textAnnotation-resize.bpmn +22 -22
  384. package/test/spec/features/snapping/BpmnSnappingSpec.js +824 -758
  385. package/test/spec/features/snapping/BpmnSnappingUtil.lanes-flowNodes.bpmn +82 -82
  386. package/test/spec/features/snapping/BpmnSnappingUtil.lanes.bpmn +35 -35
  387. package/test/spec/features/snapping/BpmnSnappingUtilSpec.js +285 -285
  388. package/test/spec/i18n/custom-translate/custom-translate.js +14 -14
  389. package/test/spec/i18n/custom-translate/index.js +2 -2
  390. package/test/spec/i18n/translateSpec.js +56 -56
  391. package/test/spec/import/ImporterSpec.js +428 -428
  392. package/test/spec/import/ModelWiringSpec.js +194 -194
  393. package/test/spec/import/elements/AssociationSpec.collaboration.bpmn +51 -51
  394. package/test/spec/import/elements/AssociationSpec.compensation.bpmn +28 -28
  395. package/test/spec/import/elements/AssociationSpec.data-association.bpmn +39 -39
  396. package/test/spec/import/elements/AssociationSpec.data-input-output.bpmn +40 -40
  397. package/test/spec/import/elements/AssociationSpec.events.bpmn +51 -51
  398. package/test/spec/import/elements/AssociationSpec.js +175 -175
  399. package/test/spec/import/elements/AssociationSpec.text-annotation.bpmn +37 -37
  400. package/test/spec/import/elements/CollapsedSpec.js +118 -118
  401. package/test/spec/import/elements/LabelSpec.js +85 -85
  402. package/test/spec/import/lane-flowNodes.bpmn +44 -44
  403. package/test/spec/import/lane-missing-flowNodeRef.bpmn +24 -24
  404. package/test/spec/util/ModelCloneHelperSpec.js +381 -381
  405. package/test/spec/util/ModelUtilSpec.js +65 -65
  406. package/test/spec/util/camunda-moddle.js +70 -70
  407. package/test/util/MockEvents.js +62 -62
  408. package/test/util/ModelingUtil.js +117 -117
  409. package/test/util/custom-rules/CustomRules.js +18 -18
  410. package/test/util/custom-rules/index.js +4 -4
@@ -1,688 +1,692 @@
1
- 'use strict';
2
-
3
- var assign = require('lodash/object/assign'),
4
- forEach = require('lodash/collection/forEach'),
5
- inherits = require('inherits');
6
-
7
- var Collections = require('diagram-js/lib/util/Collections'),
8
- Model = require('diagram-js/lib/model');
9
-
10
- var getBusinessObject = require('../../util/ModelUtil').getBusinessObject,
11
- is = require('../../util/ModelUtil').is;
12
-
13
- var CommandInterceptor = require('diagram-js/lib/command/CommandInterceptor');
14
-
15
- /**
16
- * A handler responsible for updating the underlying BPMN 2.0 XML + DI
17
- * once changes on the diagram happen
18
- */
19
- function BpmnUpdater(eventBus, bpmnFactory, connectionDocking, translate) {
20
-
21
- CommandInterceptor.call(this, eventBus);
22
-
23
- this._bpmnFactory = bpmnFactory;
24
- this._translate = translate;
25
-
26
- var self = this;
27
-
28
-
29
-
30
- ////// connection cropping /////////////////////////
31
-
32
- // crop connection ends during create/update
33
- function cropConnection(e) {
34
- var context = e.context,
35
- connection;
36
-
37
- if (!context.cropped) {
38
- connection = context.connection;
39
- connection.waypoints = connectionDocking.getCroppedWaypoints(connection);
40
- context.cropped = true;
41
- }
42
- }
43
-
44
- this.executed([
45
- 'connection.layout',
46
- 'connection.create',
47
- 'connection.reconnectEnd',
48
- 'connection.reconnectStart'
49
- ], cropConnection);
50
-
51
- this.reverted([ 'connection.layout' ], function(e) {
52
- delete e.context.cropped;
53
- });
54
-
55
-
56
-
57
- ////// BPMN + DI update /////////////////////////
58
-
59
-
60
- // update parent
61
- function updateParent(e) {
62
- var context = e.context;
63
-
64
- self.updateParent(context.shape || context.connection, context.oldParent);
65
- }
66
-
67
- function reverseUpdateParent(e) {
68
- var context = e.context;
69
-
70
- var element = context.shape || context.connection,
71
- // oldParent is the (old) new parent, because we are undoing
72
- oldParent = context.parent || context.newParent;
73
-
74
- self.updateParent(element, oldParent);
75
- }
76
-
77
- this.executed([ 'shape.move',
78
- 'shape.create',
79
- 'shape.delete',
80
- 'connection.create',
81
- 'connection.move',
82
- 'connection.delete' ], ifBpmn(updateParent));
83
-
84
- this.reverted([ 'shape.move',
85
- 'shape.create',
86
- 'shape.delete',
87
- 'connection.create',
88
- 'connection.move',
89
- 'connection.delete' ], ifBpmn(reverseUpdateParent));
90
-
91
- /*
92
- * ## Updating Parent
93
- *
94
- * When morphing a Process into a Collaboration or vice-versa,
95
- * make sure that both the *semantic* and *di* parent of each element
96
- * is updated.
97
- *
98
- */
99
- function updateRoot(event) {
100
- var context = event.context,
101
- oldRoot = context.oldRoot,
102
- children = oldRoot.children;
103
-
104
- forEach(children, function(child) {
105
- if (is(child, 'bpmn:BaseElement')) {
106
- self.updateParent(child);
107
- }
108
- });
109
- }
110
-
111
- this.executed([ 'canvas.updateRoot' ], updateRoot);
112
- this.reverted([ 'canvas.updateRoot' ], updateRoot);
113
-
114
-
115
- // update bounds
116
- function updateBounds(e) {
117
- var shape = e.context.shape;
118
-
119
- if (!is(shape, 'bpmn:BaseElement')) {
120
- return;
121
- }
122
-
123
- self.updateBounds(shape);
124
- }
125
-
126
- this.executed([ 'shape.move', 'shape.create', 'shape.resize' ], ifBpmn(function(event) {
127
-
128
- // exclude labels because they're handled separately during shape.changed
129
- if (event.context.shape.type === 'label') {
130
- return;
131
- }
132
-
133
- updateBounds(event);
134
- }));
135
-
136
- this.reverted([ 'shape.move', 'shape.create', 'shape.resize' ], ifBpmn(function(event) {
137
-
138
- // exclude labels because they're handled separately during shape.changed
139
- if (event.context.shape.type === 'label') {
140
- return;
141
- }
142
-
143
- updateBounds(event);
144
- }));
145
-
146
- // Handle labels separately. This is necessary, because the label bounds have to be updated
147
- // every time its shape changes, not only on move, create and resize.
148
- eventBus.on('shape.changed', function(event) {
149
- if (event.element.type === 'label') {
150
- updateBounds({ context: { shape: event.element } });
151
- }
152
- });
153
-
154
- // attach / detach connection
155
- function updateConnection(e) {
156
- self.updateConnection(e.context);
157
- }
158
-
159
- this.executed([
160
- 'connection.create',
161
- 'connection.move',
162
- 'connection.delete',
163
- 'connection.reconnectEnd',
164
- 'connection.reconnectStart'
165
- ], ifBpmn(updateConnection));
166
-
167
- this.reverted([
168
- 'connection.create',
169
- 'connection.move',
170
- 'connection.delete',
171
- 'connection.reconnectEnd',
172
- 'connection.reconnectStart'
173
- ], ifBpmn(updateConnection));
174
-
175
-
176
- // update waypoints
177
- function updateConnectionWaypoints(e) {
178
- self.updateConnectionWaypoints(e.context.connection);
179
- }
180
-
181
- this.executed([
182
- 'connection.layout',
183
- 'connection.move',
184
- 'connection.updateWaypoints',
185
- 'connection.reconnectEnd',
186
- 'connection.reconnectStart'
187
- ], ifBpmn(updateConnectionWaypoints));
188
-
189
- this.reverted([
190
- 'connection.layout',
191
- 'connection.move',
192
- 'connection.updateWaypoints',
193
- 'connection.reconnectEnd',
194
- 'connection.reconnectStart'
195
- ], ifBpmn(updateConnectionWaypoints));
196
-
197
-
198
- // update Default & Conditional flows
199
- this.executed([
200
- 'connection.reconnectEnd',
201
- 'connection.reconnectStart'
202
- ], ifBpmn(function(e) {
203
- var context = e.context,
204
- connection = context.connection,
205
- businessObject = getBusinessObject(connection),
206
- oldSource = getBusinessObject(context.oldSource),
207
- oldTarget = getBusinessObject(context.oldTarget),
208
- newSource = getBusinessObject(connection.source),
209
- newTarget = getBusinessObject(connection.target);
210
-
211
- if (oldSource === newSource || oldTarget === newTarget) {
212
- return;
213
- }
214
-
215
- // on reconnectStart -> default flow
216
- if (oldSource && oldSource.default === businessObject) {
217
- context.default = oldSource.default;
218
- oldSource.default = undefined;
219
- }
220
-
221
- // on reconnectEnd -> default flow
222
- if ((businessObject.sourceRef && businessObject.sourceRef.default) &&
223
- !(is(newTarget, 'bpmn:Activity') ||
224
- is(newTarget, 'bpmn:EndEvent') ||
225
- is(newTarget, 'bpmn:Gateway') ||
226
- is(newTarget, 'bpmn:IntermediateThrowEvent')) ) {
227
- context.default = businessObject.sourceRef.default;
228
- businessObject.sourceRef.default = undefined;
229
- }
230
-
231
- // on reconnectStart -> conditional flow
232
- if (oldSource && (businessObject.conditionExpression) &&
233
- !(is(newSource, 'bpmn:Activity') ||
234
- is(newSource, 'bpmn:Gateway')) ) {
235
- context.conditionExpression = businessObject.conditionExpression;
236
- businessObject.conditionExpression = undefined;
237
- }
238
-
239
- // on reconnectEnd -> conditional flow
240
- if (oldTarget && (businessObject.conditionExpression) &&
241
- !(is(newTarget, 'bpmn:Activity') ||
242
- is(newTarget, 'bpmn:EndEvent') ||
243
- is(newTarget, 'bpmn:Gateway') ||
244
- is(newTarget, 'bpmn:IntermediateThrowEvent')) ) {
245
- context.conditionExpression = businessObject.conditionExpression;
246
- businessObject.conditionExpression = undefined;
247
- }
248
- }));
249
-
250
- this.reverted([
251
- 'connection.reconnectEnd',
252
- 'connection.reconnectStart'
253
- ], ifBpmn(function(e) {
254
- var context = e.context,
255
- connection = context.connection,
256
- businessObject = getBusinessObject(connection),
257
- newSource = getBusinessObject(connection.source);
258
-
259
- // default flow
260
- if (context.default) {
261
- if (is(newSource, 'bpmn:ExclusiveGateway') || is(newSource, 'bpmn:InclusiveGateway') ||
262
- is(newSource, 'bpmn:Activity')) {
263
- newSource.default = context.default;
264
- }
265
- }
266
-
267
- // conditional flow
268
- if (context.conditionExpression && is(newSource, 'bpmn:Activity')) {
269
- businessObject.conditionExpression = context.conditionExpression;
270
- }
271
- }));
272
-
273
- // update attachments
274
- function updateAttachment(e) {
275
- self.updateAttachment(e.context);
276
- }
277
-
278
- this.executed([ 'element.updateAttachment' ], ifBpmn(updateAttachment));
279
- this.reverted([ 'element.updateAttachment' ], ifBpmn(updateAttachment));
280
- }
281
-
282
- inherits(BpmnUpdater, CommandInterceptor);
283
-
284
- module.exports = BpmnUpdater;
285
-
286
- BpmnUpdater.$inject = [ 'eventBus', 'bpmnFactory', 'connectionDocking', 'translate' ];
287
-
288
-
289
- /////// implementation //////////////////////////////////
290
-
291
- BpmnUpdater.prototype.updateAttachment = function(context) {
292
-
293
- var shape = context.shape,
294
- businessObject = shape.businessObject,
295
- host = shape.host;
296
-
297
- businessObject.attachedToRef = host && host.businessObject;
298
- };
299
-
300
- BpmnUpdater.prototype.updateParent = function(element, oldParent) {
301
- // do not update BPMN 2.0 label parent
302
- if (element instanceof Model.Label) {
303
- return;
304
- }
305
-
306
- var parentShape = element.parent;
307
-
308
- var businessObject = element.businessObject,
309
- parentBusinessObject = parentShape && parentShape.businessObject,
310
- parentDi = parentBusinessObject && parentBusinessObject.di;
311
-
312
- if (is(element, 'bpmn:FlowNode')) {
313
- this.updateFlowNodeRefs(businessObject, parentBusinessObject, oldParent && oldParent.businessObject);
314
- }
315
-
316
- if (is(element, 'bpmn:DataOutputAssociation')) {
317
- if (element.source) {
318
- parentBusinessObject = element.source.businessObject;
319
- } else {
320
- parentBusinessObject = null;
321
- }
322
- }
323
-
324
- if (is(element, 'bpmn:DataInputAssociation')) {
325
- if (element.target) {
326
- parentBusinessObject = element.target.businessObject;
327
- } else {
328
- parentBusinessObject = null;
329
- }
330
- }
331
-
332
- this.updateSemanticParent(businessObject, parentBusinessObject);
333
-
334
- if (is(element, 'bpmn:DataObjectReference') && businessObject.dataObjectRef) {
335
- this.updateSemanticParent(businessObject.dataObjectRef, parentBusinessObject);
336
- }
337
-
338
- this.updateDiParent(businessObject.di, parentDi);
339
- };
340
-
341
-
342
- BpmnUpdater.prototype.updateBounds = function(shape) {
343
-
344
- var di = shape.businessObject.di;
345
-
346
- var bounds = (shape instanceof Model.Label) ? this._getLabel(di).bounds : di.bounds;
347
-
348
- assign(bounds, {
349
- x: shape.x,
350
- y: shape.y,
351
- width: shape.width,
352
- height: shape.height
353
- });
354
- };
355
-
356
- BpmnUpdater.prototype.updateFlowNodeRefs = function(businessObject, newContainment, oldContainment) {
357
-
358
- if (oldContainment === newContainment) {
359
- return;
360
- }
361
-
362
- var oldRefs, newRefs;
363
-
364
- if (is (oldContainment, 'bpmn:Lane')) {
365
- oldRefs = oldContainment.get('flowNodeRef');
366
- Collections.remove(oldRefs, businessObject);
367
- }
368
-
369
- if (is(newContainment, 'bpmn:Lane')) {
370
- newRefs = newContainment.get('flowNodeRef');
371
- Collections.add(newRefs, businessObject);
372
- }
373
- };
374
-
375
-
376
- // update existing sourceElement and targetElement di information
377
- BpmnUpdater.prototype.updateDiConnection = function(di, newSource, newTarget) {
378
-
379
- if (di.sourceElement && di.sourceElement.bpmnElement !== newSource) {
380
- di.sourceElement = newSource && newSource.di;
381
- }
382
-
383
- if (di.targetElement && di.targetElement.bpmnElement !== newTarget) {
384
- di.targetElement = newTarget && newTarget.di;
385
- }
386
-
387
- };
388
-
389
-
390
- BpmnUpdater.prototype.updateDiParent = function(di, parentDi) {
391
-
392
- if (parentDi && !is(parentDi, 'bpmndi:BPMNPlane')) {
393
- parentDi = parentDi.$parent;
394
- }
395
-
396
- if (di.$parent === parentDi) {
397
- return;
398
- }
399
-
400
- var planeElements = (parentDi || di.$parent).get('planeElement');
401
-
402
- if (parentDi) {
403
- planeElements.push(di);
404
- di.$parent = parentDi;
405
- } else {
406
- Collections.remove(planeElements, di);
407
- di.$parent = null;
408
- }
409
- };
410
-
411
- function getDefinitions(element) {
412
- while (element && !is(element, 'bpmn:Definitions')) {
413
- element = element.$parent;
414
- }
415
-
416
- return element;
417
- }
418
-
419
- BpmnUpdater.prototype.getLaneSet = function(container) {
420
-
421
- var laneSet, laneSets;
422
-
423
- // bpmn:Lane
424
- if (is(container, 'bpmn:Lane')) {
425
- laneSet = container.childLaneSet;
426
-
427
- if (!laneSet) {
428
- laneSet = this._bpmnFactory.create('bpmn:LaneSet');
429
- container.childLaneSet = laneSet;
430
- laneSet.$parent = container;
431
- }
432
-
433
- return laneSet;
434
- }
435
-
436
- // bpmn:Participant
437
- if (is(container, 'bpmn:Participant')) {
438
- container = container.processRef;
439
- }
440
-
441
- // bpmn:FlowElementsContainer
442
- laneSets = container.get('laneSets');
443
- laneSet = laneSets[0];
444
-
445
- if (!laneSet) {
446
- laneSet = this._bpmnFactory.create('bpmn:LaneSet');
447
- laneSet.$parent = container;
448
- laneSets.push(laneSet);
449
- }
450
-
451
- return laneSet;
452
- };
453
-
454
- BpmnUpdater.prototype.updateSemanticParent = function(businessObject, newParent, visualParent) {
455
-
456
- var containment,
457
- translate = this._translate;
458
-
459
- if (businessObject.$parent === newParent) {
460
- return;
461
- }
462
-
463
- if (is(businessObject, 'bpmn:Lane')) {
464
-
465
- if (newParent) {
466
- newParent = this.getLaneSet(newParent);
467
- }
468
-
469
- containment = 'lanes';
470
- } else
471
-
472
- if (is(businessObject, 'bpmn:FlowElement')) {
473
-
474
- if (newParent) {
475
-
476
- if (is(newParent, 'bpmn:Participant')) {
477
- newParent = newParent.processRef;
478
- } else
479
-
480
- if (is(newParent, 'bpmn:Lane')) {
481
- do {
482
- // unwrap Lane -> LaneSet -> (Lane | FlowElementsContainer)
483
- newParent = newParent.$parent.$parent;
484
- } while (is(newParent, 'bpmn:Lane'));
485
-
486
- }
487
- }
488
-
489
- containment = 'flowElements';
490
-
491
- } else
492
-
493
- if (is(businessObject, 'bpmn:Artifact')) {
494
-
495
- while (newParent &&
496
- !is(newParent, 'bpmn:Process') &&
497
- !is(newParent, 'bpmn:SubProcess') &&
498
- !is(newParent, 'bpmn:Collaboration')) {
499
-
500
- if (is(newParent, 'bpmn:Participant')) {
501
- newParent = newParent.processRef;
502
- break;
503
- } else {
504
- newParent = newParent.$parent;
505
- }
506
- }
507
-
508
- containment = 'artifacts';
509
- } else
510
-
511
- if (is(businessObject, 'bpmn:MessageFlow')) {
512
- containment = 'messageFlows';
513
-
514
- } else
515
-
516
- if (is(businessObject, 'bpmn:Participant')) {
517
- containment = 'participants';
518
-
519
- // make sure the participants process is properly attached / detached
520
- // from the XML document
521
-
522
- var process = businessObject.processRef,
523
- definitions;
524
-
525
- if (process) {
526
- definitions = getDefinitions(businessObject.$parent || newParent);
527
-
528
- if (businessObject.$parent) {
529
- Collections.remove(definitions.get('rootElements'), process);
530
- process.$parent = null;
531
- }
532
-
533
- if (newParent) {
534
- Collections.add(definitions.get('rootElements'), process);
535
- process.$parent = definitions;
536
- }
537
- }
538
- } else
539
-
540
- if (is(businessObject, 'bpmn:DataOutputAssociation')) {
541
- containment = 'dataOutputAssociations';
542
- } else
543
-
544
- if (is(businessObject, 'bpmn:DataInputAssociation')) {
545
- containment = 'dataInputAssociations';
546
- }
547
-
548
- if (!containment) {
549
- throw new Error(translate(
550
- 'no parent for {element} in {parent}',
551
- {
552
- element: businessObject.id,
553
- parent: newParent.id
554
- }
555
- ));
556
- }
557
-
558
- var children;
559
-
560
- if (businessObject.$parent) {
561
- // remove from old parent
562
- children = businessObject.$parent.get(containment);
563
- Collections.remove(children, businessObject);
564
- }
565
-
566
- if (!newParent) {
567
- businessObject.$parent = null;
568
- } else {
569
- // add to new parent
570
- children = newParent.get(containment);
571
- children.push(businessObject);
572
- businessObject.$parent = newParent;
573
- }
574
-
575
- if (visualParent) {
576
- var diChildren = visualParent.get(containment);
577
-
578
- Collections.remove(children, businessObject);
579
-
580
- if (newParent) {
581
-
582
- if (!diChildren) {
583
- diChildren = [];
584
- newParent.set(containment, diChildren);
585
- }
586
-
587
- diChildren.push(businessObject);
588
- }
589
- }
590
- };
591
-
592
-
593
- BpmnUpdater.prototype.updateConnectionWaypoints = function(connection) {
594
- connection.businessObject.di.set('waypoint', this._bpmnFactory.createDiWaypoints(connection.waypoints));
595
- };
596
-
597
-
598
- BpmnUpdater.prototype.updateConnection = function(context) {
599
-
600
- var connection = context.connection,
601
- businessObject = getBusinessObject(connection),
602
- newSource = getBusinessObject(connection.source),
603
- newTarget = getBusinessObject(connection.target),
604
- visualParent;
605
-
606
- if (!is(businessObject, 'bpmn:DataAssociation')) {
607
-
608
- var inverseSet = is(businessObject, 'bpmn:SequenceFlow');
609
-
610
- if (businessObject.sourceRef !== newSource) {
611
- if (inverseSet) {
612
- Collections.remove(businessObject.sourceRef && businessObject.sourceRef.get('outgoing'), businessObject);
613
-
614
- if (newSource && newSource.get('outgoing')) {
615
- newSource.get('outgoing').push(businessObject);
616
- }
617
- }
618
-
619
- businessObject.sourceRef = newSource;
620
- }
621
-
622
- if (businessObject.targetRef !== newTarget) {
623
- if (inverseSet) {
624
- Collections.remove(businessObject.targetRef && businessObject.targetRef.get('incoming'), businessObject);
625
-
626
- if (newTarget && newTarget.get('incoming')) {
627
- newTarget.get('incoming').push(businessObject);
628
- }
629
- }
630
-
631
- businessObject.targetRef = newTarget;
632
- }
633
- } else
634
-
635
- if (is(businessObject, 'bpmn:DataInputAssociation')) {
636
- // handle obnoxious isMany sourceRef
637
- businessObject.get('sourceRef')[0] = newSource;
638
-
639
- visualParent = context.parent || context.newParent || newTarget;
640
-
641
- this.updateSemanticParent(businessObject, newTarget, parent.businessObject);
642
- } else
643
-
644
- if (is(businessObject, 'bpmn:DataOutputAssociation')) {
645
- visualParent = context.parent || context.newParent || newSource;
646
-
647
- this.updateSemanticParent(businessObject, newSource, visualParent);
648
-
649
- // targetRef = new target
650
- businessObject.targetRef = newTarget;
651
- }
652
-
653
- this.updateConnectionWaypoints(connection);
654
-
655
- this.updateDiConnection(businessObject.di, newSource, newTarget);
656
- };
657
-
658
-
659
- /////// helpers /////////////////////////////////////////
660
-
661
- BpmnUpdater.prototype._getLabel = function(di) {
662
- if (!di.label) {
663
- di.label = this._bpmnFactory.createDiLabel();
664
- }
665
-
666
- return di.label;
667
- };
668
-
669
-
670
- /**
671
- * Make sure the event listener is only called
672
- * if the touched element is a BPMN element.
673
- *
674
- * @param {Function} fn
675
- * @return {Function} guarded function
676
- */
677
- function ifBpmn(fn) {
678
-
679
- return function(event) {
680
-
681
- var context = event.context,
682
- element = context.shape || context.connection;
683
-
684
- if (is(element, 'bpmn:BaseElement')) {
685
- fn(event);
686
- }
687
- };
688
- }
1
+ 'use strict';
2
+
3
+ var assign = require('lodash/object/assign'),
4
+ forEach = require('lodash/collection/forEach'),
5
+ inherits = require('inherits');
6
+
7
+ var Collections = require('diagram-js/lib/util/Collections'),
8
+ Model = require('diagram-js/lib/model');
9
+
10
+ var getBusinessObject = require('../../util/ModelUtil').getBusinessObject,
11
+ is = require('../../util/ModelUtil').is;
12
+
13
+ var CommandInterceptor = require('diagram-js/lib/command/CommandInterceptor');
14
+
15
+ /**
16
+ * A handler responsible for updating the underlying BPMN 2.0 XML + DI
17
+ * once changes on the diagram happen
18
+ */
19
+ function BpmnUpdater(eventBus, bpmnFactory, connectionDocking, translate) {
20
+
21
+ CommandInterceptor.call(this, eventBus);
22
+
23
+ this._bpmnFactory = bpmnFactory;
24
+ this._translate = translate;
25
+
26
+ var self = this;
27
+
28
+
29
+
30
+ ////// connection cropping /////////////////////////
31
+
32
+ // crop connection ends during create/update
33
+ function cropConnection(e) {
34
+ var context = e.context,
35
+ connection;
36
+
37
+ if (!context.cropped) {
38
+ connection = context.connection;
39
+ connection.waypoints = connectionDocking.getCroppedWaypoints(connection);
40
+ context.cropped = true;
41
+ }
42
+ }
43
+
44
+ this.executed([
45
+ 'connection.layout',
46
+ 'connection.create',
47
+ 'connection.reconnectEnd',
48
+ 'connection.reconnectStart'
49
+ ], cropConnection);
50
+
51
+ this.reverted([ 'connection.layout' ], function(e) {
52
+ delete e.context.cropped;
53
+ });
54
+
55
+
56
+
57
+ ////// BPMN + DI update /////////////////////////
58
+
59
+
60
+ // update parent
61
+ function updateParent(e) {
62
+ var context = e.context;
63
+
64
+ self.updateParent(context.shape || context.connection, context.oldParent);
65
+ }
66
+
67
+ function reverseUpdateParent(e) {
68
+ var context = e.context;
69
+
70
+ var element = context.shape || context.connection,
71
+ // oldParent is the (old) new parent, because we are undoing
72
+ oldParent = context.parent || context.newParent;
73
+
74
+ self.updateParent(element, oldParent);
75
+ }
76
+
77
+ this.executed([
78
+ 'shape.move',
79
+ 'shape.create',
80
+ 'shape.delete',
81
+ 'connection.create',
82
+ 'connection.move',
83
+ 'connection.delete'
84
+ ], ifBpmn(updateParent));
85
+
86
+ this.reverted([
87
+ 'shape.move',
88
+ 'shape.create',
89
+ 'shape.delete',
90
+ 'connection.create',
91
+ 'connection.move',
92
+ 'connection.delete'
93
+ ], ifBpmn(reverseUpdateParent));
94
+
95
+ /*
96
+ * ## Updating Parent
97
+ *
98
+ * When morphing a Process into a Collaboration or vice-versa,
99
+ * make sure that both the *semantic* and *di* parent of each element
100
+ * is updated.
101
+ *
102
+ */
103
+ function updateRoot(event) {
104
+ var context = event.context,
105
+ oldRoot = context.oldRoot,
106
+ children = oldRoot.children;
107
+
108
+ forEach(children, function(child) {
109
+ if (is(child, 'bpmn:BaseElement')) {
110
+ self.updateParent(child);
111
+ }
112
+ });
113
+ }
114
+
115
+ this.executed([ 'canvas.updateRoot' ], updateRoot);
116
+ this.reverted([ 'canvas.updateRoot' ], updateRoot);
117
+
118
+
119
+ // update bounds
120
+ function updateBounds(e) {
121
+ var shape = e.context.shape;
122
+
123
+ if (!is(shape, 'bpmn:BaseElement')) {
124
+ return;
125
+ }
126
+
127
+ self.updateBounds(shape);
128
+ }
129
+
130
+ this.executed([ 'shape.move', 'shape.create', 'shape.resize' ], ifBpmn(function(event) {
131
+
132
+ // exclude labels because they're handled separately during shape.changed
133
+ if (event.context.shape.type === 'label') {
134
+ return;
135
+ }
136
+
137
+ updateBounds(event);
138
+ }));
139
+
140
+ this.reverted([ 'shape.move', 'shape.create', 'shape.resize' ], ifBpmn(function(event) {
141
+
142
+ // exclude labels because they're handled separately during shape.changed
143
+ if (event.context.shape.type === 'label') {
144
+ return;
145
+ }
146
+
147
+ updateBounds(event);
148
+ }));
149
+
150
+ // Handle labels separately. This is necessary, because the label bounds have to be updated
151
+ // every time its shape changes, not only on move, create and resize.
152
+ eventBus.on('shape.changed', function(event) {
153
+ if (event.element.type === 'label') {
154
+ updateBounds({ context: { shape: event.element } });
155
+ }
156
+ });
157
+
158
+ // attach / detach connection
159
+ function updateConnection(e) {
160
+ self.updateConnection(e.context);
161
+ }
162
+
163
+ this.executed([
164
+ 'connection.create',
165
+ 'connection.move',
166
+ 'connection.delete',
167
+ 'connection.reconnectEnd',
168
+ 'connection.reconnectStart'
169
+ ], ifBpmn(updateConnection));
170
+
171
+ this.reverted([
172
+ 'connection.create',
173
+ 'connection.move',
174
+ 'connection.delete',
175
+ 'connection.reconnectEnd',
176
+ 'connection.reconnectStart'
177
+ ], ifBpmn(updateConnection));
178
+
179
+
180
+ // update waypoints
181
+ function updateConnectionWaypoints(e) {
182
+ self.updateConnectionWaypoints(e.context.connection);
183
+ }
184
+
185
+ this.executed([
186
+ 'connection.layout',
187
+ 'connection.move',
188
+ 'connection.updateWaypoints',
189
+ 'connection.reconnectEnd',
190
+ 'connection.reconnectStart'
191
+ ], ifBpmn(updateConnectionWaypoints));
192
+
193
+ this.reverted([
194
+ 'connection.layout',
195
+ 'connection.move',
196
+ 'connection.updateWaypoints',
197
+ 'connection.reconnectEnd',
198
+ 'connection.reconnectStart'
199
+ ], ifBpmn(updateConnectionWaypoints));
200
+
201
+
202
+ // update Default & Conditional flows
203
+ this.executed([
204
+ 'connection.reconnectEnd',
205
+ 'connection.reconnectStart'
206
+ ], ifBpmn(function(e) {
207
+ var context = e.context,
208
+ connection = context.connection,
209
+ businessObject = getBusinessObject(connection),
210
+ oldSource = getBusinessObject(context.oldSource),
211
+ oldTarget = getBusinessObject(context.oldTarget),
212
+ newSource = getBusinessObject(connection.source),
213
+ newTarget = getBusinessObject(connection.target);
214
+
215
+ if (oldSource === newSource || oldTarget === newTarget) {
216
+ return;
217
+ }
218
+
219
+ // on reconnectStart -> default flow
220
+ if (oldSource && oldSource.default === businessObject) {
221
+ context.default = oldSource.default;
222
+ oldSource.default = undefined;
223
+ }
224
+
225
+ // on reconnectEnd -> default flow
226
+ if ((businessObject.sourceRef && businessObject.sourceRef.default) &&
227
+ !(is(newTarget, 'bpmn:Activity') ||
228
+ is(newTarget, 'bpmn:EndEvent') ||
229
+ is(newTarget, 'bpmn:Gateway') ||
230
+ is(newTarget, 'bpmn:IntermediateThrowEvent')) ) {
231
+ context.default = businessObject.sourceRef.default;
232
+ businessObject.sourceRef.default = undefined;
233
+ }
234
+
235
+ // on reconnectStart -> conditional flow
236
+ if (oldSource && (businessObject.conditionExpression) &&
237
+ !(is(newSource, 'bpmn:Activity') ||
238
+ is(newSource, 'bpmn:Gateway')) ) {
239
+ context.conditionExpression = businessObject.conditionExpression;
240
+ businessObject.conditionExpression = undefined;
241
+ }
242
+
243
+ // on reconnectEnd -> conditional flow
244
+ if (oldTarget && (businessObject.conditionExpression) &&
245
+ !(is(newTarget, 'bpmn:Activity') ||
246
+ is(newTarget, 'bpmn:EndEvent') ||
247
+ is(newTarget, 'bpmn:Gateway') ||
248
+ is(newTarget, 'bpmn:IntermediateThrowEvent')) ) {
249
+ context.conditionExpression = businessObject.conditionExpression;
250
+ businessObject.conditionExpression = undefined;
251
+ }
252
+ }));
253
+
254
+ this.reverted([
255
+ 'connection.reconnectEnd',
256
+ 'connection.reconnectStart'
257
+ ], ifBpmn(function(e) {
258
+ var context = e.context,
259
+ connection = context.connection,
260
+ businessObject = getBusinessObject(connection),
261
+ newSource = getBusinessObject(connection.source);
262
+
263
+ // default flow
264
+ if (context.default) {
265
+ if (is(newSource, 'bpmn:ExclusiveGateway') || is(newSource, 'bpmn:InclusiveGateway') ||
266
+ is(newSource, 'bpmn:Activity')) {
267
+ newSource.default = context.default;
268
+ }
269
+ }
270
+
271
+ // conditional flow
272
+ if (context.conditionExpression && is(newSource, 'bpmn:Activity')) {
273
+ businessObject.conditionExpression = context.conditionExpression;
274
+ }
275
+ }));
276
+
277
+ // update attachments
278
+ function updateAttachment(e) {
279
+ self.updateAttachment(e.context);
280
+ }
281
+
282
+ this.executed([ 'element.updateAttachment' ], ifBpmn(updateAttachment));
283
+ this.reverted([ 'element.updateAttachment' ], ifBpmn(updateAttachment));
284
+ }
285
+
286
+ inherits(BpmnUpdater, CommandInterceptor);
287
+
288
+ module.exports = BpmnUpdater;
289
+
290
+ BpmnUpdater.$inject = [ 'eventBus', 'bpmnFactory', 'connectionDocking', 'translate' ];
291
+
292
+
293
+ /////// implementation //////////////////////////////////
294
+
295
+ BpmnUpdater.prototype.updateAttachment = function(context) {
296
+
297
+ var shape = context.shape,
298
+ businessObject = shape.businessObject,
299
+ host = shape.host;
300
+
301
+ businessObject.attachedToRef = host && host.businessObject;
302
+ };
303
+
304
+ BpmnUpdater.prototype.updateParent = function(element, oldParent) {
305
+ // do not update BPMN 2.0 label parent
306
+ if (element instanceof Model.Label) {
307
+ return;
308
+ }
309
+
310
+ var parentShape = element.parent;
311
+
312
+ var businessObject = element.businessObject,
313
+ parentBusinessObject = parentShape && parentShape.businessObject,
314
+ parentDi = parentBusinessObject && parentBusinessObject.di;
315
+
316
+ if (is(element, 'bpmn:FlowNode')) {
317
+ this.updateFlowNodeRefs(businessObject, parentBusinessObject, oldParent && oldParent.businessObject);
318
+ }
319
+
320
+ if (is(element, 'bpmn:DataOutputAssociation')) {
321
+ if (element.source) {
322
+ parentBusinessObject = element.source.businessObject;
323
+ } else {
324
+ parentBusinessObject = null;
325
+ }
326
+ }
327
+
328
+ if (is(element, 'bpmn:DataInputAssociation')) {
329
+ if (element.target) {
330
+ parentBusinessObject = element.target.businessObject;
331
+ } else {
332
+ parentBusinessObject = null;
333
+ }
334
+ }
335
+
336
+ this.updateSemanticParent(businessObject, parentBusinessObject);
337
+
338
+ if (is(element, 'bpmn:DataObjectReference') && businessObject.dataObjectRef) {
339
+ this.updateSemanticParent(businessObject.dataObjectRef, parentBusinessObject);
340
+ }
341
+
342
+ this.updateDiParent(businessObject.di, parentDi);
343
+ };
344
+
345
+
346
+ BpmnUpdater.prototype.updateBounds = function(shape) {
347
+
348
+ var di = shape.businessObject.di;
349
+
350
+ var bounds = (shape instanceof Model.Label) ? this._getLabel(di).bounds : di.bounds;
351
+
352
+ assign(bounds, {
353
+ x: shape.x,
354
+ y: shape.y,
355
+ width: shape.width,
356
+ height: shape.height
357
+ });
358
+ };
359
+
360
+ BpmnUpdater.prototype.updateFlowNodeRefs = function(businessObject, newContainment, oldContainment) {
361
+
362
+ if (oldContainment === newContainment) {
363
+ return;
364
+ }
365
+
366
+ var oldRefs, newRefs;
367
+
368
+ if (is (oldContainment, 'bpmn:Lane')) {
369
+ oldRefs = oldContainment.get('flowNodeRef');
370
+ Collections.remove(oldRefs, businessObject);
371
+ }
372
+
373
+ if (is(newContainment, 'bpmn:Lane')) {
374
+ newRefs = newContainment.get('flowNodeRef');
375
+ Collections.add(newRefs, businessObject);
376
+ }
377
+ };
378
+
379
+
380
+ // update existing sourceElement and targetElement di information
381
+ BpmnUpdater.prototype.updateDiConnection = function(di, newSource, newTarget) {
382
+
383
+ if (di.sourceElement && di.sourceElement.bpmnElement !== newSource) {
384
+ di.sourceElement = newSource && newSource.di;
385
+ }
386
+
387
+ if (di.targetElement && di.targetElement.bpmnElement !== newTarget) {
388
+ di.targetElement = newTarget && newTarget.di;
389
+ }
390
+
391
+ };
392
+
393
+
394
+ BpmnUpdater.prototype.updateDiParent = function(di, parentDi) {
395
+
396
+ if (parentDi && !is(parentDi, 'bpmndi:BPMNPlane')) {
397
+ parentDi = parentDi.$parent;
398
+ }
399
+
400
+ if (di.$parent === parentDi) {
401
+ return;
402
+ }
403
+
404
+ var planeElements = (parentDi || di.$parent).get('planeElement');
405
+
406
+ if (parentDi) {
407
+ planeElements.push(di);
408
+ di.$parent = parentDi;
409
+ } else {
410
+ Collections.remove(planeElements, di);
411
+ di.$parent = null;
412
+ }
413
+ };
414
+
415
+ function getDefinitions(element) {
416
+ while (element && !is(element, 'bpmn:Definitions')) {
417
+ element = element.$parent;
418
+ }
419
+
420
+ return element;
421
+ }
422
+
423
+ BpmnUpdater.prototype.getLaneSet = function(container) {
424
+
425
+ var laneSet, laneSets;
426
+
427
+ // bpmn:Lane
428
+ if (is(container, 'bpmn:Lane')) {
429
+ laneSet = container.childLaneSet;
430
+
431
+ if (!laneSet) {
432
+ laneSet = this._bpmnFactory.create('bpmn:LaneSet');
433
+ container.childLaneSet = laneSet;
434
+ laneSet.$parent = container;
435
+ }
436
+
437
+ return laneSet;
438
+ }
439
+
440
+ // bpmn:Participant
441
+ if (is(container, 'bpmn:Participant')) {
442
+ container = container.processRef;
443
+ }
444
+
445
+ // bpmn:FlowElementsContainer
446
+ laneSets = container.get('laneSets');
447
+ laneSet = laneSets[0];
448
+
449
+ if (!laneSet) {
450
+ laneSet = this._bpmnFactory.create('bpmn:LaneSet');
451
+ laneSet.$parent = container;
452
+ laneSets.push(laneSet);
453
+ }
454
+
455
+ return laneSet;
456
+ };
457
+
458
+ BpmnUpdater.prototype.updateSemanticParent = function(businessObject, newParent, visualParent) {
459
+
460
+ var containment,
461
+ translate = this._translate;
462
+
463
+ if (businessObject.$parent === newParent) {
464
+ return;
465
+ }
466
+
467
+ if (is(businessObject, 'bpmn:Lane')) {
468
+
469
+ if (newParent) {
470
+ newParent = this.getLaneSet(newParent);
471
+ }
472
+
473
+ containment = 'lanes';
474
+ } else
475
+
476
+ if (is(businessObject, 'bpmn:FlowElement')) {
477
+
478
+ if (newParent) {
479
+
480
+ if (is(newParent, 'bpmn:Participant')) {
481
+ newParent = newParent.processRef;
482
+ } else
483
+
484
+ if (is(newParent, 'bpmn:Lane')) {
485
+ do {
486
+ // unwrap Lane -> LaneSet -> (Lane | FlowElementsContainer)
487
+ newParent = newParent.$parent.$parent;
488
+ } while (is(newParent, 'bpmn:Lane'));
489
+
490
+ }
491
+ }
492
+
493
+ containment = 'flowElements';
494
+
495
+ } else
496
+
497
+ if (is(businessObject, 'bpmn:Artifact')) {
498
+
499
+ while (newParent &&
500
+ !is(newParent, 'bpmn:Process') &&
501
+ !is(newParent, 'bpmn:SubProcess') &&
502
+ !is(newParent, 'bpmn:Collaboration')) {
503
+
504
+ if (is(newParent, 'bpmn:Participant')) {
505
+ newParent = newParent.processRef;
506
+ break;
507
+ } else {
508
+ newParent = newParent.$parent;
509
+ }
510
+ }
511
+
512
+ containment = 'artifacts';
513
+ } else
514
+
515
+ if (is(businessObject, 'bpmn:MessageFlow')) {
516
+ containment = 'messageFlows';
517
+
518
+ } else
519
+
520
+ if (is(businessObject, 'bpmn:Participant')) {
521
+ containment = 'participants';
522
+
523
+ // make sure the participants process is properly attached / detached
524
+ // from the XML document
525
+
526
+ var process = businessObject.processRef,
527
+ definitions;
528
+
529
+ if (process) {
530
+ definitions = getDefinitions(businessObject.$parent || newParent);
531
+
532
+ if (businessObject.$parent) {
533
+ Collections.remove(definitions.get('rootElements'), process);
534
+ process.$parent = null;
535
+ }
536
+
537
+ if (newParent) {
538
+ Collections.add(definitions.get('rootElements'), process);
539
+ process.$parent = definitions;
540
+ }
541
+ }
542
+ } else
543
+
544
+ if (is(businessObject, 'bpmn:DataOutputAssociation')) {
545
+ containment = 'dataOutputAssociations';
546
+ } else
547
+
548
+ if (is(businessObject, 'bpmn:DataInputAssociation')) {
549
+ containment = 'dataInputAssociations';
550
+ }
551
+
552
+ if (!containment) {
553
+ throw new Error(translate(
554
+ 'no parent for {element} in {parent}',
555
+ {
556
+ element: businessObject.id,
557
+ parent: newParent.id
558
+ }
559
+ ));
560
+ }
561
+
562
+ var children;
563
+
564
+ if (businessObject.$parent) {
565
+ // remove from old parent
566
+ children = businessObject.$parent.get(containment);
567
+ Collections.remove(children, businessObject);
568
+ }
569
+
570
+ if (!newParent) {
571
+ businessObject.$parent = null;
572
+ } else {
573
+ // add to new parent
574
+ children = newParent.get(containment);
575
+ children.push(businessObject);
576
+ businessObject.$parent = newParent;
577
+ }
578
+
579
+ if (visualParent) {
580
+ var diChildren = visualParent.get(containment);
581
+
582
+ Collections.remove(children, businessObject);
583
+
584
+ if (newParent) {
585
+
586
+ if (!diChildren) {
587
+ diChildren = [];
588
+ newParent.set(containment, diChildren);
589
+ }
590
+
591
+ diChildren.push(businessObject);
592
+ }
593
+ }
594
+ };
595
+
596
+
597
+ BpmnUpdater.prototype.updateConnectionWaypoints = function(connection) {
598
+ connection.businessObject.di.set('waypoint', this._bpmnFactory.createDiWaypoints(connection.waypoints));
599
+ };
600
+
601
+
602
+ BpmnUpdater.prototype.updateConnection = function(context) {
603
+
604
+ var connection = context.connection,
605
+ businessObject = getBusinessObject(connection),
606
+ newSource = getBusinessObject(connection.source),
607
+ newTarget = getBusinessObject(connection.target),
608
+ visualParent;
609
+
610
+ if (!is(businessObject, 'bpmn:DataAssociation')) {
611
+
612
+ var inverseSet = is(businessObject, 'bpmn:SequenceFlow');
613
+
614
+ if (businessObject.sourceRef !== newSource) {
615
+ if (inverseSet) {
616
+ Collections.remove(businessObject.sourceRef && businessObject.sourceRef.get('outgoing'), businessObject);
617
+
618
+ if (newSource && newSource.get('outgoing')) {
619
+ newSource.get('outgoing').push(businessObject);
620
+ }
621
+ }
622
+
623
+ businessObject.sourceRef = newSource;
624
+ }
625
+
626
+ if (businessObject.targetRef !== newTarget) {
627
+ if (inverseSet) {
628
+ Collections.remove(businessObject.targetRef && businessObject.targetRef.get('incoming'), businessObject);
629
+
630
+ if (newTarget && newTarget.get('incoming')) {
631
+ newTarget.get('incoming').push(businessObject);
632
+ }
633
+ }
634
+
635
+ businessObject.targetRef = newTarget;
636
+ }
637
+ } else
638
+
639
+ if (is(businessObject, 'bpmn:DataInputAssociation')) {
640
+ // handle obnoxious isMany sourceRef
641
+ businessObject.get('sourceRef')[0] = newSource;
642
+
643
+ visualParent = context.parent || context.newParent || newTarget;
644
+
645
+ this.updateSemanticParent(businessObject, newTarget, parent.businessObject);
646
+ } else
647
+
648
+ if (is(businessObject, 'bpmn:DataOutputAssociation')) {
649
+ visualParent = context.parent || context.newParent || newSource;
650
+
651
+ this.updateSemanticParent(businessObject, newSource, visualParent);
652
+
653
+ // targetRef = new target
654
+ businessObject.targetRef = newTarget;
655
+ }
656
+
657
+ this.updateConnectionWaypoints(connection);
658
+
659
+ this.updateDiConnection(businessObject.di, newSource, newTarget);
660
+ };
661
+
662
+
663
+ /////// helpers /////////////////////////////////////////
664
+
665
+ BpmnUpdater.prototype._getLabel = function(di) {
666
+ if (!di.label) {
667
+ di.label = this._bpmnFactory.createDiLabel();
668
+ }
669
+
670
+ return di.label;
671
+ };
672
+
673
+
674
+ /**
675
+ * Make sure the event listener is only called
676
+ * if the touched element is a BPMN element.
677
+ *
678
+ * @param {Function} fn
679
+ * @return {Function} guarded function
680
+ */
681
+ function ifBpmn(fn) {
682
+
683
+ return function(event) {
684
+
685
+ var context = event.context,
686
+ element = context.shape || context.connection;
687
+
688
+ if (is(element, 'bpmn:BaseElement')) {
689
+ fn(event);
690
+ }
691
+ };
692
+ }