ruoyi-vue-nocode/ruoyi-ui/ruoyi-bpmnjs/resources/properties-panel/provider/activiti/element-templates/parts/ChooserProps.js

151 lines
3.5 KiB
JavaScript
Raw Normal View History

2022-08-11 16:10:41 +08:00
'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;
}