Skip to content

Commit b4c74cc

Browse files
authored
Merge pull request #11555 from ester-nl/appext/1415-update-progress-dialog-behavior
Add explanation for `resolveImmediatelyOnCancel` for progress dialogs
2 parents 48c010c + b46aace commit b4c74cc

2 files changed

Lines changed: 64 additions & 1 deletion

File tree

content/en/docs/apidocs-mxsdk/apidocs/studio-pro-11/extensibility-api/web/web-extensions-howtos/dialog-api.md

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ To show a progress dialog, call the method `studioPro.ui.dialogs.showProgressDia
230230
* `title`The title of the step, which is highlighted when the step runs.
231231
* `description`The description of the step, which shows at the bottom of the dialog next to the progress bar.
232232
* `action`The action the step performs that returns `Promise<true | string>`, where `string` indicates the reason for failure if the step fails, and `true` is returned otherwise.
233+
* `<resolveImmediatelyOnCancel>`An optional boolean that, if provided, can only be `true`. By default, the canceled step finishes and the dialog returns the state that exists when the step completes. Pass `true` to instead return the state at the exact moment of cancellation.
233234

234235
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.
235236

@@ -238,9 +239,11 @@ The `showProgressDialog` method returns a `Promise<ProgressDialogResult>`. `Prog
238239
* `result`A string that is either `Success`, `Failure`, or `UserCancelled`:
239240
* `Success`Returned when all steps return `true`.
240241
* `Failure`Returned when one step fails, causing the dialog to close.
241-
* `UserCancelled`Returned when the user closes the dialog and interrupts the process.
242+
* `UserCancelled`Returned when the user closes the dialog and interrupts the process. By default, the canceled step finishes and the result reflects the state when it completes; if `resolveImmediatelyOnCancel` is `true`, the result reflects the state at the moment of cancellation.
242243
* `failedStep` (optional) – An object of type `FailedProgressStepResult` that describes the step that failed.
243244

245+
If the last step is canceled but completes successfully, the overall result is `Success`.
246+
244247
The `FailedProgressStepResult` object contains the following properties:
245248

246249
* `stepTitle`The title of the step that failed, causing the whole process to fail.
@@ -313,6 +316,60 @@ export const component: IComponent = {
313316
};
314317
```
315318

319+
To see how `resolveImmediatelyOnCancel` influences the result, consider a modified version of the example above that sets a value twice per step into a dictionary called `state`. By default (when `resolveImmediatelyOnCancel` is omitted), the canceled step finishes executing and the result has a value of `2` for the dictionary entry set at that step.
320+
321+
To capture the state before the canceled step completes, pass `true` for `resolveImmediatelyOnCancel`. The `state` dictionary then contains a value of `1` instead of `2` for the canceled step.
322+
323+
```typescript
324+
const state: { [step: string]: number } = {};
325+
326+
const step1: ProgressDialogStep = {
327+
title: "Step 1",
328+
description: "Executing Step 1",
329+
action: async () => {
330+
// perform action
331+
state["step1"] = 1;
332+
// other things happening...
333+
await sleep(5000);
334+
state["step1"] = 2;
335+
return true;
336+
}
337+
};
338+
339+
const step2: ProgressDialogStep = {
340+
title: "Step 2",
341+
description: "Executing Step 2",
342+
action: async () => {
343+
// perform action
344+
state["step2"] = 1;
345+
// other things happening...
346+
await sleep(5000);
347+
state["step2"] = 2;
348+
349+
return true;
350+
}
351+
};
352+
353+
const step3: ProgressDialogStep = {
354+
title: "Step 3",
355+
description: "Executing Step 3",
356+
action: async () => {
357+
// perform action
358+
state["step3"] = 1;
359+
// other things happening...
360+
await sleep(5000);
361+
state["step3"] = 2;
362+
return true;
363+
}
364+
};
365+
366+
const resolveImmediatelyOnCancel = true;
367+
const result = await studioPro.ui.dialogs.showProgressDialog("Cancel This Progress", [step1, step2, step3], resolveImmediatelyOnCancel);
368+
369+
if (result.result === "Success") await studioPro.ui.messageBoxes.show("info", "Process completed successfully");
370+
if (result.result === "UserCancelled") await studioPro.ui.messageBoxes.show("info", "Process was cancelled. Result: " + JSON.stringify(state));
371+
```
372+
316373
Mendix recommends wrapping your step action body in a `try/catch` block so you can control the error that is returned to the user:
317374

318375
```typescript

content/en/docs/releasenotes/studio-pro/web-extensibility-api.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@ numberless_headings: true
88

99
These release notes cover changes to the [Extensibility API for Web Developers](/apidocs-mxsdk/apidocs/extensibility-api/).
1010

11+
## Version 11.12.2
12+
13+
* We fixed a bug where the Extensions Overview page would not open if the user was not signed in.
14+
* We fixed a bug where reloading a Dev extension would cause a crash if extension tabs were still open.
15+
* We fixed an issue where progress dialogs did not behave like their C# counterpart. Canceling a step now waits for it to finish and return its result. To exit the step and return its result immediately on cancel, pass `resolveImmediatelyOnCancel` to `IDialogApi.showProgressDialog`.
16+
1117
## Version 11.12.1
1218

1319
* We removed timeouts for Custom Blob Document consistency checks instead of showing a generic error in the **Errors** pane. We also added analytics to identify extensions that exceed the previous timeout.

0 commit comments

Comments
 (0)