Skip to content

Commit ef87fdc

Browse files
philippfrommenikku
authored andcommitted
feat(zeebe): add _Version tag_ field to linked resources
Related to camunda/camunda-modeler#4460 Related to camunda/camunda-modeler#4461 Related to camunda/camunda-modeler#4462
1 parent 0aff679 commit ef87fdc

File tree

12 files changed

+499
-50
lines changed

12 files changed

+499
-50
lines changed

src/contextProvider/zeebe/TooltipProvider.js

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -297,16 +297,41 @@ const TooltipProvider = {
297297
);
298298
},
299299
'versionTag': (element) => {
300-
301300
const translate = useService('translate');
302301

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-
);
302+
if (is(element, 'bpmn:Process')) {
303+
return (
304+
<div>
305+
<p>
306+
{ translate('Version tag by which this process can be referenced.') }
307+
</p>
308+
</div>
309+
);
310+
} else if (is(element, 'bpmn:CallActivity')) {
311+
return (
312+
<div>
313+
<p>
314+
{ translate('Version tag by which the called process will be referenced.') }
315+
</p>
316+
</div>
317+
);
318+
} else if (is(element, 'bpmn:BusinessRuleTask')) {
319+
return (
320+
<div>
321+
<p>
322+
{ translate('Version tag by which the called decision will be referenced.') }
323+
</p>
324+
</div>
325+
);
326+
} else if (is(element, 'bpmn:UserTask')) {
327+
return (
328+
<div>
329+
<p>
330+
{ translate('Version tag by which the linked form will be referenced.') }
331+
</p>
332+
</div>
333+
);
334+
}
310335
},
311336
'priorityDefinitionPriority': (element) => {
312337

src/provider/zeebe/properties/CalledDecisionProps.js

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ import {
1010
TextFieldEntry
1111
} from '@bpmn-io/properties-panel';
1212

13-
import Binding from './shared/Binding';
13+
import Binding, { getBindingType } from './shared/Binding';
14+
import VersionTag from './shared/VersionTag.js';
1415

1516
import {
1617
getExtensionElementsList
@@ -36,7 +37,7 @@ export function CalledDecisionProps(props) {
3637
return [];
3738
}
3839

39-
return [
40+
const entries = [
4041
{
4142
id: 'decisionId',
4243
component: DecisionID,
@@ -46,13 +47,24 @@ export function CalledDecisionProps(props) {
4647
id: 'bindingType',
4748
component: withProps(Binding, { type: 'zeebe:CalledDecision' }),
4849
isEdited: isSelectEntryEdited
49-
},
50-
{
51-
id: 'resultVariable',
52-
component: ResultVariable,
53-
isEdited: isTextFieldEntryEdited
5450
}
5551
];
52+
53+
if (getBindingType(element, 'zeebe:CalledDecision') === 'versionTag') {
54+
entries.push({
55+
id: 'versionTag',
56+
component: withProps(VersionTag, { type: 'zeebe:CalledDecision' }),
57+
isEdited: isTextFieldEntryEdited
58+
});
59+
}
60+
61+
entries.push({
62+
id: 'resultVariable',
63+
component: ResultVariable,
64+
isEdited: isTextFieldEntryEdited
65+
});
66+
67+
return entries;
5668
}
5769

5870
function DecisionID(props) {

src/provider/zeebe/properties/FormProps.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ import {
1818
isTextAreaEntryEdited
1919
} from '@bpmn-io/properties-panel';
2020

21-
import Binding from './shared/Binding';
21+
import Binding, { getBindingType } from './shared/Binding';
22+
import VersionTag from './shared/VersionTag';
2223

2324
import { FeelEntryWithVariableContext } from '../../../entries/FeelEntryWithContext';
2425

@@ -89,6 +90,14 @@ export function FormProps(props) {
8990
component: withProps(Binding, { type: 'zeebe:FormDefinition' }),
9091
isEdited: isSelectEntryEdited
9192
});
93+
94+
if (getBindingType(element, 'zeebe:FormDefinition') === 'versionTag') {
95+
entries.push({
96+
id: 'versionTag',
97+
component: withProps(VersionTag, { type: 'zeebe:FormDefinition' }),
98+
isEdited: isTextFieldEntryEdited
99+
});
100+
}
92101
}
93102

94103
return entries;

src/provider/zeebe/properties/TargetProps.js

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@ import {
55

66
import {
77
isFeelEntryEdited,
8-
isSelectEntryEdited
8+
isSelectEntryEdited,
9+
isTextFieldEntryEdited
910
} from '@bpmn-io/properties-panel';
1011

11-
import Binding from './shared/Binding';
12+
import Binding, { getBindingType } from './shared/Binding';
13+
import VersionTag from './shared/VersionTag.js';
1214

1315
import {
1416
createElement
@@ -35,7 +37,7 @@ export function TargetProps(props) {
3537
return [];
3638
}
3739

38-
return [
40+
const entries = [
3941
{
4042
id: 'targetProcessId',
4143
component: TargetProcessId,
@@ -47,6 +49,16 @@ export function TargetProps(props) {
4749
isEdited: isSelectEntryEdited
4850
}
4951
];
52+
53+
if (getBindingType(element, 'zeebe:CalledElement') === 'versionTag') {
54+
entries.push({
55+
id: 'versionTag',
56+
component: withProps(VersionTag, { type: 'zeebe:CalledElement' }),
57+
isEdited: isTextFieldEntryEdited
58+
});
59+
}
60+
61+
return entries;
5062
}
5163

5264
function TargetProcessId(props) {

src/provider/zeebe/properties/shared/Binding.js

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,7 @@ export default function Binding(props) {
1818
commandStack = useService('commandStack'),
1919
translate = useService('translate');
2020

21-
const getValue = () => {
22-
const businessObject = getBusinessObject(element);
23-
24-
const extensionElement = getExtensionElementsList(businessObject, type)[ 0 ];
25-
26-
if (!extensionElement) {
27-
return 'latest';
28-
}
29-
30-
return extensionElement.get('bindingType');
31-
};
21+
const getValue = () => getBindingType(element, type);
3222

3323
const setValue = value => {
3424
const commands = [];
@@ -98,7 +88,8 @@ export default function Binding(props) {
9888

9989
const getOptions = () => ([
10090
{ value: 'latest', label: translate('latest') },
101-
{ value: 'deployment', label: translate('deployment') }
91+
{ value: 'deployment', label: translate('deployment') },
92+
{ value: 'versionTag', label: translate('version tag') }
10293
]);
10394

10495
return <SelectEntry
@@ -109,4 +100,16 @@ export default function Binding(props) {
109100
setValue={ setValue }
110101
getOptions={ getOptions }
111102
/>;
103+
}
104+
105+
export function getBindingType(element, type) {
106+
const businessObject = getBusinessObject(element);
107+
108+
const extensionElement = getExtensionElementsList(businessObject, type)[ 0 ];
109+
110+
if (!extensionElement) {
111+
return 'latest';
112+
}
113+
114+
return extensionElement.get('bindingType');
112115
}
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
import { getBusinessObject } from 'bpmn-js/lib/util/ModelUtil';
2+
3+
import { TextFieldEntry } from '@bpmn-io/properties-panel';
4+
5+
import { createElement } from '../../../../utils/ElementUtil';
6+
7+
import { useService } from '../../../../hooks';
8+
9+
import { getExtensionElementsList } from '../../../../utils/ExtensionElementsUtil';
10+
11+
export default function VersionTag(props) {
12+
const {
13+
element,
14+
type
15+
} = props;
16+
17+
const bpmnFactory = useService('bpmnFactory'),
18+
commandStack = useService('commandStack'),
19+
debounce = useService('debounceInput'),
20+
translate = useService('translate');
21+
22+
const getValue = () => getVersionTag(element, type);
23+
24+
const setValue = value => {
25+
const commands = [];
26+
27+
const businessObject = getBusinessObject(element);
28+
29+
// (1) ensure extension elements
30+
let extensionElements = businessObject.get('extensionElements');
31+
32+
if (!extensionElements) {
33+
extensionElements = createElement(
34+
'bpmn:ExtensionElements',
35+
{ values: [] },
36+
businessObject,
37+
bpmnFactory
38+
);
39+
40+
commands.push({
41+
cmd: 'element.updateModdleProperties',
42+
context: {
43+
element,
44+
moddleElement: businessObject,
45+
properties: { extensionElements }
46+
}
47+
});
48+
}
49+
50+
// (2) ensure extension element
51+
let extensionElement = getExtensionElementsList(businessObject, type)[ 0 ];
52+
53+
if (!extensionElement) {
54+
extensionElement = createElement(
55+
type,
56+
{},
57+
extensionElements,
58+
bpmnFactory
59+
);
60+
61+
commands.push({
62+
cmd: 'element.updateModdleProperties',
63+
context: {
64+
element,
65+
moddleElement: extensionElements,
66+
properties: {
67+
values: [ ...extensionElements.get('values'), extensionElement ]
68+
}
69+
}
70+
});
71+
72+
}
73+
74+
// (3) Update versionTag attribute
75+
commands.push({
76+
cmd: 'element.updateModdleProperties',
77+
context: {
78+
element,
79+
moddleElement: extensionElement,
80+
properties: {
81+
versionTag: value
82+
}
83+
}
84+
});
85+
86+
// (4) Execute the commands
87+
commandStack.execute('properties-panel.multi-command-executor', commands);
88+
};
89+
90+
return TextFieldEntry({
91+
element,
92+
id: 'versionTag',
93+
label: translate('Version tag'),
94+
getValue,
95+
setValue,
96+
debounce
97+
});
98+
}
99+
100+
export function getVersionTag(element, type) {
101+
const businessObject = getBusinessObject(element);
102+
103+
const extensionElement = getExtensionElementsList(businessObject, type)[ 0 ];
104+
105+
if (!extensionElement) {
106+
return '';
107+
}
108+
109+
return extensionElement.get('versionTag') || '';
110+
}

test/spec/provider/zeebe/CalledDecisionProps.bpmn

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@
77
<zeebe:calledDecision decisionId="myDecisionId" resultVariable="myResultVariable" />
88
</bpmn:extensionElements>
99
</bpmn:businessRuleTask>
10-
<bpmn:businessRuleTask id="BusinessRuleTask_2" name="BusinessRuleTask_2" />
10+
<bpmn:businessRuleTask id="BusinessRuleTask_2" name="BusinessRuleTask_2">
11+
<bpmn:extensionElements>
12+
<zeebe:calledDecision decisionId="myDecisionId" resultVariable="myResultVariable" bindingType="versionTag" versionTag="v1.0.0" />
13+
</bpmn:extensionElements>
14+
</bpmn:businessRuleTask>
1115
</bpmn:process>
1216
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
1317
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_0mgn9vm">
@@ -22,4 +26,4 @@
2226
</bpmndi:BPMNShape>
2327
</bpmndi:BPMNPlane>
2428
</bpmndi:BPMNDiagram>
25-
</bpmn:definitions>
29+
</bpmn:definitions>

0 commit comments

Comments
 (0)