555b4af70f1689af320bd54bd30c0933ffd920ab
[sdc/sdc-workflow-designer.git] /
1 'use strict';
2 import {
3     IMPLEMENTATION_TYPE_VALUE,
4     implementationType
5 } from './implementationConstants';
6 var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject;
7
8 var elementHelper = require('bpmn-js-properties-panel/lib/helper/ElementHelper'),
9     extensionElementsHelper = require('bpmn-js-properties-panel/lib/helper/ExtensionElementsHelper'),
10     inputOutputHelper = require('./InputOutputHelper'),
11     cmdHelper = require('bpmn-js-properties-panel/lib/helper/CmdHelper');
12
13 var extensionElementsEntry = require('bpmn-js-properties-panel/lib/provider/camunda/parts/implementation//ExtensionElements');
14
15 function isCreateDeleteSupported(element) {
16     const bo = getBusinessObject(element);
17     return (
18         (element.type !== 'bpmn:ServiceTask' ||
19             bo[implementationType.ACTIVITY] !== IMPLEMENTATION_TYPE_VALUE) &&
20         element.type !== 'bpmn:Process'
21     );
22 }
23
24 function getInputOutput(element, insideConnector) {
25     return inputOutputHelper.getInputOutput(element, insideConnector);
26 }
27
28 function getConnector(element) {
29     return inputOutputHelper.getConnector(element);
30 }
31
32 function getInputParameters(element, insideConnector) {
33     return inputOutputHelper.getInputParameters(element, insideConnector);
34 }
35
36 function getOutputParameters(element, insideConnector) {
37     return inputOutputHelper.getOutputParameters(element, insideConnector);
38 }
39
40 function getInputParameter(element, insideConnector, idx) {
41     return inputOutputHelper.getInputParameter(element, insideConnector, idx);
42 }
43
44 function getOutputParameter(element, insideConnector, idx) {
45     return inputOutputHelper.getOutputParameter(element, insideConnector, idx);
46 }
47
48 function createElement(type, parent, factory, properties) {
49     const el = elementHelper.createElement(type, properties, parent, factory);
50     return el;
51 }
52
53 function createInputOutput(parent, bpmnFactory, properties) {
54     return createElement(
55         'camunda:InputOutput',
56         parent,
57         bpmnFactory,
58         properties
59     );
60 }
61
62 function createParameter(type, parent, bpmnFactory, properties) {
63     return createElement(type, parent, bpmnFactory, properties);
64 }
65
66 function ensureInputOutputSupported(element, insideConnector) {
67     return inputOutputHelper.isInputOutputSupported(element, insideConnector);
68 }
69
70 function ensureOutparameterSupported(element, insideConnector) {
71     return inputOutputHelper.areOutputParametersSupported(
72         element,
73         insideConnector
74     );
75 }
76
77 module.exports = function(element, bpmnFactory, options, translate) {
78     var TYPE_LABEL = {
79         'camunda:Map': translate('Map'),
80         'camunda:List': translate('List'),
81         'camunda:Script': translate('Script')
82     };
83
84     options = options || {};
85
86     var insideConnector = !!options.insideConnector,
87         idPrefix = options.idPrefix || '';
88
89     var getSelected = function(element, node) {
90         var selection = (inputEntry &&
91             inputEntry.getSelected(element, node)) || { idx: -1 };
92
93         var parameter = getInputParameter(
94             element,
95             insideConnector,
96             selection.idx
97         );
98         if (!parameter && outputEntry) {
99             selection = outputEntry.getSelected(element, node);
100             parameter = getOutputParameter(
101                 element,
102                 insideConnector,
103                 selection.idx
104             );
105         }
106         return parameter;
107     };
108
109     var result = {
110         getSelectedParameter: getSelected
111     };
112
113     var entries = (result.entries = []);
114
115     if (!ensureInputOutputSupported(element)) {
116         return result;
117     }
118
119     var newElement = function(type, prop, elementData) {
120         return function(element, extensionElements, value) {
121             var commands = [];
122
123             var inputOutput = getInputOutput(element, insideConnector);
124             if (!inputOutput) {
125                 var parent = !insideConnector
126                     ? extensionElements
127                     : getConnector(element);
128
129                 inputOutput = createInputOutput(parent, bpmnFactory, {
130                     inputParameters: [],
131                     outputParameters: []
132                 });
133
134                 if (!insideConnector) {
135                     commands.push(
136                         cmdHelper.addAndRemoveElementsFromList(
137                             element,
138                             extensionElements,
139                             'values',
140                             'extensionElements',
141                             [inputOutput],
142                             []
143                         )
144                     );
145                 } else {
146                     commands.push(
147                         cmdHelper.updateBusinessObject(element, parent, {
148                             inputOutput: inputOutput
149                         })
150                     );
151                 }
152             }
153
154             var newElem = elementData
155                 ? createParameter(type, inputOutput, bpmnFactory, elementData)
156                 : createParameter(type, inputOutput, bpmnFactory, {
157                       name: value
158                   });
159
160             console.log(newElem);
161
162             commands.push(
163                 cmdHelper.addElementsTolist(element, inputOutput, prop, [
164                     newElem
165                 ])
166             );
167
168             return commands;
169         };
170     };
171
172     var removeElement = function(getter, prop, otherProp) {
173         return function(element, extensionElements, value, idx) {
174             var inputOutput = getInputOutput(element, insideConnector);
175             var parameter = getter(element, insideConnector, idx);
176
177             var commands = [];
178             commands.push(
179                 cmdHelper.removeElementsFromList(
180                     element,
181                     inputOutput,
182                     prop,
183                     null,
184                     [parameter]
185                 )
186             );
187
188             var firstLength = inputOutput.get(prop).length - 1;
189             var secondLength = (inputOutput.get(otherProp) || []).length;
190
191             if (!firstLength && !secondLength) {
192                 if (!insideConnector) {
193                     commands.push(
194                         extensionElementsHelper.removeEntry(
195                             getBusinessObject(element),
196                             element,
197                             inputOutput
198                         )
199                     );
200                 } else {
201                     var connector = getConnector(element);
202                     commands.push(
203                         cmdHelper.updateBusinessObject(element, connector, {
204                             inputOutput: undefined
205                         })
206                     );
207                 }
208             }
209
210             return commands;
211         };
212     };
213
214     var setOptionLabelValue = function(getter) {
215         return function(element, node, option, property, value, idx) {
216             var parameter = getter(element, insideConnector, idx);
217
218             var suffix = 'Text';
219
220             var definition = parameter.get('definition');
221             if (typeof definition !== 'undefined') {
222                 var type = definition.$type;
223                 suffix = TYPE_LABEL[type];
224             }
225
226             option.text = (value || '') + ' : ' + suffix;
227         };
228     };
229
230     // input parameters ///////////////////////////////////////////////////////////////
231
232     var inputEntry = extensionElementsEntry(element, bpmnFactory, {
233         id: idPrefix + 'inputs',
234         label: translate('Input Parameters'),
235         modelProperty: 'name',
236         prefix: 'Input',
237         resizable: true,
238
239         createExtensionElement: isCreateDeleteSupported(element)
240             ? newElement('camunda:InputParameter', 'inputParameters')
241             : undefined,
242         removeExtensionElement: isCreateDeleteSupported(element)
243             ? removeElement(
244                   getInputParameter,
245                   'inputParameters',
246                   'outputParameters'
247               )
248             : undefined,
249
250         getExtensionElements: function(element) {
251             return getInputParameters(element, insideConnector);
252         },
253
254         onSelectionChange: function(element, node) {
255             outputEntry && outputEntry.deselect(element, node);
256         },
257
258         setOptionLabelValue: setOptionLabelValue(getInputParameter)
259     });
260     entries.push(inputEntry);
261
262     // output parameters ///////////////////////////////////////////////////////
263
264     if (ensureOutparameterSupported(element, insideConnector)) {
265         var outputEntry = extensionElementsEntry(element, bpmnFactory, {
266             id: idPrefix + 'outputs',
267             label: translate('Output Parameters'),
268             modelProperty: 'name',
269             prefix: 'Output',
270             resizable: true,
271
272             createExtensionElement: isCreateDeleteSupported(element)
273                 ? newElement('camunda:OutputParameter', 'outputParameters')
274                 : undefined,
275             removeExtensionElement: isCreateDeleteSupported(element)
276                 ? removeElement(
277                       getOutputParameter,
278                       'outputParameters',
279                       'inputParameters'
280                   )
281                 : isCreateDeleteSupported(element),
282
283             getExtensionElements: function(element) {
284                 return getOutputParameters(element, insideConnector);
285             },
286
287             onSelectionChange: function(element, node) {
288                 inputEntry.deselect(element, node);
289             },
290
291             setOptionLabelValue: setOptionLabelValue(getOutputParameter)
292         });
293         entries.push(outputEntry);
294     }
295
296     return result;
297 };