diff --git a/src/Orchard.Web/Modules/Orchard.Workflows/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.Workflows/Controllers/AdminController.cs index fbdf50af0..26b83b42c 100644 --- a/src/Orchard.Web/Modules/Orchard.Workflows/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.Workflows/Controllers/AdminController.cs @@ -10,6 +10,7 @@ using Orchard.DisplayManagement; using Orchard.Forms.Services; using Orchard.Localization; using Orchard.Mvc; +using Orchard.Mvc.Extensions; using Orchard.Security; using Orchard.Themes; using System; @@ -126,6 +127,7 @@ namespace Orchard.Workflows.Controllers { ContentItem: contentItem, Workflows: workflows ); + return View(viewModel); } @@ -150,19 +152,21 @@ namespace Orchard.Workflows.Controllers { return RedirectToAction("Edit", new { workflowDefinitionRecord.Id }); } - public ActionResult Edit(int id, string localId) { + public ActionResult Edit(int id, string localId, int? workflowId) { if (!Services.Authorizer.Authorize(StandardPermissions.SiteOwner, T("Not authorized to edit workflows"))) return new HttpUnauthorizedResult(); // convert the workflow definition into its view model var workflowDefinitionRecord = _workflowDefinitionRecords.Get(id); var workflowDefinitionViewModel = CreateWorkflowDefinitionViewModel(workflowDefinitionRecord); - + var workflow = workflowId.HasValue ? _workflowRecords.Get(workflowId.Value) : null; + var viewModel = new AdminEditViewModel { LocalId = String.IsNullOrEmpty(localId) ? Guid.NewGuid().ToString() : localId, IsLocal = !String.IsNullOrEmpty(localId), WorkflowDefinition = workflowDefinitionViewModel, - AllActivities = _activitiesManager.GetActivities() + AllActivities = _activitiesManager.GetActivities(), + Workflow = workflow }; return View(viewModel); @@ -183,6 +187,21 @@ namespace Orchard.Workflows.Controllers { return RedirectToAction("Index"); } + [HttpPost] + public ActionResult DeleteWorkflow(int id, string returnUrl) { + if (!Services.Authorizer.Authorize(StandardPermissions.SiteOwner, T("Not authorized to manage rules"))) + return new HttpUnauthorizedResult(); + + var workflow = _workflowRecords.Get(id); + + if (workflow != null) { + _workflowRecords.Delete(workflow); + Services.Notifier.Information(T("Workflow deleted")); + } + + return this.RedirectLocal(returnUrl, () => RedirectToAction("Index")); + } + private WorkflowDefinitionViewModel CreateWorkflowDefinitionViewModel(WorkflowDefinitionRecord workflowDefinitionRecord) { if (workflowDefinitionRecord == null) { throw new ArgumentNullException("workflowDefinitionRecord"); @@ -196,6 +215,7 @@ namespace Orchard.Workflows.Controllers { workflow.Activities = new JArray(workflowDefinitionRecord.ActivityRecords.Select(x => { dynamic activity = new JObject(); activity.Name = x.Name; + activity.Id = x.Id; activity.ClientId = x.Name + "_" + x.Id; activity.Left = x.X; activity.Top = x.Y; diff --git a/src/Orchard.Web/Modules/Orchard.Workflows/Drivers/WorkflowDriver.cs b/src/Orchard.Web/Modules/Orchard.Workflows/Drivers/WorkflowDriver.cs index 417298cb7..a89e4b4bb 100644 --- a/src/Orchard.Web/Modules/Orchard.Workflows/Drivers/WorkflowDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Workflows/Drivers/WorkflowDriver.cs @@ -27,7 +27,7 @@ namespace Orchard.Workflows.Drivers { protected override DriverResult Display(CommonPart part, string displayType, dynamic shapeHelper) { return ContentShape("Parts_Workflow_SummaryAdmin", () => { - var workflows = _workflowRepository.Table.Where(x => x.ContentItemRecord == part.ContentItem.Record).Distinct().ToList(); + var workflows = _workflowRepository.Table.Where(x => x.ContentItemRecord == part.ContentItem.Record).ToList(); return shapeHelper.Parts_Workflow_SummaryAdmin().Workflows(workflows); }); } diff --git a/src/Orchard.Web/Modules/Orchard.Workflows/Scripts/orchard-workflows-serialize.js b/src/Orchard.Web/Modules/Orchard.Workflows/Scripts/orchard-workflows-serialize.js index cffb20624..7c1546e8d 100644 --- a/src/Orchard.Web/Modules/Orchard.Workflows/Scripts/orchard-workflows-serialize.js +++ b/src/Orchard.Web/Modules/Orchard.Workflows/Scripts/orchard-workflows-serialize.js @@ -64,7 +64,7 @@ var loadActivities = function (localId) { // activities for (var i = 0; i < workflow.Activities.length; i++) { var activity = workflow.Activities[i]; - renderActivity(activity.ClientId, activity.Name, activity.State, activity.Start, activity.Top, activity.Left); + renderActivity(activity.ClientId, activity.Id, activity.Name, activity.State, activity.Start, activity.Top, activity.Left); } // connections diff --git a/src/Orchard.Web/Modules/Orchard.Workflows/Scripts/orchard-workflows.js b/src/Orchard.Web/Modules/Orchard.Workflows/Scripts/orchard-workflows.js index 2bdc122b9..350dfb8e3 100644 --- a/src/Orchard.Web/Modules/Orchard.Workflows/Scripts/orchard-workflows.js +++ b/src/Orchard.Web/Modules/Orchard.Workflows/Scripts/orchard-workflows.js @@ -77,7 +77,7 @@ } }); - var renderActivity = function (clientId, name, state, start, top, left) { + var renderActivity = function (clientId, id, name, state, start, top, left) { $.ajax({ type: 'POST', @@ -93,6 +93,10 @@ dom.addClass('activity'); + if ($.inArray(id, awaitingRecords) != -1) { + dom.addClass('awaiting'); + } + if (start) { dom.addClass('start'); } diff --git a/src/Orchard.Web/Modules/Orchard.Workflows/Styles/orchard-workflows-admin.css b/src/Orchard.Web/Modules/Orchard.Workflows/Styles/orchard-workflows-admin.css index 458b06e29..f598bbc93 100644 --- a/src/Orchard.Web/Modules/Orchard.Workflows/Styles/orchard-workflows-admin.css +++ b/src/Orchard.Web/Modules/Orchard.Workflows/Styles/orchard-workflows-admin.css @@ -29,6 +29,12 @@ background-repeat: no-repeat; } +.awaiting { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAARCAYAAADUryzEAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAADpJREFUOE9j+P//P0UYqyApGKsgKRhM/P79m+F/TTuEC8P+sf+/fv2KV27UgFEDhpsBlGCsgsTj/wwAFS7Z3zr+A08AAAAASUVORK5CYII='); + background-position: top left; + background-repeat: no-repeat; +} + .activity-toolbox-item.event { background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAATCAYAAACk9eypAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAANNJREFUOE+VkbENhDAMRcOtRElDRRsxB5MwAxNQ0yAGYAJqWiagASFfbMmRHXzcXfGk+Nvf+UocAPzDyxIfMcUnZJF94WYg0ziOkOc50TQNHMehZlQRyLqui4a+74Ok+jrSeZ5TXdc0XJYl7Psu+4Qssm3boKoqMrRtGyRwqHnvo1kZZH4JmxFpcDI/UxQFrOsa2okh5HecH19nGAY6y+1IPKTgbel2RA0xfNsv/0Dwa83zHErdUwWzLIu5HbkJCOa3tiM34bouMljbEVN8whQ/A+4NnH6HdIESjBQAAAAASUVORK5CYII='); background-position: top left; diff --git a/src/Orchard.Web/Modules/Orchard.Workflows/ViewModels/AdminEditViewModel.cs b/src/Orchard.Web/Modules/Orchard.Workflows/ViewModels/AdminEditViewModel.cs index 509f9fa8d..142818641 100644 --- a/src/Orchard.Web/Modules/Orchard.Workflows/ViewModels/AdminEditViewModel.cs +++ b/src/Orchard.Web/Modules/Orchard.Workflows/ViewModels/AdminEditViewModel.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Web.Mvc; +using Orchard.Workflows.Models; using Orchard.Workflows.Services; namespace Orchard.Workflows.ViewModels { @@ -8,6 +9,7 @@ namespace Orchard.Workflows.ViewModels { public bool IsLocal { get; set; } public IEnumerable AllActivities { get; set; } public WorkflowDefinitionViewModel WorkflowDefinition { get; set; } + public WorkflowRecord Workflow { get; set; } } public class UpdatedActivityModel { 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 3315019ca..d58308485 100644 --- a/src/Orchard.Web/Modules/Orchard.Workflows/Views/Admin/Edit.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Workflows/Views/Admin/Edit.cshtml @@ -35,7 +35,7 @@ -
+
style="visibility:hidden"}> @Display.ActivityToolbox(Model)
@@ -49,21 +49,22 @@ var localId = '@HttpUtility.JavaScriptStringEncode(Model.LocalId)'; var updatedActivityClientId = null; var updatedActivityState = null; + var awaitingRecords = []; @if (TempData.ContainsKey("UpdatedViewModel")) { var model = TempData["UpdatedViewModel"] as UpdatedActivityModel; if (model != null) { - - updatedActivityClientId = '@(model.ClientId)'; - updatedActivityState = '@Html.Raw(HttpUtility.JavaScriptStringEncode(FormParametersHelper.ToJsonString(model.Data)))'; - + @: updatedActivityClientId = '@(model.ClientId)'; + @: updatedActivityState = '@Html.Raw(HttpUtility.JavaScriptStringEncode(FormParametersHelper.ToJsonString(model.Data)))'; } } else if (!Model.IsLocal) { - - var state = @Html.Raw(Model.WorkflowDefinition.JsonData); - sessionStorage.setItem(localId, JSON.stringify(state)); - + @: var state = @Html.Raw(Model.WorkflowDefinition.JsonData); + @: sessionStorage.setItem(localId, JSON.stringify(state)); + } + + @if (Model.Workflow != null) { + @: awaitingRecords = [@String.Join(",", Model.Workflow.AwaitingActivities.Select(x => x.ActivityRecord.Id.ToString()).ToArray())]; } //]]> @@ -89,8 +90,12 @@ } -
- - @Html.ActionLink(T("Cancel").Text, "Index", "Admin", new { area = "Orchard.Workflows" }, new { @class = "primaryAction button" }) -
+
+ @* Can only save if not debugging a workflow *@ + @if (Model.Workflow == null) { + + } + + @Html.ActionLink(T("Close").Text, "Index", "Admin", new { area = "Orchard.Workflows" }, new { @class = "primaryAction button" }) +
} diff --git a/src/Orchard.Web/Modules/Orchard.Workflows/Views/Admin/List.cshtml b/src/Orchard.Web/Modules/Orchard.Workflows/Views/Admin/List.cshtml index d2f64a7ad..765fb6ba9 100644 --- a/src/Orchard.Web/Modules/Orchard.Workflows/Views/Admin/List.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Workflows/Views/Admin/List.cshtml @@ -12,6 +12,10 @@   + @if (Model.Workflows.Count == 0) { + @T("No workflows associated with this content item.") + } + @foreach (WorkflowRecord workflow in Model.Workflows) { @@ -28,8 +32,8 @@   - @*@Html.ActionLink(T("Edit").ToString(), "EditWorkflow", new { id = workflow.Id })*@ | - @*@Html.ActionLink(T("Delete").ToString(), "DeleteWorkflow", new { id = workflow.Id }, new { itemprop = "RemoveUrl UnsafeUrl" })*@ + @Html.ActionLink(T("Status").ToString(), "Edit", new { id = workflow.WorkflowDefinitionRecord.Id, workflowId = workflow.Id, ReturnUrl = Html.ViewContext.HttpContext.Request.RawUrl }) | + @Html.ActionLink(T("Delete").ToString(), "DeleteWorkflow", new { id = workflow.Id }, new { itemprop = "RemoveUrl UnsafeUrl", ReturnUrl = Html.ViewContext.HttpContext.Request.RawUrl }) } diff --git a/src/Orchard.Web/Modules/Orchard.Workflows/Views/Parts.Workflow.SummaryAdmin.cshtml b/src/Orchard.Web/Modules/Orchard.Workflows/Views/Parts.Workflow.SummaryAdmin.cshtml index 041d3f649..3a8920b63 100644 --- a/src/Orchard.Web/Modules/Orchard.Workflows/Views/Parts.Workflow.SummaryAdmin.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Workflows/Views/Parts.Workflow.SummaryAdmin.cshtml @@ -6,8 +6,8 @@ @if (count > 0) {