Adding workflow debugging view

--HG--
branch : 1.x
This commit is contained in:
Sebastien Ros
2013-02-05 11:48:18 -08:00
parent 91070602bc
commit 1086544e9d
9 changed files with 64 additions and 23 deletions

View File

@@ -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;

View File

@@ -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);
});
}

View File

@@ -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

View File

@@ -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');
}

View File

@@ -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;

View File

@@ -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<IActivity> AllActivities { get; set; }
public WorkflowDefinitionViewModel WorkflowDefinition { get; set; }
public WorkflowRecord Workflow { get; set; }
}
public class UpdatedActivityModel {

View File

@@ -35,7 +35,7 @@
</div>
</div>
</div>
<div id="activity-toolbox">
<div id="activity-toolbox" @if(Model.Workflow != null) { <text>style="visibility:hidden"</text>}>
@Display.ActivityToolbox(Model)
</div>
<div id="workflow-footer"></div>
@@ -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) {
<text>
updatedActivityClientId = '@(model.ClientId)';
updatedActivityState = '@Html.Raw(HttpUtility.JavaScriptStringEncode(FormParametersHelper.ToJsonString(model.Data)))';
</text>
@: updatedActivityClientId = '@(model.ClientId)';
@: updatedActivityState = '@Html.Raw(HttpUtility.JavaScriptStringEncode(FormParametersHelper.ToJsonString(model.Data)))';
}
}
else if (!Model.IsLocal) {
<text>
var state = @Html.Raw(Model.WorkflowDefinition.JsonData);
sessionStorage.setItem(localId, JSON.stringify(state));
</text>
@: 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 @@
</script>
}
<fieldset>
<button class="primaryAction" type="submit" name="submit.Save" value="@T("Save")">@T("Save")</button>
@Html.ActionLink(T("Cancel").Text, "Index", "Admin", new { area = "Orchard.Workflows" }, new { @class = "primaryAction button" })
</fieldset>
<fieldset>
@* Can only save if not debugging a workflow *@
@if (Model.Workflow == null) {
<button class="primaryAction" type="submit" name="submit.Save" value="@T("Save")">@T("Save")</button>
}
@Html.ActionLink(T("Close").Text, "Index", "Admin", new { area = "Orchard.Workflows" }, new { @class = "primaryAction button" })
</fieldset>
}

View File

@@ -12,6 +12,10 @@
<th scope="col" class="actions">&nbsp;</th>
</tr>
</thead>
@if (Model.Workflows.Count == 0) {
@T("No workflows associated with this content item.")
}
@foreach (WorkflowRecord workflow in Model.Workflows) {
<tr>
<td>
@@ -28,8 +32,8 @@
&nbsp;
</td>
<td>
@*@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 })
</td>
</tr>
}

View File

@@ -6,8 +6,8 @@
@if (count > 0) {
<ul class="pageStatus">
<li title="@T("Running workflows")" >
<img class="icon" src="@Href("~/Modules/Orchard.Workflows/Styles/Images/cog.png")" alt="@T("Running ({0})", count)" />
@T("Running ({0})", count)
<img class="icon" src="@Href("~/Modules/Orchard.Workflows/Styles/Images/cog.png")" alt="@T("Running ({0})", count)" />
<a href="@Url.Action("List", "Admin", new { area = "Orchard.Workflows", id = (int)Model.ContentPart.Id })">@T("{0} Workflow(s)", count).Text</a>
&nbsp;|&nbsp;
</li>
</ul>