Fix name convention issue
[sdc/sdc-workflow-designer.git] / sdc-workflow-designer-ui / src / main / frontend / src / features / version / composition / custom-properties-provider / provider / camunda / WorkflowPropertiesProvider.js
1 import inherits from 'inherits';
2 import CamundaPropertiesProvider from 'bpmn-js-properties-panel/lib/provider/camunda/CamundaPropertiesProvider';
3
4 import { is, getBusinessObject } from 'bpmn-js/lib/util/ModelUtil';
5
6 import asyncCapableHelper from 'bpmn-js-properties-panel/lib/helper/AsyncCapableHelper';
7 import eventDefinitionHelper from 'bpmn-js-properties-panel/lib/helper/EventDefinitionHelper';
8 import implementationTypeHelper from 'bpmn-js-properties-panel/lib/helper/ImplementationTypeHelper';
9
10 import idProps from 'bpmn-js-properties-panel/lib/provider/bpmn/parts/IdProps';
11 import nameProps from 'bpmn-js-properties-panel/lib/provider/bpmn/parts/NameProps';
12 import processProps from 'bpmn-js-properties-panel/lib/provider/bpmn/parts/ProcessProps';
13 import linkProps from 'bpmn-js-properties-panel/lib/provider/bpmn/parts/LinkProps';
14 import eventProps from 'bpmn-js-properties-panel/lib/provider/bpmn/parts/EventProps';
15 import documentationProps from 'bpmn-js-properties-panel/lib/provider/bpmn/parts/DocumentationProps';
16
17 import elementTemplateChooserProps from 'bpmn-js-properties-panel/lib/provider/camunda/element-templates/parts/ChooserProps';
18 import elementTemplateCustomProps from 'bpmn-js-properties-panel/lib/provider/camunda/element-templates/parts/CustomProps';
19
20 import versionTag from 'bpmn-js-properties-panel/lib/provider/camunda/parts/VersionTagProps';
21 import userTaskProps from 'bpmn-js-properties-panel/lib/provider/camunda/parts/UserTaskProps';
22 import scriptProps from 'bpmn-js-properties-panel/lib/provider/camunda/parts/ScriptTaskProps';
23 import callActivityProps from 'bpmn-js-properties-panel/lib/provider/camunda/parts/CallActivityProps';
24 import conditionalProps from 'bpmn-js-properties-panel/lib/provider/camunda/parts/ConditionalProps';
25 import startEventInitiator from 'bpmn-js-properties-panel/lib/provider/camunda/parts/StartEventInitiator';
26 import multiInstanceProps from 'bpmn-js-properties-panel/lib/provider/camunda/parts/MultiInstanceLoopProps';
27 import asynchronousContinuationProps from 'bpmn-js-properties-panel/lib/provider/camunda/parts/AsynchronousContinuationProps';
28 import jobConfiguration from 'bpmn-js-properties-panel/lib/provider/camunda/parts/JobConfigurationProps';
29 import externalTaskConfiguration from 'bpmn-js-properties-panel/lib/provider/camunda/parts/ExternalTaskConfigurationProps';
30 import candidateStarter from 'bpmn-js-properties-panel/lib/provider/camunda/parts/CandidateStarterProps';
31 import historyTimeToLive from 'bpmn-js-properties-panel/lib/provider/camunda/parts/HistoryTimeToLiveProps';
32
33 import createInputOutputTabGroups from './parts/createInputOutputTabGroups';
34 import workflowServiceTaskDelegateProps from './parts/WorkflowServiceTaskDelegateProps';
35
36 const PROCESS_KEY_HINT = 'This maps to the process definition key.';
37
38 const isExternalTaskPriorityEnabled = function(element) {
39     const businessObject = getBusinessObject(element);
40
41     // show only if element is a process, a participant ...
42     if (
43         is(element, 'bpmn:Process') ||
44         (is(element, 'bpmn:Participant') && businessObject.get('processRef'))
45     ) {
46         return true;
47     }
48
49     const externalBo = implementationTypeHelper.getServiceTaskLikeBusinessObject(
50             element
51         ),
52         isExternalTask =
53             implementationTypeHelper.getImplementationType(externalBo) ===
54             'external';
55
56     // ... or an external task with selected external implementation type
57     return (
58         !!implementationTypeHelper.isExternalCapable(externalBo) &&
59         isExternalTask
60     );
61 };
62
63 const isJobConfigEnabled = element => {
64     const businessObject = getBusinessObject(element);
65
66     if (
67         is(element, 'bpmn:Process') ||
68         (is(element, 'bpmn:Participant') && businessObject.get('processRef'))
69     ) {
70         return true;
71     }
72
73     // async behavior
74     const bo = getBusinessObject(element);
75     if (
76         asyncCapableHelper.isAsyncBefore(bo) ||
77         asyncCapableHelper.isAsyncAfter(bo)
78     ) {
79         return true;
80     }
81
82     // timer definition
83     if (is(element, 'bpmn:Event')) {
84         return !!eventDefinitionHelper.getTimerEventDefinition(element);
85     }
86
87     return false;
88 };
89
90 function createGeneralTabGroups(
91     element,
92     config,
93     bpmnFactory,
94     elementRegistry,
95     elementTemplates,
96     translate
97 ) {
98     // refer to target element for external labels
99     element = element.labelTarget || element;
100
101     const generalGroup = {
102         id: 'general',
103         label: translate('General'),
104         entries: []
105     };
106
107     let idOptions;
108     let processOptions;
109
110     if (is(element, 'bpmn:Process')) {
111         idOptions = { description: PROCESS_KEY_HINT };
112     }
113
114     if (is(element, 'bpmn:Participant')) {
115         processOptions = { processIdDescription: PROCESS_KEY_HINT };
116     }
117
118     idProps(generalGroup, element, translate, idOptions);
119     nameProps(generalGroup, element, translate);
120     processProps(generalGroup, element, translate, processOptions);
121     versionTag(generalGroup, element, translate);
122     elementTemplateChooserProps(
123         generalGroup,
124         element,
125         elementTemplates,
126         translate
127     );
128
129     const customFieldsGroups = elementTemplateCustomProps(
130         element,
131         elementTemplates,
132         bpmnFactory,
133         translate
134     );
135
136     const detailsGroup = {
137         id: 'details',
138         label: translate('Details'),
139         entries: []
140     };
141     workflowServiceTaskDelegateProps(
142         detailsGroup,
143         element,
144         config,
145         bpmnFactory,
146         translate
147     );
148     userTaskProps(detailsGroup, element, translate);
149     scriptProps(detailsGroup, element, bpmnFactory, translate);
150     linkProps(detailsGroup, element, translate);
151     callActivityProps(detailsGroup, element, bpmnFactory, translate);
152     eventProps(detailsGroup, element, bpmnFactory, elementRegistry, translate);
153     conditionalProps(detailsGroup, element, bpmnFactory, translate);
154     startEventInitiator(detailsGroup, element, translate); // this must be the last element of the details group!
155
156     const multiInstanceGroup = {
157         id: 'multiInstance',
158         label: translate('Multi Instance'),
159         entries: []
160     };
161     multiInstanceProps(multiInstanceGroup, element, bpmnFactory, translate);
162
163     const asyncGroup = {
164         id: 'async',
165         label: translate('Asynchronous Continuations'),
166         entries: []
167     };
168     asynchronousContinuationProps(asyncGroup, element, bpmnFactory, translate);
169
170     const jobConfigurationGroup = {
171         id: 'jobConfiguration',
172         label: translate('Job Configuration'),
173         entries: [],
174         enabled: isJobConfigEnabled
175     };
176     jobConfiguration(jobConfigurationGroup, element, bpmnFactory, translate);
177
178     const externalTaskGroup = {
179         id: 'externalTaskConfiguration',
180         label: translate('External Task Configuration'),
181         entries: [],
182         enabled: isExternalTaskPriorityEnabled
183     };
184     externalTaskConfiguration(
185         externalTaskGroup,
186         element,
187         bpmnFactory,
188         translate
189     );
190
191     const candidateStarterGroup = {
192         id: 'candidateStarterConfiguration',
193         label: translate('Candidate Starter Configuration'),
194         entries: []
195     };
196     candidateStarter(candidateStarterGroup, element, bpmnFactory, translate);
197
198     const historyTimeToLiveGroup = {
199         id: 'historyConfiguration',
200         label: translate('History Configuration'),
201         entries: []
202     };
203     historyTimeToLive(historyTimeToLiveGroup, element, bpmnFactory, translate);
204
205     const documentationGroup = {
206         id: 'documentation',
207         label: translate('Documentation'),
208         entries: []
209     };
210     documentationProps(documentationGroup, element, bpmnFactory, translate);
211
212     const groups = [];
213     groups.push(generalGroup);
214     customFieldsGroups.forEach(function(group) {
215         groups.push(group);
216     });
217     groups.push(detailsGroup);
218     groups.push(externalTaskGroup);
219     groups.push(multiInstanceGroup);
220     groups.push(asyncGroup);
221     groups.push(jobConfigurationGroup);
222     groups.push(candidateStarterGroup);
223     groups.push(historyTimeToLiveGroup);
224     groups.push(documentationGroup);
225
226     return groups;
227 }
228
229 function WorkflowPropertiesProvider(
230     config,
231     eventBus,
232     bpmnFactory,
233     elementRegistry,
234     elementTemplates,
235     translate
236 ) {
237     CamundaPropertiesProvider.call(
238         this,
239         eventBus,
240         bpmnFactory,
241         elementRegistry,
242         elementTemplates,
243         translate
244     );
245
246     this.getTabs = function(element) {
247         const camundaPropertiesProvider = new CamundaPropertiesProvider(
248             eventBus,
249             bpmnFactory,
250             elementRegistry,
251             elementTemplates,
252             translate
253         );
254
255         const tabs = camundaPropertiesProvider
256             .getTabs(element)
257             .filter(tab => tab.id !== 'general' && tab.id !== 'input-output');
258
259         const generalTab = {
260             id: 'general',
261             label: translate('General'),
262             groups: createGeneralTabGroups(
263                 element,
264                 config,
265                 bpmnFactory,
266                 elementRegistry,
267                 elementTemplates,
268                 translate
269             )
270         };
271
272         const inputOutputTab = {
273             id: 'input-output',
274             label: translate('Input/Output'),
275             groups: createInputOutputTabGroups(
276                 element,
277                 bpmnFactory,
278                 elementRegistry,
279                 translate,
280                 config
281             )
282         };
283         tabs.unshift(inputOutputTab);
284         tabs.unshift(generalTab);
285         return tabs;
286     };
287 }
288
289 WorkflowPropertiesProvider.$inject = [
290     'config.workflow',
291     'eventBus',
292     'bpmnFactory',
293     'elementRegistry',
294     'elementTemplates',
295     'translate'
296 ];
297
298 inherits(WorkflowPropertiesProvider, CamundaPropertiesProvider);
299
300 export default WorkflowPropertiesProvider;