3     IMPLEMENTATION_TYPE_VALUE,
 
   5 } from './implementationConstants';
 
   6 var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject;
 
   8 var elementHelper = require('bpmn-js-properties-panel/lib/helper/ElementHelper'),
 
   9     extensionElementsHelper = require('bpmn-js-properties-panel/lib/helper/ExtensionElementsHelper'),
 
  10     inputOutputHelper = require('./InputOutputHelper'),
 
  11     cmdHelper = require('bpmn-js-properties-panel/lib/helper/CmdHelper');
 
  13 var extensionElementsEntry = require('bpmn-js-properties-panel/lib/provider/camunda/parts/implementation//ExtensionElements');
 
  15 function isCreateDeleteSupported(element) {
 
  16     const bo = getBusinessObject(element);
 
  18         (element.type !== 'bpmn:ServiceTask' ||
 
  19             bo[implementationType.ACTIVITY] !== IMPLEMENTATION_TYPE_VALUE) &&
 
  20         element.type !== 'bpmn:Process'
 
  24 function getInputOutput(element, insideConnector) {
 
  25     return inputOutputHelper.getInputOutput(element, insideConnector);
 
  28 function getConnector(element) {
 
  29     return inputOutputHelper.getConnector(element);
 
  32 function getInputParameters(element, insideConnector) {
 
  33     return inputOutputHelper.getInputParameters(element, insideConnector);
 
  36 function getOutputParameters(element, insideConnector) {
 
  37     return inputOutputHelper.getOutputParameters(element, insideConnector);
 
  40 function getInputParameter(element, insideConnector, idx) {
 
  41     return inputOutputHelper.getInputParameter(element, insideConnector, idx);
 
  44 function getOutputParameter(element, insideConnector, idx) {
 
  45     return inputOutputHelper.getOutputParameter(element, insideConnector, idx);
 
  48 function createElement(type, parent, factory, properties) {
 
  49     const el = elementHelper.createElement(type, properties, parent, factory);
 
  53 function createInputOutput(parent, bpmnFactory, properties) {
 
  55         'camunda:InputOutput',
 
  62 function createParameter(type, parent, bpmnFactory, properties) {
 
  63     return createElement(type, parent, bpmnFactory, properties);
 
  66 function ensureInputOutputSupported(element, insideConnector) {
 
  67     return inputOutputHelper.isInputOutputSupported(element, insideConnector);
 
  70 function ensureOutparameterSupported(element, insideConnector) {
 
  71     return inputOutputHelper.areOutputParametersSupported(
 
  77 module.exports = function(element, bpmnFactory, options, translate) {
 
  79         'camunda:Map': translate('Map'),
 
  80         'camunda:List': translate('List'),
 
  81         'camunda:Script': translate('Script')
 
  84     options = options || {};
 
  86     var insideConnector = !!options.insideConnector,
 
  87         idPrefix = options.idPrefix || '';
 
  89     var getSelected = function(element, node) {
 
  90         var selection = (inputEntry &&
 
  91             inputEntry.getSelected(element, node)) || { idx: -1 };
 
  93         var parameter = getInputParameter(
 
  98         if (!parameter && outputEntry) {
 
  99             selection = outputEntry.getSelected(element, node);
 
 100             parameter = getOutputParameter(
 
 110         getSelectedParameter: getSelected
 
 113     var entries = (result.entries = []);
 
 115     if (!ensureInputOutputSupported(element)) {
 
 119     var newElement = function(type, prop, elementData) {
 
 120         return function(element, extensionElements, value) {
 
 123             var inputOutput = getInputOutput(element, insideConnector);
 
 125                 var parent = !insideConnector
 
 127                     : getConnector(element);
 
 129                 inputOutput = createInputOutput(parent, bpmnFactory, {
 
 134                 if (!insideConnector) {
 
 136                         cmdHelper.addAndRemoveElementsFromList(
 
 147                         cmdHelper.updateBusinessObject(element, parent, {
 
 148                             inputOutput: inputOutput
 
 154             var newElem = elementData
 
 155                 ? createParameter(type, inputOutput, bpmnFactory, elementData)
 
 156                 : createParameter(type, inputOutput, bpmnFactory, {
 
 160             console.log(newElem);
 
 163                 cmdHelper.addElementsTolist(element, inputOutput, prop, [
 
 172     var removeElement = function(getter, prop, otherProp) {
 
 173         return function(element, extensionElements, value, idx) {
 
 174             var inputOutput = getInputOutput(element, insideConnector);
 
 175             var parameter = getter(element, insideConnector, idx);
 
 179                 cmdHelper.removeElementsFromList(
 
 188             var firstLength = inputOutput.get(prop).length - 1;
 
 189             var secondLength = (inputOutput.get(otherProp) || []).length;
 
 191             if (!firstLength && !secondLength) {
 
 192                 if (!insideConnector) {
 
 194                         extensionElementsHelper.removeEntry(
 
 195                             getBusinessObject(element),
 
 201                     var connector = getConnector(element);
 
 203                         cmdHelper.updateBusinessObject(element, connector, {
 
 204                             inputOutput: undefined
 
 214     var setOptionLabelValue = function(getter) {
 
 215         return function(element, node, option, property, value, idx) {
 
 216             var parameter = getter(element, insideConnector, idx);
 
 220             var definition = parameter.get('definition');
 
 221             if (typeof definition !== 'undefined') {
 
 222                 var type = definition.$type;
 
 223                 suffix = TYPE_LABEL[type];
 
 226             option.text = (value || '') + ' : ' + suffix;
 
 230     // input parameters ///////////////////////////////////////////////////////////////
 
 232     var inputEntry = extensionElementsEntry(element, bpmnFactory, {
 
 233         id: idPrefix + 'inputs',
 
 234         label: translate('Input Parameters'),
 
 235         modelProperty: 'name',
 
 239         createExtensionElement: isCreateDeleteSupported(element)
 
 240             ? newElement('camunda:InputParameter', 'inputParameters')
 
 242         removeExtensionElement: isCreateDeleteSupported(element)
 
 250         getExtensionElements: function(element) {
 
 251             return getInputParameters(element, insideConnector);
 
 254         onSelectionChange: function(element, node) {
 
 255             outputEntry && outputEntry.deselect(element, node);
 
 258         setOptionLabelValue: setOptionLabelValue(getInputParameter)
 
 260     entries.push(inputEntry);
 
 262     // output parameters ///////////////////////////////////////////////////////
 
 264     if (ensureOutparameterSupported(element, insideConnector)) {
 
 265         var outputEntry = extensionElementsEntry(element, bpmnFactory, {
 
 266             id: idPrefix + 'outputs',
 
 267             label: translate('Output Parameters'),
 
 268             modelProperty: 'name',
 
 272             createExtensionElement: isCreateDeleteSupported(element)
 
 273                 ? newElement('camunda:OutputParameter', 'outputParameters')
 
 275             removeExtensionElement: isCreateDeleteSupported(element)
 
 281                 : isCreateDeleteSupported(element),
 
 283             getExtensionElements: function(element) {
 
 284                 return getOutputParameters(element, insideConnector);
 
 287             onSelectionChange: function(element, node) {
 
 288                 inputEntry.deselect(element, node);
 
 291             setOptionLabelValue: setOptionLabelValue(getOutputParameter)
 
 293         entries.push(outputEntry);