You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
186 lines
4.4 KiB
186 lines
4.4 KiB
2 years ago
|
import {
|
||
|
getBusinessObject,
|
||
|
getDi,
|
||
|
is
|
||
|
} from '../../util/ModelUtil';
|
||
|
|
||
|
import {
|
||
|
forEach,
|
||
|
isArray,
|
||
|
isUndefined,
|
||
|
omit,
|
||
|
reduce
|
||
|
} from 'min-dash';
|
||
|
|
||
|
function copyProperties(source, target, properties) {
|
||
|
if (!isArray(properties)) {
|
||
|
properties = [ properties ];
|
||
|
}
|
||
|
|
||
|
forEach(properties, function(property) {
|
||
|
if (!isUndefined(source[property])) {
|
||
|
target[property] = source[property];
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
var LOW_PRIORITY = 750;
|
||
|
|
||
|
|
||
|
export default function BpmnCopyPaste(bpmnFactory, eventBus, moddleCopy) {
|
||
|
|
||
|
function copy(bo, clone) {
|
||
|
var targetBo = bpmnFactory.create(bo.$type);
|
||
|
|
||
|
return moddleCopy.copyElement(bo, targetBo, null, clone);
|
||
|
}
|
||
|
|
||
|
eventBus.on('copyPaste.copyElement', LOW_PRIORITY, function(context) {
|
||
|
var descriptor = context.descriptor,
|
||
|
element = context.element,
|
||
|
businessObject = getBusinessObject(element);
|
||
|
|
||
|
// do not copy business object + di for labels;
|
||
|
// will be pulled from the referenced label target
|
||
|
if (isLabel(element)) {
|
||
|
return descriptor;
|
||
|
}
|
||
|
|
||
|
var businessObjectCopy = descriptor.businessObject = copy(businessObject, true);
|
||
|
var diCopy = descriptor.di = copy(getDi(element), true);
|
||
|
diCopy.bpmnElement = businessObjectCopy;
|
||
|
|
||
|
copyProperties(businessObjectCopy, descriptor, 'name');
|
||
|
copyProperties(diCopy, descriptor, 'isExpanded');
|
||
|
|
||
|
// default sequence flow
|
||
|
if (businessObject.default) {
|
||
|
descriptor.default = businessObject.default.id;
|
||
|
}
|
||
|
});
|
||
|
|
||
|
var referencesKey = '-bpmn-js-refs';
|
||
|
|
||
|
function getReferences(cache) {
|
||
|
return (cache[referencesKey] = cache[referencesKey] || {});
|
||
|
}
|
||
|
|
||
|
function setReferences(cache, references) {
|
||
|
cache[referencesKey] = references;
|
||
|
}
|
||
|
|
||
|
function resolveReferences(descriptor, cache, references) {
|
||
|
var businessObject = getBusinessObject(descriptor);
|
||
|
|
||
|
// default sequence flows
|
||
|
if (descriptor.default) {
|
||
|
|
||
|
// relationship cannot be resolved immediately
|
||
|
references[ descriptor.default ] = {
|
||
|
element: businessObject,
|
||
|
property: 'default'
|
||
|
};
|
||
|
}
|
||
|
|
||
|
// boundary events
|
||
|
if (descriptor.host) {
|
||
|
|
||
|
// relationship can be resolved immediately
|
||
|
getBusinessObject(descriptor).attachedToRef = getBusinessObject(cache[ descriptor.host ]);
|
||
|
}
|
||
|
|
||
|
return omit(references, reduce(references, function(array, reference, key) {
|
||
|
var element = reference.element,
|
||
|
property = reference.property;
|
||
|
|
||
|
if (key === descriptor.id) {
|
||
|
element[ property ] = businessObject;
|
||
|
|
||
|
array.push(descriptor.id);
|
||
|
}
|
||
|
|
||
|
return array;
|
||
|
}, []));
|
||
|
}
|
||
|
|
||
|
eventBus.on('copyPaste.pasteElement', function(context) {
|
||
|
var cache = context.cache,
|
||
|
descriptor = context.descriptor,
|
||
|
businessObject = descriptor.businessObject,
|
||
|
di = descriptor.di;
|
||
|
|
||
|
// wire existing di + businessObject for external label
|
||
|
if (isLabel(descriptor)) {
|
||
|
descriptor.businessObject = getBusinessObject(cache[ descriptor.labelTarget ]);
|
||
|
descriptor.di = getDi(cache[ descriptor.labelTarget ]);
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
businessObject = descriptor.businessObject = copy(businessObject);
|
||
|
|
||
|
di = descriptor.di = copy(di);
|
||
|
di.bpmnElement = businessObject;
|
||
|
|
||
|
copyProperties(descriptor, businessObject, [
|
||
|
'isExpanded',
|
||
|
'name'
|
||
|
]);
|
||
|
|
||
|
descriptor.type = businessObject.$type;
|
||
|
});
|
||
|
|
||
|
// copy + paste processRef with participant
|
||
|
|
||
|
eventBus.on('copyPaste.copyElement', LOW_PRIORITY, function(context) {
|
||
|
var descriptor = context.descriptor,
|
||
|
element = context.element;
|
||
|
|
||
|
if (!is(element, 'bpmn:Participant')) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var participantBo = getBusinessObject(element);
|
||
|
|
||
|
if (participantBo.processRef) {
|
||
|
descriptor.processRef = copy(participantBo.processRef, true);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
eventBus.on('copyPaste.pasteElement', function(context) {
|
||
|
var descriptor = context.descriptor,
|
||
|
processRef = descriptor.processRef;
|
||
|
|
||
|
if (processRef) {
|
||
|
descriptor.processRef = copy(processRef);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// resolve references
|
||
|
|
||
|
eventBus.on('copyPaste.pasteElement', LOW_PRIORITY, function(context) {
|
||
|
var cache = context.cache,
|
||
|
descriptor = context.descriptor;
|
||
|
|
||
|
// resolve references e.g. default sequence flow
|
||
|
setReferences(
|
||
|
cache,
|
||
|
resolveReferences(descriptor, cache, getReferences(cache))
|
||
|
);
|
||
|
});
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
BpmnCopyPaste.$inject = [
|
||
|
'bpmnFactory',
|
||
|
'eventBus',
|
||
|
'moddleCopy'
|
||
|
];
|
||
|
|
||
|
// helpers //////////
|
||
|
|
||
|
function isLabel(element) {
|
||
|
return !!element.labelTarget;
|
||
|
}
|