ActivitiPropertiesProvider.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542
  1. 'use strict';
  2. var inherits = require('inherits');
  3. var PropertiesActivator = require('../../PropertiesActivator');
  4. var asyncCapableHelper = require('../../helper/AsyncCapableHelper'),
  5. ImplementationTypeHelper = require('../../helper/ImplementationTypeHelper');
  6. var is = require('bpmn-js/lib/util/ModelUtil').is;
  7. // bpmn properties
  8. var processProps = require('../../provider/bpmn/parts/ProcessProps'),
  9. eventProps = require('../../provider/bpmn/parts/EventProps'),
  10. linkProps = require('../../provider/bpmn/parts/LinkProps'),
  11. documentationProps = require('../../provider/bpmn/parts/DocumentationProps'),
  12. idProps = require('../../provider/bpmn/parts/IdProps'),
  13. nameProps = require('../../provider/bpmn/parts/NameProps'),
  14. executableProps = require('../../provider/bpmn/parts/ExecutableProps');
  15. // activiti properties
  16. var serviceTaskDelegateProps = require('./parts/ServiceTaskDelegateProps'),
  17. userTaskProps = require('./parts/UserTaskProps'),
  18. asynchronousContinuationProps = require('./parts/AsynchronousContinuationProps'),
  19. callActivityProps = require('./parts/CallActivityProps'),
  20. multiInstanceProps = require('./parts/MultiInstanceLoopProps'),
  21. conditionalProps = require('./parts/ConditionalProps'),
  22. scriptProps = require('./parts/ScriptTaskProps'),
  23. errorProps = require('./parts/ErrorEventProps'),
  24. formProps = require('./parts/FormProps'),
  25. startEventInitiator = require('./parts/StartEventInitiator'),
  26. variableMapping = require('./parts/VariableMappingProps'),
  27. versionTag = require('./parts/VersionTagProps');
  28. var listenerProps = require('./parts/ListenerProps'),
  29. listenerDetails = require('./parts/ListenerDetailProps'),
  30. listenerFields = require('./parts/ListenerFieldInjectionProps');
  31. var elementTemplateChooserProps = require('./element-templates/parts/ChooserProps'),
  32. elementTemplateCustomProps = require('./element-templates/parts/CustomProps');
  33. // Input/Output
  34. var inputOutput = require('./parts/InputOutputProps'),
  35. inputOutputParameter = require('./parts/InputOutputParameterProps');
  36. // Connector
  37. var connectorDetails = require('./parts/ConnectorDetailProps'),
  38. connectorInputOutput = require('./parts/ConnectorInputOutputProps'),
  39. connectorInputOutputParameter = require('./parts/ConnectorInputOutputParameterProps');
  40. // properties
  41. var properties = require('./parts/PropertiesProps');
  42. // job configuration
  43. var jobConfiguration = require('./parts/JobConfigurationProps');
  44. // history time to live
  45. var historyTimeToLive = require('./parts/HistoryTimeToLiveProps');
  46. // candidate starter groups/users
  47. var candidateStarter = require('./parts/CandidateStarterProps');
  48. // tasklist
  49. var tasklist = require('./parts/TasklistProps');
  50. // external task configuration
  51. var externalTaskConfiguration = require('./parts/ExternalTaskConfigurationProps');
  52. // field injection
  53. var fieldInjections = require('./parts/FieldInjectionProps');
  54. var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject,
  55. eventDefinitionHelper = require('../../helper/EventDefinitionHelper'),
  56. implementationTypeHelper = require('../../helper/ImplementationTypeHelper');
  57. // helpers ////////////////////////////////////////
  58. var isExternalTaskPriorityEnabled = function(element) {
  59. var businessObject = getBusinessObject(element);
  60. // show only if element is a process, a participant ...
  61. if (is(element, 'bpmn:Process') || is(element, 'bpmn:Participant') && businessObject.get('processRef')) {
  62. return true;
  63. }
  64. var externalBo = ImplementationTypeHelper.getServiceTaskLikeBusinessObject(element),
  65. isExternalTask = ImplementationTypeHelper.getImplementationType(externalBo) === 'external';
  66. // ... or an external task with selected external implementation type
  67. return !!ImplementationTypeHelper.isExternalCapable(externalBo) && isExternalTask;
  68. };
  69. var isJobConfigEnabled = function(element) {
  70. var businessObject = getBusinessObject(element);
  71. if (is(element, 'bpmn:Process') || is(element, 'bpmn:Participant') && businessObject.get('processRef')) {
  72. return true;
  73. }
  74. // async behavior
  75. var bo = getBusinessObject(element);
  76. if (asyncCapableHelper.isAsyncBefore(bo) || asyncCapableHelper.isAsyncAfter(bo)) {
  77. return true;
  78. }
  79. // timer definition
  80. if (is(element, 'bpmn:Event')) {
  81. return !!eventDefinitionHelper.getTimerEventDefinition(element);
  82. }
  83. return false;
  84. };
  85. var getInputOutputParameterLabel = function(param, translate) {
  86. if (is(param, 'activiti:InputParameter')) {
  87. return translate('Input Parameter');
  88. }
  89. if (is(param, 'activiti:OutputParameter')) {
  90. return translate('Output Parameter');
  91. }
  92. return '';
  93. };
  94. var getListenerLabel = function(param, translate) {
  95. if (is(param, 'activiti:ExecutionListener')) {
  96. return translate('Execution Listener');
  97. }
  98. if (is(param, 'activiti:TaskListener')) {
  99. return translate('Task Listener');
  100. }
  101. return '';
  102. };
  103. var PROCESS_KEY_HINT = 'This maps to the process definition key.';
  104. var TASK_KEY_HINT = 'This maps to the task definition key.';
  105. function createGeneralTabGroups(
  106. element, canvas, bpmnFactory,
  107. elementRegistry, elementTemplates, translate) {
  108. // refer to target element for external labels
  109. element = element.labelTarget || element;
  110. var generalGroup = {
  111. id: 'general',
  112. label: translate('General'),
  113. entries: []
  114. };
  115. var idOptions;
  116. var processOptions;
  117. if (is(element, 'bpmn:Process')) {
  118. idOptions = { description: PROCESS_KEY_HINT };
  119. }
  120. if (is(element, 'bpmn:UserTask')) {
  121. idOptions = { description: TASK_KEY_HINT };
  122. }
  123. if (is(element, 'bpmn:Participant')) {
  124. processOptions = { processIdDescription: PROCESS_KEY_HINT };
  125. }
  126. idProps(generalGroup, element, translate, idOptions);
  127. nameProps(generalGroup, element, bpmnFactory, canvas, translate);
  128. processProps(generalGroup, element, translate, processOptions);
  129. versionTag(generalGroup, element, translate);
  130. executableProps(generalGroup, element, translate);
  131. elementTemplateChooserProps(generalGroup, element, elementTemplates, translate);
  132. var customFieldsGroups = elementTemplateCustomProps(element, elementTemplates, bpmnFactory, translate);
  133. var detailsGroup = {
  134. id: 'details',
  135. label: translate('Details'),
  136. entries: []
  137. };
  138. serviceTaskDelegateProps(detailsGroup, element, bpmnFactory, translate);
  139. userTaskProps(detailsGroup, element, translate);
  140. scriptProps(detailsGroup, element, bpmnFactory, translate);
  141. linkProps(detailsGroup, element, translate);
  142. callActivityProps(detailsGroup, element, bpmnFactory, translate);
  143. eventProps(detailsGroup, element, bpmnFactory, elementRegistry, translate);
  144. errorProps(detailsGroup, element, bpmnFactory, translate);
  145. conditionalProps(detailsGroup, element, bpmnFactory, translate);
  146. startEventInitiator(detailsGroup, element, translate); // this must be the last element of the details group!
  147. var multiInstanceGroup = {
  148. id: 'multiInstance',
  149. label: translate('Multi Instance'),
  150. entries: []
  151. };
  152. multiInstanceProps(multiInstanceGroup, element, bpmnFactory, translate);
  153. var asyncGroup = {
  154. id : 'async',
  155. label: translate('Asynchronous Continuations'),
  156. entries : []
  157. };
  158. asynchronousContinuationProps(asyncGroup, element, bpmnFactory, translate);
  159. var jobConfigurationGroup = {
  160. id : 'jobConfiguration',
  161. label : translate('Job Configuration'),
  162. entries : [],
  163. enabled: isJobConfigEnabled
  164. };
  165. jobConfiguration(jobConfigurationGroup, element, bpmnFactory, translate);
  166. var externalTaskGroup = {
  167. id : 'externalTaskConfiguration',
  168. label : translate('External Task Configuration'),
  169. entries : [],
  170. enabled: isExternalTaskPriorityEnabled
  171. };
  172. externalTaskConfiguration(externalTaskGroup, element, bpmnFactory, translate);
  173. var candidateStarterGroup = {
  174. id: 'candidateStarterConfiguration',
  175. label: translate('Candidate Starter Configuration'),
  176. entries: []
  177. };
  178. candidateStarter(candidateStarterGroup, element, bpmnFactory, translate);
  179. var historyTimeToLiveGroup = {
  180. id: 'historyConfiguration',
  181. label: translate('History Configuration'),
  182. entries: []
  183. };
  184. historyTimeToLive(historyTimeToLiveGroup, element, bpmnFactory, translate);
  185. var tasklistGroup = {
  186. id: 'tasklist',
  187. label: translate('Tasklist Configuration'),
  188. entries: []
  189. };
  190. tasklist(tasklistGroup, element, bpmnFactory, translate);
  191. var documentationGroup = {
  192. id: 'documentation',
  193. label: translate('Documentation'),
  194. entries: []
  195. };
  196. documentationProps(documentationGroup, element, bpmnFactory, translate);
  197. var groups = [];
  198. groups.push(generalGroup);
  199. customFieldsGroups.forEach(function(group) {
  200. groups.push(group);
  201. });
  202. groups.push(detailsGroup);
  203. groups.push(externalTaskGroup);
  204. groups.push(multiInstanceGroup);
  205. groups.push(asyncGroup);
  206. groups.push(jobConfigurationGroup);
  207. groups.push(candidateStarterGroup);
  208. groups.push(historyTimeToLiveGroup);
  209. groups.push(tasklistGroup);
  210. groups.push(documentationGroup);
  211. return groups;
  212. }
  213. function createVariablesTabGroups(element, bpmnFactory, elementRegistry, translate) {
  214. var variablesGroup = {
  215. id : 'variables',
  216. label : translate('Variables'),
  217. entries: []
  218. };
  219. variableMapping(variablesGroup, element, bpmnFactory, translate);
  220. return [
  221. variablesGroup
  222. ];
  223. }
  224. function createFormsTabGroups(element, bpmnFactory, elementRegistry, translate) {
  225. var formGroup = {
  226. id : 'forms',
  227. label : translate('Forms'),
  228. entries: []
  229. };
  230. formProps(formGroup, element, bpmnFactory, translate);
  231. return [
  232. formGroup
  233. ];
  234. }
  235. function createListenersTabGroups(element, bpmnFactory, elementRegistry, translate) {
  236. var listenersGroup = {
  237. id : 'listeners',
  238. label: translate('Listeners'),
  239. entries: []
  240. };
  241. var options = listenerProps(listenersGroup, element, bpmnFactory, translate);
  242. var listenerDetailsGroup = {
  243. id: 'listener-details',
  244. entries: [],
  245. enabled: function(element, node) {
  246. return options.getSelectedListener(element, node);
  247. },
  248. label: function(element, node) {
  249. var param = options.getSelectedListener(element, node);
  250. return getListenerLabel(param, translate);
  251. }
  252. };
  253. listenerDetails(listenerDetailsGroup, element, bpmnFactory, options, translate);
  254. var listenerFieldsGroup = {
  255. id: 'listener-fields',
  256. label: translate('Field Injection'),
  257. entries: [],
  258. enabled: function(element, node) {
  259. return options.getSelectedListener(element, node);
  260. }
  261. };
  262. listenerFields(listenerFieldsGroup, element, bpmnFactory, options, translate);
  263. return [
  264. listenersGroup,
  265. listenerDetailsGroup,
  266. listenerFieldsGroup
  267. ];
  268. }
  269. function createInputOutputTabGroups(element, bpmnFactory, elementRegistry, translate) {
  270. var inputOutputGroup = {
  271. id: 'input-output',
  272. label: translate('Parameters'),
  273. entries: []
  274. };
  275. var options = inputOutput(inputOutputGroup, element, bpmnFactory, translate);
  276. var inputOutputParameterGroup = {
  277. id: 'input-output-parameter',
  278. entries: [],
  279. enabled: function(element, node) {
  280. return options.getSelectedParameter(element, node);
  281. },
  282. label: function(element, node) {
  283. var param = options.getSelectedParameter(element, node);
  284. return getInputOutputParameterLabel(param, translate);
  285. }
  286. };
  287. inputOutputParameter(inputOutputParameterGroup, element, bpmnFactory, options, translate);
  288. return [
  289. inputOutputGroup,
  290. inputOutputParameterGroup
  291. ];
  292. }
  293. function createConnectorTabGroups(element, bpmnFactory, elementRegistry, translate) {
  294. var connectorDetailsGroup = {
  295. id: 'connector-details',
  296. label: translate('Details'),
  297. entries: []
  298. };
  299. connectorDetails(connectorDetailsGroup, element, bpmnFactory, translate);
  300. var connectorInputOutputGroup = {
  301. id: 'connector-input-output',
  302. label: translate('Input/Output'),
  303. entries: []
  304. };
  305. var options = connectorInputOutput(connectorInputOutputGroup, element, bpmnFactory, translate);
  306. var connectorInputOutputParameterGroup = {
  307. id: 'connector-input-output-parameter',
  308. entries: [],
  309. enabled: function(element, node) {
  310. return options.getSelectedParameter(element, node);
  311. },
  312. label: function(element, node) {
  313. var param = options.getSelectedParameter(element, node);
  314. return getInputOutputParameterLabel(param, translate);
  315. }
  316. };
  317. connectorInputOutputParameter(connectorInputOutputParameterGroup, element, bpmnFactory, options, translate);
  318. return [
  319. connectorDetailsGroup,
  320. connectorInputOutputGroup,
  321. connectorInputOutputParameterGroup
  322. ];
  323. }
  324. function createFieldInjectionsTabGroups(element, bpmnFactory, elementRegistry, translate) {
  325. var fieldGroup = {
  326. id: 'field-injections-properties',
  327. label: translate('Field Injections'),
  328. entries: []
  329. };
  330. fieldInjections(fieldGroup, element, bpmnFactory, translate);
  331. return [
  332. fieldGroup
  333. ];
  334. }
  335. function createExtensionElementsGroups(element, bpmnFactory, elementRegistry, translate) {
  336. var propertiesGroup = {
  337. id : 'extensionElements-properties',
  338. label: translate('Properties'),
  339. entries: []
  340. };
  341. properties(propertiesGroup, element, bpmnFactory, translate);
  342. return [
  343. propertiesGroup
  344. ];
  345. }
  346. // activiti Properties Provider /////////////////////////////////////
  347. /**
  348. * A properties provider for activiti related properties.
  349. *
  350. * @param {EventBus} eventBus
  351. * @param {Canvas} canvas
  352. * @param {BpmnFactory} bpmnFactory
  353. * @param {ElementRegistry} elementRegistry
  354. * @param {ElementTemplates} elementTemplates
  355. * @param {Translate} translate
  356. */
  357. function ActivitiPropertiesProvider(
  358. eventBus, canvas, bpmnFactory,
  359. elementRegistry, elementTemplates, translate) {
  360. PropertiesActivator.call(this, eventBus);
  361. this.getTabs = function(element) {
  362. var generalTab = {
  363. id: 'general',
  364. label: translate('General'),
  365. groups: createGeneralTabGroups(
  366. element, canvas, bpmnFactory,
  367. elementRegistry, elementTemplates, translate)
  368. };
  369. var variablesTab = {
  370. id: 'variables',
  371. label: translate('Variables'),
  372. groups: createVariablesTabGroups(element, bpmnFactory, elementRegistry, translate)
  373. };
  374. var formsTab = {
  375. id: 'forms',
  376. label: translate('Forms'),
  377. groups: createFormsTabGroups(element, bpmnFactory, elementRegistry, translate)
  378. };
  379. var listenersTab = {
  380. id: 'listeners',
  381. label: translate('Listeners'),
  382. groups: createListenersTabGroups(element, bpmnFactory, elementRegistry, translate),
  383. enabled: function(element) {
  384. return !eventDefinitionHelper.getLinkEventDefinition(element)
  385. || (!is(element, 'bpmn:IntermediateThrowEvent')
  386. && eventDefinitionHelper.getLinkEventDefinition(element));
  387. }
  388. };
  389. var inputOutputTab = {
  390. id: 'input-output',
  391. label: translate('Input/Output'),
  392. groups: createInputOutputTabGroups(element, bpmnFactory, elementRegistry, translate)
  393. };
  394. var connectorTab = {
  395. id: 'connector',
  396. label: translate('Connector'),
  397. groups: createConnectorTabGroups(element, bpmnFactory, elementRegistry, translate),
  398. enabled: function(element) {
  399. var bo = implementationTypeHelper.getServiceTaskLikeBusinessObject(element);
  400. return bo && implementationTypeHelper.getImplementationType(bo) === 'connector';
  401. }
  402. };
  403. var fieldInjectionsTab = {
  404. id: 'field-injections',
  405. label: translate('Field Injections'),
  406. groups: createFieldInjectionsTabGroups(element, bpmnFactory, elementRegistry, translate)
  407. };
  408. var extensionsTab = {
  409. id: 'extensionElements',
  410. label: translate('Extensions'),
  411. groups: createExtensionElementsGroups(element, bpmnFactory, elementRegistry, translate)
  412. };
  413. return [
  414. generalTab,
  415. variablesTab,
  416. connectorTab,
  417. formsTab,
  418. listenersTab,
  419. inputOutputTab,
  420. fieldInjectionsTab,
  421. extensionsTab
  422. ];
  423. };
  424. }
  425. ActivitiPropertiesProvider.$inject = [
  426. 'eventBus',
  427. 'canvas',
  428. 'bpmnFactory',
  429. 'elementRegistry',
  430. 'elementTemplates',
  431. 'translate'
  432. ];
  433. inherits(ActivitiPropertiesProvider, PropertiesActivator);
  434. module.exports = ActivitiPropertiesProvider;