Skip to content

Commit 0aff679

Browse files
philippfrommenikku
authored andcommitted
feat(zeebe): add _Version tag_ field to processes
Closes #1062 Related to camunda/camunda-modeler#4453
1 parent 7eaf321 commit 0aff679

File tree

7 files changed

+490
-2
lines changed

7 files changed

+490
-2
lines changed

src/contextProvider/zeebe/TooltipProvider.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,18 @@ const TooltipProvider = {
296296
</div>
297297
);
298298
},
299+
'versionTag': (element) => {
300+
301+
const translate = useService('translate');
302+
303+
return (
304+
<div>
305+
<p>
306+
{ translate('Specifying a version tag will allow you to reference this process in another process.') }
307+
</p>
308+
</div>
309+
);
310+
},
299311
'priorityDefinitionPriority': (element) => {
300312

301313
const translate = useService('translate');

src/provider/zeebe/ZeebePropertiesProvider.js

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { Group, ListGroup } from '@bpmn-io/properties-panel';
22

3+
import { findIndex } from 'min-dash';
4+
35
import {
46
AssignmentDefinitionProps,
57
BusinessRuleImplementationProps,
@@ -24,7 +26,8 @@ import {
2426
TaskDefinitionProps,
2527
TaskScheduleProps,
2628
TimerProps,
27-
UserTaskImplementationProps
29+
UserTaskImplementationProps,
30+
VersionTagProps
2831
} from './properties';
2932

3033
import { ExtensionPropertiesProps } from '../shared/ExtensionPropertiesProps';
@@ -72,6 +75,7 @@ export default class ZeebePropertiesProvider {
7275
groups = groups.concat(this._getGroups(element));
7376

7477
// (2) update existing groups with zeebe specific properties
78+
updateGeneralGroup(groups, element);
7579
updateErrorGroup(groups, element);
7680
updateEscalationGroup(groups, element);
7781
updateMessageGroup(groups, element);
@@ -335,6 +339,22 @@ function ExtensionPropertiesGroup(element, injector) {
335339
return null;
336340
}
337341

342+
function updateGeneralGroup(groups, element) {
343+
344+
const generalGroup = findGroup(groups, 'general');
345+
346+
if (!generalGroup) {
347+
return;
348+
}
349+
350+
const { entries } = generalGroup;
351+
352+
const executableEntry = findIndex(entries, (entry) => entry.id === 'isExecutable');
353+
const insertIndex = executableEntry >= 0 ? executableEntry : entries.length;
354+
355+
entries.splice(insertIndex, 0, ...VersionTagProps({ element }));
356+
}
357+
338358
function updateErrorGroup(groups, element) {
339359
const errorGroup = findGroup(groups, 'error');
340360

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
import {
2+
getBusinessObject,
3+
is
4+
} from 'bpmn-js/lib/util/ModelUtil';
5+
6+
import { TextFieldEntry, isTextFieldEntryEdited } from '@bpmn-io/properties-panel';
7+
8+
import {
9+
useService
10+
} from '../../../hooks';
11+
12+
import { createElement } from '../../../utils/ElementUtil';
13+
14+
import { getExtensionElementsList } from '../../../utils/ExtensionElementsUtil';
15+
16+
17+
export function VersionTagProps(props) {
18+
const {
19+
element
20+
} = props;
21+
22+
const businessObject = getBusinessObject(element);
23+
24+
if (!is(element, 'bpmn:Process') &&
25+
!(is(element, 'bpmn:Participant') && businessObject.get('processRef'))) {
26+
return [];
27+
}
28+
29+
return [
30+
{
31+
id: 'versionTag',
32+
component: VersionTag,
33+
isEdited: isTextFieldEntryEdited
34+
},
35+
];
36+
}
37+
38+
function VersionTag(props) {
39+
const { element } = props;
40+
41+
const bpmnFactory = useService('bpmnFactory');
42+
const commandStack = useService('commandStack');
43+
const debounce = useService('debounceInput');
44+
const translate = useService('translate');
45+
46+
const getValue = () => {
47+
const versionTag = getVersionTag(element);
48+
49+
if (versionTag) {
50+
return versionTag.get('value');
51+
}
52+
};
53+
54+
const setValue = (value) => {
55+
let commands = [];
56+
57+
const businessObject = getProcess(element);
58+
59+
let extensionElements = businessObject.get('extensionElements');
60+
61+
// (1) ensure extension elements
62+
if (!extensionElements) {
63+
extensionElements = createElement(
64+
'bpmn:ExtensionElements',
65+
{ values: [] },
66+
businessObject,
67+
bpmnFactory
68+
);
69+
70+
commands.push({
71+
cmd: 'element.updateModdleProperties',
72+
context: {
73+
element,
74+
moddleElement: businessObject,
75+
properties: { extensionElements }
76+
}
77+
});
78+
}
79+
80+
// (2) ensure version tag
81+
let versionTag = getVersionTag(element);
82+
83+
if (!versionTag) {
84+
versionTag = createElement(
85+
'zeebe:VersionTag',
86+
{},
87+
extensionElements,
88+
bpmnFactory
89+
);
90+
91+
commands.push({
92+
cmd: 'element.updateModdleProperties',
93+
context: {
94+
element,
95+
moddleElement: extensionElements,
96+
properties: {
97+
values: [ ...extensionElements.get('values'), versionTag ]
98+
}
99+
}
100+
});
101+
}
102+
103+
// (3) update version tag value
104+
commands.push({
105+
cmd: 'element.updateModdleProperties',
106+
context: {
107+
element,
108+
moddleElement: versionTag,
109+
properties: { value }
110+
}
111+
});
112+
113+
commandStack.execute('properties-panel.multi-command-executor', commands);
114+
};
115+
116+
return TextFieldEntry({
117+
element,
118+
id: 'versionTag',
119+
label: translate('Version tag'),
120+
getValue,
121+
setValue,
122+
debounce
123+
});
124+
}
125+
126+
127+
// helper //////////////////
128+
129+
function getProcess(element) {
130+
return is(element, 'bpmn:Process') ?
131+
getBusinessObject(element) :
132+
getBusinessObject(element).get('processRef');
133+
}
134+
135+
function getVersionTag(element) {
136+
const businessObject = getProcess(element);
137+
138+
return getExtensionElementsList(businessObject, 'zeebe:VersionTag')[ 0 ];
139+
}

src/provider/zeebe/properties/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,5 @@ export { TargetProps } from './TargetProps';
2121
export { TaskDefinitionProps } from './TaskDefinitionProps';
2222
export { TaskScheduleProps } from './TaskScheduleProps';
2323
export { TimerProps } from './TimerProps';
24-
export { UserTaskImplementationProps } from './UserTaskImplementationProps';
24+
export { UserTaskImplementationProps } from './UserTaskImplementationProps';
25+
export { VersionTagProps } from './VersionTagProps';
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:zeebe="http://camunda.org/schema/zeebe/1.0" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.23.0" modeler:executionPlatform="Camunda Cloud" modeler:executionPlatformVersion="8.5.0">
3+
<bpmn:collaboration id="Collaboration_1pt34ye">
4+
<bpmn:participant id="Participant_1" processRef="Process_1" />
5+
</bpmn:collaboration>
6+
<bpmn:process id="Process_1" isExecutable="true">
7+
<bpmn:extensionElements>
8+
<zeebe:versionTag value="v1.0.0" />
9+
<zeebe:properties>
10+
<zeebe:property name="foo" value="bar" />
11+
</zeebe:properties>
12+
</bpmn:extensionElements>
13+
<bpmn:task id="Task_1" />
14+
</bpmn:process>
15+
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
16+
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Collaboration_1pt34ye">
17+
<bpmndi:BPMNShape id="Participant_02oh0k3_di" bpmnElement="Participant_1" isHorizontal="true">
18+
<dc:Bounds x="160" y="85" width="600" height="250" />
19+
</bpmndi:BPMNShape>
20+
<bpmndi:BPMNShape id="Activity_0kx78hk_di" bpmnElement="Task_1">
21+
<dc:Bounds x="410" y="170" width="100" height="80" />
22+
</bpmndi:BPMNShape>
23+
</bpmndi:BPMNPlane>
24+
</bpmndi:BPMNDiagram>
25+
</bpmn:definitions>
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:zeebe="http://camunda.org/schema/zeebe/1.0" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.23.0" modeler:executionPlatform="Camunda Cloud" modeler:executionPlatformVersion="8.5.0">
3+
<bpmn:process id="Process_1" isExecutable="true">
4+
<bpmn:extensionElements>
5+
<zeebe:versionTag value="v1.0.0" />
6+
<zeebe:properties>
7+
<zeebe:property name="foo" value="bar" />
8+
</zeebe:properties>
9+
</bpmn:extensionElements>
10+
<bpmn:task id="Task_1" />
11+
</bpmn:process>
12+
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
13+
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1">
14+
<bpmndi:BPMNShape id="Activity_0kx78hk_di" bpmnElement="Task_1">
15+
<dc:Bounds x="160" y="80" width="100" height="80" />
16+
</bpmndi:BPMNShape>
17+
</bpmndi:BPMNPlane>
18+
</bpmndi:BPMNDiagram>
19+
</bpmn:definitions>

0 commit comments

Comments
 (0)