mirror of
https://github.com/sartography/bpmn-js.git
synced 2025-02-20 12:48:23 +00:00
parent
421912ddbf
commit
5a60c370a7
@ -145,8 +145,9 @@ ContextPadProvider.prototype.getContextPadEntries = function(element) {
|
|||||||
{ _eventDefinitionType: 'bpmn:SignalEventDefinition'})
|
{ _eventDefinitionType: 'bpmn:SignalEventDefinition'})
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is(bpmnElement, 'bpmn:FlowNode') || is(bpmnElement, 'bpmn:SequenceFlow')) {
|
||||||
// Replace menu entry
|
// Replace menu entry
|
||||||
assign(actions, {
|
assign(actions, {
|
||||||
'replace': {
|
'replace': {
|
||||||
|
@ -16,7 +16,8 @@ var startEventReplace = REPLACE_OPTIONS.START_EVENT,
|
|||||||
transactionReplace = REPLACE_OPTIONS.TRANSACTION,
|
transactionReplace = REPLACE_OPTIONS.TRANSACTION,
|
||||||
eventSubProcessReplace = REPLACE_OPTIONS.EVENT_SUB_PROCESS,
|
eventSubProcessReplace = REPLACE_OPTIONS.EVENT_SUB_PROCESS,
|
||||||
boundaryEventReplace = REPLACE_OPTIONS.BOUNDARY_EVENT,
|
boundaryEventReplace = REPLACE_OPTIONS.BOUNDARY_EVENT,
|
||||||
eventSubProcessStartEventReplace = REPLACE_OPTIONS.EVENT_SUB_PROCESS_START_EVENT;
|
eventSubProcessStartEventReplace = REPLACE_OPTIONS.EVENT_SUB_PROCESS_START_EVENT,
|
||||||
|
sequenceFlowReplace = REPLACE_OPTIONS.SEQUENCE_FLOW;
|
||||||
|
|
||||||
var is = require('../../util/ModelUtil').is,
|
var is = require('../../util/ModelUtil').is,
|
||||||
getBusinessObject = require('../../util/ModelUtil').getBusinessObject,
|
getBusinessObject = require('../../util/ModelUtil').getBusinessObject,
|
||||||
@ -71,7 +72,6 @@ function BpmnReplace(bpmnFactory, moddle, popupMenu, replace, selection, modelin
|
|||||||
};
|
};
|
||||||
|
|
||||||
// initialize custom BPMN extensions
|
// initialize custom BPMN extensions
|
||||||
|
|
||||||
if (target.eventDefinition) {
|
if (target.eventDefinition) {
|
||||||
var eventDefinitions = businessObject.get('eventDefinitions'),
|
var eventDefinitions = businessObject.get('eventDefinitions'),
|
||||||
eventDefinition = moddle.create(target.eventDefinition);
|
eventDefinition = moddle.create(target.eventDefinition);
|
||||||
@ -80,10 +80,8 @@ function BpmnReplace(bpmnFactory, moddle, popupMenu, replace, selection, modelin
|
|||||||
}
|
}
|
||||||
|
|
||||||
// initialize special properties defined in target definition
|
// initialize special properties defined in target definition
|
||||||
|
|
||||||
assign(businessObject, pick(target, CUSTOM_PROPERTIES));
|
assign(businessObject, pick(target, CUSTOM_PROPERTIES));
|
||||||
|
|
||||||
|
|
||||||
// copy size (for activities only)
|
// copy size (for activities only)
|
||||||
if (is(oldBusinessObject, 'bpmn:Activity')) {
|
if (is(oldBusinessObject, 'bpmn:Activity')) {
|
||||||
|
|
||||||
@ -271,12 +269,28 @@ function BpmnReplace(bpmnFactory, moddle, popupMenu, replace, selection, modelin
|
|||||||
addEntries(boundaryEventReplace, filterEvents);
|
addEntries(boundaryEventReplace, filterEvents);
|
||||||
} else
|
} else
|
||||||
|
|
||||||
|
if (is(businessObject, 'bpmn:SequenceFlow')) {
|
||||||
|
addSequenceFlowEntries(sequenceFlowReplace);
|
||||||
|
} else
|
||||||
|
|
||||||
if (is(businessObject, 'bpmn:FlowNode')) {
|
if (is(businessObject, 'bpmn:FlowNode')) {
|
||||||
addEntries(taskReplace, function(entry) {
|
addEntries(taskReplace, function(entry) {
|
||||||
return entry.target.type !== businessObject.$type;
|
return entry.target.type !== businessObject.$type;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function addSequenceFlowEntries(entries) {
|
||||||
|
forEach(entries, function(entry) {
|
||||||
|
if (entry.actionName === 'replace-with-default-flow' &&
|
||||||
|
is(businessObject.sourceRef, 'bpmn:ExclusiveGateway') ||
|
||||||
|
is(businessObject.sourceRef, 'bpmn:InclusiveGateway')) {
|
||||||
|
|
||||||
|
menuEntries.push(addMenuEntry(entry, function() {
|
||||||
|
modeling.updateProperties(element.source, { default: businessObject });
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function filterEvents(entry) {
|
function filterEvents(entry) {
|
||||||
|
|
||||||
@ -332,16 +346,22 @@ function BpmnReplace(bpmnFactory, moddle, popupMenu, replace, selection, modelin
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function addMenuEntry(definition) {
|
function addMenuEntry(definition, action) {
|
||||||
|
|
||||||
return {
|
var menuEntry = {
|
||||||
label: definition.label,
|
label: definition.label,
|
||||||
className: definition.className,
|
className: definition.className,
|
||||||
id: definition.actionName,
|
id: definition.actionName,
|
||||||
action: function() {
|
action: action
|
||||||
return replaceElement(element, definition.target);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (!menuEntry.action) {
|
||||||
|
menuEntry.action = function() {
|
||||||
|
return replaceElement(element, definition.target);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return menuEntry;
|
||||||
}
|
}
|
||||||
|
|
||||||
return menuEntries;
|
return menuEntries;
|
||||||
|
@ -718,3 +718,14 @@ module.exports.EVENT_SUB_PROCESS_START_EVENT = [
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
module.exports.SEQUENCE_FLOW = [
|
||||||
|
{
|
||||||
|
label: 'Default Flow',
|
||||||
|
actionName: 'replace-with-default-flow',
|
||||||
|
className: 'icon-connection',
|
||||||
|
target: {
|
||||||
|
type: 'bpmn:SequenceFlow'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
];
|
||||||
|
89
test/spec/features/replace/BpmnReplace.defaultFlows.bpmn
Normal file
89
test/spec/features/replace/BpmnReplace.defaultFlows.bpmn
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<bpmn:definitions xmlns:bpmn="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="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn">
|
||||||
|
<bpmn:process id="Process_1" isExecutable="false">
|
||||||
|
<bpmn:exclusiveGateway id="ExclusiveGateway_1" name="desired dish? " default="SequenceFlow_3">
|
||||||
|
<bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>
|
||||||
|
<bpmn:outgoing>SequenceFlow_2</bpmn:outgoing>
|
||||||
|
<bpmn:outgoing>SequenceFlow_3</bpmn:outgoing>
|
||||||
|
</bpmn:exclusiveGateway>
|
||||||
|
<bpmn:task id="Task_1" name="Make a pizza">
|
||||||
|
<bpmn:incoming>SequenceFlow_1</bpmn:incoming>
|
||||||
|
</bpmn:task>
|
||||||
|
<bpmn:sequenceFlow id="SequenceFlow_1" sourceRef="ExclusiveGateway_1" targetRef="Task_1" />
|
||||||
|
<bpmn:task id="Task_2" name="cook salmon">
|
||||||
|
<bpmn:incoming>SequenceFlow_2</bpmn:incoming>
|
||||||
|
</bpmn:task>
|
||||||
|
<bpmn:sequenceFlow id="SequenceFlow_2" sourceRef="ExclusiveGateway_1" targetRef="Task_2" />
|
||||||
|
<bpmn:task id="Task_3" name="starve..">
|
||||||
|
<bpmn:incoming>SequenceFlow_3</bpmn:incoming>
|
||||||
|
</bpmn:task>
|
||||||
|
<bpmn:sequenceFlow id="SequenceFlow_3" sourceRef="ExclusiveGateway_1" targetRef="Task_3" />
|
||||||
|
<bpmn:startEvent id="StartEvent_1">
|
||||||
|
<bpmn:outgoing>SequenceFlow_4</bpmn:outgoing>
|
||||||
|
</bpmn:startEvent>
|
||||||
|
<bpmn:task id="Task_4">
|
||||||
|
<bpmn:incoming>SequenceFlow_4</bpmn:incoming>
|
||||||
|
</bpmn:task>
|
||||||
|
<bpmn:sequenceFlow id="SequenceFlow_4" sourceRef="StartEvent_1" targetRef="Task_4" />
|
||||||
|
</bpmn:process>
|
||||||
|
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
|
||||||
|
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1">
|
||||||
|
<bpmndi:BPMNShape id="ExclusiveGateway_1_di" bpmnElement="ExclusiveGateway_1" isMarkerVisible="true">
|
||||||
|
<dc:Bounds x="452" y="282" width="50" height="50" />
|
||||||
|
<bpmndi:BPMNLabel>
|
||||||
|
<dc:Bounds x="332" y="337" width="90" height="20" />
|
||||||
|
</bpmndi:BPMNLabel>
|
||||||
|
</bpmndi:BPMNShape>
|
||||||
|
<bpmndi:BPMNShape id="Task_1_di" bpmnElement="Task_1">
|
||||||
|
<dc:Bounds x="636" y="127" width="100" height="80" />
|
||||||
|
</bpmndi:BPMNShape>
|
||||||
|
<bpmndi:BPMNEdge id="SequenceFlow_1_di" bpmnElement="SequenceFlow_1">
|
||||||
|
<di:waypoint xsi:type="dc:Point" x="477" y="282" />
|
||||||
|
<di:waypoint xsi:type="dc:Point" x="477" y="167" />
|
||||||
|
<di:waypoint xsi:type="dc:Point" x="636" y="167" />
|
||||||
|
<bpmndi:BPMNLabel>
|
||||||
|
<dc:Bounds x="432" y="214.5" width="90" height="20" />
|
||||||
|
</bpmndi:BPMNLabel>
|
||||||
|
</bpmndi:BPMNEdge>
|
||||||
|
<bpmndi:BPMNShape id="Task_2_di" bpmnElement="Task_2">
|
||||||
|
<dc:Bounds x="636" y="267" width="100" height="80" />
|
||||||
|
</bpmndi:BPMNShape>
|
||||||
|
<bpmndi:BPMNEdge id="SequenceFlow_2_di" bpmnElement="SequenceFlow_2">
|
||||||
|
<di:waypoint xsi:type="dc:Point" x="502" y="307" />
|
||||||
|
<di:waypoint xsi:type="dc:Point" x="569" y="307" />
|
||||||
|
<di:waypoint xsi:type="dc:Point" x="569" y="307" />
|
||||||
|
<di:waypoint xsi:type="dc:Point" x="636" y="307" />
|
||||||
|
<bpmndi:BPMNLabel>
|
||||||
|
<dc:Bounds x="524" y="304.5" width="90" height="20" />
|
||||||
|
</bpmndi:BPMNLabel>
|
||||||
|
</bpmndi:BPMNEdge>
|
||||||
|
<bpmndi:BPMNShape id="Task_3_di" bpmnElement="Task_3">
|
||||||
|
<dc:Bounds x="636" y="420" width="100" height="80" />
|
||||||
|
</bpmndi:BPMNShape>
|
||||||
|
<bpmndi:BPMNEdge id="SequenceFlow_3_di" bpmnElement="SequenceFlow_3">
|
||||||
|
<di:waypoint xsi:type="dc:Point" x="477" y="332" />
|
||||||
|
<di:waypoint xsi:type="dc:Point" x="477" y="460" />
|
||||||
|
<di:waypoint xsi:type="dc:Point" x="636" y="460" />
|
||||||
|
<bpmndi:BPMNLabel>
|
||||||
|
<dc:Bounds x="432" y="386" width="90" height="20" />
|
||||||
|
</bpmndi:BPMNLabel>
|
||||||
|
</bpmndi:BPMNEdge>
|
||||||
|
<bpmndi:BPMNShape id="StartEvent_1_di" bpmnElement="StartEvent_1">
|
||||||
|
<dc:Bounds x="864" y="289" width="36" height="36" />
|
||||||
|
<bpmndi:BPMNLabel>
|
||||||
|
<dc:Bounds x="837" y="325" width="90" height="20" />
|
||||||
|
</bpmndi:BPMNLabel>
|
||||||
|
</bpmndi:BPMNShape>
|
||||||
|
<bpmndi:BPMNShape id="Task_4_di" bpmnElement="Task_4">
|
||||||
|
<dc:Bounds x="1045" y="267" width="100" height="80" />
|
||||||
|
</bpmndi:BPMNShape>
|
||||||
|
<bpmndi:BPMNEdge id="SequenceFlow_4_di" bpmnElement="SequenceFlow_4">
|
||||||
|
<di:waypoint xsi:type="dc:Point" x="900" y="307" />
|
||||||
|
<di:waypoint xsi:type="dc:Point" x="1045" y="307" />
|
||||||
|
<bpmndi:BPMNLabel>
|
||||||
|
<dc:Bounds x="927.5" y="297" width="90" height="20" />
|
||||||
|
</bpmndi:BPMNLabel>
|
||||||
|
</bpmndi:BPMNEdge>
|
||||||
|
</bpmndi:BPMNPlane>
|
||||||
|
</bpmndi:BPMNDiagram>
|
||||||
|
</bpmn:definitions>
|
@ -926,4 +926,72 @@ describe('features/replace', function() {
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('default flows', function() {
|
||||||
|
|
||||||
|
var diagramXML = require('./BpmnReplace.defaultFlows.bpmn');
|
||||||
|
|
||||||
|
beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));
|
||||||
|
|
||||||
|
it('should show Default replace option', inject(function(elementRegistry, bpmnReplace) {
|
||||||
|
// given
|
||||||
|
var sequenceFlow = elementRegistry.get('SequenceFlow_3');
|
||||||
|
|
||||||
|
// when
|
||||||
|
var opts = bpmnReplace.getReplaceOptions(sequenceFlow);
|
||||||
|
|
||||||
|
// then
|
||||||
|
expect(opts).to.have.length(1);
|
||||||
|
}));
|
||||||
|
|
||||||
|
|
||||||
|
it('should NOT show Default replace option', inject(function(elementRegistry, bpmnReplace) {
|
||||||
|
// given
|
||||||
|
var sequenceFlow = elementRegistry.get('SequenceFlow_4');
|
||||||
|
|
||||||
|
// when
|
||||||
|
var opts = bpmnReplace.getReplaceOptions(sequenceFlow);
|
||||||
|
|
||||||
|
// then
|
||||||
|
expect(opts).to.have.length(0);
|
||||||
|
}));
|
||||||
|
|
||||||
|
|
||||||
|
it('should replace SequenceFlow with DefaultFlow', inject(function(elementRegistry, bpmnReplace) {
|
||||||
|
// given
|
||||||
|
var sequenceFlow = elementRegistry.get('SequenceFlow_3');
|
||||||
|
|
||||||
|
// when
|
||||||
|
var opts = bpmnReplace.getReplaceOptions(sequenceFlow);
|
||||||
|
|
||||||
|
// trigger DefaultFlow replacement
|
||||||
|
opts[0].action();
|
||||||
|
|
||||||
|
var gateway = elementRegistry.get('ExclusiveGateway_1');
|
||||||
|
|
||||||
|
// then
|
||||||
|
expect(gateway.businessObject.default).to.equal(sequenceFlow.businessObject);
|
||||||
|
}));
|
||||||
|
|
||||||
|
|
||||||
|
it('should only have one DefaultFlow', inject(function(elementRegistry, bpmnReplace) {
|
||||||
|
// given
|
||||||
|
var sequenceFlow = elementRegistry.get('SequenceFlow_1'),
|
||||||
|
sequenceFlow2 = elementRegistry.get('SequenceFlow_3');
|
||||||
|
|
||||||
|
// when
|
||||||
|
var sequenceFlowOpts = bpmnReplace.getReplaceOptions(sequenceFlow),
|
||||||
|
sequenceFlowOpts2 = bpmnReplace.getReplaceOptions(sequenceFlow2);
|
||||||
|
|
||||||
|
// trigger DefaultFlow replacement
|
||||||
|
sequenceFlowOpts2[0].action();
|
||||||
|
sequenceFlowOpts[0].action();
|
||||||
|
|
||||||
|
var gateway = elementRegistry.get('ExclusiveGateway_1');
|
||||||
|
|
||||||
|
// then
|
||||||
|
expect(gateway.businessObject.default).to.equal(sequenceFlow.businessObject);
|
||||||
|
}));
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user