VariableMappingProps.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. 'use strict';
  2. var is = require('bpmn-js/lib/util/ModelUtil').is,
  3. isAny = require('bpmn-js/lib/features/modeling/util/ModelingUtil').isAny,
  4. getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject;
  5. var filter = require('lodash/filter');
  6. var extensionElementsHelper = require('../../../helper/ExtensionElementsHelper'),
  7. cmdHelper = require('../../../helper/CmdHelper'),
  8. elementHelper = require('../../../helper/ElementHelper'),
  9. eventDefinitionHelper = require('../../../helper/EventDefinitionHelper');
  10. var extensionElementsEntry = require('./implementation/ExtensionElements');
  11. var entryFactory = require('../../../factory/EntryFactory');
  12. /**
  13. * return depend on parameter 'type' activiti:in or activiti:out extension elements
  14. */
  15. function getActivitiInOutMappings(element, type) {
  16. var bo = getBusinessObject(element);
  17. var signalEventDefinition = eventDefinitionHelper.getSignalEventDefinition(bo);
  18. return extensionElementsHelper.getExtensionElements(signalEventDefinition || bo, type) || [];
  19. }
  20. /**
  21. * return depend on parameter 'type' activiti:in or activiti:out extension elements
  22. * with source or sourceExpression attribute
  23. */
  24. function getVariableMappings(element, type) {
  25. var activitiMappings = getActivitiInOutMappings(element, type);
  26. return filter(activitiMappings, function(mapping) {
  27. return !mapping.businessKey;
  28. });
  29. }
  30. function getInOutType(mapping) {
  31. var inOutType = 'source';
  32. if (mapping.variables === 'all') {
  33. inOutType = 'variables';
  34. }
  35. else if (typeof mapping.source !== 'undefined') {
  36. inOutType = 'source';
  37. }
  38. else if (typeof mapping.sourceExpression !== 'undefined') {
  39. inOutType = 'sourceExpression';
  40. }
  41. return inOutType;
  42. }
  43. var ACTIVITI_IN_EXTENSION_ELEMENT = 'activiti:In',
  44. ACTIVITI_OUT_EXTENSION_ELEMENT = 'activiti:Out';
  45. var WHITESPACE_REGEX = /\s/;
  46. module.exports = function(group, element, bpmnFactory, translate) {
  47. var inOutTypeOptions = [
  48. {
  49. name: translate('Source'),
  50. value: 'source'
  51. },
  52. {
  53. name: translate('Source Expression'),
  54. value: 'sourceExpression'
  55. },
  56. {
  57. name: translate('All'),
  58. value: 'variables'
  59. }
  60. ];
  61. var signalEventDefinition = eventDefinitionHelper.getSignalEventDefinition(element);
  62. if (!is(element, 'activiti:CallActivity') && !signalEventDefinition) {
  63. return;
  64. }
  65. if (signalEventDefinition && !(isAny(element, [
  66. 'bpmn:IntermediateThrowEvent',
  67. 'bpmn:EndEvent'
  68. ]))) {
  69. return;
  70. }
  71. var isSelected = function(element, node) {
  72. return !!getSelected(element, node);
  73. };
  74. var getSelected = function(element, node) {
  75. var parentNode = node.parentNode;
  76. var selection = inEntry.getSelected(element, parentNode);
  77. var parameter = getVariableMappings(element, ACTIVITI_IN_EXTENSION_ELEMENT)[selection.idx];
  78. if (!parameter && outEntry) {
  79. selection = outEntry.getSelected(element, parentNode);
  80. parameter = getVariableMappings(element, ACTIVITI_OUT_EXTENSION_ELEMENT)[selection.idx];
  81. }
  82. return parameter;
  83. };
  84. var setOptionLabelValue = function(type) {
  85. return function(element, node, option, property, value, idx) {
  86. var variableMappings = getVariableMappings(element, type);
  87. var mappingValue = variableMappings[idx];
  88. var label = (mappingValue.target || '<undefined>') + ' := ';
  89. var mappingType = getInOutType(mappingValue);
  90. if (mappingType === 'variables') {
  91. label = 'all';
  92. }
  93. else if (mappingType === 'source') {
  94. label = label + (mappingValue.source || '<empty>');
  95. }
  96. else if (mappingType === 'sourceExpression') {
  97. label = label + (mappingValue.sourceExpression || '<empty>');
  98. } else {
  99. label = label + '<empty>';
  100. }
  101. option.text = label;
  102. };
  103. };
  104. var newElement = function(type) {
  105. return function(element, extensionElements, value) {
  106. var newElem = elementHelper.createElement(type, { source: '' }, extensionElements, bpmnFactory);
  107. return cmdHelper.addElementsTolist(element, extensionElements, 'values', [ newElem ]);
  108. };
  109. };
  110. var removeElement = function(type) {
  111. return function(element, extensionElements, value, idx) {
  112. var variablesMappings= getVariableMappings(element, type);
  113. var mapping = variablesMappings[idx];
  114. if (mapping) {
  115. return extensionElementsHelper
  116. .removeEntry(signalEventDefinition || getBusinessObject(element), element, mapping);
  117. }
  118. };
  119. };
  120. // in mapping for source and sourceExpression ///////////////////////////////////////////////////////////////
  121. var inEntry = extensionElementsEntry(element, bpmnFactory, {
  122. id: 'variableMapping-in',
  123. label: translate('In Mapping'),
  124. modelProperty: 'source',
  125. prefix: 'In',
  126. idGeneration: false,
  127. resizable: true,
  128. businessObject: signalEventDefinition || getBusinessObject(element),
  129. createExtensionElement: newElement(ACTIVITI_IN_EXTENSION_ELEMENT),
  130. removeExtensionElement: removeElement(ACTIVITI_IN_EXTENSION_ELEMENT),
  131. getExtensionElements: function(element) {
  132. return getVariableMappings(element, ACTIVITI_IN_EXTENSION_ELEMENT);
  133. },
  134. onSelectionChange: function(element, node, event, scope) {
  135. outEntry && outEntry.deselect(element, node.parentNode);
  136. },
  137. setOptionLabelValue: setOptionLabelValue(ACTIVITI_IN_EXTENSION_ELEMENT)
  138. });
  139. group.entries.push(inEntry);
  140. // out mapping for source and sourceExpression ///////////////////////////////////////////////////////
  141. if (!signalEventDefinition) {
  142. var outEntry = extensionElementsEntry(element, bpmnFactory, {
  143. id: 'variableMapping-out',
  144. label: translate('Out Mapping'),
  145. modelProperty: 'source',
  146. prefix: 'Out',
  147. idGeneration: false,
  148. resizable: true,
  149. createExtensionElement: newElement(ACTIVITI_OUT_EXTENSION_ELEMENT),
  150. removeExtensionElement: removeElement(ACTIVITI_OUT_EXTENSION_ELEMENT),
  151. getExtensionElements: function(element) {
  152. return getVariableMappings(element, ACTIVITI_OUT_EXTENSION_ELEMENT);
  153. },
  154. onSelectionChange: function(element, node, event, scope) {
  155. inEntry.deselect(element, node.parentNode);
  156. },
  157. setOptionLabelValue: setOptionLabelValue(ACTIVITI_OUT_EXTENSION_ELEMENT)
  158. });
  159. group.entries.push(outEntry);
  160. }
  161. // label for selected mapping ///////////////////////////////////////////////////////
  162. group.entries.push(entryFactory.label({
  163. id: 'variableMapping-typeLabel',
  164. get: function(element, node) {
  165. var mapping = getSelected(element, node);
  166. var value = '';
  167. if (is(mapping, ACTIVITI_IN_EXTENSION_ELEMENT)) {
  168. value = translate('In Mapping');
  169. }
  170. else if (is(mapping, ACTIVITI_OUT_EXTENSION_ELEMENT)) {
  171. value = translate('Out Mapping');
  172. }
  173. return {
  174. label: value
  175. };
  176. },
  177. showLabel: function(element, node) {
  178. return isSelected(element, node);
  179. }
  180. }));
  181. group.entries.push(entryFactory.selectBox({
  182. id: 'variableMapping-inOutType',
  183. label: translate('Type'),
  184. selectOptions: inOutTypeOptions,
  185. modelProperty: 'inOutType',
  186. get: function(element, node) {
  187. var mapping = getSelected(element, node) || {};
  188. return {
  189. inOutType: getInOutType(mapping)
  190. };
  191. },
  192. set: function(element, values, node) {
  193. var inOutType = values.inOutType;
  194. var props = {
  195. 'source' : undefined,
  196. 'sourceExpression' : undefined,
  197. 'variables' : undefined
  198. };
  199. if (inOutType === 'source') {
  200. props.source = '';
  201. }
  202. else if (inOutType === 'sourceExpression') {
  203. props.sourceExpression = '';
  204. }
  205. else if (inOutType === 'variables') {
  206. props.variables = 'all';
  207. props.target = undefined;
  208. }
  209. var mapping = getSelected(element, node);
  210. return cmdHelper.updateBusinessObject(element, mapping, props);
  211. },
  212. hidden: function(element, node) {
  213. return !isSelected(element, node);
  214. }
  215. }));
  216. group.entries.push(entryFactory.textField({
  217. id: 'variableMapping-source',
  218. dataValueLabel: 'sourceLabel',
  219. modelProperty: 'source',
  220. get: function(element, node) {
  221. var mapping = getSelected(element, node) || {};
  222. var label = '';
  223. var inOutType = getInOutType(mapping);
  224. if (inOutType === 'source') {
  225. label = translate('Source');
  226. }
  227. else if (inOutType === 'sourceExpression') {
  228. label = translate('Source Expression');
  229. }
  230. return {
  231. source: mapping[inOutType],
  232. sourceLabel: label
  233. };
  234. },
  235. set: function(element, values, node) {
  236. values.source = values.source || undefined;
  237. var mapping = getSelected(element, node);
  238. var inOutType = getInOutType(mapping);
  239. var props = {};
  240. props[inOutType] = values.source || '';
  241. return cmdHelper.updateBusinessObject(element, mapping, props);
  242. },
  243. // one of both (source or sourceExpression) must have a value to make
  244. // the configuration easier and more understandable
  245. // it is not engine conform
  246. validate: function(element, values, node) {
  247. var mapping = getSelected(element, node);
  248. var validation = {};
  249. if (mapping) {
  250. if (!values.source) {
  251. validation.source =
  252. validation.source = values.sourceLabel ?
  253. translate('Mapping must have a {value}', { value: values.sourceLabel.toLowerCase() }) :
  254. translate('Mapping must have a value');
  255. }
  256. var inOutType = getInOutType(mapping);
  257. if (WHITESPACE_REGEX.test(values.source) && inOutType !== 'sourceExpression') {
  258. validation.source = translate('{label} must not contain whitespace', { label: values.sourceLabel });
  259. }
  260. }
  261. return validation;
  262. },
  263. hidden: function(element, node) {
  264. var selectedMapping = getSelected(element, node);
  265. return !selectedMapping || (selectedMapping && selectedMapping.variables);
  266. }
  267. }));
  268. group.entries.push(entryFactory.textField({
  269. id: 'variableMapping-target',
  270. label: translate('Target'),
  271. modelProperty: 'target',
  272. get: function(element, node) {
  273. return {
  274. target: (getSelected(element, node) || {}).target
  275. };
  276. },
  277. set: function(element, values, node) {
  278. values.target = values.target || undefined;
  279. var mapping = getSelected(element, node);
  280. return cmdHelper.updateBusinessObject(element, mapping, values);
  281. },
  282. validate: function(element, values, node) {
  283. var mapping = getSelected(element, node);
  284. var validation = {};
  285. if (mapping) {
  286. var mappingType = getInOutType(mapping);
  287. if (!values.target && mappingType !== 'variables') {
  288. validation.target = translate('Mapping must have a target');
  289. }
  290. if (values.target
  291. && WHITESPACE_REGEX.test(values.target)
  292. && mappingType !== 'variables') {
  293. validation.target = translate('Target must not contain whitespace');
  294. }
  295. }
  296. return validation;
  297. },
  298. hidden: function(element, node) {
  299. var selectedMapping = getSelected(element, node);
  300. return !selectedMapping || (selectedMapping && selectedMapping.variables);
  301. }
  302. }));
  303. group.entries.push(entryFactory.checkbox({
  304. id: 'variableMapping-local',
  305. label: translate('Local'),
  306. modelProperty: 'local',
  307. get: function(element, node) {
  308. return {
  309. local: (getSelected(element, node) || {}).local
  310. };
  311. },
  312. set: function(element, values, node) {
  313. values.local = values.local || false;
  314. var mapping = getSelected(element, node);
  315. return cmdHelper.updateBusinessObject(element, mapping, values);
  316. },
  317. hidden: function(element, node) {
  318. return !isSelected(element, node);
  319. }
  320. }));
  321. };