'use strict'; var is = require('bpmn-js/lib/util/ModelUtil').is, getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject; var extensionElementsEntry = require('./ExtensionElements'), extensionElementsHelper = require('../../../../helper/ExtensionElementsHelper'), cmdHelper = require('../../../../helper/CmdHelper'), elementHelper = require('../../../../helper/ElementHelper'), ImplementationTypeHelper = require('../../../../helper/ImplementationTypeHelper'); function getListeners(bo, type) { return bo && extensionElementsHelper.getExtensionElements(bo, type) || []; } var ACTIVITI_EXECUTION_LISTENER_ELEMENT = 'activiti:ExecutionListener'; var ACTIVITI_TASK_LISTENER_ELEMENT = 'activiti:TaskListener'; module.exports = function(element, bpmnFactory, options, translate) { var LISTENER_TYPE_LABEL = { class: translate('Java Class'), expression: translate('Expression'), delegateExpression: translate('Delegate Expression'), script: translate('Script') }; var bo; var result = { getSelectedListener: getSelectedListener }; var entries = result.entries = []; var isSequenceFlow = ImplementationTypeHelper.isSequenceFlow(element); function getSelectedListener(element, node) { var selection = (executionListenerEntry && executionListenerEntry.getSelected(element, node)) || { idx: -1 }; var listener = getListeners(bo, ACTIVITI_EXECUTION_LISTENER_ELEMENT)[selection.idx]; if (!listener && taskListenerEntry) { selection = taskListenerEntry.getSelected(element, node); listener = getListeners(bo, ACTIVITI_TASK_LISTENER_ELEMENT)[selection.idx]; } return listener; } var setOptionLabelValue = function(type) { return function(element, node, option, property, value, idx) { var listeners = getListeners(bo, type); var listener = listeners[idx]; var listenerType = ImplementationTypeHelper.getImplementationType(listener); var event = (listener.get('event')) ? listener.get('event') : ''; var label = (event || '*') + ' : ' + (LISTENER_TYPE_LABEL[listenerType] || ''); option.text = label; }; }; var newElement = function(element, type, initialEvent) { return function(element, extensionElements, value) { var props = { event: initialEvent, class: '' }; var newElem = elementHelper.createElement(type, props, extensionElements, bpmnFactory); return cmdHelper.addElementsTolist(element, extensionElements, 'values', [ newElem ]); }; }; var removeElement = function(element, type) { return function(element, extensionElements, value, idx) { var listeners = getListeners(bo, type); var listener = listeners[idx]; if (listener) { return extensionElementsHelper.removeEntry(bo, element, listener); } }; }; // Execution Listener if (is(element, 'bpmn:FlowElement') || is(element, 'bpmn:Process') || is(element, 'bpmn:Participant')) { bo = getBusinessObject(element); if (is(element, 'bpmn:Participant')) { element = element.processRef; bo = bo.get('processRef'); } if (bo) { var executionListenerEntry = extensionElementsEntry(element, bpmnFactory, { id : 'executionListeners', label : translate('Execution Listener'), modelProperty: 'name', idGeneration: 'false', reference: 'processRef', createExtensionElement: newElement(element, ACTIVITI_EXECUTION_LISTENER_ELEMENT, (isSequenceFlow) ? 'take' : 'start'), removeExtensionElement: removeElement(element, ACTIVITI_EXECUTION_LISTENER_ELEMENT), getExtensionElements: function(element) { return getListeners(bo, ACTIVITI_EXECUTION_LISTENER_ELEMENT); }, onSelectionChange: function(element, node, event, scope) { taskListenerEntry && taskListenerEntry.deselect(element, node); }, setOptionLabelValue: setOptionLabelValue(ACTIVITI_EXECUTION_LISTENER_ELEMENT) }); entries.push(executionListenerEntry); } } // Task Listener if (is(element, 'bpmn:UserTask')) { bo = getBusinessObject(element); var taskListenerEntry = extensionElementsEntry(element, bpmnFactory, { id : 'taskListeners', label : translate('Task Listener'), modelProperty: 'name', idGeneration: 'false', createExtensionElement: newElement(element, ACTIVITI_TASK_LISTENER_ELEMENT, 'create'), removeExtensionElement: removeElement(element, ACTIVITI_TASK_LISTENER_ELEMENT), getExtensionElements: function(element) { return getListeners(bo, ACTIVITI_TASK_LISTENER_ELEMENT); }, onSelectionChange: function(element, node, event, scope) { executionListenerEntry.deselect(element, node); }, setOptionLabelValue: setOptionLabelValue(ACTIVITI_TASK_LISTENER_ELEMENT) }); entries.push(taskListenerEntry); } return result; };