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,495 +1,511 @@
1
- 'use strict';
2
-
3
- var inherits = require('inherits');
4
-
5
- var abs = Math.abs;
6
-
7
- var forEach = require('lodash/collection/forEach'),
8
- filter = require('lodash/collection/filter'),
9
- assign = require('lodash/object/assign');
10
-
11
- var getBoundingBox = require('diagram-js/lib/util/Elements').getBBox;
12
-
13
- var is = require('../../util/ModelUtil').is,
14
- isAny = require('../modeling/util/ModelingUtil').isAny,
15
- isExpanded = require('../../util/DiUtil').isExpanded;
16
-
17
- var Snapping = require('diagram-js/lib/features/snapping/Snapping'),
18
- SnapUtil = require('diagram-js/lib/features/snapping/SnapUtil');
19
-
20
- var asTRBL = require('diagram-js/lib/layout/LayoutUtil').asTRBL;
21
-
22
- var round = Math.round;
23
-
24
- var mid = SnapUtil.mid,
25
- topLeft = SnapUtil.topLeft,
26
- bottomRight = SnapUtil.bottomRight,
27
- isSnapped = SnapUtil.isSnapped,
28
- setSnapped = SnapUtil.setSnapped;
29
-
30
- var getBoundaryAttachment = require('./BpmnSnappingUtil').getBoundaryAttachment,
31
- getParticipantSizeConstraints = require('./BpmnSnappingUtil').getParticipantSizeConstraints,
32
- getLanesRoot = require('../modeling/util/LaneUtil').getLanesRoot;
33
-
34
- var HIGH_PRIORITY = 1500;
35
-
36
-
37
- /**
38
- * BPMN specific snapping functionality
39
- *
40
- * * snap on process elements if a pool is created inside a
41
- * process diagram
42
- *
43
- * @param {EventBus} eventBus
44
- * @param {Canvas} canvas
45
- */
46
- function BpmnSnapping(eventBus, canvas, bpmnRules, elementRegistry) {
47
-
48
- // instantiate super
49
- Snapping.call(this, eventBus, canvas);
50
-
51
-
52
- /**
53
- * Drop participant on process <> process elements snapping
54
- */
55
- eventBus.on('create.start', function(event) {
56
-
57
- var context = event.context,
58
- shape = context.shape,
59
- rootElement = canvas.getRootElement();
60
-
61
- // snap participant around existing elements (if any)
62
- if (is(shape, 'bpmn:Participant') && is(rootElement, 'bpmn:Process')) {
63
- initParticipantSnapping(context, shape, rootElement.children);
64
- }
65
- });
66
-
67
- eventBus.on([ 'create.move', 'create.end' ], HIGH_PRIORITY, function(event) {
68
-
69
- var context = event.context,
70
- shape = context.shape,
71
- participantSnapBox = context.participantSnapBox;
72
-
73
- if (!isSnapped(event) && participantSnapBox) {
74
- snapParticipant(participantSnapBox, shape, event);
75
- }
76
- });
77
-
78
- eventBus.on('shape.move.start', function(event) {
79
-
80
- var context = event.context,
81
- shape = context.shape,
82
- rootElement = canvas.getRootElement();
83
-
84
- // snap participant around existing elements (if any)
85
- if (is(shape, 'bpmn:Participant') && is(rootElement, 'bpmn:Process')) {
86
- initParticipantSnapping(context, shape, rootElement.children);
87
- }
88
- });
89
-
90
-
91
- function canAttach(shape, target, position) {
92
- return bpmnRules.canAttach([ shape ], target, null, position) === 'attach';
93
- }
94
-
95
- function canConnect(source, target) {
96
- return bpmnRules.canConnect(source, target);
97
- }
98
-
99
- /**
100
- * Snap boundary events to elements border
101
- */
102
- eventBus.on([
103
- 'create.move',
104
- 'create.end',
105
- 'shape.move.move',
106
- 'shape.move.end'
107
- ], HIGH_PRIORITY, function(event) {
108
-
109
- var context = event.context,
110
- target = context.target,
111
- shape = context.shape;
112
-
113
- if (target && !isSnapped(event) && canAttach(shape, target, event)) {
114
- snapBoundaryEvent(event, shape, target);
115
- }
116
- });
117
-
118
- /**
119
- * Adjust parent for flowElements to the target participant
120
- * when droping onto lanes.
121
- */
122
- eventBus.on([
123
- 'shape.move.hover',
124
- 'shape.move.move',
125
- 'shape.move.end',
126
- 'create.hover',
127
- 'create.move',
128
- 'create.end'
129
- ], HIGH_PRIORITY, function(event) {
130
- var context = event.context,
131
- shape = context.shape,
132
- hover = event.hover;
133
-
134
- if (is(hover, 'bpmn:Lane') && !isAny(shape, [ 'bpmn:Lane', 'bpmn:Participant' ])) {
135
- event.hover = getLanesRoot(hover);
136
- event.hoverGfx = elementRegistry.getGraphics(event.hover);
137
- }
138
- });
139
-
140
- /**
141
- * Snap sequence flows.
142
- */
143
- eventBus.on([
144
- 'connect.move',
145
- 'connect.hover',
146
- 'connect.end'
147
- ], HIGH_PRIORITY, function(event) {
148
- var context = event.context,
149
- source = context.source,
150
- target = context.target;
151
-
152
- var connection = canConnect(source, target) || {};
153
-
154
- if (!context.initialSourcePosition) {
155
- context.initialSourcePosition = context.sourcePosition;
156
- }
157
-
158
- if (target && connection.type === 'bpmn:SequenceFlow') {
159
-
160
- // snap source
161
- context.sourcePosition = mid(source);
162
-
163
- // snap target
164
- assign(event, mid(target));
165
- } else {
166
-
167
- // otherwise reset source snap
168
- context.sourcePosition = context.initialSourcePosition;
169
- }
170
-
171
- });
172
-
173
-
174
- eventBus.on([
175
- 'create.move',
176
- 'shape.move.move'
177
- ], function(event) {
178
-
179
- var context = event.context,
180
- shape = context.shape,
181
- target = context.target;
182
-
183
- var threshold = 30;
184
-
185
- if (is(shape, 'bpmn:Lane')) {
186
- if (isAny(target, [ 'bpmn:Lane', 'bpmn:Participant' ])) {
187
-
188
- var childLanes = filter(target.children, function(c) {
189
- return is(c, 'bpmn:Lane');
190
- });
191
-
192
- var y = event.y,
193
- targetTrbl;
194
-
195
- var insert = childLanes.reduce(function(insert, l) {
196
-
197
- var laneTrbl = asTRBL(l);
198
-
199
- if (abs(laneTrbl.top - y) < threshold) {
200
- insert = assign(insert || {}, { before: { element: l, y: laneTrbl.top } });
201
- } else
202
- if (abs(laneTrbl.bottom - y) < threshold) {
203
- insert = assign(insert || {}, { after: { element: l, y: laneTrbl.bottom } });
204
- } else
205
- if (laneTrbl.top < y && laneTrbl.bottom > y) {
206
- if (abs(laneTrbl.top - y) > abs(laneTrbl.bottom - y)) {
207
- insert = assign(insert || {}, { after: { element: l, y: laneTrbl.bottom } });
208
- } else {
209
- insert = assign(insert || {}, { before: { element: l, y: laneTrbl.top } });
210
- }
211
-
212
- }
213
-
214
- return insert;
215
- }, false);
216
-
217
-
218
- if (!insert) {
219
- targetTrbl = asTRBL(target);
220
-
221
- if (abs(targetTrbl.top - y) < threshold) {
222
- insert = { before: { element: target, y: targetTrbl.top } };
223
- } else
224
- if (abs(targetTrbl.bottom - y) < threshold) {
225
- insert = { after: { element: target, y: targetTrbl.bottom } };
226
- } else {
227
- insert = { into: { element: target, y: (targetTrbl.top + targetTrbl.bottom) / 2 } };
228
- }
229
-
230
- }
231
-
232
- if (insert.before && insert.after) {
233
- console.log('insert between', insert.before.element.id, 'and', insert.after.element.id);
234
- setSnapped(event, 'x', insert.before.element.x + insert.before.element.width / 2);
235
- setSnapped(event, 'y', insert.before.y);
236
- } else
237
- if (insert.after) {
238
- console.log('insert after', insert.after.element.id);
239
- setSnapped(event, 'x', insert.after.element.x + insert.after.element.width / 2);
240
- setSnapped(event, 'y', insert.after.y);
241
- } else
242
- if (insert.before) {
243
- console.log('insert before', insert.before.element.id);
244
- setSnapped(event, 'x', insert.before.element.x + insert.before.element.width / 2);
245
- setSnapped(event, 'y', insert.before.y);
246
- } else
247
- if (insert.into) {
248
- console.log('insert into', insert.into.element.id);
249
- setSnapped(event, 'x', insert.into.element.x + insert.into.element.width / 2);
250
- setSnapped(event, 'y', insert.into.y);
251
- }
252
- }
253
- }
254
-
255
- });
256
-
257
- eventBus.on('resize.start', HIGH_PRIORITY, function(event) {
258
- var context = event.context,
259
- shape = context.shape;
260
-
261
- if (is(shape, 'bpmn:SubProcess') && isExpanded(shape)) {
262
- context.minDimensions = { width: 140, height: 120 };
263
- }
264
-
265
- if (is(shape, 'bpmn:Participant')) {
266
- context.minDimensions = { width: 300, height: 150 };
267
- }
268
-
269
- if (is(shape, 'bpmn:Lane') || is(shape, 'bpmn:Participant')) {
270
- context.resizeConstraints = getParticipantSizeConstraints(shape, context.direction, context.balanced);
271
- }
272
-
273
- if (is(shape, 'bpmn:TextAnnotation')) {
274
- context.minDimensions = { width: 50, height: 30 };
275
- }
276
- });
277
-
278
- }
279
-
280
- inherits(BpmnSnapping, Snapping);
281
-
282
- BpmnSnapping.$inject = [ 'eventBus', 'canvas', 'bpmnRules', 'elementRegistry' ];
283
-
284
- module.exports = BpmnSnapping;
285
-
286
-
287
- BpmnSnapping.prototype.initSnap = function(event) {
288
-
289
- var context = event.context,
290
- shape = event.shape,
291
- shapeMid,
292
- shapeBounds,
293
- shapeTopLeft,
294
- shapeBottomRight,
295
- snapContext;
296
-
297
-
298
- snapContext = Snapping.prototype.initSnap.call(this, event);
299
-
300
- if (is(shape, 'bpmn:Participant')) {
301
- // assign higher priority for outer snaps on participants
302
- snapContext.setSnapLocations([ 'top-left', 'bottom-right', 'mid' ]);
303
- }
304
-
305
-
306
- if (shape) {
307
-
308
- shapeMid = mid(shape, event);
309
-
310
- shapeBounds = {
311
- width: shape.width,
312
- height: shape.height,
313
- x: isNaN(shape.x) ? round(shapeMid.x - shape.width / 2) : shape.x,
314
- y: isNaN(shape.y) ? round(shapeMid.y - shape.height / 2) : shape.y
315
- };
316
-
317
- shapeTopLeft = topLeft(shapeBounds);
318
- shapeBottomRight = bottomRight(shapeBounds);
319
-
320
- snapContext.setSnapOrigin('top-left', {
321
- x: shapeTopLeft.x - event.x,
322
- y: shapeTopLeft.y - event.y
323
- });
324
-
325
- snapContext.setSnapOrigin('bottom-right', {
326
- x: shapeBottomRight.x - event.x,
327
- y: shapeBottomRight.y - event.y
328
- });
329
-
330
- forEach(shape.outgoing, function(c) {
331
- var docking = c.waypoints[0];
332
-
333
- docking = docking.original || docking;
334
-
335
- snapContext.setSnapOrigin(c.id + '-docking', {
336
- x: docking.x - event.x,
337
- y: docking.y - event.y
338
- });
339
- });
340
-
341
- forEach(shape.incoming, function(c) {
342
- var docking = c.waypoints[c.waypoints.length - 1];
343
-
344
- docking = docking.original || docking;
345
-
346
- snapContext.setSnapOrigin(c.id + '-docking', {
347
- x: docking.x - event.x,
348
- y: docking.y - event.y
349
- });
350
- });
351
-
352
- }
353
-
354
- var source = context.source;
355
-
356
- if (source) {
357
- snapContext.addDefaultSnap('mid', mid(source));
358
- }
359
- };
360
-
361
-
362
- BpmnSnapping.prototype.addTargetSnaps = function(snapPoints, shape, target) {
363
-
364
- // use target parent as snap target
365
- if (is(shape, 'bpmn:BoundaryEvent') && shape.type !== 'label') {
366
- target = target.parent;
367
- }
368
-
369
- // add sequence flow parents as snap targets
370
- if (is(target, 'bpmn:SequenceFlow')) {
371
- this.addTargetSnaps(snapPoints, shape, target.parent);
372
- }
373
-
374
- var siblings = this.getSiblings(shape, target) || [];
375
-
376
- forEach(siblings, function(s) {
377
-
378
- // do not snap to lanes
379
- if (is(s, 'bpmn:Lane')) {
380
- return;
381
- }
382
-
383
- snapPoints.add('mid', mid(s));
384
-
385
- if (is(s, 'bpmn:Participant')) {
386
- snapPoints.add('top-left', topLeft(s));
387
- snapPoints.add('bottom-right', bottomRight(s));
388
- }
389
- });
390
-
391
-
392
- forEach(shape.incoming, function(c) {
393
-
394
- if (siblings.indexOf(c.source) === -1) {
395
- snapPoints.add('mid', mid(c.source));
396
- }
397
-
398
- var docking = c.waypoints[0];
399
- snapPoints.add(c.id + '-docking', docking.original || docking);
400
- });
401
-
402
-
403
- forEach(shape.outgoing, function(c) {
404
-
405
- if (siblings.indexOf(c.target) === -1) {
406
- snapPoints.add('mid', mid(c.target));
407
- }
408
-
409
- var docking = c.waypoints[c.waypoints.length - 1];
410
- snapPoints.add(c.id + '-docking', docking.original || docking);
411
- });
412
- };
413
-
414
-
415
- /////// participant snapping //////////////////
416
-
417
- function initParticipantSnapping(context, shape, elements) {
418
-
419
- if (!elements.length) {
420
- return;
421
- }
422
-
423
- var snapBox = getBoundingBox(elements.filter(function(e) {
424
- return !e.labelTarget && !e.waypoints;
425
- }));
426
-
427
- snapBox.x -= 50;
428
- snapBox.y -= 20;
429
- snapBox.width += 70;
430
- snapBox.height += 40;
431
-
432
- // adjust shape height to include bounding box
433
- shape.width = Math.max(shape.width, snapBox.width);
434
- shape.height = Math.max(shape.height, snapBox.height);
435
-
436
- context.participantSnapBox = snapBox;
437
- }
438
-
439
- function snapParticipant(snapBox, shape, event, offset) {
440
- offset = offset || 0;
441
-
442
- var shapeHalfWidth = shape.width / 2 - offset,
443
- shapeHalfHeight = shape.height / 2;
444
-
445
- var currentTopLeft = {
446
- x: event.x - shapeHalfWidth - offset,
447
- y: event.y - shapeHalfHeight
448
- };
449
-
450
- var currentBottomRight = {
451
- x: event.x + shapeHalfWidth + offset,
452
- y: event.y + shapeHalfHeight
453
- };
454
-
455
- var snapTopLeft = snapBox,
456
- snapBottomRight = bottomRight(snapBox);
457
-
458
- if (currentTopLeft.x >= snapTopLeft.x) {
459
- setSnapped(event, 'x', snapTopLeft.x + offset + shapeHalfWidth);
460
- } else
461
- if (currentBottomRight.x <= snapBottomRight.x) {
462
- setSnapped(event, 'x', snapBottomRight.x - offset - shapeHalfWidth);
463
- }
464
-
465
- if (currentTopLeft.y >= snapTopLeft.y) {
466
- setSnapped(event, 'y', snapTopLeft.y + shapeHalfHeight);
467
- } else
468
- if (currentBottomRight.y <= snapBottomRight.y) {
469
- setSnapped(event, 'y', snapBottomRight.y - shapeHalfHeight);
470
- }
471
- }
472
-
473
-
474
- /////// boundary event snapping /////////////////////////
475
-
476
-
477
- function snapBoundaryEvent(event, shape, target) {
478
- var targetTRBL = asTRBL(target);
479
-
480
- var direction = getBoundaryAttachment(event, target);
481
-
482
- if (/top/.test(direction)) {
483
- setSnapped(event, 'y', targetTRBL.top);
484
- } else
485
- if (/bottom/.test(direction)) {
486
- setSnapped(event, 'y', targetTRBL.bottom);
487
- }
488
-
489
- if (/left/.test(direction)) {
490
- setSnapped(event, 'x', targetTRBL.left);
491
- } else
492
- if (/right/.test(direction)) {
493
- setSnapped(event, 'x', targetTRBL.right);
494
- }
495
- }
1
+ 'use strict';
2
+
3
+ var inherits = require('inherits');
4
+
5
+ var abs = Math.abs;
6
+
7
+ var forEach = require('lodash/collection/forEach'),
8
+ filter = require('lodash/collection/filter'),
9
+ assign = require('lodash/object/assign');
10
+
11
+ var getBoundingBox = require('diagram-js/lib/util/Elements').getBBox;
12
+
13
+ var is = require('../../util/ModelUtil').is,
14
+ isAny = require('../modeling/util/ModelingUtil').isAny,
15
+ isExpanded = require('../../util/DiUtil').isExpanded;
16
+
17
+ var Snapping = require('diagram-js/lib/features/snapping/Snapping'),
18
+ SnapUtil = require('diagram-js/lib/features/snapping/SnapUtil');
19
+
20
+ var asTRBL = require('diagram-js/lib/layout/LayoutUtil').asTRBL;
21
+
22
+ var round = Math.round;
23
+
24
+ var mid = SnapUtil.mid,
25
+ topLeft = SnapUtil.topLeft,
26
+ bottomRight = SnapUtil.bottomRight,
27
+ isSnapped = SnapUtil.isSnapped,
28
+ setSnapped = SnapUtil.setSnapped;
29
+
30
+ var getBoundaryAttachment = require('./BpmnSnappingUtil').getBoundaryAttachment,
31
+ getParticipantSizeConstraints = require('./BpmnSnappingUtil').getParticipantSizeConstraints,
32
+ getLanesRoot = require('../modeling/util/LaneUtil').getLanesRoot;
33
+
34
+ var HIGH_PRIORITY = 1500;
35
+
36
+
37
+ /**
38
+ * BPMN specific snapping functionality
39
+ *
40
+ * * snap on process elements if a pool is created inside a
41
+ * process diagram
42
+ *
43
+ * @param {EventBus} eventBus
44
+ * @param {Canvas} canvas
45
+ */
46
+ function BpmnSnapping(eventBus, canvas, bpmnRules, elementRegistry) {
47
+
48
+ // instantiate super
49
+ Snapping.call(this, eventBus, canvas);
50
+
51
+
52
+ /**
53
+ * Drop participant on process <> process elements snapping
54
+ */
55
+ eventBus.on('create.start', function(event) {
56
+
57
+ var context = event.context,
58
+ shape = context.shape,
59
+ rootElement = canvas.getRootElement();
60
+
61
+ // snap participant around existing elements (if any)
62
+ if (is(shape, 'bpmn:Participant') && is(rootElement, 'bpmn:Process')) {
63
+ initParticipantSnapping(context, shape, rootElement.children);
64
+ }
65
+ });
66
+
67
+ eventBus.on([ 'create.move', 'create.end' ], HIGH_PRIORITY, function(event) {
68
+
69
+ var context = event.context,
70
+ shape = context.shape,
71
+ participantSnapBox = context.participantSnapBox;
72
+
73
+ if (!isSnapped(event) && participantSnapBox) {
74
+ snapParticipant(participantSnapBox, shape, event);
75
+ }
76
+ });
77
+
78
+ eventBus.on('shape.move.start', function(event) {
79
+
80
+ var context = event.context,
81
+ shape = context.shape,
82
+ rootElement = canvas.getRootElement();
83
+
84
+ // snap participant around existing elements (if any)
85
+ if (is(shape, 'bpmn:Participant') && is(rootElement, 'bpmn:Process')) {
86
+ initParticipantSnapping(context, shape, rootElement.children);
87
+ }
88
+ });
89
+
90
+
91
+ function canAttach(shape, target, position) {
92
+ return bpmnRules.canAttach([ shape ], target, null, position) === 'attach';
93
+ }
94
+
95
+ function canConnect(source, target) {
96
+ return bpmnRules.canConnect(source, target);
97
+ }
98
+
99
+ /**
100
+ * Snap boundary events to elements border
101
+ */
102
+ eventBus.on([
103
+ 'create.move',
104
+ 'create.end',
105
+ 'shape.move.move',
106
+ 'shape.move.end'
107
+ ], HIGH_PRIORITY, function(event) {
108
+
109
+ var context = event.context,
110
+ target = context.target,
111
+ shape = context.shape;
112
+
113
+ if (target && !isSnapped(event) && canAttach(shape, target, event)) {
114
+ snapBoundaryEvent(event, shape, target);
115
+ }
116
+ });
117
+
118
+ /**
119
+ * Adjust parent for flowElements to the target participant
120
+ * when droping onto lanes.
121
+ */
122
+ eventBus.on([
123
+ 'shape.move.hover',
124
+ 'shape.move.move',
125
+ 'shape.move.end',
126
+ 'create.hover',
127
+ 'create.move',
128
+ 'create.end'
129
+ ], HIGH_PRIORITY, function(event) {
130
+ var context = event.context,
131
+ shape = context.shape,
132
+ hover = event.hover;
133
+
134
+ if (is(hover, 'bpmn:Lane') && !isAny(shape, [ 'bpmn:Lane', 'bpmn:Participant' ])) {
135
+ event.hover = getLanesRoot(hover);
136
+ event.hoverGfx = elementRegistry.getGraphics(event.hover);
137
+ }
138
+ });
139
+
140
+ /**
141
+ * Snap sequence flows.
142
+ */
143
+ eventBus.on([
144
+ 'connect.move',
145
+ 'connect.hover',
146
+ 'connect.end'
147
+ ], HIGH_PRIORITY, function(event) {
148
+ var context = event.context,
149
+ source = context.source,
150
+ target = context.target;
151
+
152
+ var connection = canConnect(source, target) || {};
153
+
154
+ if (!context.initialSourcePosition) {
155
+ context.initialSourcePosition = context.sourcePosition;
156
+ }
157
+
158
+ if (target && connection.type === 'bpmn:SequenceFlow') {
159
+
160
+ // snap source
161
+ context.sourcePosition = mid(source);
162
+
163
+ // snap target
164
+ assign(event, mid(target));
165
+ } else {
166
+
167
+ // otherwise reset source snap
168
+ context.sourcePosition = context.initialSourcePosition;
169
+ }
170
+
171
+ });
172
+
173
+
174
+ eventBus.on([
175
+ 'create.move',
176
+ 'shape.move.move'
177
+ ], function(event) {
178
+
179
+ var context = event.context,
180
+ shape = context.shape,
181
+ target = context.target;
182
+
183
+ var threshold = 30;
184
+
185
+ if (is(shape, 'bpmn:Lane')) {
186
+ if (isAny(target, [ 'bpmn:Lane', 'bpmn:Participant' ])) {
187
+
188
+ var childLanes = filter(target.children, function(c) {
189
+ return is(c, 'bpmn:Lane');
190
+ });
191
+
192
+ var y = event.y,
193
+ targetTrbl;
194
+
195
+ var insert = childLanes.reduce(function(insert, l) {
196
+
197
+ var laneTrbl = asTRBL(l);
198
+
199
+ if (abs(laneTrbl.top - y) < threshold) {
200
+ insert = assign(insert || {}, { before: { element: l, y: laneTrbl.top } });
201
+ } else
202
+ if (abs(laneTrbl.bottom - y) < threshold) {
203
+ insert = assign(insert || {}, { after: { element: l, y: laneTrbl.bottom } });
204
+ } else
205
+ if (laneTrbl.top < y && laneTrbl.bottom > y) {
206
+ if (abs(laneTrbl.top - y) > abs(laneTrbl.bottom - y)) {
207
+ insert = assign(insert || {}, { after: { element: l, y: laneTrbl.bottom } });
208
+ } else {
209
+ insert = assign(insert || {}, { before: { element: l, y: laneTrbl.top } });
210
+ }
211
+
212
+ }
213
+
214
+ return insert;
215
+ }, false);
216
+
217
+
218
+ if (!insert) {
219
+ targetTrbl = asTRBL(target);
220
+
221
+ if (abs(targetTrbl.top - y) < threshold) {
222
+ insert = { before: { element: target, y: targetTrbl.top } };
223
+ } else
224
+ if (abs(targetTrbl.bottom - y) < threshold) {
225
+ insert = { after: { element: target, y: targetTrbl.bottom } };
226
+ } else {
227
+ insert = { into: { element: target, y: (targetTrbl.top + targetTrbl.bottom) / 2 } };
228
+ }
229
+
230
+ }
231
+
232
+ if (insert.before && insert.after) {
233
+ console.log('insert between', insert.before.element.id, 'and', insert.after.element.id);
234
+ setSnapped(event, 'x', insert.before.element.x + insert.before.element.width / 2);
235
+ setSnapped(event, 'y', insert.before.y);
236
+ } else
237
+ if (insert.after) {
238
+ console.log('insert after', insert.after.element.id);
239
+ setSnapped(event, 'x', insert.after.element.x + insert.after.element.width / 2);
240
+ setSnapped(event, 'y', insert.after.y);
241
+ } else
242
+ if (insert.before) {
243
+ console.log('insert before', insert.before.element.id);
244
+ setSnapped(event, 'x', insert.before.element.x + insert.before.element.width / 2);
245
+ setSnapped(event, 'y', insert.before.y);
246
+ } else
247
+ if (insert.into) {
248
+ console.log('insert into', insert.into.element.id);
249
+ setSnapped(event, 'x', insert.into.element.x + insert.into.element.width / 2);
250
+ setSnapped(event, 'y', insert.into.y);
251
+ }
252
+ }
253
+ }
254
+
255
+ });
256
+
257
+ eventBus.on('resize.start', HIGH_PRIORITY, function(event) {
258
+ var context = event.context,
259
+ shape = context.shape;
260
+
261
+ if (is(shape, 'bpmn:SubProcess') && isExpanded(shape)) {
262
+ context.minDimensions = { width: 140, height: 120 };
263
+ }
264
+
265
+ if (is(shape, 'bpmn:Participant')) {
266
+ context.minDimensions = { width: 300, height: 150 };
267
+ }
268
+
269
+ if (is(shape, 'bpmn:Lane') || is(shape, 'bpmn:Participant')) {
270
+ context.resizeConstraints = getParticipantSizeConstraints(shape, context.direction, context.balanced);
271
+ }
272
+
273
+ if (is(shape, 'bpmn:TextAnnotation')) {
274
+ context.minDimensions = { width: 50, height: 30 };
275
+ }
276
+ });
277
+
278
+ }
279
+
280
+ inherits(BpmnSnapping, Snapping);
281
+
282
+ BpmnSnapping.$inject = [ 'eventBus', 'canvas', 'bpmnRules', 'elementRegistry' ];
283
+
284
+ module.exports = BpmnSnapping;
285
+
286
+
287
+ BpmnSnapping.prototype.initSnap = function(event) {
288
+
289
+ var context = event.context,
290
+ shape = event.shape,
291
+ shapeMid,
292
+ shapeBounds,
293
+ shapeTopLeft,
294
+ shapeBottomRight,
295
+ snapContext;
296
+
297
+
298
+ snapContext = Snapping.prototype.initSnap.call(this, event);
299
+
300
+ if (is(shape, 'bpmn:Participant')) {
301
+ // assign higher priority for outer snaps on participants
302
+ snapContext.setSnapLocations([ 'top-left', 'bottom-right', 'mid' ]);
303
+ }
304
+
305
+
306
+ if (shape) {
307
+
308
+ shapeMid = mid(shape, event);
309
+
310
+ shapeBounds = {
311
+ width: shape.width,
312
+ height: shape.height,
313
+ x: isNaN(shape.x) ? round(shapeMid.x - shape.width / 2) : shape.x,
314
+ y: isNaN(shape.y) ? round(shapeMid.y - shape.height / 2) : shape.y
315
+ };
316
+
317
+ shapeTopLeft = topLeft(shapeBounds);
318
+ shapeBottomRight = bottomRight(shapeBounds);
319
+
320
+ snapContext.setSnapOrigin('top-left', {
321
+ x: shapeTopLeft.x - event.x,
322
+ y: shapeTopLeft.y - event.y
323
+ });
324
+
325
+ snapContext.setSnapOrigin('bottom-right', {
326
+ x: shapeBottomRight.x - event.x,
327
+ y: shapeBottomRight.y - event.y
328
+ });
329
+
330
+ forEach(shape.outgoing, function(c) {
331
+ var docking = c.waypoints[0];
332
+
333
+ docking = docking.original || docking;
334
+
335
+ snapContext.setSnapOrigin(c.id + '-docking', {
336
+ x: docking.x - event.x,
337
+ y: docking.y - event.y
338
+ });
339
+ });
340
+
341
+ forEach(shape.incoming, function(c) {
342
+ var docking = c.waypoints[c.waypoints.length - 1];
343
+
344
+ docking = docking.original || docking;
345
+
346
+ snapContext.setSnapOrigin(c.id + '-docking', {
347
+ x: docking.x - event.x,
348
+ y: docking.y - event.y
349
+ });
350
+ });
351
+
352
+ }
353
+
354
+ var source = context.source;
355
+
356
+ if (source) {
357
+ snapContext.addDefaultSnap('mid', mid(source));
358
+ }
359
+ };
360
+
361
+
362
+ BpmnSnapping.prototype.addTargetSnaps = function(snapPoints, shape, target) {
363
+
364
+ // use target parent as snap target
365
+ if (is(shape, 'bpmn:BoundaryEvent') && shape.type !== 'label') {
366
+ target = target.parent;
367
+ }
368
+
369
+ // add sequence flow parents as snap targets
370
+ if (is(target, 'bpmn:SequenceFlow')) {
371
+ this.addTargetSnaps(snapPoints, shape, target.parent);
372
+ }
373
+
374
+ var siblings = this.getSiblings(shape, target) || [];
375
+
376
+ forEach(siblings, function(sibling) {
377
+
378
+ // do not snap to lanes
379
+ if (is(sibling, 'bpmn:Lane')) {
380
+ return;
381
+ }
382
+
383
+ if (sibling.waypoints) {
384
+ forEach(sibling.waypoints, function(waypoint, i) {
385
+ var nextWaypoint = sibling.waypoints[i+1];
386
+
387
+ if (!nextWaypoint) {
388
+ return;
389
+ }
390
+
391
+ if (nextWaypoint.x === waypoint.x || nextWaypoint.y === waypoint.y) {
392
+ snapPoints.add('mid', waypoint);
393
+ }
394
+ });
395
+
396
+ return;
397
+ }
398
+
399
+ snapPoints.add('mid', mid(sibling));
400
+
401
+ if (is(sibling, 'bpmn:Participant')) {
402
+ snapPoints.add('top-left', topLeft(sibling));
403
+ snapPoints.add('bottom-right', bottomRight(sibling));
404
+ }
405
+ });
406
+
407
+
408
+ forEach(shape.incoming, function(c) {
409
+
410
+ if (siblings.indexOf(c.source) === -1) {
411
+ snapPoints.add('mid', mid(c.source));
412
+ }
413
+
414
+ var docking = c.waypoints[0];
415
+ snapPoints.add(c.id + '-docking', docking.original || docking);
416
+ });
417
+
418
+
419
+ forEach(shape.outgoing, function(c) {
420
+
421
+ if (siblings.indexOf(c.target) === -1) {
422
+ snapPoints.add('mid', mid(c.target));
423
+ }
424
+
425
+ var docking = c.waypoints[c.waypoints.length - 1];
426
+ snapPoints.add(c.id + '-docking', docking.original || docking);
427
+ });
428
+ };
429
+
430
+
431
+ /////// participant snapping //////////////////
432
+
433
+ function initParticipantSnapping(context, shape, elements) {
434
+
435
+ if (!elements.length) {
436
+ return;
437
+ }
438
+
439
+ var snapBox = getBoundingBox(elements.filter(function(e) {
440
+ return !e.labelTarget && !e.waypoints;
441
+ }));
442
+
443
+ snapBox.x -= 50;
444
+ snapBox.y -= 20;
445
+ snapBox.width += 70;
446
+ snapBox.height += 40;
447
+
448
+ // adjust shape height to include bounding box
449
+ shape.width = Math.max(shape.width, snapBox.width);
450
+ shape.height = Math.max(shape.height, snapBox.height);
451
+
452
+ context.participantSnapBox = snapBox;
453
+ }
454
+
455
+ function snapParticipant(snapBox, shape, event, offset) {
456
+ offset = offset || 0;
457
+
458
+ var shapeHalfWidth = shape.width / 2 - offset,
459
+ shapeHalfHeight = shape.height / 2;
460
+
461
+ var currentTopLeft = {
462
+ x: event.x - shapeHalfWidth - offset,
463
+ y: event.y - shapeHalfHeight
464
+ };
465
+
466
+ var currentBottomRight = {
467
+ x: event.x + shapeHalfWidth + offset,
468
+ y: event.y + shapeHalfHeight
469
+ };
470
+
471
+ var snapTopLeft = snapBox,
472
+ snapBottomRight = bottomRight(snapBox);
473
+
474
+ if (currentTopLeft.x >= snapTopLeft.x) {
475
+ setSnapped(event, 'x', snapTopLeft.x + offset + shapeHalfWidth);
476
+ } else
477
+ if (currentBottomRight.x <= snapBottomRight.x) {
478
+ setSnapped(event, 'x', snapBottomRight.x - offset - shapeHalfWidth);
479
+ }
480
+
481
+ if (currentTopLeft.y >= snapTopLeft.y) {
482
+ setSnapped(event, 'y', snapTopLeft.y + shapeHalfHeight);
483
+ } else
484
+ if (currentBottomRight.y <= snapBottomRight.y) {
485
+ setSnapped(event, 'y', snapBottomRight.y - shapeHalfHeight);
486
+ }
487
+ }
488
+
489
+
490
+ /////// boundary event snapping /////////////////////////
491
+
492
+
493
+ function snapBoundaryEvent(event, shape, target) {
494
+ var targetTRBL = asTRBL(target);
495
+
496
+ var direction = getBoundaryAttachment(event, target);
497
+
498
+ if (/top/.test(direction)) {
499
+ setSnapped(event, 'y', targetTRBL.top);
500
+ } else
501
+ if (/bottom/.test(direction)) {
502
+ setSnapped(event, 'y', targetTRBL.bottom);
503
+ }
504
+
505
+ if (/left/.test(direction)) {
506
+ setSnapped(event, 'x', targetTRBL.left);
507
+ } else
508
+ if (/right/.test(direction)) {
509
+ setSnapped(event, 'x', targetTRBL.right);
510
+ }
511
+ }