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