feat(modeling): set isHorizontal=true for partipant/lane DIs
Closes #934
This commit is contained in:
parent
762b3d21e6
commit
39d4f1c57e
|
@ -0,0 +1,41 @@
|
||||||
|
import inherits from 'inherits';
|
||||||
|
|
||||||
|
import CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';
|
||||||
|
|
||||||
|
import {
|
||||||
|
getBusinessObject
|
||||||
|
} from '../../../util/ModelUtil';
|
||||||
|
|
||||||
|
import {
|
||||||
|
isAny
|
||||||
|
} from '../util/ModelingUtil';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A component that makes sure that each created or updated
|
||||||
|
* Pool and Lane is assigned an isHorizontal property set to true.
|
||||||
|
*
|
||||||
|
* @param {EventBus} eventBus
|
||||||
|
*/
|
||||||
|
export default function IsHorizontalFix(eventBus) {
|
||||||
|
|
||||||
|
CommandInterceptor.call(this, eventBus);
|
||||||
|
|
||||||
|
var elementTypesToUpdate = [
|
||||||
|
'bpmn:Participant',
|
||||||
|
'bpmn:Lane'
|
||||||
|
];
|
||||||
|
|
||||||
|
this.executed([ 'shape.move', 'shape.create', 'shape.resize' ], function(event) {
|
||||||
|
var bo = getBusinessObject(event.context.shape);
|
||||||
|
|
||||||
|
if (isAny(bo, elementTypesToUpdate) && !bo.di.get('isHorizontal')) {
|
||||||
|
// set attribute directly to avoid modeling#updateProperty side effects
|
||||||
|
bo.di.set('isHorizontal', true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
IsHorizontalFix.$inject = [ 'eventBus' ];
|
||||||
|
|
||||||
|
inherits(IsHorizontalFix, CommandInterceptor);
|
|
@ -10,6 +10,7 @@ import DataStoreBehavior from './DataStoreBehavior';
|
||||||
import DeleteLaneBehavior from './DeleteLaneBehavior';
|
import DeleteLaneBehavior from './DeleteLaneBehavior';
|
||||||
import DropOnFlowBehavior from './DropOnFlowBehavior';
|
import DropOnFlowBehavior from './DropOnFlowBehavior';
|
||||||
import ImportDockingFix from './ImportDockingFix';
|
import ImportDockingFix from './ImportDockingFix';
|
||||||
|
import IsHorizontalFix from './IsHorizontalFix';
|
||||||
import LabelBehavior from './LabelBehavior';
|
import LabelBehavior from './LabelBehavior';
|
||||||
import ModelingFeedback from './ModelingFeedback';
|
import ModelingFeedback from './ModelingFeedback';
|
||||||
import ReplaceConnectionBehavior from './ReplaceConnectionBehavior';
|
import ReplaceConnectionBehavior from './ReplaceConnectionBehavior';
|
||||||
|
@ -36,6 +37,7 @@ export default {
|
||||||
'deleteLaneBehavior',
|
'deleteLaneBehavior',
|
||||||
'dropOnFlowBehavior',
|
'dropOnFlowBehavior',
|
||||||
'importDockingFix',
|
'importDockingFix',
|
||||||
|
'isHorizontalFix',
|
||||||
'labelBehavior',
|
'labelBehavior',
|
||||||
'modelingFeedback',
|
'modelingFeedback',
|
||||||
'removeElementBehavior',
|
'removeElementBehavior',
|
||||||
|
@ -60,6 +62,7 @@ export default {
|
||||||
deleteLaneBehavior: [ 'type', DeleteLaneBehavior ],
|
deleteLaneBehavior: [ 'type', DeleteLaneBehavior ],
|
||||||
dropOnFlowBehavior: [ 'type', DropOnFlowBehavior ],
|
dropOnFlowBehavior: [ 'type', DropOnFlowBehavior ],
|
||||||
importDockingFix: [ 'type', ImportDockingFix ],
|
importDockingFix: [ 'type', ImportDockingFix ],
|
||||||
|
isHorizontalFix: [ 'type', IsHorizontalFix ],
|
||||||
labelBehavior: [ 'type', LabelBehavior ],
|
labelBehavior: [ 'type', LabelBehavior ],
|
||||||
modelingFeedback: [ 'type', ModelingFeedback ],
|
modelingFeedback: [ 'type', ModelingFeedback ],
|
||||||
replaceConnectionBehavior: [ 'type', ReplaceConnectionBehavior ],
|
replaceConnectionBehavior: [ 'type', ReplaceConnectionBehavior ],
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
<?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:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" id="Definitions_0f2kqle" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="2.2.4">
|
||||||
|
<bpmn:collaboration id="Collaboration_08digmd">
|
||||||
|
<bpmn:participant id="Participant" processRef="Process_1" />
|
||||||
|
</bpmn:collaboration>
|
||||||
|
<bpmn:process id="Process_1">
|
||||||
|
<bpmn:laneSet id="LaneSet_13y425u">
|
||||||
|
<bpmn:lane id="Lane">
|
||||||
|
<bpmn:flowNodeRef>StartEvent_1</bpmn:flowNodeRef>
|
||||||
|
</bpmn:lane>
|
||||||
|
<bpmn:lane id="Lane_2" />
|
||||||
|
</bpmn:laneSet>
|
||||||
|
<bpmn:startEvent id="StartEvent_1">
|
||||||
|
<bpmn:extensionElements>
|
||||||
|
<camunda:executionListener event="start">
|
||||||
|
<camunda:script scriptFormat="groovy">println execution.eventName</camunda:script>
|
||||||
|
</camunda:executionListener>
|
||||||
|
<camunda:executionListener event="end">
|
||||||
|
<camunda:script scriptFormat="groovy">println end</camunda:script>
|
||||||
|
</camunda:executionListener>
|
||||||
|
</bpmn:extensionElements>
|
||||||
|
</bpmn:startEvent>
|
||||||
|
</bpmn:process>
|
||||||
|
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
|
||||||
|
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Collaboration_08digmd">
|
||||||
|
<bpmndi:BPMNShape id="Participant_di" bpmnElement="Participant">
|
||||||
|
<dc:Bounds x="123" y="82" width="600" height="370" />
|
||||||
|
</bpmndi:BPMNShape>
|
||||||
|
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
|
||||||
|
<dc:Bounds x="173" y="102" width="36" height="36" />
|
||||||
|
</bpmndi:BPMNShape>
|
||||||
|
<bpmndi:BPMNShape id="Lane_di" bpmnElement="Lane">
|
||||||
|
<dc:Bounds x="153" y="82" width="570" height="250" />
|
||||||
|
</bpmndi:BPMNShape>
|
||||||
|
<bpmndi:BPMNShape id="Lane_2_di" bpmnElement="Lane_2">
|
||||||
|
<dc:Bounds x="153" y="332" width="570" height="120" />
|
||||||
|
</bpmndi:BPMNShape>
|
||||||
|
</bpmndi:BPMNPlane>
|
||||||
|
</bpmndi:BPMNDiagram>
|
||||||
|
</bpmn:definitions>
|
|
@ -0,0 +1,237 @@
|
||||||
|
import {
|
||||||
|
bootstrapModeler,
|
||||||
|
inject
|
||||||
|
} from 'test/TestHelper';
|
||||||
|
|
||||||
|
import modelingModule from 'lib/features/modeling';
|
||||||
|
import coreModule from 'lib/core';
|
||||||
|
|
||||||
|
import { getBusinessObject } from 'lib/util/ModelUtil';
|
||||||
|
|
||||||
|
|
||||||
|
describe('features/modeling/behavior - IsHorizontalFix', function() {
|
||||||
|
|
||||||
|
var diagramXML;
|
||||||
|
|
||||||
|
|
||||||
|
describe('set on create', function() {
|
||||||
|
|
||||||
|
diagramXML = require('test/fixtures/bpmn/simple.bpmn');
|
||||||
|
|
||||||
|
beforeEach(bootstrapModeler(diagramXML, {
|
||||||
|
modules: [
|
||||||
|
coreModule,
|
||||||
|
modelingModule
|
||||||
|
]
|
||||||
|
}));
|
||||||
|
|
||||||
|
|
||||||
|
it('should set isHorizontal=true when participant is created',
|
||||||
|
inject(function(canvas, elementFactory, modeling) {
|
||||||
|
// given
|
||||||
|
var processShape = canvas.getRootElement(),
|
||||||
|
participantShape = elementFactory.createParticipantShape(true);
|
||||||
|
|
||||||
|
// when
|
||||||
|
var participant = modeling.createShape(participantShape, { x: 350, y: 200 }, processShape);
|
||||||
|
|
||||||
|
// then
|
||||||
|
var isHorizontal = getBusinessObject(participant).di.get('isHorizontal');
|
||||||
|
|
||||||
|
expect(isHorizontal).to.be.true;
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
it('should set isHorizontal=true when lane is created',
|
||||||
|
inject(function(canvas, elementFactory, modeling) {
|
||||||
|
// given
|
||||||
|
var processShape = canvas.getRootElement(),
|
||||||
|
participantShape = elementFactory.createParticipantShape(true),
|
||||||
|
participant = modeling.createShape(participantShape, { x: 350, y: 200 }, processShape);
|
||||||
|
|
||||||
|
// when
|
||||||
|
var lane = modeling.addLane(participant, 'bottom');
|
||||||
|
|
||||||
|
// then
|
||||||
|
var isHorizontal = getBusinessObject(lane).di.get('isHorizontal');
|
||||||
|
|
||||||
|
expect(isHorizontal).to.be.true;
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
describe('set on change', function() {
|
||||||
|
|
||||||
|
diagramXML = require('./IsHorizontalFix.bpmn');
|
||||||
|
|
||||||
|
beforeEach(bootstrapModeler(diagramXML, {
|
||||||
|
modules: [
|
||||||
|
coreModule,
|
||||||
|
modelingModule
|
||||||
|
]
|
||||||
|
}));
|
||||||
|
|
||||||
|
|
||||||
|
it('should set isHorizontal=true when participant is moved',
|
||||||
|
inject(function(elementRegistry, modeling) {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var participant = elementRegistry.get('Participant');
|
||||||
|
|
||||||
|
// when
|
||||||
|
modeling.moveElements([ participant ], { x: 0, y: 0 });
|
||||||
|
|
||||||
|
// then
|
||||||
|
var isHorizontal = getBusinessObject(participant).di.get('isHorizontal');
|
||||||
|
|
||||||
|
expect(isHorizontal).to.be.true;
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
it('should set isHorizontal=true when lane is moved',
|
||||||
|
inject(function(elementRegistry, modeling) {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var lane = elementRegistry.get('Lane');
|
||||||
|
|
||||||
|
// when
|
||||||
|
modeling.moveElements([ lane ], { x: 0, y: 0 });
|
||||||
|
|
||||||
|
// then
|
||||||
|
var isHorizontal = getBusinessObject(lane).di.get('isHorizontal');
|
||||||
|
|
||||||
|
expect(isHorizontal).to.be.true;
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
it('should set isHorizontal=true when participant is resized',
|
||||||
|
inject(function(elementRegistry, modeling) {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var participant = elementRegistry.get('Participant');
|
||||||
|
|
||||||
|
// when
|
||||||
|
modeling.resizeShape(participant, { x: 0, y: 0, width: 10, height: 10 });
|
||||||
|
|
||||||
|
// then
|
||||||
|
var isHorizontal = getBusinessObject(participant).di.get('isHorizontal');
|
||||||
|
|
||||||
|
expect(isHorizontal).to.be.true;
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
it('should set isHorizontal=true when lane is resized',
|
||||||
|
inject(function(elementRegistry, modeling) {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var lane = elementRegistry.get('Lane');
|
||||||
|
|
||||||
|
// when
|
||||||
|
modeling.resizeLane(lane, { x: 0, y: 0, width: 10, height: 10 });
|
||||||
|
|
||||||
|
// then
|
||||||
|
var isHorizontal = getBusinessObject(lane).di.get('isHorizontal');
|
||||||
|
|
||||||
|
expect(isHorizontal).to.be.true;
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
describe('never unset on revert', function() {
|
||||||
|
|
||||||
|
diagramXML = require('./IsHorizontalFix.bpmn');
|
||||||
|
|
||||||
|
beforeEach(bootstrapModeler(diagramXML, {
|
||||||
|
modules: [
|
||||||
|
coreModule,
|
||||||
|
modelingModule
|
||||||
|
]
|
||||||
|
}));
|
||||||
|
|
||||||
|
|
||||||
|
it('should not unset isHorizontal=true when participant move action is reverted',
|
||||||
|
inject(function(commandStack, elementRegistry, modeling) {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var participant = elementRegistry.get('Participant');
|
||||||
|
|
||||||
|
modeling.moveElements([ participant ], { x: 0, y: 0 });
|
||||||
|
|
||||||
|
// when
|
||||||
|
commandStack.undo();
|
||||||
|
|
||||||
|
// then
|
||||||
|
var isHorizontal = getBusinessObject(participant).di.get('isHorizontal');
|
||||||
|
|
||||||
|
expect(isHorizontal).to.be.true;
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
it('should not unset isHorizontal=true when lane move action is reverted',
|
||||||
|
inject(function(commandStack, elementRegistry, modeling) {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var lane = elementRegistry.get('Lane');
|
||||||
|
|
||||||
|
modeling.moveElements([ lane ], { x: 0, y: 0 });
|
||||||
|
|
||||||
|
// when
|
||||||
|
commandStack.undo();
|
||||||
|
|
||||||
|
// then
|
||||||
|
var isHorizontal = getBusinessObject(lane).di.get('isHorizontal');
|
||||||
|
|
||||||
|
expect(isHorizontal).to.be.true;
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
it('should not unset isHorizontal=true when participant resize action is reverted',
|
||||||
|
inject(function(commandStack, elementRegistry, modeling) {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var participant = elementRegistry.get('Participant');
|
||||||
|
|
||||||
|
modeling.resizeShape(participant, { x: 0, y: 0, width: 10, height: 10 });
|
||||||
|
|
||||||
|
// when
|
||||||
|
commandStack.undo();
|
||||||
|
|
||||||
|
// then
|
||||||
|
var isHorizontal = getBusinessObject(participant).di.get('isHorizontal');
|
||||||
|
|
||||||
|
expect(isHorizontal).to.be.true;
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
it('should not unset isHorizontal=true when lane resize action is reverted',
|
||||||
|
inject(function(commandStack, elementRegistry, modeling) {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var lane = elementRegistry.get('Lane');
|
||||||
|
|
||||||
|
modeling.resizeLane(lane, { x: 0, y: 0, width: 10, height: 10 });
|
||||||
|
|
||||||
|
// when
|
||||||
|
commandStack.undo();
|
||||||
|
|
||||||
|
// then
|
||||||
|
var isHorizontal = getBusinessObject(lane).di.get('isHorizontal');
|
||||||
|
|
||||||
|
expect(isHorizontal).to.be.true;
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
Loading…
Reference in New Issue