'use strict'; var entryFactory = require('../../../../factory/EntryFactory'), cmdHelper = require('../../../../helper/CmdHelper'), extensionElementsHelper = require('../../../../helper/ExtensionElementsHelper'), elementHelper = require('../../../../helper/ElementHelper'); var assign = require('lodash/assign'); var map = require('lodash/map'); var DEFAULT_DELEGATE_PROPS = [ 'class', 'expression', 'delegateExpression' ]; var DELEGATE_PROPS = { 'activiti:class': undefined, 'activiti:expression': undefined, 'activiti:delegateExpression': undefined, 'activiti:resultVariable': undefined }; var DMN_CAPABLE_PROPS = { 'activiti:decisionRef': undefined, 'activiti:decisionRefBinding': 'latest', 'activiti:decisionRefVersion': undefined, 'activiti:mapDecisionResult': 'resultList', 'activiti:decisionRefTenantId': undefined }; var EXTERNAL_CAPABLE_PROPS = { 'activiti:type': undefined, 'activiti:topic': undefined }; module.exports = function(element, bpmnFactory, options, translate) { var DEFAULT_OPTIONS = [ { value: 'class', name: translate('Java Class') }, { value: 'expression', name: translate('Expression') }, { value: 'delegateExpression', name: translate('Delegate Expression') } ]; var DMN_OPTION = [ { value: 'dmn', name: translate('DMN') } ]; var EXTERNAL_OPTION = [ { value: 'external', name: translate('External') } ]; var CONNECTOR_OPTION = [ { value: 'connector', name: translate('Connector') } ]; var SCRIPT_OPTION = [ { value: 'script', name: translate('Script') } ]; var getType = options.getImplementationType, getBusinessObject = options.getBusinessObject; var hasDmnSupport = options.hasDmnSupport, hasExternalSupport = options.hasExternalSupport, hasServiceTaskLikeSupport = options.hasServiceTaskLikeSupport, hasScriptSupport = options.hasScriptSupport; var entries = []; var selectOptions = DEFAULT_OPTIONS.concat([]); if (hasDmnSupport) { selectOptions = selectOptions.concat(DMN_OPTION); } if (hasExternalSupport) { selectOptions = selectOptions.concat(EXTERNAL_OPTION); } if (hasServiceTaskLikeSupport) { selectOptions = selectOptions.concat(CONNECTOR_OPTION); } if (hasScriptSupport) { selectOptions = selectOptions.concat(SCRIPT_OPTION); } selectOptions.push({ value: '' }); entries.push(entryFactory.selectBox({ id : 'implementation', label: translate('Implementation'), selectOptions: selectOptions, modelProperty: 'implType', get: function(element, node) { return { implType: getType(element) || '' }; }, set: function(element, values, node) { var bo = getBusinessObject(element); var oldType = getType(element); var newType = values.implType; var props = assign({}, DELEGATE_PROPS); if (DEFAULT_DELEGATE_PROPS.indexOf(newType) !== -1) { var newValue = ''; if (DEFAULT_DELEGATE_PROPS.indexOf(oldType) !== -1) { newValue = bo.get('activiti:' + oldType); } props['activiti:' + newType] = newValue; } if (hasDmnSupport) { props = assign(props, DMN_CAPABLE_PROPS); if (newType === 'dmn') { props['activiti:decisionRef'] = ''; } } if (hasExternalSupport) { props = assign(props, EXTERNAL_CAPABLE_PROPS); if (newType === 'external') { props['activiti:type'] = 'external'; props['activiti:topic'] = ''; } } if (hasScriptSupport) { props['activiti:script'] = undefined; if (newType === 'script') { props['activiti:script'] = elementHelper.createElement('activiti:Script', {}, bo, bpmnFactory); } } var commands = []; commands.push(cmdHelper.updateBusinessObject(element, bo, props)); if (hasServiceTaskLikeSupport) { var connectors = extensionElementsHelper.getExtensionElements(bo, 'activiti:Connector'); commands.push(map(connectors, function(connector) { return extensionElementsHelper.removeEntry(bo, element, connector); })); if (newType === 'connector') { var extensionElements = bo.get('extensionElements'); if (!extensionElements) { extensionElements = elementHelper.createElement('bpmn:ExtensionElements', { values: [] }, bo, bpmnFactory); commands.push(cmdHelper.updateBusinessObject(element, bo, { extensionElements: extensionElements })); } var connector = elementHelper.createElement('activiti:Connector', {}, extensionElements, bpmnFactory); commands.push(cmdHelper.addAndRemoveElementsFromList( element, extensionElements, 'values', 'extensionElements', [ connector ], [] )); } } return commands; } })); return entries; };