InputOutput.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. 'use strict';
  2. var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject;
  3. var elementHelper = require('../../../../helper/ElementHelper'),
  4. extensionElementsHelper = require('../../../../helper/ExtensionElementsHelper'),
  5. inputOutputHelper = require('../../../../helper/InputOutputHelper'),
  6. cmdHelper = require('../../../../helper/CmdHelper');
  7. var extensionElementsEntry = require('./ExtensionElements');
  8. function getInputOutput(element, insideConnector) {
  9. return inputOutputHelper.getInputOutput(element, insideConnector);
  10. }
  11. function getConnector(element) {
  12. return inputOutputHelper.getConnector(element);
  13. }
  14. function getInputParameters(element, insideConnector) {
  15. return inputOutputHelper.getInputParameters(element, insideConnector);
  16. }
  17. function getOutputParameters(element, insideConnector) {
  18. return inputOutputHelper.getOutputParameters(element, insideConnector);
  19. }
  20. function getInputParameter(element, insideConnector, idx) {
  21. return inputOutputHelper.getInputParameter(element, insideConnector, idx);
  22. }
  23. function getOutputParameter(element, insideConnector, idx) {
  24. return inputOutputHelper.getOutputParameter(element, insideConnector, idx);
  25. }
  26. function createElement(type, parent, factory, properties) {
  27. return elementHelper.createElement(type, properties, parent, factory);
  28. }
  29. function createInputOutput(parent, bpmnFactory, properties) {
  30. return createElement('activiti:InputOutput', parent, bpmnFactory, properties);
  31. }
  32. function createParameter(type, parent, bpmnFactory, properties) {
  33. return createElement(type, parent, bpmnFactory, properties);
  34. }
  35. function ensureInputOutputSupported(element, insideConnector) {
  36. return inputOutputHelper.isInputOutputSupported(element, insideConnector);
  37. }
  38. function ensureOutparameterSupported(element, insideConnector) {
  39. return inputOutputHelper.areOutputParametersSupported(element, insideConnector);
  40. }
  41. module.exports = function(element, bpmnFactory, options, translate) {
  42. var TYPE_LABEL = {
  43. 'activiti:Map': translate('Map'),
  44. 'activiti:List': translate('List'),
  45. 'activiti:Script': translate('Script')
  46. };
  47. options = options || {};
  48. var insideConnector = !!options.insideConnector,
  49. idPrefix = options.idPrefix || '';
  50. var getSelected = function(element, node) {
  51. var selection = (inputEntry && inputEntry.getSelected(element, node)) || { idx: -1 };
  52. var parameter = getInputParameter(element, insideConnector, selection.idx);
  53. if (!parameter && outputEntry) {
  54. selection = outputEntry.getSelected(element, node);
  55. parameter = getOutputParameter(element, insideConnector, selection.idx);
  56. }
  57. return parameter;
  58. };
  59. var result = {
  60. getSelectedParameter: getSelected
  61. };
  62. var entries = result.entries = [];
  63. if (!ensureInputOutputSupported(element)) {
  64. return result;
  65. }
  66. var newElement = function(type, prop, factory) {
  67. return function(element, extensionElements, value) {
  68. var commands = [];
  69. var inputOutput = getInputOutput(element, insideConnector);
  70. if (!inputOutput) {
  71. var parent = !insideConnector ? extensionElements : getConnector(element);
  72. inputOutput = createInputOutput(parent, bpmnFactory, {
  73. inputParameters: [],
  74. outputParameters: []
  75. });
  76. if (!insideConnector) {
  77. commands.push(cmdHelper.addAndRemoveElementsFromList(
  78. element,
  79. extensionElements,
  80. 'values',
  81. 'extensionElements',
  82. [ inputOutput ],
  83. []
  84. ));
  85. } else {
  86. commands.push(cmdHelper.updateBusinessObject(element, parent, { inputOutput: inputOutput }));
  87. }
  88. }
  89. var newElem = createParameter(type, inputOutput, bpmnFactory, { name: value });
  90. commands.push(cmdHelper.addElementsTolist(element, inputOutput, prop, [ newElem ]));
  91. return commands;
  92. };
  93. };
  94. var removeElement = function(getter, prop, otherProp) {
  95. return function(element, extensionElements, value, idx) {
  96. var inputOutput = getInputOutput(element, insideConnector);
  97. var parameter = getter(element, insideConnector, idx);
  98. var commands = [];
  99. commands.push(cmdHelper.removeElementsFromList(element, inputOutput, prop, null, [ parameter ]));
  100. var firstLength = inputOutput.get(prop).length-1;
  101. var secondLength = (inputOutput.get(otherProp) || []).length;
  102. if (!firstLength && !secondLength) {
  103. if (!insideConnector) {
  104. commands.push(extensionElementsHelper.removeEntry(getBusinessObject(element), element, inputOutput));
  105. } else {
  106. var connector = getConnector(element);
  107. commands.push(cmdHelper.updateBusinessObject(element, connector, { inputOutput: undefined }));
  108. }
  109. }
  110. return commands;
  111. };
  112. };
  113. var setOptionLabelValue = function(getter) {
  114. return function(element, node, option, property, value, idx) {
  115. var parameter = getter(element, insideConnector, idx);
  116. var suffix = 'Text';
  117. var definition = parameter.get('definition');
  118. if (typeof definition !== 'undefined') {
  119. var type = definition.$type;
  120. suffix = TYPE_LABEL[type];
  121. }
  122. option.text = (value || '') + ' : ' + suffix;
  123. };
  124. };
  125. // input parameters ///////////////////////////////////////////////////////////////
  126. var inputEntry = extensionElementsEntry(element, bpmnFactory, {
  127. id: idPrefix + 'inputs',
  128. label: translate('Input Parameters'),
  129. modelProperty: 'name',
  130. prefix: 'Input',
  131. resizable: true,
  132. createExtensionElement: newElement('activiti:InputParameter', 'inputParameters'),
  133. removeExtensionElement: removeElement(getInputParameter, 'inputParameters', 'outputParameters'),
  134. getExtensionElements: function(element) {
  135. return getInputParameters(element, insideConnector);
  136. },
  137. onSelectionChange: function(element, node, event, scope) {
  138. outputEntry && outputEntry.deselect(element, node);
  139. },
  140. setOptionLabelValue: setOptionLabelValue(getInputParameter)
  141. });
  142. entries.push(inputEntry);
  143. // output parameters ///////////////////////////////////////////////////////
  144. if (ensureOutparameterSupported(element, insideConnector)) {
  145. var outputEntry = extensionElementsEntry(element, bpmnFactory, {
  146. id: idPrefix + 'outputs',
  147. label: translate('Output Parameters'),
  148. modelProperty: 'name',
  149. prefix: 'Output',
  150. resizable: true,
  151. createExtensionElement: newElement('activiti:OutputParameter', 'outputParameters'),
  152. removeExtensionElement: removeElement(getOutputParameter, 'outputParameters', 'inputParameters'),
  153. getExtensionElements: function(element) {
  154. return getOutputParameters(element, insideConnector);
  155. },
  156. onSelectionChange: function(element, node, event, scope) {
  157. inputEntry.deselect(element, node);
  158. },
  159. setOptionLabelValue: setOptionLabelValue(getOutputParameter)
  160. });
  161. entries.push(outputEntry);
  162. }
  163. return result;
  164. };