Skip to content

Commit f9fc16e

Browse files
committed
feat: add execution listeners for Zeebe
Related to camunda/camunda-modeler#3951 deps: update to `[email protected]` deps: update to `[email protected]`
1 parent 53d561c commit f9fc16e

File tree

8 files changed

+1087
-17
lines changed

8 files changed

+1087
-17
lines changed

package-lock.json

Lines changed: 17 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@
7575
"bpmn-js": "^17.3.0",
7676
"bpmn-js-create-append-anything": "^0.5.1",
7777
"bpmn-moddle": "^9.0.1",
78-
"camunda-bpmn-js-behaviors": "^1.3.0",
78+
"camunda-bpmn-js-behaviors": "^1.4.0",
7979
"camunda-bpmn-moddle": "^7.0.1",
8080
"chai": "^4.4.1",
8181
"cross-env": "^7.0.3",
@@ -106,7 +106,7 @@
106106
"sinon": "^17.0.1",
107107
"sinon-chai": "^3.7.0",
108108
"webpack": "^5.92.1",
109-
"zeebe-bpmn-moddle": "^1.1.0"
109+
"zeebe-bpmn-moddle": "^1.2.0"
110110
},
111111
"peerDependencies": {
112112
"@bpmn-io/properties-panel": ">= 3.7",

src/provider/zeebe/ZeebePropertiesProvider.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
ConditionProps,
88
ErrorProps,
99
EscalationProps,
10+
ExecutionListenersProps,
1011
FormProps,
1112
HeaderProps,
1213
InputPropagationProps,
@@ -51,6 +52,7 @@ const ZEEBE_GROUPS = [
5152
OutputPropagationGroup,
5253
OutputGroup,
5354
HeaderGroup,
55+
ExecutionListenersGroup,
5456
ExtensionPropertiesGroup
5557
];
5658

@@ -299,6 +301,22 @@ function AssignmentDefinitionGroup(element, injector) {
299301
return group.entries.length ? group : null;
300302
}
301303

304+
function ExecutionListenersGroup(element, injector) {
305+
const translate = injector.get('translate');
306+
const group = {
307+
label: translate('Execution listeners'),
308+
id: 'Zeebe__ExecutionListeners',
309+
component: ListGroup,
310+
...ExecutionListenersProps({ element, injector })
311+
};
312+
313+
if (group.items) {
314+
return group;
315+
}
316+
317+
return null;
318+
}
319+
302320
function ExtensionPropertiesGroup(element, injector) {
303321
const translate = injector.get('translate');
304322
const group = {
Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
import { SelectEntry } from '@bpmn-io/properties-panel';
2+
3+
import {
4+
is,
5+
isAny
6+
} from 'bpmn-js/lib/util/ModelUtil';
7+
8+
import {
9+
useService
10+
} from '../../../hooks';
11+
12+
import {
13+
getErrorEventDefinition
14+
} from '../../../utils/EventDefinitionUtil';
15+
16+
import { FeelEntryWithVariableContext } from '../../../entries/FeelEntryWithContext';
17+
18+
19+
export const EVENT_TO_LABEL = {
20+
'start': 'Start',
21+
'end': 'End'
22+
};
23+
24+
export function ExecutionListenerEntries(props) {
25+
26+
const {
27+
element,
28+
idPrefix,
29+
listener
30+
} = props;
31+
32+
const eventTypes = getEventTypes(element);
33+
34+
const entries = eventTypes.length > 1 ? [
35+
{
36+
id: idPrefix + '-eventType',
37+
component: EventType,
38+
idPrefix,
39+
listener,
40+
eventTypes
41+
}
42+
] : [];
43+
44+
entries.push({
45+
id: idPrefix + '-listenerType',
46+
component: ListenerType,
47+
idPrefix,
48+
listener
49+
},
50+
{
51+
id: idPrefix + '-retries',
52+
component: Retries,
53+
idPrefix,
54+
listener
55+
});
56+
57+
return entries;
58+
}
59+
60+
function EventType(props) {
61+
const {
62+
idPrefix,
63+
element,
64+
listener,
65+
eventTypes
66+
} = props;
67+
68+
const modeling = useService('modeling');
69+
const translate = useService('translate');
70+
71+
const getOptions = () => {
72+
return eventTypes.map(eventType => ({
73+
value: eventType,
74+
label: translate(EVENT_TO_LABEL[eventType])
75+
}));
76+
};
77+
78+
const setValue = (value) => {
79+
modeling.updateModdleProperties(element, listener, {
80+
eventType: value
81+
});
82+
};
83+
84+
const getValue = () => {
85+
return listener.get('eventType');
86+
};
87+
88+
return SelectEntry({
89+
element,
90+
id: idPrefix + '-eventType',
91+
label: translate('Event type'),
92+
getValue,
93+
setValue,
94+
getOptions
95+
});
96+
}
97+
98+
function ListenerType(props) {
99+
const {
100+
idPrefix,
101+
element,
102+
listener
103+
} = props;
104+
105+
const modeling = useService('modeling');
106+
const translate = useService('translate');
107+
const debounce = useService('debounceInput');
108+
109+
const setValue = (value) => {
110+
modeling.updateModdleProperties(element, listener, {
111+
type: value
112+
});
113+
};
114+
115+
const getValue = () => {
116+
return listener.get('type');
117+
};
118+
119+
return FeelEntryWithVariableContext({
120+
element,
121+
id: idPrefix + '-listenerType',
122+
label: translate('Listener type'),
123+
getValue,
124+
setValue,
125+
debounce,
126+
feel: 'optional'
127+
});
128+
}
129+
130+
function Retries(props) {
131+
const {
132+
idPrefix,
133+
element,
134+
listener
135+
} = props;
136+
137+
const modeling = useService('modeling');
138+
const translate = useService('translate');
139+
const debounce = useService('debounceInput');
140+
141+
const setValue = (value) => {
142+
modeling.updateModdleProperties(element, listener, {
143+
retries: value
144+
});
145+
};
146+
147+
const getValue = () => {
148+
return listener.get('retries');
149+
};
150+
151+
return FeelEntryWithVariableContext({
152+
element,
153+
id: idPrefix + '-retries',
154+
label: translate('Retries'),
155+
getValue,
156+
setValue,
157+
debounce,
158+
feel: 'optional'
159+
});
160+
}
161+
162+
export function getEventTypes(element) {
163+
if (isAny(element, [ 'bpmn:BoundaryEvent', 'bpmn:StartEvent' ])) {
164+
return [ 'end' ];
165+
}
166+
167+
if (is(element, 'bpmn:EndEvent') && getErrorEventDefinition(element)) {
168+
return [ 'start' ];
169+
}
170+
171+
if (is(element, 'bpmn:Gateway')) {
172+
return [ 'start' ];
173+
}
174+
175+
return [ 'start', 'end' ];
176+
}

0 commit comments

Comments
 (0)