Skip to content

Commit 6a024cb

Browse files
committed
WIP child elements
1 parent 1f33231 commit 6a024cb

File tree

6 files changed

+274
-35
lines changed

6 files changed

+274
-35
lines changed

demo/fixtures/diagram.bpmn

Lines changed: 87 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@
176176
</zeebe:taskHeaders>
177177
</bpmn:extensionElements>
178178
<bpmn:incoming>Flow_03l9p18</bpmn:incoming>
179-
<bpmn:outgoing>Flow_0ucl2ph</bpmn:outgoing>
179+
<bpmn:outgoing>Flow_11m19en</bpmn:outgoing>
180180
<bpmn:serviceTask id="Activity_1ylae1o" name="Create haiku" zeebe:modelerTemplate="io.camunda.connectors.OpenAI.v1" zeebe:modelerTemplateVersion="6" zeebe:modelerTemplateIcon="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjU2cHgiIGhlaWdodD0iMjYwcHgiIHZpZXdCb3g9IjAgMCAyNTYgMjYwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIj4KICAgIDx0aXRsZT5PcGVuQUk8L3RpdGxlPgogICAgPGc+CiAgICAgICAgPHBhdGggZD0iTTIzOS4xODM5MTQsMTA2LjIwMjc4MyBDMjQ1LjA1NDMwNCw4OC41MjQyMDk2IDI0My4wMjIyOCw2OS4xNzMzODA1IDIzMy42MDc1OTksNTMuMDk5ODg2NCBDMjE5LjQ1MTY3OCwyOC40NTg4MDIxIDE5MC45OTk3MDMsMTUuNzgzNjEyOSAxNjMuMjEzMDA3LDIxLjczOTUwNSBDMTQ3LjU1NDA3Nyw0LjMyMTQ1ODgzIDEyMy43OTQ5MDksLTMuNDIzOTg1NTQgMTAwLjg3OTAxLDEuNDE4NzM4OTggQzc3Ljk2MzExMDUsNi4yNjE0NjM0OSA1OS4zNjkwMDkzLDIyLjk1NzI1MzYgNTIuMDk1OTYyMSw0NS4yMjE0MjE5IEMzMy44NDM2NDk0LDQ4Ljk2NDQ4NjcgMTguMDkwMTcyMSw2MC4zOTI3NDkgOC44NjY3MjUxMyw3Ni41ODE4MDMzIEMtNS40NDM0OTEsMTAxLjE4Mjk2MiAtMi4xOTU0NDQzMSwxMzIuMjE1MjU1IDE2Ljg5ODY2NjIsMTUzLjMyMDA5NCBDMTEuMDA2MDg2NSwxNzAuOTkwNjU2IDEzLjAxOTcyODMsMTkwLjM0Mzk5MSAyMi40MjM4MjMxLDIwNi40MjI5OTEgQzM2LjU5NzU1NTMsMjMxLjA3MjM0NCA2NS4wNjgwMzQyLDI0My43NDY1NjYgOTIuODY5NTczOCwyMzcuNzgzMzcyIEMxMDUuMjM1NjM5LDI1MS43MDgyNDkgMTIzLjAwMTExMywyNTkuNjMwOTQyIDE0MS42MjM5NjgsMjU5LjUyNjkyIEMxNzAuMTA1MzU5LDI1OS41NTIxNjkgMTk1LjMzNzYxMSwyNDEuMTY1NzE4IDIwNC4wMzc3NzcsMjE0LjA0NTY2MSBDMjIyLjI4NzM0LDIxMC4yOTYzNTYgMjM4LjAzODQ4OSwxOTguODY5NzgzIDI0Ny4yNjcwMTQsMTgyLjY4NTI4IEMyNjEuNDA0NDUzLDE1OC4xMjc1MTUgMjU4LjE0MjQ5NCwxMjcuMjYyNzc1IDIzOS4xODM5MTQsMTA2LjIwMjc4MyBMMjM5LjE4MzkxNCwxMDYuMjAyNzgzIFogTTE0MS42MjM5NjgsMjQyLjU0MTIwNyBDMTMwLjI1NTY4MiwyNDIuNTU5MTc3IDExOS4yNDM4NzYsMjM4LjU3NDY0MiAxMTAuNTE5MzgxLDIzMS4yODYxOTcgTDExMi4wNTQxNDYsMjMwLjQxNjQ5NiBMMTYzLjcyNDU5NSwyMDAuNTkwODgxIEMxNjYuMzQwNjQ4LDE5OS4wNTY0NDQgMTY3Ljk1NDMyMSwxOTYuMjU2ODE4IDE2Ny45NzA3ODEsMTkzLjIyNDAwNSBMMTY3Ljk3MDc4MSwxMjAuMzczNzg4IEwxODkuODE1NjE0LDEzMy4wMTAwMjYgQzE5MC4wMzQxMzIsMTMzLjEyMTQyMyAxOTAuMTg2MjM1LDEzMy4zMzA1NjQgMTkwLjIyNDg4NSwxMzMuNTcyNzc0IEwxOTAuMjI0ODg1LDE5My45NDAyMjkgQzE5MC4xNjg2MDMsMjIwLjc1ODQyNyAxNjguNDQyMTY2LDI0Mi40ODQ4NjQgMTQxLjYyMzk2OCwyNDIuNTQxMjA3IFogTTM3LjE1NzU3NDksMTk3LjkzMDYyIEMzMS40NTY0OTgsMTg4LjA4NjM1OSAyOS40MDk0ODE4LDE3Ni41NDY5ODQgMzEuMzc2NjIzNywxNjUuMzQyNDI2IEwzMi45MTEzODk1LDE2Ni4yNjMyODUgTDg0LjYzMjk5NzMsMTk2LjA4ODkwMSBDODcuMjM4OTM0OSwxOTcuNjE4MjA3IDkwLjQ2ODI3MTcsMTk3LjYxODIwNyA5My4wNzQyMDkzLDE5Ni4wODg5MDEgTDE1Ni4yNTU0MDIsMTU5LjY2Mzc5MyBMMTU2LjI1NTQwMiwxODQuODg1MTExIEMxNTYuMjQzNTU3LDE4NS4xNDk3NzEgMTU2LjExMTcyNSwxODUuMzk0NjAyIDE1NS44OTcyOSwxODUuNTUwMTc2IEwxMDMuNTYxNzc2LDIxNS43MzM5MDMgQzgwLjMwNTQ5NTMsMjI5LjEzMTYzMiA1MC41OTI0OTU0LDIyMS4xNjU0MzUgMzcuMTU3NTc0OSwxOTcuOTMwNjIgWiBNMjMuNTQ5MzE4MSw4NS4zODExMjczIEMyOS4yODk5ODYxLDc1LjQ3MzMwOTcgMzguMzUxMTkxMSw2Ny45MTYyNjQ4IDQ5LjEyODc0ODIsNjQuMDQ3ODgyNSBMNDkuMTI4NzQ4MiwxMjUuNDM4NTE1IEM0OS4wODkxNDkyLDEyOC40NTk0MjUgNTAuNjk2NTM4NiwxMzEuMjYyNTU2IDUzLjMyMzc3NDgsMTMyLjc1NDIzMiBMMTE2LjE5ODAxNCwxNjkuMDI1ODY0IEw5NC4zNTMxODA4LDE4MS42NjIxMDIgQzk0LjExMzIzMjUsMTgxLjc4OTQzNCA5My44MjU3NDYxLDE4MS43ODk0MzQgOTMuNTg1Nzk3OSwxODEuNjYyMTAyIEw0MS4zNTI2MDE1LDE1MS41Mjk1MzQgQzE4LjE0MTk0MjYsMTM4LjA3NjA5OCAxMC4xODE3NjgxLDEwOC4zODU1NjIgMjMuNTQ5MzE4MSw4NS4xMjUzMzMgTDIzLjU0OTMxODEsODUuMzgxMTI3MyBaIE0yMDMuMDE0NiwxMjcuMDc1NTk4IEwxMzkuOTM1NzI1LDkwLjQ0NTg1NDUgTDE2MS43Mjk0LDc3Ljg2MDc3NDggQzE2MS45NjkzNDgsNzcuNzMzNDQzNCAxNjIuMjU2ODM0LDc3LjczMzQ0MzQgMTYyLjQ5Njc4Myw3Ny44NjA3NzQ4IEwyMTQuNzI5OTc5LDEwOC4wNDQ1MDIgQzIzMS4wMzIzMjksMTE3LjQ1MTc0NyAyNDAuNDM3Mjk0LDEzNS40MjYxMDkgMjM4Ljg3MTUwNCwxNTQuMTgyNzM5IEMyMzcuMzA1NzE0LDE3Mi45MzkzNjggMjI1LjA1MDcxOSwxODkuMTA1NTcyIDIwNy40MTQyNjIsMTk1LjY3OTYzIEwyMDcuNDE0MjYyLDEzNC4yODg5OTggQzIwNy4zMjI1MjEsMTMxLjI3Njg2NyAyMDUuNjUwNjk3LDEyOC41MzU4NTMgMjAzLjAxNDYsMTI3LjA3NTU5OCBaIE0yMjQuNzU3MTE2LDk0LjM4NTA4NjcgTDIyMy4yMjIzNSw5My40NjQyMjcyIEwxNzEuNjAzMDYsNjMuMzgyODE3MyBDMTY4Ljk4MTI5Myw2MS44NDQzNzUxIDE2NS43MzI0NTYsNjEuODQ0Mzc1MSAxNjMuMTEwNjg5LDYzLjM4MjgxNzMgTDk5Ljk4MDY1NTQsOTkuODA3OTI1OSBMOTkuOTgwNjU1NCw3NC41ODY2MDc3IEM5OS45NTMzMDA0LDc0LjMyNTQwODggMTAwLjA3MTA5NSw3NC4wNzAxODY5IDEwMC4yODc2MDksNzMuOTIxNTQyNiBMMTUyLjUyMDgwNSw0My43ODg5NzM4IEMxNjguODYzMDk4LDM0LjM3NDM1MTggMTg5LjE3NDI1NiwzNS4yNTI5MDQzIDIwNC42NDI1NzksNDYuMDQzNDg0MSBDMjIwLjExMDkwMyw1Ni44MzQwNjM4IDIyNy45NDkyNjksNzUuNTkyMzk1OSAyMjQuNzU3MTE2LDk0LjE4MDQ1MTMgTDIyNC43NTcxMTYsOTQuMzg1MDg2NyBaIE04OC4wNjA2NDA5LDEzOS4wOTc5MzEgTDY2LjIxNTgwNzYsMTI2LjUxMjg1MSBDNjUuOTk1MDM5OSwxMjYuMzc5MDkxIDY1Ljg0NTA5NjUsMTI2LjE1NDE3NiA2NS44MDY1MzY3LDEyNS44OTg5NDUgTDY1LjgwNjUzNjcsNjUuNjg0OTY2IEM2NS44MzE0NDk1LDQ2LjgyODUzNjcgNzYuNzUwMDYwNSwyOS42ODQ2MDMyIDkzLjgyNzA4NTIsMjEuNjg4MzA1NSBDMTEwLjkwNDExLDEzLjY5MjAwNzkgMTMxLjA2MzgzMywxNi4yODM1NDYyIDE0NS41NjMyLDI4LjMzODk5OCBMMTQ0LjAyODQzNCwyOS4yMDg2OTg2IEw5Mi4zNTc5ODUyLDU5LjAzNDMxNDIgQzg5Ljc0MTkzMjcsNjAuNTY4NzUxMyA4OC4xMjgyNTk3LDYzLjM2ODM3NjcgODguMTExNzk5OCw2Ni40MDExOTAxIEw4OC4wNjA2NDA5LDEzOS4wOTc5MzEgWiBNOTkuOTI5NDk2NSwxMTMuNTE4NSBMMTI4LjA2Njg3LDk3LjMwMTE0MTcgTDE1Ni4yNTU0MDIsMTEzLjUxODUgTDE1Ni4yNTU0MDIsMTQ1Ljk1MzIxOCBMMTI4LjE2OTE4NywxNjIuMTcwNTc3IEw5OS45ODA2NTU0LDE0NS45NTMyMTggTDk5LjkyOTQ5NjUsMTEzLjUxODUgWiIgZmlsbD0iIzAwMDAwMCI+PC9wYXRoPgogICAgPC9nPgo8L3N2Zz4K">
181181
<bpmn:documentation>Generates haikus based on the user prompt</bpmn:documentation>
182182
<bpmn:extensionElements>
@@ -237,10 +237,6 @@
237237
</bpmn:serviceTask>
238238
</bpmn:adHocSubProcess>
239239
<bpmn:sequenceFlow id="Flow_03l9p18" sourceRef="ReceiveTask_1" targetRef="Agent" />
240-
<bpmn:endEvent id="Event_1aaw7dd">
241-
<bpmn:incoming>Flow_0ucl2ph</bpmn:incoming>
242-
</bpmn:endEvent>
243-
<bpmn:sequenceFlow id="Flow_0ucl2ph" sourceRef="Agent" targetRef="Event_1aaw7dd" />
244240
<bpmn:boundaryEvent id="TimerBoundaryNonInterrupting" name="1 second" cancelActivity="false" attachedToRef="ServiceTask_5">
245241
<bpmn:outgoing>Flow_0nufm4k</bpmn:outgoing>
246242
<bpmn:timerEventDefinition id="TimerEventDefinition_192o2ws">
@@ -271,6 +267,45 @@
271267
<bpmn:incoming>Flow_1m6w5nl</bpmn:incoming>
272268
<bpmn:outgoing>Flow_02ercis</bpmn:outgoing>
273269
</bpmn:serviceTask>
270+
<bpmn:subProcess id="SubProcess_1">
271+
<bpmn:incoming>Flow_11m19en</bpmn:incoming>
272+
<bpmn:outgoing>Flow_0f2v3oj</bpmn:outgoing>
273+
<bpmn:subProcess id="SubProcess_2">
274+
<bpmn:incoming>Flow_18rbqz9</bpmn:incoming>
275+
<bpmn:startEvent id="Event_0b6vor5">
276+
<bpmn:outgoing>Flow_0pzb6a8</bpmn:outgoing>
277+
</bpmn:startEvent>
278+
<bpmn:sequenceFlow id="Flow_0pzb6a8" sourceRef="Event_0b6vor5" targetRef="ScriptTask_2" />
279+
<bpmn:endEvent id="Event_1dg23s5">
280+
<bpmn:incoming>Flow_1n7bzun</bpmn:incoming>
281+
</bpmn:endEvent>
282+
<bpmn:sequenceFlow id="Flow_1n7bzun" sourceRef="ScriptTask_2" targetRef="Event_1dg23s5" />
283+
<bpmn:scriptTask id="ScriptTask_2">
284+
<bpmn:extensionElements>
285+
<zeebe:script expression="=true" resultVariable="scriptTask2" />
286+
</bpmn:extensionElements>
287+
<bpmn:incoming>Flow_0pzb6a8</bpmn:incoming>
288+
<bpmn:outgoing>Flow_1n7bzun</bpmn:outgoing>
289+
</bpmn:scriptTask>
290+
</bpmn:subProcess>
291+
<bpmn:startEvent id="Event_0zpa9tc">
292+
<bpmn:outgoing>Flow_0ek248u</bpmn:outgoing>
293+
</bpmn:startEvent>
294+
<bpmn:sequenceFlow id="Flow_0ek248u" sourceRef="Event_0zpa9tc" targetRef="ScriptTask_1" />
295+
<bpmn:sequenceFlow id="Flow_18rbqz9" sourceRef="ScriptTask_1" targetRef="SubProcess_2" />
296+
<bpmn:scriptTask id="ScriptTask_1">
297+
<bpmn:extensionElements>
298+
<zeebe:script expression="=true" resultVariable="scriptTask1" />
299+
</bpmn:extensionElements>
300+
<bpmn:incoming>Flow_0ek248u</bpmn:incoming>
301+
<bpmn:outgoing>Flow_18rbqz9</bpmn:outgoing>
302+
</bpmn:scriptTask>
303+
</bpmn:subProcess>
304+
<bpmn:sequenceFlow id="Flow_11m19en" sourceRef="Agent" targetRef="SubProcess_1" />
305+
<bpmn:endEvent id="Event_0mamn5m">
306+
<bpmn:incoming>Flow_0f2v3oj</bpmn:incoming>
307+
</bpmn:endEvent>
308+
<bpmn:sequenceFlow id="Flow_0f2v3oj" sourceRef="SubProcess_1" targetRef="Event_0mamn5m" />
274309
</bpmn:process>
275310
<bpmn:message id="Message_21kumir" name="Message">
276311
<bpmn:extensionElements>
@@ -331,6 +366,9 @@
331366
<dc:Bounds x="910" y="320" width="100" height="80" />
332367
<bpmndi:BPMNLabel />
333368
</bpmndi:BPMNShape>
369+
<bpmndi:BPMNShape id="Event_0mamn5m_di" bpmnElement="Event_0mamn5m">
370+
<dc:Bounds x="2552" y="222" width="36" height="36" />
371+
</bpmndi:BPMNShape>
334372
<bpmndi:BPMNShape id="Activity_0sl1og8_di" bpmnElement="Agent" isExpanded="true">
335373
<dc:Bounds x="1350" y="140" width="350" height="200" />
336374
<bpmndi:BPMNLabel />
@@ -343,9 +381,43 @@
343381
<dc:Bounds x="1400" y="200" width="100" height="80" />
344382
<bpmndi:BPMNLabel />
345383
</bpmndi:BPMNShape>
346-
<bpmndi:BPMNShape id="Event_1aaw7dd_di" bpmnElement="Event_1aaw7dd">
347-
<dc:Bounds x="1742" y="222" width="36" height="36" />
384+
<bpmndi:BPMNShape id="Activity_0upgd3o_di" bpmnElement="SubProcess_1" isExpanded="true">
385+
<dc:Bounds x="1750" y="80" width="750" height="320" />
386+
</bpmndi:BPMNShape>
387+
<bpmndi:BPMNShape id="Event_0zpa9tc_di" bpmnElement="Event_0zpa9tc">
388+
<dc:Bounds x="1782" y="222" width="36" height="36" />
389+
</bpmndi:BPMNShape>
390+
<bpmndi:BPMNShape id="Activity_1ucc0gl_di" bpmnElement="ScriptTask_1">
391+
<dc:Bounds x="1870" y="200" width="100" height="80" />
392+
</bpmndi:BPMNShape>
393+
<bpmndi:BPMNShape id="Activity_11zlknj_di" bpmnElement="SubProcess_2" isExpanded="true">
394+
<dc:Bounds x="2020" y="140" width="370" height="200" />
395+
</bpmndi:BPMNShape>
396+
<bpmndi:BPMNShape id="Event_0b6vor5_di" bpmnElement="Event_0b6vor5">
397+
<dc:Bounds x="2060" y="222" width="36" height="36" />
398+
</bpmndi:BPMNShape>
399+
<bpmndi:BPMNShape id="Event_1dg23s5_di" bpmnElement="Event_1dg23s5">
400+
<dc:Bounds x="2312" y="222" width="36" height="36" />
348401
</bpmndi:BPMNShape>
402+
<bpmndi:BPMNShape id="Activity_0qzqnkg_di" bpmnElement="ScriptTask_2">
403+
<dc:Bounds x="2150" y="200" width="100" height="80" />
404+
</bpmndi:BPMNShape>
405+
<bpmndi:BPMNEdge id="Flow_0pzb6a8_di" bpmnElement="Flow_0pzb6a8">
406+
<di:waypoint x="2096" y="240" />
407+
<di:waypoint x="2150" y="240" />
408+
</bpmndi:BPMNEdge>
409+
<bpmndi:BPMNEdge id="Flow_1n7bzun_di" bpmnElement="Flow_1n7bzun">
410+
<di:waypoint x="2250" y="240" />
411+
<di:waypoint x="2312" y="240" />
412+
</bpmndi:BPMNEdge>
413+
<bpmndi:BPMNEdge id="Flow_0ek248u_di" bpmnElement="Flow_0ek248u">
414+
<di:waypoint x="1818" y="240" />
415+
<di:waypoint x="1870" y="240" />
416+
</bpmndi:BPMNEdge>
417+
<bpmndi:BPMNEdge id="Flow_18rbqz9_di" bpmnElement="Flow_18rbqz9">
418+
<di:waypoint x="1970" y="240" />
419+
<di:waypoint x="2020" y="240" />
420+
</bpmndi:BPMNEdge>
349421
<bpmndi:BPMNShape id="Event_12ea3ob_di" bpmnElement="TimerBoundaryNonInterrupting">
350422
<dc:Bounds x="822" y="182" width="36" height="36" />
351423
<bpmndi:BPMNLabel>
@@ -394,10 +466,6 @@
394466
<di:waypoint x="1310" y="240" />
395467
<di:waypoint x="1350" y="240" />
396468
</bpmndi:BPMNEdge>
397-
<bpmndi:BPMNEdge id="Flow_0ucl2ph_di" bpmnElement="Flow_0ucl2ph">
398-
<di:waypoint x="1700" y="240" />
399-
<di:waypoint x="1742" y="240" />
400-
</bpmndi:BPMNEdge>
401469
<bpmndi:BPMNEdge id="Flow_0nufm4k_di" bpmnElement="Flow_0nufm4k">
402470
<di:waypoint x="840" y="182" />
403471
<di:waypoint x="840" y="120" />
@@ -416,6 +484,14 @@
416484
<di:waypoint x="1010" y="360" />
417485
<di:waypoint x="1062" y="360" />
418486
</bpmndi:BPMNEdge>
487+
<bpmndi:BPMNEdge id="Flow_11m19en_di" bpmnElement="Flow_11m19en">
488+
<di:waypoint x="1700" y="240" />
489+
<di:waypoint x="1750" y="240" />
490+
</bpmndi:BPMNEdge>
491+
<bpmndi:BPMNEdge id="Flow_0f2v3oj_di" bpmnElement="Flow_0f2v3oj">
492+
<di:waypoint x="2500" y="240" />
493+
<di:waypoint x="2552" y="240" />
494+
</bpmndi:BPMNEdge>
419495
</bpmndi:BPMNPlane>
420496
</bpmndi:BPMNDiagram>
421497
</bpmn:definitions>

lib/TaskExecution.js

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,16 @@ export default class TaskExecution extends EventEmitter {
156156

157157
const waitingItems = buildWaitingItems(jobsResult, userTasksResult, messageSubscriptionsResult, elementInstancesResult);
158158

159+
// Emit child elements (sub-process internals) before waiting items
160+
const childElements = buildChildElements(elementInstancesResult, element.id);
161+
if (childElements.length) {
162+
this.emit('taskExecution.log', {
163+
type: 'children',
164+
items: childElements,
165+
timestamp: Date.now()
166+
});
167+
}
168+
159169
if (waitingItems.length) {
160170

161171
/** @type {import('./types').ExecutionLogEntry} */
@@ -269,6 +279,16 @@ export default class TaskExecution extends EventEmitter {
269279
element.id
270280
);
271281

282+
// Emit final child elements before completion status
283+
const finalChildren = buildChildElements(getProcessInstanceElementInstancesResult, element.id);
284+
if (finalChildren.length) {
285+
this.emit('taskExecution.log', {
286+
type: 'children',
287+
items: finalChildren,
288+
timestamp: Date.now()
289+
});
290+
}
291+
272292
this.emit('taskExecution.log', {
273293
type: 'status',
274294
status: incident ? 'incident' : 'completed',
@@ -562,4 +582,39 @@ function getItemTimestamp(item) {
562582
}
563583

564584
return Date.now();
585+
}
586+
587+
/**
588+
* Element types that are interesting to show as sub-process children.
589+
*/
590+
const CHILD_ELEMENT_TYPES = new Set([
591+
'SERVICE_TASK', 'USER_TASK', 'SEND_TASK', 'RECEIVE_TASK',
592+
'SCRIPT_TASK', 'BUSINESS_RULE_TASK', 'MANUAL_TASK', 'TASK',
593+
'SUB_PROCESS', 'AD_HOC_SUB_PROCESS', 'CALL_ACTIVITY'
594+
]);
595+
596+
/**
597+
* Build a list of child element instances (tasks executed inside a sub-process).
598+
*
599+
* @param {import('./types').ApiResponse<import('@camunda8/sdk/dist/c8/lib/C8Dto').SearchElementInstancesResponse>} elementInstancesResult
600+
* @param {string} elementId - the element being tested (excluded from children)
601+
* @returns {import('./types').ChildElement[]}
602+
*/
603+
export function buildChildElements(elementInstancesResult, elementId) {
604+
if (!elementInstancesResult.success) {
605+
return [];
606+
}
607+
608+
return (elementInstancesResult.response.items || [])
609+
.filter(el => el.elementId !== elementId && CHILD_ELEMENT_TYPES.has(el.type))
610+
.map(el => ({
611+
elementId: el.elementId,
612+
elementName: el.elementName,
613+
type: el.type,
614+
state: el.state,
615+
startDate: el.startDate,
616+
endDate: el.endDate,
617+
hasIncident: el.hasIncident
618+
}))
619+
.sort((a, b) => new Date(a.startDate).getTime() - new Date(b.startDate).getTime());
565620
}

lib/components/Output/ExecutionLog.jsx

Lines changed: 66 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -246,28 +246,32 @@ export function ExecutionLog({ entries, tasklistBaseUrl, currentOperateUrl, onSe
246246
return (
247247
<div className="execution-log">
248248
<ol className="execution-log__entries">
249-
{ displayEntries.map((entry, index) => {
250-
const isLast = index === displayEntries.length - 1;
251-
252-
if (entry.type === 'status') {
253-
return <StatusEntry key={ index } entry={ entry } isLast={ isLast } />;
254-
}
255-
256-
if (entry.type === 'waiting') {
257-
return <WaitingEntry key={ index } entry={ entry } isLast={ isLast } isFinished={ isFinished } onSelectElement={ onSelectElement } />;
258-
}
259-
260-
return null;
261-
}) }
262-
</ol>
263-
{ lastEntry.type === 'waiting' && <UserTaskCallToAction
264-
items={ lastEntry.items }
265-
tasklistBaseUrl={ tasklistBaseUrl }
266-
/> }
267-
{ lastEntry.type === 'waiting' && <MessageSubscriptionCallToAction
268-
items={ lastEntry.items }
269-
currentOperateUrl={ currentOperateUrl }
270-
/> }
249+
{ displayEntries.map((entry, index) => {
250+
const isLast = index === displayEntries.length - 1;
251+
252+
if (entry.type === 'status') {
253+
return <StatusEntry key={ index } entry={ entry } isLast={ isLast } />;
254+
}
255+
256+
if (entry.type === 'children') {
257+
return <ChildrenEntry key={ index } entry={ entry } />;
258+
}
259+
260+
if (entry.type === 'waiting') {
261+
return <WaitingEntry key={ index } entry={ entry } isLast={ isLast } isFinished={ isFinished } onSelectElement={ onSelectElement } />;
262+
}
263+
264+
return null;
265+
}) }
266+
</ol>
267+
{ lastEntry.type === 'waiting' && <UserTaskCallToAction
268+
items={ lastEntry.items }
269+
tasklistBaseUrl={ tasklistBaseUrl }
270+
/> }
271+
{ lastEntry.type === 'waiting' && <MessageSubscriptionCallToAction
272+
items={ lastEntry.items }
273+
currentOperateUrl={ currentOperateUrl }
274+
/> }
271275
</div>
272276
);
273277
}
@@ -297,6 +301,46 @@ function StatusEntry({ entry, isLast }) {
297301
);
298302
}
299303

304+
function ChildrenEntry({ entry }) {
305+
if (!entry.items?.length) {
306+
return null;
307+
}
308+
309+
return (
310+
<li className="execution-log__children">
311+
<span className="execution-log__children-header">Executed elements</span>
312+
<ol className="execution-log__children-list">
313+
{ entry.items.map((child, index) => {
314+
const isActive = child.state === 'ACTIVE';
315+
const isIncident = child.hasIncident;
316+
317+
let dotClass = 'execution-log__dot';
318+
if (isIncident) {
319+
dotClass += ' execution-log__dot--error';
320+
} else if (isActive) {
321+
dotClass += ' execution-log__dot--pending';
322+
}
323+
324+
const name = child.elementName || child.elementId;
325+
const time = child.startDate
326+
? formatTime(new Date(child.startDate).getTime())
327+
: '';
328+
329+
return (
330+
<li key={ index } className="execution-log__child-item">
331+
<span className={ dotClass } />
332+
<div className="execution-log__entry">
333+
<span className="execution-log__label">{ name }</span>
334+
<span className="execution-log__timestamp">{ time }</span>
335+
</div>
336+
</li>
337+
);
338+
}) }
339+
</ol>
340+
</li>
341+
);
342+
}
343+
300344
function WaitingEntry({ entry, isLast, isFinished, onSelectElement }) {
301345
if (!entry.items?.length) {
302346
return null;

lib/components/TaskTesting/TaskTesting.js

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,8 +295,20 @@ export default function TaskTesting({
295295
setExecutionLog(log => {
296296
let updated;
297297

298-
if (entry.type === 'waiting' && log.length && log[log.length - 1].type === 'waiting') {
299-
updated = [ ...log.slice(0, -1), entry ];
298+
if (entry.type === 'waiting') {
299+
300+
// Remove any existing waiting entry, always keep at end
301+
const filtered = log.filter(e => e.type !== 'waiting');
302+
updated = [ ...filtered, entry ];
303+
} else if (entry.type === 'children') {
304+
305+
// Replace existing children entry in place, or append
306+
const existingIndex = log.findIndex(e => e.type === 'children');
307+
if (existingIndex >= 0) {
308+
updated = [ ...log.slice(0, existingIndex), entry, ...log.slice(existingIndex + 1) ];
309+
} else {
310+
updated = [ ...log, entry ];
311+
}
300312
} else {
301313
updated = [ ...log, entry ];
302314
}

lib/style/style.scss

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,43 @@
506506
}
507507
}
508508

509+
.execution-log__children {
510+
position: relative;
511+
padding: 6px 0;
512+
}
513+
514+
.execution-log__children-header {
515+
font-size: 11px;
516+
font-weight: 600;
517+
color: #a8a8a8;
518+
text-transform: uppercase;
519+
letter-spacing: 0.5px;
520+
padding-left: 8px;
521+
}
522+
523+
.execution-log__children-list {
524+
list-style: none;
525+
margin: 4px 0 0 0;
526+
padding: 0 0 0 16px;
527+
position: relative;
528+
}
529+
530+
.execution-log__child-item {
531+
position: relative;
532+
padding: 3px 0;
533+
534+
.execution-log__dot {
535+
width: 6px;
536+
height: 6px;
537+
left: -13px;
538+
top: 9px;
539+
}
540+
541+
.execution-log__entry {
542+
font-size: 13px;
543+
}
544+
}
545+
509546
.execution-log__dot {
510547
position: absolute;
511548
left: -16px;

0 commit comments

Comments
 (0)