MultiInstanceLoopCharacteristics.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. 'use strict';
  2. var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject,
  3. escapeHTML = require('../../../../Utils').escapeHTML;
  4. var entryFactory = require('../../../../factory/EntryFactory');
  5. var elementHelper = require('../../../../helper/ElementHelper'),
  6. cmdHelper = require('../../../../helper/CmdHelper');
  7. var domClasses = require('min-dom').classes;
  8. /**
  9. * Get a property value of the loop characteristics.
  10. *
  11. * @param {djs.model.Base} element
  12. * @param {string} propertyName
  13. *
  14. * @return {any} the property value
  15. */
  16. function getProperty(element, propertyName) {
  17. var loopCharacteristics = getLoopCharacteristics(element);
  18. return loopCharacteristics && loopCharacteristics.get(propertyName);
  19. }
  20. /**
  21. * Get the body of a given expression.
  22. *
  23. * @param {ModdleElement<bpmn:FormalExpression>} expression
  24. *
  25. * @return {string} the body (value) of the expression
  26. */
  27. function getBody(expression) {
  28. return expression && expression.get('body');
  29. }
  30. /**
  31. * Get the loop characteristics of an element.
  32. *
  33. * @param {djs.model.Base} element
  34. *
  35. * @return {ModdleElement<bpmn:MultiInstanceLoopCharacteristics>} the loop characteristics
  36. */
  37. function getLoopCharacteristics(element) {
  38. var bo = getBusinessObject(element);
  39. return bo.loopCharacteristics;
  40. }
  41. /**
  42. * Get the loop cardinality of the loop characteristics.
  43. *
  44. * @param {djs.model.Base} element
  45. *
  46. * @return {ModdleElement<bpmn:FormalExpression>} an expression representing the loop cardinality
  47. */
  48. function getLoopCardinality(element) {
  49. return getProperty(element, 'loopCardinality');
  50. }
  51. /**
  52. * Get the loop cardinality value of the loop characteristics.
  53. *
  54. * @param {djs.model.Base} element
  55. *
  56. * @return {string} the loop cardinality value
  57. */
  58. function getLoopCardinalityValue(element) {
  59. var loopCardinality = getLoopCardinality(element);
  60. return getBody(loopCardinality);
  61. }
  62. /**
  63. * Get the completion condition of the loop characteristics.
  64. *
  65. * @param {djs.model.Base} element
  66. *
  67. * @return {ModdleElement<bpmn:FormalExpression>} an expression representing the completion condition
  68. */
  69. function getCompletionCondition(element) {
  70. return getProperty(element, 'completionCondition');
  71. }
  72. /**
  73. * Get the completion condition value of the loop characteristics.
  74. *
  75. * @param {djs.model.Base} element
  76. *
  77. * @return {string} the completion condition value
  78. */
  79. function getCompletionConditionValue(element) {
  80. var completionCondition = getCompletionCondition(element);
  81. return getBody(completionCondition);
  82. }
  83. /**
  84. * Get the 'activiti:collection' attribute value of the loop characteristics.
  85. *
  86. * @param {djs.model.Base} element
  87. *
  88. * @return {string} the 'activiti:collection' value
  89. */
  90. function getCollection(element) {
  91. return getProperty(element, 'activiti:collection');
  92. }
  93. /**
  94. * Get the 'activiti:elementVariable' attribute value of the loop characteristics.
  95. *
  96. * @param {djs.model.Base} element
  97. *
  98. * @return {string} the 'activiti:elementVariable' value
  99. */
  100. function getElementVariable(element) {
  101. return getProperty(element, 'activiti:elementVariable');
  102. }
  103. /**
  104. * Creates 'bpmn:FormalExpression' element.
  105. *
  106. * @param {ModdleElement} parent
  107. * @param {string} body
  108. * @param {BpmnFactory} bpmnFactory
  109. *
  110. * @result {ModdleElement<bpmn:FormalExpression>} a formal expression
  111. */
  112. function createFormalExpression(parent, body, bpmnFactory) {
  113. return elementHelper.createElement('bpmn:FormalExpression', { body: body }, parent, bpmnFactory);
  114. }
  115. /**
  116. * Updates a specific formal expression of the loop characteristics.
  117. *
  118. * @param {djs.model.Base} element
  119. * @param {string} propertyName
  120. * @param {string} newValue
  121. * @param {BpmnFactory} bpmnFactory
  122. */
  123. function updateFormalExpression(element, propertyName, newValue, bpmnFactory) {
  124. var loopCharacteristics = getLoopCharacteristics(element);
  125. var expressionProps = {};
  126. if (!newValue) {
  127. // remove formal expression
  128. expressionProps[propertyName] = undefined;
  129. return cmdHelper.updateBusinessObject(element, loopCharacteristics, expressionProps);
  130. }
  131. var existingExpression = loopCharacteristics.get(propertyName);
  132. if (!existingExpression) {
  133. // add formal expression
  134. expressionProps[propertyName] = createFormalExpression(loopCharacteristics, newValue, bpmnFactory);
  135. return cmdHelper.updateBusinessObject(element, loopCharacteristics, expressionProps);
  136. }
  137. // edit existing formal expression
  138. return cmdHelper.updateBusinessObject(element, existingExpression, {
  139. body: newValue
  140. });
  141. }
  142. module.exports = function(element, bpmnFactory, translate) {
  143. var entries = [];
  144. // error message /////////////////////////////////////////////////////////////////
  145. entries.push({
  146. id: 'multiInstance-errorMessage',
  147. html: '<div data-show="isValid">' +
  148. '<span class="bpp-icon-warning"></span> ' +
  149. escapeHTML(translate('Must provide either loop cardinality or collection')) +
  150. '</div>',
  151. isValid: function(element, node, notification, scope) {
  152. var loopCharacteristics = getLoopCharacteristics(element);
  153. var isValid = true;
  154. if (loopCharacteristics) {
  155. var loopCardinality = getLoopCardinalityValue(element);
  156. var collection = getCollection(element);
  157. isValid = !loopCardinality && !collection;
  158. }
  159. domClasses(node).toggle('bpp-hidden', !isValid);
  160. domClasses(notification).toggle('bpp-error-message', isValid);
  161. return isValid;
  162. }
  163. });
  164. // loop cardinality //////////////////////////////////////////////////////////////
  165. entries.push(entryFactory.textField({
  166. id: 'multiInstance-loopCardinality',
  167. label: translate('Loop Cardinality'),
  168. modelProperty: 'loopCardinality',
  169. get: function(element, node) {
  170. return {
  171. loopCardinality: getLoopCardinalityValue(element)
  172. };
  173. },
  174. set: function(element, values) {
  175. return updateFormalExpression(element, 'loopCardinality', values.loopCardinality, bpmnFactory);
  176. }
  177. }));
  178. // collection //////////////////////////////////////////////////////////////////
  179. entries.push(entryFactory.textField({
  180. id: 'multiInstance-collection',
  181. label: translate('Collection'),
  182. modelProperty: 'collection',
  183. get: function(element, node) {
  184. return {
  185. collection: getCollection(element)
  186. };
  187. },
  188. set: function(element, values) {
  189. var loopCharacteristics = getLoopCharacteristics(element);
  190. return cmdHelper.updateBusinessObject(element, loopCharacteristics, {
  191. 'activiti:collection': values.collection || undefined
  192. });
  193. },
  194. validate: function(element, values, node) {
  195. var collection = getCollection(element);
  196. var elementVariable = getElementVariable(element);
  197. if (!collection && elementVariable) {
  198. return { collection : 'Must provide a value' };
  199. }
  200. }
  201. }));
  202. // element variable ////////////////////////////////////////////////////////////
  203. entries.push(entryFactory.textField({
  204. id: 'multiInstance-elementVariable',
  205. label: translate('Element Variable'),
  206. modelProperty: 'elementVariable',
  207. get: function(element, node) {
  208. return {
  209. elementVariable: getElementVariable(element)
  210. };
  211. },
  212. set: function(element, values) {
  213. var loopCharacteristics = getLoopCharacteristics(element);
  214. return cmdHelper.updateBusinessObject(element, loopCharacteristics, {
  215. 'activiti:elementVariable': values.elementVariable || undefined
  216. });
  217. }
  218. }));
  219. // Completion Condition //////////////////////////////////////////////////////
  220. entries.push(entryFactory.textField({
  221. id: 'multiInstance-completionCondition',
  222. label: translate('Completion Condition'),
  223. modelProperty: 'completionCondition',
  224. get: function(element) {
  225. return {
  226. completionCondition: getCompletionConditionValue(element)
  227. };
  228. },
  229. set: function(element, values) {
  230. return updateFormalExpression(element, 'completionCondition', values.completionCondition, bpmnFactory);
  231. }
  232. }));
  233. return entries;
  234. };