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);