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,601 +1,636 @@
1
- 'use strict';
2
-
3
- var TestHelper = require('../../../TestHelper');
4
-
5
- /* global bootstrapViewer, inject */
6
-
7
- TestHelper.insertCSS('diagram-js-label-editing.css',
8
- 'div { box-sizing: border-box; }' +
9
- 'div[contenteditable=true] { line-height: 14px; font-family: Arial; font-size: 12px }'
10
- );
11
-
12
-
13
- var labelEditingModule = require('../../../../lib/features/label-editing'),
14
- coreModule = require('../../../../lib/core'),
15
- draggingModule = require('diagram-js/lib/features/dragging'),
16
- modelingModule = require('diagram-js/lib/features/modeling');
17
-
18
- var LabelUtil = require('../../../../lib/features/label-editing/LabelUtil');
19
-
20
- function triggerKeyEvent(element, event, code) {
21
- var e = document.createEvent('Events');
22
-
23
- if (e.initEvent) {
24
- e.initEvent(event, true, true);
25
- }
26
-
27
- e.keyCode = code;
28
- e.which = code;
29
-
30
- return element.dispatchEvent(e);
31
- }
32
-
33
- describe('features - label-editing', function() {
34
-
35
- var diagramXML = require('../../../fixtures/bpmn/features/label-editing/labels.bpmn');
36
-
37
- describe('basics', function() {
38
-
39
- var testModules = [ labelEditingModule, coreModule, draggingModule, modelingModule ];
40
-
41
- beforeEach(bootstrapViewer(diagramXML, { modules: testModules }));
42
-
43
-
44
- it('should register on dblclick', inject(function(elementRegistry, directEditing, eventBus) {
45
-
46
- // given
47
- var shape = elementRegistry.get('task-nested-embedded');
48
-
49
- // when
50
- eventBus.fire('element.dblclick', { element: shape });
51
-
52
- // then
53
- expect(directEditing.isActive()).to.be.true;
54
-
55
- // clean up
56
- directEditing._textbox.destroy();
57
- }));
58
-
59
-
60
- it('should cancel on <ESC>', inject(function(elementRegistry, directEditing, eventBus) {
61
-
62
- // given
63
- var shape = elementRegistry.get('task-nested-embedded'),
64
- task = shape.businessObject;
65
-
66
- var oldName = task.name;
67
-
68
- // activate
69
- eventBus.fire('element.dblclick', { element: shape });
70
-
71
- var textbox = directEditing._textbox.content;
72
-
73
- // when
74
- // change + ESC is pressed
75
- textbox.innerText = 'new value';
76
- triggerKeyEvent(textbox, 'keydown', 27);
77
-
78
- // then
79
- expect(directEditing.isActive()).to.be.false;
80
- expect(task.name).to.equal(oldName);
81
- }));
82
-
83
-
84
- it('should complete on drag start', inject(function(elementRegistry, directEditing, dragging) {
85
-
86
- // given
87
- var shape = elementRegistry.get('task-nested-embedded'),
88
- task = shape.businessObject;
89
-
90
- directEditing.activate(shape);
91
-
92
- directEditing._textbox.content.innerText = 'FOO BAR';
93
-
94
- // when
95
- dragging.init(null, { x: 0, y: 0 }, 'foo');
96
-
97
- // then
98
- expect(task.name).to.equal('FOO BAR');
99
- }));
100
-
101
-
102
- it('should submit on root element click', inject(function(elementRegistry, directEditing, canvas, eventBus) {
103
-
104
- // given
105
- var shape = elementRegistry.get('task-nested-embedded'),
106
- task = shape.businessObject;
107
-
108
- // activate
109
- eventBus.fire('element.dblclick', { element: shape });
110
-
111
- var newName = 'new value';
112
-
113
- // a <textarea /> element
114
- var content = directEditing._textbox.content;
115
-
116
- content.innerText = newName;
117
-
118
- // when
119
- // change + <element.mousedown>
120
-
121
- eventBus.fire('element.mousedown', { element: canvas.getRootElement() });
122
-
123
- // then
124
- expect(directEditing.isActive()).to.be.false;
125
- expect(task.name).to.equal(newName);
126
- }));
127
-
128
- });
129
-
130
-
131
- describe('details', function() {
132
-
133
- var testModules = [ labelEditingModule, coreModule, modelingModule ];
134
-
135
- beforeEach(bootstrapViewer(diagramXML, { modules: testModules }));
136
-
137
- var elementRegistry,
138
- eventBus,
139
- directEditing;
140
-
141
-
142
- beforeEach(inject([ 'elementRegistry', 'eventBus', 'directEditing', function(_elementRegistry, _eventBus, _directEditing) {
143
- elementRegistry = _elementRegistry;
144
- eventBus = _eventBus;
145
- directEditing = _directEditing;
146
- }]));
147
-
148
-
149
- function directEditActivate(element) {
150
- if (element.waypoints) {
151
- eventBus.fire('element.dblclick', { element: element });
152
- } else {
153
- eventBus.fire('element.dblclick', { element: element });
154
- }
155
- }
156
-
157
- function directEditUpdate(value) {
158
- directEditing._textbox.content.innerText = value;
159
- }
160
-
161
- function directEditComplete(value) {
162
- directEditUpdate(value);
163
- directEditing.complete();
164
- }
165
-
166
- function directEditCancel(value) {
167
- directEditUpdate(value);
168
- directEditing.cancel();
169
- }
170
-
171
-
172
- describe('command support', function() {
173
-
174
- it('should update via command stack', function() {
175
-
176
- // given
177
- var diagramElement = elementRegistry.get('user-task');
178
-
179
- var listenerCalled;
180
-
181
- eventBus.on('commandStack.changed', function(e) {
182
- listenerCalled = true;
183
- });
184
-
185
- // when
186
- directEditActivate(diagramElement);
187
- directEditComplete('BAR');
188
-
189
- // then
190
- expect(listenerCalled).to.be.true;
191
- });
192
-
193
-
194
- it('should undo via command stack', inject(function(commandStack) {
195
-
196
- // given
197
- var diagramElement = elementRegistry.get('user-task');
198
-
199
- var oldLabel = LabelUtil.getLabel(diagramElement);
200
-
201
- // when
202
- directEditActivate(diagramElement);
203
- directEditComplete('BAR');
204
-
205
- commandStack.undo();
206
-
207
- // then
208
- var label = LabelUtil.getLabel(diagramElement);
209
- expect(label).to.eql(oldLabel);
210
- }));
211
-
212
- });
213
-
214
-
215
- describe('should trigger redraw', function() {
216
-
217
- it('on shape change', function() {
218
-
219
- // given
220
- var diagramElement = elementRegistry.get('user-task');
221
-
222
- var listenerCalled;
223
-
224
- eventBus.on('element.changed', function(e) {
225
- if (e.element === diagramElement) {
226
- listenerCalled = true;
227
- }
228
- });
229
-
230
- // when
231
- directEditActivate(diagramElement);
232
- directEditComplete('BAR');
233
-
234
- // then
235
- expect(listenerCalled).to.be.true;
236
- });
237
-
238
-
239
- it('on connection on change', function() {
240
-
241
- // given
242
- var diagramElement = elementRegistry.get('sequence-flow-no');
243
-
244
- var listenerCalled;
245
-
246
- eventBus.on('element.changed', function(e) {
247
- if (e.element === diagramElement.label) {
248
- listenerCalled = true;
249
- }
250
- });
251
-
252
- // when
253
- directEditActivate(diagramElement);
254
- directEditComplete('BAR');
255
-
256
- // then
257
- expect(listenerCalled).to.be.true;
258
- });
259
-
260
- });
261
-
262
-
263
- describe('element support, should edit', function() {
264
-
265
- function directEdit(elementId) {
266
-
267
- return inject(function(elementRegistry, eventBus, directEditing) {
268
-
269
- var diagramElement = elementRegistry.get(elementId);
270
-
271
- var label = LabelUtil.getLabel(diagramElement);
272
-
273
-
274
- // when
275
- directEditActivate(diagramElement);
276
-
277
- // then
278
- // expect editing to be active
279
- expect(directEditing.getValue()).to.eql(label);
280
- expect(directEditing.isActive()).to.be.true;
281
-
282
-
283
- // when
284
- directEditComplete('B');
285
-
286
- // then
287
- // expect update to have happened
288
- label = LabelUtil.getLabel(diagramElement);
289
- expect(label).to.equal('B');
290
-
291
-
292
- // when
293
- directEditActivate(diagramElement);
294
- directEditCancel('C');
295
-
296
- // expect no label update to have happened
297
- label = LabelUtil.getLabel(diagramElement);
298
- expect(label).to.equal('B');
299
- });
300
- }
301
-
302
-
303
- it('task', directEdit('user-task'));
304
-
305
-
306
- it('gateway', directEdit('exclusive-gateway'));
307
-
308
- it('gateway via label', directEdit('exclusive-gateway_label'));
309
-
310
-
311
- it('event', directEdit('intermediate-throw-event'));
312
-
313
- it('event via label', directEdit('intermediate-throw-event_label'));
314
-
315
- it('event without label', directEdit('start-event'));
316
-
317
-
318
- it('data store reference', directEdit('data-store-reference'));
319
-
320
- it('data object reference', directEdit('data-object-reference'));
321
-
322
-
323
- it('sequenceflow', directEdit('sequence-flow-yes'));
324
-
325
- it('sequenceflow without label', directEdit('sequenceflow-unlabeled'));
326
-
327
- it('sequenceflow via label', directEdit('sequence-flow-yes_label'));
328
-
329
-
330
- it('message flow', directEdit('message-flow'));
331
-
332
- it('message flow via label', directEdit('message-flow_label'));
333
-
334
-
335
- it('pool', directEdit('expanded-pool'));
336
-
337
- it('pool, collapsed', directEdit('collapsed-pool'));
338
-
339
-
340
- it('lane with label', directEdit('nested-lane-1-2'));
341
-
342
- it('lane without label', directEdit('nested-lane-no-label'));
343
-
344
- });
345
- });
346
-
347
-
348
- describe('sizing', function() {
349
-
350
- var testModules = [ labelEditingModule, coreModule, modelingModule ];
351
-
352
-
353
-
354
- function testTextboxSizing(elementId, zoom, width, height, content) {
355
- return inject(function(canvas, elementRegistry, directEditing) {
356
- // zoom in
357
- canvas.zoom(zoom);
358
- // grab one element
359
- var shape = elementRegistry.get(elementId);
360
- // activate label editing
361
- directEditing.activate(shape);
362
- // grab the textarea
363
- var textbox = directEditing._textbox;
364
- // optionally set content text
365
- if (content) {
366
- textbox.content.innerText = content;
367
- }
368
-
369
- if (width === 'auto') {
370
- width = shape.width;
371
- }
372
-
373
- if (height === 'auto') {
374
- height = shape.height;
375
- }
376
-
377
- // then
378
- if (typeof width === 'object' && width.min) {
379
- expect(textbox.content.offsetWidth).to.be.at.least(width.min);
380
- } else {
381
- expect(textbox.content.offsetWidth).to.be.equal(width);
382
- }
383
-
384
- if (typeof height === 'object' && height.min) {
385
- expect(textbox.content.offsetHeight).to.be.at.least(height.min);
386
- } else {
387
- expect(textbox.content.offsetHeight).to.be.equal(height);
388
- }
389
- });
390
- }
391
-
392
- beforeEach(bootstrapViewer(diagramXML, {
393
- modules: testModules,
394
- canvas: { deferUpdate: false }
395
- }));
396
-
397
-
398
- describe('height', function() {
399
-
400
- var oneLineText = 'One line',
401
- twoLineText = 'Two\nlines',
402
- tenLineText = '1\n2\n3\n4\n5\n6\n7\n8\n9\n0';
403
-
404
- describe('external labels', function() {
405
-
406
- it('[no text] should have min height', testTextboxSizing('start-event', 1, 150, 20));
407
-
408
- it('[1 line text] should be 1 line high', testTextboxSizing('start-event', 1, 150, 20, oneLineText));
409
-
410
- it('[2 line text] should be 2 line high', testTextboxSizing('start-event', 1, 150, 34, twoLineText));
411
-
412
- it('[10 line text] should be 10 line high', testTextboxSizing('start-event', 1, 150, 146, tenLineText));
413
-
414
- });
415
-
416
-
417
- describe('internal labels', function() {
418
-
419
- it('[no text] should have fixed dimensions', testTextboxSizing('empty-task', 1, 'auto', 'auto'));
420
-
421
- it('[1 line text] should have fixed dimensions', testTextboxSizing('empty-task', 1, 'auto', 'auto', oneLineText));
422
-
423
- it('[2 line text] should have fixed dimensions', testTextboxSizing('empty-task', 1, 'auto', 'auto', twoLineText));
424
-
425
- it('[10 line text] should have fixed dimensions', testTextboxSizing('empty-task', 1, 'auto', 'auto', tenLineText));
426
-
427
- });
428
-
429
-
430
- describe('sequence flows', function() {
431
-
432
- it('[no text] should have min height', testTextboxSizing('sequenceflow-unlabeled', 1, 150, 20));
433
-
434
- it('[1 line text] should be 1 line high', testTextboxSizing('sequenceflow-unlabeled', 1, 150, 20, oneLineText));
435
-
436
- it('[2 line text] should be 2 line high', testTextboxSizing('sequenceflow-unlabeled', 1, 150, 34, twoLineText));
437
-
438
- it('[10 line text] should be 10 line high', testTextboxSizing('sequenceflow-unlabeled', 1, 150, 146, tenLineText));
439
-
440
- });
441
-
442
-
443
- describe('text annotation', function() {
444
-
445
- it('[no text] should have element height', testTextboxSizing('text-annotation', 1, 100, 98));
446
-
447
- it('[1 line text] should have element height', testTextboxSizing('text-annotation', 1, 100, 98, oneLineText));
448
-
449
- it('[2 line text] should have element height', testTextboxSizing('text-annotation', 1, 100, 98, twoLineText));
450
-
451
- it('[10 line text] should have element height', testTextboxSizing('text-annotation', 1, { min: 100 }, 98, tenLineText));
452
-
453
- });
454
-
455
-
456
- describe('expanded sub process', function() {
457
-
458
- it('[no text] should have min height', testTextboxSizing('subprocess-expanded', 1, 200, 20));
459
-
460
- it('[1 line text] should be 1 line high', testTextboxSizing('subprocess-expanded', 1, 200, 20, oneLineText));
461
-
462
- it('[2 line text] should be 2 line high', testTextboxSizing('subprocess-expanded', 1, 200, 34, twoLineText));
463
-
464
- it('[10 line text] should be max 3 line high', testTextboxSizing('subprocess-expanded', 1, 200, 48, tenLineText));
465
-
466
- });
467
-
468
-
469
- describe('pools/lanes', function() {
470
-
471
- it('[no text] should have min height', testTextboxSizing('expanded-pool', 1, 150, 20));
472
-
473
- it('[1 line text] should be 1 line high', testTextboxSizing('expanded-pool', 1, 150, 20, oneLineText));
474
-
475
- it('[2 line text] should be 2 line high', testTextboxSizing('expanded-pool', 1, 150, 34, twoLineText));
476
-
477
- it('[10 line text] should be max 2 line high', testTextboxSizing('expanded-pool', 1, 150, 34, tenLineText));
478
-
479
- });
480
-
481
- });
482
-
483
- describe('width', function() {
484
-
485
- var oneWord = 'foobar',
486
- fiveWords = 'lorem ipsum dolor foobar foobar',
487
- longWord = 'loremipsumdolorfoobar';
488
-
489
- describe('external labels', function() {
490
-
491
- it('[no text] should have fixed width', testTextboxSizing('start-event', 1, 150, 20));
492
-
493
- it('[one word] should have fixed width', testTextboxSizing('start-event', 1, 150, 20, oneWord));
494
-
495
- it('[five words] should have fixed width, line break', testTextboxSizing('start-event', 1, 150, { min: 34 }, fiveWords));
496
-
497
- it('[long word] should have fixed width', testTextboxSizing('start-event', 1, 150, { min: 20 }, longWord));
498
-
499
- });
500
-
501
-
502
- describe('internal labels', function() {
503
-
504
- it('[no text] should have fixed dimensions (task)', testTextboxSizing('empty-task', 1, 100, 80));
505
-
506
- it('[no text] should have fixed dimensions (call activity)', testTextboxSizing('call-activity', 1, 100, 80));
507
-
508
- it('[no text] should have fixed dimensions (collapsed sub process)', testTextboxSizing('subprocess-collapsed', 1, 100, 80));
509
-
510
- it('[one word] should have fixed dimensions', testTextboxSizing('empty-task', 1, 100, 80, oneWord));
511
-
512
- it('[five words] should have fixed dimensions', testTextboxSizing('empty-task', 1, 100, 80, fiveWords));
513
-
514
- it('[long word] should have fixed dimensions', testTextboxSizing('empty-task', 1, 100, 80, longWord));
515
-
516
- describe('zoom', function() {
517
-
518
- it('should have fixed dimensions (low zoom)', testTextboxSizing('empty-task', 0.5, 100, 80, oneWord));
519
-
520
- it('should have fixed dimensions (high zoom)', testTextboxSizing('empty-task', 1.5, 150, 120, oneWord));
521
-
522
- it('should center text box position (low zoom)', inject(function(canvas, elementRegistry, directEditing) {
523
-
524
- // given
525
- canvas.zoom(0.5, { x: 0, y: 0 });
526
-
527
- var shape = elementRegistry.get('empty-task');
528
-
529
- // when
530
- directEditing.activate(shape);
531
-
532
- // then
533
- var textbox = directEditing._textbox;
534
-
535
- expect(textbox.content.offsetLeft).to.equal(211);
536
- expect(textbox.content.offsetTop).to.equal(17);
537
-
538
- }));
539
-
540
- });
541
-
542
- });
543
-
544
-
545
- describe('sequence flows', function() {
546
-
547
- it('[no text] should have fixed width', testTextboxSizing('sequenceflow-unlabeled', 1, 150, 20));
548
-
549
- it('[one word] should have fixed width', testTextboxSizing('sequenceflow-unlabeled', 1, 150, 20, oneWord));
550
-
551
- it('[five words] should have fixed width, line break', testTextboxSizing('sequenceflow-unlabeled', 1, 150, { min: 34 }, fiveWords));
552
-
553
- it('[long word] should have fixed width', testTextboxSizing('sequenceflow-unlabeled', 1, 150, { min: 20 }, longWord));
554
-
555
- });
556
-
557
-
558
- describe('text annotation', function() {
559
-
560
- it('[no text] should have min width', testTextboxSizing('text-annotation', 1, 100, 98));
561
-
562
- it('[one word] should have min width', testTextboxSizing('text-annotation', 1, 100, 98, oneWord));
563
-
564
- it('[five words] should expand width', testTextboxSizing('text-annotation', 1, { min: 176 }, 98, fiveWords));
565
-
566
- it('[long word] should expand width', testTextboxSizing('text-annotation', 1, { min: 129 }, 98, longWord));
567
-
568
- });
569
-
570
-
571
- describe('expanded sub process', function() {
572
-
573
- it('[no text] should have fixed width', testTextboxSizing('subprocess-expanded', 1, 200, 20));
574
-
575
- it('[one word] should have fixed width', testTextboxSizing('subprocess-expanded', 1, 200, 20, oneWord));
576
-
577
- it('[five words] should have fixed width, line break',
578
- testTextboxSizing('subprocess-expanded', 1, 200, 34, 'five yreallyreallyreally loooooong woooords'));
579
-
580
- it('[long word] should have fixed width', testTextboxSizing('subprocess-expanded', 1, 200, 20, longWord));
581
-
582
- });
583
-
584
-
585
- describe('pools/lanes', function() {
586
-
587
- it('[no text] should have fixed width', testTextboxSizing('expanded-pool', 1, 150, 20));
588
-
589
- it('[one word] should have fixed width', testTextboxSizing('expanded-pool', 1, 150, 20, oneWord));
590
-
591
- it('[five words] should have fixed width, line break', testTextboxSizing('expanded-pool', 1, 150, 34, fiveWords));
592
-
593
- it('[long word] should have fixed width', testTextboxSizing('expanded-pool', 1, 150, { min: 20 }, longWord));
594
-
595
- });
596
-
597
- });
598
-
599
- });
600
-
601
- });
1
+ 'use strict';
2
+
3
+ /* global bootstrapViewer, inject */
4
+
5
+
6
+ var labelEditingModule = require('../../../../lib/features/label-editing'),
7
+ coreModule = require('../../../../lib/core'),
8
+ draggingModule = require('diagram-js/lib/features/dragging'),
9
+ modelingModule = require('diagram-js/lib/features/modeling');
10
+
11
+ var LabelUtil = require('../../../../lib/features/label-editing/LabelUtil');
12
+
13
+ var MEDIUM_LINE_HEIGHT = 14;
14
+
15
+ var DELTA = 3;
16
+
17
+ function triggerKeyEvent(element, event, code) {
18
+ var e = document.createEvent('Events');
19
+
20
+ if (e.initEvent) {
21
+ e.initEvent(event, true, true);
22
+ }
23
+
24
+ e.keyCode = code;
25
+ e.which = code;
26
+
27
+ return element.dispatchEvent(e);
28
+ }
29
+
30
+ function expectBounds(parent, bounds) {
31
+ expect(parent.offsetLeft).to.be.closeTo(bounds.x, DELTA);
32
+ expect(parent.offsetTop).to.be.closeTo(bounds.y, DELTA);
33
+ expect(parent.offsetWidth).to.be.closeTo(bounds.width, DELTA);
34
+ expect(parent.offsetHeight).to.be.closeTo(bounds.height, DELTA);
35
+ }
36
+
37
+ describe('features - label-editing', function() {
38
+
39
+ var diagramXML = require('../../../fixtures/bpmn/features/label-editing/labels.bpmn');
40
+
41
+ describe('basics', function() {
42
+
43
+ var testModules = [ labelEditingModule, coreModule, draggingModule, modelingModule ];
44
+
45
+ beforeEach(bootstrapViewer(diagramXML, { modules: testModules }));
46
+
47
+
48
+ it('should register on dblclick', inject(function(elementRegistry, directEditing, eventBus) {
49
+
50
+ // given
51
+ var shape = elementRegistry.get('Task_1');
52
+
53
+ // when
54
+ eventBus.fire('element.dblclick', { element: shape });
55
+
56
+ // then
57
+ expect(directEditing.isActive()).to.be.true;
58
+
59
+ // clean up
60
+ directEditing._textbox.destroy();
61
+ }));
62
+
63
+
64
+ it('should cancel on <ESC>', inject(function(elementRegistry, directEditing, eventBus) {
65
+
66
+ // given
67
+ var shape = elementRegistry.get('Task_1'),
68
+ task = shape.businessObject;
69
+
70
+ var oldName = task.name;
71
+
72
+ // activate
73
+ eventBus.fire('element.dblclick', { element: shape });
74
+
75
+ var textbox = directEditing._textbox.content;
76
+
77
+ // when
78
+ // change + ESC is pressed
79
+ textbox.innerText = 'new value';
80
+ triggerKeyEvent(textbox, 'keydown', 27);
81
+
82
+ // then
83
+ expect(directEditing.isActive()).to.be.false;
84
+ expect(task.name).to.equal(oldName);
85
+ }));
86
+
87
+
88
+ it('should complete on drag start', inject(function(elementRegistry, directEditing, dragging) {
89
+
90
+ // given
91
+ var shape = elementRegistry.get('Task_1'),
92
+ task = shape.businessObject;
93
+
94
+ directEditing.activate(shape);
95
+
96
+ directEditing._textbox.content.textContent = 'FOO BAR';
97
+
98
+ // when
99
+ dragging.init(null, { x: 0, y: 0 }, 'foo');
100
+
101
+ // then
102
+ expect(task.name).to.equal('FOO BAR');
103
+ }));
104
+
105
+
106
+ it('should submit on root element click', inject(function(elementRegistry, directEditing, canvas, eventBus) {
107
+
108
+ // given
109
+ var shape = elementRegistry.get('Task_1'),
110
+ task = shape.businessObject;
111
+
112
+ // activate
113
+ eventBus.fire('element.dblclick', { element: shape });
114
+
115
+ var newName = 'new value';
116
+
117
+ // a <textarea /> element
118
+ var content = directEditing._textbox.content;
119
+
120
+ content.innerText = newName;
121
+
122
+ // when
123
+ // change + <element.mousedown>
124
+
125
+ eventBus.fire('element.mousedown', { element: canvas.getRootElement() });
126
+
127
+ // then
128
+ expect(directEditing.isActive()).to.be.false;
129
+ expect(task.name).to.equal(newName);
130
+ }));
131
+
132
+ });
133
+
134
+
135
+ describe('details', function() {
136
+
137
+ var testModules = [ labelEditingModule, coreModule, modelingModule ];
138
+
139
+ beforeEach(bootstrapViewer(diagramXML, { modules: testModules }));
140
+
141
+ var elementRegistry,
142
+ eventBus,
143
+ directEditing;
144
+
145
+
146
+ beforeEach(inject([ 'elementRegistry', 'eventBus', 'directEditing', function(_elementRegistry, _eventBus, _directEditing) {
147
+ elementRegistry = _elementRegistry;
148
+ eventBus = _eventBus;
149
+ directEditing = _directEditing;
150
+ }]));
151
+
152
+
153
+ function directEditActivate(element) {
154
+ if (element.waypoints) {
155
+ eventBus.fire('element.dblclick', { element: element });
156
+ } else {
157
+ eventBus.fire('element.dblclick', { element: element });
158
+ }
159
+ }
160
+
161
+ function directEditUpdate(value) {
162
+ directEditing._textbox.content.innerText = value;
163
+ }
164
+
165
+ function directEditComplete(value) {
166
+ directEditUpdate(value);
167
+ directEditing.complete();
168
+ }
169
+
170
+ function directEditCancel(value) {
171
+ directEditUpdate(value);
172
+ directEditing.cancel();
173
+ }
174
+
175
+
176
+ describe('command support', function() {
177
+
178
+ it('should update via command stack', function() {
179
+
180
+ // given
181
+ var diagramElement = elementRegistry.get('Task_1');
182
+
183
+ var listenerCalled;
184
+
185
+ eventBus.on('commandStack.changed', function(e) {
186
+ listenerCalled = true;
187
+ });
188
+
189
+ // when
190
+ directEditActivate(diagramElement);
191
+ directEditComplete('BAR');
192
+
193
+ // then
194
+ expect(listenerCalled).to.be.true;
195
+ });
196
+
197
+
198
+ it('should undo via command stack', inject(function(commandStack) {
199
+
200
+ // given
201
+ var diagramElement = elementRegistry.get('Task_1');
202
+
203
+ var oldLabel = LabelUtil.getLabel(diagramElement);
204
+
205
+ // when
206
+ directEditActivate(diagramElement);
207
+ directEditComplete('BAR');
208
+
209
+ commandStack.undo();
210
+
211
+ // then
212
+ var label = LabelUtil.getLabel(diagramElement);
213
+ expect(label).to.eql(oldLabel);
214
+ }));
215
+
216
+ });
217
+
218
+
219
+ describe('should trigger redraw', function() {
220
+
221
+ it('on shape change', function() {
222
+
223
+ // given
224
+ var diagramElement = elementRegistry.get('Task_1');
225
+
226
+ var listenerCalled;
227
+
228
+ eventBus.on('element.changed', function(e) {
229
+ if (e.element === diagramElement) {
230
+ listenerCalled = true;
231
+ }
232
+ });
233
+
234
+ // when
235
+ directEditActivate(diagramElement);
236
+ directEditComplete('BAR');
237
+
238
+ // then
239
+ expect(listenerCalled).to.be.true;
240
+ });
241
+
242
+
243
+ it('on connection on change', function() {
244
+
245
+ // given
246
+ var diagramElement = elementRegistry.get('SequenceFlow_1');
247
+
248
+ var listenerCalled;
249
+
250
+ eventBus.on('element.changed', function(e) {
251
+ if (e.element === diagramElement.label) {
252
+ listenerCalled = true;
253
+ }
254
+ });
255
+
256
+ // when
257
+ directEditActivate(diagramElement);
258
+ directEditComplete('BAR');
259
+
260
+ // then
261
+ expect(listenerCalled).to.be.true;
262
+ });
263
+
264
+ });
265
+
266
+
267
+ describe('element support, should edit', function() {
268
+
269
+ function directEdit(elementId) {
270
+
271
+ return inject(function(elementRegistry, eventBus, directEditing) {
272
+
273
+ var diagramElement = elementRegistry.get(elementId);
274
+
275
+ var label = LabelUtil.getLabel(diagramElement);
276
+
277
+
278
+ // when
279
+ directEditActivate(diagramElement);
280
+
281
+ // then
282
+ // expect editing to be active
283
+ expect(directEditing.getValue()).to.eql(label);
284
+ expect(directEditing.isActive()).to.be.true;
285
+
286
+
287
+ // when
288
+ directEditComplete('B');
289
+
290
+ // then
291
+ // expect update to have happened
292
+ label = LabelUtil.getLabel(diagramElement);
293
+ expect(label).to.equal('B');
294
+
295
+
296
+ // when
297
+ directEditActivate(diagramElement);
298
+ directEditCancel('C');
299
+
300
+ // expect no label update to have happened
301
+ label = LabelUtil.getLabel(diagramElement);
302
+ expect(label).to.equal('B');
303
+ });
304
+ }
305
+
306
+
307
+ it('task', directEdit('Task_1'));
308
+
309
+
310
+ it('gateway', directEdit('ExclusiveGateway_1'));
311
+
312
+ it('gateway via label', directEdit('ExclusiveGateway_1_label'));
313
+
314
+
315
+ it('event', directEdit('StartEvent_1'));
316
+
317
+ it('event via label', directEdit('StartEvent_1_label'));
318
+
319
+ it('event without label', directEdit('EndEvent_1'));
320
+
321
+
322
+ it('data store reference', directEdit('DataStoreReference_1'));
323
+
324
+ it('data object reference', directEdit('DataObjectReference_1'));
325
+
326
+
327
+ it('sequenceflow', directEdit('SequenceFlow_1'));
328
+
329
+ it('sequenceflow via label', directEdit('SequenceFlow_1_label'));
330
+
331
+ it('sequenceflow without label', directEdit('SequenceFlow_2'));
332
+
333
+
334
+ it('message flow', directEdit('MessageFlow_1'));
335
+
336
+ it('message flow via label', directEdit('MessageFlow_1_label'));
337
+
338
+
339
+ it('pool', directEdit('Participant_1'));
340
+
341
+ it('pool, collapsed', directEdit('Participant_2'));
342
+
343
+
344
+ it('lane with label', directEdit('Lane_1'));
345
+
346
+ it('lane without label', directEdit('Lane_2'));
347
+
348
+ });
349
+ });
350
+
351
+
352
+ describe('sizes', function() {
353
+
354
+ var testModules = [ labelEditingModule, coreModule, modelingModule ];
355
+
356
+
357
+ beforeEach(bootstrapViewer(diagramXML, {
358
+ modules: testModules,
359
+ canvas: { deferUpdate: false }
360
+ }));
361
+
362
+
363
+ describe('bounds', function() {
364
+
365
+ describe('external labels', function() {
366
+
367
+ it('[zoom 1] should have fixed width and element height', inject(function(canvas, directEditing, elementRegistry) {
368
+ var zoom = 1;
369
+
370
+ canvas.zoom(zoom);
371
+
372
+ var startEvent = elementRegistry.get('StartEvent_1');
373
+
374
+ var bounds = canvas.getAbsoluteBBox(startEvent.label);
375
+ var mid = {
376
+ x: bounds.x + bounds.width / 2,
377
+ y: bounds.y + bounds.height / 2
378
+ };
379
+
380
+ directEditing.activate(startEvent);
381
+
382
+ expectBounds(directEditing._textbox.parent, {
383
+ x: mid.x - (45 * zoom),
384
+ y: bounds.y - (7 * zoom),
385
+ width: (90 * zoom),
386
+ height: bounds.height + (5 * zoom) + 7
387
+ });
388
+ }));
389
+
390
+
391
+ it('[zoom 1.5] should have fixed width and element height', inject(function(canvas, directEditing, elementRegistry) {
392
+ var zoom = 1.5;
393
+
394
+ canvas.zoom(zoom);
395
+
396
+ var startEvent = elementRegistry.get('StartEvent_1');
397
+
398
+ var bounds = canvas.getAbsoluteBBox(startEvent.label);
399
+ var mid = {
400
+ x: bounds.x + bounds.width / 2,
401
+ y: bounds.y + bounds.height / 2
402
+ };
403
+
404
+ directEditing.activate(startEvent);
405
+
406
+ expectBounds(directEditing._textbox.parent, {
407
+ x: mid.x - (45 * zoom),
408
+ y: bounds.y - (7 * zoom),
409
+ width: (90 * zoom),
410
+ height: bounds.height + (5 * zoom) + (7 * zoom)
411
+ });
412
+ }));
413
+
414
+ });
415
+
416
+
417
+ describe('internal labels', function() {
418
+
419
+ it('[zoom 1] should have element size', inject(function(canvas, directEditing, elementRegistry) {
420
+ var zoom = 1;
421
+
422
+ canvas.zoom(zoom);
423
+
424
+ var task = elementRegistry.get('Task_1');
425
+
426
+ var bounds = canvas.getAbsoluteBBox(task);
427
+
428
+ directEditing.activate(task);
429
+
430
+ expectBounds(directEditing._textbox.parent, bounds);
431
+ }));
432
+
433
+
434
+ it('[zoom 1.5] should have element size', inject(function(canvas, directEditing, elementRegistry) {
435
+ var zoom = 1.5;
436
+
437
+ canvas.zoom(zoom);
438
+
439
+ var task = elementRegistry.get('Task_1');
440
+
441
+ var bounds = canvas.getAbsoluteBBox(task);
442
+
443
+ directEditing.activate(task);
444
+
445
+ expectBounds(directEditing._textbox.parent, bounds);
446
+ }));
447
+
448
+ });
449
+
450
+
451
+ describe('sequence flows', function() {
452
+
453
+ it('[zoom 1] should have fixed width and element height', inject(function(canvas, directEditing, elementRegistry) {
454
+ var zoom = 1;
455
+
456
+ canvas.zoom(zoom);
457
+
458
+ var sequenceFlow = elementRegistry.get('SequenceFlow_1');
459
+
460
+ var bounds = canvas.getAbsoluteBBox(sequenceFlow.label);
461
+ var mid = {
462
+ x: bounds.x + bounds.width / 2,
463
+ y: bounds.y + bounds.height / 2
464
+ };
465
+
466
+ directEditing.activate(sequenceFlow);
467
+
468
+ expectBounds(directEditing._textbox.parent, {
469
+ x: mid.x - (45 * zoom),
470
+ y: bounds.y - (7 * zoom),
471
+ width: (90 * zoom),
472
+ height: bounds.height + (5 * zoom) + 7
473
+ });
474
+ }));
475
+
476
+
477
+ it('[zoom 1.5] should have fixed width and element height', inject(function(canvas, directEditing, elementRegistry) {
478
+ var zoom = 1.5;
479
+
480
+ canvas.zoom(zoom);
481
+
482
+ var sequenceflow = elementRegistry.get('SequenceFlow_1');
483
+
484
+ var bounds = canvas.getAbsoluteBBox(sequenceflow.label);
485
+ var mid = {
486
+ x: bounds.x + bounds.width / 2,
487
+ y: bounds.y + bounds.height / 2
488
+ };
489
+
490
+ directEditing.activate(sequenceflow);
491
+
492
+ expectBounds(directEditing._textbox.parent, {
493
+ x: mid.x - (45 * zoom),
494
+ y: bounds.y - (7 * zoom),
495
+ width: (90 * zoom),
496
+ height: bounds.height + (5 * zoom) + (7 * zoom)
497
+ });
498
+ }));
499
+
500
+ });
501
+
502
+
503
+ describe('text annotations', function() {
504
+
505
+ it('[zoom 1] should have element size', inject(function(canvas, directEditing, elementRegistry) {
506
+ var zoom = 1;
507
+
508
+ canvas.zoom(zoom);
509
+
510
+ var textAnnotation = elementRegistry.get('TextAnnotation_1');
511
+
512
+ var bounds = canvas.getAbsoluteBBox(textAnnotation);
513
+
514
+ directEditing.activate(textAnnotation);
515
+
516
+ expectBounds(directEditing._textbox.parent, bounds);
517
+ }));
518
+
519
+
520
+ it('[zoom 1.5] should have element size', inject(function(canvas, directEditing, elementRegistry) {
521
+ var zoom = 1.5;
522
+
523
+ canvas.zoom(zoom);
524
+
525
+ var textAnnotation = elementRegistry.get('TextAnnotation_1');
526
+
527
+ var bounds = canvas.getAbsoluteBBox(textAnnotation);
528
+
529
+ directEditing.activate(textAnnotation);
530
+
531
+ expectBounds(directEditing._textbox.parent, bounds);
532
+ }));
533
+
534
+ });
535
+
536
+
537
+ describe('expanded sub processes', function() {
538
+
539
+ it('[zoom 1] should have element width and height to fit text', inject(function(canvas, directEditing, elementRegistry) {
540
+ var zoom = 1;
541
+
542
+ canvas.zoom(zoom);
543
+
544
+ var subProcess = elementRegistry.get('SubProcess_1');
545
+
546
+ var bounds = canvas.getAbsoluteBBox(subProcess);
547
+
548
+ directEditing.activate(subProcess);
549
+
550
+ expectBounds(directEditing._textbox.parent, {
551
+ x: bounds.x,
552
+ y: bounds.y,
553
+ width: bounds.width,
554
+ height: (MEDIUM_LINE_HEIGHT * zoom) + (7 * 2 * zoom)
555
+ });
556
+ }));
557
+
558
+
559
+ it('[zoom 1.5] should have element width and height to fit text', inject(function(canvas, directEditing, elementRegistry) {
560
+ var zoom = 1.5;
561
+
562
+ canvas.zoom(zoom);
563
+
564
+ var subProcess = elementRegistry.get('SubProcess_1');
565
+
566
+ var bounds = canvas.getAbsoluteBBox(subProcess);
567
+
568
+ directEditing.activate(subProcess);
569
+
570
+ expectBounds(directEditing._textbox.parent, {
571
+ x: bounds.x,
572
+ y: bounds.y,
573
+ width: bounds.width,
574
+ height: (MEDIUM_LINE_HEIGHT * zoom) + (7 * 2 * zoom)
575
+ });
576
+ }));
577
+
578
+ });
579
+
580
+
581
+ describe('pools/lanes', function() {
582
+
583
+ it('[zoom 1] should have width of element height, height of 30', inject(function(canvas, directEditing, elementRegistry) {
584
+ var zoom = 1;
585
+
586
+ canvas.zoom(zoom);
587
+
588
+ var pool = elementRegistry.get('Participant_1');
589
+
590
+ var bounds = canvas.getAbsoluteBBox(pool);
591
+ var mid = {
592
+ x: bounds.x + bounds.width / 2,
593
+ y: bounds.y + bounds.height / 2
594
+ };
595
+
596
+ directEditing.activate(pool);
597
+
598
+ expectBounds(directEditing._textbox.parent, {
599
+ x: bounds.x - (bounds.height / 2) + (15 * zoom),
600
+ y: mid.y - (30 * zoom) / 2,
601
+ width: bounds.height * zoom,
602
+ height: 30 * zoom
603
+ });
604
+ }));
605
+
606
+
607
+ it('[zoom 1.5] should have width of element height, height of 30', inject(function(canvas, directEditing, elementRegistry) {
608
+ var zoom = 1.5;
609
+
610
+ canvas.zoom(zoom);
611
+
612
+ var pool = elementRegistry.get('Participant_1');
613
+
614
+ var bounds = canvas.getAbsoluteBBox(pool);
615
+ var mid = {
616
+ x: bounds.x + bounds.width / 2,
617
+ y: bounds.y + bounds.height / 2
618
+ };
619
+
620
+ directEditing.activate(pool);
621
+
622
+ expectBounds(directEditing._textbox.parent, {
623
+ x: bounds.x - (bounds.height / 2) + (15 * zoom),
624
+ y: mid.y - (30 * zoom) / 2,
625
+ width: bounds.height,
626
+ height: 30 * zoom
627
+ });
628
+ }));
629
+
630
+ });
631
+
632
+ });
633
+
634
+ });
635
+
636
+ });