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 createElement(type, parent, factory, properties) {
18 return elementHelper.createElement(type, properties, parent, factory);
21 function isScript(elem) {
22 return is(elem, 'camunda:Script');
25 function isList(elem) {
26 return is(elem, 'camunda:List');
29 function isMap(elem) {
30 return is(elem, 'camunda:Map');
33 function ensureInputOutputSupported(element, insideConnector) {
34 return inputOutputHelper.isInputOutputSupported(element, insideConnector);
37 module.exports = function(element, bpmnFactory, options, translate) {
41 label: translate('Map')
45 label: translate('List')
49 label: translate('Script')
53 options = options || {};
55 var insideConnector = !!options.insideConnector,
56 idPrefix = options.idPrefix || '';
58 var getSelected = options.getSelectedParameter;
60 if (!ensureInputOutputSupported(element, insideConnector)) {
66 var isSelected = function(element, node) {
67 return getSelected(element, node);
70 // parameter name ////////////////////////////////////////////////////////
73 entryFactory.validationAwareTextField({
74 id: idPrefix + 'parameterName',
76 modelProperty: 'name',
78 getProperty: function(element, node) {
79 return (getSelected(element, node) || {}).name;
82 setProperty: function(element, values, node) {
83 var param = getSelected(element, node);
84 return cmdHelper.updateBusinessObject(element, param, values);
87 validate: function(element, values, node) {
88 var bo = getSelected(element, node);
92 var nameValue = values.name;
95 if (utils.containsSpace(nameValue)) {
96 validation.name = 'Name must not contain spaces';
99 validation.name = 'Parameter must have a name';
106 hidden: function(element, node) {
107 return !isSelected(element, node);
109 disabled: function(element) {
110 return !inputOutputHelper.isCreateDeleteSupported(element);
115 // parameter type //////////////////////////////////////////////////////
117 var selectOptions = [
118 { value: 'text', name: 'Text' },
119 { value: 'script', name: 'Script' },
120 { value: 'list', name: 'List' },
121 { value: 'map', name: 'Map' }
125 entryFactory.selectBox({
126 id: idPrefix + 'parameterType',
128 selectOptions: selectOptions,
129 modelProperty: 'parameterType',
131 get: function(element, node) {
132 var bo = getSelected(element, node);
134 var parameterType = 'text';
136 if (typeof bo !== 'undefined') {
137 var definition = bo.get('definition');
138 if (typeof definition !== 'undefined') {
139 var type = definition.$type;
140 parameterType = typeInfo[type].value;
145 parameterType: parameterType
149 set: function(element, values, node) {
150 var bo = getSelected(element, node);
154 definition: undefined
157 var createParameterTypeElem = function(type) {
158 return createElement(type, bo, bpmnFactory);
161 var parameterType = values.parameterType;
163 if (parameterType === 'script') {
164 properties.definition = createParameterTypeElem(
167 } else if (parameterType === 'list') {
168 properties.definition = createParameterTypeElem(
171 } else if (parameterType === 'map') {
172 properties.definition = createParameterTypeElem(
177 return cmdHelper.updateBusinessObject(element, bo, properties);
180 show: function(element, node) {
181 return isSelected(element, node);
183 disabled: function(element) {
184 return !inputOutputHelper.isCreateDeleteSupported(element);
189 // parameter value (type = text) ///////////////////////////////////////////////////////
192 entryFactory.textBox({
193 id: idPrefix + 'parameterType-text',
195 modelProperty: 'value',
196 get: function(element, node) {
198 value: (getSelected(element, node) || {}).value
202 set: function(element, values, node) {
203 var param = getSelected(element, node);
204 values.value = values.value || undefined;
205 return cmdHelper.updateBusinessObject(element, param, values);
208 show: function(element, node) {
209 var bo = getSelected(element, node);
210 return bo && !bo.definition;
215 // parameter value (type = script) ///////////////////////////////////////////////////////
218 id: idPrefix + 'parameterType-script',
219 html: '<div data-show="isScript">' + script.template + '</div>',
220 get: function(element, node) {
221 var bo = getSelected(element, node);
222 return bo && isScript(bo.definition)
223 ? script.get(element, bo.definition)
227 set: function(element, values, node) {
228 var bo = getSelected(element, node);
229 var update = script.set(element, values);
230 return cmdHelper.updateBusinessObject(
237 validate: function(element, values, node) {
238 var bo = getSelected(element, node);
239 return bo && isScript(bo.definition)
240 ? script.validate(element, bo.definition)
244 isScript: function(element, node) {
245 var bo = getSelected(element, node);
246 return bo && isScript(bo.definition);
252 // parameter value (type = list) ///////////////////////////////////////////////////////
256 id: idPrefix + 'parameterType-list',
257 modelProperties: ['value'],
260 getElements: function(element, node) {
261 var bo = getSelected(element, node);
263 if (bo && isList(bo.definition)) {
264 return bo.definition.items;
270 updateElement: function(element, values, node, idx) {
271 var bo = getSelected(element, node);
272 var item = bo.definition.items[idx];
273 return cmdHelper.updateBusinessObject(element, item, values);
276 addElement: function(element, node) {
277 var bo = getSelected(element, node);
278 var newValue = createElement(
284 return cmdHelper.addElementsTolist(
292 removeElement: function(element, node, idx) {
293 var bo = getSelected(element, node);
294 return cmdHelper.removeElementsFromList(
299 [bo.definition.items[idx]]
303 editable: function(element, node, prop, idx) {
304 var bo = getSelected(element, node);
305 var item = bo.definition.items[idx];
306 return !isMap(item) && !isList(item) && !isScript(item);
309 setControlValue: function(element, node, input, prop, value, idx) {
310 var bo = getSelected(element, node);
311 var item = bo.definition.items[idx];
313 if (!isMap(item) && !isList(item) && !isScript(item)) {
316 input.value = typeInfo[item.$type].label;
320 show: function(element, node) {
321 var bo = getSelected(element, node);
322 return bo && bo.definition && isList(bo.definition);
327 // parameter value (type = map) ///////////////////////////////////////////////////////
331 id: idPrefix + 'parameterType-map',
332 modelProperties: ['key', 'value'],
333 labels: ['Key', 'Value'],
334 addLabel: 'Add Entry',
336 getElements: function(element, node) {
337 var bo = getSelected(element, node);
339 if (bo && isMap(bo.definition)) {
340 return bo.definition.entries;
346 updateElement: function(element, values, node, idx) {
347 var bo = getSelected(element, node);
348 var entry = bo.definition.entries[idx];
351 isMap(entry.definition) ||
352 isList(entry.definition) ||
353 isScript(entry.definition)
360 return cmdHelper.updateBusinessObject(element, entry, values);
363 addElement: function(element, node) {
364 var bo = getSelected(element, node);
365 var newEntry = createElement(
369 { key: undefined, value: undefined }
371 return cmdHelper.addElementsTolist(
379 removeElement: function(element, node, idx) {
380 var bo = getSelected(element, node);
381 return cmdHelper.removeElementsFromList(
386 [bo.definition.entries[idx]]
390 editable: function(element, node, prop, idx) {
391 var bo = getSelected(element, node);
392 var entry = bo.definition.entries[idx];
395 (!isMap(entry.definition) &&
396 !isList(entry.definition) &&
397 !isScript(entry.definition))
401 setControlValue: function(element, node, input, prop, value, idx) {
402 var bo = getSelected(element, node);
403 var entry = bo.definition.entries[idx];
407 (!isMap(entry.definition) &&
408 !isList(entry.definition) &&
409 !isScript(entry.definition))
413 input.value = typeInfo[entry.definition.$type].label;
417 show: function(element, node) {
418 var bo = getSelected(element, node);
419 return bo && bo.definition && isMap(bo.definition);