ChooserProps.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. 'use strict';
  2. var entryFactory = require('../../../../factory/EntryFactory'),
  3. is = require('bpmn-js/lib/util/ModelUtil').is,
  4. getTemplate = require('../Helper').getTemplate,
  5. getTemplateId = require('../Helper').getTemplateId;
  6. var find = require('lodash/find');
  7. var TEMPLATE_ATTR = require('../Helper').TEMPLATE_ATTR;
  8. function isAny(element, types) {
  9. return types.reduce(function(result, type) {
  10. return result || is(element, type);
  11. }, false);
  12. }
  13. module.exports = function(group, element, elementTemplates, translate) {
  14. var options = getTemplateOptions(element, elementTemplates, translate);
  15. if (options.length === 1 && !options[0].isDefault) {
  16. return;
  17. }
  18. // select element template (via dropdown)
  19. group.entries.push(entryFactory.selectBox({
  20. id: 'elementTemplate-chooser',
  21. label: translate('Element Template'),
  22. modelProperty: 'activiti:modelerTemplate',
  23. selectOptions: options,
  24. set: function(element, properties) {
  25. return applyTemplate(element, properties[TEMPLATE_ATTR], elementTemplates);
  26. },
  27. disabled: function() {
  28. var template = getTemplate(element, elementTemplates);
  29. return template && isDefaultTemplate(template);
  30. }
  31. }));
  32. };
  33. // helpers //////////////////////////////////////
  34. function applyTemplate(element, newTemplateId, elementTemplates) {
  35. // cleanup
  36. // clear input output mappings
  37. // undo changes to properties defined in template
  38. // re-establish
  39. // set input output mappings
  40. // apply changes to properties as defined in new template
  41. var oldTemplate = getTemplate(element, elementTemplates),
  42. newTemplate = elementTemplates.get(newTemplateId);
  43. if (oldTemplate === newTemplate) {
  44. return;
  45. }
  46. return {
  47. cmd: 'propertiesPanel.activiti.changeTemplate',
  48. context: {
  49. element: element,
  50. oldTemplate: oldTemplate,
  51. newTemplate: newTemplate
  52. }
  53. };
  54. }
  55. function getTemplateOptions(element, elementTemplates, translate) {
  56. var currentTemplateId = getTemplateId(element);
  57. var emptyOption = {
  58. name: '',
  59. value: ''
  60. };
  61. var allOptions = elementTemplates.getAll().reduce(function(templates, t) {
  62. if (!isAny(element, t.appliesTo)) {
  63. return templates;
  64. }
  65. return templates.concat({
  66. name: translate(t.name),
  67. value: t.id,
  68. isDefault: t.isDefault
  69. });
  70. }, [ emptyOption ]);
  71. var defaultOption = find(allOptions, function(option) {
  72. return isDefaultTemplate(option);
  73. });
  74. var currentOption = find(allOptions, function(option) {
  75. return option.value === currentTemplateId;
  76. });
  77. if (currentTemplateId && !currentOption) {
  78. currentOption = unknownTemplate(currentTemplateId, translate);
  79. allOptions.push(currentOption);
  80. }
  81. if (!defaultOption) {
  82. // return all options, including empty
  83. // and optionally unknownTemplate option
  84. return allOptions;
  85. }
  86. // special limited handling for
  87. // default options
  88. var options = [];
  89. // current template not set
  90. if (!currentTemplateId) {
  91. options.push({
  92. name: '',
  93. value: ''
  94. });
  95. }
  96. // current template not default
  97. if (currentOption && currentOption !== defaultOption) {
  98. options.push(currentOption);
  99. }
  100. options.push(defaultOption);
  101. // [ (empty), (current), defaultOption ]
  102. return options;
  103. }
  104. function unknownTemplate(templateId, translate) {
  105. return {
  106. name: translate('[unknown template: {templateId}]', { templateId: templateId }),
  107. value: templateId
  108. };
  109. }
  110. function isDefaultTemplate(elementTemplate) {
  111. return elementTemplate.isDefault;
  112. }