@@ -12,11 +12,13 @@ import {
12
12
SelectEntry ,
13
13
TextFieldEntry ,
14
14
TextAreaEntry ,
15
- isSelectEntryEdited ,
15
+ isFeelEntryEdited ,
16
16
isTextFieldEntryEdited ,
17
17
isTextAreaEntryEdited
18
18
} from '@bpmn-io/properties-panel' ;
19
19
20
+ import { FeelEntryWithVariableContext } from '../../../entries/FeelEntryWithContext' ;
21
+
20
22
import { createElement } from '../../../utils/ElementUtil' ;
21
23
22
24
import { useService } from '../../../hooks' ;
@@ -28,9 +30,12 @@ import {
28
30
getFormType ,
29
31
getRootElement ,
30
32
getUserTaskForm ,
33
+ isZeebeUserTask ,
31
34
userTaskFormIdToFormKey
32
35
} from '../utils/FormUtil' ;
33
36
37
+ const NONE_VALUE = 'none' ;
38
+
34
39
35
40
export function FormProps ( props ) {
36
41
const { element } = props ;
@@ -42,7 +47,7 @@ export function FormProps(props) {
42
47
const entries = [ {
43
48
id : 'formType' ,
44
49
component : FormType ,
45
- isEdited : isSelectEntryEdited
50
+ isEdited : node => node . value !== NONE_VALUE
46
51
} ] ;
47
52
48
53
const formType = getFormType ( element ) ;
@@ -62,9 +67,15 @@ export function FormProps(props) {
62
67
} else if ( formType === FORM_TYPES . CUSTOM_FORM ) {
63
68
entries . push ( {
64
69
id : 'customFormKey' ,
65
- component : CustomFormKey ,
70
+ component : CustomForm ,
66
71
isEdited : isTextFieldEntryEdited
67
72
} ) ;
73
+ } else if ( formType === FORM_TYPES . EXTERNAL_REFERENCE ) {
74
+ entries . push ( {
75
+ id : 'externalReference' ,
76
+ component : ExternalReference ,
77
+ isEdited : isFeelEntryEdited
78
+ } ) ;
68
79
}
69
80
70
81
return entries ;
@@ -78,28 +89,15 @@ function FormType(props) {
78
89
translate = useService ( 'translate' ) ;
79
90
80
91
const getValue = ( ) => {
81
- return getFormType ( element ) || '' ;
92
+ return getFormType ( element ) || NONE_VALUE ;
82
93
} ;
83
94
84
95
const setValue = ( value ) => {
85
- if ( value === FORM_TYPES . CAMUNDA_FORM_EMBEDDED ) {
86
- setUserTaskForm ( injector , element , '' ) ;
87
- } else if ( value === FORM_TYPES . CAMUNDA_FORM_LINKED ) {
88
- setFormId ( injector , element , '' ) ;
89
- } else if ( value === FORM_TYPES . CUSTOM_FORM ) {
90
- setCustomFormKey ( injector , element , '' ) ;
91
- } else {
92
- removeFormDefinition ( injector , element ) ;
93
- }
96
+ setFormType ( injector , element , value ) ;
94
97
} ;
95
98
96
99
const getOptions = ( ) => {
97
- return [
98
- { value : '' , label : translate ( '<none>' ) } ,
99
- { value : FORM_TYPES . CAMUNDA_FORM_LINKED , label : translate ( 'Camunda Form (linked)' ) } ,
100
- { value : FORM_TYPES . CAMUNDA_FORM_EMBEDDED , label : translate ( 'Camunda Form (embedded)' ) } ,
101
- { value : FORM_TYPES . CUSTOM_FORM , label : translate ( 'Custom form key' ) }
102
- ] ;
100
+ return getFormTypeOptions ( translate , element ) ;
103
101
} ;
104
102
105
103
return SelectEntry ( {
@@ -112,6 +110,37 @@ function FormType(props) {
112
110
} ) ;
113
111
}
114
112
113
+ function setFormType ( injector , element , value ) {
114
+ if ( value === FORM_TYPES . CAMUNDA_FORM_EMBEDDED ) {
115
+ setUserTaskForm ( injector , element , '' ) ;
116
+ } else if ( value === FORM_TYPES . CAMUNDA_FORM_LINKED ) {
117
+ setFormId ( injector , element , '' ) ;
118
+ } else if ( value === FORM_TYPES . CUSTOM_FORM ) {
119
+ setCustomFormKey ( injector , element , '' ) ;
120
+ } else if ( value === FORM_TYPES . EXTERNAL_REFERENCE ) {
121
+ setExternalReference ( injector , element , '' ) ;
122
+ } else {
123
+ removeFormDefinition ( injector , element ) ;
124
+ }
125
+ }
126
+
127
+ function getFormTypeOptions ( translate , element ) {
128
+ if ( isZeebeUserTask ( element ) ) {
129
+ return [
130
+ { value : NONE_VALUE , label : translate ( '<none>' ) } ,
131
+ { value : FORM_TYPES . CAMUNDA_FORM_LINKED , label : translate ( 'Camunda Form' ) } ,
132
+ { value : FORM_TYPES . EXTERNAL_REFERENCE , label : translate ( 'External form reference' ) }
133
+ ] ;
134
+ }
135
+
136
+ return [
137
+ { value : NONE_VALUE , label : translate ( '<none>' ) } ,
138
+ { value : FORM_TYPES . CAMUNDA_FORM_LINKED , label : translate ( 'Camunda Form (linked)' ) } ,
139
+ { value : FORM_TYPES . CAMUNDA_FORM_EMBEDDED , label : translate ( 'Camunda Form (embedded)' ) } ,
140
+ { value : FORM_TYPES . CUSTOM_FORM , label : translate ( 'Custom form key' ) }
141
+ ] ;
142
+ }
143
+
115
144
116
145
function FormConfiguration ( props ) {
117
146
const { element } = props ;
@@ -165,16 +194,16 @@ function FormId(props) {
165
194
} ) ;
166
195
}
167
196
168
-
169
- function CustomFormKey ( props ) {
197
+ function CustomForm ( props ) {
170
198
const { element } = props ;
171
199
172
200
const debounce = useService ( 'debounceInput' ) ,
173
201
injector = useService ( 'injector' ) ,
174
202
translate = useService ( 'translate' ) ;
175
203
176
204
const getValue = ( ) => {
177
- return getFormDefinition ( element ) . get ( 'formKey' ) ;
205
+ const formDefinition = getFormDefinition ( element ) ;
206
+ return formDefinition . get ( 'formKey' ) ;
178
207
} ;
179
208
180
209
const setValue = ( value ) => {
@@ -184,7 +213,34 @@ function CustomFormKey(props) {
184
213
return TextFieldEntry ( {
185
214
element,
186
215
id : 'customFormKey' ,
187
- label : translate ( 'Form key' ) ,
216
+ label : translate ( 'Custom form key' ) ,
217
+ getValue,
218
+ setValue,
219
+ debounce
220
+ } ) ;
221
+ }
222
+
223
+ function ExternalReference ( props ) {
224
+ const { element } = props ;
225
+
226
+ const debounce = useService ( 'debounceInput' ) ,
227
+ injector = useService ( 'injector' ) ,
228
+ translate = useService ( 'translate' ) ;
229
+
230
+ const getValue = ( ) => {
231
+ const formDefinition = getFormDefinition ( element ) ;
232
+ return formDefinition . get ( 'externalReference' ) ;
233
+ } ;
234
+
235
+ const setValue = ( value ) => {
236
+ setExternalReference ( injector , element , isUndefined ( value ) ? '' : value ) ;
237
+ } ;
238
+
239
+ return FeelEntryWithVariableContext ( {
240
+ element,
241
+ id : 'externalReference' ,
242
+ label : translate ( 'External form reference' ) ,
243
+ feel : 'optional' ,
188
244
getValue,
189
245
setValue,
190
246
debounce
@@ -370,6 +426,22 @@ function setCustomFormKey(injector, element, formKey) {
370
426
] ) ;
371
427
}
372
428
429
+ function setExternalReference ( injector , element , externalReference ) {
430
+ let {
431
+ commands,
432
+ formDefinition
433
+ } = getOrCreateFormDefintition ( injector , element ) ;
434
+
435
+ const commandStack = injector . get ( 'commandStack' ) ;
436
+
437
+ commandStack . execute ( 'properties-panel.multi-command-executor' , [
438
+ ...commands ,
439
+ createUpdateModdlePropertiesCommand ( element , formDefinition , {
440
+ externalReference
441
+ } )
442
+ ] ) ;
443
+ }
444
+
373
445
function setUserTaskForm ( injector , element , body ) {
374
446
let {
375
447
commands,
0 commit comments