feat(ordering): add sequence flow + association to correct parent

* remove ModelUtil#getSharedParent because we do proper ordering
  via BpmnOrderingProvider now.
* Cherio!

Related to #316
This commit is contained in:
Nico Rehwaldt 2015-08-21 14:21:56 +02:00 committed by pedesen
parent e66f2d92aa
commit d9788c7f31
4 changed files with 58 additions and 29 deletions

View File

@ -47,8 +47,6 @@ Modeling.prototype.updateLabel = function(element, newLabel) {
}; };
var getSharedParent = require('./ModelingUtil').getSharedParent;
Modeling.prototype.connect = function(source, target, attrs) { Modeling.prototype.connect = function(source, target, attrs) {
var bpmnRules = this._bpmnRules; var bpmnRules = this._bpmnRules;
@ -70,7 +68,7 @@ Modeling.prototype.connect = function(source, target, attrs) {
} }
} }
return this.createConnection(source, target, attrs, getSharedParent(source, target)); return this.createConnection(source, target, attrs, source.parent);
}; };

View File

@ -1,7 +1,5 @@
'use strict'; 'use strict';
var find = require('lodash/collection/find');
function getParents(element) { function getParents(element) {
@ -18,17 +16,4 @@ function getParents(element) {
return parents; return parents;
} }
module.exports.getParents = getParents; module.exports.getParents = getParents;
function getSharedParent(a, b) {
var parentsA = getParents(a),
parentsB = getParents(b);
return find(parentsA, function(parent) {
return parentsB.indexOf(parent) !== -1;
});
}
module.exports.getSharedParent = getSharedParent;

View File

@ -5,8 +5,7 @@ var forEach = require('lodash/collection/forEach'),
var CommandInterceptor = require('diagram-js/lib/command/CommandInterceptor'); var CommandInterceptor = require('diagram-js/lib/command/CommandInterceptor');
var is = require('../../../util/ModelUtil').is, var is = require('../../../util/ModelUtil').is;
getSharedParent = require('../ModelingUtil').getSharedParent;
function ReplaceConnectionBehavior(eventBus, modeling, bpmnRules) { function ReplaceConnectionBehavior(eventBus, modeling, bpmnRules) {
@ -73,10 +72,10 @@ function ReplaceConnectionBehavior(eventBus, modeling, bpmnRules) {
// replace SequenceFlow <> MessageFlow // replace SequenceFlow <> MessageFlow
if (replacementType) { if (replacementType) {
modeling.createConnection(source, target, { modeling.connect(source, target, {
type: replacementType, type: replacementType,
waypoints: connection.waypoints.slice() waypoints: connection.waypoints.slice()
}, getSharedParent(source, target)); });
} }
} }

View File

@ -4,6 +4,7 @@ var inherits = require('inherits');
var OrderingProvider = require('diagram-js/lib/features/ordering/OrderingProvider'); var OrderingProvider = require('diagram-js/lib/features/ordering/OrderingProvider');
var is = require('../../util/ModelUtil').is;
var findIndex = require('lodash/array/findIndex'); var findIndex = require('lodash/array/findIndex');
@ -22,8 +23,28 @@ function BpmnOrderingProvider(eventBus) {
var orders = [ var orders = [
{ type: 'label', order: { level: 7 } }, { type: 'label', order: { level: 7 } },
{ type: 'bpmn:SequenceFlow', order: { level: 5 } }, {
{ type: 'bpmn:MessageFlow', order: { level: 6, top: true } }, type: 'bpmn:SequenceFlow',
order: {
level: 5,
containers: [
'bpmn:Participant',
'bpmn:FlowElementsContainer'
]
}
},
{
type: 'bpmn:Association',
order: {
level: 6,
containers: [
'bpmn:Participant',
'bpmn:FlowElementsContainer',
'bpmn:Collaboration'
]
}
},
{ type: 'bpmn:MessageFlow', order: { level: 6, containers: [ 'bpmn:Collaboration' ] } },
{ type: 'bpmn:BoundaryEvent', order: { level: 4 } }, { type: 'bpmn:BoundaryEvent', order: { level: 4 } },
{ type: 'bpmn:Participant', order: { level: -2 } }, { type: 'bpmn:Participant', order: { level: -2 } },
{ type: 'bpmn:Lane', order: { level: -1 } } { type: 'bpmn:Lane', order: { level: -1 } }
@ -48,15 +69,41 @@ function BpmnOrderingProvider(eventBus) {
return order; return order;
} }
var any = require('lodash/collection/any');
function isAny(element, types) {
return any(types, function(t) {
return is(element, t);
});
}
function findActualParent(element, newParent, containers) {
var actualParent = newParent;
while (actualParent) {
if (isAny(actualParent, containers)) {
break;
}
actualParent = actualParent.parent;
}
if (!actualParent) {
throw new Error('no parent for ' + element.id + ' in ' + newParent.id);
}
return actualParent;
}
this.getOrdering = function(element, newParent) { this.getOrdering = function(element, newParent) {
var elementOrder = getOrder(element); var elementOrder = getOrder(element);
if (elementOrder.top) { if (elementOrder.containers) {
while (newParent.parent) { newParent = findActualParent(element, newParent, elementOrder.containers);
newParent = newParent.parent;
}
} }