ruoyi-vue-nocode/ruoyi-ui/ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/implementation/CompensateEventDefinition.js
2022-08-11 16:10:41 +08:00

131 lines
4.2 KiB
JavaScript

'use strict';
var entryFactory = require('../../../../factory/EntryFactory');
var cmdHelper = require('../../../../helper/CmdHelper'),
eventDefinitionHelper = require('../../../../helper/EventDefinitionHelper'),
utils = require('../../../../Utils');
var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject,
is = require('bpmn-js/lib/util/ModelUtil').is;
var forEach = require('lodash/forEach'),
find = require('lodash/find'),
filter = require('lodash/filter');
function getContainedActivities(element) {
return getFlowElements(element, 'bpmn:Activity');
}
function getContainedBoundaryEvents(element) {
return getFlowElements(element, 'bpmn:BoundaryEvent');
}
function getFlowElements(element, type) {
return utils.filterElementsByType(element.flowElements, type);
}
function isCompensationEventAttachedToActivity(activity, boundaryEvents) {
var activityId = activity.id;
var boundaryEvent = find(boundaryEvents, function(boundaryEvent) {
var compensateEventDefinition = eventDefinitionHelper.getCompensateEventDefinition(boundaryEvent);
var attachedToRef = boundaryEvent.attachedToRef;
return compensateEventDefinition && attachedToRef && attachedToRef.id === activityId;
});
return !!boundaryEvent;
}
// subprocess: only when it is not triggeredByEvent
// activity: only when it attach a compensation boundary event
// callActivity: no limitation
function canActivityBeCompensated(activity, boundaryEvents) {
return (is(activity, 'bpmn:SubProcess') && !activity.triggeredByEvent) ||
is(activity, 'bpmn:CallActivity') ||
isCompensationEventAttachedToActivity(activity, boundaryEvents);
}
function getActivitiesForCompensation(element) {
var boundaryEvents = getContainedBoundaryEvents(element);
return filter(getContainedActivities(element), function(activity) {
return canActivityBeCompensated(activity, boundaryEvents);
});
}
function getActivitiesForActivityRef(element) {
var bo = getBusinessObject(element);
var parent = bo.$parent;
var activitiesForActivityRef = getActivitiesForCompensation(parent);
// if throwing compensation event is in an event sub process:
// get also all activities outside of the event sub process
if (is(parent, 'bpmn:SubProcess') && parent.triggeredByEvent) {
parent = parent.$parent;
if (parent) {
activitiesForActivityRef = activitiesForActivityRef.concat(getActivitiesForCompensation(parent));
}
}
return activitiesForActivityRef;
}
function createActivityRefOptions(element) {
var options = [ { value: '' } ];
var activities = getActivitiesForActivityRef(element);
forEach(activities, function(activity) {
var activityId = activity.id;
var name = (activity.name ? (activity.name + ' ') : '') + '(id=' + activityId + ')';
options.push({ value: activityId, name: name });
});
return options;
}
module.exports = function(group, element, bpmnFactory, compensateEventDefinition, elementRegistry, translate) {
group.entries.push(entryFactory.checkbox({
id: 'wait-for-completion',
label: translate('Wait for Completion'),
modelProperty: 'waitForCompletion',
get: function(element, node) {
return {
waitForCompletion: compensateEventDefinition.waitForCompletion
};
},
set: function(element, values) {
values.waitForCompletion = values.waitForCompletion || false;
return cmdHelper.updateBusinessObject(element, compensateEventDefinition, values);
}
}));
group.entries.push(entryFactory.selectBox({
id: 'activity-ref',
label: translate('Activity Ref'),
selectOptions: createActivityRefOptions(element),
modelProperty: 'activityRef',
get: function(element, node) {
var activityRef = compensateEventDefinition.activityRef;
activityRef = activityRef && activityRef.id;
return {
activityRef: activityRef || ''
};
},
set: function(element, values) {
var activityRef = values.activityRef || undefined;
activityRef = activityRef && getBusinessObject(elementRegistry.get(activityRef));
return cmdHelper.updateBusinessObject(element, compensateEventDefinition, {
activityRef: activityRef
});
}
}));
};