From edc57810e25ce54746166bae68a55fed8ad2de8d Mon Sep 17 00:00:00 2001 From: peterlau Date: Thu, 11 Aug 2022 14:36:43 -0700 Subject: [PATCH] [UI] Fix edge case where tasks have refs that resemble those inside of a loop. Format code. --- .../fixtures/doWhile/doWhileSwitch.json | 757 +++++++++--------- ui/src/components/KeyValueTable.jsx | 17 +- ui/src/components/ReactJson.jsx | 9 +- ui/src/components/diagram/WorkflowDAG.js | 36 +- .../diagram/WorkflowGraph.test.cy.js | 29 +- ui/src/pages/execution/TaskSummary.jsx | 5 +- 6 files changed, 441 insertions(+), 412 deletions(-) diff --git a/ui/cypress/fixtures/doWhile/doWhileSwitch.json b/ui/cypress/fixtures/doWhile/doWhileSwitch.json index 65de6e27fd..d19b33d6e8 100644 --- a/ui/cypress/fixtures/doWhile/doWhileSwitch.json +++ b/ui/cypress/fixtures/doWhile/doWhileSwitch.json @@ -1,401 +1,416 @@ { - "createTime": 1660244521990, - "status": "COMPLETED", - "endTime": 1660244523050, - "workflowId": "c56d02d5-cc01-4a82-a611-00a3f7f56305", - "tasks": [ - { - "taskType": "DO_WHILE", - "status": "COMPLETED", - "inputData": { - "value": null + "ownerApp": "nq_mwi_conductor_ui_server", + "createTime": 1660252744369, + "status": "COMPLETED", + "endTime": 1660252745449, + "workflowId": "9aaf69a6-9c61-4460-93b5-0a657a084ba4", + "tasks": [ + { + "taskType": "INLINE", + "status": "COMPLETED", + "inputData": { + "evaluatorType": "javascript", + "expression": "1", + "value": null + }, + "referenceTaskName": "inline_task_outside", + "retryCount": 0, + "seq": 1, + "pollCount": 0, + "taskDefName": "inline_task_outside", + "scheduledTime": 1660252744439, + "startTime": 1660252744437, + "endTime": 1660252744504, + "updateTime": 1660252744446, + "startDelayInSeconds": 0, + "retried": false, + "executed": true, + "callbackFromWorker": true, + "responseTimeoutSeconds": 0, + "workflowInstanceId": "9aaf69a6-9c61-4460-93b5-0a657a084ba4", + "workflowType": "LoopTestWithSwitch", + "taskId": "07ae873e-5316-4e89-9c1e-a9cab711f1a2", + "callbackAfterSeconds": 0, + "outputData": { + "result": 1 + }, + "workflowTask": { + "name": "inline_task_outside", + "taskReferenceName": "inline_task_outside", + "inputParameters": { + "value": "${workflow.input.value}", + "evaluatorType": "javascript", + "expression": "1" }, - "referenceTaskName": "LoopTask", - "retryCount": 0, - "seq": 1, - "pollCount": 0, - "taskDefName": "Loop Task", - "scheduledTime": 1660244522071, - "startTime": 1660244522070, - "endTime": 1660244522935, - "updateTime": 1660244522201, - "startDelayInSeconds": 0, - "retried": false, - "executed": false, - "callbackFromWorker": true, - "responseTimeoutSeconds": 0, - "workflowInstanceId": "c56d02d5-cc01-4a82-a611-00a3f7f56305", - "workflowType": "LoopTestWithSwitch", - "taskId": "426d651c-0c8c-498f-b328-10b0dc2d37d3", - "callbackAfterSeconds": 0, - "outputData": { - "1": { - "inline_task_1": { - "result": { - "result": "NODE_2" - } - }, - "Set_NODE_2": {}, - "switch_task": { - "evaluationResult": [ - "NODE_2" - ] + "type": "INLINE", + "startDelay": 0, + "optional": false, + "asyncComplete": false + }, + "rateLimitPerFrequency": 0, + "rateLimitFrequencyInSeconds": 0, + "workflowPriority": 0, + "iteration": 0, + "subworkflowChanged": false, + "taskDefinition": null, + "queueWaitTime": -2, + "loopOverTask": false + }, + { + "taskType": "DO_WHILE", + "status": "COMPLETED", + "inputData": { + "value": null + }, + "referenceTaskName": "LoopTask", + "retryCount": 0, + "seq": 2, + "pollCount": 0, + "taskDefName": "Loop Task", + "scheduledTime": 1660252744620, + "startTime": 1660252744618, + "endTime": 1660252745337, + "updateTime": 1660252744808, + "startDelayInSeconds": 0, + "retried": false, + "executed": false, + "callbackFromWorker": true, + "responseTimeoutSeconds": 0, + "workflowInstanceId": "9aaf69a6-9c61-4460-93b5-0a657a084ba4", + "workflowType": "LoopTestWithSwitch", + "taskId": "790126b0-81e8-4286-ac65-d1f4c8eca271", + "callbackAfterSeconds": 0, + "outputData": { + "1": { + "inline_task": { + "result": { + "result": "NODE_2" } }, - "iteration": 1 + "switch_task": { + "evaluationResult": ["null"] + } }, - "workflowTask": { - "name": "Loop Task", - "taskReferenceName": "LoopTask", - "inputParameters": { - "value": "${workflow.input.value}" + "iteration": 1 + }, + "workflowTask": { + "name": "Loop Task", + "taskReferenceName": "LoopTask", + "inputParameters": { + "value": "${workflow.input.value}" + }, + "type": "DO_WHILE", + "startDelay": 0, + "optional": false, + "asyncComplete": false, + "loopCondition": "false", + "loopOver": [ + { + "name": "inline_task", + "taskReferenceName": "inline_task", + "inputParameters": { + "value": "${workflow.input.value}", + "evaluatorType": "javascript", + "expression": "function e() { if ($.value == 1){return {\"result\": 'NODE_1'}} else { return {\"result\": 'NODE_2'}}} e();" + }, + "type": "INLINE", + "startDelay": 0, + "optional": false, + "asyncComplete": false }, - "type": "DO_WHILE", - "startDelay": 0, - "optional": false, - "asyncComplete": false, - "loopCondition": "false", - "loopOver": [ + { + "name": "switch_task", + "taskReferenceName": "switch_task", + "inputParameters": { + "switchCaseValue": "${inline_task_1.output.result.result}" + }, + "type": "SWITCH", + "decisionCases": { + "NODE_1": [ + { + "name": "Set_NODE_1", + "taskReferenceName": "Set_NODE_1", + "inputParameters": { + "node": "NODE_1" + }, + "type": "SET_VARIABLE", + "startDelay": 0, + "optional": false, + "asyncComplete": false + } + ], + "NODE_2": [ + { + "name": "Set_NODE_2", + "taskReferenceName": "Set_NODE_2", + "inputParameters": { + "node": "NODE_2" + }, + "type": "SET_VARIABLE", + "startDelay": 0, + "optional": false, + "asyncComplete": false + } + ] + }, + "startDelay": 0, + "optional": false, + "asyncComplete": false, + "evaluatorType": "value-param", + "expression": "switchCaseValue" + } + ] + }, + "rateLimitPerFrequency": 0, + "rateLimitFrequencyInSeconds": 1, + "workflowPriority": 0, + "iteration": 1, + "subworkflowChanged": false, + "taskDefinition": null, + "queueWaitTime": -2, + "loopOverTask": true + }, + { + "taskType": "INLINE", + "status": "COMPLETED", + "inputData": { + "evaluatorType": "javascript", + "expression": "function e() { if ($.value == 1){return {\"result\": 'NODE_1'}} else { return {\"result\": 'NODE_2'}}} e();", + "value": null + }, + "referenceTaskName": "inline_task__1", + "retryCount": 0, + "seq": 3, + "pollCount": 0, + "taskDefName": "inline_task", + "scheduledTime": 1660252744696, + "startTime": 1660252744693, + "endTime": 1660252744931, + "updateTime": 1660252744702, + "startDelayInSeconds": 0, + "retried": false, + "executed": true, + "callbackFromWorker": true, + "responseTimeoutSeconds": 0, + "workflowInstanceId": "9aaf69a6-9c61-4460-93b5-0a657a084ba4", + "workflowType": "LoopTestWithSwitch", + "taskId": "27f7fbc4-325b-43c4-872f-37dc64c9dab0", + "callbackAfterSeconds": 0, + "outputData": { + "result": { + "result": "NODE_2" + } + }, + "workflowTask": { + "name": "inline_task", + "taskReferenceName": "inline_task", + "inputParameters": { + "value": "${workflow.input.value}", + "evaluatorType": "javascript", + "expression": "function e() { if ($.value == 1){return {\"result\": 'NODE_1'}} else { return {\"result\": 'NODE_2'}}} e();" + }, + "type": "INLINE", + "startDelay": 0, + "optional": false, + "asyncComplete": false + }, + "rateLimitPerFrequency": 0, + "rateLimitFrequencyInSeconds": 0, + "workflowPriority": 0, + "iteration": 1, + "subworkflowChanged": false, + "taskDefinition": null, + "queueWaitTime": -3, + "loopOverTask": true + }, + { + "taskType": "SWITCH", + "status": "COMPLETED", + "inputData": { + "case": "null" + }, + "referenceTaskName": "switch_task__1", + "retryCount": 0, + "seq": 4, + "pollCount": 0, + "taskDefName": "SWITCH", + "scheduledTime": 1660252745049, + "startTime": 1660252745047, + "endTime": 1660252745163, + "updateTime": 1660252745056, + "startDelayInSeconds": 0, + "retried": false, + "executed": true, + "callbackFromWorker": true, + "responseTimeoutSeconds": 0, + "workflowInstanceId": "9aaf69a6-9c61-4460-93b5-0a657a084ba4", + "workflowType": "LoopTestWithSwitch", + "taskId": "2e2a0836-a2e6-4902-9e41-9bbc2c75e0ed", + "callbackAfterSeconds": 0, + "outputData": { + "evaluationResult": ["null"] + }, + "workflowTask": { + "name": "switch_task", + "taskReferenceName": "switch_task", + "inputParameters": { + "switchCaseValue": "${inline_task_1.output.result.result}" + }, + "type": "SWITCH", + "decisionCases": { + "NODE_1": [ { - "name": "inline_task_1", - "taskReferenceName": "inline_task_1", + "name": "Set_NODE_1", + "taskReferenceName": "Set_NODE_1", "inputParameters": { - "value": "${workflow.input.value}", - "evaluatorType": "javascript", - "expression": "function e() { if ($.value == 1){return {\"result\": 'NODE_1'}} else { return {\"result\": 'NODE_2'}}} e();" + "node": "NODE_1" }, - "type": "INLINE", + "type": "SET_VARIABLE", "startDelay": 0, "optional": false, "asyncComplete": false - }, + } + ], + "NODE_2": [ { - "name": "switch_task", - "taskReferenceName": "switch_task", + "name": "Set_NODE_2", + "taskReferenceName": "Set_NODE_2", "inputParameters": { - "switchCaseValue": "${inline_task_1.output.result.result}" - }, - "type": "SWITCH", - "decisionCases": { - "NODE_1": [ - { - "name": "Set_NODE_1", - "taskReferenceName": "Set_NODE_1", - "inputParameters": { - "node": "NODE_1" - }, - "type": "SET_VARIABLE", - "startDelay": 0, - "optional": false, - "asyncComplete": false - } - ], - "NODE_2": [ - { - "name": "Set_NODE_2", - "taskReferenceName": "Set_NODE_2", - "inputParameters": { - "node": "NODE_2" - }, - "type": "SET_VARIABLE", - "startDelay": 0, - "optional": false, - "asyncComplete": false - } - ] + "node": "NODE_2" }, + "type": "SET_VARIABLE", "startDelay": 0, "optional": false, - "asyncComplete": false, - "evaluatorType": "value-param", - "expression": "switchCaseValue" + "asyncComplete": false } ] }, - "rateLimitPerFrequency": 0, - "rateLimitFrequencyInSeconds": 1, - "workflowPriority": 0, - "iteration": 1, - "subworkflowChanged": false, - "taskDefinition": null, - "queueWaitTime": -1, - "loopOverTask": true + "startDelay": 0, + "optional": false, + "asyncComplete": false, + "evaluatorType": "value-param", + "expression": "switchCaseValue" }, + "rateLimitPerFrequency": 0, + "rateLimitFrequencyInSeconds": 0, + "workflowPriority": 0, + "iteration": 1, + "subworkflowChanged": false, + "taskDefinition": null, + "queueWaitTime": -2, + "loopOverTask": true + } + ], + "input": {}, + "output": { + "evaluationResult": ["null"] + }, + "taskToDomain": {}, + "failedReferenceTaskNames": [], + "workflowDefinition": { + "createTime": 1660244498873, + "updateTime": 1660252731854, + "name": "LoopTestWithSwitch", + "description": "Loop Test With Switch WF", + "version": 3, + "tasks": [ { - "taskType": "INLINE", - "status": "COMPLETED", - "inputData": { + "name": "inline_task_outside", + "taskReferenceName": "inline_task_outside", + "inputParameters": { + "value": "${workflow.input.value}", "evaluatorType": "javascript", - "expression": "function e() { if ($.value == 1){return {\"result\": 'NODE_1'}} else { return {\"result\": 'NODE_2'}}} e();", - "value": null - }, - "referenceTaskName": "inline_task_1__1", - "retryCount": 0, - "seq": 2, - "pollCount": 0, - "taskDefName": "inline_task_1", - "scheduledTime": 1660244522137, - "startTime": 1660244522134, - "endTime": 1660244522361, - "updateTime": 1660244522146, - "startDelayInSeconds": 0, - "retried": false, - "executed": true, - "callbackFromWorker": true, - "responseTimeoutSeconds": 0, - "workflowInstanceId": "c56d02d5-cc01-4a82-a611-00a3f7f56305", - "workflowType": "LoopTestWithSwitch", - "taskId": "19b0ecc8-37cb-4038-857a-8e9b885acdf0", - "callbackAfterSeconds": 0, - "outputData": { - "result": { - "result": "NODE_2" - } - }, - "workflowTask": { - "name": "inline_task_1", - "taskReferenceName": "inline_task_1", - "inputParameters": { - "value": "${workflow.input.value}", - "evaluatorType": "javascript", - "expression": "function e() { if ($.value == 1){return {\"result\": 'NODE_1'}} else { return {\"result\": 'NODE_2'}}} e();" - }, - "type": "INLINE", - "startDelay": 0, - "optional": false, - "asyncComplete": false - }, - "rateLimitPerFrequency": 0, - "rateLimitFrequencyInSeconds": 0, - "workflowPriority": 0, - "iteration": 1, - "subworkflowChanged": false, - "taskDefinition": null, - "queueWaitTime": -3, - "loopOverTask": true - }, - { - "taskType": "SWITCH", - "status": "COMPLETED", - "inputData": { - "hasChildren": "true", - "case": "NODE_2" - }, - "referenceTaskName": "switch_task__1", - "retryCount": 0, - "seq": 3, - "pollCount": 0, - "taskDefName": "SWITCH", - "scheduledTime": 1660244522479, - "startTime": 1660244522477, - "endTime": 1660244522654, - "updateTime": 1660244522489, - "startDelayInSeconds": 0, - "retried": false, - "executed": true, - "callbackFromWorker": true, - "responseTimeoutSeconds": 0, - "workflowInstanceId": "c56d02d5-cc01-4a82-a611-00a3f7f56305", - "workflowType": "LoopTestWithSwitch", - "taskId": "aabe9d65-0f11-4d95-b8f6-e4c21cb544cb", - "callbackAfterSeconds": 0, - "outputData": { - "evaluationResult": [ - "NODE_2" - ] - }, - "workflowTask": { - "name": "switch_task", - "taskReferenceName": "switch_task", - "inputParameters": { - "switchCaseValue": "${inline_task_1.output.result.result}" - }, - "type": "SWITCH", - "decisionCases": { - "NODE_1": [ - { - "name": "Set_NODE_1", - "taskReferenceName": "Set_NODE_1", - "inputParameters": { - "node": "NODE_1" - }, - "type": "SET_VARIABLE", - "startDelay": 0, - "optional": false, - "asyncComplete": false - } - ], - "NODE_2": [ - { - "name": "Set_NODE_2", - "taskReferenceName": "Set_NODE_2", - "inputParameters": { - "node": "NODE_2" - }, - "type": "SET_VARIABLE", - "startDelay": 0, - "optional": false, - "asyncComplete": false - } - ] - }, - "startDelay": 0, - "optional": false, - "asyncComplete": false, - "evaluatorType": "value-param", - "expression": "switchCaseValue" + "expression": "1" }, - "rateLimitPerFrequency": 0, - "rateLimitFrequencyInSeconds": 0, - "workflowPriority": 0, - "iteration": 1, - "subworkflowChanged": false, - "taskDefinition": null, - "queueWaitTime": -2, - "loopOverTask": true + "type": "INLINE", + "startDelay": 0, + "optional": false, + "asyncComplete": false }, { - "taskType": "SET_VARIABLE", - "status": "COMPLETED", - "inputData": { - "node": "NODE_2" + "name": "Loop Task", + "taskReferenceName": "LoopTask", + "inputParameters": { + "value": "${workflow.input.value}" }, - "referenceTaskName": "Set_NODE_2__1", - "retryCount": 0, - "seq": 4, - "pollCount": 0, - "taskDefName": "Set_NODE_2", - "scheduledTime": 1660244522482, - "startTime": 1660244522477, - "endTime": 1660244522709, - "updateTime": 1660244522542, - "startDelayInSeconds": 0, - "retried": false, - "executed": true, - "callbackFromWorker": true, - "responseTimeoutSeconds": 0, - "workflowInstanceId": "c56d02d5-cc01-4a82-a611-00a3f7f56305", - "workflowType": "LoopTestWithSwitch", - "taskId": "eeda447b-4040-47e1-935a-af9f62d30ce9", - "callbackAfterSeconds": 0, - "outputData": {}, - "workflowTask": { - "name": "Set_NODE_2", - "taskReferenceName": "Set_NODE_2", - "inputParameters": { - "node": "NODE_2" + "type": "DO_WHILE", + "startDelay": 0, + "optional": false, + "asyncComplete": false, + "loopCondition": "false", + "loopOver": [ + { + "name": "inline_task", + "taskReferenceName": "inline_task", + "inputParameters": { + "value": "${workflow.input.value}", + "evaluatorType": "javascript", + "expression": "function e() { if ($.value == 1){return {\"result\": 'NODE_1'}} else { return {\"result\": 'NODE_2'}}} e();" + }, + "type": "INLINE", + "startDelay": 0, + "optional": false, + "asyncComplete": false }, - "type": "SET_VARIABLE", - "startDelay": 0, - "optional": false, - "asyncComplete": false - }, - "rateLimitPerFrequency": 0, - "rateLimitFrequencyInSeconds": 0, - "workflowPriority": 0, - "iteration": 1, - "subworkflowChanged": false, - "taskDefinition": null, - "queueWaitTime": -5, - "loopOverTask": true + { + "name": "switch_task", + "taskReferenceName": "switch_task", + "inputParameters": { + "switchCaseValue": "${inline_task_1.output.result.result}" + }, + "type": "SWITCH", + "decisionCases": { + "NODE_1": [ + { + "name": "Set_NODE_1", + "taskReferenceName": "Set_NODE_1", + "inputParameters": { + "node": "NODE_1" + }, + "type": "SET_VARIABLE", + "startDelay": 0, + "optional": false, + "asyncComplete": false + } + ], + "NODE_2": [ + { + "name": "Set_NODE_2", + "taskReferenceName": "Set_NODE_2", + "inputParameters": { + "node": "NODE_2" + }, + "type": "SET_VARIABLE", + "startDelay": 0, + "optional": false, + "asyncComplete": false + } + ] + }, + "startDelay": 0, + "optional": false, + "asyncComplete": false, + "evaluatorType": "value-param", + "expression": "switchCaseValue" + } + ] } ], - "input": {}, - "output": {}, - "taskToDomain": {}, - "failedReferenceTaskNames": [], - "workflowDefinition": { - "createTime": 1660244498873, - "name": "LoopTestWithSwitch", - "description": "Loop Test With Switch WF", - "version": 1, - "tasks": [ - { - "name": "Loop Task", - "taskReferenceName": "LoopTask", - "inputParameters": { - "value": "${workflow.input.value}" - }, - "type": "DO_WHILE", - "startDelay": 0, - "optional": false, - "asyncComplete": false, - "loopCondition": "false", - "loopOver": [ - { - "name": "inline_task_1", - "taskReferenceName": "inline_task_1", - "inputParameters": { - "value": "${workflow.input.value}", - "evaluatorType": "javascript", - "expression": "function e() { if ($.value == 1){return {\"result\": 'NODE_1'}} else { return {\"result\": 'NODE_2'}}} e();" - }, - "type": "INLINE", - "startDelay": 0, - "optional": false, - "asyncComplete": false - }, - { - "name": "switch_task", - "taskReferenceName": "switch_task", - "inputParameters": { - "switchCaseValue": "${inline_task_1.output.result.result}" - }, - "type": "SWITCH", - "decisionCases": { - "NODE_1": [ - { - "name": "Set_NODE_1", - "taskReferenceName": "Set_NODE_1", - "inputParameters": { - "node": "NODE_1" - }, - "type": "SET_VARIABLE", - "startDelay": 0, - "optional": false, - "asyncComplete": false - } - ], - "NODE_2": [ - { - "name": "Set_NODE_2", - "taskReferenceName": "Set_NODE_2", - "inputParameters": { - "node": "NODE_2" - }, - "type": "SET_VARIABLE", - "startDelay": 0, - "optional": false, - "asyncComplete": false - } - ] - }, - "startDelay": 0, - "optional": false, - "asyncComplete": false, - "evaluatorType": "value-param", - "expression": "switchCaseValue" - } - ] - } - ], - "inputParameters": [], - "outputParameters": {}, - "schemaVersion": 2, - "restartable": true, - "workflowStatusListenerEnabled": true, - "ownerEmail": "abc@example.com", - "timeoutPolicy": "ALERT_ONLY", - "timeoutSeconds": 0, - "variables": {}, - "inputTemplate": {} - }, - "priority": 0, - "variables": { - "node": "NODE_2" - }, - "lastRetriedTime": 0, - "startTime": 1660244521990, - "workflowName": "LoopTestWithSwitch", - "workflowVersion": 1 - } \ No newline at end of file + "inputParameters": [], + "outputParameters": {}, + "schemaVersion": 2, + "restartable": true, + "workflowStatusListenerEnabled": true, + "ownerEmail": "abc@example.com", + "timeoutPolicy": "ALERT_ONLY", + "timeoutSeconds": 0, + "variables": {}, + "inputTemplate": {} + }, + "priority": 0, + "variables": {}, + "lastRetriedTime": 0, + "startTime": 1660252744369, + "workflowName": "LoopTestWithSwitch", + "workflowVersion": 3 +} diff --git a/ui/src/components/KeyValueTable.jsx b/ui/src/components/KeyValueTable.jsx index cd26db2c4c..d8ea29175a 100644 --- a/ui/src/components/KeyValueTable.jsx +++ b/ui/src/components/KeyValueTable.jsx @@ -63,7 +63,6 @@ export default function KeyValueTable({ data }) { } return ( - - - {displayValue} - } + + {displayValue} + + } /> - ); })} diff --git a/ui/src/components/ReactJson.jsx b/ui/src/components/ReactJson.jsx index 5a396a1d8d..00f36aca01 100644 --- a/ui/src/components/ReactJson.jsx +++ b/ui/src/components/ReactJson.jsx @@ -35,7 +35,12 @@ const useStyles = makeStyles({ }, }); -export default function ReactJson({ className, label, src, lineNumbers=true }) { +export default function ReactJson({ + className, + label, + src, + lineNumbers = true, +}) { const classes = useStyles(); const editorRef = useRef(null); @@ -98,7 +103,7 @@ export default function ReactJson({ className, label, src, lineNumbers=true }) { scrollbar: { useShadows: false }, quickSuggestions: false, showFoldingControls: "always", - lineNumbers: lineNumbers ? "on": "off", + lineNumbers: lineNumbers ? "on" : "off", // Undocumented see https://github.com/Microsoft/vscode/issues/30795#issuecomment-410998882 lineDecorationsWidth: 0, diff --git a/ui/src/components/diagram/WorkflowDAG.js b/ui/src/components/diagram/WorkflowDAG.js index 908503ac23..f7982950bb 100644 --- a/ui/src/components/diagram/WorkflowDAG.js +++ b/ui/src/components/diagram/WorkflowDAG.js @@ -143,16 +143,19 @@ export default class WorkflowDAG { // Special case - When the antecedent of an executed node is a SWITCH, the edge may not necessarily be highlighted. // E.g. the default edge not taken. + // // SWITCH is the newer version of DECISION and DECISION is deprecated - if (antecedent.type === "SWITCH" || antecedent.type === "DECISION") { - // A switch inside a loop in execution won't - // have a decisionCases key - if (antecedent.decisionCases) { - edgeParams.caseValue = getCaseValue( - taskConfig.taskReferenceName, - antecedent - ); - } + // + // Skip this if current type is DO_WHILE_END - which means the SWITCH is one of the bundled + // loop tasks and the current task is not the result of a decision + if ( + taskConfig.type !== "DO_WHILE_END" && + (antecedent.type === "SWITCH" || antecedent.type === "DECISION") + ) { + edgeParams.caseValue = getCaseValue( + taskConfig.taskReferenceName, + antecedent + ); // Highlight edge as executed only after thorough test const branchTaken = this.switchBranchTaken( @@ -253,7 +256,6 @@ export default class WorkflowDAG { processDoWhileTask(doWhileTask, antecedents) { console.assert(Array.isArray(antecedents)); - console.log(this.taskResults); const hasDoWhileExecuted = !!this.getExecutionStatus( doWhileTask.taskReferenceName @@ -262,6 +264,7 @@ export default class WorkflowDAG { this.addVertex(doWhileTask, antecedents); // Bottom bar + // aliasForRef indicates when the bottom bar is clicked one we should highlight the ref let endDoWhileTask = { type: "DO_WHILE_END", name: doWhileTask.name, @@ -283,12 +286,14 @@ export default class WorkflowDAG { } ); - const loopOverRefs = Array.from(this.taskResultsByRef.keys()).filter((key) => { - for (let prefix of loopOverRefPrefixes) { - if (key.startsWith(prefix)) return true; + const loopOverRefs = Array.from(this.taskResultsByRef.keys()).filter( + (key) => { + for (let prefix of loopOverRefPrefixes) { + if (key.startsWith(prefix + "__")) return true; + } + return false; } - return false - }); + ); const loopTaskResults = []; for (let ref of loopOverRefs) { @@ -308,7 +313,6 @@ export default class WorkflowDAG { this.addVertex(endDoWhileTask, [...loopTasks]); } else { - // Definition view (or not executed) this.processTaskList(doWhileTask.loopOver, [doWhileTask]); diff --git a/ui/src/components/diagram/WorkflowGraph.test.cy.js b/ui/src/components/diagram/WorkflowGraph.test.cy.js index c7dee76192..30cd4236e0 100644 --- a/ui/src/components/diagram/WorkflowGraph.test.cy.js +++ b/ui/src/components/diagram/WorkflowGraph.test.cy.js @@ -66,7 +66,9 @@ describe("", () => { cy.fixture("dynamicFork/noneSpawned").then((data) => { const dag = new WorkflowDAG(data); - mount(); + mount( + + ); cy.get("#dynamic_tasks_DF_EMPTY_PLACEHOLDER") .should("contain", "No tasks spawned") .click(); @@ -83,14 +85,15 @@ describe("", () => { mount( ); - - cy.get('.edgePaths .edgePath.reverse').should('exist'); - cy.get('.edgePaths').find('.edgePath').should('have.length', 10); - cy.get('.edgeLabels').should('contain', 'LOOP'); - }); - }) + cy.get(".edgePaths .edgePath.reverse").should("exist"); + cy.get(".edgePaths").find(".edgePath").should("have.length", 11); + cy.get(".edgeLabels").should("contain", "LOOP"); + }); + }); + // Note: The addition of task 'inline_task_outside' tests prefix-based loop content detection. + // Will succeed only when filtering via 'prefix + "__"'; it("Do_while containing switch (execution)", () => { const onClickSpy = cy.spy().as("onClickSpy"); @@ -99,15 +102,15 @@ describe("", () => { mount( ); - + cy.get("#LoopTask_DF_TASK_PLACEHOLDER") .should("contain", "2 of 2 tasks succeeded") .click(); - cy.get("@onClickSpy").should("be.calledWith", { ref: "inline_task_1__1" }); - cy.get('.edgePaths').find('.edgePath').should('have.length', 5); - cy.get('.edgePaths .edgePath.reverse').should('exist'); - cy.get('.edgeLabels').should('contain', 'LOOP'); + cy.get("@onClickSpy").should("be.calledWith", { ref: "inline_task__1" }); + cy.get(".edgePaths").find(".edgePath").should("have.length", 6); + cy.get(".edgePaths .edgePath.reverse").should("exist"); + cy.get(".edgeLabels").should("contain", "LOOP"); }); - }) + }); }); diff --git a/ui/src/pages/execution/TaskSummary.jsx b/ui/src/pages/execution/TaskSummary.jsx index a8b8f02f17..62647ac325 100644 --- a/ui/src/pages/execution/TaskSummary.jsx +++ b/ui/src/pages/execution/TaskSummary.jsx @@ -108,10 +108,7 @@ export default function TaskSummary({ taskResult }) { data.push({ label: "Subworkflow ID", value: ( - + {taskResult.subWorkflowId} ),