From 6f9eb9d35146874e3a3c5b44fd9abd4b80d3e521 Mon Sep 17 00:00:00 2001 From: Ester Uras Date: Fri, 17 Jul 2026 11:18:44 +0200 Subject: [PATCH 1/3] Add explanation for `resolveImmediatelyOnCancel` for progress dialogs --- .../web/web-extensions-howtos/dialog-api.md | 58 ++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-11/extensibility-api/web/web-extensions-howtos/dialog-api.md b/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-11/extensibility-api/web/web-extensions-howtos/dialog-api.md index b4017c74264..547e0b337db 100644 --- a/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-11/extensibility-api/web/web-extensions-howtos/dialog-api.md +++ b/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-11/extensibility-api/web/web-extensions-howtos/dialog-api.md @@ -230,6 +230,7 @@ To show a progress dialog, call the method `studioPro.ui.dialogs.showProgressDia * `title` – The title of the step, which is highlighted when the step runs. * `description` – The description of the step, which shows at the bottom of the dialog next to the progress bar. * `action` – The action the step performs that returns `Promise`, where `string` indicates the reason for failure if the step fails, and `true` is returned otherwise. +* `` - An optional boolean that, if provided, can only be `true`. If the developer needs the state that exists at the exact time of cancellation, then they can pass `true` for this parameter. The default behavior is that the cancelled step will finish, and the whole dialog will return the state that exists when the cancelled step is completed. If the developer needs the state that exists at the exact time of cancellation, then they can pass `true` for this parameter. A checkmark icon appears next to the step title when the step completes successfully. If one of the steps fails, the dialog closes and the remaining steps do not run. @@ -238,9 +239,11 @@ The `showProgressDialog` method returns a `Promise`. `Prog * `result` – A string that is either `Success`, `Failure`, or `UserCancelled`: * `Success` – Returned when all steps return `true`. * `Failure` – Returned when one step fails, causing the dialog to close. - * `UserCancelled` – Returned when the user closes the dialog and interrupts the process. + * `UserCancelled` – Returned when the user closes the dialog and interrupts the process. The cancelled step still finishes executing, and unless `resolveImmediatelyOnCancel` is `true`, the final state of the result will contain the changes performed by the step. * `failedStep` (optional) – An object of type `FailedProgressStepResult` that describes the step that failed. +If the last step is cancelled, but it completed successfully, the whole result of the progress dialog will be `Success`. + The `FailedProgressStepResult` object contains the following properties: * `stepTitle` – The title of the step that failed, causing the whole process to fail. @@ -313,6 +316,59 @@ export const component: IComponent = { }; ``` +To see how `resolveImmediatelyOnCancel` influences the final state of the result, let's use the example above modified to set a value twice for each step into a dictionary called `state`. If `resolveImmediatelyOnCancel` is omitted when calling `showProgressDialog` (which is the default behavior), then the cancelled step will finish executing and the final result will have a value of `2` for the dictionary value set at that step. +If however, the developer needs the cancelled step to not influence the final result, they should pass `true` for `resolveImmediatelyOnCancel`, and once the user cancels the progress dialog, the `state` dictionary will contain a value of `1` instead of `2` for the cancelled step. + +```typescript +const state: { [step: string]: number } = {}; + + const step1: ProgressDialogStep = { + title: "Step 1", + description: "Executing Step 1", + action: async () => { + // perform action + state["step1"] = 1; + // other things happening... + await sleep(5000); + state["step1"] = 2; + return true; + } + }; + + const step2: ProgressDialogStep = { + title: "Step 2", + description: "Executing Step 2", + action: async () => { + // perform action + state["step2"] = 1; + // other things happening... + await sleep(5000); + state["step2"] = 2; + + return true; + } + }; + + const step3: ProgressDialogStep = { + title: "Step 3", + description: "Executing Step 3", + action: async () => { + // perform action + state["step3"] = 1; + // other things happening... + await sleep(5000); + state["step3"] = 2; + return true; + } + }; + + const resolveImmediatelyOnCancel = true; + const result = await studioPro.ui.dialogs.showProgressDialog("Cancel This Progress", [step1, step2, step3], resolveImmediatelyOnCancel); + + if (result.result === "Success") await studioPro.ui.messageBoxes.show("info", "Process completed successfully"); + if (result.result === "UserCancelled") await studioPro.ui.messageBoxes.show("info", "Process was cancelled. Result: " + JSON.stringify(state)); +``` + Mendix recommends wrapping your step action body in a `try/catch` block so you can control the error that is returned to the user: ```typescript From 5d7ed0610686e6038d6450fab4e1c5a03811e688 Mon Sep 17 00:00:00 2001 From: Ester Uras Date: Fri, 17 Jul 2026 11:38:39 +0200 Subject: [PATCH 2/3] Release notes --- content/en/docs/releasenotes/studio-pro/web-extensibility-api.md | 1 + 1 file changed, 1 insertion(+) diff --git a/content/en/docs/releasenotes/studio-pro/web-extensibility-api.md b/content/en/docs/releasenotes/studio-pro/web-extensibility-api.md index 770952f093b..711e2e0251a 100644 --- a/content/en/docs/releasenotes/studio-pro/web-extensibility-api.md +++ b/content/en/docs/releasenotes/studio-pro/web-extensibility-api.md @@ -14,6 +14,7 @@ These release notes cover changes to the [Extensibility API for Web Developers]( * We added a `permissionsChanged` event to the [Permissions API](/apidocs-mxsdk/apidocs/web-extensibility-api-11/extension-permissions/) that notifies you when the user changes the permissions of your extension. * We added the `documentsChanged` event, which notifies you when a document that your extension depends on is modified in Studio Pro. * The Studio Pro version is now available through the [Preferences API](/apidocs-mxsdk/apidocs/web-extensibility-api-11/preference-api/). +* We fixed an issue where the progress dialogs did not behave as the C# counterpart, where cancelling a step still waited for it to finish and return its result. If the user still wants to exit the step and return the result immediately, they can still do so by passing `resolveImmediatelyOnCancel` to the `IDialogApi.showProgressDialog` method. ## Version 11.11.0 From 198673d21ec87651e9100f15d613fee63891c457 Mon Sep 17 00:00:00 2001 From: Ester Uras Date: Fri, 17 Jul 2026 11:38:39 +0200 Subject: [PATCH 3/3] Release notes --- .../docs/releasenotes/studio-pro/web-extensibility-api.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/content/en/docs/releasenotes/studio-pro/web-extensibility-api.md b/content/en/docs/releasenotes/studio-pro/web-extensibility-api.md index 770952f093b..06d9c70ec32 100644 --- a/content/en/docs/releasenotes/studio-pro/web-extensibility-api.md +++ b/content/en/docs/releasenotes/studio-pro/web-extensibility-api.md @@ -8,6 +8,12 @@ numberless_headings: true These release notes cover changes to the [Extensibility API for Web Developers](/apidocs-mxsdk/apidocs/extensibility-api/). +## Version 11.12.2 + +* We fixed a bug where the Extensions Overview Page would not open if the user was not signed in. +* We fixed a bug where reloading a Dev extension would cause a crash if tabs previously opened via an extension were not closed before the reload. +* We fixed an issue where the progress dialogs did not behave as the C# counterpart, where cancelling a step still waited for it to finish and return its result. If the user still wants to exit the step and return the result immediately, they can still do so by passing `resolveImmediatelyOnCancel` to the `IDialogApi.showProgressDialog` method. + ## Version 11.12.0 * We removed the elements helper methods (`add*()`, `get*()`, `getContainer()`, and `delete()`) from the Model API types.