bpmn-js 18.2.0 → 18.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +23 -23
- package/README.md +95 -95
- package/dist/assets/bpmn-js.css +145 -145
- package/dist/bpmn-modeler.development.js +38704 -38477
- package/dist/bpmn-modeler.production.min.js +11 -11
- package/dist/bpmn-navigated-viewer.development.js +21139 -21139
- package/dist/bpmn-navigated-viewer.production.min.js +1 -1
- package/dist/bpmn-viewer.development.js +21080 -21080
- package/dist/bpmn-viewer.production.min.js +1 -1
- package/lib/BaseModeler.d.ts +15 -15
- package/lib/BaseModeler.js +79 -79
- package/lib/BaseViewer.d.ts +352 -352
- package/lib/BaseViewer.js +858 -858
- package/lib/Modeler.d.ts +86 -86
- package/lib/Modeler.js +206 -206
- package/lib/NavigatedViewer.d.ts +11 -11
- package/lib/NavigatedViewer.js +37 -37
- package/lib/Viewer.d.ts +47 -47
- package/lib/Viewer.js +76 -76
- package/lib/core/index.d.ts +10 -10
- package/lib/core/index.js +8 -8
- package/lib/draw/BpmnRenderUtil.d.ts +123 -123
- package/lib/draw/BpmnRenderUtil.js +256 -256
- package/lib/draw/BpmnRenderer.d.ts +116 -116
- package/lib/draw/BpmnRenderer.js +2339 -2339
- package/lib/draw/PathMap.d.ts +330 -330
- package/lib/draw/PathMap.js +478 -478
- package/lib/draw/TextRenderer.d.ts +74 -74
- package/lib/draw/TextRenderer.js +136 -136
- package/lib/draw/index.d.ts +10 -10
- package/lib/draw/index.js +11 -11
- package/lib/features/align-elements/AlignElementsContextPadProvider.d.ts +32 -32
- package/lib/features/align-elements/AlignElementsContextPadProvider.js +105 -105
- package/lib/features/align-elements/AlignElementsIcons.d.ts +10 -10
- package/lib/features/align-elements/AlignElementsIcons.js +43 -43
- package/lib/features/align-elements/AlignElementsMenuProvider.d.ts +32 -32
- package/lib/features/align-elements/AlignElementsMenuProvider.js +100 -100
- package/lib/features/align-elements/BpmnAlignElements.d.ts +9 -9
- package/lib/features/align-elements/BpmnAlignElements.js +45 -45
- package/lib/features/align-elements/index.d.ts +11 -11
- package/lib/features/align-elements/index.js +23 -23
- package/lib/features/append-preview/AppendPreview.d.ts +36 -36
- package/lib/features/append-preview/AppendPreview.js +108 -108
- package/lib/features/append-preview/index.d.ts +16 -16
- package/lib/features/append-preview/index.js +15 -15
- package/lib/features/auto-place/BpmnAutoPlace.d.ts +15 -15
- package/lib/features/auto-place/BpmnAutoPlace.js +22 -22
- package/lib/features/auto-place/BpmnAutoPlaceUtil.d.ts +52 -52
- package/lib/features/auto-place/BpmnAutoPlaceUtil.js +226 -226
- package/lib/features/auto-place/index.d.ts +7 -7
- package/lib/features/auto-place/index.js +8 -8
- package/lib/features/auto-resize/BpmnAutoResize.d.ts +25 -25
- package/lib/features/auto-resize/BpmnAutoResize.js +45 -45
- package/lib/features/auto-resize/BpmnAutoResizeProvider.d.ts +26 -26
- package/lib/features/auto-resize/BpmnAutoResizeProvider.js +69 -69
- package/lib/features/auto-resize/index.d.ts +8 -8
- package/lib/features/auto-resize/index.js +12 -12
- package/lib/features/context-pad/ContextPadProvider.d.ts +62 -62
- package/lib/features/context-pad/ContextPadProvider.js +582 -582
- package/lib/features/context-pad/index.d.ts +7 -7
- package/lib/features/context-pad/index.js +22 -22
- package/lib/features/copy-paste/BpmnCopyPaste.d.ts +17 -17
- package/lib/features/copy-paste/BpmnCopyPaste.js +192 -192
- package/lib/features/copy-paste/ModdleCopy.d.ts +45 -45
- package/lib/features/copy-paste/index.d.ts +9 -9
- package/lib/features/copy-paste/index.js +13 -13
- package/lib/features/di-ordering/BpmnDiOrdering.d.ts +11 -11
- package/lib/features/di-ordering/BpmnDiOrdering.js +48 -48
- package/lib/features/di-ordering/index.d.ts +6 -6
- package/lib/features/di-ordering/index.js +7 -7
- package/lib/features/distribute-elements/BpmnDistributeElements.d.ts +10 -10
- package/lib/features/distribute-elements/BpmnDistributeElements.js +60 -60
- package/lib/features/distribute-elements/DistributeElementsIcons.d.ts +5 -5
- package/lib/features/distribute-elements/DistributeElementsIcons.js +18 -18
- package/lib/features/distribute-elements/DistributeElementsMenuProvider.d.ts +32 -32
- package/lib/features/distribute-elements/DistributeElementsMenuProvider.js +92 -92
- package/lib/features/distribute-elements/index.d.ts +9 -9
- package/lib/features/distribute-elements/index.js +19 -19
- package/lib/features/drilldown/DrilldownBreadcrumbs.d.ts +19 -19
- package/lib/features/drilldown/DrilldownBreadcrumbs.js +138 -138
- package/lib/features/drilldown/DrilldownCentering.d.ts +17 -17
- package/lib/features/drilldown/DrilldownCentering.js +122 -122
- package/lib/features/drilldown/DrilldownOverlayBehavior.d.ts +20 -20
- package/lib/features/drilldown/DrilldownOverlayBehavior.js +218 -218
- package/lib/features/drilldown/SubprocessCompatibility.d.ts +21 -21
- package/lib/features/drilldown/SubprocessCompatibility.js +266 -266
- package/lib/features/drilldown/index.d.ts +13 -13
- package/lib/features/drilldown/index.js +16 -16
- package/lib/features/editor-actions/BpmnEditorActions.d.ts +13 -13
- package/lib/features/editor-actions/BpmnEditorActions.js +187 -187
- package/lib/features/editor-actions/index.d.ts +6 -6
- package/lib/features/editor-actions/index.js +10 -10
- package/lib/features/grid-snapping/BpmnGridSnapping.d.ts +9 -9
- package/lib/features/grid-snapping/behavior/GridSnappingAutoPlaceBehavior.d.ts +14 -14
- package/lib/features/grid-snapping/behavior/GridSnappingLayoutConnectionBehavior.d.ts +27 -27
- package/lib/features/grid-snapping/behavior/GridSnappingLayoutConnectionBehavior.js +155 -155
- package/lib/features/grid-snapping/behavior/GridSnappingParticipantBehavior.d.ts +13 -13
- package/lib/features/grid-snapping/behavior/index.d.ts +10 -10
- package/lib/features/grid-snapping/index.d.ts +11 -11
- package/lib/features/interaction-events/BpmnInteractionEvents.d.ts +18 -18
- package/lib/features/interaction-events/BpmnInteractionEvents.js +146 -146
- package/lib/features/interaction-events/index.d.ts +6 -6
- package/lib/features/interaction-events/index.js +5 -5
- package/lib/features/keyboard/BpmnKeyboardBindings.d.ts +15 -15
- package/lib/features/keyboard/BpmnKeyboardBindings.js +179 -179
- package/lib/features/keyboard/index.d.ts +7 -7
- package/lib/features/keyboard/index.js +11 -11
- package/lib/features/label-editing/LabelEditingPreview.d.ts +13 -13
- package/lib/features/label-editing/LabelEditingPreview.js +145 -145
- package/lib/features/label-editing/LabelEditingProvider.d.ts +62 -62
- package/lib/features/label-editing/LabelEditingProvider.js +519 -519
- package/lib/features/label-editing/LabelUtil.d.ts +1 -1
- package/lib/features/label-editing/LabelUtil.js +4 -4
- package/lib/features/label-editing/cmd/UpdateLabelHandler.d.ts +22 -22
- package/lib/features/label-editing/cmd/UpdateLabelHandler.js +149 -149
- package/lib/features/label-editing/index.d.ts +9 -9
- package/lib/features/label-editing/index.js +21 -21
- package/lib/features/modeling/BpmnFactory.d.ts +73 -73
- package/lib/features/modeling/BpmnFactory.js +180 -180
- package/lib/features/modeling/BpmnLayouter.d.ts +30 -30
- package/lib/features/modeling/BpmnLayouter.js +488 -488
- package/lib/features/modeling/BpmnUpdater.d.ts +90 -90
- package/lib/features/modeling/BpmnUpdater.js +818 -818
- package/lib/features/modeling/ElementFactory.d.ts +117 -117
- package/lib/features/modeling/ElementFactory.js +412 -412
- package/lib/features/modeling/ElementFactory.test.ts +132 -132
- package/lib/features/modeling/Modeling.d.ts +150 -150
- package/lib/features/modeling/Modeling.js +309 -309
- package/lib/features/modeling/Modeling.test.ts +147 -147
- package/lib/features/modeling/behavior/AdaptiveLabelPositioningBehavior.d.ts +19 -19
- package/lib/features/modeling/behavior/AdaptiveLabelPositioningBehavior.js +288 -288
- package/lib/features/modeling/behavior/AppendBehavior.d.ts +6 -6
- package/lib/features/modeling/behavior/AppendBehavior.js +42 -42
- package/lib/features/modeling/behavior/AssociationBehavior.d.ts +11 -11
- package/lib/features/modeling/behavior/AttachEventBehavior.d.ts +15 -15
- package/lib/features/modeling/behavior/AttachEventBehavior.js +106 -106
- package/lib/features/modeling/behavior/BoundaryEventBehavior.d.ts +15 -15
- package/lib/features/modeling/behavior/BoundaryEventBehavior.js +74 -74
- package/lib/features/modeling/behavior/CompensateBoundaryEventBehavior.d.ts +17 -17
- package/lib/features/modeling/behavior/CompensateBoundaryEventBehavior.js +222 -222
- package/lib/features/modeling/behavior/CreateBehavior.d.ts +9 -9
- package/lib/features/modeling/behavior/CreateBehavior.js +33 -33
- package/lib/features/modeling/behavior/CreateDataObjectBehavior.d.ts +15 -15
- package/lib/features/modeling/behavior/CreateDataObjectBehavior.js +43 -43
- package/lib/features/modeling/behavior/CreateParticipantBehavior.d.ts +19 -19
- package/lib/features/modeling/behavior/CreateParticipantBehavior.js +237 -237
- package/lib/features/modeling/behavior/DataInputAssociationBehavior.d.ts +21 -21
- package/lib/features/modeling/behavior/DataInputAssociationBehavior.js +162 -162
- package/lib/features/modeling/behavior/DataStoreBehavior.d.ts +19 -19
- package/lib/features/modeling/behavior/DeleteLaneBehavior.d.ts +15 -15
- package/lib/features/modeling/behavior/DeleteLaneBehavior.js +162 -162
- package/lib/features/modeling/behavior/DetachEventBehavior.d.ts +15 -15
- package/lib/features/modeling/behavior/DetachEventBehavior.js +101 -101
- package/lib/features/modeling/behavior/DropOnFlowBehavior.d.ts +13 -13
- package/lib/features/modeling/behavior/DropOnFlowBehavior.js +221 -221
- package/lib/features/modeling/behavior/EventBasedGatewayBehavior.d.ts +11 -11
- package/lib/features/modeling/behavior/EventBasedGatewayBehavior.js +110 -110
- package/lib/features/modeling/behavior/FixHoverBehavior.d.ts +17 -17
- package/lib/features/modeling/behavior/GroupBehavior.d.ts +26 -26
- package/lib/features/modeling/behavior/ImportDockingFix.d.ts +13 -13
- package/lib/features/modeling/behavior/ImportDockingFix.js +83 -83
- package/lib/features/modeling/behavior/IsHorizontalFix.d.ts +10 -10
- package/lib/features/modeling/behavior/IsHorizontalFix.js +54 -54
- package/lib/features/modeling/behavior/LabelBehavior.d.ts +56 -56
- package/lib/features/modeling/behavior/LabelBehavior.js +364 -364
- package/lib/features/modeling/behavior/LayoutConnectionBehavior.d.ts +16 -16
- package/lib/features/modeling/behavior/LayoutConnectionBehavior.js +121 -121
- package/lib/features/modeling/behavior/MessageFlowBehavior.d.ts +15 -15
- package/lib/features/modeling/behavior/NonInterruptingBehavior.d.ts +4 -4
- package/lib/features/modeling/behavior/NonInterruptingBehavior.js +41 -41
- package/lib/features/modeling/behavior/RemoveElementBehavior.d.ts +13 -13
- package/lib/features/modeling/behavior/RemoveElementBehavior.js +91 -91
- package/lib/features/modeling/behavior/RemoveEmbeddedLabelBoundsBehavior.d.ts +16 -16
- package/lib/features/modeling/behavior/RemoveEmbeddedLabelBoundsBehavior.js +41 -41
- package/lib/features/modeling/behavior/RemoveParticipantBehavior.d.ts +15 -15
- package/lib/features/modeling/behavior/RemoveParticipantBehavior.js +59 -59
- package/lib/features/modeling/behavior/ReplaceConnectionBehavior.d.ts +15 -15
- package/lib/features/modeling/behavior/ReplaceConnectionBehavior.js +194 -194
- package/lib/features/modeling/behavior/ReplaceElementBehaviour.d.ts +23 -23
- package/lib/features/modeling/behavior/ReplaceElementBehaviour.js +144 -144
- package/lib/features/modeling/behavior/ResizeBehavior.d.ts +64 -64
- package/lib/features/modeling/behavior/ResizeBehavior.js +265 -265
- package/lib/features/modeling/behavior/ResizeLaneBehavior.d.ts +16 -16
- package/lib/features/modeling/behavior/ResizeLaneBehavior.js +70 -70
- package/lib/features/modeling/behavior/RootElementReferenceBehavior.d.ts +25 -25
- package/lib/features/modeling/behavior/SetCompensationActivityAfterPasteBehavior.d.ts +16 -16
- package/lib/features/modeling/behavior/SetCompensationActivityAfterPasteBehavior.js +66 -66
- package/lib/features/modeling/behavior/SpaceToolBehavior.d.ts +10 -10
- package/lib/features/modeling/behavior/SpaceToolBehavior.js +207 -207
- package/lib/features/modeling/behavior/SubProcessPlaneBehavior.d.ts +28 -28
- package/lib/features/modeling/behavior/SubProcessPlaneBehavior.js +588 -588
- package/lib/features/modeling/behavior/SubProcessStartEventBehavior.d.ts +15 -15
- package/lib/features/modeling/behavior/SubProcessStartEventBehavior.js +55 -55
- package/lib/features/modeling/behavior/TextAnnotationBehavior.d.ts +6 -6
- package/lib/features/modeling/behavior/TextAnnotationBehavior.js +42 -42
- package/lib/features/modeling/behavior/ToggleCollapseConnectionBehaviour.d.ts +14 -14
- package/lib/features/modeling/behavior/ToggleCollapseConnectionBehaviour.js +87 -87
- package/lib/features/modeling/behavior/ToggleElementCollapseBehaviour.d.ts +13 -13
- package/lib/features/modeling/behavior/ToggleElementCollapseBehaviour.js +156 -156
- package/lib/features/modeling/behavior/UnclaimIdBehavior.d.ts +19 -19
- package/lib/features/modeling/behavior/UnclaimIdBehavior.js +64 -64
- package/lib/features/modeling/behavior/UnsetDefaultFlowBehavior.d.ts +16 -16
- package/lib/features/modeling/behavior/UnsetDefaultFlowBehavior.js +59 -59
- package/lib/features/modeling/behavior/UpdateFlowNodeRefsBehavior.d.ts +15 -15
- package/lib/features/modeling/behavior/UpdateFlowNodeRefsBehavior.js +157 -157
- package/lib/features/modeling/behavior/index.d.ts +2 -2
- package/lib/features/modeling/behavior/index.js +131 -131
- package/lib/features/modeling/behavior/util/CategoryUtil.d.ts +49 -49
- package/lib/features/modeling/behavior/util/CategoryUtil.js +86 -86
- package/lib/features/modeling/behavior/util/ConnectionLayoutUtil.d.ts +19 -19
- package/lib/features/modeling/behavior/util/ConnectionLayoutUtil.js +22 -22
- package/lib/features/modeling/behavior/util/GeometricUtil.d.ts +1 -1
- package/lib/features/modeling/behavior/util/LabelLayoutUtil.d.ts +32 -32
- package/lib/features/modeling/behavior/util/LabelLayoutUtil.js +41 -41
- package/lib/features/modeling/behavior/util/LayoutUtil.d.ts +48 -48
- package/lib/features/modeling/behavior/util/LayoutUtil.js +259 -259
- package/lib/features/modeling/behavior/util/LineAttachmentUtil.d.ts +37 -37
- package/lib/features/modeling/behavior/util/LineAttachmentUtil.js +241 -241
- package/lib/features/modeling/behavior/util/LineIntersect.d.ts +13 -13
- package/lib/features/modeling/behavior/util/LineIntersect.js +39 -39
- package/lib/features/modeling/behavior/util/NonInterruptingUtil.d.ts +3 -3
- package/lib/features/modeling/behavior/util/NonInterruptingUtil.js +32 -32
- package/lib/features/modeling/behavior/util/ResizeUtil.d.ts +1 -1
- package/lib/features/modeling/cmd/AddLaneHandler.d.ts +22 -22
- package/lib/features/modeling/cmd/AddLaneHandler.js +187 -187
- package/lib/features/modeling/cmd/IdClaimHandler.d.ts +22 -22
- package/lib/features/modeling/cmd/IdClaimHandler.js +51 -51
- package/lib/features/modeling/cmd/ResizeLaneHandler.d.ts +39 -39
- package/lib/features/modeling/cmd/ResizeLaneHandler.js +146 -146
- package/lib/features/modeling/cmd/SetColorHandler.d.ts +18 -18
- package/lib/features/modeling/cmd/SplitLaneHandler.d.ts +20 -20
- package/lib/features/modeling/cmd/SplitLaneHandler.js +99 -99
- package/lib/features/modeling/cmd/UpdateCanvasRootHandler.d.ts +20 -20
- package/lib/features/modeling/cmd/UpdateCanvasRootHandler.js +99 -99
- package/lib/features/modeling/cmd/UpdateFlowNodeRefsHandler.d.ts +21 -21
- package/lib/features/modeling/cmd/UpdateFlowNodeRefsHandler.js +218 -218
- package/lib/features/modeling/cmd/UpdateModdlePropertiesHandler.d.ts +20 -20
- package/lib/features/modeling/cmd/UpdateModdlePropertiesHandler.js +107 -107
- package/lib/features/modeling/cmd/UpdatePropertiesHandler.d.ts +58 -58
- package/lib/features/modeling/cmd/UpdatePropertiesHandler.js +260 -260
- package/lib/features/modeling/cmd/UpdateSemanticParentHandler.d.ts +18 -18
- package/lib/features/modeling/index.d.ts +27 -27
- package/lib/features/modeling/index.js +45 -45
- package/lib/features/modeling/util/LaneUtil.d.ts +46 -46
- package/lib/features/modeling/util/LaneUtil.js +188 -188
- package/lib/features/modeling/util/ModelingUtil.d.ts +23 -23
- package/lib/features/modeling/util/ModelingUtil.js +88 -88
- package/lib/features/modeling-feedback/ModelingFeedback.d.ts +13 -13
- package/lib/features/modeling-feedback/ModelingFeedback.js +46 -46
- package/lib/features/modeling-feedback/index.d.ts +7 -7
- package/lib/features/modeling-feedback/index.js +12 -12
- package/lib/features/ordering/BpmnOrderingProvider.d.ts +19 -19
- package/lib/features/ordering/BpmnOrderingProvider.js +191 -191
- package/lib/features/ordering/index.d.ts +6 -6
- package/lib/features/ordering/index.js +5 -5
- package/lib/features/outline/OutlineProvider.d.ts +39 -39
- package/lib/features/outline/OutlineProvider.js +189 -189
- package/lib/features/outline/OutlineUtil.d.ts +23 -23
- package/lib/features/outline/OutlineUtil.js +35 -35
- package/lib/features/outline/index.d.ts +7 -7
- package/lib/features/outline/index.js +10 -10
- package/lib/features/palette/PaletteProvider.d.ts +34 -34
- package/lib/features/palette/PaletteProvider.js +214 -214
- package/lib/features/palette/index.d.ts +9 -9
- package/lib/features/palette/index.js +23 -23
- package/lib/features/popup-menu/ReplaceMenuProvider.d.ts +52 -52
- package/lib/features/popup-menu/ReplaceMenuProvider.js +656 -629
- package/lib/features/popup-menu/index.d.ts +11 -11
- package/lib/features/popup-menu/index.js +16 -16
- package/lib/features/popup-menu/util/Icons.d.ts +5 -5
- package/lib/features/popup-menu/util/Icons.js +14 -14
- package/lib/features/popup-menu/util/TypeUtil.d.ts +14 -14
- package/lib/features/popup-menu/util/TypeUtil.js +52 -52
- package/lib/features/replace/BpmnReplace.d.ts +45 -45
- package/lib/features/replace/BpmnReplace.js +391 -391
- package/lib/features/replace/ReplaceOptions.d.ts +85 -79
- package/lib/features/replace/ReplaceOptions.js +1198 -998
- package/lib/features/replace/index.d.ts +9 -9
- package/lib/features/replace/index.js +14 -14
- package/lib/features/replace-preview/BpmnReplacePreview.d.ts +17 -17
- package/lib/features/replace-preview/BpmnReplacePreview.js +139 -139
- package/lib/features/replace-preview/index.d.ts +7 -7
- package/lib/features/replace-preview/index.js +11 -11
- package/lib/features/rules/BpmnRules.d.ts +181 -181
- package/lib/features/rules/BpmnRules.js +1191 -1191
- package/lib/features/rules/index.d.ts +7 -7
- package/lib/features/rules/index.js +11 -11
- package/lib/features/search/BpmnSearchProvider.d.ts +34 -34
- package/lib/features/search/BpmnSearchProvider.js +91 -91
- package/lib/features/search/index.d.ts +7 -7
- package/lib/features/search/index.js +14 -14
- package/lib/features/snapping/BpmnConnectSnapping.d.ts +17 -17
- package/lib/features/snapping/BpmnCreateMoveSnapping.d.ts +41 -41
- package/lib/features/snapping/BpmnCreateMoveSnapping.js +289 -289
- package/lib/features/snapping/BpmnSnappingUtil.d.ts +11 -11
- package/lib/features/snapping/index.d.ts +9 -9
- package/lib/features/snapping/index.js +12 -12
- package/lib/features/space-tool/BpmnSpaceTool.d.ts +21 -21
- package/lib/features/space-tool/BpmnSpaceTool.js +69 -69
- package/lib/features/space-tool/index.d.ts +6 -6
- package/lib/features/space-tool/index.js +7 -7
- package/lib/import/BpmnImporter.d.ts +51 -51
- package/lib/import/BpmnImporter.js +363 -363
- package/lib/import/BpmnTreeWalker.d.ts +20 -20
- package/lib/import/BpmnTreeWalker.js +453 -453
- package/lib/import/Importer.d.ts +25 -25
- package/lib/import/Importer.js +222 -222
- package/lib/import/Util.d.ts +1 -1
- package/lib/import/Util.js +6 -6
- package/lib/import/index.d.ts +6 -6
- package/lib/import/index.js +9 -9
- package/lib/index.d.ts +1 -1
- package/lib/index.js +2 -2
- package/lib/model/Types.d.ts +25 -25
- package/lib/model/Types.ts +40 -40
- package/lib/util/CompatibilityUtil.d.ts +8 -8
- package/lib/util/CompatibilityUtil.js +29 -29
- package/lib/util/DiUtil.d.ts +60 -60
- package/lib/util/DiUtil.js +122 -122
- package/lib/util/DrilldownUtil.d.ts +39 -39
- package/lib/util/DrilldownUtil.js +69 -69
- package/lib/util/LabelUtil.d.ts +83 -83
- package/lib/util/LabelUtil.js +266 -266
- package/lib/util/ModelUtil.d.ts +40 -40
- package/lib/util/ModelUtil.js +58 -58
- package/lib/util/PoweredByUtil.d.ts +8 -8
- package/lib/util/PoweredByUtil.js +99 -99
- package/lib/util/Types.js +4 -4
- package/lib/util/Types.ts +3 -3
- package/package.json +131 -131
- package/test/helper/TranslationCollector.js +15 -15
- package/test/helper/index.js +313 -313
- package/test/matchers/BoundsMatchers.js +252 -252
- package/test/matchers/ConnectionMatchers.js +165 -165
- package/test/matchers/JSONMatcher.js +19 -19
- package/test/util/KeyEvents.js +22 -22
- package/test/util/MockEvents.js +61 -61
- package/test/util/custom-rules/CustomRules.js +16 -16
- 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
|
-
this._init(this._container, this._moddle, options);
|
|
161
|
-
|
|
162
|
-
/* <project-logo> */
|
|
163
|
-
|
|
164
|
-
addProjectLogo(this._container);
|
|
165
|
-
|
|
166
|
-
/* </project-logo> */
|
|
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(':scope > 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
|
+
this._init(this._container, this._moddle, options);
|
|
161
|
+
|
|
162
|
+
/* <project-logo> */
|
|
163
|
+
|
|
164
|
+
addProjectLogo(this._container);
|
|
165
|
+
|
|
166
|
+
/* </project-logo> */
|
|
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(':scope > 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> */
|