@5minds/node-red-contrib-processcube 1.1.4-develop-f12497-m0akrvxl → 1.1.4-develop-e4b670-m0m25yen

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. package/endevent-finished-listener.html +2 -2
  2. package/externaltask-error.html +2 -1
  3. package/externaltask-event-listener.html +52 -0
  4. package/externaltask-event-listener.js +77 -0
  5. package/externaltask-input.html +1 -1
  6. package/externaltask-output.html +1 -1
  7. package/icons/endevent_finished_listener.svg +4 -0
  8. package/icons/externaltask_error.svg +5 -0
  9. package/icons/externaltask_event_listener.svg +4 -0
  10. package/icons/externaltask_input.svg +6 -0
  11. package/icons/externaltask_output.svg +6 -0
  12. package/icons/message_event_trigger.svg +5 -0
  13. package/icons/process_event_listener.svg +6 -0
  14. package/icons/process_start.svg +6 -0
  15. package/icons/processdefinition_query.svg +7 -0
  16. package/icons/processinstance_query.svg +6 -0
  17. package/icons/signal_event_trigger.svg +5 -0
  18. package/icons/usertask_event_listener.svg +4 -0
  19. package/icons/usertask_input.svg +5 -0
  20. package/icons/usertask_output.svg +5 -0
  21. package/message-event-trigger.html +1 -1
  22. package/package.json +3 -1
  23. package/process-event-listener.html +24 -2
  24. package/process-event-listener.js +261 -92
  25. package/process-start.html +1 -1
  26. package/processdefinition-query.html +1 -1
  27. package/processes/User-Task-Sample.bpmn +18 -2
  28. package/processinstance-query.html +1 -1
  29. package/signal-event-trigger.html +1 -1
  30. package/usertask-event-listener.html +75 -0
  31. package/usertask-event-listener.js +96 -0
  32. package/usertask-input.html +1 -1
  33. package/usertask-output.html +4 -4
  34. package/usertask-finished-listener.html +0 -45
  35. package/usertask-finished-listener.js +0 -68
  36. package/usertask-new-listener.html +0 -45
  37. package/usertask-new-listener.js +0 -69
@@ -15,148 +15,311 @@ module.exports = function (RED) {
15
15
  let currentIdentity = node.engine.identity;
16
16
 
17
17
  let subscription;
18
+ const query = RED.util.evaluateNodeProperty(config.query, config.query_type, node);
18
19
 
19
20
  async function subscribe(eventType) {
20
21
  switch (eventType) {
21
- case "starting":
22
+ case 'starting':
22
23
  return await client.notification.onProcessStarting(
23
- (processNotification) => {
24
- if (config.processmodel != '' && config.processmodel != processNotification.processModelId)
24
+ async (processNotification) => {
25
+ if (
26
+ config.processmodel != '' &&
27
+ config.processmodel != processNotification.processModelId
28
+ )
25
29
  return;
26
- node.send({
27
- payload: {
28
- processInstanceId: processNotification.processInstanceId,
29
- processModelId: processNotification.processModelId,
30
- action: 'starting',
31
- type: 'processInstance',
32
- },
30
+ const newQuery = {
31
+ processInstanceId: processNotification.processInstanceId,
32
+ ...query,
33
+ };
34
+
35
+ const matchingInstances = await client.processInstances.query(newQuery, {
36
+ identity: currentIdentity,
33
37
  });
38
+
39
+ if (
40
+ matchingInstances.processInstances &&
41
+ matchingInstances.processInstances.length == 1
42
+ ) {
43
+ const processInstance = matchingInstances.processInstances[0];
44
+
45
+ node.send({
46
+ payload: {
47
+ processInstanceId: processNotification.processInstanceId,
48
+ processModelId: processNotification.processModelId,
49
+ processInstance: processInstance,
50
+ action: 'starting',
51
+ type: 'processInstance',
52
+ },
53
+ });
54
+ }
34
55
  },
35
56
  { identity: currentIdentity }
36
57
  );
37
58
  case 'started':
38
59
  return await client.notification.onProcessStarted(
39
- (processNotification) => {
40
- if (config.processmodel != '' && config.processmodel != processNotification.processModelId)
60
+ async (processNotification) => {
61
+ if (
62
+ config.processmodel != '' &&
63
+ config.processmodel != processNotification.processModelId
64
+ )
41
65
  return;
42
- node.send({
43
- payload: {
44
- processInstanceId: processNotification.processInstanceId,
45
- processModelId: processNotification.processModelId,
46
- flowNodeId: processNotification.flowNodeId,
47
- token: processNotification.currentToken,
48
- action: 'started',
49
- type: 'processInstance',
50
- },
66
+ const newQuery = {
67
+ processInstanceId: processNotification.processInstanceId,
68
+ ...query,
69
+ };
70
+
71
+ const matchingInstances = await client.processInstances.query(newQuery, {
72
+ identity: currentIdentity,
51
73
  });
74
+
75
+ if (
76
+ matchingInstances.processInstances &&
77
+ matchingInstances.processInstances.length == 1
78
+ ) {
79
+ const processInstance = matchingInstances.processInstances[0];
80
+ node.send({
81
+ payload: {
82
+ processInstanceId: processNotification.processInstanceId,
83
+ processModelId: processNotification.processModelId,
84
+ flowNodeId: processNotification.flowNodeId,
85
+ token: processNotification.currentToken,
86
+ processInstance: processInstance,
87
+ action: 'started',
88
+ type: 'processInstance',
89
+ },
90
+ });
91
+ }
52
92
  },
53
93
  { identity: currentIdentity }
54
94
  );
55
95
  case 'resumed':
56
96
  return await client.notification.onProcessResumed(
57
- (processNotification) => {
58
- if (config.processmodel != '' && config.processmodel != processNotification.processModelId)
97
+ async (processNotification) => {
98
+ if (
99
+ config.processmodel != '' &&
100
+ config.processmodel != processNotification.processModelId
101
+ )
59
102
  return;
60
- node.send({
61
- payload: {
62
- processInstanceId: processNotification.processInstanceId,
63
- processModelId: processNotification.processModelId,
64
- token: processNotification.currentToken,
65
- action: 'resumed',
66
- type: 'processInstance',
67
- },
103
+
104
+ const newQuery = {
105
+ processInstanceId: processNotification.processInstanceId,
106
+ ...query,
107
+ };
108
+
109
+ const matchingInstances = await client.processInstances.query(newQuery, {
110
+ identity: currentIdentity,
68
111
  });
112
+
113
+ if (
114
+ matchingInstances.processInstances &&
115
+ matchingInstances.processInstances.length == 1
116
+ ) {
117
+ const processInstance = matchingInstances.processInstances[0];
118
+ node.send({
119
+ payload: {
120
+ processInstanceId: processNotification.processInstanceId,
121
+ processModelId: processNotification.processModelId,
122
+ token: processNotification.currentToken,
123
+ processInstance: processInstance,
124
+ action: 'resumed',
125
+ type: 'processInstance',
126
+ },
127
+ });
128
+ }
69
129
  },
70
- { identity: currentIdentity }
130
+ { identity: currentIdentity }
71
131
  );
72
132
  case 'finished':
73
133
  return await client.notification.onProcessEnded(
74
- (processNotification) => {
75
- if (config.processmodel != '' && config.processmodel != processNotification.processModelId)
134
+ async (processNotification) => {
135
+ if (
136
+ config.processmodel != '' &&
137
+ config.processmodel != processNotification.processModelId
138
+ )
76
139
  return;
77
- node.send({
78
- payload: {
79
- processInstanceId: processNotification.processInstanceId,
80
- processModelId: processNotification.processModelId,
81
- flowNodeId: processNotification.flowNodeId,
82
- token: processNotification.currentToken,
83
- action: 'finished',
84
- type: 'processInstance',
85
- },
140
+
141
+ const newQuery = {
142
+ processInstanceId: processNotification.processInstanceId,
143
+ ...query,
144
+ };
145
+
146
+ const matchingInstances = await client.processInstances.query(newQuery, {
147
+ identity: currentIdentity,
86
148
  });
149
+
150
+ if (
151
+ matchingInstances.processInstances &&
152
+ matchingInstances.processInstances.length == 1
153
+ ) {
154
+ const processInstance = matchingInstances.processInstances[0];
155
+ node.send({
156
+ payload: {
157
+ processInstanceId: processNotification.processInstanceId,
158
+ processModelId: processNotification.processModelId,
159
+ flowNodeId: processNotification.flowNodeId,
160
+ token: processNotification.currentToken,
161
+ processInstance: processInstance,
162
+ action: 'finished',
163
+ type: 'processInstance',
164
+ },
165
+ });
166
+ }
87
167
  },
88
168
  { identity: currentIdentity }
89
169
  );
90
170
  case 'terminated':
91
171
  return await client.notification.onProcessTerminated(
92
- (processNotification) => {
93
- if (config.processmodel != '' && config.processmodel != processNotification.processModelId)
172
+ async (processNotification) => {
173
+ if (
174
+ config.processmodel != '' &&
175
+ config.processmodel != processNotification.processModelId
176
+ )
94
177
  return;
95
- node.send({
96
- payload: {
97
- processInstanceId: processNotification.processInstanceId,
98
- processModelId: processNotification.processModelId,
99
- token: processNotification.currentToken,
100
- action: 'terminated',
101
- type: 'processInstance',
102
- },
178
+
179
+ const newQuery = {
180
+ processInstanceId: processNotification.processInstanceId,
181
+ ...query,
182
+ };
183
+
184
+ const matchingInstances = await client.processInstances.query(newQuery, {
185
+ identity: currentIdentity,
103
186
  });
187
+
188
+ if (
189
+ matchingInstances.processInstances &&
190
+ matchingInstances.processInstances.length == 1
191
+ ) {
192
+ const processInstance = matchingInstances.processInstances[0];
193
+ node.send({
194
+ payload: {
195
+ processInstanceId: processNotification.processInstanceId,
196
+ processModelId: processNotification.processModelId,
197
+ token: processNotification.currentToken,
198
+ processInstance: processInstance,
199
+ action: 'terminated',
200
+ type: 'processInstance',
201
+ },
202
+ });
203
+ }
104
204
  },
105
205
  { identity: currentIdentity }
106
206
  );
107
- case "error":
207
+ case 'error':
108
208
  return await client.notification.onProcessError(
109
- (processNotification) => {
110
- if (config.processmodel != '' && config.processmodel != processNotification.processModelId)
209
+ async (processNotification) => {
210
+ if (
211
+ config.processmodel != '' &&
212
+ config.processmodel != processNotification.processModelId
213
+ )
111
214
  return;
112
- node.send({
113
- payload: {
114
- processInstanceId: processNotification.processInstanceId,
115
- processModelId: processNotification.processModelId,
116
- token: processNotification.currentToken,
117
- action: 'error',
118
- type: 'processInstance',
119
- },
215
+
216
+ const newQuery = {
217
+ processInstanceId: processNotification.processInstanceId,
218
+ ...query,
219
+ };
220
+
221
+ const matchingInstances = await client.processInstances.query(newQuery, {
222
+ identity: currentIdentity,
120
223
  });
224
+
225
+ if (
226
+ matchingInstances.processInstances &&
227
+ matchingInstances.processInstances.length == 1
228
+ ) {
229
+ const processInstance = matchingInstances.processInstances[0];
230
+ node.send({
231
+ payload: {
232
+ processInstanceId: processNotification.processInstanceId,
233
+ processModelId: processNotification.processModelId,
234
+ token: processNotification.currentToken,
235
+ processInstance: processInstance,
236
+ action: 'error',
237
+ type: 'processInstance',
238
+ },
239
+ });
240
+ }
121
241
  },
122
242
  { identity: currentIdentity }
123
243
  );
124
- case "owner-changed":
244
+ case 'owner-changed':
125
245
  return await client.notification.onProcessOwnerChanged(
126
- (processNotification) => {
127
- if (config.processmodel != '' && config.processmodel != processNotification.processModelId)
246
+ async (processNotification) => {
247
+ if (
248
+ config.processmodel != '' &&
249
+ config.processmodel != processNotification.processModelId
250
+ )
128
251
  return;
129
- node.send({
130
- payload: {
131
- processInstanceId: processNotification.processInstanceId,
132
- processModelId: processNotification.processModelId,
133
- action: 'owner-changed',
134
- type: 'processInstance',
135
- },
252
+
253
+ const newQuery = {
254
+ processInstanceId: processNotification.processInstanceId,
255
+ ...query,
256
+ };
257
+
258
+ const matchingInstances = await client.processInstances.query(newQuery, {
259
+ identity: currentIdentity,
136
260
  });
261
+
262
+ if (
263
+ matchingInstances.processInstances &&
264
+ matchingInstances.processInstances.length == 1
265
+ ) {
266
+ const processInstance = matchingInstances.processInstances[0];
267
+ node.send({
268
+ payload: {
269
+ processInstanceId: processNotification.processInstanceId,
270
+ processModelId: processNotification.processModelId,
271
+ processInstance: processInstance,
272
+ action: 'owner-changed',
273
+ type: 'processInstance',
274
+ },
275
+ });
276
+ }
137
277
  },
138
278
  { identity: currentIdentity }
139
279
  );
140
- case "instances-deleted":
280
+ case 'instances-deleted':
141
281
  return await client.notification.onProcessInstancesDeleted(
142
- (processNotification) => {
143
- if (config.processmodel != '' && config.processmodel != processNotification.processModelId)
282
+ async (processNotification) => {
283
+ if (
284
+ config.processmodel != '' &&
285
+ config.processmodel != processNotification.processModelId
286
+ )
144
287
  return;
145
- node.send({
146
- payload: {
147
- processInstanceId: processNotification.processInstanceId,
148
- processModelId: processNotification.processModelId,
149
- action: 'instances-deleted',
150
- type: 'processInstance',
151
- },
288
+
289
+ const newQuery = {
290
+ processInstanceId: processNotification.processInstanceId,
291
+ ...query,
292
+ };
293
+
294
+ const matchingInstances = await client.processInstances.query(newQuery, {
295
+ identity: currentIdentity,
152
296
  });
297
+
298
+ if (
299
+ matchingInstances.processInstances &&
300
+ matchingInstances.processInstances.length == 1
301
+ ) {
302
+ const processInstance = matchingInstances.processInstances[0];
303
+ node.send({
304
+ payload: {
305
+ processInstanceId: processNotification.processInstanceId,
306
+ processModelId: processNotification.processModelId,
307
+ processInstance: processInstance,
308
+ action: 'instances-deleted',
309
+ type: 'processInstance',
310
+ },
311
+ });
312
+ }
153
313
  },
154
314
  { identity: currentIdentity }
155
315
  );
156
- case "is-executable-changed":
316
+ case 'is-executable-changed':
157
317
  return await client.notification.onProcessIsExecutableChanged(
158
318
  (processNotification) => {
159
- if (config.processmodel != '' && config.processmodel != processNotification.processModelId)
319
+ if (
320
+ config.processmodel != '' &&
321
+ config.processmodel != processNotification.processModelId
322
+ )
160
323
  return;
161
324
  node.send({
162
325
  payload: {
@@ -168,10 +331,13 @@ module.exports = function (RED) {
168
331
  },
169
332
  { identity: currentIdentity }
170
333
  );
171
- case "deployed":
334
+ case 'deployed':
172
335
  return await client.notification.onProcessDeployed(
173
336
  (processNotification) => {
174
- if (config.processmodel != '' && config.processmodel != processNotification.processModelId)
337
+ if (
338
+ config.processmodel != '' &&
339
+ config.processmodel != processNotification.processModelId
340
+ )
175
341
  return;
176
342
  node.send({
177
343
  payload: {
@@ -183,10 +349,13 @@ module.exports = function (RED) {
183
349
  },
184
350
  { identity: currentIdentity }
185
351
  );
186
- case "undeployed":
352
+ case 'undeployed':
187
353
  return await client.notification.onProcessUndeployed(
188
354
  (processNotification) => {
189
- if (config.processmodel != '' && config.processmodel != processNotification.processModelId)
355
+ if (
356
+ config.processmodel != '' &&
357
+ config.processmodel != processNotification.processModelId
358
+ )
190
359
  return;
191
360
  node.send({
192
361
  payload: {
@@ -199,13 +368,13 @@ module.exports = function (RED) {
199
368
  { identity: currentIdentity }
200
369
  );
201
370
  default:
202
- console.error("no such event: " + eventType)
371
+ console.error('no such event: ' + eventType);
203
372
  break;
204
373
  }
205
374
  }
206
375
 
207
376
  if (node.engine.isIdentityReady()) {
208
- subscription = await subscribe(config.eventtype)
377
+ subscription = await subscribe(config.eventtype);
209
378
  }
210
379
 
211
380
  node.engine.registerOnIdentityChanged(async (identity) => {
@@ -10,7 +10,7 @@
10
10
  },
11
11
  inputs: 1,
12
12
  outputs: 1,
13
- icon: 'font-awesome/fa-sign-in',
13
+ icon: 'process_start.svg',
14
14
  label: function () {
15
15
  return this.name || 'process-start';
16
16
  },
@@ -11,7 +11,7 @@
11
11
  },
12
12
  inputs: 1,
13
13
  outputs: 1,
14
- icon: 'font-awesome/fa-envelope-open',
14
+ icon: 'processdefinition_query.svg',
15
15
  label: function () {
16
16
  return this.name || 'processdefinition-query';
17
17
  },
@@ -16,8 +16,23 @@
16
16
  <bpmn:userTask id="user_task" name="User Task">
17
17
  <bpmn:extensionElements>
18
18
  <camunda:formData>
19
- <camunda:formField id="field_01" label="Field 01" type="string" />
20
- <camunda:formField id="field_02" label="Field 02" type="string" />
19
+ <camunda:formField id="checkbox" label="Checkox" type="checkbox" defaultValue="true" customForm="{&#34;hint&#34;:&#34;hintttt&#34;,&#34;entries&#34;:[{&#34;key&#34;:&#34;value&#34;,&#34;value&#34;:&#34;Label&#34;}]}" />
20
+ <camunda:formField id="color" label="Color" type="color" defaultValue="#cd2323" />
21
+ <camunda:formField id="date-time-local" label="Datetime Local" type="datetime-local" customForm="{&#34;hint&#34;:&#34;jljkkljlk&#34;}" />
22
+ <camunda:formField id="email" label="Email" type="email" customForm="{&#34;hint&#34;:&#34;hklojh&#34;,&#34;placeholder&#34;:&#34;luis@luis.de&#34;}" />
23
+ <camunda:formField id="header" type="header" defaultValue="This is a Heading" customForm="{&#34;style&#34;:&#34;heading_2&#34;}" />
24
+ <camunda:formField id="hidden" type="hidden" defaultValue="jkljlkj" />
25
+ <camunda:formField id="month" label="Month" type="month" customForm="{&#34;hint&#34;:&#34;this is a hint for month&#34;}" />
26
+ <camunda:formField id="paragraph" type="paragraph" defaultValue="This is a paragraph." />
27
+ <camunda:formField id="password" label="Password" type="password" customForm="{&#34;hint&#34;:&#34;Dont use smt i can guess&#34;}" />
28
+ <camunda:formField id="radio" label="Radio" type="radio" customForm="{&#34;entries&#34;:[{&#34;key&#34;:&#34;value&#34;,&#34;value&#34;:&#34;Label&#34;},{&#34;key&#34;:&#34;value2&#34;,&#34;value&#34;:&#34;Label2&#34;}]}" />
29
+ <camunda:formField id="range" label="Range" type="range" customForm="{&#34;step&#34;:1,&#34;min&#34;:100,&#34;max&#34;:1000}" />
30
+ <camunda:formField id="select" label="Select" type="select" customForm="{&#34;entries&#34;:[{&#34;key&#34;:&#34;value&#34;,&#34;value&#34;:&#34;Label&#34;},{&#34;key&#34;:&#34;value&#34;,&#34;value&#34;:&#34;Label&#34;}],&#34;placeholder&#34;:&#34;Select Something&#34;}" />
31
+ <camunda:formField id="tele" label="Tel." type="tel" customForm="{&#34;hint&#34;:&#34;jkl&#34;,&#34;placeholder&#34;:&#34;110&#34;}" />
32
+ <camunda:formField id="textarea" label="Textarea" type="textarea" defaultValue="jkl" customForm="{&#34;placeholder&#34;:&#34;placeholder&#34;}" />
33
+ <camunda:formField id="time" label="Time" type="time" customForm="{&#34;hint&#34;:&#34;jkl&#34;,&#34;placeholder&#34;:&#34;12:0000&#34;}" />
34
+ <camunda:formField id="url" label="URL" type="url" customForm="{&#34;placeholder&#34;:&#34;http://&#34;,&#34;hint&#34;:&#34;no youtube&#34;}" />
35
+ <camunda:formField id="week" label="Week" type="week" customForm="{&#34;hint&#34;:&#34;What week?&#34;}" />
21
36
  </camunda:formData>
22
37
  </bpmn:extensionElements>
23
38
  <bpmn:incoming>Flow_142awo6</bpmn:incoming>
@@ -43,6 +58,7 @@
43
58
  </bpmndi:BPMNShape>
44
59
  <bpmndi:BPMNShape id="Activity_0c7im8g_di" bpmnElement="user_task">
45
60
  <dc:Bounds x="180" y="130" width="100" height="80" />
61
+ <bpmndi:BPMNLabel />
46
62
  </bpmndi:BPMNShape>
47
63
  <bpmndi:BPMNEdge id="Flow_142awo6_di" bpmnElement="Flow_142awo6">
48
64
  <di:waypoint x="128" y="170" />
@@ -10,7 +10,7 @@
10
10
  },
11
11
  inputs: 1,
12
12
  outputs: 1,
13
- icon: 'font-awesome/fa-envelope-open',
13
+ icon: 'processinstance_query.svg',
14
14
  label: function () {
15
15
  return this.name || 'processinstance-query';
16
16
  },
@@ -10,7 +10,7 @@
10
10
  },
11
11
  inputs: 1,
12
12
  outputs: 1,
13
- icon: 'font-awesome/fa-envelope-open',
13
+ icon: 'signal_event_trigger.svg',
14
14
  label: function () {
15
15
  return this.name || 'signal-event-trigger';
16
16
  },
@@ -0,0 +1,75 @@
1
+ <script type="text/javascript">
2
+ RED.nodes.registerType('usertask-event-listener', {
3
+ category: 'ProcessCube Events',
4
+ color: '#02AFD6',
5
+ defaults: {
6
+ name: { value: '' },
7
+ engine: { value: '', type: 'processcube-engine-config' },
8
+ usertask: { value: '', required: false },
9
+ eventtype: { value: '', required: true },
10
+ query: { value: '{}' },
11
+ query_type: { value: 'json' },
12
+ },
13
+ inputs: 0,
14
+ outputs: 1,
15
+ icon: 'usertask_event_listener.svg',
16
+ label: function () {
17
+ return this.name || 'usertask-event-listener';
18
+ },
19
+ oneditprepare: function () {
20
+ $('#node-input-query').typedInput({
21
+ default: 'json',
22
+ types: ['json'],
23
+ });
24
+
25
+ $('#node-input-query').typedInput('value', this.query);
26
+ $('#node-input-query').typedInput('type', this.query_type);
27
+ },
28
+ oneditsave: function () {
29
+ if ($('#node-input-query').typedInput('value') == '') {
30
+ $('#node-input-query').typedInput('value', '{}')
31
+ }
32
+ (this.query = $('#node-input-query').typedInput('value')),
33
+ (this.query_type = $('#node-input-query').typedInput('type'));
34
+ },
35
+ });
36
+ </script>
37
+
38
+ <script type="text/html" data-template-name="usertask-event-listener">
39
+ <div class="form-row">
40
+ <label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
41
+ <input type="text" id="node-input-name" placeholder="Name" />
42
+ </div>
43
+ <div class="form-row">
44
+ <label for="node-input-engine"><i class="fa fa-tag"></i> Engine-URL</label>
45
+ <input type="text" id="node-input-engine" placeholder="http://engine:8000" />
46
+ </div>
47
+ <div class="form-row">
48
+ <label for="node-input-usertask"><i class="fa fa-tag"></i> Usertask</label>
49
+ <input type="text" id="node-input-usertask" placeholder="ID of Usertask" />
50
+ </div>
51
+ <div class="form-row">
52
+ <label for="node-input-eventtype"><i class="fa fa-sliders"></i> Event</label>
53
+ <select id="node-input-eventtype" style="width: 70%;">
54
+ <option value="new">new</option>
55
+ <option value="finished">finished</option>
56
+ <option value="reserved">reserved</option>
57
+ <option value="reservation-canceled">reservation-canceled</option>
58
+ </select>
59
+ </div>
60
+ <div class="form-row">
61
+ <label for="node-input-query"><i class="fa fa-tag"></i> Query</label>
62
+ <input type="text" id="node-input-query" />
63
+ </div>
64
+ </script>
65
+
66
+ <script type="text/markdown" data-help-name="usertask-event-listener">
67
+ A node which listens for events triggered by usertasks
68
+
69
+ ## Outputs
70
+
71
+ ### References
72
+
73
+ - [The ProcessCube Developer Network](https://processcube.io) - All documentation for the ProcessCube&copy; platform
74
+ - [Node-RED Integration in ProcessCube&copy;](https://processcube.io/docs/node-red) - Node-RED integration in ProcessCube&copy;
75
+ </script>