diff --git a/src/Orchard.Web/Modules/Orchard.Workflows/Models/WorkflowContext.cs b/src/Orchard.Web/Modules/Orchard.Workflows/Models/WorkflowContext.cs index 51b7a100b..270aec3d5 100644 --- a/src/Orchard.Web/Modules/Orchard.Workflows/Models/WorkflowContext.cs +++ b/src/Orchard.Web/Modules/Orchard.Workflows/Models/WorkflowContext.cs @@ -43,7 +43,11 @@ namespace Orchard.Workflows.Models { } public object GetState(string key) { - return GetState(key); + if (State == null) { + return null; + } + + return State[key]; } public void SetStateFor(ActivityRecord record, string key, T value) { diff --git a/src/Orchard.Web/Modules/Orchard.Workflows/ResourceManifest.cs b/src/Orchard.Web/Modules/Orchard.Workflows/ResourceManifest.cs index d1247465f..45340b226 100644 --- a/src/Orchard.Web/Modules/Orchard.Workflows/ResourceManifest.cs +++ b/src/Orchard.Web/Modules/Orchard.Workflows/ResourceManifest.cs @@ -19,8 +19,9 @@ namespace Orchard.Workflows { builder.Add().DefineStyle("WorkflowsActivities-SendEmail").SetUrl("workflows-activity-sendemail.css").SetDependencies("WorkflowsAdmin"); builder.Add().DefineStyle("WorkflowsActivities-Timer").SetUrl("workflows-activity-timer.css").SetDependencies("WorkflowsAdmin"); builder.Add().DefineStyle("WorkflowsActivities-UserTask").SetUrl("workflows-activity-usertask.css").SetDependencies("WorkflowsAdmin"); - - builder.Add().DefineStyle("WorkflowsActivities").SetDependencies( + + builder.Add().DefineStyle("WorkflowsActivities").SetUrl("workflows-activity.css") + .SetDependencies( "WorkflowsActivities-Branch", "WorkflowsActivities-ContentCreate", "WorkflowsActivities-ContentPublished", diff --git a/src/Orchard.Web/Modules/Orchard.Workflows/Services/WorkflowManager.cs b/src/Orchard.Web/Modules/Orchard.Workflows/Services/WorkflowManager.cs index 660e8bd1f..85b553a8c 100644 --- a/src/Orchard.Web/Modules/Orchard.Workflows/Services/WorkflowManager.cs +++ b/src/Orchard.Web/Modules/Orchard.Workflows/Services/WorkflowManager.cs @@ -17,7 +17,6 @@ namespace Orchard.Workflows.Services { private readonly IRepository _activityRepository; private readonly IRepository _workflowRepository; private readonly IRepository _awaitingActivityRepository; - private readonly IRepository _workflowDefinitionRepository; private readonly ITokenizer _tokenizer; public WorkflowManager( @@ -25,13 +24,11 @@ namespace Orchard.Workflows.Services { IRepository activityRepository, IRepository workflowRepository, IRepository awaitingActivityRepository, - IRepository workflowDefinitionRepository, ITokenizer tokenizer) { _activitiesManager = activitiesManager; _activityRepository = activityRepository; _workflowRepository = workflowRepository; _awaitingActivityRepository = awaitingActivityRepository; - _workflowDefinitionRepository = workflowDefinitionRepository; _tokenizer = tokenizer; Logger = NullLogger.Instance; @@ -75,41 +72,6 @@ namespace Orchard.Workflows.Services { return; } - var workflowContext = new WorkflowContext { - Content = target, - Tokens = tokens - }; - - // evaluate processing condition - awaitingActivities = awaitingActivities.Where(a => { - - var activityContext = CreateActivityContext(a.ActivityRecord, tokens); - - // check the condition - try { - return activity.CanExecute(workflowContext, activityContext); - } - catch (Exception e) { - Logger.Error("Error while evaluating an activity condition on {0}: {1}", name, e.ToString()); - return false; - } - }).ToList(); - - // evaluate processing condition - startedWorkflows = startedWorkflows.Where(a => { - - var activityContext = CreateActivityContext(a, tokens); - - // check the condition - try { - return activity.CanExecute(workflowContext, activityContext); - } - catch (Exception e) { - Logger.Error("Error while evaluating an activity condition on {0}: {1}", name, e.ToString()); - return false; - } - }).ToList(); - // if no activity record is matching the event, do nothing if (!startedWorkflows.Any() && !awaitingActivities.Any()) { return; @@ -117,11 +79,57 @@ namespace Orchard.Workflows.Services { // resume halted workflows foreach (var awaitingActivityRecord in awaitingActivities) { + var workflowContext = new WorkflowContext { + Content = target, + Tokens = tokens, + Record = awaitingActivityRecord.WorkflowRecord + }; + + var activityContext = CreateActivityContext(awaitingActivityRecord.ActivityRecord, tokens); + + // check the condition + try { + if (!activity.CanExecute(workflowContext, activityContext)) { + continue; + } + } + catch (Exception e) { + Logger.Error("Error while evaluating an activity condition on {0}: {1}", name, e.ToString()); + continue; + } + ResumeWorkflow(awaitingActivityRecord, workflowContext, tokens); } // start new workflows foreach (var activityRecord in startedWorkflows) { + + var workflowContext = new WorkflowContext { + Content = target, + Tokens = tokens, + }; + + var workflowRecord = new WorkflowRecord { + WorkflowDefinitionRecord = activityRecord.WorkflowDefinitionRecord, + State = "{}", + ContentItemRecord = workflowContext.Content.ContentItem.Record + }; + + workflowContext.Record = workflowRecord; + + var activityContext = CreateActivityContext(activityRecord, tokens); + + // check the condition + try { + if(!activity.CanExecute(workflowContext, activityContext)) { + continue; + } + } + catch (Exception e) { + Logger.Error("Error while evaluating an activity condition on {0}: {1}", name, e.ToString()); + continue; + } + StartWorkflow(workflowContext, activityRecord, tokens); } } @@ -135,16 +143,7 @@ namespace Orchard.Workflows.Services { } private void StartWorkflow(WorkflowContext workflowContext, ActivityRecord activityRecord, IDictionary tokens) { - - // workflow halted, create a workflow state - var workflow = new WorkflowRecord { - WorkflowDefinitionRecord = activityRecord.WorkflowDefinitionRecord, - State = "{}", - ContentItemRecord = workflowContext.Content.ContentItem.Record - }; - - workflowContext.Record = workflow; - + // signal every activity that the workflow is about to start var cancellationToken = new CancellationToken(); InvokeActivities(activity => activity.OnWorkflowStarting(workflowContext, cancellationToken)); @@ -165,11 +164,12 @@ namespace Orchard.Workflows.Services { } else { // workflow halted, create a workflow state - _workflowRepository.Create(workflow); + _workflowRepository.Create(workflowContext.Record); foreach (var blocking in blockedOn) { - workflow.AwaitingActivities.Add(new AwaitingActivityRecord { + workflowContext.Record.AwaitingActivities.Add(new AwaitingActivityRecord { ActivityRecord = blocking, + WorkflowRecord = workflowContext.Record }); } } diff --git a/src/Orchard.Web/Modules/Orchard.Workflows/Styles/workflows-activity.css b/src/Orchard.Web/Modules/Orchard.Workflows/Styles/workflows-activity.css new file mode 100644 index 000000000..5f282702b --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Workflows/Styles/workflows-activity.css @@ -0,0 +1 @@ + \ No newline at end of file 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 765fb6ba9..c2e44d220 100644 --- a/src/Orchard.Web/Modules/Orchard.Workflows/Views/Admin/List.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Workflows/Views/Admin/List.cshtml @@ -2,41 +2,42 @@ @using Orchard.Workflows.Models

@Html.TitleForPage(T("Running workflows").ToString())

-
- - - - - - - - - - @if (Model.Workflows.Count == 0) { - @T("No workflows associated with this content item.") - } +@using (Html.BeginFormAntiForgeryPost()) { +
+
 ↓@T("Worfklow Definition")Blocking activities 
+ + + + + + + + + @if (Model.Workflows.Count == 0) { + @T("No workflows associated with this content item.") + } - @foreach (WorkflowRecord workflow in Model.Workflows) { - - - - - - - } -
 ↓@T("Worfklow Definition")Blocking activities 
-   - - @Html.ActionLink(workflow.WorkflowDefinitionRecord.Name, "Edit", new { id = workflow.WorkflowDefinitionRecord.Id }) - - @foreach (AwaitingActivityRecord awaiting in workflow.AwaitingActivities) { - @awaiting.ActivityRecord.Name.CamelFriendly() -
- } -   -
- @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 }) -
-
- \ No newline at end of file + @foreach (WorkflowRecord workflow in Model.Workflows) { + + +   + + + @Html.ActionLink(workflow.WorkflowDefinitionRecord.Name, "Edit", new {id = workflow.WorkflowDefinitionRecord.Id}) + + + @foreach (AwaitingActivityRecord awaiting in workflow.AwaitingActivities) { + @awaiting.ActivityRecord.Name.CamelFriendly() +
+ } +   + + + @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}) + + + } + + +} \ No newline at end of file