Callable.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625
  1. 'use strict';
  2. var cmdHelper = require('../../../../helper/CmdHelper'),
  3. entryFactory = require('../../../../factory/EntryFactory'),
  4. elementHelper = require('../../../../helper/ElementHelper'),
  5. extensionElementsHelper = require('../../../../helper/ExtensionElementsHelper');
  6. var resultVariable = require('./ResultVariable');
  7. var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject;
  8. var is = require('bpmn-js/lib/util/ModelUtil').is;
  9. var forEach = require('lodash/forEach');
  10. var attributeInfo = {
  11. bpmn: {
  12. element: 'calledElement',
  13. binding: 'activiti:calledElementBinding',
  14. version: 'activiti:calledElementVersion',
  15. versionTag: 'activiti:calledElementVersionTag',
  16. tenantId: 'activiti:calledElementTenantId'
  17. },
  18. cmmn: {
  19. element: 'activiti:caseRef',
  20. binding: 'activiti:caseBinding',
  21. version: 'activiti:caseVersion',
  22. tenantId: 'activiti:caseTenantId'
  23. },
  24. dmn: {
  25. element: 'activiti:decisionRef',
  26. binding: 'activiti:decisionRefBinding',
  27. version: 'activiti:decisionRefVersion',
  28. versionTag: 'activiti:decisionRefVersionTag',
  29. tenantId: 'activiti:decisionRefTenantId'
  30. }
  31. };
  32. var mapDecisionResultOptions = [
  33. {
  34. name: 'singleEntry (TypedValue)',
  35. value: 'singleEntry'
  36. },
  37. {
  38. name:'singleResult (Map<String, Object>)',
  39. value:'singleResult'
  40. },
  41. {
  42. name:'collectEntries (List<Object>)',
  43. value:'collectEntries'
  44. },
  45. {
  46. name:'resultList (List<Map<String, Object>>)',
  47. value:'resultList'
  48. }
  49. ];
  50. var delegateVariableMappingOptions = [
  51. {
  52. name: 'variableMappingClass',
  53. value: 'variableMappingClass'
  54. },
  55. {
  56. name: 'variableMappingDelegateExpression',
  57. value: 'variableMappingDelegateExpression'
  58. }
  59. ];
  60. function getActivitiInWithBusinessKey(element) {
  61. var activitiIn = [],
  62. bo = getBusinessObject(element);
  63. var activitiInParams = extensionElementsHelper.getExtensionElements(bo, 'activiti:In');
  64. if (activitiInParams) {
  65. forEach(activitiInParams, function(param) {
  66. if (param.businessKey !== undefined) {
  67. activitiIn.push(param);
  68. }
  69. });
  70. }
  71. return activitiIn;
  72. }
  73. function setBusinessKey(element, text, bpmnFactory) {
  74. var commands = [];
  75. var activitiInWithBusinessKey = getActivitiInWithBusinessKey(element);
  76. if (activitiInWithBusinessKey.length) {
  77. commands.push(cmdHelper.updateBusinessObject(element, activitiInWithBusinessKey[0], {
  78. businessKey: text
  79. }));
  80. } else {
  81. var bo = getBusinessObject(element),
  82. extensionElements = bo.extensionElements;
  83. if (!extensionElements) {
  84. extensionElements = elementHelper.createElement('bpmn:ExtensionElements', { values: [] }, bo, bpmnFactory);
  85. commands.push(cmdHelper.updateProperties(element, { extensionElements: extensionElements }));
  86. }
  87. var activitiIn = elementHelper.createElement(
  88. 'activiti:In',
  89. { 'businessKey': text },
  90. extensionElements,
  91. bpmnFactory
  92. );
  93. commands.push(cmdHelper.addAndRemoveElementsFromList(
  94. element,
  95. extensionElements,
  96. 'values',
  97. 'extensionElements',
  98. [ activitiIn ],[]
  99. ));
  100. }
  101. return commands;
  102. }
  103. function deleteBusinessKey(element) {
  104. var activitiInExtensions = getActivitiInWithBusinessKey(element);
  105. var commands = [];
  106. forEach(activitiInExtensions, function(elem) {
  107. commands.push(extensionElementsHelper.removeEntry(getBusinessObject(element), element, elem));
  108. });
  109. return commands;
  110. }
  111. function isSupportedCallableType(type) {
  112. return [ 'bpmn', 'cmmn', 'dmn' ].indexOf(type) !== -1;
  113. }
  114. module.exports = function(element, bpmnFactory, options, translate) {
  115. var bindingOptions = [
  116. {
  117. name: translate('latest'),
  118. value: 'latest'
  119. },
  120. {
  121. name: translate('deployment'),
  122. value: 'deployment'
  123. },
  124. {
  125. name: translate('version'),
  126. value: 'version'
  127. },
  128. {
  129. name: translate('versionTag'),
  130. value: 'versionTag'
  131. }
  132. ];
  133. var getCallableType = options.getCallableType;
  134. var entries = [];
  135. function getAttribute(element, prop) {
  136. var type = getCallableType(element);
  137. return (attributeInfo[type] || {})[prop];
  138. }
  139. function getCallActivityBindingValue(element) {
  140. var type = getCallableType(element);
  141. var bo = getBusinessObject(element);
  142. var attr = (attributeInfo[type] || {}).binding;
  143. return bo.get(attr);
  144. }
  145. function getDelegateVariableMappingType(element) {
  146. var bo = getBusinessObject(element);
  147. var boVariableMappingClass = bo.get('activiti:variableMappingClass'),
  148. boVariableMappingDelegateExpression = bo.get('activiti:variableMappingDelegateExpression');
  149. var delegateVariableMappingType = '';
  150. if (typeof boVariableMappingClass !== 'undefined') {
  151. delegateVariableMappingType = 'variableMappingClass';
  152. } else
  153. if (typeof boVariableMappingDelegateExpression !== 'undefined') {
  154. delegateVariableMappingType = 'variableMappingDelegateExpression';
  155. }
  156. return delegateVariableMappingType;
  157. }
  158. entries.push(entryFactory.textField({
  159. id: 'callable-element-ref',
  160. dataValueLabel: 'callableElementLabel',
  161. modelProperty: 'callableElementRef',
  162. get: function(element, node) {
  163. var callableElementRef;
  164. var attr = getAttribute(element, 'element');
  165. if (attr) {
  166. var bo = getBusinessObject(element);
  167. callableElementRef = bo.get(attr);
  168. }
  169. var label = '';
  170. var type = getCallableType(element);
  171. if (type === 'bpmn') {
  172. label = translate('Called Element');
  173. }
  174. else if (type === 'cmmn') {
  175. label = translate('Case Ref');
  176. }
  177. else if (type === 'dmn') {
  178. label = translate('Decision Ref');
  179. }
  180. return {
  181. callableElementRef: callableElementRef,
  182. callableElementLabel: label
  183. };
  184. },
  185. set: function(element, values, node) {
  186. var newCallableElementRef = values.callableElementRef;
  187. var attr = getAttribute(element, 'element');
  188. var props = {};
  189. props[attr] = newCallableElementRef || '';
  190. return cmdHelper.updateProperties(element, props);
  191. },
  192. validate: function(element, values, node) {
  193. var elementRef = values.callableElementRef;
  194. var type = getCallableType(element);
  195. return isSupportedCallableType(type) && !elementRef ? { callableElementRef: translate('Must provide a value') } : {};
  196. },
  197. hidden: function(element, node) {
  198. return !isSupportedCallableType(getCallableType(element));
  199. }
  200. }));
  201. entries.push(entryFactory.selectBox({
  202. id: 'callable-binding',
  203. label: translate('Binding'),
  204. selectOptions: function(element) {
  205. var type = getCallableType(element);
  206. var options;
  207. if (type === 'cmmn') {
  208. options = bindingOptions.filter(function(bindingOption) {
  209. return bindingOption.value !== 'versionTag';
  210. });
  211. } else {
  212. options = bindingOptions;
  213. }
  214. return options;
  215. },
  216. modelProperty: 'callableBinding',
  217. get: function(element, node) {
  218. var callableBinding;
  219. var attr = getAttribute(element, 'binding');
  220. if (attr) {
  221. var bo = getBusinessObject(element);
  222. callableBinding = bo.get(attr) || 'latest';
  223. }
  224. return {
  225. callableBinding: callableBinding
  226. };
  227. },
  228. set: function(element, values, node) {
  229. var binding = values.callableBinding;
  230. var attr = getAttribute(element, 'binding'),
  231. attrVer = getAttribute(element, 'version'),
  232. attrVerTag = getAttribute(element, 'versionTag');
  233. var props = {};
  234. props[attr] = binding;
  235. // set version and versionTag values always to undefined to delete the existing value
  236. props[attrVer] = undefined;
  237. props[attrVerTag] = undefined;
  238. return cmdHelper.updateProperties(element, props);
  239. },
  240. hidden: function(element, node) {
  241. return !isSupportedCallableType(getCallableType(element));
  242. }
  243. }));
  244. entries.push(entryFactory.textField({
  245. id: 'callable-version',
  246. label: translate('Version'),
  247. modelProperty: 'callableVersion',
  248. get: function(element, node) {
  249. var callableVersion;
  250. var attr = getAttribute(element, 'version');
  251. if (attr) {
  252. var bo = getBusinessObject(element);
  253. callableVersion = bo.get(attr);
  254. }
  255. return {
  256. callableVersion: callableVersion
  257. };
  258. },
  259. set: function(element, values, node) {
  260. var version = values.callableVersion;
  261. var attr = getAttribute(element, 'version');
  262. var props = {};
  263. props[attr] = version || undefined;
  264. return cmdHelper.updateProperties(element, props);
  265. },
  266. validate: function(element, values, node) {
  267. var version = values.callableVersion;
  268. var type = getCallableType(element);
  269. return (
  270. isSupportedCallableType(type) &&
  271. getCallActivityBindingValue(element) === 'version' && (
  272. !version ? { callableVersion: translate('Must provide a value') } : {}
  273. )
  274. );
  275. },
  276. hidden: function(element, node) {
  277. var type = getCallableType(element);
  278. return !isSupportedCallableType(type) || getCallActivityBindingValue(element) !== 'version';
  279. }
  280. }));
  281. entries.push(entryFactory.textField({
  282. id: 'callable-version-tag',
  283. label: translate('Version Tag'),
  284. modelProperty: 'versionTag',
  285. get: function(element, node) {
  286. var versionTag;
  287. var attr = getAttribute(element, 'versionTag');
  288. if (attr) {
  289. var bo = getBusinessObject(element);
  290. versionTag = bo.get(attr);
  291. }
  292. return {
  293. versionTag: versionTag
  294. };
  295. },
  296. set: function(element, values, node) {
  297. var versionTag = values.versionTag;
  298. var attr = getAttribute(element, 'versionTag');
  299. var props = {};
  300. props[attr] = versionTag || undefined;
  301. return cmdHelper.updateProperties(element, props);
  302. },
  303. validate: function(element, values, node) {
  304. var versionTag = values.versionTag;
  305. var type = getCallableType(element);
  306. return (
  307. isSupportedCallableType(type) &&
  308. getCallActivityBindingValue(element) === 'versionTag' && (
  309. !versionTag ? { versionTag: translate('Must provide a value') } : {}
  310. )
  311. );
  312. },
  313. hidden: function(element, node) {
  314. var type = getCallableType(element);
  315. return !isSupportedCallableType(type) || getCallActivityBindingValue(element) !== 'versionTag';
  316. }
  317. }));
  318. entries.push(entryFactory.textField({
  319. id: 'tenant-id',
  320. label: translate('Tenant Id'),
  321. modelProperty: 'tenantId',
  322. get: function(element, node) {
  323. var tenantId;
  324. var attr = getAttribute(element, 'tenantId');
  325. if (attr) {
  326. var bo = getBusinessObject(element);
  327. tenantId = bo.get(attr);
  328. }
  329. return {
  330. tenantId: tenantId
  331. };
  332. },
  333. set: function(element, values, node) {
  334. var tenantId = values.tenantId;
  335. var attr = getAttribute(element, 'tenantId');
  336. var props = {};
  337. props[attr] = tenantId || undefined;
  338. return cmdHelper.updateProperties(element, props);
  339. },
  340. hidden: function(element, node) {
  341. var type = getCallableType(element);
  342. return !isSupportedCallableType(type);
  343. }
  344. }));
  345. if (is(getBusinessObject(element), 'bpmn:CallActivity')) {
  346. entries.push(entryFactory.checkbox({
  347. id: 'callable-business-key',
  348. label: translate('Business Key'),
  349. modelProperty: 'callableBusinessKey',
  350. get: function(element, node) {
  351. var activitiIn = getActivitiInWithBusinessKey(element);
  352. return {
  353. callableBusinessKey: !!(activitiIn && activitiIn.length > 0)
  354. };
  355. },
  356. set: function(element, values, node) {
  357. if (values.callableBusinessKey) {
  358. return setBusinessKey(element, '#{execution.processBusinessKey}', bpmnFactory);
  359. } else {
  360. return deleteBusinessKey(element);
  361. }
  362. }
  363. }));
  364. }
  365. entries.push(entryFactory.textField({
  366. id: 'business-key-expression',
  367. label: translate('Business Key Expression'),
  368. modelProperty: 'businessKey',
  369. get: function(element, node) {
  370. var activitiInWithBusinessKey = getActivitiInWithBusinessKey(element);
  371. return {
  372. businessKey: (
  373. activitiInWithBusinessKey.length ?
  374. activitiInWithBusinessKey[0].get('activiti:businessKey') :
  375. undefined
  376. )
  377. };
  378. },
  379. set: function(element, values, node) {
  380. var businessKey = values.businessKey;
  381. return setBusinessKey(element, businessKey, bpmnFactory);
  382. },
  383. validate: function(element, values, node) {
  384. var businessKey = values.businessKey;
  385. return businessKey === '' ? { businessKey: translate('Must provide a value') } : {};
  386. },
  387. hidden: function(element, node) {
  388. return !getActivitiInWithBusinessKey(element).length;
  389. }
  390. }));
  391. entries = entries.concat(resultVariable(element, bpmnFactory, {
  392. id: 'dmn-resultVariable',
  393. getBusinessObject: getBusinessObject,
  394. getImplementationType: getCallableType,
  395. hideResultVariable: function(element, node) {
  396. return getCallableType(element) !== 'dmn';
  397. }
  398. }, translate));
  399. entries.push(entryFactory.selectBox({
  400. id: 'dmn-map-decision-result',
  401. label: translate('Map Decision Result'),
  402. selectOptions: mapDecisionResultOptions,
  403. modelProperty: 'mapDecisionResult',
  404. get: function(element, node) {
  405. var bo = getBusinessObject(element);
  406. return {
  407. mapDecisionResult: bo.get('activiti:mapDecisionResult') || 'resultList'
  408. };
  409. },
  410. set: function(element, values, node) {
  411. return cmdHelper.updateProperties(element, {
  412. 'activiti:mapDecisionResult': values.mapDecisionResult || 'resultList'
  413. });
  414. },
  415. hidden: function(element, node) {
  416. var bo = getBusinessObject(element);
  417. var resultVariable = bo.get('activiti:resultVariable');
  418. return !(getCallableType(element) === 'dmn' && typeof resultVariable !== 'undefined');
  419. }
  420. }));
  421. entries.push(entryFactory.selectBox({
  422. id: 'delegateVariableMappingType',
  423. label: translate('Delegate Variable Mapping'),
  424. selectOptions: delegateVariableMappingOptions,
  425. emptyParameter: true,
  426. modelProperty: 'delegateVariableMappingType',
  427. get: function(element, node) {
  428. return {
  429. delegateVariableMappingType : getDelegateVariableMappingType(element)
  430. };
  431. },
  432. set: function(element, values, node) {
  433. var delegateVariableMappingType = values.delegateVariableMappingType;
  434. var props = {
  435. 'activiti:variableMappingClass' : undefined,
  436. 'activiti:variableMappingDelegateExpression' : undefined
  437. };
  438. if (delegateVariableMappingType === 'variableMappingClass') {
  439. props['activiti:variableMappingClass'] = '';
  440. }
  441. else if (delegateVariableMappingType === 'variableMappingDelegateExpression') {
  442. props['activiti:variableMappingDelegateExpression'] = '';
  443. }
  444. return cmdHelper.updateProperties(element, props);
  445. },
  446. hidden: function(element, node) {
  447. return (getCallableType(element) !== 'bpmn');
  448. }
  449. }));
  450. entries.push(entryFactory.textField({
  451. id: 'delegateVariableMapping',
  452. dataValueLabel: 'delegateVariableMappingLabel',
  453. modelProperty: 'delegateVariableMapping',
  454. get: function(element, node) {
  455. var bo = getBusinessObject(element);
  456. var label = '';
  457. var delegateVariableMapping = undefined;
  458. var type = getDelegateVariableMappingType(element);
  459. if (type === 'variableMappingClass') {
  460. label = translate('Class');
  461. delegateVariableMapping = bo.get('activiti:variableMappingClass');
  462. }
  463. else if (type === 'variableMappingDelegateExpression') {
  464. label = translate('Delegate Expression');
  465. delegateVariableMapping = bo.get('activiti:variableMappingDelegateExpression');
  466. }
  467. return {
  468. delegateVariableMapping: delegateVariableMapping,
  469. delegateVariableMappingLabel: label
  470. };
  471. },
  472. set: function(element, values, node) {
  473. var delegateVariableMapping = values.delegateVariableMapping;
  474. var attr = 'activiti:' + getDelegateVariableMappingType(element);
  475. var props = {};
  476. props[attr] = delegateVariableMapping || undefined;
  477. return cmdHelper.updateProperties(element, props);
  478. },
  479. validate: function(element, values, node) {
  480. var delegateVariableMapping = values.delegateVariableMapping;
  481. return (
  482. getCallableType(element) === 'bpmn' && (
  483. !delegateVariableMapping ? { delegateVariableMapping: translate('Must provide a value') } : {}
  484. )
  485. );
  486. },
  487. hidden: function(element, node) {
  488. return !(getCallableType(element) === 'bpmn' && getDelegateVariableMappingType(element) !== '');
  489. }
  490. }));
  491. return entries;
  492. };