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));
        }
Ejemplo n.º 2
0
        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));
        }
Ejemplo n.º 3
0
        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);
        }