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