cb4745e32b8d6694b082b944ff695415c179e3c6
[sdc/sdc-workflow-designer.git] /
1 var ModelUtil = require('bpmn-js/lib/util/ModelUtil'),
2     is = ModelUtil.is,
3     getBusinessObject = ModelUtil.getBusinessObject;
4
5 var extensionElementsHelper = require('bpmn-js-properties-panel/lib/helper/ExtensionElementsHelper'),
6     implementationTypeHelper = require('bpmn-js-properties-panel/lib/helper/ImplementationTypeHelper');
7 import {
8     IMPLEMENTATION_TYPE_VALUE,
9     implementationType
10 } from './implementationConstants';
11
12 var InputOutputHelper = {};
13
14 function getElements(bo, type, prop) {
15     var elems = extensionElementsHelper.getExtensionElements(bo, type) || [];
16     return !prop ? elems : (elems[0] || {})[prop] || [];
17 }
18
19 function getParameters(element, prop, insideConnector) {
20     var inputOutput = InputOutputHelper.getInputOutput(
21         element,
22         insideConnector
23     );
24     return (inputOutput && inputOutput.get(prop)) || [];
25 }
26
27 /**
28  * Get a inputOutput from the business object
29  *
30  * @param {djs.model.Base} element
31  * @param  {boolean} insideConnector
32  *
33  * @return {ModdleElement} the inputOutput object
34  */
35 InputOutputHelper.getInputOutput = function(element, insideConnector) {
36     if (!insideConnector) {
37         var bo = getBusinessObject(element);
38         return (getElements(bo, 'camunda:InputOutput') || [])[0];
39     }
40     var connector = this.getConnector(element);
41
42     return connector && connector.get('inputOutput');
43 };
44
45 /**
46  * Get a connector from the business object
47  *
48  * @param {djs.model.Base} element
49  *
50  * @return {ModdleElement} the connector object
51  */
52 InputOutputHelper.getConnector = function(element) {
53     var bo = implementationTypeHelper.getServiceTaskLikeBusinessObject(element);
54     return bo && (getElements(bo, 'camunda:Connector') || [])[0];
55 };
56
57 /**
58  * Return all input parameters existing in the business object, and
59  * an empty array if none exist.
60  *
61  * @param  {djs.model.Base} element
62  * @param  {boolean} insideConnector
63  *
64  * @return {Array} a list of input parameter objects
65  */
66 InputOutputHelper.getInputParameters = function(element, insideConnector) {
67     return getParameters.apply(this, [
68         element,
69         'inputParameters',
70         insideConnector
71     ]);
72 };
73
74 /**
75  * Return all output parameters existing in the business object, and
76  * an empty array if none exist.
77  *
78  * @param  {djs.model.Base} element
79  * @param  {boolean} insideConnector
80  *
81  * @return {Array} a list of output parameter objects
82  */
83 InputOutputHelper.getOutputParameters = function(element, insideConnector) {
84     return getParameters.apply(this, [
85         element,
86         'outputParameters',
87         insideConnector
88     ]);
89 };
90
91 /**
92  * Get a input parameter from the business object at given index
93  *
94  * @param {djs.model.Base} element
95  * @param  {boolean} insideConnector
96  * @param {number} idx
97  *
98  * @return {ModdleElement} input parameter
99  */
100 InputOutputHelper.getInputParameter = function(element, insideConnector, idx) {
101     return this.getInputParameters(element, insideConnector)[idx];
102 };
103
104 /**
105  * Get a output parameter from the business object at given index
106  *
107  * @param {djs.model.Base} element
108  * @param  {boolean} insideConnector
109  * @param {number} idx
110  *
111  * @return {ModdleElement} output parameter
112  */
113 InputOutputHelper.getOutputParameter = function(element, insideConnector, idx) {
114     return this.getOutputParameters(element, insideConnector)[idx];
115 };
116
117 /**
118  * Returns 'true' if the given element supports inputOutput
119  *
120  * @param {djs.model.Base} element
121  * @param  {boolean} insideConnector
122  *
123  * @return {boolean} a boolean value
124  */
125 InputOutputHelper.isInputOutputSupported = function(element, insideConnector) {
126     var bo = getBusinessObject(element);
127     return (
128         insideConnector ||
129         is(bo, 'bpmn:Process') ||
130         (is(bo, 'bpmn:FlowNode') &&
131             !is(bo, 'bpmn:StartEvent') &&
132             !is(bo, 'bpmn:BoundaryEvent') &&
133             !(is(bo, 'bpmn:SubProcess') && bo.get('triggeredByEvent')))
134     );
135 };
136
137 /**
138  * Returns 'true' if the given element supports output parameters
139  *
140  * @param {djs.model.Base} element
141  * @param  {boolean} insideConnector
142  *
143  * @return {boolean} a boolean value
144  */
145 InputOutputHelper.areOutputParametersSupported = function(
146     element,
147     insideConnector
148 ) {
149     var bo = getBusinessObject(element);
150     return (
151         insideConnector || (!is(bo, 'bpmn:EndEvent') && !bo.loopCharacteristics)
152     );
153 };
154
155 InputOutputHelper.isCreateDeleteSupported = function(element) {
156     const bo = getBusinessObject(element);
157     return (
158         (element.type !== 'bpmn:ServiceTask' ||
159             bo[implementationType.ACTIVITY] !== IMPLEMENTATION_TYPE_VALUE) &&
160         element.type !== 'bpmn:Process'
161     );
162 };
163
164 InputOutputHelper.isWorkflowTargetSupported = function(element, selected) {
165     const bo = getBusinessObject(element);
166     return (
167         is(bo, 'bpmn:ServiceTask') && is(selected, 'camunda:OutputParameter')
168     );
169 };
170
171 InputOutputHelper.isWorkflowSourceSupported = function(element, selected) {
172     const bo = getBusinessObject(element);
173     return is(bo, 'bpmn:ServiceTask') && is(selected, 'camunda:InputParameter');
174 };
175
176 export default InputOutputHelper;