InputOutputParameter.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. 'use strict';
  2. var is = require('bpmn-js/lib/util/ModelUtil').is;
  3. var elementHelper = require('../../../../helper/ElementHelper'),
  4. inputOutputHelper = require('../../../../helper/InputOutputHelper'),
  5. cmdHelper = require('../../../../helper/CmdHelper'),
  6. utils = require('../../../../Utils');
  7. var entryFactory = require('../../../../factory/EntryFactory'),
  8. scriptImplementation = require('./Script');
  9. function createElement(type, parent, factory, properties) {
  10. return elementHelper.createElement(type, properties, parent, factory);
  11. }
  12. function isScript(elem) {
  13. return is(elem, 'activiti:Script');
  14. }
  15. function isList(elem) {
  16. return is(elem, 'activiti:List');
  17. }
  18. function isMap(elem) {
  19. return is(elem, 'activiti:Map');
  20. }
  21. function ensureInputOutputSupported(element, insideConnector) {
  22. return inputOutputHelper.isInputOutputSupported(element, insideConnector);
  23. }
  24. module.exports = function(element, bpmnFactory, options, translate) {
  25. var typeInfo = {
  26. 'activiti:Map': {
  27. value: 'map',
  28. label: translate('Map')
  29. },
  30. 'activiti:List': {
  31. value: 'list',
  32. label: translate('List')
  33. },
  34. 'activiti:Script': {
  35. value: 'script',
  36. label: translate('Script')
  37. }
  38. };
  39. options = options || {};
  40. var insideConnector = !!options.insideConnector,
  41. idPrefix = options.idPrefix || '';
  42. var getSelected = options.getSelectedParameter;
  43. if (!ensureInputOutputSupported(element, insideConnector)) {
  44. return [];
  45. }
  46. var entries = [];
  47. var isSelected = function(element, node) {
  48. return getSelected(element, node);
  49. };
  50. // parameter name ////////////////////////////////////////////////////////
  51. entries.push(entryFactory.validationAwareTextField({
  52. id: idPrefix + 'parameterName',
  53. label: translate('Name'),
  54. modelProperty: 'name',
  55. getProperty: function(element, node) {
  56. return (getSelected(element, node) || {}).name;
  57. },
  58. setProperty: function(element, values, node) {
  59. var param = getSelected(element, node);
  60. return cmdHelper.updateBusinessObject(element, param, values);
  61. },
  62. validate: function(element, values, node) {
  63. var bo = getSelected(element, node);
  64. var validation = {};
  65. if (bo) {
  66. var nameValue = values.name;
  67. if (nameValue) {
  68. if (utils.containsSpace(nameValue)) {
  69. validation.name = translate('Name must not contain spaces');
  70. }
  71. } else {
  72. validation.name = translate('Parameter must have a name');
  73. }
  74. }
  75. return validation;
  76. },
  77. hidden: function(element, node) {
  78. return !isSelected(element, node);
  79. }
  80. }));
  81. // parameter type //////////////////////////////////////////////////////
  82. var selectOptions = [
  83. { value: 'text', name: translate('Text') },
  84. { value: 'script', name: translate('Script') },
  85. { value: 'list', name: translate('List') },
  86. { value: 'map', name: translate('Map') }
  87. ];
  88. entries.push(entryFactory.selectBox({
  89. id : idPrefix + 'parameterType',
  90. label: translate('Type'),
  91. selectOptions: selectOptions,
  92. modelProperty: 'parameterType',
  93. get: function(element, node) {
  94. var bo = getSelected(element, node);
  95. var parameterType = 'text';
  96. if (typeof bo !== 'undefined') {
  97. var definition = bo.get('definition');
  98. if (typeof definition !== 'undefined') {
  99. var type = definition.$type;
  100. parameterType = typeInfo[type].value;
  101. }
  102. }
  103. return {
  104. parameterType: parameterType
  105. };
  106. },
  107. set: function(element, values, node) {
  108. var bo = getSelected(element, node);
  109. var properties = {
  110. value: undefined,
  111. definition: undefined
  112. };
  113. var createParameterTypeElem = function(type) {
  114. return createElement(type, bo, bpmnFactory);
  115. };
  116. var parameterType = values.parameterType;
  117. if (parameterType === 'script') {
  118. properties.definition = createParameterTypeElem('activiti:Script');
  119. }
  120. else if (parameterType === 'list') {
  121. properties.definition = createParameterTypeElem('activiti:List');
  122. }
  123. else if (parameterType === 'map') {
  124. properties.definition = createParameterTypeElem('activiti:Map');
  125. }
  126. return cmdHelper.updateBusinessObject(element, bo, properties);
  127. },
  128. show: function(element, node) {
  129. return isSelected(element, node);
  130. }
  131. }));
  132. // parameter value (type = text) ///////////////////////////////////////////////////////
  133. entries.push(entryFactory.textBox({
  134. id : idPrefix + 'parameterType-text',
  135. label : translate('Value'),
  136. modelProperty: 'value',
  137. get: function(element, node) {
  138. return {
  139. value: (getSelected(element, node) || {}).value
  140. };
  141. },
  142. set: function(element, values, node) {
  143. var param = getSelected(element, node);
  144. values.value = values.value || undefined;
  145. return cmdHelper.updateBusinessObject(element, param, values);
  146. },
  147. show: function(element, node) {
  148. var bo = getSelected(element, node);
  149. return bo && !bo.definition;
  150. }
  151. }));
  152. // parameter value (type = script) ///////////////////////////////////////////////////////
  153. var script = scriptImplementation('scriptFormat', 'value', true, translate);
  154. entries.push({
  155. id: idPrefix + 'parameterType-script',
  156. html: '<div data-show="isScript">' +
  157. script.template +
  158. '</div>',
  159. get: function(element, node) {
  160. var bo = getSelected(element, node);
  161. return bo && isScript(bo.definition) ? script.get(element, bo.definition) : {};
  162. },
  163. set: function(element, values, node) {
  164. var bo = getSelected(element, node);
  165. var update = script.set(element, values);
  166. return cmdHelper.updateBusinessObject(element, bo.definition, update);
  167. },
  168. validate: function(element, values, node) {
  169. var bo = getSelected(element, node);
  170. return bo && isScript(bo.definition) ? script.validate(element, bo.definition) : {};
  171. },
  172. isScript: function(element, node) {
  173. var bo = getSelected(element, node);
  174. return bo && isScript(bo.definition);
  175. },
  176. script: script
  177. });
  178. // parameter value (type = list) ///////////////////////////////////////////////////////
  179. entries.push(entryFactory.table({
  180. id: idPrefix + 'parameterType-list',
  181. modelProperties: [ 'value' ],
  182. labels: [ translate('Value') ],
  183. addLabel: translate('Add Value'),
  184. getElements: function(element, node) {
  185. var bo = getSelected(element, node);
  186. if (bo && isList(bo.definition)) {
  187. return bo.definition.items;
  188. }
  189. return [];
  190. },
  191. updateElement: function(element, values, node, idx) {
  192. var bo = getSelected(element, node);
  193. var item = bo.definition.items[idx];
  194. return cmdHelper.updateBusinessObject(element, item, values);
  195. },
  196. addElement: function(element, node) {
  197. var bo = getSelected(element, node);
  198. var newValue = createElement('activiti:Value', bo.definition, bpmnFactory, { value: undefined });
  199. return cmdHelper.addElementsTolist(element, bo.definition, 'items', [ newValue ]);
  200. },
  201. removeElement: function(element, node, idx) {
  202. var bo = getSelected(element, node);
  203. return cmdHelper.removeElementsFromList(element, bo.definition, 'items', null, [ bo.definition.items[idx] ]);
  204. },
  205. editable: function(element, node, prop, idx) {
  206. var bo = getSelected(element, node);
  207. var item = bo.definition.items[idx];
  208. return !isMap(item) && !isList(item) && !isScript(item);
  209. },
  210. setControlValue: function(element, node, input, prop, value, idx) {
  211. var bo = getSelected(element, node);
  212. var item = bo.definition.items[idx];
  213. if (!isMap(item) && !isList(item) && !isScript(item)) {
  214. input.value = value;
  215. } else {
  216. input.value = typeInfo[item.$type].label;
  217. }
  218. },
  219. show: function(element, node) {
  220. var bo = getSelected(element, node);
  221. return bo && bo.definition && isList(bo.definition);
  222. }
  223. }));
  224. // parameter value (type = map) ///////////////////////////////////////////////////////
  225. entries.push(entryFactory.table({
  226. id: idPrefix + 'parameterType-map',
  227. modelProperties: [ 'key', 'value' ],
  228. labels: [ translate('Key'), translate('Value') ],
  229. addLabel: translate('Add Entry'),
  230. getElements: function(element, node) {
  231. var bo = getSelected(element, node);
  232. if (bo && isMap(bo.definition)) {
  233. return bo.definition.entries;
  234. }
  235. return [];
  236. },
  237. updateElement: function(element, values, node, idx) {
  238. var bo = getSelected(element, node);
  239. var entry = bo.definition.entries[idx];
  240. if (isMap(entry.definition) || isList(entry.definition) || isScript(entry.definition)) {
  241. values = {
  242. key: values.key
  243. };
  244. }
  245. return cmdHelper.updateBusinessObject(element, entry, values);
  246. },
  247. addElement: function(element, node) {
  248. var bo = getSelected(element, node);
  249. var newEntry = createElement('activiti:Entry', bo.definition, bpmnFactory, { key: undefined, value: undefined });
  250. return cmdHelper.addElementsTolist(element, bo.definition, 'entries', [ newEntry ]);
  251. },
  252. removeElement: function(element, node, idx) {
  253. var bo = getSelected(element, node);
  254. return cmdHelper.removeElementsFromList(element, bo.definition, 'entries', null, [ bo.definition.entries[idx] ]);
  255. },
  256. editable: function(element, node, prop, idx) {
  257. var bo = getSelected(element, node);
  258. var entry = bo.definition.entries[idx];
  259. return prop === 'key' || (!isMap(entry.definition) && !isList(entry.definition) && !isScript(entry.definition));
  260. },
  261. setControlValue: function(element, node, input, prop, value, idx) {
  262. var bo = getSelected(element, node);
  263. var entry = bo.definition.entries[idx];
  264. if (prop === 'key' || (!isMap(entry.definition) && !isList(entry.definition) && !isScript(entry.definition))) {
  265. input.value = value;
  266. } else {
  267. input.value = typeInfo[entry.definition.$type].label;
  268. }
  269. },
  270. show: function(element, node) {
  271. var bo = getSelected(element, node);
  272. return bo && bo.definition && isMap(bo.definition);
  273. }
  274. }));
  275. return entries;
  276. };