'use strict'; var entryFactory = require('../../../factory/EntryFactory'); var cmdHelper = require('../../../helper/CmdHelper'), ImplementationTypeHelper = require('../../../helper/ImplementationTypeHelper'), scriptImplementation = require('./implementation/Script'); module.exports = function(group, element, bpmnFactory, options, translate) { var LISTENER_TYPE_LABEL = { class: translate('Java Class'), expression: translate('Expression'), delegateExpression: translate('Delegate Expression'), script: translate('Script') }; options = options || {}; var getSelectedListener = options.getSelectedListener; var classProp = 'class', expressionProp = 'expression', delegateExpressionProp = 'delegateExpression', scriptProp = 'script'; var executionListenerEventTypeOptions = ImplementationTypeHelper.isSequenceFlow(element) ? [ { name: translate('take'), value: 'take' } ] : [ { name: translate('start'), value: 'start' }, { name: translate('end'), value: 'end' } ]; var taskListenerEventTypeOptions = [ { name: translate('create'), value: 'create' }, { name: translate('assignment'), value: 'assignment' }, { name: translate('complete'), value: 'complete' }, { name: translate('delete'), value: 'delete' } ]; var isSelected = function(element, node) { return getSelectedListener(element, node); }; group.entries.push(entryFactory.selectBox({ id: 'listener-event-type', label: translate('Event Type'), modelProperty: 'eventType', emptyParameter: false, get: function(element, node) { var listener = getSelectedListener(element, node); var eventType = listener && listener.get('event'); return { eventType: eventType }; }, set: function(element, values, node) { var eventType = values.eventType; return cmdHelper.updateBusinessObject(element, getSelectedListener(element, node), { event: eventType }); }, selectOptions: function(element, node) { var eventTypeOptions; var selectedListener = getSelectedListener(element, node); if (ImplementationTypeHelper.isTaskListener(selectedListener)) { eventTypeOptions = taskListenerEventTypeOptions; } else if (ImplementationTypeHelper.isExecutionListener(selectedListener)) { eventTypeOptions = executionListenerEventTypeOptions; } return eventTypeOptions; }, hidden: function(element, node) { return !isSelected(element, node); } })); group.entries.push(entryFactory.selectBox({ id: 'listener-type', label: translate('Listener Type'), selectOptions: [ { value: classProp, name: translate('Java Class') }, { value: expressionProp, name: translate('Expression') }, { value: delegateExpressionProp, name: translate('Delegate Expression') }, { value: scriptProp, name: translate('Script') } ], modelProperty: 'listenerType', emptyParameter: false, get: function(element, node) { var listener = getSelectedListener(element, node); return { listenerType: ImplementationTypeHelper.getImplementationType(listener) }; }, set: function(element, values, node) { var listener = getSelectedListener(element, node), listenerType = values.listenerType || undefined, update = {}; update[classProp] = listenerType === classProp ? '' : undefined; update[expressionProp] = listenerType === expressionProp ? '' : undefined; update[delegateExpressionProp] = listenerType === delegateExpressionProp ? '' : undefined; update[scriptProp] = listenerType === scriptProp ? bpmnFactory.create('activiti:Script') : undefined; return cmdHelper.updateBusinessObject(element, listener, update); }, hidden: function(element, node) { return !isSelected(element, node); } })); group.entries.push(entryFactory.textField({ id: 'listener-value', dataValueLabel: 'listenerValueLabel', modelProperty: 'listenerValue', get: function(element, node) { var value = {}, listener = getSelectedListener(element, node), listenerType = ImplementationTypeHelper.getImplementationType(listener); value.listenerValueLabel = LISTENER_TYPE_LABEL[listenerType] || ''; value.listenerValue = (listener && listener.get(listenerType)) || undefined; return value; }, set: function(element, values, node) { var update = {}, listener = getSelectedListener(element, node), listenerType = ImplementationTypeHelper.getImplementationType(listener); update[listenerType] = values.listenerValue || ''; return cmdHelper.updateBusinessObject(element, listener, update); }, hidden: function(element, node) { var listener = getSelectedListener(element, node); return !listener || listener.script; }, validate: function(element, values) { var value = values.listenerValue, validate = {}; if (!value) { validate.listenerValue = translate('Must provide a value'); } return validate; } })); var script = scriptImplementation('scriptFormat', 'value', true, translate); group.entries.push({ id: 'listener-script-value', html: '
' + script.template + '
', get: function(element, node) { var listener = getSelectedListener(element, node); return listener && listener.script ? script.get(element, listener.script) : {}; }, set: function(element, values, node) { var listener = getSelectedListener(element, node); var update = script.set(element, values, listener); return cmdHelper.updateBusinessObject(element, listener.script, update); }, validate: function(element, values, node) { var listener = getSelectedListener(element, node); return listener && listener.script ? script.validate(element, values) : {}; }, isScript: function(element, node) { var listener = getSelectedListener(element, node); return listener && listener.script; }, script: script }); };