3 var is = require('bpmn-js/lib/util/ModelUtil').is;
5 var elementHelper = require('bpmn-js-properties-panel/lib/helper/ElementHelper'),
6 inputOutputHelper = require('./InputOutputHelper'),
7 cmdHelper = require('bpmn-js-properties-panel/lib/helper/CmdHelper'),
8 utils = require('bpmn-js-properties-panel/lib/Utils');
10 var entryFactory = require('bpmn-js-properties-panel/lib/factory/EntryFactory'),
11 script = require('bpmn-js-properties-panel/lib/provider/camunda/parts/implementation/Script')(
17 function isElementDisabled(element) {
19 (element.type === 'bpmn:ServiceTask' &&
20 element.businessObject.workflowActivity) ||
21 element.type === 'bpmn:Process'
25 function createElement(type, parent, factory, properties) {
26 return elementHelper.createElement(type, properties, parent, factory);
29 function isScript(elem) {
30 return is(elem, 'camunda:Script');
33 function isList(elem) {
34 return is(elem, 'camunda:List');
37 function isMap(elem) {
38 return is(elem, 'camunda:Map');
41 function ensureInputOutputSupported(element, insideConnector) {
42 return inputOutputHelper.isInputOutputSupported(element, insideConnector);
45 module.exports = function(element, bpmnFactory, options, translate) {
49 label: translate('Map')
53 label: translate('List')
57 label: translate('Script')
61 options = options || {};
63 var insideConnector = !!options.insideConnector,
64 idPrefix = options.idPrefix || '';
66 var getSelected = options.getSelectedParameter;
68 if (!ensureInputOutputSupported(element, insideConnector)) {
74 var isSelected = function(element, node) {
75 return getSelected(element, node);
78 // parameter name ////////////////////////////////////////////////////////
81 entryFactory.validationAwareTextField({
82 id: idPrefix + 'parameterName',
84 modelProperty: 'name',
86 getProperty: function(element, node) {
87 return (getSelected(element, node) || {}).name;
90 setProperty: function(element, values, node) {
91 var param = getSelected(element, node);
92 return cmdHelper.updateBusinessObject(element, param, values);
95 validate: function(element, values, node) {
96 var bo = getSelected(element, node);
100 var nameValue = values.name;
103 if (utils.containsSpace(nameValue)) {
104 validation.name = 'Name must not contain spaces';
107 validation.name = 'Parameter must have a name';
114 hidden: function(element, node) {
115 return !isSelected(element, node);
117 disabled: function(element) {
118 return isElementDisabled(element);
123 // parameter type //////////////////////////////////////////////////////
125 var selectOptions = [
126 { value: 'text', name: 'Text' },
127 { value: 'script', name: 'Script' },
128 { value: 'list', name: 'List' },
129 { value: 'map', name: 'Map' }
133 entryFactory.selectBox({
134 id: idPrefix + 'parameterType',
136 selectOptions: selectOptions,
137 modelProperty: 'parameterType',
139 get: function(element, node) {
140 var bo = getSelected(element, node);
142 var parameterType = 'text';
144 if (typeof bo !== 'undefined') {
145 var definition = bo.get('definition');
146 if (typeof definition !== 'undefined') {
147 var type = definition.$type;
148 parameterType = typeInfo[type].value;
153 parameterType: parameterType
157 set: function(element, values, node) {
158 var bo = getSelected(element, node);
162 definition: undefined
165 var createParameterTypeElem = function(type) {
166 return createElement(type, bo, bpmnFactory);
169 var parameterType = values.parameterType;
171 if (parameterType === 'script') {
172 properties.definition = createParameterTypeElem(
175 } else if (parameterType === 'list') {
176 properties.definition = createParameterTypeElem(
179 } else if (parameterType === 'map') {
180 properties.definition = createParameterTypeElem(
185 return cmdHelper.updateBusinessObject(element, bo, properties);
188 show: function(element, node) {
189 return isSelected(element, node);
191 disabled: function(element) {
192 return isElementDisabled(element);
197 // parameter value (type = text) ///////////////////////////////////////////////////////
200 entryFactory.textBox({
201 id: idPrefix + 'parameterType-text',
203 modelProperty: 'value',
204 get: function(element, node) {
206 value: (getSelected(element, node) || {}).value
210 set: function(element, values, node) {
211 var param = getSelected(element, node);
212 values.value = values.value || undefined;
213 return cmdHelper.updateBusinessObject(element, param, values);
216 show: function(element, node) {
217 var bo = getSelected(element, node);
218 return bo && !bo.definition;
223 // parameter value (type = script) ///////////////////////////////////////////////////////
226 id: idPrefix + 'parameterType-script',
227 html: '<div data-show="isScript">' + script.template + '</div>',
228 get: function(element, node) {
229 var bo = getSelected(element, node);
230 return bo && isScript(bo.definition)
231 ? script.get(element, bo.definition)
235 set: function(element, values, node) {
236 var bo = getSelected(element, node);
237 var update = script.set(element, values);
238 return cmdHelper.updateBusinessObject(
245 validate: function(element, values, node) {
246 var bo = getSelected(element, node);
247 return bo && isScript(bo.definition)
248 ? script.validate(element, bo.definition)
252 isScript: function(element, node) {
253 var bo = getSelected(element, node);
254 return bo && isScript(bo.definition);
260 // parameter value (type = list) ///////////////////////////////////////////////////////
264 id: idPrefix + 'parameterType-list',
265 modelProperties: ['value'],
268 getElements: function(element, node) {
269 var bo = getSelected(element, node);
271 if (bo && isList(bo.definition)) {
272 return bo.definition.items;
278 updateElement: function(element, values, node, idx) {
279 var bo = getSelected(element, node);
280 var item = bo.definition.items[idx];
281 return cmdHelper.updateBusinessObject(element, item, values);
284 addElement: function(element, node) {
285 var bo = getSelected(element, node);
286 var newValue = createElement(
292 return cmdHelper.addElementsTolist(
300 removeElement: function(element, node, idx) {
301 var bo = getSelected(element, node);
302 return cmdHelper.removeElementsFromList(
307 [bo.definition.items[idx]]
311 editable: function(element, node, prop, idx) {
312 var bo = getSelected(element, node);
313 var item = bo.definition.items[idx];
314 return !isMap(item) && !isList(item) && !isScript(item);
317 setControlValue: function(element, node, input, prop, value, idx) {
318 var bo = getSelected(element, node);
319 var item = bo.definition.items[idx];
321 if (!isMap(item) && !isList(item) && !isScript(item)) {
324 input.value = typeInfo[item.$type].label;
328 show: function(element, node) {
329 var bo = getSelected(element, node);
330 return bo && bo.definition && isList(bo.definition);
335 // parameter value (type = map) ///////////////////////////////////////////////////////
339 id: idPrefix + 'parameterType-map',
340 modelProperties: ['key', 'value'],
341 labels: ['Key', 'Value'],
342 addLabel: 'Add Entry',
344 getElements: function(element, node) {
345 var bo = getSelected(element, node);
347 if (bo && isMap(bo.definition)) {
348 return bo.definition.entries;
354 updateElement: function(element, values, node, idx) {
355 var bo = getSelected(element, node);
356 var entry = bo.definition.entries[idx];
359 isMap(entry.definition) ||
360 isList(entry.definition) ||
361 isScript(entry.definition)
368 return cmdHelper.updateBusinessObject(element, entry, values);
371 addElement: function(element, node) {
372 var bo = getSelected(element, node);
373 var newEntry = createElement(
377 { key: undefined, value: undefined }
379 return cmdHelper.addElementsTolist(
387 removeElement: function(element, node, idx) {
388 var bo = getSelected(element, node);
389 return cmdHelper.removeElementsFromList(
394 [bo.definition.entries[idx]]
398 editable: function(element, node, prop, idx) {
399 var bo = getSelected(element, node);
400 var entry = bo.definition.entries[idx];
403 (!isMap(entry.definition) &&
404 !isList(entry.definition) &&
405 !isScript(entry.definition))
409 setControlValue: function(element, node, input, prop, value, idx) {
410 var bo = getSelected(element, node);
411 var entry = bo.definition.entries[idx];
415 (!isMap(entry.definition) &&
416 !isList(entry.definition) &&
417 !isScript(entry.definition))
421 input.value = typeInfo[entry.definition.$type].label;
425 show: function(element, node) {
426 var bo = getSelected(element, node);
427 return bo && bo.definition && isMap(bo.definition);