CompensateEventDefinition.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. 'use strict';
  2. var entryFactory = require('../../../../factory/EntryFactory');
  3. var cmdHelper = require('../../../../helper/CmdHelper'),
  4. eventDefinitionHelper = require('../../../../helper/EventDefinitionHelper'),
  5. utils = require('../../../../Utils');
  6. var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject,
  7. is = require('bpmn-js/lib/util/ModelUtil').is;
  8. var forEach = require('lodash/forEach'),
  9. find = require('lodash/find'),
  10. filter = require('lodash/filter');
  11. function getContainedActivities(element) {
  12. return getFlowElements(element, 'bpmn:Activity');
  13. }
  14. function getContainedBoundaryEvents(element) {
  15. return getFlowElements(element, 'bpmn:BoundaryEvent');
  16. }
  17. function getFlowElements(element, type) {
  18. return utils.filterElementsByType(element.flowElements, type);
  19. }
  20. function isCompensationEventAttachedToActivity(activity, boundaryEvents) {
  21. var activityId = activity.id;
  22. var boundaryEvent = find(boundaryEvents, function(boundaryEvent) {
  23. var compensateEventDefinition = eventDefinitionHelper.getCompensateEventDefinition(boundaryEvent);
  24. var attachedToRef = boundaryEvent.attachedToRef;
  25. return compensateEventDefinition && attachedToRef && attachedToRef.id === activityId;
  26. });
  27. return !!boundaryEvent;
  28. }
  29. // subprocess: only when it is not triggeredByEvent
  30. // activity: only when it attach a compensation boundary event
  31. // callActivity: no limitation
  32. function canActivityBeCompensated(activity, boundaryEvents) {
  33. return (is(activity, 'bpmn:SubProcess') && !activity.triggeredByEvent) ||
  34. is(activity, 'bpmn:CallActivity') ||
  35. isCompensationEventAttachedToActivity(activity, boundaryEvents);
  36. }
  37. function getActivitiesForCompensation(element) {
  38. var boundaryEvents = getContainedBoundaryEvents(element);
  39. return filter(getContainedActivities(element), function(activity) {
  40. return canActivityBeCompensated(activity, boundaryEvents);
  41. });
  42. }
  43. function getActivitiesForActivityRef(element) {
  44. var bo = getBusinessObject(element);
  45. var parent = bo.$parent;
  46. var activitiesForActivityRef = getActivitiesForCompensation(parent);
  47. // if throwing compensation event is in an event sub process:
  48. // get also all activities outside of the event sub process
  49. if (is(parent, 'bpmn:SubProcess') && parent.triggeredByEvent) {
  50. parent = parent.$parent;
  51. if (parent) {
  52. activitiesForActivityRef = activitiesForActivityRef.concat(getActivitiesForCompensation(parent));
  53. }
  54. }
  55. return activitiesForActivityRef;
  56. }
  57. function createActivityRefOptions(element) {
  58. var options = [ { value: '' } ];
  59. var activities = getActivitiesForActivityRef(element);
  60. forEach(activities, function(activity) {
  61. var activityId = activity.id;
  62. var name = (activity.name ? (activity.name + ' ') : '') + '(id=' + activityId + ')';
  63. options.push({ value: activityId, name: name });
  64. });
  65. return options;
  66. }
  67. module.exports = function(group, element, bpmnFactory, compensateEventDefinition, elementRegistry, translate) {
  68. group.entries.push(entryFactory.checkbox({
  69. id: 'wait-for-completion',
  70. label: translate('Wait for Completion'),
  71. modelProperty: 'waitForCompletion',
  72. get: function(element, node) {
  73. return {
  74. waitForCompletion: compensateEventDefinition.waitForCompletion
  75. };
  76. },
  77. set: function(element, values) {
  78. values.waitForCompletion = values.waitForCompletion || false;
  79. return cmdHelper.updateBusinessObject(element, compensateEventDefinition, values);
  80. }
  81. }));
  82. group.entries.push(entryFactory.selectBox({
  83. id: 'activity-ref',
  84. label: translate('Activity Ref'),
  85. selectOptions: createActivityRefOptions(element),
  86. modelProperty: 'activityRef',
  87. get: function(element, node) {
  88. var activityRef = compensateEventDefinition.activityRef;
  89. activityRef = activityRef && activityRef.id;
  90. return {
  91. activityRef: activityRef || ''
  92. };
  93. },
  94. set: function(element, values) {
  95. var activityRef = values.activityRef || undefined;
  96. activityRef = activityRef && getBusinessObject(elementRegistry.get(activityRef));
  97. return cmdHelper.updateBusinessObject(element, compensateEventDefinition, {
  98. activityRef: activityRef
  99. });
  100. }
  101. }));
  102. };