91 lines
2.1 KiB
JavaScript
91 lines
2.1 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
var inherits = require('inherits');
|
||
|
|
||
|
var OrderingProvider = require('diagram-js/lib/features/ordering/OrderingProvider');
|
||
|
|
||
|
|
||
|
var findIndex = require('lodash/array/findIndex');
|
||
|
|
||
|
var find = require('lodash/collection/find');
|
||
|
|
||
|
|
||
|
/**
|
||
|
* a simple ordering provider that makes sure:
|
||
|
*
|
||
|
* (1) elements are ordered by a {level} property
|
||
|
* (2) elements with {alwaysOnTop} are always added to the root
|
||
|
*/
|
||
|
function BpmnOrderingProvider(eventBus) {
|
||
|
|
||
|
OrderingProvider.call(this, eventBus);
|
||
|
|
||
|
var orders = [
|
||
|
{ type: 'label', order: { level: 7 } },
|
||
|
{ type: 'bpmn:SequenceFlow', order: { level: 5 } },
|
||
|
{ type: 'bpmn:MessageFlow', order: { level: 6, top: true } },
|
||
|
{ type: 'bpmn:BoundaryEvent', order: { level: 4 } },
|
||
|
{ type: 'bpmn:Participant', order: { level: -2 } },
|
||
|
{ type: 'bpmn:Lane', order: { level: -1 } }
|
||
|
];
|
||
|
|
||
|
function computeOrder(element) {
|
||
|
var entry = find(orders, function(o) {
|
||
|
return element.type === o.type;
|
||
|
});
|
||
|
|
||
|
return entry && entry.order || { level: 1 };
|
||
|
}
|
||
|
|
||
|
function getOrder(element) {
|
||
|
|
||
|
var order = element.order;
|
||
|
|
||
|
if (!order) {
|
||
|
element.order = order = computeOrder(element);
|
||
|
}
|
||
|
|
||
|
return order;
|
||
|
}
|
||
|
|
||
|
this.getOrdering = function(element, newParent) {
|
||
|
|
||
|
var elementOrder = getOrder(element);
|
||
|
|
||
|
|
||
|
if (elementOrder.top) {
|
||
|
while (newParent.parent) {
|
||
|
newParent = newParent.parent;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
var currentIndex = newParent.children.indexOf(element);
|
||
|
|
||
|
var insertIndex = findIndex(newParent.children, function(child) {
|
||
|
return elementOrder.level < getOrder(child).level;
|
||
|
});
|
||
|
|
||
|
|
||
|
// if the element is already in the child list at
|
||
|
// a smaller index, we need to adjust the inser index.
|
||
|
// this takes into account that the element is being removed
|
||
|
// before being re-inserted
|
||
|
if (insertIndex !== -1) {
|
||
|
if (currentIndex !== -1 && currentIndex < insertIndex) {
|
||
|
insertIndex -= 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return {
|
||
|
index: insertIndex,
|
||
|
parent: newParent
|
||
|
};
|
||
|
};
|
||
|
}
|
||
|
|
||
|
BpmnOrderingProvider.$inject = [ 'eventBus' ];
|
||
|
|
||
|
inherits(BpmnOrderingProvider, OrderingProvider);
|
||
|
|
||
|
module.exports = BpmnOrderingProvider;
|