feat(import): attach boundary events
* establish host <> attachers relationship * clean up import tests (use diagrams in fixtures/bpmn/import) closes #310
This commit is contained in:
parent
912c384a24
commit
acb2184087
|
@ -5,6 +5,8 @@ var assign = require('lodash/object/assign'),
|
|||
|
||||
var LabelUtil = require('../util/LabelUtil');
|
||||
|
||||
var is = require('../util/ModelUtil').is;
|
||||
|
||||
var hasExternalLabel = LabelUtil.hasExternalLabel,
|
||||
getExternalLabelBounds = LabelUtil.getExternalLabelBounds,
|
||||
isExpanded = require('../util/DiUtil').isExpanded,
|
||||
|
@ -25,6 +27,11 @@ function collectWaypoints(waypoints) {
|
|||
});
|
||||
}
|
||||
|
||||
function notYetDrawn(semantic, refSemantic, property) {
|
||||
return new Error(
|
||||
'element ' + elementToString(refSemantic) + ' referenced by ' +
|
||||
elementToString(semantic) + '#' + property + ' not yet drawn');
|
||||
}
|
||||
|
||||
/**
|
||||
* An importer that adds bpmn elements to the canvas
|
||||
|
@ -84,6 +91,10 @@ BpmnImporter.prototype.add = function(semantic, parentElement) {
|
|||
height: Math.round(bounds.height)
|
||||
}));
|
||||
|
||||
if (is(semantic, 'bpmn:BoundaryEvent')) {
|
||||
this._attachBoundary(semantic, element);
|
||||
}
|
||||
|
||||
this._canvas.addShape(element, parentElement);
|
||||
}
|
||||
|
||||
|
@ -116,6 +127,40 @@ BpmnImporter.prototype.add = function(semantic, parentElement) {
|
|||
};
|
||||
|
||||
|
||||
/**
|
||||
* Attach the boundary element to the given host
|
||||
*
|
||||
* @param {ModdleElement} boundarySemantic
|
||||
* @param {djs.model.Base} boundaryElement
|
||||
*/
|
||||
BpmnImporter.prototype._attachBoundary = function(boundarySemantic, boundaryElement) {
|
||||
|
||||
var hostSemantic = boundarySemantic.attachedToRef;
|
||||
|
||||
if (!hostSemantic) {
|
||||
throw new Error('missing ' + elementToString(boundarySemantic) + '#attachedToRef');
|
||||
}
|
||||
|
||||
var host = this._elementRegistry.get(hostSemantic.id),
|
||||
attachers = host && host.attachers;
|
||||
|
||||
if (!host) {
|
||||
throw notYetDrawn(boundarySemantic, hostSemantic, 'attachedToRef');
|
||||
}
|
||||
|
||||
// wire element.host <> host.attachers
|
||||
boundaryElement.host = host;
|
||||
|
||||
if (!attachers) {
|
||||
host.attachers = attachers = [];
|
||||
}
|
||||
|
||||
if (attachers.indexOf(boundaryElement) === -1) {
|
||||
attachers.push(boundaryElement);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* add label for an element
|
||||
*/
|
||||
|
@ -168,9 +213,7 @@ BpmnImporter.prototype._getEnd = function(semantic, side) {
|
|||
}
|
||||
|
||||
if (refSemantic) {
|
||||
throw new Error(
|
||||
'element ' + elementToString(refSemantic) + ' referenced by ' +
|
||||
elementToString(semantic) + '#' + side + 'Ref not yet drawn');
|
||||
throw notYetDrawn(semantic, refSemantic, side + 'Ref');
|
||||
} else {
|
||||
throw new Error(elementToString(semantic) + '#' + side + 'Ref not specified');
|
||||
}
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd" id="_THeRQC65EeWXq9AVm82tjg" exporter="camunda modeler" exporterVersion="2.6.0" targetNamespace="http://activiti.org/bpmn">
|
||||
<bpmn2:process id="Process_1" isExecutable="false">
|
||||
<bpmn2:task id="Task_1"/>
|
||||
<bpmn2:boundaryEvent id="BoundaryEvent_1" name="" attachedToRef="Task_1">
|
||||
<bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>
|
||||
</bpmn2:boundaryEvent>
|
||||
<bpmn2:task id="Task_2">
|
||||
<bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>
|
||||
</bpmn2:task>
|
||||
<bpmn2:sequenceFlow id="SequenceFlow_1" name="" sourceRef="BoundaryEvent_1" targetRef="Task_2"/>
|
||||
</bpmn2:process>
|
||||
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
|
||||
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1">
|
||||
<bpmndi:BPMNShape id="_BPMNShape_Task_2" bpmnElement="Task_1">
|
||||
<dc:Bounds height="80.0" width="100.0" x="133.0" y="118.0"/>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="_BPMNShape_BoundaryEvent_2" bpmnElement="BoundaryEvent_1">
|
||||
<dc:Bounds height="36.0" width="36.0" x="143.0" y="180.0"/>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="_BPMNShape_Task_3" bpmnElement="Task_2">
|
||||
<dc:Bounds height="80.0" width="100.0" x="301.0" y="287.0"/>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_1" bpmnElement="SequenceFlow_1" sourceElement="_BPMNShape_BoundaryEvent_2" targetElement="_BPMNShape_Task_3">
|
||||
<di:waypoint xsi:type="dc:Point" x="161.0" y="216.0"/>
|
||||
<di:waypoint xsi:type="dc:Point" x="161.0" y="327.0"/>
|
||||
<di:waypoint xsi:type="dc:Point" x="301.0" y="327.0"/>
|
||||
<bpmndi:BPMNLabel>
|
||||
<dc:Bounds height="6.0" width="6.0" x="173.0" y="327.0"/>
|
||||
</bpmndi:BPMNLabel>
|
||||
</bpmndi:BPMNEdge>
|
||||
</bpmndi:BPMNPlane>
|
||||
</bpmndi:BPMNDiagram>
|
||||
</bpmn2:definitions>
|
|
@ -0,0 +1,51 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd" id="_pHDz0KojEeOJhIBv1RySdg" targetNamespace="http://bpmn.io/schema/bpmn">
|
||||
<bpmn2:collaboration id="_Collaboration_2">
|
||||
<bpmn2:participant id="Participant_2" name="Pool" processRef="Process_1"/>
|
||||
<bpmn2:participant id="Participant_1" name="Pool" processRef="Process_2"/>
|
||||
</bpmn2:collaboration>
|
||||
<bpmn2:process id="Process_1" isExecutable="false">
|
||||
<bpmn2:laneSet id="LaneSet_1" name="Lane Set 1">
|
||||
<bpmn2:lane id="Lane_1" name="Lane 1">
|
||||
<bpmn2:childLaneSet xsi:type="bpmn2:tLaneSet" id="LaneSet_2">
|
||||
<bpmn2:lane id="Lane_2" name="Lane 2"/>
|
||||
<bpmn2:lane id="Lane_3" name="Lane 3">
|
||||
<bpmn2:flowNodeRef>Task_1</bpmn2:flowNodeRef>
|
||||
</bpmn2:lane>
|
||||
</bpmn2:childLaneSet>
|
||||
</bpmn2:lane>
|
||||
</bpmn2:laneSet>
|
||||
<bpmn2:task id="Task_1"/>
|
||||
</bpmn2:process>
|
||||
<bpmn2:process id="Process_2" isExecutable="false">
|
||||
<bpmn2:startEvent id="StartEvent_1"/>
|
||||
</bpmn2:process>
|
||||
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
|
||||
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="_Collaboration_2">
|
||||
<bpmndi:BPMNShape id="_BPMNShape_Participant_2" bpmnElement="Participant_2" isHorizontal="true">
|
||||
<dc:Bounds height="356.0" width="540.0" x="222.0" y="0.0"/>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="_BPMNShape_Participant_3" bpmnElement="Participant_1" isHorizontal="true">
|
||||
<dc:Bounds height="100.0" width="600.0" x="222.0" y="415.0"/>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="_BPMNShape_Lane_2" bpmnElement="Lane_1" isHorizontal="true">
|
||||
<dc:Bounds height="356.0" width="510.0" x="252.0" y="0.0"/>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="_BPMNShape_Lane_3" bpmnElement="Lane_2" isHorizontal="true">
|
||||
<dc:Bounds height="215.0" width="480.0" x="282.0" y="0.0"/>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="_BPMNShape_Lane_4" bpmnElement="Lane_3" isHorizontal="true">
|
||||
<dc:Bounds height="142.0" width="480.0" x="282.0" y="214.0"/>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_3" bpmnElement="StartEvent_1">
|
||||
<dc:Bounds height="36.0" width="36.0" x="324.0" y="448.0"/>
|
||||
<bpmndi:BPMNLabel>
|
||||
<dc:Bounds height="1.0" width="0.0" x="342.0" y="489.0"/>
|
||||
</bpmndi:BPMNLabel>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="_BPMNShape_Task_3" bpmnElement="Task_1">
|
||||
<dc:Bounds height="80.0" width="100.0" x="360.0" y="246.0"/>
|
||||
</bpmndi:BPMNShape>
|
||||
</bpmndi:BPMNPlane>
|
||||
</bpmndi:BPMNDiagram>
|
||||
</bpmn2:definitions>
|
|
@ -0,0 +1,30 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd" id="_THeRQC65EeWXq9AVm82tjg" exporter="camunda modeler" exporterVersion="2.6.0" targetNamespace="http://activiti.org/bpmn">
|
||||
<bpmn2:process id="Process_1" isExecutable="false">
|
||||
<bpmn2:boundaryEvent id="BoundaryEvent_1" name="" attachedToRef="NON_EXISTING_TASK">
|
||||
<bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>
|
||||
</bpmn2:boundaryEvent>
|
||||
<bpmn2:task id="Task_2">
|
||||
<bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>
|
||||
</bpmn2:task>
|
||||
<bpmn2:sequenceFlow id="SequenceFlow_1" name="" sourceRef="BoundaryEvent_1" targetRef="Task_2"/>
|
||||
</bpmn2:process>
|
||||
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
|
||||
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1">
|
||||
<bpmndi:BPMNShape id="_BPMNShape_BoundaryEvent_2" bpmnElement="BoundaryEvent_1">
|
||||
<dc:Bounds height="36.0" width="36.0" x="143.0" y="180.0"/>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="_BPMNShape_Task_3" bpmnElement="Task_2">
|
||||
<dc:Bounds height="80.0" width="100.0" x="301.0" y="287.0"/>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_1" bpmnElement="SequenceFlow_1" sourceElement="_BPMNShape_BoundaryEvent_2" targetElement="_BPMNShape_Task_3">
|
||||
<di:waypoint xsi:type="dc:Point" x="161.0" y="216.0"/>
|
||||
<di:waypoint xsi:type="dc:Point" x="161.0" y="327.0"/>
|
||||
<di:waypoint xsi:type="dc:Point" x="301.0" y="327.0"/>
|
||||
<bpmndi:BPMNLabel>
|
||||
<dc:Bounds height="6.0" width="6.0" x="173.0" y="327.0"/>
|
||||
</bpmndi:BPMNLabel>
|
||||
</bpmndi:BPMNEdge>
|
||||
</bpmndi:BPMNPlane>
|
||||
</bpmndi:BPMNDiagram>
|
||||
</bpmn2:definitions>
|
|
@ -0,0 +1,34 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd" id="_THeRQC65EeWXq9AVm82tjg" exporter="camunda modeler" exporterVersion="2.6.0" targetNamespace="http://activiti.org/bpmn">
|
||||
<bpmn2:process id="Process_1" isExecutable="false">
|
||||
<bpmn2:task id="Task_1"/>
|
||||
<bpmn2:boundaryEvent id="BoundaryEvent_1" name="">
|
||||
<bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>
|
||||
</bpmn2:boundaryEvent>
|
||||
<bpmn2:task id="Task_2">
|
||||
<bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>
|
||||
</bpmn2:task>
|
||||
<bpmn2:sequenceFlow id="SequenceFlow_1" name="" sourceRef="BoundaryEvent_1" targetRef="Task_2"/>
|
||||
</bpmn2:process>
|
||||
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
|
||||
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1">
|
||||
<bpmndi:BPMNShape id="_BPMNShape_Task_2" bpmnElement="Task_1">
|
||||
<dc:Bounds height="80.0" width="100.0" x="133.0" y="118.0"/>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="_BPMNShape_BoundaryEvent_2" bpmnElement="BoundaryEvent_1">
|
||||
<dc:Bounds height="36.0" width="36.0" x="143.0" y="180.0"/>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="_BPMNShape_Task_3" bpmnElement="Task_2">
|
||||
<dc:Bounds height="80.0" width="100.0" x="301.0" y="287.0"/>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_1" bpmnElement="SequenceFlow_1" sourceElement="_BPMNShape_BoundaryEvent_2" targetElement="_BPMNShape_Task_3">
|
||||
<di:waypoint xsi:type="dc:Point" x="161.0" y="216.0"/>
|
||||
<di:waypoint xsi:type="dc:Point" x="161.0" y="327.0"/>
|
||||
<di:waypoint xsi:type="dc:Point" x="301.0" y="327.0"/>
|
||||
<bpmndi:BPMNLabel>
|
||||
<dc:Bounds height="6.0" width="6.0" x="173.0" y="327.0"/>
|
||||
</bpmndi:BPMNLabel>
|
||||
</bpmndi:BPMNEdge>
|
||||
</bpmndi:BPMNPlane>
|
||||
</bpmndi:BPMNDiagram>
|
||||
</bpmn2:definitions>
|
|
@ -0,0 +1,61 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd" id="simple" exporter="camunda modeler" exporterVersion="2.6.0" targetNamespace="http://bpmn.io/schema/bpmn">
|
||||
<bpmn2:process id="Process_1" isExecutable="false">
|
||||
<bpmn2:subProcess id="SubProcess_1" name="Sub Process 1">
|
||||
<bpmn2:incoming>SequenceFlow_3</bpmn2:incoming>
|
||||
<bpmn2:outgoing>SequenceFlow_2</bpmn2:outgoing>
|
||||
<bpmn2:startEvent id="StartEvent_1" name="Start Event 1">
|
||||
<bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>
|
||||
</bpmn2:startEvent>
|
||||
<bpmn2:task id="Task_1" name="Task">
|
||||
<bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>
|
||||
</bpmn2:task>
|
||||
<bpmn2:sequenceFlow id="SequenceFlow_1" name="" sourceRef="StartEvent_1" targetRef="Task_1"/>
|
||||
</bpmn2:subProcess>
|
||||
<bpmn2:endEvent id="EndEvent_1" name="End Event">
|
||||
<bpmn2:incoming>SequenceFlow_2</bpmn2:incoming>
|
||||
</bpmn2:endEvent>
|
||||
<bpmn2:sequenceFlow id="SequenceFlow_2" name="" sourceRef="SubProcess_1" targetRef="EndEvent_1"/>
|
||||
<bpmn2:startEvent id="StartEvent_2" name="Start">
|
||||
<bpmn2:outgoing>SequenceFlow_3</bpmn2:outgoing>
|
||||
</bpmn2:startEvent>
|
||||
<bpmn2:sequenceFlow id="SequenceFlow_3" name="Flow" sourceRef="StartEvent_2" targetRef="SubProcess_1"/>
|
||||
</bpmn2:process>
|
||||
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
|
||||
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1">
|
||||
<bpmndi:BPMNShape id="_BPMNShape_SubProcess_2" bpmnElement="SubProcess_1" isExpanded="true">
|
||||
<dc:Bounds height="300.0" width="300.0" x="300.0" y="80.0"/>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
|
||||
<dc:Bounds height="36.0" width="36.0" x="352.0" y="242.0"/>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="_BPMNShape_Task_2" bpmnElement="Task_1">
|
||||
<dc:Bounds height="80.0" width="100.0" x="420.0" y="220.0"/>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_1" bpmnElement="SequenceFlow_1" sourceElement="_BPMNShape_StartEvent_2" targetElement="_BPMNShape_Task_2">
|
||||
<di:waypoint xsi:type="dc:Point" x="388.0" y="260.0"/>
|
||||
<di:waypoint xsi:type="dc:Point" x="420.0" y="260.0"/>
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNShape id="_BPMNShape_EndEvent_2" bpmnElement="EndEvent_1">
|
||||
<dc:Bounds height="36.0" width="36.0" x="650.0" y="212.0"/>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_2" bpmnElement="SequenceFlow_2" sourceElement="_BPMNShape_SubProcess_2" targetElement="_BPMNShape_EndEvent_2">
|
||||
<di:waypoint xsi:type="dc:Point" x="600.0" y="230.0"/>
|
||||
<di:waypoint xsi:type="dc:Point" x="650.0" y="230.0"/>
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_11" bpmnElement="StartEvent_2">
|
||||
<dc:Bounds height="36.0" width="36.0" x="108.0" y="212.0"/>
|
||||
<bpmndi:BPMNLabel>
|
||||
<dc:Bounds height="0.0" width="0.0" x="126.0" y="253.0"/>
|
||||
</bpmndi:BPMNLabel>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_3" bpmnElement="SequenceFlow_3" sourceElement="_BPMNShape_StartEvent_11" targetElement="_BPMNShape_SubProcess_2">
|
||||
<di:waypoint xsi:type="dc:Point" x="144.0" y="230.0"/>
|
||||
<di:waypoint xsi:type="dc:Point" x="300.0" y="230.0"/>
|
||||
<bpmndi:BPMNLabel>
|
||||
<dc:Bounds height="21.0" width="33.0" x="192.0" y="204.0"/>
|
||||
</bpmndi:BPMNLabel>
|
||||
</bpmndi:BPMNEdge>
|
||||
</bpmndi:BPMNPlane>
|
||||
</bpmndi:BPMNDiagram>
|
||||
</bpmn2:definitions>
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd" id="simple" exporter="camunda modeler" exporterVersion="2.6.0" targetNamespace="http://bpmn.io/schema/bpmn">
|
||||
<bpmn2:definitions xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="simple" targetNamespace="http://bpmn.io/schema/bpmn" exporter="camunda modeler" exporterVersion="2.6.0" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
|
||||
<bpmn2:process id="Process_1" isExecutable="false">
|
||||
<bpmn2:subProcess id="SubProcess_1" name="Sub Process 1">
|
||||
<bpmn2:incoming>SequenceFlow_3</bpmn2:incoming>
|
||||
|
@ -10,52 +10,52 @@
|
|||
<bpmn2:task id="Task_1" name="Task">
|
||||
<bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>
|
||||
</bpmn2:task>
|
||||
<bpmn2:sequenceFlow id="SequenceFlow_1" name="" sourceRef="StartEvent_1" targetRef="Task_1"/>
|
||||
<bpmn2:sequenceFlow id="SequenceFlow_1" name="" sourceRef="StartEvent_1" targetRef="Task_1" />
|
||||
</bpmn2:subProcess>
|
||||
<bpmn2:endEvent id="EndEvent_1" name="End Event">
|
||||
<bpmn2:incoming>SequenceFlow_2</bpmn2:incoming>
|
||||
</bpmn2:endEvent>
|
||||
<bpmn2:sequenceFlow id="SequenceFlow_2" name="" sourceRef="SubProcess_1" targetRef="EndEvent_1"/>
|
||||
<bpmn2:sequenceFlow id="SequenceFlow_2" name="" sourceRef="SubProcess_1" targetRef="EndEvent_1" />
|
||||
<bpmn2:startEvent id="StartEvent_2" name="Start">
|
||||
<bpmn2:outgoing>SequenceFlow_3</bpmn2:outgoing>
|
||||
</bpmn2:startEvent>
|
||||
<bpmn2:sequenceFlow id="SequenceFlow_3" name="Flow" sourceRef="StartEvent_2" targetRef="SubProcess_1"/>
|
||||
<bpmn2:sequenceFlow id="SequenceFlow_3" name="Flow" sourceRef="StartEvent_2" targetRef="SubProcess_1" />
|
||||
</bpmn2:process>
|
||||
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
|
||||
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1">
|
||||
<bpmndi:BPMNShape id="_BPMNShape_SubProcess_2" bpmnElement="SubProcess_1" isExpanded="true">
|
||||
<dc:Bounds height="300.0" width="300.0" x="300.0" y="80.0"/>
|
||||
<dc:Bounds x="300" y="80" width="300" height="300" />
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
|
||||
<dc:Bounds height="36.0" width="36.0" x="352.0" y="242.0"/>
|
||||
<dc:Bounds x="352" y="242" width="36" height="36" />
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="_BPMNShape_Task_2" bpmnElement="Task_1">
|
||||
<dc:Bounds height="80.0" width="100.0" x="420.0" y="220.0"/>
|
||||
<dc:Bounds x="420" y="220" width="100" height="80" />
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_1" bpmnElement="SequenceFlow_1" sourceElement="_BPMNShape_StartEvent_2" targetElement="_BPMNShape_Task_2">
|
||||
<di:waypoint xsi:type="dc:Point" x="388.0" y="260.0"/>
|
||||
<di:waypoint xsi:type="dc:Point" x="420.0" y="260.0"/>
|
||||
<di:waypoint xsi:type="dc:Point" x="388" y="260" />
|
||||
<di:waypoint xsi:type="dc:Point" x="420" y="260" />
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNShape id="_BPMNShape_EndEvent_2" bpmnElement="EndEvent_1">
|
||||
<dc:Bounds height="36.0" width="36.0" x="650.0" y="212.0"/>
|
||||
<dc:Bounds x="650" y="212" width="36" height="36" />
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_2" bpmnElement="SequenceFlow_2" sourceElement="_BPMNShape_SubProcess_2" targetElement="_BPMNShape_EndEvent_2">
|
||||
<di:waypoint xsi:type="dc:Point" x="600.0" y="230.0"/>
|
||||
<di:waypoint xsi:type="dc:Point" x="650.0" y="230.0"/>
|
||||
<di:waypoint xsi:type="dc:Point" x="600" y="230" />
|
||||
<di:waypoint xsi:type="dc:Point" x="650" y="230" />
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_11" bpmnElement="StartEvent_2">
|
||||
<dc:Bounds height="36.0" width="36.0" x="108.0" y="212.0"/>
|
||||
<dc:Bounds x="108" y="212" width="36" height="36" />
|
||||
<bpmndi:BPMNLabel>
|
||||
<dc:Bounds height="0.0" width="0.0" x="126.0" y="253.0"/>
|
||||
<dc:Bounds x="126" y="253" width="0" height="0" />
|
||||
</bpmndi:BPMNLabel>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_3" bpmnElement="SequenceFlow_3" sourceElement="_BPMNShape_StartEvent_11" targetElement="_BPMNShape_SubProcess_2">
|
||||
<di:waypoint xsi:type="dc:Point" x="144.0" y="230.0"/>
|
||||
<di:waypoint xsi:type="dc:Point" x="300.0" y="230.0"/>
|
||||
<di:waypoint xsi:type="dc:Point" x="144" y="230" />
|
||||
<di:waypoint xsi:type="dc:Point" x="300" y="230" />
|
||||
<bpmndi:BPMNLabel>
|
||||
<dc:Bounds height="21.0" width="33.0" x="192.0" y="204.0"/>
|
||||
<dc:Bounds x="192" y="204" width="33" height="21" />
|
||||
</bpmndi:BPMNLabel>
|
||||
</bpmndi:BPMNEdge>
|
||||
</bpmndi:BPMNPlane>
|
||||
</bpmndi:BPMNDiagram>
|
||||
</bpmn2:definitions>
|
||||
</bpmn2:definitions>
|
||||
|
|
|
@ -2,6 +2,9 @@
|
|||
|
||||
var TestHelper = require('../../TestHelper');
|
||||
|
||||
/* global bootstrapViewer, inject */
|
||||
|
||||
|
||||
var TestContainer = require('mocha-test-container-support');
|
||||
|
||||
var Diagram = require('diagram-js/lib/Diagram'),
|
||||
|
@ -10,6 +13,8 @@ var Diagram = require('diagram-js/lib/Diagram'),
|
|||
Viewer = require('../../../lib/Viewer');
|
||||
|
||||
|
||||
var is = require('../../../lib/util/ModelUtil').is;
|
||||
|
||||
describe('import - Importer', function() {
|
||||
|
||||
var moddle = new BpmnModdle();
|
||||
|
@ -48,10 +53,10 @@ describe('import - Importer', function() {
|
|||
|
||||
describe('event emitter', function() {
|
||||
|
||||
it('should fire <shape.added> during import', function(done) {
|
||||
it('should fire <bpmnElement.added> during import', function(done) {
|
||||
|
||||
// given
|
||||
var xml = require('../../fixtures/bpmn/simple.bpmn');
|
||||
var xml = require('../../fixtures/bpmn/import/process.bpmn');
|
||||
|
||||
var eventCount = 0;
|
||||
|
||||
|
@ -75,10 +80,10 @@ describe('import - Importer', function() {
|
|||
|
||||
describe('basics', function() {
|
||||
|
||||
it('should import simple process', function(done) {
|
||||
it('should import process', function(done) {
|
||||
|
||||
// given
|
||||
var xml = require('../../fixtures/bpmn/simple.bpmn');
|
||||
var xml = require('../../fixtures/bpmn/import/process.bpmn');
|
||||
|
||||
var events = [];
|
||||
|
||||
|
@ -116,7 +121,7 @@ describe('import - Importer', function() {
|
|||
it('should import collaboration', function(done) {
|
||||
|
||||
// given
|
||||
var xml = require('../../fixtures/bpmn/collaboration.bpmn');
|
||||
var xml = require('../../fixtures/bpmn/import/collaboration.bpmn');
|
||||
|
||||
var events = [];
|
||||
|
||||
|
@ -148,109 +153,168 @@ describe('import - Importer', function() {
|
|||
done(err);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
it('should import boundary events', function(done) {
|
||||
|
||||
// given
|
||||
var xml = require('../../fixtures/bpmn/import/boundaryEvent.bpmn');
|
||||
|
||||
var events = [];
|
||||
|
||||
// log events
|
||||
diagram.get('eventBus').on('bpmnElement.added', function(e) {
|
||||
events.push({
|
||||
type: 'add',
|
||||
semantic: e.element.businessObject.id,
|
||||
di: e.element.businessObject.di.id,
|
||||
diagramElement: e.element && e.element.id
|
||||
});
|
||||
});
|
||||
|
||||
// when
|
||||
runImport(diagram, xml, function(err, warnings) {
|
||||
|
||||
// then
|
||||
expect(events).to.eql([
|
||||
{ type: 'add', semantic: 'Process_1', di: 'BPMNPlane_1', diagramElement: 'Process_1'},
|
||||
{ type: 'add', semantic: 'Task_1', di: '_BPMNShape_Task_2', diagramElement: 'Task_1'},
|
||||
{ type: 'add', semantic: 'Task_2', di: '_BPMNShape_Task_3', diagramElement: 'Task_2'},
|
||||
{ type: 'add', semantic: 'BoundaryEvent_1', di: '_BPMNShape_BoundaryEvent_2', diagramElement: 'BoundaryEvent_1'},
|
||||
{ type: 'add', semantic: 'SequenceFlow_1', di: 'BPMNEdge_SequenceFlow_1', diagramElement: 'SequenceFlow_1'}
|
||||
]);
|
||||
|
||||
done(err);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
describe('model wiring', function() {
|
||||
|
||||
var xml = require('../../fixtures/bpmn/simple.bpmn');
|
||||
describe('basics', function() {
|
||||
|
||||
var elements;
|
||||
var xml = require('../../fixtures/bpmn/import/process.bpmn');
|
||||
|
||||
beforeEach(function(done) {
|
||||
elements = [];
|
||||
beforeEach(bootstrapViewer(xml));
|
||||
|
||||
// log events
|
||||
diagram.get('eventBus').on('bpmnElement.added', function(e) {
|
||||
elements.push(e.element);
|
||||
});
|
||||
|
||||
runImport(diagram, xml, done);
|
||||
it('should wire root element', inject(function(elementRegistry, canvas) {
|
||||
|
||||
// when
|
||||
var processElement = elementRegistry.get('Process_1');
|
||||
var subProcessShape = elementRegistry.get('SubProcess_1');
|
||||
|
||||
// then
|
||||
expect(subProcessShape.parent).to.eql(processElement);
|
||||
expect(canvas.getRootElement()).to.eql(processElement);
|
||||
|
||||
expect(is(processElement, 'bpmn:Process')).to.be.true;
|
||||
}));
|
||||
|
||||
|
||||
it('should wire parent child relationship', inject(function(elementRegistry) {
|
||||
|
||||
// when
|
||||
var subProcessShape = elementRegistry.get('SubProcess_1');
|
||||
var startEventShape = elementRegistry.get('StartEvent_1');
|
||||
|
||||
// then
|
||||
expect(startEventShape.type).to.equal('bpmn:StartEvent');
|
||||
expect(startEventShape.parent).to.eql(subProcessShape);
|
||||
|
||||
expect(subProcessShape.children.length).to.equal(5);
|
||||
}));
|
||||
|
||||
|
||||
it('should wire label relationship', inject(function(elementRegistry) {
|
||||
|
||||
// when
|
||||
var startEventShape = elementRegistry.get('StartEvent_1');
|
||||
var label = startEventShape.label;
|
||||
|
||||
// then
|
||||
expect(label).to.be.defined;
|
||||
expect(label.id).to.equal(startEventShape.id + '_label');
|
||||
|
||||
expect(label.labelTarget).to.eql(startEventShape);
|
||||
}));
|
||||
|
||||
|
||||
it('should wire businessObject', inject(function(elementRegistry) {
|
||||
|
||||
// when
|
||||
var subProcessShape = elementRegistry.get('SubProcess_1');
|
||||
var startEventShape = elementRegistry.get('StartEvent_1');
|
||||
|
||||
var subProcess = subProcessShape.businessObject,
|
||||
startEvent = startEventShape.businessObject;
|
||||
|
||||
// then
|
||||
expect(subProcess).to.be.defined;
|
||||
expect(is(subProcess, 'bpmn:SubProcess')).to.be.true;
|
||||
|
||||
expect(startEvent).to.be.defined;
|
||||
expect(is(startEvent, 'bpmn:StartEvent')).to.be.true;
|
||||
}));
|
||||
|
||||
|
||||
it('should wire shape di', inject(function(elementRegistry) {
|
||||
|
||||
// when
|
||||
var subProcessShape = elementRegistry.get('SubProcess_1');
|
||||
|
||||
var subProcess = subProcessShape.businessObject;
|
||||
var subProcessDi = subProcess.di;
|
||||
|
||||
// then
|
||||
expect(subProcessDi).to.be.defined;
|
||||
expect(subProcessDi.bpmnElement).to.eql(subProcess);
|
||||
}));
|
||||
|
||||
|
||||
it('should wire connection di', inject(function(elementRegistry) {
|
||||
|
||||
// when
|
||||
var sequenceFlowElement = elementRegistry.get('SequenceFlow_1');
|
||||
|
||||
var sequenceFlow = sequenceFlowElement.businessObject;
|
||||
var sequenceFlowDi = sequenceFlow.di;
|
||||
|
||||
// then
|
||||
expect(sequenceFlowDi).to.be.defined;
|
||||
expect(sequenceFlowDi.bpmnElement).to.eql(sequenceFlow);
|
||||
}));
|
||||
|
||||
});
|
||||
|
||||
|
||||
it('should wire root element', function() {
|
||||
describe('boundary events', function() {
|
||||
|
||||
// given
|
||||
var canvas = diagram.get('canvas');
|
||||
var xml = require('../../fixtures/bpmn/import/boundaryEvent.bpmn');
|
||||
|
||||
// when
|
||||
var root = elements[0];
|
||||
var anyChild = elements[1];
|
||||
|
||||
// assume
|
||||
expect(root.businessObject.$instanceOf('bpmn:Process')).to.be.true;
|
||||
expect(anyChild.parent).to.eql(root);
|
||||
|
||||
// then
|
||||
expect(canvas.getRootElement()).to.eql(root);
|
||||
});
|
||||
beforeEach(bootstrapViewer(xml));
|
||||
|
||||
|
||||
it('should wire parent child relationship', function() {
|
||||
it('should wire host attacher relationship', inject(function(elementRegistry) {
|
||||
|
||||
// when
|
||||
var subProcessShape = elements[1];
|
||||
var startEventShape = elements[2];
|
||||
// when
|
||||
var boundaryEventShape = elementRegistry.get('BoundaryEvent_1'),
|
||||
boundaryEvent = boundaryEventShape.businessObject;
|
||||
|
||||
// then
|
||||
expect(startEventShape.type).to.equal('bpmn:StartEvent');
|
||||
expect(startEventShape.parent).to.eql(subProcessShape);
|
||||
var taskShape = elementRegistry.get('Task_1'),
|
||||
task = taskShape.businessObject;
|
||||
|
||||
expect(subProcessShape.children.length).to.equal(5);
|
||||
});
|
||||
// assume
|
||||
expect(boundaryEvent.attachedToRef).to.eql(task);
|
||||
|
||||
// then
|
||||
expect(boundaryEventShape.host).to.eql(taskShape);
|
||||
|
||||
it('should wire label relationship', function() {
|
||||
expect(taskShape.attachers).to.exist;
|
||||
expect(taskShape.attachers).to.contain(boundaryEventShape);
|
||||
}));
|
||||
|
||||
// when
|
||||
var startEventShape = elements[2];
|
||||
var label = startEventShape.label;
|
||||
|
||||
// then
|
||||
expect(label).to.be.defined;
|
||||
expect(label.id).to.equal(startEventShape.id + '_label');
|
||||
|
||||
expect(label.labelTarget).to.eql(startEventShape);
|
||||
});
|
||||
|
||||
|
||||
it('should wire businessObject', function() {
|
||||
|
||||
// when
|
||||
var subProcessShape = elements[1];
|
||||
var startEventShape = elements[2];
|
||||
|
||||
var subProcess = subProcessShape.businessObject,
|
||||
startEvent = startEventShape.businessObject;
|
||||
|
||||
// then
|
||||
expect(subProcess).to.be.defined;
|
||||
expect(subProcess.$instanceOf('bpmn:SubProcess')).to.be.true;
|
||||
|
||||
expect(startEvent).to.be.defined;
|
||||
expect(startEvent.$instanceOf('bpmn:StartEvent')).to.be.true;
|
||||
});
|
||||
|
||||
|
||||
it('should wire di', function() {
|
||||
|
||||
// when
|
||||
var subProcessShape = elements[1];
|
||||
var startEventShape = elements[2];
|
||||
|
||||
var subProcess = subProcessShape.businessObject,
|
||||
startEvent = startEventShape.businessObject;
|
||||
|
||||
var subProcessDi = subProcess.di,
|
||||
startEventDi = startEvent.di;
|
||||
|
||||
// then
|
||||
expect(subProcessDi).to.be.defined;
|
||||
expect(subProcessDi.bpmnElement).to.eql(subProcess);
|
||||
|
||||
expect(startEventDi).to.be.defined;
|
||||
expect(startEventDi.bpmnElement).to.eql(startEvent);
|
||||
});
|
||||
|
||||
});
|
||||
|
@ -261,7 +325,7 @@ describe('import - Importer', function() {
|
|||
it('should import invalid flowElement', function(done) {
|
||||
|
||||
// given
|
||||
var xml = require('../../fixtures/bpmn/error/invalid-flow-element.bpmn');
|
||||
var xml = require('../../fixtures/bpmn/import/error/invalid-flow-element.bpmn');
|
||||
|
||||
// when
|
||||
runImport(diagram, xml, function(err, warnings) {
|
||||
|
@ -276,7 +340,7 @@ describe('import - Importer', function() {
|
|||
it('should import multiple DIs', function(done) {
|
||||
|
||||
// given
|
||||
var xml = require('../../fixtures/bpmn/error/multiple-dis.bpmn');
|
||||
var xml = require('../../fixtures/bpmn/import/error/multiple-dis.bpmn');
|
||||
|
||||
// when
|
||||
runImport(diagram, xml, function(err, warnings) {
|
||||
|
@ -310,6 +374,48 @@ describe('import - Importer', function() {
|
|||
});
|
||||
});
|
||||
|
||||
|
||||
describe('boundary events', function() {
|
||||
|
||||
it('should handle missing attachToRef', function(done) {
|
||||
|
||||
// given
|
||||
var xml = require('../../fixtures/bpmn/import/error/boundaryEvent-missingAttachToRef.bpmn');
|
||||
|
||||
// when
|
||||
runImport(diagram, xml, function(err, warnings) {
|
||||
|
||||
// then
|
||||
expect(warnings.length).to.eql(2);
|
||||
|
||||
expect(warnings[0].message).to.eql('missing <bpmn:BoundaryEvent id="BoundaryEvent_1" />#attachedToRef');
|
||||
expect(warnings[1].message).to.eql('element <bpmn:BoundaryEvent id="BoundaryEvent_1" /> referenced by <bpmn:SequenceFlow id="SequenceFlow_1" />#sourceRef not yet drawn');
|
||||
|
||||
done(err);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
it('should handle invalid attachToRef', function(done) {
|
||||
|
||||
// given
|
||||
var xml = require('../../fixtures/bpmn/import/error/boundaryEvent-invalidAttachToRef.bpmn');
|
||||
|
||||
// when
|
||||
runImport(diagram, xml, function(err, warnings) {
|
||||
|
||||
// then
|
||||
expect(warnings.length).to.eql(2);
|
||||
|
||||
expect(warnings[0].message).to.eql('missing <bpmn:BoundaryEvent id="BoundaryEvent_1" />#attachedToRef');
|
||||
expect(warnings[1].message).to.eql('element <bpmn:BoundaryEvent id="BoundaryEvent_1" /> referenced by <bpmn:SequenceFlow id="SequenceFlow_1" />#sourceRef not yet drawn');
|
||||
|
||||
done(err);
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
@ -334,7 +440,7 @@ describe('import - Importer', function() {
|
|||
it('should import dangling process message flows', function(done) {
|
||||
|
||||
// given
|
||||
var xml = require('../../fixtures/bpmn/import/dangling-process-message-flow.bpmn');
|
||||
var xml = require('../../fixtures/bpmn/import/error/dangling-process-message-flow.bpmn');
|
||||
|
||||
// when
|
||||
runImport(diagram, xml, function(err, warnings) {
|
||||
|
@ -348,12 +454,13 @@ describe('import - Importer', function() {
|
|||
done(err);
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
describe('position', function() {
|
||||
|
||||
var xml1 = require('../../fixtures/bpmn/import/position/position-testcase.bpmn');
|
||||
var xml = require('../../fixtures/bpmn/import/position/position-testcase.bpmn');
|
||||
|
||||
it('should round shape\'s x and y coordinates', function(done) {
|
||||
|
||||
|
@ -366,7 +473,7 @@ describe('import - Importer', function() {
|
|||
events[e.element.id] = e.element;
|
||||
});
|
||||
|
||||
runImport(diagram, xml1, function(err, warnings) {
|
||||
runImport(diagram, xml, function(err, warnings) {
|
||||
|
||||
//round up
|
||||
expect(events.ID_End.x).to.equal(Math.round(340.6));
|
||||
|
@ -392,7 +499,7 @@ describe('import - Importer', function() {
|
|||
events[e.element.id] = e.element;
|
||||
});
|
||||
|
||||
runImport(diagram, xml1, function(err, warnings) {
|
||||
runImport(diagram, xml, function(err, warnings) {
|
||||
|
||||
//round down
|
||||
expect(events.ID_Start.height).to.equal(Math.round(30.4));
|
||||
|
|
|
@ -9,7 +9,7 @@ describe('import - collapsed container', function() {
|
|||
|
||||
describe('in process', function() {
|
||||
|
||||
var diagramXML = require('../../../fixtures/bpmn/import/collapsed.bpmn');
|
||||
var diagramXML = require('../../../fixtures/bpmn/import/collapsed/process.bpmn');
|
||||
|
||||
beforeEach(bootstrapViewer(diagramXML));
|
||||
|
||||
|
@ -74,7 +74,7 @@ describe('import - collapsed container', function() {
|
|||
|
||||
describe('in collaboration', function() {
|
||||
|
||||
var diagramXML = require('../../../fixtures/bpmn/import/collapsed-collaboration.bpmn');
|
||||
var diagramXML = require('../../../fixtures/bpmn/import/collapsed/collaboration.bpmn');
|
||||
|
||||
beforeEach(bootstrapViewer(diagramXML));
|
||||
|
||||
|
|
Loading…
Reference in New Issue