--HG--
branch : 1.x
This commit is contained in:
Bertrand Le Roy
2013-02-05 13:19:31 -08:00
30 changed files with 286 additions and 73 deletions

View File

@@ -120,8 +120,8 @@ namespace Orchard.Workflows.Activities {
foreach (var action in awaiting) {
var tokens = new Dictionary<string, object> { { "Content", _contentManager.Get(action.ContentItemRecord.Id, VersionOptions.Latest) } };
var contentItem = _contentManager.Get(action.ContentItemRecord.Id, VersionOptions.Latest);
var tokens = new Dictionary<string, object> { { "Content", _contentManager.Get(action.WorkflowRecord.ContentItemRecord.Id, VersionOptions.Latest) } };
var contentItem = _contentManager.Get(action.WorkflowRecord.ContentItemRecord.Id, VersionOptions.Latest);
var workflowState = FormParametersHelper.FromJsonString(action.WorkflowRecord.State);
workflowState.TimerActivity_StartedUtc = null;
action.WorkflowRecord.State = FormParametersHelper.ToJsonString(workflowState);

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;
@@ -25,6 +26,7 @@ namespace Orchard.Workflows.Controllers {
public class AdminController : Controller, IUpdateModel {
private readonly ISiteService _siteService;
private readonly IRepository<WorkflowDefinitionRecord> _workflowDefinitionRecords;
private readonly IRepository<WorkflowRecord> _workflowRecords;
private readonly IActivitiesManager _activitiesManager;
private readonly IFormManager _formManager;
@@ -33,11 +35,13 @@ namespace Orchard.Workflows.Controllers {
IShapeFactory shapeFactory,
ISiteService siteService,
IRepository<WorkflowDefinitionRecord> workflowDefinitionRecords,
IRepository<WorkflowRecord> workflowRecords,
IActivitiesManager activitiesManager,
IFormManager formManager
) {
_siteService = siteService;
_workflowDefinitionRecords = workflowDefinitionRecords;
_workflowRecords = workflowRecords;
_activitiesManager = activitiesManager;
_formManager = formManager;
Services = services;
@@ -107,6 +111,26 @@ namespace Orchard.Workflows.Controllers {
return View(model);
}
public ActionResult List(int id) {
if (!Services.Authorizer.Authorize(StandardPermissions.SiteOwner, T("Not authorized to list workflows")))
return new HttpUnauthorizedResult();
var contentItem = Services.ContentManager.Get(id, VersionOptions.Latest);
if (contentItem == null) {
return HttpNotFound();
}
var workflows = _workflowRecords.Table.Where(x => x.ContentItemRecord == contentItem.Record).ToList();
var viewModel = New.ViewModel(
ContentItem: contentItem,
Workflows: workflows
);
return View(viewModel);
}
public ActionResult Create() {
if (!Services.Authorizer.Authorize(StandardPermissions.SiteOwner, T("Not authorized to create workflows")))
return new HttpUnauthorizedResult();
@@ -128,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);
@@ -161,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");
@@ -174,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;
@@ -268,11 +310,14 @@ namespace Orchard.Workflows.Controllers {
return HttpNotFound();
}
IShape shape = New.Activity(activity);
dynamic shape = New.Activity(activity);
if (model.State != null) {
var dynamicState = FormParametersHelper.ToDynamic(FormParametersHelper.ToString(model.State));
((dynamic)shape).State(dynamicState);
var state = FormParametersHelper.ToDynamic(FormParametersHelper.ToString(model.State));
shape.State(state);
}
else {
shape.State(FormParametersHelper.FromJsonString("{}"));
}
shape.Metadata.Alternates.Add("Activity__" + activity.Name);

View File

@@ -47,7 +47,7 @@ namespace Orchard.Workflows.Drivers {
var workContext = _workContextAccessor.GetContext();
var user = workContext.CurrentUser;
var awaiting = _awaitingActivityRepository.Table.Where(x => x.ContentItemRecord == part.ContentItem.Record && x.ActivityRecord.Name == "UserTask").ToList();
var awaiting = _awaitingActivityRepository.Table.Where(x => x.WorkflowRecord.ContentItemRecord == part.ContentItem.Record && x.ActivityRecord.Name == "UserTask").ToList();
var actions = awaiting.Where(x => UserIsInRole(x, user)).SelectMany(ListAction).ToList();
return shapeHelper.UserTask_ActionButton().Actions(actions);
@@ -87,7 +87,7 @@ namespace Orchard.Workflows.Drivers {
var user = Services.WorkContext.CurrentUser;
var awaiting = _awaitingActivityRepository.Table.Where(x => x.ContentItemRecord == part.ContentItem.Record && x.ActivityRecord.Name == "UserTask").ToList();
var awaiting = _awaitingActivityRepository.Table.Where(x => x.WorkflowRecord.ContentItemRecord == part.ContentItem.Record && x.ActivityRecord.Name == "UserTask").ToList();
var actions = awaiting.Where(x => UserIsInRole(x, user)).SelectMany(ListAction).ToList();
if (!actions.Contains(name)) {

View File

@@ -7,13 +7,13 @@ using Orchard.Workflows.Models;
namespace Orchard.Workflows.Drivers {
public class WorkflowDriver : ContentPartDriver<CommonPart> {
private readonly IRepository<AwaitingActivityRecord> _awaitingActivityRepository;
private readonly IRepository<WorkflowRecord> _workflowRepository;
public WorkflowDriver(
IOrchardServices services,
IRepository<AwaitingActivityRecord> awaitingActivityRepository
IRepository<WorkflowRecord> workflowRepository
) {
_awaitingActivityRepository = awaitingActivityRepository;
_workflowRepository = workflowRepository;
T = NullLocalizer.Instance;
Services = services;
}
@@ -27,8 +27,8 @@ namespace Orchard.Workflows.Drivers {
protected override DriverResult Display(CommonPart part, string displayType, dynamic shapeHelper) {
return ContentShape("Parts_Workflow_SummaryAdmin", () => {
var awaiting = _awaitingActivityRepository.Table.Where(x => x.ContentItemRecord == part.ContentItem.Record).ToList();
return shapeHelper.Parts_Workflow_SummaryAdmin().Activities(awaiting.Select(x => x.ActivityRecord));
var workflows = _workflowRepository.Table.Where(x => x.ContentItemRecord == part.ContentItem.Record).ToList();
return shapeHelper.Parts_Workflow_SummaryAdmin().Workflows(workflows);
});
}
}

View File

@@ -1,5 +1,4 @@
using System.Collections.Generic;
using System.Linq;
using System.Linq;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Handlers;
using Orchard.Data;
@@ -10,17 +9,16 @@ namespace Orchard.Workflows.Handlers {
public class WorkflowHandler : ContentHandler {
public WorkflowHandler(
IRepository<AwaitingActivityRecord> awaitingActivityRepository,
IRepository<WorkflowRecord> workflowRepository
) {
// Delete any pending workflow related to a deleted content item
OnRemoving<ContentPart>(
(context, part) => {
var awaiting = awaitingActivityRepository.Table.Where(x => x.ContentItemRecord == context.ContentItemRecord).ToList();
var workflows = workflowRepository.Table.Where(x => x.ContentItemRecord == context.ContentItemRecord).ToList();
foreach (var item in awaiting) {
workflowRepository.Delete(item.WorkflowRecord);
foreach (var item in workflows) {
workflowRepository.Delete(item);
}
});
}

View File

@@ -19,7 +19,8 @@ namespace Orchard.Workflows {
.Column<int>("Id", column => column.PrimaryKey().Identity())
.Column<string>("State", column => column.Unlimited())
.Column<int>("WorkflowDefinitionRecord_id")
);
.Column<int>("ContentItemRecord_id")
);
// Creating table WorkflowDefinitionRecord
SchemaBuilder.CreateTable("WorkflowDefinitionRecord", table => table
@@ -32,7 +33,6 @@ namespace Orchard.Workflows {
SchemaBuilder.CreateTable("AwaitingActivityRecord", table => table
.Column<int>("Id", column => column.PrimaryKey().Identity())
.Column<int>("ActivityRecord_id")
.Column<int>("ContentItemRecord_id")
.Column<int>("WorkflowRecord_id")
);

View File

@@ -1,13 +1,9 @@
using Orchard.ContentManagement.Records;
namespace Orchard.Workflows.Models {
namespace Orchard.Workflows.Models {
public class AwaitingActivityRecord {
public virtual int Id { get; set; }
public virtual ActivityRecord ActivityRecord { get; set; }
public virtual ContentItemRecord ContentItemRecord { get; set; }
// Parent property
public virtual WorkflowRecord WorkflowRecord { get; set; }
}

View File

@@ -1,4 +1,5 @@
using System.Collections.Generic;
using Orchard.ContentManagement.Records;
using Orchard.Data.Conventions;
namespace Orchard.Workflows.Models {
@@ -25,6 +26,11 @@ namespace Orchard.Workflows.Models {
[CascadeAllDeleteOrphan]
public virtual IList<AwaitingActivityRecord> AwaitingActivities { get; set; }
/// <summary>
/// The associated content item
/// </summary>
public virtual ContentItemRecord ContentItemRecord { get; set; }
/// <summary>
/// Parent <see cref="WorkflowDefinitionRecord"/>
/// </summary>

View File

@@ -4,6 +4,7 @@ Author: The Orchard Team
Website: http://orchardproject.net
Version: 1.0
OrchardVersion: 1.0
Category: Content
Description: Description for the module
Features:
Orchard.Workflows:

View File

@@ -71,6 +71,7 @@
<Content Include="Scripts\jquery.jsPlumb-1.3.16-all-min.js" />
<Content Include="Scripts\orchard-workflows-serialize.js" />
<Content Include="Scripts\orchard-workflows.js" />
<Content Include="Styles\images\cog.png" />
<Content Include="Styles\workflows-activity-delete-publish.css" />
<Content Include="Styles\workflows-activity-timer.css" />
<Content Include="Styles\workflows-activity-branch.css" />
@@ -203,7 +204,7 @@
<Content Include="Views\Activity-IsInRole.cshtml" />
</ItemGroup>
<ItemGroup>
<Folder Include="Styles\images\" />
<Content Include="Views\Admin\List.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Activity-SendEmail.cshtml" />

View File

@@ -1,6 +1,6 @@
<Placement>
<Match DisplayType="SummaryAdmin">
<Place Parts_Workflow_SummaryAdmin="Meta:5"/>
<Place Parts_Workflow_SummaryAdmin="Meta:2"/>
</Match>
<Place UserTask_ActionButton="Sidebar:24.1"/>

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

@@ -11,7 +11,7 @@ namespace Orchard.Workflows.Services {
}
public IEnumerable<IActivity> GetActivities() {
return _activities.ToReadOnlyCollection();
return _activities.OrderBy(x => x.Name).ToReadOnlyCollection();
}
public IActivity GetActivityByName(string name) {

View File

@@ -66,7 +66,7 @@ namespace Orchard.Workflows.Services {
// it's important to return activities at this point as a workflow could be awaiting
// on several ones. When an activity is restarted, all the other ones of the same workflow are cancelled.
awaitingActivities.AddRange(_awaitingActivityRepository.Table.Where(
x => x.ActivityRecord.Name == name && x.ActivityRecord.Start == false && x.ContentItemRecord == target.ContentItem.Record
x => x.ActivityRecord.Name == name && x.ActivityRecord.Start == false && x.WorkflowRecord.ContentItemRecord == target.ContentItem.Record
).ToList()
);
@@ -139,7 +139,8 @@ namespace Orchard.Workflows.Services {
// workflow halted, create a workflow state
var workflow = new WorkflowRecord {
WorkflowDefinitionRecord = activityRecord.WorkflowDefinitionRecord,
State = "{}"
State = "{}",
ContentItemRecord = workflowContext.Content.ContentItem.Record
};
workflowContext.Record = workflow;
@@ -169,7 +170,6 @@ namespace Orchard.Workflows.Services {
foreach (var blocking in blockedOn) {
workflow.AwaitingActivities.Add(new AwaitingActivityRecord {
ActivityRecord = blocking,
ContentItemRecord = workflowContext.Content.ContentItem.Record
});
}
}
@@ -205,7 +205,6 @@ namespace Orchard.Workflows.Services {
foreach (var blocking in blockedOn) {
workflow.AwaitingActivities.Add(new AwaitingActivityRecord {
ActivityRecord = blocking,
ContentItemRecord = workflowContext.Content.ContentItem.Record
});
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 B

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

@@ -2,8 +2,12 @@
@{
string name = Model.Name;
string notification = Model.State.Notification;
string message = Model.State.Message;
string description = String.IsNullOrEmpty(notification) ? "" : T("{0}: {1}", notification, message).ToString();
}
<div class="activity-notify" title="@Model.State.Notification: @Model.State.Message">
<div class="activity-notify" title="@description">
<div>@name.CamelFriendly()</div>
</div>

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())];
}
//]]>
@@ -74,7 +75,7 @@
@Html.Hidden("localId", Model.LocalId)
@Html.Hidden("data", String.Empty)
@Html.Hidden("confirm-delete-activity", T("Delete activity ?"))
@Html.Hidden("confirm-delete-activity", T("Are you sure you want to remove this activity?"))
using (Script.Foot()) {
<script type="text/javascript">
@@ -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

@@ -1,5 +1,4 @@
@model Orchard.Workflows.ViewModels.AdminIndexViewModel
@using Orchard.Workflows.Models;
@model AdminIndexViewModel
@using Orchard.Workflows.ViewModels;
@{
@@ -12,10 +11,10 @@
}
}
<h1>@Html.TitleForPage(T("Manage Workflows").ToString()) </h1>
<h1>@Html.TitleForPage(T("Manage Workflow Definitions").ToString()) </h1>
@using (Html.BeginFormAntiForgeryPost()) {
@Html.ValidationSummary()
<div class="manage">@Html.ActionLink(T("Create new Wokflow").ToString(), "Create", new { Area = "Orchard.Workflows", returnurl = HttpContext.Current.Request.RawUrl }, new { @class = "button primaryAction" })</div>
<div class="manage">@Html.ActionLink(T("Create new Wokflow Definition").ToString(), "Create", new { Area = "Orchard.Workflows", returnurl = HttpContext.Current.Request.RawUrl }, new { @class = "button primaryAction" })</div>
<fieldset class="bulk-actions">
<label for="publishActions">@T("Actions:")</label>
@@ -46,6 +45,7 @@
<tr>
<th scope="col" class="checkbox">&nbsp;&darr;</th>
<th scope="col">@T("Name")</th>
<th scope="col">&nbsp;</th>
<th scope="col" class="actions">&nbsp;</th>
</tr>
</thead>
@@ -58,6 +58,12 @@
<td>
@Html.ActionLink(entry.Name, "Edit", new { id = entry.WokflowDefinitionId })
</td>
<td>
@if (entry.WorkflowDefinitionRecord.WorkflowRecords.Any()) {
@T("{0} Running", entry.WorkflowDefinitionRecord.WorkflowRecords.Count)
}
&nbsp;
</td>
<td>
@* TODO: As WD is not a Content Item, an EditProperties action is necessary @Html.ActionLink(T("Properties").ToString(), "Edit", new { Area = "Contents", id = entry.WokflowDefinitionId, returnurl = HttpContext.Current.Request.RawUrl }) |*@
@Html.ActionLink(T("Edit").ToString(), "Edit", new { id = entry.WokflowDefinitionId }) |

View File

@@ -0,0 +1,42 @@
@using Orchard.Utility.Extensions
@using Orchard.Workflows.Models
<h1>@Html.TitleForPage(T("Running workflows").ToString()) </h1>
<fieldset>
<table class="items">
<thead>
<tr>
<th scope="col" class="checkbox">&nbsp;&darr;</th>
<th scope="col">@T("Worfklow Definition")</th>
<th scope="col">Blocking activities</th>
<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>
&nbsp;
</td>
<td>
@Html.ActionLink(workflow.WorkflowDefinitionRecord.Name, "Edit", new { id = workflow.WorkflowDefinitionRecord.Id })
</td>
<td>
@foreach (AwaitingActivityRecord awaiting in workflow.AwaitingActivities) {
@awaiting.ActivityRecord.Name.CamelFriendly()
<br/>
}
&nbsp;
</td>
<td>
@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>
}
</table>
</fieldset>

View File

@@ -1,10 +1,14 @@
@{
IEnumerable<Orchard.Workflows.Models.ActivityRecord> activities = Model.Activities;
IEnumerable<Orchard.Workflows.Models.WorkflowRecord> activities = Model.Workflows;
var count = activities.Count();
}
@if (count > 0) {
<div>
@T("{0} active workflow(s)", count)
</div>
<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)" />
<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>
}

View File

@@ -5,6 +5,7 @@ Website: http://orchardproject.net
Version: 1.6
OrchardVersion: 1.6
Description: Description for the module
Category: Developer
Features:
UpgradeTo16:
Description: Description for feature UpgradeTo16.