123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397 |
- 'use strict';
- var is = require('bpmn-js/lib/util/ModelUtil').is,
- isAny = require('bpmn-js/lib/features/modeling/util/ModelingUtil').isAny,
- getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject;
- var filter = require('lodash/filter');
- var extensionElementsHelper = require('../../../helper/ExtensionElementsHelper'),
- cmdHelper = require('../../../helper/CmdHelper'),
- elementHelper = require('../../../helper/ElementHelper'),
- eventDefinitionHelper = require('../../../helper/EventDefinitionHelper');
- var extensionElementsEntry = require('./implementation/ExtensionElements');
- var entryFactory = require('../../../factory/EntryFactory');
- /**
- * return depend on parameter 'type' activiti:in or activiti:out extension elements
- */
- function getActivitiInOutMappings(element, type) {
- var bo = getBusinessObject(element);
- var signalEventDefinition = eventDefinitionHelper.getSignalEventDefinition(bo);
- return extensionElementsHelper.getExtensionElements(signalEventDefinition || bo, type) || [];
- }
- /**
- * return depend on parameter 'type' activiti:in or activiti:out extension elements
- * with source or sourceExpression attribute
- */
- function getVariableMappings(element, type) {
- var activitiMappings = getActivitiInOutMappings(element, type);
- return filter(activitiMappings, function(mapping) {
- return !mapping.businessKey;
- });
- }
- function getInOutType(mapping) {
- var inOutType = 'source';
- if (mapping.variables === 'all') {
- inOutType = 'variables';
- }
- else if (typeof mapping.source !== 'undefined') {
- inOutType = 'source';
- }
- else if (typeof mapping.sourceExpression !== 'undefined') {
- inOutType = 'sourceExpression';
- }
- return inOutType;
- }
- var ACTIVITI_IN_EXTENSION_ELEMENT = 'activiti:In',
- ACTIVITI_OUT_EXTENSION_ELEMENT = 'activiti:Out';
- var WHITESPACE_REGEX = /\s/;
- module.exports = function(group, element, bpmnFactory, translate) {
- var inOutTypeOptions = [
- {
- name: translate('Source'),
- value: 'source'
- },
- {
- name: translate('Source Expression'),
- value: 'sourceExpression'
- },
- {
- name: translate('All'),
- value: 'variables'
- }
- ];
- var signalEventDefinition = eventDefinitionHelper.getSignalEventDefinition(element);
- if (!is(element, 'activiti:CallActivity') && !signalEventDefinition) {
- return;
- }
- if (signalEventDefinition && !(isAny(element, [
- 'bpmn:IntermediateThrowEvent',
- 'bpmn:EndEvent'
- ]))) {
- return;
- }
- var isSelected = function(element, node) {
- return !!getSelected(element, node);
- };
- var getSelected = function(element, node) {
- var parentNode = node.parentNode;
- var selection = inEntry.getSelected(element, parentNode);
- var parameter = getVariableMappings(element, ACTIVITI_IN_EXTENSION_ELEMENT)[selection.idx];
- if (!parameter && outEntry) {
- selection = outEntry.getSelected(element, parentNode);
- parameter = getVariableMappings(element, ACTIVITI_OUT_EXTENSION_ELEMENT)[selection.idx];
- }
- return parameter;
- };
- var setOptionLabelValue = function(type) {
- return function(element, node, option, property, value, idx) {
- var variableMappings = getVariableMappings(element, type);
- var mappingValue = variableMappings[idx];
- var label = (mappingValue.target || '<undefined>') + ' := ';
- var mappingType = getInOutType(mappingValue);
- if (mappingType === 'variables') {
- label = 'all';
- }
- else if (mappingType === 'source') {
- label = label + (mappingValue.source || '<empty>');
- }
- else if (mappingType === 'sourceExpression') {
- label = label + (mappingValue.sourceExpression || '<empty>');
- } else {
- label = label + '<empty>';
- }
- option.text = label;
- };
- };
- var newElement = function(type) {
- return function(element, extensionElements, value) {
- var newElem = elementHelper.createElement(type, { source: '' }, extensionElements, bpmnFactory);
- return cmdHelper.addElementsTolist(element, extensionElements, 'values', [ newElem ]);
- };
- };
- var removeElement = function(type) {
- return function(element, extensionElements, value, idx) {
- var variablesMappings= getVariableMappings(element, type);
- var mapping = variablesMappings[idx];
- if (mapping) {
- return extensionElementsHelper
- .removeEntry(signalEventDefinition || getBusinessObject(element), element, mapping);
- }
- };
- };
- // in mapping for source and sourceExpression ///////////////////////////////////////////////////////////////
- var inEntry = extensionElementsEntry(element, bpmnFactory, {
- id: 'variableMapping-in',
- label: translate('In Mapping'),
- modelProperty: 'source',
- prefix: 'In',
- idGeneration: false,
- resizable: true,
- businessObject: signalEventDefinition || getBusinessObject(element),
- createExtensionElement: newElement(ACTIVITI_IN_EXTENSION_ELEMENT),
- removeExtensionElement: removeElement(ACTIVITI_IN_EXTENSION_ELEMENT),
- getExtensionElements: function(element) {
- return getVariableMappings(element, ACTIVITI_IN_EXTENSION_ELEMENT);
- },
- onSelectionChange: function(element, node, event, scope) {
- outEntry && outEntry.deselect(element, node.parentNode);
- },
- setOptionLabelValue: setOptionLabelValue(ACTIVITI_IN_EXTENSION_ELEMENT)
- });
- group.entries.push(inEntry);
- // out mapping for source and sourceExpression ///////////////////////////////////////////////////////
- if (!signalEventDefinition) {
- var outEntry = extensionElementsEntry(element, bpmnFactory, {
- id: 'variableMapping-out',
- label: translate('Out Mapping'),
- modelProperty: 'source',
- prefix: 'Out',
- idGeneration: false,
- resizable: true,
- createExtensionElement: newElement(ACTIVITI_OUT_EXTENSION_ELEMENT),
- removeExtensionElement: removeElement(ACTIVITI_OUT_EXTENSION_ELEMENT),
- getExtensionElements: function(element) {
- return getVariableMappings(element, ACTIVITI_OUT_EXTENSION_ELEMENT);
- },
- onSelectionChange: function(element, node, event, scope) {
- inEntry.deselect(element, node.parentNode);
- },
- setOptionLabelValue: setOptionLabelValue(ACTIVITI_OUT_EXTENSION_ELEMENT)
- });
- group.entries.push(outEntry);
- }
- // label for selected mapping ///////////////////////////////////////////////////////
- group.entries.push(entryFactory.label({
- id: 'variableMapping-typeLabel',
- get: function(element, node) {
- var mapping = getSelected(element, node);
- var value = '';
- if (is(mapping, ACTIVITI_IN_EXTENSION_ELEMENT)) {
- value = translate('In Mapping');
- }
- else if (is(mapping, ACTIVITI_OUT_EXTENSION_ELEMENT)) {
- value = translate('Out Mapping');
- }
- return {
- label: value
- };
- },
- showLabel: function(element, node) {
- return isSelected(element, node);
- }
- }));
- group.entries.push(entryFactory.selectBox({
- id: 'variableMapping-inOutType',
- label: translate('Type'),
- selectOptions: inOutTypeOptions,
- modelProperty: 'inOutType',
- get: function(element, node) {
- var mapping = getSelected(element, node) || {};
- return {
- inOutType: getInOutType(mapping)
- };
- },
- set: function(element, values, node) {
- var inOutType = values.inOutType;
- var props = {
- 'source' : undefined,
- 'sourceExpression' : undefined,
- 'variables' : undefined
- };
- if (inOutType === 'source') {
- props.source = '';
- }
- else if (inOutType === 'sourceExpression') {
- props.sourceExpression = '';
- }
- else if (inOutType === 'variables') {
- props.variables = 'all';
- props.target = undefined;
- }
- var mapping = getSelected(element, node);
- return cmdHelper.updateBusinessObject(element, mapping, props);
- },
- hidden: function(element, node) {
- return !isSelected(element, node);
- }
- }));
- group.entries.push(entryFactory.textField({
- id: 'variableMapping-source',
- dataValueLabel: 'sourceLabel',
- modelProperty: 'source',
- get: function(element, node) {
- var mapping = getSelected(element, node) || {};
- var label = '';
- var inOutType = getInOutType(mapping);
- if (inOutType === 'source') {
- label = translate('Source');
- }
- else if (inOutType === 'sourceExpression') {
- label = translate('Source Expression');
- }
- return {
- source: mapping[inOutType],
- sourceLabel: label
- };
- },
- set: function(element, values, node) {
- values.source = values.source || undefined;
- var mapping = getSelected(element, node);
- var inOutType = getInOutType(mapping);
- var props = {};
- props[inOutType] = values.source || '';
- return cmdHelper.updateBusinessObject(element, mapping, props);
- },
- // one of both (source or sourceExpression) must have a value to make
- // the configuration easier and more understandable
- // it is not engine conform
- validate: function(element, values, node) {
- var mapping = getSelected(element, node);
- var validation = {};
- if (mapping) {
- if (!values.source) {
- validation.source =
- validation.source = values.sourceLabel ?
- translate('Mapping must have a {value}', { value: values.sourceLabel.toLowerCase() }) :
- translate('Mapping must have a value');
- }
- var inOutType = getInOutType(mapping);
- if (WHITESPACE_REGEX.test(values.source) && inOutType !== 'sourceExpression') {
- validation.source = translate('{label} must not contain whitespace', { label: values.sourceLabel });
- }
- }
- return validation;
- },
- hidden: function(element, node) {
- var selectedMapping = getSelected(element, node);
- return !selectedMapping || (selectedMapping && selectedMapping.variables);
- }
- }));
- group.entries.push(entryFactory.textField({
- id: 'variableMapping-target',
- label: translate('Target'),
- modelProperty: 'target',
- get: function(element, node) {
- return {
- target: (getSelected(element, node) || {}).target
- };
- },
- set: function(element, values, node) {
- values.target = values.target || undefined;
- var mapping = getSelected(element, node);
- return cmdHelper.updateBusinessObject(element, mapping, values);
- },
- validate: function(element, values, node) {
- var mapping = getSelected(element, node);
- var validation = {};
- if (mapping) {
- var mappingType = getInOutType(mapping);
- if (!values.target && mappingType !== 'variables') {
- validation.target = translate('Mapping must have a target');
- }
- if (values.target
- && WHITESPACE_REGEX.test(values.target)
- && mappingType !== 'variables') {
- validation.target = translate('Target must not contain whitespace');
- }
- }
- return validation;
- },
- hidden: function(element, node) {
- var selectedMapping = getSelected(element, node);
- return !selectedMapping || (selectedMapping && selectedMapping.variables);
- }
- }));
- group.entries.push(entryFactory.checkbox({
- id: 'variableMapping-local',
- label: translate('Local'),
- modelProperty: 'local',
- get: function(element, node) {
- return {
- local: (getSelected(element, node) || {}).local
- };
- },
- set: function(element, values, node) {
- values.local = values.local || false;
- var mapping = getSelected(element, node);
- return cmdHelper.updateBusinessObject(element, mapping, values);
- },
- hidden: function(element, node) {
- return !isSelected(element, node);
- }
- }));
- };
|