From bd1f14eeb00674104d2293a95ea9f211d642a9e9 Mon Sep 17 00:00:00 2001 From: Jeff Date: Fri, 21 Aug 2015 12:05:56 +0100 Subject: [PATCH] Fix Issue #4352: Added prompt on workflow save to give choice of stopping running workflows. --- .../Controllers/AdminController.cs | 31 +++++++++++++--- .../Models/ActivityRecord.cs | 9 +++++ .../Orchard.Workflows/Views/Admin/Edit.cshtml | 35 ++++++++++++++----- 3 files changed, 63 insertions(+), 12 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Workflows/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.Workflows/Controllers/AdminController.cs index 30809e85d..12cbbc5c7 100644 --- a/src/Orchard.Web/Modules/Orchard.Workflows/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.Workflows/Controllers/AdminController.cs @@ -23,6 +23,7 @@ using Orchard.UI.Notify; using Orchard.Workflows.Models; using Orchard.Workflows.Services; using Orchard.Workflows.ViewModels; +using Orchard.Workflows.Helpers; namespace Orchard.Workflows.Controllers { [ValidateInput(false)] @@ -234,7 +235,7 @@ namespace Orchard.Workflows.Controllers { dynamic activity = new JObject(); activity.Name = x.Name; activity.Id = x.Id; - activity.ClientId = x.Name + "_" + x.Id; + activity.ClientId = x.GetClientId(); activity.Left = x.X; activity.Top = x.Y; activity.Start = x.Start; @@ -259,7 +260,7 @@ namespace Orchard.Workflows.Controllers { [HttpPost, ActionName("Edit")] [FormValueRequired("submit.Save")] - public ActionResult EditPost(int id, string localId, string data) { + public ActionResult EditPost(int id, string localId, string data, bool clearWorkflows) { if (!Services.Authorizer.Authorize(StandardPermissions.SiteOwner, T("Not authorized to edit workflows"))) return new HttpUnauthorizedResult(); @@ -275,7 +276,6 @@ namespace Orchard.Workflows.Controllers { var activitiesIndex = new Dictionary(); workflowDefinitionRecord.ActivityRecords.Clear(); - workflowDefinitionRecord.WorkflowRecords.Clear(); foreach (var activity in state.Activities) { ActivityRecord activityRecord; @@ -303,9 +303,32 @@ namespace Orchard.Workflows.Controllers { }); } + if (clearWorkflows) { + workflowDefinitionRecord.WorkflowRecords.Clear(); + } + else { + foreach (var workflowRecord in workflowDefinitionRecord.WorkflowRecords) { + // Update any awaiting activity records with the new activity record. + foreach (var awaitingActivityRecord in workflowRecord.AwaitingActivities) { + var clientId = awaitingActivityRecord.ActivityRecord.GetClientId(); + if (activitiesIndex.ContainsKey(clientId)) { + awaitingActivityRecord.ActivityRecord = activitiesIndex[clientId]; + } + else { + workflowRecord.AwaitingActivities.Remove(awaitingActivityRecord); + } + } + // Remove any workflows with no awaiting activities. + if (!workflowRecord.AwaitingActivities.Any()) { + workflowDefinitionRecord.WorkflowRecords.Remove(workflowRecord); + } + } + } + Services.Notifier.Information(T("Workflow saved successfully")); - return RedirectToAction("Edit", new { id, localId }); + // Don't pass the localId to force the activites to refresh and use the deterministic clientId. + return RedirectToAction("Edit", new { id }); } [HttpPost, ActionName("Edit")] diff --git a/src/Orchard.Web/Modules/Orchard.Workflows/Models/ActivityRecord.cs b/src/Orchard.Web/Modules/Orchard.Workflows/Models/ActivityRecord.cs index 8c45e5a19..9233d5bcd 100644 --- a/src/Orchard.Web/Modules/Orchard.Workflows/Models/ActivityRecord.cs +++ b/src/Orchard.Web/Modules/Orchard.Workflows/Models/ActivityRecord.cs @@ -38,5 +38,14 @@ namespace Orchard.Workflows.Models { /// containing this activity. /// public virtual WorkflowDefinitionRecord WorkflowDefinitionRecord { get; set; } + + + /// + /// Gets the Id which can be used on the client. + /// + /// An unique Id to represent this activity on the client. + public string GetClientId() { + return Name + "_" + Id; + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Workflows/Views/Admin/Edit.cshtml b/src/Orchard.Web/Modules/Orchard.Workflows/Views/Admin/Edit.cshtml index c1acd41b5..1ab7a4294 100644 --- a/src/Orchard.Web/Modules/Orchard.Workflows/Views/Admin/Edit.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Workflows/Views/Admin/Edit.cshtml @@ -7,6 +7,7 @@ Style.Require("WorkflowsAdmin"); Style.Require("WorkflowsActivities"); Style.Require("jQueryUI_Orchard"); + Script.Require("jQueryUI_Dialog").AtFoot(); Script.Require("jsPlumb").AtFoot(); Script.Include("orchard-workflows-serialize.js").AtFoot(); Script.Include("orchard-workflows.js").AtFoot(); @@ -74,23 +75,41 @@ @Html.Hidden("data", String.Empty) @Html.Hidden("confirm-delete-activity", T("Are you sure you want to remove this activity?")) -@Html.Hidden("confirm-delete-instances", T("Are you sure you want to remove running instances of this workflow?")) +@Html.Hidden("confirm-delete-instances", T("You have running instances of this workflow, do you want to stop them?")) using (Script.Foot()) {