@@ -154,11 +153,59 @@ export function Orchestration() {
setRefreshInterval={setRefreshInterval}
/>
- {apiClient.isAuthorized("OrchestrationsPurgeInstance") &&
- stateQuery.isSuccess && (
-
+ {stateQuery.isSuccess && (
+
+ {apiClient.isAuthorized("OrchestrationsTerminate") && (
+ }
+ size="small"
+ onClick={() =>
+ setReasonDialog({
+ action: "Terminate",
+ fn: async (reason) => {
+ await apiClient.terminateOrchestration(instanceId, {
+ reason,
+ });
+ enqueueSnackbar("Termination requested", {
+ variant: "success",
+ });
+ stateQuery.refetch();
+ },
+ })
+ }
+ >
+ Terminate
+
+ )}
+ {apiClient.hasFeature("Rewind") &&
+ apiClient.isAuthorized("OrchestrationsRewind") && (
+ }
+ size="small"
+ onClick={() =>
+ setReasonDialog({
+ action: "Rewind",
+ fn: async (reason) => {
+ await apiClient.rewindOrchestration(instanceId, {
+ reason,
+ });
+ enqueueSnackbar("Failures rewound", {
+ variant: "success",
+ });
+ stateQuery.refetch();
+ },
+ })
+ }
+ >
+ Rewind
+
+ )}
+ {apiClient.isAuthorized("OrchestrationsPurgeInstance") && (
}
loading={purgeMutation.isPending}
onClick={handlePurgeClick}
@@ -166,8 +213,9 @@ export function Orchestration() {
>
Purge
-
- )}
+ )}
+
+ )}
{(stateQuery.isFetching || historyQuery.isFetching) && (
@@ -197,13 +245,6 @@ export function Orchestration() {
{apiClient.isAuthorized("OrchestrationsRaiseEvent") && (
)}
- {apiClient.isAuthorized("OrchestrationsTerminate") && (
-
- )}
- {apiClient.hasFeature("Rewind") &&
- apiClient.isAuthorized("OrchestrationsRewind") && (
-
- )}
{stateQuery.data ? (
@@ -237,25 +278,6 @@ export function Orchestration() {
/>
)}
- {apiClient.isAuthorized("OrchestrationsTerminate") &&
- tab === "terminate" && (
-
-
-
- )}
- {apiClient.hasFeature("Rewind") &&
- apiClient.isAuthorized("OrchestrationsRewind") &&
- tab === "rewind" && (
-
-
-
- )}
{tab === "json" && (
@@ -270,6 +292,31 @@ export function Orchestration() {
>
) : null}
+ setReasonDialog(null)}
+ onConfirm={async (reason) => {
+ const dialog = reasonDialog;
+ setReasonDialog(null);
+ if (dialog) {
+ try {
+ await dialog.fn(reason);
+ } catch (error) {
+ enqueueSnackbar(String(error), {
+ variant: "error",
+ persist: true,
+ action: (key) => (
+
+ ),
+ });
+ }
+ }
+ }}
+ />
);
}
diff --git a/src/LLL.DurableTask.Ui/app/src/views/orchestrations/Orchestrations.tsx b/src/LLL.DurableTask.Ui/app/src/views/orchestrations/Orchestrations.tsx
index 725af42..92e22f9 100644
--- a/src/LLL.DurableTask.Ui/app/src/views/orchestrations/Orchestrations.tsx
+++ b/src/LLL.DurableTask.Ui/app/src/views/orchestrations/Orchestrations.tsx
@@ -105,7 +105,7 @@ export function Orchestrations() {
) : null}