Azure / Azure/LogicAppsUX

New Portal Designer (In Preview) not adhering to the the null check expression

Open
#8,610 0 comments 0 reactions 0 assignees View on GitHub
bug needs-investigation
Dominant language
TypeScript
Stars
111
Forks
109
Avg merge
1d 23h
Merged PRs (30d)
20

Description

### Severity

P4 - Low (Cosmetic/minor inconvenience)

### Describe the Bug with repro steps

The workflow expression should not cause an exception when using a null check with "?" when the property does not exist e.g. defaultValues does not exist here:
`{
"type": "Compose",
"inputs": "@addProperty(variables('RequestMessage'), 'defaultValues', parameters('globalOptions')?['specific']?[workflow().name]?['defaultValues'])"
}`

Exception raised when running my workflow with a payload in the preview designer:
> InvalidTemplate
> Unable to process template language expressions in action 'TransformRequest-_Add_Default_Values' inputs at line '0' and column '0': 'The workflow parameter 'globalOptions' is not found.'.

The same run with payload completes successfully in the old designer.

### What type of Logic App Is this happening in?

Standard (Portal)

### Are you experiencing a regression?

_No response_

### Which operating system are you using?

Windows

### Did you refer to the TSG before filing this issue? https://aka.ms/lauxtsg

Yes

### Workflow JSON

```json
{
"definition": {
"$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
"actions": {
"Initialize_Checkpoint_variable": {
"type": "InitializeVariable",
"inputs": {
"variables": [
{
"name": "Checkpoint",
"type": "string"
}
]
},
"runAfter": {
"Initialize_ErrorMessage_variable": [
"Succeeded"
]
}
},
"Initialize_CreateUpdateRequest_variable": {
"type": "InitializeVariable",
"inputs": {
"variables": [
{
"name": "CreateUpdateRequest",
"type": "object"
}
]
},
"runAfter": {
"Initialize_ResponseMessage_variable": [
"Succeeded"
]
}
},
"Initialize_ErrorMessage_variable": {
"type": "InitializeVariable",
"inputs": {
"variables": [
{
"name": "ErrorMessage",
"type": "string",
"value": "An error occurred in the @{workflow()?['name']} (@{workflow()?['run']?['name']}) workflow"
}
]
},
"runAfter": {
"Initialize_FaultMessage_variable": [
"Succeeded"
]
}
},
"Initialize_FaultMessage_variable": {
"type": "InitializeVariable",
"inputs": {
"variables": [
{
"name": "FaultMessage",
"type": "object"
}
]
},
"runAfter": {
"Initialize_StatusCode_variable": [
"Succeeded"
]
}
},
"Initialize_Operation_variable": {
"type": "InitializeVariable",
"inputs": {
"variables": [
{
"name": "Operation",
"type": "string",
"value": "@triggerBody()?['paymentRefund']?['operation']"
}
]
},
"runAfter": {
"Initialize_CreateUpdateRequest_variable": [
"Succeeded"
]
}
},
"Initialize_RequestMessage_variable": {
"type": "InitializeVariable",
"inputs": {
"variables": [
{
"name": "RequestMessage",
"type": "object"
}
]
},
"runAfter": {
"Initialize_Checkpoint_variable": [
"Succeeded"
]
}
},
"Initialize_ResponseMessage_variable": {
"type": "InitializeVariable",
"inputs": {
"variables": [
{
"name": "ResponseMessage",
"type": "object"
}
]
},
"runAfter": {
"Initialize_RequestMessage_variable": [
"Succeeded"
]
}
},
"Initialize_StatusCode_variable": {
"type": "InitializeVariable",
"inputs": {
"variables": [
{
"name": "StatusCode",
"type": "integer",
"value": 500
}
]
},
"runAfter": {}
},
"Respond-_Were_we_successful": {
"type": "If",
"expression": {
"or": [
{
"equals": [
"@variables('Checkpoint')",
"CreatePaymentRefundSuccess"
]
},
{
"equals": [
"@variables('Checkpoint')",
"CreatePaymentRefundSkipped"
]
}
]
},
"actions": {
"Respond-Success-_Return_success_response": {
"type": "Response",
"kind": "http",
"inputs": {
"statusCode": 200,
"headers": {
"Content-Type": "application/json",
"Tracking-Id": "@{triggerOutputs()['headers']?['Tracking-Id']}"
},
"body": "@variables('ResponseMessage')"
}
}
},
"else": {
"actions": {
"Respond-Failure-_Do_we_have_a_FaultMessage": {
"type": "If",
"expression": {
"and": [
{
"not": {
"equals": [
"@variables('FaultMessage')?['fault']",
null
]
}
}
]
},
"actions": {},
"else": {
"actions": {
"Respond-Failure-NoFault-_Create_Fault_message": {
"type": "Compose",
"inputs": {
"fault": {
"additionalDetails": {
"logicApp": {
"lastCheckpoint": "@variables('Checkpoint')",
"logicAppName": "@appsetting('logicAppName')",
"resourceGroupName": "@appsetting('logicAppResourceGroupName')",
"runId": "@workflow()?['run']?['name']",
"workflowName": "@workflow()?['name']"
}
},
"faultActor": "@concat(workflow()?['name'], '.', 'Respond-_Were_we_successful', ' (', workflow()?['run']?['name'], ')')",
"faultCategory": "Error",
"faultCode": "ORAC075",
"faultMessage": "@variables('ErrorMessage')",
"faultReason": null,
"statusCode": "500"
}
}
},
"Respond-Failure-NoFault-_Set_FaultMessage_variable": {
"type": "SetVariable",
"inputs": {
"name": "FaultMessage",
"value": "@outputs('Respond-Failure-NoFault-_Create_Fault_message')"
},
"runAfter": {
"Respond-Failure-NoFault-_Create_Fault_message": [
"Succeeded"
]
}
}
}
}
},
"Respond-Failure-_Return_FaultMessage_response": {
"type": "Response",
"kind": "http",
"inputs": {
"statusCode": 500,
"headers": {
"Content-Type": "application/json"
},
"body": "@variables('FaultMessage')"
},
"runAfter": {
"Respond-Failure-_Do_we_have_a_FaultMessage": [
"Succeeded"
]
}
},
"Respond-Failure-_Should_we_Terminate": {
"type": "If",
"expression": {
"or": [
{
"equals": [
"@coalesce(parameters('globalOptions')?['specific']?[workflow().name]?['terminateOnError'], parameters('globalOptions')?['global']?['terminateOnError'], true)",
true
]
}
]
},
"actions": {
"Respond-Failure-_Terminate_workflow": {
"type": "Terminate",
"inputs": {
"runStatus": "Failed",
"runError": {
"code": "500",
"message": "@variables('ErrorMessage')"
}
}
}
},
"else": {
"actions": {}
},
"runAfter": {
"Respond-Failure-_Return_FaultMessage_response": [
"Succeeded"
]
}
}
}
},
"runAfter": {
"Step-_Create_PaymentRefund": [
"Succeeded",
"Failed",
"Skipped",
"TimedOut"
]
}
},
"Step-_Validate_Request": {
"type": "If",
"expression": {
"and": [
{
"equals": [
"@variables('Checkpoint')",
""
]
}
]
},
"actions": {
"ValidateRequest-_Have_valid_request": {
"type": "If",
"expression": {
"and": [
{
"not": {
"equals": [
"@coalesce(triggerBody(), '')",
""
]
}
},
{
"not": {
"equals": [
"@coalesce(triggerBody()?['paymentRefund']?['paymentRefundReference'],'')",
""
]
}
},
{
"or": [
{
"not": {
"equals": [
"@coalesce(triggerBody()?['paymentRefund']?['customerNumber'],'')",
""
]
}
},
{
"not": {
"equals": [
"@coalesce(triggerBody()?['paymentRefund']?['studentRegNumber'],'')",
""
]
}
}
]
},
{
"not": {
"equals": [
"@triggerBody()?['paymentRefund']",
""
]
}
}
]
},
"actions": {
"ValidateRequest-Success-_Set_Checkpoint_variable": {
"type": "SetVariable",
"inputs": {
"name": "Checkpoint",
"value": "ValidateRequestSuccess"
},
"runAfter": {
"ValidateRequest-Success-_Set_RequestMessage_variable": [
"Succeeded"
]
}
},
"ValidateRequest-Success-_Set_RequestMessage_variable": {
"type": "SetVariable",
"inputs": {
"name": "RequestMessage",
"value": "@triggerBody()"
}
}
},
"else": {
"actions": {
"ValidateRequest-InvalidBody-_Set_ErrorMessage_variable": {
"type": "SetVariable",
"inputs": {
"name": "ErrorMessage",
"value": "An invalid body was supplied with this request - either the body was blank, or the paymentRefundReference or either customerNumber and studentRegNumber values were blank. A valid JSON @{workflow()?['name']} request body must be supplied"
}
}
}
}
}
},
"else": {
"actions": {}
},
"runAfter": {
"Initialize_Operation_variable": [
"Succeeded"
]
}
},
"Step-_Transform_Request": {
"type": "If",
"expression": {
"or": [
{
"equals": [
"@variables('Checkpoint')",
"ValidateRequestSuccess"
]
}
]
},
"actions": {
"TransformRequest-Set_StatusCode_variable": {
"type": "SetVariable",
"inputs": {
"name": "StatusCode",
"value": "@if(equals(coalesce(actions('TransformRequest-_Call_TransformRequest')['status'], 'Failed'), 'Failed'), 500, 200)"
},
"runAfter": {
"TransformRequest-_Call_TransformRequest": [
"Succeeded",
"TIMEDOUT",
"SKIPPED",
"FAILED"
]
}
},
"TransformRequest-_Add_Default_Values": {
"type": "Compose",
"inputs": "@addProperty(variables('RequestMessage'), 'defaultValues', parameters('globalOptions')?['specific']?[workflow().name]?['defaultValues'])"
},
"TransformRequest-_Add_Payment_Config": {
"type": "Compose",
"inputs": "@addProperty(outputs('TransformRequest-_Add_Default_Values'), 'paymentConfig', parameters('paymentConfig'))",
"runAfter": {
"TransformRequest-_Add_Default_Values": [
"Succeeded"
]
}
},
"TransformRequest-_Call_TransformRequest": {
"type": "Liquid",
"kind": "JsonToJson",
"inputs": {
"content": "@outputs('TransformRequest-_Update_Payment_Receipt_Method_Mappings')",
"map": {
"source": "LogicApp",
"name": "CreatePaymentRefundRequest_to_CreatePaymentActivityRequest.liquid"
}
},
"runAfter": {
"TransformRequest-_Update_Payment_Receipt_Method_Mappings": [
"SUCCEEDED"
]
}
},
"TransformRequest-_Validate_Transform": {
"type": "If",
"expression": {
"and": [
{
"equals": [
"@variables('StatusCode')",
200
]
},
{
"not": {
"equals": [
"@body('TransformRequest-_Call_TransformRequest')",
"@json('{}')"
]
}
}
]
},
"actions": {
"TransformRequest-Success-_Validate_ReceiptMethod": {
"type": "If",
"expression": {
"and": [
{
"not": {
"equals": [
"@body('TransformRequest-_Call_TransformRequest')?['ReceiptMethod']",
"(unknown)"
]
}
}
]
},
"actions": {
"TransformRequest-Success-ReceiptMethodSuccess-_Set_CreateUpdateRequest_variable": {
"type": "SetVariable",
"inputs": {
"name": "CreateUpdateRequest",
"value": "@body('TransformRequest-_Call_TransformRequest')"
}
},
"TransformRequest-Success-ReceiptMethodSuccess-_Set_Checkpoint_variable": {
"type": "SetVariable",
"inputs": {
"name": "Checkpoint",
"value": "TransformRequestSuccess"
},
"runAfter": {
"TransformRequest-Success-ReceiptMethodSuccess-_Set_CreateUpdateRequest_variable": [
"SUCCEEDED"
]
}
}
},
"else": {
"actions": {
"TransformRequest-Success-SkipAsNotProcessPayment-_Set_Checkpoint_variable": {
"type": "SetVariable",
"inputs": {
"name": "Checkpoint",
"value": "CreatePaymentRefundSkipped"
},
"runAfter": {
"TransformRequest-Success-SkipAsNotProcessPayment-_Set_ResponseMessage_variable": [
"SUCCEEDED"
]
}
},
"TransformRequest-Success-SkipAsNotProcessPayment-_Create_Response_message": {
"type": "Compose",
"inputs": {
"code": "200",
"operation": "@variables('Operation')",
"paymentReference": "@body('TransformRequest-_Call_TransformRequest')?['createActivityApplication']?['activityApplication']?['receiptNumber']",
"status": "Success",
"trackingId": "@coalesce(triggerOutputs()?['headers']?['Tracking-Id'], '(Unknown)')"
},
"runAfter": {
"TransformRequest-Success-SkipAsNotProcessPayment-_Set_Operation_variable": [
"SUCCEEDED"
]
}
},
"TransformRequest-Success-SkipAsNotProcessPayment-_Set_ResponseMessage_variable": {
"type": "SetVariable",
"inputs": {
"name": "ResponseMessage",
"value": "@outputs('TransformRequest-Success-SkipAsNotProcessPayment-_Create_Response_message')"
},
"runAfter": {
"TransformRequest-Success-SkipAsNotProcessPayment-_Create_Response_message": [
"SUCCEEDED"
]
}
},
"TransformRequest-Success-SkipAsNotProcessPayment-_Set_Operation_variable": {
"type": "SetVariable",
"inputs": {
"name": "Operation",
"value": "Skipped"
}
}
}
}
}
},
"else": {
"actions": {
"TransformRequest-Failure-_Create_Fault_message": {
"type": "Compose",
"inputs": {
"fault": {
"additionalDetails": {
"logicApp": {
"lastCheckpoint": "@variables('Checkpoint')",
"logicAppName": "@appsetting('logicAppName')",
"resourceGroupName": "@appsetting('logicAppResourceGroupName')",
"runId": "@workflow()?['run']?['name']",
"workflowName": "@workflow()?['name']"
}
},
"faultActor": "@concat(workflow()?['name'], '.', actions('TransformRequest-_Call_TransformRequest')?['name'], ' (', workflow()?['run']?['name'], ')')",
"faultCategory": "Error",
"faultCode": "ORAC075",
"faultMessage": "An error occurred whilst transforming the request: @{coalesce(actions('TransformRequest-_Call_TransformRequest')?['error']?['error']?['message'], '(Unknown Error)')}",
"faultReason": "@actions('TransformRequest-_Call_TransformRequest')?['status']",
"statusCode": "@actions('TransformRequest-_Call_TransformRequest')?['code']"
}
}
},
"TransformRequest-Failure-_Set_FaultMessage_variable": {
"type": "SetVariable",
"inputs": {
"name": "FaultMessage",
"value": "@outputs('TransformRequest-Failure-_Create_Fault_message')"
},
"runAfter": {
"TransformRequest-Failure-_Create_Fault_message": [
"SUCCEEDED"
]
}
}
}
},
"runAfter": {
"TransformRequest-Set_StatusCode_variable": [
"Succeeded"
]
}
},
"TransformRequest-_Update_Payment_Receipt_Method_Mappings": {
"type": "Compose",
"inputs": "@setProperty(\r\n\toutputs('TransformRequest-_Add_Payment_Config'), \r\n\t'paymentConfig', \r\n\tsetProperty(\r\n\t\toutputs('TransformRequest-_Add_Payment_Config')?['paymentConfig'], \r\n\t\t'paymentRefund', \r\n\t\tsetProperty(\r\n\t\t\toutputs('TransformRequest-_Add_Payment_Config')?['paymentConfig']?['paymentRefund'], \r\n\t\t\t'receiptMethodMappings', \r\n\t\t\tjson(outputs('TransformRequest-_Add_Payment_Config')?['paymentConfig']?['paymentRefund']?['receiptMethodMappings'])\r\n\t\t)\r\n\t)\r\n)",
"runAfter": {
"TransformRequest-_Add_Payment_Config": [
"SUCCEEDED"
]
}
}
},
"else": {
"actions": {}
},
"runAfter": {
"Step-_Validate_Request": [
"SUCCEEDED",
"TIMEDOUT",
"SKIPPED",
"FAILED"
]
}
},
"Step-_Create_PaymentRefund": {
"type": "If",
"expression": {
"and": [
{
"equals": [
"@variables('Checkpoint')",
"TransformRequestSuccess"
]
},
{
"equals": [
"@variables('Operation')",
"Create"
]
}
]
},
"actions": {
"CreatePaymentRefund-_Call_CreatePaymentRefund": {
"type": "Http",
"inputs": {
"uri": "@{appsetting('apimBaseUrl')}/@{appsetting('oracleFinanceOrchestratorApiPath')}/@{appsetting('oracleFinancePaymentRefundApiPath')}",
"method": "POST",
"headers": {
"Ocp-Apim-Subscription-Key": "@{appsetting('apimFinanceSubscriptionKey')}",
"Ocp-Apim-Trace": "@parameters('enableApimTrace')",
"Tracking-Id": "@coalesce(triggerOutputs()?['headers']?['Tracking-Id'], '(Unknown)')"
},
"body": "@variables('CreateUpdateRequest')",
"authentication": {
"type": "ManagedServiceIdentity"
},
"retryPolicy": {
"type": "none"
}
}
},
"CreatePaymentRefund-_Set_StatusCode_variable": {
"type": "SetVariable",
"inputs": {
"name": "StatusCode",
"value": "@outputs('CreatePaymentRefund-_Call_CreatePaymentRefund')['statusCode']"
},
"runAfter": {
"CreatePaymentRefund-_Call_CreatePaymentRefund": [
"Succeeded",
"TIMEDOUT",
"SKIPPED",
"FAILED"
]
}
},
"CreatePaymentRefund-_Switch_on_StatusCode": {
"type": "Switch",
"expression": "@variables('StatusCode')",
"default": {
"actions": {
"CreatePaymentRefund-Failure-_Create_Fault_message": {
"type": "Compose",
"inputs": {
"fault": {
"additionalDetails": {
"entity": {
"entityReference": "@{coalesce(triggerBody()?['paymentRefund']?['paymentRefundReference'], '(No paymentRefundReference set)')}",
"entityReferenceName": "paymentRefundReference",
"entityType": "PaymentRefund",
"operation": "@variables('Operation')",
"trackingId": "@{coalesce(triggerOutputs()?['headers']?['Tracking-Id'], '(Unknown)')}"
},
"logicApp": {
"lastCheckpoint": "@variables('Checkpoint')",
"logicAppName": "@appsetting('logicAppName')",
"resourceGroupName": "@appsetting('logicAppResourceGroupName')",
"runId": "@workflow()?['run']?['name']",
"workflowName": "@workflow()?['name']"
}
},
"faultActor": "@concat(workflow()?['name'], '.', actions('CreatePaymentRefund-_Call_CreatePaymentRefund')?['name'], ' (', workflow()?['run']?['name'], ')')",
"faultCategory": "Error",
"faultCode": "@{coalesce(if(contains(outputs('CreatePaymentRefund-_Call_CreatePaymentRefund')?['headers']?['Content-Type'], 'json'), body('CreatePaymentRefund-_Call_CreatePaymentRefund')?['fault']?['faultCode'], null), 'ORAC075')}",
"faultMessage": "An error occurred whilst creating a PaymentRefund entity- @{coalesce(body('CreatePaymentRefund-_Call_CreatePaymentRefund')?['fault']?['faultMessage'], body('CreatePaymentRefund-_Call_CreatePaymentRefund')?['errors'], body('CreatePaymentRefund-_Call_CreatePaymentRefund')?['error']?['message'], '(Unknown Error)')}",
"faultReason": null,
"headers": "@outputs('CreatePaymentRefund-_Call_CreatePaymentRefund')?['headers']",
"innerFault": "@body('CreatePaymentRefund-_Call_CreatePaymentRefund')",
"statusCode": "@{coalesce(if(contains(outputs('CreatePaymentRefund-_Call_CreatePaymentRefund')?['headers']?['Content-Type'], 'json'), coalesce(body('CreatePaymentRefund-_Call_CreatePaymentRefund')?['fault']?['statusCode'], body('CreatePaymentRefund-_Call_CreatePaymentRefund')?['error']?['statusCode'], body('CreatePaymentRefund-_Call_CreatePaymentRefund')?['statusCode']), null), '500')}"
}
}
},
"CreatePaymentRefund-Failure-_Set_FaultMessage_variable": {
"type": "SetVariable",
"inputs": {
"name": "FaultMessage",
"value": "@outputs('CreatePaymentRefund-Failure-_Create_Fault_message')"
},
"runAfter": {
"CreatePaymentRefund-Failure-_Create_Fault_message": [
"Succeeded"
]
}
}
}
},
"cases": {
"CreatePaymentRefund-Success": {
"actions": {
"CreatePaymentRefund-Success-_Create_Response_message": {
"type": "Compose",
"inputs": {
"code": "200",
"operation": "@variables('Operation')",
"paymentRefundReference": "@body('CreatePaymentRefund-_Call_CreatePaymentRefund')?['createActivityApplicationResponse']?['result']?['value']?['ReceiptNumber']",
"responseCode": "@coalesce(body('CreatePaymentRefund-_Call_CreatePaymentRefund')?['ReceivableApplicationFLEXVA']?['ReceivableApplicationId'],body('CreatePaymentRefund-_Call_CreatePaymentRefund')?['ActivityApplicationGdfVA']?['ReceivableApplicationId'],0)",
"status": "Success",
"trackingId": "@coalesce(triggerOutputs()?['headers']?['Tracking-Id'], '(Unknown)')"
}
},
"CreatePaymentRefund-Success-_Set_Checkpoint_variable": {
"type": "SetVariable",
"inputs": {
"name": "Checkpoint",
"value": "CreatePaymentRefundSuccess"
},
"runAfter": {
"CreatePaymentRefund-Success-_Create_Response_message": [
"SUCCEEDED"
]
}
},
"CreatePaymentRefund-Success-_Set_ResponseMessage_variable": {
"type": "SetVariable",
"inputs": {
"name": "ResponseMessage",
"value": "@outputs('CreatePaymentRefund-Success-_Create_Response_message')"
},
"runAfter": {
"CreatePaymentRefund-Success-_Create_Response_message": [
"Succeeded"
]
}
}
},
"case": 200
}
},
"runAfter": {
"CreatePaymentRefund-_Set_StatusCode_variable": [
"Succeeded"
]
}
}
},
"else": {
"actions": {}
},
"runAfter": {
"Step-_Transform_Request": [
"SUCCEEDED",
"TIMEDOUT",
"SKIPPED",
"FAILED"
]
}
}
},
"contentVersion": "1.0.0.0",
"outputs": {},
"triggers": {
"manual": {
"type": "Request",
"kind": "Http",
"inputs": {
"schema": {
"$id": "http://schemas/azure/esb/oracle/upsertrefundrequest.json",
"$schema": "https://json-schema.org/draft/2019-09/schema",
"properties": {
"paymentRefund": {
"examples": [
{
"amount": "-10.4",
"currency": "GBP",
"customerNumber": "",
"entryDate": "2024-08-19",
"invoiceNumber": "",
"operation": "Create",
"paymentRefundReference": "",
"source": "Flywire",
"studentRegNumber": "",
"transactionDate": "2024-08-19"
}
],
"properties": {
"amount": {
"default": "",
"description": "The amount of the payment refund",
"examples": [
"-1100.12"
],
"title": "Payment Refund Amount",
"type": "string"
},
"currency": {
"default": "",
"description": "The currency of the payment refund",
"examples": [
"GBP"
],
"maxLength": 15,
"title": "Currency",
"type": "string"
},
"customerNumber": {
"default": "",
"description": "The customer account number of the customer on the payment refund",
"examples": [
"123456"
],
"maxLength": 30,
"title": "Customer Account Number",
"type": "string"
},
"entryDate": {
"default": "",
"description": "The date when the payment refund was processed",
"examples": [
"2024-08-09T17:57:03.2058826Z"
],
"title": "Entry Date",
"type": "string"
},
"invoiceNumber": {
"default": "",
"description": "The invoice number assigned to the payment refund",
"examples": [
"12457894"
],
"title": "Invoice Number",
"type": "string"
},
"operation": {
"default": "",
"description": "Operation to be performed e.g. Update, Delete, Disable",
"examples": [
"Update",
"Delete",
"Disable"
],
"title": "Operation",
"type": "string"
},
"paymentRefundReference": {
"default": "",
"description": "The payment refund reference of the payment refund request",
"examples": [
""
],
"maxLength": 30,
"title": "Receipt Number",
"type": "string"
},
"source": {
"default": "",
"description": "The source where the payment refund originated from",
"examples": [
"HEP",
"Adelante",
"Flywire"
],
"title": "Source",
"type": "string"
},
"studentRegNumber": {
"default": "",
"description": "The student registration number",
"examples": [
""
],
"maxLength": 30,
"title": "Student Registration Number",
"type": "string"
},
"transactionDate": {
"default": "",
"description": "The date when the payment refund was transacted",
"examples": [
"20240813"
],
"title": "Transaction Date",
"type": "string"
}
},
"required": [
"operation",
"paymentRefundReference",
"source",
"transactionDate",
"entryDate",
"amount",
"currency"
],
"title": "Upsert Payment Refund Request",
"type": "object"
},
"processType": {
"default": "",
"description": "ProcessType for this message",
"examples": [
"PaymentRefund"
],
"title": "Process Type",
"type": "string"
},
"trackingId": {
"default": "",
"description": "TrackingId for this message",
"examples": [
"0A437B69-09FC-4D5B-B292-AC76BB72BF7D"
],
"title": "Tracking Id",
"type": "string"
}
},
"required": [
"processType",
"paymentRefund"
],
"title": "Upsert Payment Refund Request"
}
},
"correlation": {
"clientTrackingId": "@{coalesce(if(empty(triggerOutputs()?['headers']?['Tracking-Id']), null, triggerOutputs()?['headers']?['Tracking-Id']), '(Unknown)')}"
}
}
}
},
"kind": "Stateful"
}
```

### Screenshots or Videos

_No response_

### Environment

- Browser Vivaldi 7.7.3851.52

### Additional context

_No response_

Contributor guide

No contributing guide indexed for this repository

Research direction

Start by reproducing the expression in the New Portal Designer preview with the workflow JSON provided, then compare its handling with the old designer. Trace the preview designer's expression-evaluation entry point and verify that the null-safe lookup does not raise the missing-parameter exception. Done means the workflow completes successfully with the expression shown and existing behavior remains intact.

Written by the indexing model from the issue text.

Assessment

Tech stack
react, typescript
Domain
frontend
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.