public Task <PhysicalResponse> Handle(FormType formType, string formKey, GraphNode <Key, FormNode> node) { var summaryFormNode = node.AssertType <TaskSummaryFormNode>(); var postTaskNode = node.Neighbors.FindByKey(Key.ForPostTaskPage(summaryFormNode.TaskId)); var taskList = postTaskNode.Neighbors.FindByKey(Key.ForTaskList()); var taskRouter = taskList.Neighbors.FindByKey(Key.ForDecisionTaskRouter(summaryFormNode.TaskId)).AssertType <TaskRouterFormNode>(); var taskItemRouter = node.Neighbors.First(GraphNodePredicates.IsTaskItemRouterNode); var taskItemIds = taskRouter.TaskItemIds.OrderBy(x => x).ToList(); var taskItemRouterValue = taskItemRouter.AssertType <TaskItemRouterFormNode>(); var repeatIndex = taskItemIds.IndexOf(taskItemRouterValue.RepeatIndex); var staticSummaryPage = _staticFormProvider.GetPage(formType, StaticKey.ForTaskSummary(summaryFormNode.TaskId)) as SummaryPage; var task = _staticFormProvider.GetTask(formType, StaticKey.ForTaskNode(summaryFormNode.TaskId)); var taskItemGroup = _summaryService.GetTaskItemSummary(taskItemRouter, task); var flattenedTaskGroupings = taskItemGroup.FlattenTaskGroupings(); return(Task.FromResult(new TaskSummaryResponse { Page = staticSummaryPage, NextNodeId = postTaskNode.Key.Value, TaskGroupings = flattenedTaskGroupings, } as PhysicalResponse)); }
public Task <PhysicalResponse> Handle(FormType formType, string formKey, GraphNode <Key, FormNode> node) { node.AssertType <TaskListFormNode>(); var taskRouters = node.Neighbors.Where(GraphNodePredicates.IsTaskRouterNode); var tasks = new List <TaskListTask>(); foreach (var taskRouter in taskRouters) { var taskNode = taskRouter.AssertType <TaskRouterFormNode>(); var staticTask = _staticFormProvider.GetTask(formType, StaticKey.ForTaskNode(taskNode.TaskId)); var taskListTask = new TaskListTask { Name = staticTask.Name, TaskRouterNodeKey = taskRouter.Key.Value, TaskId = staticTask.Id, GroupNameIndex = staticTask.GroupNameIndex, IsComplete = IsTaskComplete(taskRouter), }; tasks.Add(taskListTask); } var isTaskCompleteList = tasks.Select(x => (x.TaskId, x.IsComplete)).ToList(); foreach (var task in tasks) { var staticTask = _staticFormProvider.GetTask(formType, StaticKey.ForTaskNode(task.TaskId)); task.IsHidden = staticTask.HiddenWhen?.Invoke(isTaskCompleteList) ?? false; } return(Task.FromResult(new TaskListResponse { FormName = _staticFormProvider.GetFormName(formType), Tasks = tasks, TaskGroupNames = _staticFormProvider.GetTaskGroups(formType) } as PhysicalResponse)); }
public async Task <string> DeleteTaskItem(FormType formType, string formKey, string taskNodeId, string taskItemNodeId) { var form = await _formRepository.GetForm(formKey); var taskRouterNode = form.Nodes.FindByKey(new Key(taskNodeId)); var taskRouter = taskRouterNode.AssertType <TaskRouterFormNode>(); var taskItemRouterNode = taskRouterNode.Neighbors.FindByKey(new Key(taskItemNodeId)); var taskItemRouter = taskItemRouterNode.AssertType <TaskItemRouterFormNode>(); var taskItemSummaryNodeKey = Key.ForTaskSummary(taskItemRouter.TaskId, taskItemRouter.RepeatIndex); var postTaskNode = taskRouterNode.Neighbors.FindByKey(Key.ForPostTaskPage(taskItemRouter.TaskId)); var traversal = new GraphTraversalBuilder <Key, FormNode>(TraversalType.BreadthFirstSearch, true) .WithOnNodeDequeuedHandler((props, output) => { // Anything beyond the summary we do not need to delete so we skip visiting the node if (props.Node.Key.Equals(taskItemSummaryNodeKey)) { output.Skip = true; } }) .WithOnNodeDiscoveredHandler((props, output) => { // Prevent queuing the PostTaskNode as we do not want it included in the traversal if (props.Node.Key.Equals(postTaskNode.Key)) { output.ShouldQueue = false; } }) .Build(); var traversalResult = traversal.Run(taskItemRouterNode); foreach (var(traversedNode, _) in traversalResult.TraversalOrder) { form.Remove(traversedNode); } taskRouter.RemoveTaskItem(taskItemRouter.RepeatIndex); var nextNodeId = postTaskNode.Key.Value; // If the last Task has been deleted we need to ensure an empty Item is added if (!taskRouter.TaskItemIds.Any()) { var task = _staticFormProvider.GetTask(formType, StaticKey.ForTaskNode(taskRouter.TaskId)); var nextId = taskRouter.AddTaskItem(); var preTaskNode = taskRouterNode.Neighbors.First(x => x.Value is PreTaskFormNode || x.Value is PreTaskGhost); var newNodes = AddTaskItem(form, taskRouterNode, preTaskNode, postTaskNode, task, nextId); // Add any required edges for new nodes foreach (var(_, (node, nextKey)) in newNodes) { if (nextKey is null) { continue; } if (nextKey.Value == Key.EmptyKey().Value) { continue; } var(nextNode, _) = newNodes[nextKey]; form.AddDirectedEdge(node, nextNode); } // Navigate the user to the new task item instead of the PostTask page nextNodeId = preTaskNode.Key.Value; } await _formRepository.SaveForm(formKey, form); return(nextNodeId); }