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