bpmn-js 17.7.0 → 17.7.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 (337) hide show
  1. package/LICENSE +23 -23
  2. package/README.md +93 -93
  3. package/dist/assets/bpmn-js.css +145 -145
  4. package/dist/bpmn-modeler.development.js +36730 -36727
  5. package/dist/bpmn-modeler.production.min.js +4 -4
  6. package/dist/bpmn-navigated-viewer.development.js +21139 -21136
  7. package/dist/bpmn-navigated-viewer.production.min.js +3 -3
  8. package/dist/bpmn-viewer.development.js +21054 -21051
  9. package/dist/bpmn-viewer.production.min.js +3 -3
  10. package/index.js +2 -2
  11. package/lib/BaseModeler.d.ts +15 -15
  12. package/lib/BaseModeler.js +79 -79
  13. package/lib/BaseViewer.d.ts +352 -352
  14. package/lib/BaseViewer.js +858 -858
  15. package/lib/Modeler.d.ts +86 -86
  16. package/lib/Modeler.js +204 -204
  17. package/lib/NavigatedViewer.d.ts +11 -11
  18. package/lib/NavigatedViewer.js +37 -37
  19. package/lib/Viewer.d.ts +47 -47
  20. package/lib/Viewer.js +78 -78
  21. package/lib/core/index.d.ts +10 -10
  22. package/lib/core/index.js +8 -8
  23. package/lib/draw/BpmnRenderUtil.d.ts +123 -123
  24. package/lib/draw/BpmnRenderUtil.js +256 -256
  25. package/lib/draw/BpmnRenderer.d.ts +114 -114
  26. package/lib/draw/BpmnRenderer.js +2340 -2340
  27. package/lib/draw/PathMap.d.ts +330 -330
  28. package/lib/draw/PathMap.js +478 -478
  29. package/lib/draw/TextRenderer.d.ts +74 -74
  30. package/lib/draw/TextRenderer.js +136 -136
  31. package/lib/draw/index.d.ts +10 -10
  32. package/lib/draw/index.js +11 -11
  33. package/lib/features/align-elements/AlignElementsContextPadProvider.d.ts +32 -32
  34. package/lib/features/align-elements/AlignElementsContextPadProvider.js +105 -105
  35. package/lib/features/align-elements/AlignElementsIcons.d.ts +10 -10
  36. package/lib/features/align-elements/AlignElementsIcons.js +43 -43
  37. package/lib/features/align-elements/AlignElementsMenuProvider.d.ts +32 -32
  38. package/lib/features/align-elements/AlignElementsMenuProvider.js +100 -100
  39. package/lib/features/align-elements/BpmnAlignElements.d.ts +9 -9
  40. package/lib/features/align-elements/BpmnAlignElements.js +45 -45
  41. package/lib/features/align-elements/index.d.ts +11 -11
  42. package/lib/features/align-elements/index.js +23 -23
  43. package/lib/features/append-preview/AppendPreview.d.ts +36 -36
  44. package/lib/features/append-preview/AppendPreview.js +108 -108
  45. package/lib/features/append-preview/index.d.ts +16 -16
  46. package/lib/features/append-preview/index.js +15 -15
  47. package/lib/features/auto-place/BpmnAutoPlace.d.ts +13 -13
  48. package/lib/features/auto-place/BpmnAutoPlace.js +20 -20
  49. package/lib/features/auto-place/BpmnAutoPlaceUtil.d.ts +47 -47
  50. package/lib/features/auto-place/BpmnAutoPlaceUtil.js +225 -225
  51. package/lib/features/auto-place/index.d.ts +7 -7
  52. package/lib/features/auto-place/index.js +8 -8
  53. package/lib/features/auto-resize/BpmnAutoResize.d.ts +25 -25
  54. package/lib/features/auto-resize/BpmnAutoResize.js +45 -45
  55. package/lib/features/auto-resize/BpmnAutoResizeProvider.d.ts +26 -26
  56. package/lib/features/auto-resize/BpmnAutoResizeProvider.js +69 -69
  57. package/lib/features/auto-resize/index.d.ts +8 -8
  58. package/lib/features/auto-resize/index.js +12 -12
  59. package/lib/features/context-pad/ContextPadProvider.d.ts +73 -73
  60. package/lib/features/context-pad/index.d.ts +7 -7
  61. package/lib/features/context-pad/index.js +22 -22
  62. package/lib/features/copy-paste/BpmnCopyPaste.d.ts +17 -17
  63. package/lib/features/copy-paste/BpmnCopyPaste.js +192 -192
  64. package/lib/features/copy-paste/ModdleCopy.d.ts +45 -45
  65. package/lib/features/copy-paste/ModdleCopy.js +275 -275
  66. package/lib/features/copy-paste/index.d.ts +9 -9
  67. package/lib/features/copy-paste/index.js +13 -13
  68. package/lib/features/di-ordering/BpmnDiOrdering.d.ts +11 -11
  69. package/lib/features/di-ordering/BpmnDiOrdering.js +48 -48
  70. package/lib/features/di-ordering/index.d.ts +6 -6
  71. package/lib/features/di-ordering/index.js +7 -7
  72. package/lib/features/distribute-elements/BpmnDistributeElements.d.ts +10 -10
  73. package/lib/features/distribute-elements/BpmnDistributeElements.js +60 -60
  74. package/lib/features/distribute-elements/DistributeElementsIcons.d.ts +5 -5
  75. package/lib/features/distribute-elements/DistributeElementsIcons.js +18 -18
  76. package/lib/features/distribute-elements/DistributeElementsMenuProvider.d.ts +32 -32
  77. package/lib/features/distribute-elements/DistributeElementsMenuProvider.js +92 -92
  78. package/lib/features/distribute-elements/index.d.ts +9 -9
  79. package/lib/features/distribute-elements/index.js +19 -19
  80. package/lib/features/drilldown/DrilldownBreadcrumbs.d.ts +19 -19
  81. package/lib/features/drilldown/DrilldownBreadcrumbs.js +131 -131
  82. package/lib/features/drilldown/DrilldownCentering.d.ts +17 -17
  83. package/lib/features/drilldown/DrilldownCentering.js +122 -122
  84. package/lib/features/drilldown/DrilldownOverlayBehavior.d.ts +18 -18
  85. package/lib/features/drilldown/DrilldownOverlayBehavior.js +210 -210
  86. package/lib/features/drilldown/SubprocessCompatibility.d.ts +21 -21
  87. package/lib/features/drilldown/SubprocessCompatibility.js +266 -268
  88. package/lib/features/drilldown/index.d.ts +13 -13
  89. package/lib/features/drilldown/index.js +16 -16
  90. package/lib/features/editor-actions/BpmnEditorActions.d.ts +13 -13
  91. package/lib/features/editor-actions/BpmnEditorActions.js +187 -187
  92. package/lib/features/editor-actions/index.d.ts +6 -6
  93. package/lib/features/editor-actions/index.js +10 -10
  94. package/lib/features/grid-snapping/BpmnGridSnapping.d.ts +9 -9
  95. package/lib/features/grid-snapping/behavior/GridSnappingAutoPlaceBehavior.d.ts +12 -12
  96. package/lib/features/grid-snapping/behavior/GridSnappingLayoutConnectionBehavior.d.ts +27 -27
  97. package/lib/features/grid-snapping/behavior/GridSnappingLayoutConnectionBehavior.js +155 -155
  98. package/lib/features/grid-snapping/behavior/GridSnappingParticipantBehavior.d.ts +13 -13
  99. package/lib/features/grid-snapping/behavior/index.d.ts +10 -10
  100. package/lib/features/grid-snapping/index.d.ts +11 -11
  101. package/lib/features/interaction-events/BpmnInteractionEvents.d.ts +18 -18
  102. package/lib/features/interaction-events/BpmnInteractionEvents.js +150 -150
  103. package/lib/features/interaction-events/index.d.ts +6 -6
  104. package/lib/features/interaction-events/index.js +5 -5
  105. package/lib/features/keyboard/BpmnKeyboardBindings.d.ts +15 -15
  106. package/lib/features/keyboard/BpmnKeyboardBindings.js +179 -179
  107. package/lib/features/keyboard/index.d.ts +7 -7
  108. package/lib/features/keyboard/index.js +11 -11
  109. package/lib/features/label-editing/LabelEditingPreview.d.ts +13 -13
  110. package/lib/features/label-editing/LabelEditingPreview.js +144 -144
  111. package/lib/features/label-editing/LabelEditingProvider.d.ts +62 -62
  112. package/lib/features/label-editing/LabelEditingProvider.js +519 -519
  113. package/lib/features/label-editing/LabelUtil.d.ts +1 -1
  114. package/lib/features/label-editing/LabelUtil.js +4 -4
  115. package/lib/features/label-editing/cmd/UpdateLabelHandler.d.ts +22 -22
  116. package/lib/features/label-editing/cmd/UpdateLabelHandler.js +149 -149
  117. package/lib/features/label-editing/index.d.ts +9 -9
  118. package/lib/features/label-editing/index.js +21 -21
  119. package/lib/features/modeling/BpmnFactory.d.ts +73 -73
  120. package/lib/features/modeling/BpmnFactory.js +180 -180
  121. package/lib/features/modeling/BpmnLayouter.d.ts +26 -26
  122. package/lib/features/modeling/BpmnLayouter.js +481 -481
  123. package/lib/features/modeling/BpmnUpdater.d.ts +90 -90
  124. package/lib/features/modeling/BpmnUpdater.js +837 -837
  125. package/lib/features/modeling/ElementFactory.d.ts +117 -117
  126. package/lib/features/modeling/ElementFactory.js +406 -406
  127. package/lib/features/modeling/ElementFactory.test.ts +132 -132
  128. package/lib/features/modeling/Modeling.d.ts +150 -150
  129. package/lib/features/modeling/Modeling.js +307 -307
  130. package/lib/features/modeling/Modeling.test.ts +147 -147
  131. package/lib/features/modeling/behavior/AdaptiveLabelPositioningBehavior.d.ts +20 -20
  132. package/lib/features/modeling/behavior/AdaptiveLabelPositioningBehavior.js +284 -284
  133. package/lib/features/modeling/behavior/AppendBehavior.d.ts +6 -6
  134. package/lib/features/modeling/behavior/AppendBehavior.js +42 -42
  135. package/lib/features/modeling/behavior/AssociationBehavior.d.ts +11 -11
  136. package/lib/features/modeling/behavior/AttachEventBehavior.d.ts +15 -15
  137. package/lib/features/modeling/behavior/AttachEventBehavior.js +106 -106
  138. package/lib/features/modeling/behavior/BoundaryEventBehavior.d.ts +15 -15
  139. package/lib/features/modeling/behavior/BoundaryEventBehavior.js +74 -74
  140. package/lib/features/modeling/behavior/CompensateBoundaryEventBehavior.d.ts +17 -17
  141. package/lib/features/modeling/behavior/CompensateBoundaryEventBehavior.js +222 -222
  142. package/lib/features/modeling/behavior/CreateBehavior.d.ts +9 -9
  143. package/lib/features/modeling/behavior/CreateBehavior.js +33 -33
  144. package/lib/features/modeling/behavior/CreateDataObjectBehavior.d.ts +15 -15
  145. package/lib/features/modeling/behavior/CreateDataObjectBehavior.js +43 -43
  146. package/lib/features/modeling/behavior/CreateParticipantBehavior.d.ts +19 -19
  147. package/lib/features/modeling/behavior/CreateParticipantBehavior.js +237 -237
  148. package/lib/features/modeling/behavior/DataInputAssociationBehavior.d.ts +21 -21
  149. package/lib/features/modeling/behavior/DataInputAssociationBehavior.js +162 -162
  150. package/lib/features/modeling/behavior/DataStoreBehavior.d.ts +19 -19
  151. package/lib/features/modeling/behavior/DeleteLaneBehavior.d.ts +15 -15
  152. package/lib/features/modeling/behavior/DeleteLaneBehavior.js +162 -162
  153. package/lib/features/modeling/behavior/DetachEventBehavior.d.ts +15 -15
  154. package/lib/features/modeling/behavior/DetachEventBehavior.js +101 -101
  155. package/lib/features/modeling/behavior/DropOnFlowBehavior.d.ts +13 -13
  156. package/lib/features/modeling/behavior/DropOnFlowBehavior.js +221 -221
  157. package/lib/features/modeling/behavior/EventBasedGatewayBehavior.d.ts +11 -11
  158. package/lib/features/modeling/behavior/EventBasedGatewayBehavior.js +110 -110
  159. package/lib/features/modeling/behavior/FixHoverBehavior.d.ts +17 -17
  160. package/lib/features/modeling/behavior/GroupBehavior.d.ts +26 -26
  161. package/lib/features/modeling/behavior/GroupBehavior.js +332 -332
  162. package/lib/features/modeling/behavior/ImportDockingFix.d.ts +13 -13
  163. package/lib/features/modeling/behavior/ImportDockingFix.js +83 -83
  164. package/lib/features/modeling/behavior/IsHorizontalFix.d.ts +10 -10
  165. package/lib/features/modeling/behavior/IsHorizontalFix.js +54 -54
  166. package/lib/features/modeling/behavior/LabelBehavior.d.ts +56 -56
  167. package/lib/features/modeling/behavior/LabelBehavior.js +364 -364
  168. package/lib/features/modeling/behavior/LayoutConnectionBehavior.d.ts +16 -16
  169. package/lib/features/modeling/behavior/LayoutConnectionBehavior.js +121 -121
  170. package/lib/features/modeling/behavior/MessageFlowBehavior.d.ts +15 -15
  171. package/lib/features/modeling/behavior/NonInterruptingBehavior.d.ts +4 -4
  172. package/lib/features/modeling/behavior/NonInterruptingBehavior.js +41 -41
  173. package/lib/features/modeling/behavior/RemoveElementBehavior.d.ts +13 -13
  174. package/lib/features/modeling/behavior/RemoveElementBehavior.js +91 -91
  175. package/lib/features/modeling/behavior/RemoveEmbeddedLabelBoundsBehavior.d.ts +16 -16
  176. package/lib/features/modeling/behavior/RemoveEmbeddedLabelBoundsBehavior.js +41 -41
  177. package/lib/features/modeling/behavior/RemoveParticipantBehavior.d.ts +15 -15
  178. package/lib/features/modeling/behavior/RemoveParticipantBehavior.js +54 -54
  179. package/lib/features/modeling/behavior/ReplaceConnectionBehavior.d.ts +15 -15
  180. package/lib/features/modeling/behavior/ReplaceConnectionBehavior.js +194 -194
  181. package/lib/features/modeling/behavior/ReplaceElementBehaviour.d.ts +23 -23
  182. package/lib/features/modeling/behavior/ReplaceElementBehaviour.js +144 -144
  183. package/lib/features/modeling/behavior/ResizeBehavior.d.ts +67 -67
  184. package/lib/features/modeling/behavior/ResizeBehavior.js +262 -262
  185. package/lib/features/modeling/behavior/ResizeLaneBehavior.d.ts +16 -16
  186. package/lib/features/modeling/behavior/ResizeLaneBehavior.js +70 -70
  187. package/lib/features/modeling/behavior/RootElementReferenceBehavior.d.ts +25 -25
  188. package/lib/features/modeling/behavior/SpaceToolBehavior.d.ts +10 -10
  189. package/lib/features/modeling/behavior/SpaceToolBehavior.js +207 -207
  190. package/lib/features/modeling/behavior/SubProcessPlaneBehavior.d.ts +28 -28
  191. package/lib/features/modeling/behavior/SubProcessPlaneBehavior.js +588 -588
  192. package/lib/features/modeling/behavior/SubProcessStartEventBehavior.d.ts +15 -15
  193. package/lib/features/modeling/behavior/SubProcessStartEventBehavior.js +55 -55
  194. package/lib/features/modeling/behavior/TextAnnotationBehavior.d.ts +6 -6
  195. package/lib/features/modeling/behavior/TextAnnotationBehavior.js +42 -42
  196. package/lib/features/modeling/behavior/ToggleCollapseConnectionBehaviour.d.ts +14 -14
  197. package/lib/features/modeling/behavior/ToggleCollapseConnectionBehaviour.js +87 -87
  198. package/lib/features/modeling/behavior/ToggleElementCollapseBehaviour.d.ts +13 -13
  199. package/lib/features/modeling/behavior/ToggleElementCollapseBehaviour.js +156 -156
  200. package/lib/features/modeling/behavior/UnclaimIdBehavior.d.ts +19 -19
  201. package/lib/features/modeling/behavior/UnclaimIdBehavior.js +64 -64
  202. package/lib/features/modeling/behavior/UnsetDefaultFlowBehavior.d.ts +16 -16
  203. package/lib/features/modeling/behavior/UnsetDefaultFlowBehavior.js +59 -59
  204. package/lib/features/modeling/behavior/UpdateFlowNodeRefsBehavior.d.ts +15 -15
  205. package/lib/features/modeling/behavior/UpdateFlowNodeRefsBehavior.js +157 -157
  206. package/lib/features/modeling/behavior/index.d.ts +2 -2
  207. package/lib/features/modeling/behavior/index.js +128 -128
  208. package/lib/features/modeling/behavior/util/CategoryUtil.d.ts +49 -49
  209. package/lib/features/modeling/behavior/util/CategoryUtil.js +86 -86
  210. package/lib/features/modeling/behavior/util/ConnectionLayoutUtil.d.ts +19 -19
  211. package/lib/features/modeling/behavior/util/ConnectionLayoutUtil.js +22 -22
  212. package/lib/features/modeling/behavior/util/GeometricUtil.d.ts +1 -1
  213. package/lib/features/modeling/behavior/util/LabelLayoutUtil.d.ts +32 -32
  214. package/lib/features/modeling/behavior/util/LabelLayoutUtil.js +41 -41
  215. package/lib/features/modeling/behavior/util/LayoutUtil.d.ts +48 -48
  216. package/lib/features/modeling/behavior/util/LayoutUtil.js +259 -259
  217. package/lib/features/modeling/behavior/util/LineAttachmentUtil.d.ts +37 -37
  218. package/lib/features/modeling/behavior/util/LineAttachmentUtil.js +241 -241
  219. package/lib/features/modeling/behavior/util/LineIntersect.d.ts +13 -13
  220. package/lib/features/modeling/behavior/util/LineIntersect.js +39 -39
  221. package/lib/features/modeling/behavior/util/NonInterruptingUtil.d.ts +3 -3
  222. package/lib/features/modeling/behavior/util/NonInterruptingUtil.js +32 -32
  223. package/lib/features/modeling/behavior/util/ResizeUtil.d.ts +1 -1
  224. package/lib/features/modeling/cmd/AddLaneHandler.d.ts +22 -22
  225. package/lib/features/modeling/cmd/AddLaneHandler.js +192 -192
  226. package/lib/features/modeling/cmd/IdClaimHandler.d.ts +22 -22
  227. package/lib/features/modeling/cmd/IdClaimHandler.js +51 -51
  228. package/lib/features/modeling/cmd/ResizeLaneHandler.d.ts +39 -39
  229. package/lib/features/modeling/cmd/ResizeLaneHandler.js +146 -146
  230. package/lib/features/modeling/cmd/SetColorHandler.d.ts +18 -18
  231. package/lib/features/modeling/cmd/SplitLaneHandler.d.ts +20 -20
  232. package/lib/features/modeling/cmd/SplitLaneHandler.js +99 -99
  233. package/lib/features/modeling/cmd/UpdateCanvasRootHandler.d.ts +20 -20
  234. package/lib/features/modeling/cmd/UpdateCanvasRootHandler.js +99 -99
  235. package/lib/features/modeling/cmd/UpdateFlowNodeRefsHandler.d.ts +21 -21
  236. package/lib/features/modeling/cmd/UpdateFlowNodeRefsHandler.js +218 -218
  237. package/lib/features/modeling/cmd/UpdateModdlePropertiesHandler.d.ts +20 -20
  238. package/lib/features/modeling/cmd/UpdateModdlePropertiesHandler.js +107 -107
  239. package/lib/features/modeling/cmd/UpdatePropertiesHandler.d.ts +58 -58
  240. package/lib/features/modeling/cmd/UpdatePropertiesHandler.js +260 -260
  241. package/lib/features/modeling/cmd/UpdateSemanticParentHandler.d.ts +18 -18
  242. package/lib/features/modeling/index.d.ts +27 -27
  243. package/lib/features/modeling/index.js +45 -45
  244. package/lib/features/modeling/util/LaneUtil.d.ts +46 -46
  245. package/lib/features/modeling/util/LaneUtil.js +188 -188
  246. package/lib/features/modeling/util/ModelingUtil.d.ts +21 -21
  247. package/lib/features/modeling/util/ModelingUtil.js +54 -54
  248. package/lib/features/modeling-feedback/ModelingFeedback.d.ts +13 -13
  249. package/lib/features/modeling-feedback/ModelingFeedback.js +46 -46
  250. package/lib/features/modeling-feedback/index.d.ts +7 -7
  251. package/lib/features/modeling-feedback/index.js +12 -12
  252. package/lib/features/ordering/BpmnOrderingProvider.d.ts +19 -19
  253. package/lib/features/ordering/BpmnOrderingProvider.js +191 -191
  254. package/lib/features/ordering/index.d.ts +6 -6
  255. package/lib/features/ordering/index.js +5 -5
  256. package/lib/features/outline/OutlineProvider.d.ts +34 -34
  257. package/lib/features/outline/OutlineProvider.js +179 -179
  258. package/lib/features/outline/OutlineUtil.d.ts +18 -18
  259. package/lib/features/outline/OutlineUtil.js +31 -31
  260. package/lib/features/outline/index.d.ts +7 -7
  261. package/lib/features/outline/index.js +10 -10
  262. package/lib/features/palette/PaletteProvider.d.ts +34 -34
  263. package/lib/features/palette/PaletteProvider.js +214 -214
  264. package/lib/features/palette/index.d.ts +9 -9
  265. package/lib/features/palette/index.js +23 -23
  266. package/lib/features/popup-menu/ReplaceMenuProvider.d.ts +52 -52
  267. package/lib/features/popup-menu/ReplaceMenuProvider.js +679 -679
  268. package/lib/features/popup-menu/index.d.ts +11 -11
  269. package/lib/features/popup-menu/index.js +16 -16
  270. package/lib/features/popup-menu/util/Icons.d.ts +5 -5
  271. package/lib/features/popup-menu/util/Icons.js +14 -14
  272. package/lib/features/popup-menu/util/TypeUtil.d.ts +14 -14
  273. package/lib/features/popup-menu/util/TypeUtil.js +52 -52
  274. package/lib/features/replace/BpmnReplace.d.ts +47 -47
  275. package/lib/features/replace/BpmnReplace.js +382 -382
  276. package/lib/features/replace/ReplaceOptions.d.ts +75 -75
  277. package/lib/features/replace/ReplaceOptions.js +919 -919
  278. package/lib/features/replace/index.d.ts +9 -9
  279. package/lib/features/replace/index.js +14 -14
  280. package/lib/features/replace-preview/BpmnReplacePreview.d.ts +17 -17
  281. package/lib/features/replace-preview/BpmnReplacePreview.js +139 -139
  282. package/lib/features/replace-preview/index.d.ts +7 -7
  283. package/lib/features/replace-preview/index.js +11 -11
  284. package/lib/features/rules/BpmnRules.d.ts +181 -181
  285. package/lib/features/rules/BpmnRules.js +1191 -1191
  286. package/lib/features/rules/index.d.ts +7 -7
  287. package/lib/features/rules/index.js +11 -11
  288. package/lib/features/search/BpmnSearchProvider.d.ts +29 -29
  289. package/lib/features/search/BpmnSearchProvider.js +136 -136
  290. package/lib/features/search/index.d.ts +7 -7
  291. package/lib/features/search/index.js +12 -12
  292. package/lib/features/snapping/BpmnConnectSnapping.d.ts +17 -17
  293. package/lib/features/snapping/BpmnCreateMoveSnapping.d.ts +41 -41
  294. package/lib/features/snapping/BpmnCreateMoveSnapping.js +289 -289
  295. package/lib/features/snapping/BpmnSnappingUtil.d.ts +11 -11
  296. package/lib/features/snapping/index.d.ts +9 -9
  297. package/lib/features/snapping/index.js +12 -12
  298. package/lib/features/space-tool/BpmnSpaceTool.d.ts +21 -21
  299. package/lib/features/space-tool/BpmnSpaceTool.js +69 -69
  300. package/lib/features/space-tool/index.d.ts +6 -6
  301. package/lib/features/space-tool/index.js +7 -7
  302. package/lib/import/BpmnImporter.d.ts +51 -51
  303. package/lib/import/BpmnImporter.js +363 -363
  304. package/lib/import/BpmnTreeWalker.d.ts +20 -20
  305. package/lib/import/BpmnTreeWalker.js +453 -453
  306. package/lib/import/Importer.d.ts +25 -25
  307. package/lib/import/Importer.js +222 -217
  308. package/lib/import/Util.d.ts +1 -1
  309. package/lib/import/Util.js +6 -6
  310. package/lib/import/index.d.ts +6 -6
  311. package/lib/import/index.js +9 -9
  312. package/lib/model/Types.d.ts +25 -25
  313. package/lib/model/Types.ts +40 -40
  314. package/lib/util/CompatibilityUtil.d.ts +8 -8
  315. package/lib/util/CompatibilityUtil.js +29 -29
  316. package/lib/util/DiUtil.d.ts +60 -60
  317. package/lib/util/DiUtil.js +122 -122
  318. package/lib/util/DrilldownUtil.d.ts +39 -39
  319. package/lib/util/DrilldownUtil.js +69 -69
  320. package/lib/util/LabelUtil.d.ts +83 -83
  321. package/lib/util/LabelUtil.js +262 -262
  322. package/lib/util/ModelUtil.d.ts +40 -40
  323. package/lib/util/ModelUtil.js +58 -58
  324. package/lib/util/PoweredByUtil.d.ts +8 -8
  325. package/lib/util/PoweredByUtil.js +99 -99
  326. package/lib/util/Types.js +4 -4
  327. package/lib/util/Types.ts +3 -3
  328. package/package.json +132 -132
  329. package/test/helper/TranslationCollector.js +15 -15
  330. package/test/helper/index.js +313 -313
  331. package/test/matchers/BoundsMatchers.js +252 -252
  332. package/test/matchers/ConnectionMatchers.js +165 -165
  333. package/test/matchers/JSONMatcher.js +19 -19
  334. package/test/util/KeyEvents.js +22 -22
  335. package/test/util/MockEvents.js +61 -61
  336. package/test/util/custom-rules/CustomRules.js +16 -16
  337. package/test/util/custom-rules/index.js +6 -6
package/lib/BaseViewer.js CHANGED
@@ -1,858 +1,858 @@
1
- /**
2
- * The code in the <project-logo></project-logo> area
3
- * must not be changed.
4
- *
5
- * @see http://bpmn.io/license for more information.
6
- */
7
- import {
8
- assign,
9
- find,
10
- isNumber,
11
- omit
12
- } from 'min-dash';
13
-
14
- import {
15
- domify,
16
- assignStyle,
17
- query as domQuery,
18
- remove as domRemove
19
- } from 'min-dom';
20
-
21
- import {
22
- innerSVG
23
- } from 'tiny-svg';
24
-
25
- import Diagram from 'diagram-js';
26
- import BpmnModdle from 'bpmn-moddle';
27
-
28
- import inherits from 'inherits-browser';
29
-
30
- import {
31
- importBpmnDiagram
32
- } from './import/Importer';
33
-
34
- /**
35
- * @template T
36
- *
37
- * @typedef { import('diagram-js/lib/core/EventBus').default<T> } EventBus
38
- */
39
-
40
- /**
41
- * @template T
42
- *
43
- * @typedef {import('diagram-js/lib/core/EventBus').EventBusEventCallback<T>} EventBusEventCallback
44
- */
45
-
46
- /**
47
- * @typedef {import('didi').ModuleDeclaration} ModuleDeclaration
48
- *
49
- * @typedef {import('./model/Types').Moddle} Moddle
50
- * @typedef {import('./model/Types').ModdleElement} ModdleElement
51
- * @typedef {import('./model/Types').ModdleExtension} ModdleExtension
52
- *
53
- * @typedef { {
54
- * width?: number|string;
55
- * height?: number|string;
56
- * position?: string;
57
- * container?: string|HTMLElement;
58
- * moddleExtensions?: ModdleExtensions;
59
- * additionalModules?: ModuleDeclaration[];
60
- * } & Record<string, any> } BaseViewerOptions
61
- *
62
- * @typedef {Record<string, ModdleElement>} ModdleElementsById
63
- *
64
- * @typedef { {
65
- * [key: string]: ModdleExtension;
66
- * } } ModdleExtensions
67
- *
68
- * @typedef { {
69
- * warnings: string[];
70
- * } } ImportXMLResult
71
- *
72
- * @typedef {ImportXMLResult & Error} ImportXMLError
73
- *
74
- * @typedef {ImportXMLResult} ImportDefinitionsResult
75
- *
76
- * @typedef {ImportXMLError} ImportDefinitionsError
77
- *
78
- * @typedef {ImportXMLResult} OpenResult
79
- *
80
- * @typedef {ImportXMLError} OpenError
81
- *
82
- * @typedef { {
83
- * format?: boolean;
84
- * preamble?: boolean;
85
- * } } SaveXMLOptions
86
- *
87
- * @typedef { {
88
- * xml?: string;
89
- * error?: Error;
90
- * } } SaveXMLResult
91
- *
92
- * @typedef { {
93
- * svg: string;
94
- * } } SaveSVGResult
95
- *
96
- * @typedef { {
97
- * xml: string;
98
- * } } ImportParseStartEvent
99
- *
100
- * @typedef { {
101
- * error?: ImportXMLError;
102
- * definitions?: ModdleElement;
103
- * elementsById?: ModdleElementsById;
104
- * references?: ModdleElement[];
105
- * warnings: string[];
106
- * } } ImportParseCompleteEvent
107
- *
108
- * @typedef { {
109
- * error?: ImportXMLError;
110
- * warnings: string[];
111
- * } } ImportDoneEvent
112
- *
113
- * @typedef { {
114
- * definitions: ModdleElement;
115
- * } } SaveXMLStartEvent
116
- *
117
- * @typedef {SaveXMLResult} SaveXMLDoneEvent
118
- *
119
- * @typedef { {
120
- * error?: Error;
121
- * svg: string;
122
- * } } SaveSVGDoneEvent
123
- */
124
-
125
- /**
126
- * @template Type
127
- *
128
- * @typedef { Type extends { eventBus: EventBus<infer X> } ? X : never } EventMap
129
- */
130
-
131
- /**
132
- * A base viewer for BPMN 2.0 diagrams.
133
- *
134
- * Have a look at {@link bpmn-js/lib/Viewer}, {@link bpmn-js/lib/NavigatedViewer} or {@link bpmn-js/lib/Modeler} for
135
- * bundles that include actual features.
136
- *
137
- * @template [ServiceMap=null]
138
- *
139
- * @extends Diagram<ServiceMap>
140
- *
141
- * @param {BaseViewerOptions} [options] The options to configure the viewer.
142
- */
143
- export default function BaseViewer(options) {
144
-
145
- /**
146
- * @type {BaseViewerOptions}
147
- */
148
- options = assign({}, DEFAULT_OPTIONS, options);
149
-
150
- /**
151
- * @type {Moddle}
152
- */
153
- this._moddle = this._createModdle(options);
154
-
155
- /**
156
- * @type {HTMLElement}
157
- */
158
- this._container = this._createContainer(options);
159
-
160
- /* <project-logo> */
161
-
162
- addProjectLogo(this._container);
163
-
164
- /* </project-logo> */
165
-
166
- this._init(this._container, this._moddle, options);
167
- }
168
-
169
- inherits(BaseViewer, Diagram);
170
-
171
- /**
172
- * Parse and render a BPMN 2.0 diagram.
173
- *
174
- * Once finished the viewer reports back the result to the
175
- * provided callback function with (err, warnings).
176
- *
177
- * ## Life-Cycle Events
178
- *
179
- * During import the viewer will fire life-cycle events:
180
- *
181
- * * import.parse.start (about to read model from XML)
182
- * * import.parse.complete (model read; may have worked or not)
183
- * * import.render.start (graphical import start)
184
- * * import.render.complete (graphical import finished)
185
- * * import.done (everything done)
186
- *
187
- * You can use these events to hook into the life-cycle.
188
- *
189
- * @throws {ImportXMLError} An error thrown during the import of the XML.
190
- *
191
- * @fires BaseViewer#ImportParseStartEvent
192
- * @fires BaseViewer#ImportParseCompleteEvent
193
- * @fires Importer#ImportRenderStartEvent
194
- * @fires Importer#ImportRenderCompleteEvent
195
- * @fires BaseViewer#ImportDoneEvent
196
- *
197
- * @param {string} xml The BPMN 2.0 XML to be imported.
198
- * @param {ModdleElement|string} [bpmnDiagram] The optional diagram or Id of the BPMN diagram to open.
199
- *
200
- * @return {Promise<ImportXMLResult>} A promise resolving with warnings that were produced during the import.
201
- */
202
- BaseViewer.prototype.importXML = async function importXML(xml, bpmnDiagram) {
203
-
204
- const self = this;
205
-
206
- function ParseCompleteEvent(data) {
207
- return self.get('eventBus').createEvent(data);
208
- }
209
-
210
- let aggregatedWarnings = [];
211
- try {
212
-
213
- // hook in pre-parse listeners +
214
- // allow xml manipulation
215
-
216
- /**
217
- * A `import.parse.start` event.
218
- *
219
- * @event BaseViewer#ImportParseStartEvent
220
- * @type {ImportParseStartEvent}
221
- */
222
- xml = this._emit('import.parse.start', { xml: xml }) || xml;
223
-
224
- let parseResult;
225
- try {
226
- parseResult = await this._moddle.fromXML(xml, 'bpmn:Definitions');
227
- } catch (error) {
228
- this._emit('import.parse.complete', {
229
- error
230
- });
231
-
232
- throw error;
233
- }
234
-
235
- let definitions = parseResult.rootElement;
236
- const references = parseResult.references;
237
- const parseWarnings = parseResult.warnings;
238
- const elementsById = parseResult.elementsById;
239
-
240
- aggregatedWarnings = aggregatedWarnings.concat(parseWarnings);
241
-
242
- // hook in post parse listeners +
243
- // allow definitions manipulation
244
-
245
- /**
246
- * A `import.parse.complete` event.
247
- *
248
- * @event BaseViewer#ImportParseCompleteEvent
249
- * @type {ImportParseCompleteEvent}
250
- */
251
- definitions = this._emit('import.parse.complete', ParseCompleteEvent({
252
- error: null,
253
- definitions: definitions,
254
- elementsById: elementsById,
255
- references: references,
256
- warnings: aggregatedWarnings
257
- })) || definitions;
258
-
259
- const importResult = await this.importDefinitions(definitions, bpmnDiagram);
260
-
261
- aggregatedWarnings = aggregatedWarnings.concat(importResult.warnings);
262
-
263
- /**
264
- * A `import.parse.complete` event.
265
- *
266
- * @event BaseViewer#ImportDoneEvent
267
- * @type {ImportDoneEvent}
268
- */
269
- this._emit('import.done', { error: null, warnings: aggregatedWarnings });
270
-
271
- return { warnings: aggregatedWarnings };
272
- } catch (err) {
273
- let error = err;
274
- aggregatedWarnings = aggregatedWarnings.concat(error.warnings || []);
275
- addWarningsToError(error, aggregatedWarnings);
276
-
277
- error = checkValidationError(error);
278
-
279
- this._emit('import.done', { error, warnings: error.warnings });
280
-
281
- throw error;
282
- }
283
- };
284
-
285
-
286
- /**
287
- * Import parsed definitions and render a BPMN 2.0 diagram.
288
- *
289
- * Once finished the viewer reports back the result to the
290
- * provided callback function with (err, warnings).
291
- *
292
- * ## Life-Cycle Events
293
- *
294
- * During import the viewer will fire life-cycle events:
295
- *
296
- * * import.render.start (graphical import start)
297
- * * import.render.complete (graphical import finished)
298
- *
299
- * You can use these events to hook into the life-cycle.
300
- *
301
- * @throws {ImportDefinitionsError} An error thrown during the import of the definitions.
302
- *
303
- * @param {ModdleElement} definitions The definitions.
304
- * @param {ModdleElement|string} [bpmnDiagram] The optional diagram or ID of the BPMN diagram to open.
305
- *
306
- * @return {Promise<ImportDefinitionsResult>} A promise resolving with warnings that were produced during the import.
307
- */
308
- BaseViewer.prototype.importDefinitions = async function importDefinitions(definitions, bpmnDiagram) {
309
- this._setDefinitions(definitions);
310
- const result = await this.open(bpmnDiagram);
311
-
312
- return { warnings: result.warnings };
313
- };
314
-
315
-
316
- /**
317
- * Open diagram of previously imported XML.
318
- *
319
- * Once finished the viewer reports back the result to the
320
- * provided callback function with (err, warnings).
321
- *
322
- * ## Life-Cycle Events
323
- *
324
- * During switch the viewer will fire life-cycle events:
325
- *
326
- * * import.render.start (graphical import start)
327
- * * import.render.complete (graphical import finished)
328
- *
329
- * You can use these events to hook into the life-cycle.
330
- *
331
- * @throws {OpenError} An error thrown during opening.
332
- *
333
- * @param {ModdleElement|string} bpmnDiagramOrId The diagram or Id of the BPMN diagram to open.
334
- *
335
- * @return {Promise<OpenResult>} A promise resolving with warnings that were produced during opening.
336
- */
337
- BaseViewer.prototype.open = async function open(bpmnDiagramOrId) {
338
-
339
- const definitions = this._definitions;
340
- let bpmnDiagram = bpmnDiagramOrId;
341
-
342
- if (!definitions) {
343
- const error = new Error('no XML imported');
344
- addWarningsToError(error, []);
345
-
346
- throw error;
347
- }
348
-
349
- if (typeof bpmnDiagramOrId === 'string') {
350
- bpmnDiagram = findBPMNDiagram(definitions, bpmnDiagramOrId);
351
-
352
- if (!bpmnDiagram) {
353
- const error = new Error('BPMNDiagram <' + bpmnDiagramOrId + '> not found');
354
- addWarningsToError(error, []);
355
-
356
- throw error;
357
- }
358
- }
359
-
360
- // clear existing rendered diagram
361
- // catch synchronous exceptions during #clear()
362
- try {
363
- this.clear();
364
- } catch (error) {
365
- addWarningsToError(error, []);
366
-
367
- throw error;
368
- }
369
-
370
- // perform graphical import
371
- const { warnings } = await importBpmnDiagram(this, definitions, bpmnDiagram);
372
-
373
- return { warnings };
374
- };
375
-
376
- /**
377
- * Export the currently displayed BPMN 2.0 diagram as
378
- * a BPMN 2.0 XML document.
379
- *
380
- * ## Life-Cycle Events
381
- *
382
- * During XML saving the viewer will fire life-cycle events:
383
- *
384
- * * saveXML.start (before serialization)
385
- * * saveXML.serialized (after xml generation)
386
- * * saveXML.done (everything done)
387
- *
388
- * You can use these events to hook into the life-cycle.
389
- *
390
- * @throws {Error} An error thrown during export.
391
- *
392
- * @fires BaseViewer#SaveXMLStart
393
- * @fires BaseViewer#SaveXMLDone
394
- *
395
- * @param {SaveXMLOptions} [options] The options.
396
- *
397
- * @return {Promise<SaveXMLResult>} A promise resolving with the XML.
398
- */
399
- BaseViewer.prototype.saveXML = async function saveXML(options) {
400
-
401
- options = options || {};
402
-
403
- let definitions = this._definitions,
404
- error, xml;
405
-
406
- try {
407
- if (!definitions) {
408
- throw new Error('no definitions loaded');
409
- }
410
-
411
- // allow to fiddle around with definitions
412
-
413
- /**
414
- * A `saveXML.start` event.
415
- *
416
- * @event BaseViewer#SaveXMLStartEvent
417
- * @type {SaveXMLStartEvent}
418
- */
419
- definitions = this._emit('saveXML.start', {
420
- definitions
421
- }) || definitions;
422
-
423
- const result = await this._moddle.toXML(definitions, options);
424
- xml = result.xml;
425
-
426
- xml = this._emit('saveXML.serialized', {
427
- xml
428
- }) || xml;
429
- } catch (err) {
430
- error = err;
431
- }
432
-
433
- const result = error ? { error } : { xml };
434
-
435
- /**
436
- * A `saveXML.done` event.
437
- *
438
- * @event BaseViewer#SaveXMLDoneEvent
439
- * @type {SaveXMLDoneEvent}
440
- */
441
- this._emit('saveXML.done', result);
442
-
443
- if (error) {
444
- throw error;
445
- }
446
-
447
- return result;
448
- };
449
-
450
-
451
- /**
452
- * Export the currently displayed BPMN 2.0 diagram as
453
- * an SVG image.
454
- *
455
- * ## Life-Cycle Events
456
- *
457
- * During SVG saving the viewer will fire life-cycle events:
458
- *
459
- * * saveSVG.start (before serialization)
460
- * * saveSVG.done (everything done)
461
- *
462
- * You can use these events to hook into the life-cycle.
463
- *
464
- * @throws {Error} An error thrown during export.
465
- *
466
- * @fires BaseViewer#SaveSVGDone
467
- *
468
- * @return {Promise<SaveSVGResult>} A promise resolving with the SVG.
469
- */
470
- BaseViewer.prototype.saveSVG = async function saveSVG() {
471
- this._emit('saveSVG.start');
472
-
473
- let svg, err;
474
-
475
- try {
476
- const canvas = this.get('canvas');
477
-
478
- const contentNode = canvas.getActiveLayer(),
479
- defsNode = domQuery('defs', canvas._svg);
480
-
481
- const contents = innerSVG(contentNode),
482
- defs = defsNode ? '<defs>' + innerSVG(defsNode) + '</defs>' : '';
483
-
484
- const bbox = contentNode.getBBox();
485
-
486
- svg =
487
- '<?xml version="1.0" encoding="utf-8"?>\n' +
488
- '<!-- created with bpmn-js / http://bpmn.io -->\n' +
489
- '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\n' +
490
- '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" ' +
491
- 'width="' + bbox.width + '" height="' + bbox.height + '" ' +
492
- 'viewBox="' + bbox.x + ' ' + bbox.y + ' ' + bbox.width + ' ' + bbox.height + '" version="1.1">' +
493
- defs + contents +
494
- '</svg>';
495
- } catch (e) {
496
- err = e;
497
- }
498
-
499
- /**
500
- * A `saveSVG.done` event.
501
- *
502
- * @event BaseViewer#SaveSVGDoneEvent
503
- * @type {SaveSVGDoneEvent}
504
- */
505
- this._emit('saveSVG.done', {
506
- error: err,
507
- svg: svg
508
- });
509
-
510
- if (err) {
511
- throw err;
512
- }
513
-
514
- return { svg };
515
- };
516
-
517
- BaseViewer.prototype._setDefinitions = function(definitions) {
518
- this._definitions = definitions;
519
- };
520
-
521
- /**
522
- * Return modules to instantiate with.
523
- *
524
- * @return {ModuleDeclaration[]} The modules.
525
- */
526
- BaseViewer.prototype.getModules = function() {
527
- return this._modules;
528
- };
529
-
530
- /**
531
- * Remove all drawn elements from the viewer.
532
- *
533
- * After calling this method the viewer can still be reused for opening another
534
- * diagram.
535
- */
536
- BaseViewer.prototype.clear = function() {
537
- if (!this.getDefinitions()) {
538
-
539
- // no diagram to clear
540
- return;
541
- }
542
-
543
- // remove drawn elements
544
- Diagram.prototype.clear.call(this);
545
- };
546
-
547
- /**
548
- * Destroy the viewer instance and remove all its remainders from the document
549
- * tree.
550
- */
551
- BaseViewer.prototype.destroy = function() {
552
-
553
- // diagram destroy
554
- Diagram.prototype.destroy.call(this);
555
-
556
- // dom detach
557
- domRemove(this._container);
558
- };
559
-
560
- /**
561
- * @overlord
562
- *
563
- * Register an event listener for events with the given name.
564
- *
565
- * The callback will be invoked with `event, ...additionalArguments`
566
- * that have been passed to {@link EventBus#fire}.
567
- *
568
- * Returning false from a listener will prevent the events default action
569
- * (if any is specified). To stop an event from being processed further in
570
- * other listeners execute {@link Event#stopPropagation}.
571
- *
572
- * Returning anything but `undefined` from a listener will stop the listener propagation.
573
- *
574
- * @template T
575
- *
576
- * @param {string|string[]} events The event(s) to listen to.
577
- * @param {number} [priority] The priority with which to listen.
578
- * @param {EventBusEventCallback<T>} callback The callback.
579
- * @param {any} [that] Value of `this` the callback will be called with.
580
- */
581
- /**
582
- * Register an event listener for events with the given name.
583
- *
584
- * The callback will be invoked with `event, ...additionalArguments`
585
- * that have been passed to {@link EventBus#fire}.
586
- *
587
- * Returning false from a listener will prevent the events default action
588
- * (if any is specified). To stop an event from being processed further in
589
- * other listeners execute {@link Event#stopPropagation}.
590
- *
591
- * Returning anything but `undefined` from a listener will stop the listener propagation.
592
- *
593
- * @template {keyof EventMap<ServiceMap>} EventName
594
- *
595
- * @param {EventName} events to subscribe to
596
- * @param {number} [priority=1000] listen priority
597
- * @param {EventBusEventCallback<(EventMap<ServiceMap>)[EventName]>} callback
598
- * @param {any} [that] callback context
599
- */
600
- BaseViewer.prototype.on = function(events, priority, callback, that) {
601
- return this.get('eventBus').on(events, priority, callback, that);
602
- };
603
-
604
- /**
605
- * Remove an event listener.
606
- *
607
- * @param {string|string[]} events The event(s).
608
- * @param {Function} [callback] The callback.
609
- */
610
- BaseViewer.prototype.off = function(events, callback) {
611
- this.get('eventBus').off(events, callback);
612
- };
613
-
614
- /**
615
- * Attach the viewer to an HTML element.
616
- *
617
- * @param {HTMLElement} parentNode The parent node to attach to.
618
- */
619
- BaseViewer.prototype.attachTo = function(parentNode) {
620
-
621
- if (!parentNode) {
622
- throw new Error('parentNode required');
623
- }
624
-
625
- // ensure we detach from the
626
- // previous, old parent
627
- this.detach();
628
-
629
- // unwrap jQuery if provided
630
- if (parentNode.get && parentNode.constructor.prototype.jquery) {
631
- parentNode = parentNode.get(0);
632
- }
633
-
634
- if (typeof parentNode === 'string') {
635
- parentNode = domQuery(parentNode);
636
- }
637
-
638
- parentNode.appendChild(this._container);
639
-
640
- this._emit('attach', {});
641
-
642
- this.get('canvas').resized();
643
- };
644
-
645
- /**
646
- * Get the definitions model element.
647
- *
648
- * @return {ModdleElement} The definitions model element.
649
- */
650
- BaseViewer.prototype.getDefinitions = function() {
651
- return this._definitions;
652
- };
653
-
654
- /**
655
- * Detach the viewer.
656
- *
657
- * @fires BaseViewer#DetachEvent
658
- */
659
- BaseViewer.prototype.detach = function() {
660
-
661
- const container = this._container,
662
- parentNode = container.parentNode;
663
-
664
- if (!parentNode) {
665
- return;
666
- }
667
-
668
- /**
669
- * A `detach` event.
670
- *
671
- * @event BaseViewer#DetachEvent
672
- * @type {Object}
673
- */
674
- this._emit('detach', {});
675
-
676
- parentNode.removeChild(container);
677
- };
678
-
679
- BaseViewer.prototype._init = function(container, moddle, options) {
680
-
681
- const baseModules = options.modules || this.getModules(options),
682
- additionalModules = options.additionalModules || [],
683
- staticModules = [
684
- {
685
- bpmnjs: [ 'value', this ],
686
- moddle: [ 'value', moddle ]
687
- }
688
- ];
689
-
690
- const diagramModules = [].concat(staticModules, baseModules, additionalModules);
691
-
692
- const diagramOptions = assign(omit(options, [ 'additionalModules' ]), {
693
- canvas: assign({}, options.canvas, { container: container }),
694
- modules: diagramModules
695
- });
696
-
697
- // invoke diagram constructor
698
- Diagram.call(this, diagramOptions);
699
-
700
- if (options && options.container) {
701
- this.attachTo(options.container);
702
- }
703
- };
704
-
705
- /**
706
- * Emit an event on the underlying {@link EventBus}
707
- *
708
- * @param {string} type
709
- * @param {Object} event
710
- *
711
- * @return {Object} The return value after calling all event listeners.
712
- */
713
- BaseViewer.prototype._emit = function(type, event) {
714
- return this.get('eventBus').fire(type, event);
715
- };
716
-
717
- /**
718
- * @param {BaseViewerOptions} options
719
- *
720
- * @return {HTMLElement}
721
- */
722
- BaseViewer.prototype._createContainer = function(options) {
723
-
724
- const container = domify('<div class="bjs-container"></div>');
725
-
726
- assignStyle(container, {
727
- width: ensureUnit(options.width),
728
- height: ensureUnit(options.height),
729
- position: options.position
730
- });
731
-
732
- return container;
733
- };
734
-
735
- /**
736
- * @param {BaseViewerOptions} options
737
- *
738
- * @return {Moddle}
739
- */
740
- BaseViewer.prototype._createModdle = function(options) {
741
- const moddleOptions = assign({}, this._moddleExtensions, options.moddleExtensions);
742
-
743
- return new BpmnModdle(moddleOptions);
744
- };
745
-
746
- BaseViewer.prototype._modules = [];
747
-
748
- // helpers ///////////////
749
-
750
- function addWarningsToError(err, warningsAry) {
751
- err.warnings = warningsAry;
752
- return err;
753
- }
754
-
755
- function checkValidationError(err) {
756
-
757
- // check if we can help the user by indicating wrong BPMN 2.0 xml
758
- // (in case he or the exporting tool did not get that right)
759
-
760
- const pattern = /unparsable content <([^>]+)> detected([\s\S]*)$/;
761
- const match = pattern.exec(err.message);
762
-
763
- if (match) {
764
- err.message =
765
- 'unparsable content <' + match[1] + '> detected; ' +
766
- 'this may indicate an invalid BPMN 2.0 diagram file' + match[2];
767
- }
768
-
769
- return err;
770
- }
771
-
772
- const DEFAULT_OPTIONS = {
773
- width: '100%',
774
- height: '100%',
775
- position: 'relative'
776
- };
777
-
778
-
779
- /**
780
- * Ensure the passed argument is a proper unit (defaulting to px)
781
- */
782
- function ensureUnit(val) {
783
- return val + (isNumber(val) ? 'px' : '');
784
- }
785
-
786
-
787
- /**
788
- * Find BPMNDiagram in definitions by ID
789
- *
790
- * @param {ModdleElement<Definitions>} definitions
791
- * @param {string} diagramId
792
- *
793
- * @return {ModdleElement<BPMNDiagram>|null}
794
- */
795
- function findBPMNDiagram(definitions, diagramId) {
796
- if (!diagramId) {
797
- return null;
798
- }
799
-
800
- return find(definitions.diagrams, function(element) {
801
- return element.id === diagramId;
802
- }) || null;
803
- }
804
-
805
-
806
- /* <project-logo> */
807
-
808
- import {
809
- open as openPoweredBy,
810
- BPMNIO_IMG,
811
- LOGO_STYLES,
812
- LINK_STYLES
813
- } from './util/PoweredByUtil';
814
-
815
- import {
816
- event as domEvent
817
- } from 'min-dom';
818
-
819
- /**
820
- * Adds the project logo to the diagram container as
821
- * required by the bpmn.io license.
822
- *
823
- * @see http://bpmn.io/license
824
- *
825
- * @param {Element} container
826
- */
827
- function addProjectLogo(container) {
828
- const img = BPMNIO_IMG;
829
-
830
- const linkMarkup =
831
- '<a href="http://bpmn.io" ' +
832
- 'target="_blank" ' +
833
- 'class="bjs-powered-by" ' +
834
- 'title="Powered by bpmn.io" ' +
835
- '>' +
836
- img +
837
- '</a>';
838
-
839
- const linkElement = domify(linkMarkup);
840
-
841
- assignStyle(domQuery('svg', linkElement), LOGO_STYLES);
842
- assignStyle(linkElement, LINK_STYLES, {
843
- position: 'absolute',
844
- bottom: '15px',
845
- right: '15px',
846
- zIndex: '100'
847
- });
848
-
849
- container.appendChild(linkElement);
850
-
851
- domEvent.bind(linkElement, 'click', function(event) {
852
- openPoweredBy();
853
-
854
- event.preventDefault();
855
- });
856
- }
857
-
858
- /* </project-logo> */
1
+ /**
2
+ * The code in the <project-logo></project-logo> area
3
+ * must not be changed.
4
+ *
5
+ * @see http://bpmn.io/license for more information.
6
+ */
7
+ import {
8
+ assign,
9
+ find,
10
+ isNumber,
11
+ omit
12
+ } from 'min-dash';
13
+
14
+ import {
15
+ domify,
16
+ assignStyle,
17
+ query as domQuery,
18
+ remove as domRemove
19
+ } from 'min-dom';
20
+
21
+ import {
22
+ innerSVG
23
+ } from 'tiny-svg';
24
+
25
+ import Diagram from 'diagram-js';
26
+ import BpmnModdle from 'bpmn-moddle';
27
+
28
+ import inherits from 'inherits-browser';
29
+
30
+ import {
31
+ importBpmnDiagram
32
+ } from './import/Importer';
33
+
34
+ /**
35
+ * @template T
36
+ *
37
+ * @typedef { import('diagram-js/lib/core/EventBus').default<T> } EventBus
38
+ */
39
+
40
+ /**
41
+ * @template T
42
+ *
43
+ * @typedef {import('diagram-js/lib/core/EventBus').EventBusEventCallback<T>} EventBusEventCallback
44
+ */
45
+
46
+ /**
47
+ * @typedef {import('didi').ModuleDeclaration} ModuleDeclaration
48
+ *
49
+ * @typedef {import('./model/Types').Moddle} Moddle
50
+ * @typedef {import('./model/Types').ModdleElement} ModdleElement
51
+ * @typedef {import('./model/Types').ModdleExtension} ModdleExtension
52
+ *
53
+ * @typedef { {
54
+ * width?: number|string;
55
+ * height?: number|string;
56
+ * position?: string;
57
+ * container?: string|HTMLElement;
58
+ * moddleExtensions?: ModdleExtensions;
59
+ * additionalModules?: ModuleDeclaration[];
60
+ * } & Record<string, any> } BaseViewerOptions
61
+ *
62
+ * @typedef {Record<string, ModdleElement>} ModdleElementsById
63
+ *
64
+ * @typedef { {
65
+ * [key: string]: ModdleExtension;
66
+ * } } ModdleExtensions
67
+ *
68
+ * @typedef { {
69
+ * warnings: string[];
70
+ * } } ImportXMLResult
71
+ *
72
+ * @typedef {ImportXMLResult & Error} ImportXMLError
73
+ *
74
+ * @typedef {ImportXMLResult} ImportDefinitionsResult
75
+ *
76
+ * @typedef {ImportXMLError} ImportDefinitionsError
77
+ *
78
+ * @typedef {ImportXMLResult} OpenResult
79
+ *
80
+ * @typedef {ImportXMLError} OpenError
81
+ *
82
+ * @typedef { {
83
+ * format?: boolean;
84
+ * preamble?: boolean;
85
+ * } } SaveXMLOptions
86
+ *
87
+ * @typedef { {
88
+ * xml?: string;
89
+ * error?: Error;
90
+ * } } SaveXMLResult
91
+ *
92
+ * @typedef { {
93
+ * svg: string;
94
+ * } } SaveSVGResult
95
+ *
96
+ * @typedef { {
97
+ * xml: string;
98
+ * } } ImportParseStartEvent
99
+ *
100
+ * @typedef { {
101
+ * error?: ImportXMLError;
102
+ * definitions?: ModdleElement;
103
+ * elementsById?: ModdleElementsById;
104
+ * references?: ModdleElement[];
105
+ * warnings: string[];
106
+ * } } ImportParseCompleteEvent
107
+ *
108
+ * @typedef { {
109
+ * error?: ImportXMLError;
110
+ * warnings: string[];
111
+ * } } ImportDoneEvent
112
+ *
113
+ * @typedef { {
114
+ * definitions: ModdleElement;
115
+ * } } SaveXMLStartEvent
116
+ *
117
+ * @typedef {SaveXMLResult} SaveXMLDoneEvent
118
+ *
119
+ * @typedef { {
120
+ * error?: Error;
121
+ * svg: string;
122
+ * } } SaveSVGDoneEvent
123
+ */
124
+
125
+ /**
126
+ * @template Type
127
+ *
128
+ * @typedef { Type extends { eventBus: EventBus<infer X> } ? X : never } EventMap
129
+ */
130
+
131
+ /**
132
+ * A base viewer for BPMN 2.0 diagrams.
133
+ *
134
+ * Have a look at {@link bpmn-js/lib/Viewer}, {@link bpmn-js/lib/NavigatedViewer} or {@link bpmn-js/lib/Modeler} for
135
+ * bundles that include actual features.
136
+ *
137
+ * @template [ServiceMap=null]
138
+ *
139
+ * @extends Diagram<ServiceMap>
140
+ *
141
+ * @param {BaseViewerOptions} [options] The options to configure the viewer.
142
+ */
143
+ export default function BaseViewer(options) {
144
+
145
+ /**
146
+ * @type {BaseViewerOptions}
147
+ */
148
+ options = assign({}, DEFAULT_OPTIONS, options);
149
+
150
+ /**
151
+ * @type {Moddle}
152
+ */
153
+ this._moddle = this._createModdle(options);
154
+
155
+ /**
156
+ * @type {HTMLElement}
157
+ */
158
+ this._container = this._createContainer(options);
159
+
160
+ /* <project-logo> */
161
+
162
+ addProjectLogo(this._container);
163
+
164
+ /* </project-logo> */
165
+
166
+ this._init(this._container, this._moddle, options);
167
+ }
168
+
169
+ inherits(BaseViewer, Diagram);
170
+
171
+ /**
172
+ * Parse and render a BPMN 2.0 diagram.
173
+ *
174
+ * Once finished the viewer reports back the result to the
175
+ * provided callback function with (err, warnings).
176
+ *
177
+ * ## Life-Cycle Events
178
+ *
179
+ * During import the viewer will fire life-cycle events:
180
+ *
181
+ * * import.parse.start (about to read model from XML)
182
+ * * import.parse.complete (model read; may have worked or not)
183
+ * * import.render.start (graphical import start)
184
+ * * import.render.complete (graphical import finished)
185
+ * * import.done (everything done)
186
+ *
187
+ * You can use these events to hook into the life-cycle.
188
+ *
189
+ * @throws {ImportXMLError} An error thrown during the import of the XML.
190
+ *
191
+ * @fires BaseViewer#ImportParseStartEvent
192
+ * @fires BaseViewer#ImportParseCompleteEvent
193
+ * @fires Importer#ImportRenderStartEvent
194
+ * @fires Importer#ImportRenderCompleteEvent
195
+ * @fires BaseViewer#ImportDoneEvent
196
+ *
197
+ * @param {string} xml The BPMN 2.0 XML to be imported.
198
+ * @param {ModdleElement|string} [bpmnDiagram] The optional diagram or Id of the BPMN diagram to open.
199
+ *
200
+ * @return {Promise<ImportXMLResult>} A promise resolving with warnings that were produced during the import.
201
+ */
202
+ BaseViewer.prototype.importXML = async function importXML(xml, bpmnDiagram) {
203
+
204
+ const self = this;
205
+
206
+ function ParseCompleteEvent(data) {
207
+ return self.get('eventBus').createEvent(data);
208
+ }
209
+
210
+ let aggregatedWarnings = [];
211
+ try {
212
+
213
+ // hook in pre-parse listeners +
214
+ // allow xml manipulation
215
+
216
+ /**
217
+ * A `import.parse.start` event.
218
+ *
219
+ * @event BaseViewer#ImportParseStartEvent
220
+ * @type {ImportParseStartEvent}
221
+ */
222
+ xml = this._emit('import.parse.start', { xml: xml }) || xml;
223
+
224
+ let parseResult;
225
+ try {
226
+ parseResult = await this._moddle.fromXML(xml, 'bpmn:Definitions');
227
+ } catch (error) {
228
+ this._emit('import.parse.complete', {
229
+ error
230
+ });
231
+
232
+ throw error;
233
+ }
234
+
235
+ let definitions = parseResult.rootElement;
236
+ const references = parseResult.references;
237
+ const parseWarnings = parseResult.warnings;
238
+ const elementsById = parseResult.elementsById;
239
+
240
+ aggregatedWarnings = aggregatedWarnings.concat(parseWarnings);
241
+
242
+ // hook in post parse listeners +
243
+ // allow definitions manipulation
244
+
245
+ /**
246
+ * A `import.parse.complete` event.
247
+ *
248
+ * @event BaseViewer#ImportParseCompleteEvent
249
+ * @type {ImportParseCompleteEvent}
250
+ */
251
+ definitions = this._emit('import.parse.complete', ParseCompleteEvent({
252
+ error: null,
253
+ definitions: definitions,
254
+ elementsById: elementsById,
255
+ references: references,
256
+ warnings: aggregatedWarnings
257
+ })) || definitions;
258
+
259
+ const importResult = await this.importDefinitions(definitions, bpmnDiagram);
260
+
261
+ aggregatedWarnings = aggregatedWarnings.concat(importResult.warnings);
262
+
263
+ /**
264
+ * A `import.parse.complete` event.
265
+ *
266
+ * @event BaseViewer#ImportDoneEvent
267
+ * @type {ImportDoneEvent}
268
+ */
269
+ this._emit('import.done', { error: null, warnings: aggregatedWarnings });
270
+
271
+ return { warnings: aggregatedWarnings };
272
+ } catch (err) {
273
+ let error = err;
274
+ aggregatedWarnings = aggregatedWarnings.concat(error.warnings || []);
275
+ addWarningsToError(error, aggregatedWarnings);
276
+
277
+ error = checkValidationError(error);
278
+
279
+ this._emit('import.done', { error, warnings: error.warnings });
280
+
281
+ throw error;
282
+ }
283
+ };
284
+
285
+
286
+ /**
287
+ * Import parsed definitions and render a BPMN 2.0 diagram.
288
+ *
289
+ * Once finished the viewer reports back the result to the
290
+ * provided callback function with (err, warnings).
291
+ *
292
+ * ## Life-Cycle Events
293
+ *
294
+ * During import the viewer will fire life-cycle events:
295
+ *
296
+ * * import.render.start (graphical import start)
297
+ * * import.render.complete (graphical import finished)
298
+ *
299
+ * You can use these events to hook into the life-cycle.
300
+ *
301
+ * @throws {ImportDefinitionsError} An error thrown during the import of the definitions.
302
+ *
303
+ * @param {ModdleElement} definitions The definitions.
304
+ * @param {ModdleElement|string} [bpmnDiagram] The optional diagram or ID of the BPMN diagram to open.
305
+ *
306
+ * @return {Promise<ImportDefinitionsResult>} A promise resolving with warnings that were produced during the import.
307
+ */
308
+ BaseViewer.prototype.importDefinitions = async function importDefinitions(definitions, bpmnDiagram) {
309
+ this._setDefinitions(definitions);
310
+ const result = await this.open(bpmnDiagram);
311
+
312
+ return { warnings: result.warnings };
313
+ };
314
+
315
+
316
+ /**
317
+ * Open diagram of previously imported XML.
318
+ *
319
+ * Once finished the viewer reports back the result to the
320
+ * provided callback function with (err, warnings).
321
+ *
322
+ * ## Life-Cycle Events
323
+ *
324
+ * During switch the viewer will fire life-cycle events:
325
+ *
326
+ * * import.render.start (graphical import start)
327
+ * * import.render.complete (graphical import finished)
328
+ *
329
+ * You can use these events to hook into the life-cycle.
330
+ *
331
+ * @throws {OpenError} An error thrown during opening.
332
+ *
333
+ * @param {ModdleElement|string} bpmnDiagramOrId The diagram or Id of the BPMN diagram to open.
334
+ *
335
+ * @return {Promise<OpenResult>} A promise resolving with warnings that were produced during opening.
336
+ */
337
+ BaseViewer.prototype.open = async function open(bpmnDiagramOrId) {
338
+
339
+ const definitions = this._definitions;
340
+ let bpmnDiagram = bpmnDiagramOrId;
341
+
342
+ if (!definitions) {
343
+ const error = new Error('no XML imported');
344
+ addWarningsToError(error, []);
345
+
346
+ throw error;
347
+ }
348
+
349
+ if (typeof bpmnDiagramOrId === 'string') {
350
+ bpmnDiagram = findBPMNDiagram(definitions, bpmnDiagramOrId);
351
+
352
+ if (!bpmnDiagram) {
353
+ const error = new Error('BPMNDiagram <' + bpmnDiagramOrId + '> not found');
354
+ addWarningsToError(error, []);
355
+
356
+ throw error;
357
+ }
358
+ }
359
+
360
+ // clear existing rendered diagram
361
+ // catch synchronous exceptions during #clear()
362
+ try {
363
+ this.clear();
364
+ } catch (error) {
365
+ addWarningsToError(error, []);
366
+
367
+ throw error;
368
+ }
369
+
370
+ // perform graphical import
371
+ const { warnings } = await importBpmnDiagram(this, definitions, bpmnDiagram);
372
+
373
+ return { warnings };
374
+ };
375
+
376
+ /**
377
+ * Export the currently displayed BPMN 2.0 diagram as
378
+ * a BPMN 2.0 XML document.
379
+ *
380
+ * ## Life-Cycle Events
381
+ *
382
+ * During XML saving the viewer will fire life-cycle events:
383
+ *
384
+ * * saveXML.start (before serialization)
385
+ * * saveXML.serialized (after xml generation)
386
+ * * saveXML.done (everything done)
387
+ *
388
+ * You can use these events to hook into the life-cycle.
389
+ *
390
+ * @throws {Error} An error thrown during export.
391
+ *
392
+ * @fires BaseViewer#SaveXMLStart
393
+ * @fires BaseViewer#SaveXMLDone
394
+ *
395
+ * @param {SaveXMLOptions} [options] The options.
396
+ *
397
+ * @return {Promise<SaveXMLResult>} A promise resolving with the XML.
398
+ */
399
+ BaseViewer.prototype.saveXML = async function saveXML(options) {
400
+
401
+ options = options || {};
402
+
403
+ let definitions = this._definitions,
404
+ error, xml;
405
+
406
+ try {
407
+ if (!definitions) {
408
+ throw new Error('no definitions loaded');
409
+ }
410
+
411
+ // allow to fiddle around with definitions
412
+
413
+ /**
414
+ * A `saveXML.start` event.
415
+ *
416
+ * @event BaseViewer#SaveXMLStartEvent
417
+ * @type {SaveXMLStartEvent}
418
+ */
419
+ definitions = this._emit('saveXML.start', {
420
+ definitions
421
+ }) || definitions;
422
+
423
+ const result = await this._moddle.toXML(definitions, options);
424
+ xml = result.xml;
425
+
426
+ xml = this._emit('saveXML.serialized', {
427
+ xml
428
+ }) || xml;
429
+ } catch (err) {
430
+ error = err;
431
+ }
432
+
433
+ const result = error ? { error } : { xml };
434
+
435
+ /**
436
+ * A `saveXML.done` event.
437
+ *
438
+ * @event BaseViewer#SaveXMLDoneEvent
439
+ * @type {SaveXMLDoneEvent}
440
+ */
441
+ this._emit('saveXML.done', result);
442
+
443
+ if (error) {
444
+ throw error;
445
+ }
446
+
447
+ return result;
448
+ };
449
+
450
+
451
+ /**
452
+ * Export the currently displayed BPMN 2.0 diagram as
453
+ * an SVG image.
454
+ *
455
+ * ## Life-Cycle Events
456
+ *
457
+ * During SVG saving the viewer will fire life-cycle events:
458
+ *
459
+ * * saveSVG.start (before serialization)
460
+ * * saveSVG.done (everything done)
461
+ *
462
+ * You can use these events to hook into the life-cycle.
463
+ *
464
+ * @throws {Error} An error thrown during export.
465
+ *
466
+ * @fires BaseViewer#SaveSVGDone
467
+ *
468
+ * @return {Promise<SaveSVGResult>} A promise resolving with the SVG.
469
+ */
470
+ BaseViewer.prototype.saveSVG = async function saveSVG() {
471
+ this._emit('saveSVG.start');
472
+
473
+ let svg, err;
474
+
475
+ try {
476
+ const canvas = this.get('canvas');
477
+
478
+ const contentNode = canvas.getActiveLayer(),
479
+ defsNode = domQuery('defs', canvas._svg);
480
+
481
+ const contents = innerSVG(contentNode),
482
+ defs = defsNode ? '<defs>' + innerSVG(defsNode) + '</defs>' : '';
483
+
484
+ const bbox = contentNode.getBBox();
485
+
486
+ svg =
487
+ '<?xml version="1.0" encoding="utf-8"?>\n' +
488
+ '<!-- created with bpmn-js / http://bpmn.io -->\n' +
489
+ '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\n' +
490
+ '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" ' +
491
+ 'width="' + bbox.width + '" height="' + bbox.height + '" ' +
492
+ 'viewBox="' + bbox.x + ' ' + bbox.y + ' ' + bbox.width + ' ' + bbox.height + '" version="1.1">' +
493
+ defs + contents +
494
+ '</svg>';
495
+ } catch (e) {
496
+ err = e;
497
+ }
498
+
499
+ /**
500
+ * A `saveSVG.done` event.
501
+ *
502
+ * @event BaseViewer#SaveSVGDoneEvent
503
+ * @type {SaveSVGDoneEvent}
504
+ */
505
+ this._emit('saveSVG.done', {
506
+ error: err,
507
+ svg: svg
508
+ });
509
+
510
+ if (err) {
511
+ throw err;
512
+ }
513
+
514
+ return { svg };
515
+ };
516
+
517
+ BaseViewer.prototype._setDefinitions = function(definitions) {
518
+ this._definitions = definitions;
519
+ };
520
+
521
+ /**
522
+ * Return modules to instantiate with.
523
+ *
524
+ * @return {ModuleDeclaration[]} The modules.
525
+ */
526
+ BaseViewer.prototype.getModules = function() {
527
+ return this._modules;
528
+ };
529
+
530
+ /**
531
+ * Remove all drawn elements from the viewer.
532
+ *
533
+ * After calling this method the viewer can still be reused for opening another
534
+ * diagram.
535
+ */
536
+ BaseViewer.prototype.clear = function() {
537
+ if (!this.getDefinitions()) {
538
+
539
+ // no diagram to clear
540
+ return;
541
+ }
542
+
543
+ // remove drawn elements
544
+ Diagram.prototype.clear.call(this);
545
+ };
546
+
547
+ /**
548
+ * Destroy the viewer instance and remove all its remainders from the document
549
+ * tree.
550
+ */
551
+ BaseViewer.prototype.destroy = function() {
552
+
553
+ // diagram destroy
554
+ Diagram.prototype.destroy.call(this);
555
+
556
+ // dom detach
557
+ domRemove(this._container);
558
+ };
559
+
560
+ /**
561
+ * @overlord
562
+ *
563
+ * Register an event listener for events with the given name.
564
+ *
565
+ * The callback will be invoked with `event, ...additionalArguments`
566
+ * that have been passed to {@link EventBus#fire}.
567
+ *
568
+ * Returning false from a listener will prevent the events default action
569
+ * (if any is specified). To stop an event from being processed further in
570
+ * other listeners execute {@link Event#stopPropagation}.
571
+ *
572
+ * Returning anything but `undefined` from a listener will stop the listener propagation.
573
+ *
574
+ * @template T
575
+ *
576
+ * @param {string|string[]} events The event(s) to listen to.
577
+ * @param {number} [priority] The priority with which to listen.
578
+ * @param {EventBusEventCallback<T>} callback The callback.
579
+ * @param {any} [that] Value of `this` the callback will be called with.
580
+ */
581
+ /**
582
+ * Register an event listener for events with the given name.
583
+ *
584
+ * The callback will be invoked with `event, ...additionalArguments`
585
+ * that have been passed to {@link EventBus#fire}.
586
+ *
587
+ * Returning false from a listener will prevent the events default action
588
+ * (if any is specified). To stop an event from being processed further in
589
+ * other listeners execute {@link Event#stopPropagation}.
590
+ *
591
+ * Returning anything but `undefined` from a listener will stop the listener propagation.
592
+ *
593
+ * @template {keyof EventMap<ServiceMap>} EventName
594
+ *
595
+ * @param {EventName} events to subscribe to
596
+ * @param {number} [priority=1000] listen priority
597
+ * @param {EventBusEventCallback<(EventMap<ServiceMap>)[EventName]>} callback
598
+ * @param {any} [that] callback context
599
+ */
600
+ BaseViewer.prototype.on = function(events, priority, callback, that) {
601
+ return this.get('eventBus').on(events, priority, callback, that);
602
+ };
603
+
604
+ /**
605
+ * Remove an event listener.
606
+ *
607
+ * @param {string|string[]} events The event(s).
608
+ * @param {Function} [callback] The callback.
609
+ */
610
+ BaseViewer.prototype.off = function(events, callback) {
611
+ this.get('eventBus').off(events, callback);
612
+ };
613
+
614
+ /**
615
+ * Attach the viewer to an HTML element.
616
+ *
617
+ * @param {HTMLElement} parentNode The parent node to attach to.
618
+ */
619
+ BaseViewer.prototype.attachTo = function(parentNode) {
620
+
621
+ if (!parentNode) {
622
+ throw new Error('parentNode required');
623
+ }
624
+
625
+ // ensure we detach from the
626
+ // previous, old parent
627
+ this.detach();
628
+
629
+ // unwrap jQuery if provided
630
+ if (parentNode.get && parentNode.constructor.prototype.jquery) {
631
+ parentNode = parentNode.get(0);
632
+ }
633
+
634
+ if (typeof parentNode === 'string') {
635
+ parentNode = domQuery(parentNode);
636
+ }
637
+
638
+ parentNode.appendChild(this._container);
639
+
640
+ this._emit('attach', {});
641
+
642
+ this.get('canvas').resized();
643
+ };
644
+
645
+ /**
646
+ * Get the definitions model element.
647
+ *
648
+ * @return {ModdleElement} The definitions model element.
649
+ */
650
+ BaseViewer.prototype.getDefinitions = function() {
651
+ return this._definitions;
652
+ };
653
+
654
+ /**
655
+ * Detach the viewer.
656
+ *
657
+ * @fires BaseViewer#DetachEvent
658
+ */
659
+ BaseViewer.prototype.detach = function() {
660
+
661
+ const container = this._container,
662
+ parentNode = container.parentNode;
663
+
664
+ if (!parentNode) {
665
+ return;
666
+ }
667
+
668
+ /**
669
+ * A `detach` event.
670
+ *
671
+ * @event BaseViewer#DetachEvent
672
+ * @type {Object}
673
+ */
674
+ this._emit('detach', {});
675
+
676
+ parentNode.removeChild(container);
677
+ };
678
+
679
+ BaseViewer.prototype._init = function(container, moddle, options) {
680
+
681
+ const baseModules = options.modules || this.getModules(options),
682
+ additionalModules = options.additionalModules || [],
683
+ staticModules = [
684
+ {
685
+ bpmnjs: [ 'value', this ],
686
+ moddle: [ 'value', moddle ]
687
+ }
688
+ ];
689
+
690
+ const diagramModules = [].concat(staticModules, baseModules, additionalModules);
691
+
692
+ const diagramOptions = assign(omit(options, [ 'additionalModules' ]), {
693
+ canvas: assign({}, options.canvas, { container: container }),
694
+ modules: diagramModules
695
+ });
696
+
697
+ // invoke diagram constructor
698
+ Diagram.call(this, diagramOptions);
699
+
700
+ if (options && options.container) {
701
+ this.attachTo(options.container);
702
+ }
703
+ };
704
+
705
+ /**
706
+ * Emit an event on the underlying {@link EventBus}
707
+ *
708
+ * @param {string} type
709
+ * @param {Object} event
710
+ *
711
+ * @return {Object} The return value after calling all event listeners.
712
+ */
713
+ BaseViewer.prototype._emit = function(type, event) {
714
+ return this.get('eventBus').fire(type, event);
715
+ };
716
+
717
+ /**
718
+ * @param {BaseViewerOptions} options
719
+ *
720
+ * @return {HTMLElement}
721
+ */
722
+ BaseViewer.prototype._createContainer = function(options) {
723
+
724
+ const container = domify('<div class="bjs-container"></div>');
725
+
726
+ assignStyle(container, {
727
+ width: ensureUnit(options.width),
728
+ height: ensureUnit(options.height),
729
+ position: options.position
730
+ });
731
+
732
+ return container;
733
+ };
734
+
735
+ /**
736
+ * @param {BaseViewerOptions} options
737
+ *
738
+ * @return {Moddle}
739
+ */
740
+ BaseViewer.prototype._createModdle = function(options) {
741
+ const moddleOptions = assign({}, this._moddleExtensions, options.moddleExtensions);
742
+
743
+ return new BpmnModdle(moddleOptions);
744
+ };
745
+
746
+ BaseViewer.prototype._modules = [];
747
+
748
+ // helpers ///////////////
749
+
750
+ function addWarningsToError(err, warningsAry) {
751
+ err.warnings = warningsAry;
752
+ return err;
753
+ }
754
+
755
+ function checkValidationError(err) {
756
+
757
+ // check if we can help the user by indicating wrong BPMN 2.0 xml
758
+ // (in case he or the exporting tool did not get that right)
759
+
760
+ const pattern = /unparsable content <([^>]+)> detected([\s\S]*)$/;
761
+ const match = pattern.exec(err.message);
762
+
763
+ if (match) {
764
+ err.message =
765
+ 'unparsable content <' + match[1] + '> detected; ' +
766
+ 'this may indicate an invalid BPMN 2.0 diagram file' + match[2];
767
+ }
768
+
769
+ return err;
770
+ }
771
+
772
+ const DEFAULT_OPTIONS = {
773
+ width: '100%',
774
+ height: '100%',
775
+ position: 'relative'
776
+ };
777
+
778
+
779
+ /**
780
+ * Ensure the passed argument is a proper unit (defaulting to px)
781
+ */
782
+ function ensureUnit(val) {
783
+ return val + (isNumber(val) ? 'px' : '');
784
+ }
785
+
786
+
787
+ /**
788
+ * Find BPMNDiagram in definitions by ID
789
+ *
790
+ * @param {ModdleElement<Definitions>} definitions
791
+ * @param {string} diagramId
792
+ *
793
+ * @return {ModdleElement<BPMNDiagram>|null}
794
+ */
795
+ function findBPMNDiagram(definitions, diagramId) {
796
+ if (!diagramId) {
797
+ return null;
798
+ }
799
+
800
+ return find(definitions.diagrams, function(element) {
801
+ return element.id === diagramId;
802
+ }) || null;
803
+ }
804
+
805
+
806
+ /* <project-logo> */
807
+
808
+ import {
809
+ open as openPoweredBy,
810
+ BPMNIO_IMG,
811
+ LOGO_STYLES,
812
+ LINK_STYLES
813
+ } from './util/PoweredByUtil';
814
+
815
+ import {
816
+ event as domEvent
817
+ } from 'min-dom';
818
+
819
+ /**
820
+ * Adds the project logo to the diagram container as
821
+ * required by the bpmn.io license.
822
+ *
823
+ * @see http://bpmn.io/license
824
+ *
825
+ * @param {Element} container
826
+ */
827
+ function addProjectLogo(container) {
828
+ const img = BPMNIO_IMG;
829
+
830
+ const linkMarkup =
831
+ '<a href="http://bpmn.io" ' +
832
+ 'target="_blank" ' +
833
+ 'class="bjs-powered-by" ' +
834
+ 'title="Powered by bpmn.io" ' +
835
+ '>' +
836
+ img +
837
+ '</a>';
838
+
839
+ const linkElement = domify(linkMarkup);
840
+
841
+ assignStyle(domQuery('svg', linkElement), LOGO_STYLES);
842
+ assignStyle(linkElement, LINK_STYLES, {
843
+ position: 'absolute',
844
+ bottom: '15px',
845
+ right: '15px',
846
+ zIndex: '100'
847
+ });
848
+
849
+ container.appendChild(linkElement);
850
+
851
+ domEvent.bind(linkElement, 'click', function(event) {
852
+ openPoweredBy();
853
+
854
+ event.preventDefault();
855
+ });
856
+ }
857
+
858
+ /* </project-logo> */