1 import inputOutputHelper from './InputOutputHelper';
3 var is = require('bpmn-js/lib/util/ModelUtil').is;
5 var elementHelper = require('bpmn-js-properties-panel/lib/helper/ElementHelper'),
6 cmdHelper = require('bpmn-js-properties-panel/lib/helper/CmdHelper'),
7 utils = require('bpmn-js-properties-panel/lib/Utils');
9 var entryFactory = require('bpmn-js-properties-panel/lib/factory/EntryFactory'),
10 script = require('bpmn-js-properties-panel/lib/provider/camunda/parts/implementation/Script')(
16 function createElement(type, parent, factory, properties) {
17 return elementHelper.createElement(type, properties, parent, factory);
20 function isScript(elem) {
21 return is(elem, 'camunda:Script');
24 function isList(elem) {
25 return is(elem, 'camunda:List');
28 function isMap(elem) {
29 return is(elem, 'camunda:Map');
32 function ensureInputOutputSupported(element, insideConnector) {
33 return inputOutputHelper.isInputOutputSupported(element, insideConnector);
36 export default function(element, bpmnFactory, options, translate, config) {
40 label: translate('Map')
44 label: translate('List')
48 label: translate('Script')
52 options = options || {};
54 var insideConnector = !!options.insideConnector,
55 idPrefix = options.idPrefix || '';
57 var getSelected = options.getSelectedParameter;
59 if (!ensureInputOutputSupported(element, insideConnector)) {
65 var isSelected = function(element, node) {
66 return getSelected(element, node);
69 // parameter name ////////////////////////////////////////////////////////
72 entryFactory.validationAwareTextField({
73 id: idPrefix + 'parameterName',
75 modelProperty: 'name',
77 getProperty: function(element, node) {
78 return (getSelected(element, node) || {}).name;
81 setProperty: function(element, values, node) {
82 var param = getSelected(element, node);
83 return cmdHelper.updateBusinessObject(element, param, values);
86 validate: function(element, values, node) {
87 var bo = getSelected(element, node);
91 var nameValue = values.name;
94 if (utils.containsSpace(nameValue)) {
95 validation.name = 'Name must not contain spaces';
98 validation.name = 'Parameter must have a name';
105 hidden: function(element, node) {
106 return !isSelected(element, node);
108 disabled: function(element) {
109 return !inputOutputHelper.isCreateDeleteSupported(element);
114 // parameter type //////////////////////////////////////////////////////
116 var selectOptions = [
117 { value: 'text', name: 'Text' },
118 { value: 'script', name: 'Script' },
119 { value: 'list', name: 'List' },
120 { value: 'map', name: 'Map' }
124 entryFactory.selectBox({
125 id: idPrefix + 'parameterType',
127 selectOptions: selectOptions,
128 modelProperty: 'parameterType',
130 get: function(element, node) {
131 var bo = getSelected(element, node);
133 var parameterType = 'text';
135 if (typeof bo !== 'undefined') {
136 var definition = bo.get('definition');
137 if (typeof definition !== 'undefined') {
138 var type = definition.$type;
139 parameterType = typeInfo[type].value;
144 parameterType: parameterType
148 set: function(element, values, node) {
149 var bo = getSelected(element, node);
153 definition: undefined
156 var createParameterTypeElem = function(type) {
157 return createElement(type, bo, bpmnFactory);
160 var parameterType = values.parameterType;
162 if (parameterType === 'script') {
163 properties.definition = createParameterTypeElem(
166 } else if (parameterType === 'list') {
167 properties.definition = createParameterTypeElem(
170 } else if (parameterType === 'map') {
171 properties.definition = createParameterTypeElem(
176 return cmdHelper.updateBusinessObject(element, bo, properties);
179 show: function(element, node) {
180 return isSelected(element, node);
182 disabled: function(element) {
183 return !inputOutputHelper.isCreateDeleteSupported(element);
188 // parameter value (type = text) ///////////////////////////////////////////////////////
191 entryFactory.textBox({
192 id: idPrefix + 'parameterType-text',
194 modelProperty: 'value',
195 get: function(element, node) {
197 value: (getSelected(element, node) || {}).value
201 set: function(element, values, node) {
202 var param = getSelected(element, node);
203 values.value = values.value || undefined;
204 return cmdHelper.updateBusinessObject(element, param, values);
207 show: function(element, node) {
208 var bo = getSelected(element, node);
209 return bo && !bo.definition;
214 // parameter value (type = script) ///////////////////////////////////////////////////////
217 id: idPrefix + 'parameterType-script',
218 html: '<div data-show="isScript">' + script.template + '</div>',
219 get: function(element, node) {
220 var bo = getSelected(element, node);
221 return bo && isScript(bo.definition)
222 ? script.get(element, bo.definition)
226 set: function(element, values, node) {
227 var bo = getSelected(element, node);
228 var update = script.set(element, values);
229 return cmdHelper.updateBusinessObject(
236 validate: function(element, values, node) {
237 var bo = getSelected(element, node);
238 return bo && isScript(bo.definition)
239 ? script.validate(element, bo.definition)
243 isScript: function(element, node) {
244 var bo = getSelected(element, node);
245 return bo && isScript(bo.definition);
251 // parameter value (type = list) ///////////////////////////////////////////////////////
255 id: idPrefix + 'parameterType-list',
256 modelProperties: ['value'],
259 getElements: function(element, node) {
260 var bo = getSelected(element, node);
262 if (bo && isList(bo.definition)) {
263 return bo.definition.items;
269 updateElement: function(element, values, node, idx) {
270 var bo = getSelected(element, node);
271 var item = bo.definition.items[idx];
272 return cmdHelper.updateBusinessObject(element, item, values);
275 addElement: function(element, node) {
276 var bo = getSelected(element, node);
277 var newValue = createElement(
283 return cmdHelper.addElementsTolist(
291 removeElement: function(element, node, idx) {
292 var bo = getSelected(element, node);
293 return cmdHelper.removeElementsFromList(
298 [bo.definition.items[idx]]
302 editable: function(element, node, prop, idx) {
303 var bo = getSelected(element, node);
304 var item = bo.definition.items[idx];
305 return !isMap(item) && !isList(item) && !isScript(item);
308 setControlValue: function(element, node, input, prop, value, idx) {
309 var bo = getSelected(element, node);
310 var item = bo.definition.items[idx];
312 if (!isMap(item) && !isList(item) && !isScript(item)) {
315 input.value = typeInfo[item.$type].label;
319 show: function(element, node) {
320 var bo = getSelected(element, node);
321 return bo && bo.definition && isList(bo.definition);
326 // parameter value (type = map) ///////////////////////////////////////////////////////
330 id: idPrefix + 'parameterType-map',
331 modelProperties: ['key', 'value'],
332 labels: ['Key', 'Value'],
333 addLabel: 'Add Entry',
335 getElements: function(element, node) {
336 var bo = getSelected(element, node);
338 if (bo && isMap(bo.definition)) {
339 return bo.definition.entries;
345 updateElement: function(element, values, node, idx) {
346 var bo = getSelected(element, node);
347 var entry = bo.definition.entries[idx];
350 isMap(entry.definition) ||
351 isList(entry.definition) ||
352 isScript(entry.definition)
359 return cmdHelper.updateBusinessObject(element, entry, values);
362 addElement: function(element, node) {
363 var bo = getSelected(element, node);
364 var newEntry = createElement(
368 { key: undefined, value: undefined }
370 return cmdHelper.addElementsTolist(
378 removeElement: function(element, node, idx) {
379 var bo = getSelected(element, node);
380 return cmdHelper.removeElementsFromList(
385 [bo.definition.entries[idx]]
389 editable: function(element, node, prop, idx) {
390 var bo = getSelected(element, node);
391 var entry = bo.definition.entries[idx];
394 (!isMap(entry.definition) &&
395 !isList(entry.definition) &&
396 !isScript(entry.definition))
400 setControlValue: function(element, node, input, prop, value, idx) {
401 var bo = getSelected(element, node);
402 var entry = bo.definition.entries[idx];
406 (!isMap(entry.definition) &&
407 !isList(entry.definition) &&
408 !isScript(entry.definition))
412 input.value = typeInfo[entry.definition.$type].label;
416 show: function(element, node) {
417 var bo = getSelected(element, node);
418 return bo && bo.definition && isMap(bo.definition);
423 //workflow source parameter (type = text) ///////////////////////////////////////////////////////
424 const workflowInputs = config.workflowInputOutput.inputs.map(item => ({
429 const workflowOutputs = config.workflowInputOutput.outputs.map(item => ({
434 const workflowSources = [
435 { name: '', value: '' },
441 entryFactory.selectBox({
442 id: 'parameter-workflowSource',
443 label: 'Workflow Source Parameter',
444 selectOptions: workflowSources,
445 modelProperty: 'workflowSource',
447 get: function(element, node) {
449 workflowSource: (getSelected(element, node) || {})
454 set: function(element, values, node) {
456 workflowSource: undefined
459 properties.workflowSource = values.workflowSource;
460 var param = getSelected(element, node);
461 values.workflowSource = values.workflowSource || undefined;
463 return cmdHelper.updateBusinessObject(element, param, values);
466 hidden: function(element, node) {
467 var bo = getSelected(element, node);
471 bo.$type === 'camunda:InputParameter'
477 //workflow target parameter (type = text) ///////////////////////////////////////////////////////
479 entryFactory.selectBox({
480 id: 'parameter-workflowTarget',
481 label: 'Workflow Target Parameter',
482 selectOptions: workflowSources,
483 modelProperty: 'workflowTarget',
485 get: function(element, node) {
487 workflowTarget: (getSelected(element, node) || {})
492 set: function(element, values, node) {
494 workflowTarget: undefined
497 properties.workflowTarget = values.workflowTarget;
498 var param = getSelected(element, node);
499 values.workflowTarget = values.workflowTarget || undefined;
501 return cmdHelper.updateBusinessObject(element, param, values);
504 hidden: function(element, node) {
505 var bo = getSelected(element, node);
509 bo.$type === 'camunda:OutputParameter'