Properties.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. 'use strict';
  2. var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject,
  3. is = require('bpmn-js/lib/util/ModelUtil').is;
  4. var factory = require('../../../../factory/EntryFactory');
  5. var elementHelper = require('../../../../helper/ElementHelper'),
  6. extensionElementsHelper = require('../../../../helper/ExtensionElementsHelper'),
  7. cmdHelper = require('../../../../helper/CmdHelper'),
  8. utils = require('../../../../Utils');
  9. var assign = require('lodash/assign'),
  10. forEach = require('lodash/forEach'),
  11. find = require('lodash/find');
  12. function generatePropertyId() {
  13. return utils.nextId('Property_');
  14. }
  15. /**
  16. * Get all activiti:property objects for a specific business object
  17. *
  18. * @param {ModdleElement} parent
  19. *
  20. * @return {Array<ModdleElement>} a list of activiti:property objects
  21. */
  22. function getPropertyValues(parent) {
  23. var properties = parent && getPropertiesElement(parent);
  24. if (properties && properties.values) {
  25. return properties.values;
  26. }
  27. return [];
  28. }
  29. /**
  30. * Get all activiti:Properties object for a specific business object
  31. *
  32. * @param {ModdleElement} parent
  33. *
  34. * @return {ModdleElement} a activiti:Properties object
  35. */
  36. function getPropertiesElement(element) {
  37. if (!isExtensionElements(element)) {
  38. return element.properties;
  39. } else {
  40. return getPropertiesElementInsideExtensionElements(element);
  41. }
  42. }
  43. /**
  44. * Get first activiti:Properties object for a specific bpmn:ExtensionElements
  45. * business object.
  46. *
  47. * @param {ModdleElement} extensionElements
  48. *
  49. * @return {ModdleElement} a activiti:Properties object
  50. */
  51. function getPropertiesElementInsideExtensionElements(extensionElements) {
  52. return find(extensionElements.values, function(elem) {
  53. return is(elem, 'activiti:Properties');
  54. });
  55. }
  56. /**
  57. * Returns true, if the given business object is a bpmn:ExtensionElements.
  58. *
  59. * @param {ModdleElement} element
  60. *
  61. * @return {boolean} a boolean value
  62. */
  63. function isExtensionElements(element) {
  64. return is(element, 'bpmn:ExtensionElements');
  65. }
  66. /**
  67. * Create a activiti:property entry using tableEntryFactory
  68. *
  69. * @param {djs.model.Base} element
  70. * @param {BpmnFactory} bpmnFactory
  71. * @param {Object} options
  72. * @param {string} options.id
  73. * @param {Array<string>} options.modelProperties
  74. * @param {Array<string>} options.labels
  75. * @param {function} options.getParent Gets the parent business object
  76. * @param {function} options.show Indicate when the entry will be shown, should return boolean
  77. */
  78. module.exports = function(element, bpmnFactory, options, translate) {
  79. var getParent = options.getParent;
  80. var modelProperties = options.modelProperties,
  81. createParent = options.createParent;
  82. var bo = getBusinessObject(element);
  83. if (is(element, 'bpmn:Participant')) {
  84. bo = bo.get('processRef');
  85. }
  86. // build properties group only when the participant have a processRef
  87. if (!bo) {
  88. return;
  89. }
  90. assign(options, {
  91. addLabel: translate('Add Property'),
  92. getElements: function(element, node) {
  93. var parent = getParent(element, node, bo);
  94. return getPropertyValues(parent);
  95. },
  96. addElement: function(element, node) {
  97. var commands = [],
  98. parent = getParent(element, node, bo);
  99. if (!parent && typeof createParent === 'function') {
  100. var result = createParent(element, bo);
  101. parent = result.parent;
  102. commands.push(result.cmd);
  103. }
  104. var properties = getPropertiesElement(parent);
  105. if (!properties) {
  106. properties = elementHelper.createElement('activiti:Properties', {}, parent, bpmnFactory);
  107. if (!isExtensionElements(parent)) {
  108. commands.push(cmdHelper.updateBusinessObject(element, parent, { 'properties': properties }));
  109. } else {
  110. commands.push(cmdHelper.addAndRemoveElementsFromList(
  111. element,
  112. parent,
  113. 'values',
  114. 'extensionElements',
  115. [ properties ],
  116. []
  117. ));
  118. }
  119. }
  120. var propertyProps = {};
  121. forEach(modelProperties, function(prop) {
  122. propertyProps[prop] = undefined;
  123. });
  124. // create id if necessary
  125. if (modelProperties.indexOf('id') >= 0) {
  126. propertyProps.id = generatePropertyId();
  127. }
  128. var property = elementHelper.createElement('activiti:Property', propertyProps, properties, bpmnFactory);
  129. commands.push(cmdHelper.addElementsTolist(element, properties, 'values', [ property ]));
  130. return commands;
  131. },
  132. updateElement: function(element, value, node, idx) {
  133. var parent = getParent(element, node, bo),
  134. property = getPropertyValues(parent)[idx];
  135. forEach(modelProperties, function(prop) {
  136. value[prop] = value[prop] || undefined;
  137. });
  138. return cmdHelper.updateBusinessObject(element, property, value);
  139. },
  140. validate: function(element, value, node, idx) {
  141. // validate id if necessary
  142. if (modelProperties.indexOf('id') >= 0) {
  143. var parent = getParent(element, node, bo),
  144. properties = getPropertyValues(parent),
  145. property = properties[idx];
  146. if (property) {
  147. // check if id is valid
  148. var validationError = utils.isIdValid(property, value.id, translate);
  149. if (validationError) {
  150. return { id: validationError };
  151. }
  152. }
  153. }
  154. },
  155. removeElement: function(element, node, idx) {
  156. var commands = [],
  157. parent = getParent(element, node, bo),
  158. properties = getPropertiesElement(parent),
  159. propertyValues = getPropertyValues(parent),
  160. currentProperty = propertyValues[idx];
  161. commands.push(cmdHelper.removeElementsFromList(element, properties, 'values', null, [ currentProperty ]));
  162. if (propertyValues.length === 1) {
  163. // remove activiti:properties if the last existing property has been removed
  164. if (!isExtensionElements(parent)) {
  165. commands.push(cmdHelper.updateBusinessObject(element, parent, { properties: undefined }));
  166. } else {
  167. forEach(parent.values, function(value) {
  168. if (is(value, 'activiti:Properties')) {
  169. commands.push(extensionElementsHelper.removeEntry(bo, element, value));
  170. }
  171. });
  172. }
  173. }
  174. return commands;
  175. }
  176. });
  177. return factory.table(options);
  178. };