private void ActOnTask(DisplayFormUserTask task, TransitionStart userResponse, List <Action> actions) { //TODO: Serialize the workflow runs like the trigger on save. var workflowRun = task.WorkflowRunForTask; if ((task.UserTaskIsComplete ?? false) && (workflowRun != null) && (workflowRun.WorkflowRunStatus_Enum == WorkflowRunState_Enumeration.WorkflowRunPaused)) { var resumeEvent = new UserCompletesTaskEvent { CompletionStateId = userResponse.Id, UserTaskId = task.Id }; var runId = workflowRun.Id; var runInThread = WorkflowRunContext.Current.RunTriggersInCurrentThread; Action act; if (Factory.FeatureSwitch.Get("longRunningWorkflow")) { act = () => ActionOnTask_new(runId, resumeEvent, runInThread); } else { act = () => ActionOnTask_old(runId, resumeEvent, runInThread); } WorkflowRunContext.Current.DeferAction(act); } }
public ITransitionCreator <S, T, G> OnTransitionStarted(TransitionStart function) { if (LastCreatedTransition == null) { return(null); } LastCreatedTransition.OnTransitionStart += function; return(this); }
/// <summary> /// Process an approval /// </summary> /// <param name="taskId">The task to approve</param> /// <param name="selectedOption">Teh selected transition</param> /// <param name="preSaveAction">An optional presave action</param> public static void ProcessApproval(DisplayFormUserTask task, TransitionStart selectedOption, Action <DisplayFormUserTask> preSaveAction = null) { task = task.AsWritable <DisplayFormUserTask>(); task.UserResponse = selectedOption; task.UserTaskCompletedOn = DateTime.UtcNow; // Leave this for the Before save hook, it's currently the only way to know what has changed. task.TaskStatus_Enum = TaskStatusEnum_Enumeration.TaskStatusCompleted; if (preSaveAction != null) { preSaveAction(task); } task.Save(); }
// // Remove dead transitions (this shouldn't be needed if cascade delete is working correctly) bool IsValidTransitionStart(TransitionStart transStart) { var transition = transStart.As <Transition>(); if (transition != null && transition.WorkflowForTransition == null) { return(false); } var termination = transStart.As <Termination>(); if (termination != null && termination.WorkflowForTermination == null) { return(false); } return(true); }
/// <summary> /// Given a reply message containing a completion state for a user task, find the matching state. /// </summary> /// <param name="completionOptions"></param> /// <param name="message"></param> /// <returns>The state, or null if the state was not found</returns> TransitionStart ExtractCompletionOption(IEnumerable <TransitionStart> completionOptions, string message) { var approvalAlternation = completionOptions.Select(o => Regex.Escape(o.Name)) .Aggregate((phrase, next) => phrase + '|' + next); // turn into "Approve|Reject|..." var approvalRegex = new Regex(string.Format("^\\s*({0})", approvalAlternation), RegexOptions.IgnoreCase | RegexOptions.Multiline); var match = approvalRegex.Match(message); TransitionStart completionState = null; if (match.Success) { completionState = completionOptions.First( o => String.Equals(o.Name, match.Groups[1].Value, StringComparison.OrdinalIgnoreCase)); } return(completionState); }