151 lines
3.5 KiB
JavaScript
151 lines
3.5 KiB
JavaScript
'use strict';
|
|
|
|
var entryFactory = require('../../../../factory/EntryFactory'),
|
|
is = require('bpmn-js/lib/util/ModelUtil').is,
|
|
getTemplate = require('../Helper').getTemplate,
|
|
getTemplateId = require('../Helper').getTemplateId;
|
|
|
|
var find = require('lodash/find');
|
|
|
|
var TEMPLATE_ATTR = require('../Helper').TEMPLATE_ATTR;
|
|
|
|
function isAny(element, types) {
|
|
return types.reduce(function(result, type) {
|
|
return result || is(element, type);
|
|
}, false);
|
|
}
|
|
|
|
|
|
module.exports = function(group, element, elementTemplates, translate) {
|
|
|
|
var options = getTemplateOptions(element, elementTemplates, translate);
|
|
|
|
if (options.length === 1 && !options[0].isDefault) {
|
|
return;
|
|
}
|
|
|
|
// select element template (via dropdown)
|
|
group.entries.push(entryFactory.selectBox({
|
|
id: 'elementTemplate-chooser',
|
|
label: translate('Element Template'),
|
|
modelProperty: 'activiti:modelerTemplate',
|
|
selectOptions: options,
|
|
set: function(element, properties) {
|
|
return applyTemplate(element, properties[TEMPLATE_ATTR], elementTemplates);
|
|
},
|
|
disabled: function() {
|
|
var template = getTemplate(element, elementTemplates);
|
|
|
|
return template && isDefaultTemplate(template);
|
|
}
|
|
}));
|
|
|
|
};
|
|
|
|
|
|
// helpers //////////////////////////////////////
|
|
|
|
function applyTemplate(element, newTemplateId, elementTemplates) {
|
|
|
|
// cleanup
|
|
// clear input output mappings
|
|
// undo changes to properties defined in template
|
|
|
|
// re-establish
|
|
// set input output mappings
|
|
// apply changes to properties as defined in new template
|
|
|
|
var oldTemplate = getTemplate(element, elementTemplates),
|
|
newTemplate = elementTemplates.get(newTemplateId);
|
|
|
|
if (oldTemplate === newTemplate) {
|
|
return;
|
|
}
|
|
|
|
return {
|
|
cmd: 'propertiesPanel.activiti.changeTemplate',
|
|
context: {
|
|
element: element,
|
|
oldTemplate: oldTemplate,
|
|
newTemplate: newTemplate
|
|
}
|
|
};
|
|
}
|
|
|
|
function getTemplateOptions(element, elementTemplates, translate) {
|
|
|
|
var currentTemplateId = getTemplateId(element);
|
|
|
|
var emptyOption = {
|
|
name: '',
|
|
value: ''
|
|
};
|
|
|
|
var allOptions = elementTemplates.getAll().reduce(function(templates, t) {
|
|
if (!isAny(element, t.appliesTo)) {
|
|
return templates;
|
|
}
|
|
|
|
return templates.concat({
|
|
name: translate(t.name),
|
|
value: t.id,
|
|
isDefault: t.isDefault
|
|
});
|
|
}, [ emptyOption ]);
|
|
|
|
|
|
var defaultOption = find(allOptions, function(option) {
|
|
return isDefaultTemplate(option);
|
|
});
|
|
|
|
var currentOption = find(allOptions, function(option) {
|
|
return option.value === currentTemplateId;
|
|
});
|
|
|
|
if (currentTemplateId && !currentOption) {
|
|
currentOption = unknownTemplate(currentTemplateId, translate);
|
|
|
|
allOptions.push(currentOption);
|
|
}
|
|
|
|
if (!defaultOption) {
|
|
|
|
// return all options, including empty
|
|
// and optionally unknownTemplate option
|
|
return allOptions;
|
|
}
|
|
|
|
// special limited handling for
|
|
// default options
|
|
|
|
var options = [];
|
|
|
|
// current template not set
|
|
if (!currentTemplateId) {
|
|
options.push({
|
|
name: '',
|
|
value: ''
|
|
});
|
|
}
|
|
|
|
// current template not default
|
|
if (currentOption && currentOption !== defaultOption) {
|
|
options.push(currentOption);
|
|
}
|
|
|
|
options.push(defaultOption);
|
|
|
|
// [ (empty), (current), defaultOption ]
|
|
return options;
|
|
}
|
|
|
|
function unknownTemplate(templateId, translate) {
|
|
return {
|
|
name: translate('[unknown template: {templateId}]', { templateId: templateId }),
|
|
value: templateId
|
|
};
|
|
}
|
|
|
|
function isDefaultTemplate(elementTemplate) {
|
|
return elementTemplate.isDefault;
|
|
} |