FieldInjection.js 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. 'use strict';
  2. var extensionElementsHelper = require('../../../../helper/ExtensionElementsHelper'),
  3. elementHelper = require('../../../../helper/ElementHelper'),
  4. cmdHelper = require('../../../../helper/CmdHelper');
  5. var utils = require('../../../../Utils');
  6. var entryFactory = require('../../../../factory/EntryFactory');
  7. var extensionElementsEntry = require('./ExtensionElements');
  8. var ModelUtil = require('bpmn-js/lib/util/ModelUtil'),
  9. getBusinessObject = ModelUtil.getBusinessObject;
  10. var assign = require('lodash/assign');
  11. var DEFAULT_PROPS = {
  12. 'stringValue': undefined,
  13. 'string': undefined,
  14. 'expression': undefined
  15. };
  16. var ACTIVITI_FIELD_EXTENSION_ELEMENT = 'activiti:Field';
  17. module.exports = function(element, bpmnFactory, translate, options) {
  18. options = options || {};
  19. var insideListener = !!options.insideListener,
  20. idPrefix = options.idPrefix || '',
  21. getSelectedListener = options.getSelectedListener,
  22. businessObject = options.businessObject || getBusinessObject(element);
  23. var entries = [];
  24. var isSelected = function(element, node) {
  25. return getSelectedField(element, node);
  26. };
  27. function getSelectedField(element, node) {
  28. var selected = fieldEntry.getSelected(element, node.parentNode);
  29. if (selected.idx === -1) {
  30. return;
  31. }
  32. var fields = getActivitiFields(element, node);
  33. return fields[selected.idx];
  34. }
  35. function getActivitiFields(element, node) {
  36. if (!insideListener) {
  37. return (
  38. businessObject &&
  39. extensionElementsHelper.getExtensionElements(businessObject, ACTIVITI_FIELD_EXTENSION_ELEMENT)
  40. ) || [];
  41. }
  42. return getActivitiListenerFields(element, node);
  43. }
  44. function getActivitiListenerFields(element, node) {
  45. var selectedListener = getSelectedListener(element, node);
  46. return selectedListener && selectedListener.fields || [];
  47. }
  48. function getFieldType(bo) {
  49. var fieldType = 'string';
  50. var expressionValue = bo && bo.expression;
  51. var stringValue = bo && (bo.string || bo.stringValue);
  52. if (typeof stringValue !== 'undefined') {
  53. fieldType = 'string';
  54. } else if (typeof expressionValue !== 'undefined') {
  55. fieldType = 'expression';
  56. }
  57. return fieldType;
  58. }
  59. var setOptionLabelValue = function() {
  60. return function(element, node, option, property, value, idx) {
  61. var activitiFields = getActivitiFields(element, node);
  62. var field = activitiFields[idx];
  63. value = (field.name) ? field.name : '<empty>';
  64. var label = idx + ' : ' + value;
  65. option.text = label;
  66. };
  67. };
  68. var newElement = function() {
  69. return function(element, extensionElements, value, node) {
  70. var props = {
  71. name: '',
  72. string: ''
  73. };
  74. var newFieldElem;
  75. if (!insideListener) {
  76. newFieldElem = elementHelper.createElement(ACTIVITI_FIELD_EXTENSION_ELEMENT, props, extensionElements, bpmnFactory);
  77. return cmdHelper.addElementsTolist(element, extensionElements, 'values', [ newFieldElem ]);
  78. } else {
  79. var selectedListener = getSelectedListener(element, node);
  80. newFieldElem = elementHelper.createElement(ACTIVITI_FIELD_EXTENSION_ELEMENT, props, selectedListener, bpmnFactory);
  81. return cmdHelper.addElementsTolist(element, selectedListener, 'fields', [ newFieldElem ]);
  82. }
  83. };
  84. };
  85. var removeElement = function() {
  86. return function(element, extensionElements, value, idx, node) {
  87. var activitiFields= getActivitiFields(element, node);
  88. var field = activitiFields[idx];
  89. if (field) {
  90. if (!insideListener) {
  91. return extensionElementsHelper.removeEntry(businessObject, element, field);
  92. }
  93. var selectedListener = getSelectedListener(element, node);
  94. return cmdHelper.removeElementsFromList(element, selectedListener, 'fields', null, [ field ]);
  95. }
  96. };
  97. };
  98. var fieldEntry = extensionElementsEntry(element, bpmnFactory, {
  99. id : idPrefix + 'fields',
  100. label : translate('Fields'),
  101. modelProperty: 'fieldName',
  102. idGeneration: 'false',
  103. businessObject: businessObject,
  104. createExtensionElement: newElement(),
  105. removeExtensionElement: removeElement(),
  106. getExtensionElements: function(element, node) {
  107. return getActivitiFields(element, node);
  108. },
  109. setOptionLabelValue: setOptionLabelValue()
  110. });
  111. entries.push(fieldEntry);
  112. entries.push(entryFactory.validationAwareTextField({
  113. id: idPrefix + 'field-name',
  114. label: translate('Name'),
  115. modelProperty: 'fieldName',
  116. getProperty: function(element, node) {
  117. return (getSelectedField(element, node) || {}).name;
  118. },
  119. setProperty: function(element, values, node) {
  120. var selectedField = getSelectedField(element, node);
  121. return cmdHelper.updateBusinessObject(element, selectedField, { name : values.fieldName });
  122. },
  123. validate: function(element, values, node) {
  124. var bo = getSelectedField(element, node);
  125. var validation = {};
  126. if (bo) {
  127. var nameValue = values.fieldName;
  128. if (nameValue) {
  129. if (utils.containsSpace(nameValue)) {
  130. validation.fieldName = translate('Name must not contain spaces');
  131. }
  132. } else {
  133. validation.fieldName = translate('Parameter must have a name');
  134. }
  135. }
  136. return validation;
  137. },
  138. hidden: function(element, node) {
  139. return !isSelected(element, node);
  140. }
  141. }));
  142. var fieldTypeOptions = [
  143. {
  144. name: translate('String'),
  145. value: 'string'
  146. },
  147. {
  148. name: translate('Expression'),
  149. value: 'expression'
  150. }
  151. ];
  152. entries.push(entryFactory.selectBox({
  153. id: idPrefix + 'field-type',
  154. label: translate('Type'),
  155. selectOptions: fieldTypeOptions,
  156. modelProperty: 'fieldType',
  157. get: function(element, node) {
  158. var bo = getSelectedField(element, node);
  159. var fieldType = getFieldType(bo);
  160. return {
  161. fieldType: fieldType
  162. };
  163. },
  164. set: function(element, values, node) {
  165. var props = assign({}, DEFAULT_PROPS);
  166. var fieldType = values.fieldType;
  167. if (fieldType === 'string') {
  168. props.string = '';
  169. }
  170. else if (fieldType === 'expression') {
  171. props.expression = '';
  172. }
  173. return cmdHelper.updateBusinessObject(element, getSelectedField(element, node), props);
  174. },
  175. hidden: function(element, node) {
  176. return !isSelected(element, node);
  177. }
  178. }));
  179. entries.push(entryFactory.textBox({
  180. id: idPrefix + 'field-value',
  181. label: translate('Value'),
  182. modelProperty: 'fieldValue',
  183. get: function(element, node) {
  184. var bo = getSelectedField(element, node);
  185. var fieldType = getFieldType(bo);
  186. var fieldValue;
  187. if (fieldType === 'string') {
  188. fieldValue = bo && (bo.string || bo.stringValue);
  189. }
  190. else if (fieldType === 'expression') {
  191. fieldValue = bo && bo.expression;
  192. }
  193. return {
  194. fieldValue: fieldValue
  195. };
  196. },
  197. set: function(element, values, node) {
  198. var bo = getSelectedField(element, node);
  199. var fieldType = getFieldType(bo);
  200. var props = assign({}, DEFAULT_PROPS);
  201. var fieldValue = values.fieldValue || undefined;
  202. if (fieldType === 'string') {
  203. props.string = fieldValue;
  204. }
  205. else if (fieldType === 'expression') {
  206. props.expression = fieldValue;
  207. }
  208. return cmdHelper.updateBusinessObject(element, bo, props);
  209. },
  210. validate: function(element, values, node) {
  211. var bo = getSelectedField(element, node);
  212. var validation = {};
  213. if (bo) {
  214. if (!values.fieldValue) {
  215. validation.fieldValue = translate('Must provide a value');
  216. }
  217. }
  218. return validation;
  219. },
  220. show: function(element, node) {
  221. return isSelected(element, node);
  222. }
  223. }));
  224. return entries;
  225. };