예제 #1
0
        public static List <TaskGrouping> FlattenTaskGroupings(this TaskGrouping taskGrouping)
        {
            var result = new List <TaskGrouping>
            {
                taskGrouping
            };

            var newList = new List <BaseDisplayItem>();

            for (var i = 0; i < taskGrouping.Items.Count; i++)
            {
                var item = taskGrouping.Items[i];

                if (item is TaskDisplayItem)
                {
                    newList.Add(item);
                    continue;
                }
                if (item is TaskGrouping group)
                {
                    result.AddRange(FlattenTaskGroupings(group));
                }
            }

            taskGrouping.Items = newList;

            return(result);
        }
예제 #2
0
        public TaskGrouping GetTaskItemSummary(GraphNode <Key, FormNode> taskItemNode, Task task, int?repeatIndex = null)
        {
            taskItemNode.AssertType <TaskItemRouterFormNode>();

            var taskItemGroup = new TaskGrouping
            {
                Name   = CreateDisplayName(task.Name, repeatIndex),
                NodeId = taskItemNode.Key.Value,
                Items  = new List <BaseDisplayItem>()
            };

            var currentItem = taskItemNode.Neighbors.First(GraphNodePredicates.IsAnyTaskItemNode);

            while (currentItem != null)
            {
                AddTaskDisplayItem(taskItemGroup, task.TaskItems, currentItem);

                if (currentItem.IsSubTaskRouterNode(out var subTaskRouterFormNode))
                {
                    var postSubTask = currentItem.Neighbors.First(GraphNodePredicates.IsPostSubTaskNode);
                    currentItem = postSubTask.Neighbors.FirstOrDefault(x =>
                                                                       x.IsAnyTaskItemNode() && !(x.IsSubTaskRouterNode(out var str) &&
                                                                                                  str.SubTaskId == subTaskRouterFormNode.SubTaskId));
                }
                else
                {
                    currentItem = currentItem.Neighbors.FirstOrDefault(x => x.IsAnyTaskItemNode());
                }
            }

            return(taskItemGroup);
        }
예제 #3
0
        public static string BuildTaskString(TaskGrouping grouping)
        {
            var builder = new StringBuilder();

            builder.AppendLine("---");
            builder.AppendLine(grouping.Name);
            string lastItemHeader = null;

            foreach (var item in grouping.Items)
            {
                if (item is TaskGrouping group)
                {
                    builder.AppendLine(BuildTaskString(group));
                    lastItemHeader = null;
                }

                if (item is TaskDisplayItem displayItem)
                {
                    if (lastItemHeader != displayItem.Header)
                    {
                        lastItemHeader = displayItem.Header;
                        builder.AppendLine(displayItem.Header);
                        builder.AppendLine(" ");
                    }

                    if (!string.IsNullOrEmpty(displayItem.QuestionText))
                    {
                        builder.AppendLine("^ " + displayItem.QuestionText);
                    }

                    builder.AppendLine("^ " + (displayItem.Question?.Answer?.AnswerAsString ?? "None provided"));
                    builder.AppendLine(" ");
                }
            }

            return(builder.ToString());
        }
예제 #4
0
        private void AddTaskDisplayItem(TaskGrouping taskItemGroup, List <ITaskItem> taskItems, GraphNode <Key, FormNode> currentFormNode)
        {
            if (!currentFormNode.IsAnyTaskItemNode())
            {
                throw new UnexpectedNodeTypeException <TaskQuestionPageFormNode, SubTaskRouterFormNode, TaskQuestionGhost>(currentFormNode.Value);
            }

            if (currentFormNode.IsTaskQuestionGhost())
            {
                return;
            }

            if (currentFormNode.IsTaskQuestionPageNode(out var taskQuestionPageFormNode))
            {
                var taskItem = (TaskQuestionPage)taskItems.First(x => x.Id == taskQuestionPageFormNode.PageId);

                foreach (var question in taskItem.Questions)
                {
                    taskItemGroup.Items.Add(new TaskDisplayItem
                    {
                        NodeId       = currentFormNode.Key.Value,
                        Header       = taskItem.Header,
                        QuestionText = question.Label,
                        Question     = taskQuestionPageFormNode.Questions.FirstOrDefault(x => x.Id == question.Id)
                    });
                }
            }

            if (currentFormNode.IsSubTaskRouterNode(out var subTaskRouterFormNode))
            {
                var taskItem = (SubTask)taskItems.First(x => x.Id == subTaskRouterFormNode.SubTaskId);

                var subTaskItems   = currentFormNode.Neighbors.Where(GraphNodePredicates.IsSubTaskItemRouterNode);
                var orderedItemIds = subTaskRouterFormNode.TaskItemIds.OrderBy(x => x).ToList();


                foreach (var subTaskItem in subTaskItems)
                {
                    var subTaskItemIndex = orderedItemIds.IndexOf(subTaskItem.AssertType <SubTaskItemRouterFormNode>().RepeatIndex);

                    var subTaskGroup = new TaskGrouping
                    {
                        Name   = CreateDisplayName(taskItem.DisplayName, orderedItemIds.Count == 1 ? (int?)null : subTaskItemIndex),
                        NodeId = currentFormNode.Key.Value,
                        Items  = new List <BaseDisplayItem>()
                    };

                    taskItemGroup.Items.Add(subTaskGroup);

                    var currentItem = subTaskItem.Neighbors.First(GraphNodePredicates.IsAnyTaskItemNode);

                    while (currentItem != null)
                    {
                        AddTaskDisplayItem(subTaskGroup, taskItem.TaskItems, currentItem);

                        if (currentItem.IsSubTaskRouterNode(out var childSubTaskRouterFormNode))
                        {
                            var postSubTask = currentItem.Neighbors.First(GraphNodePredicates.IsPostSubTaskNode);
                            currentItem = postSubTask.Neighbors.FirstOrDefault(x =>
                                                                               x.IsAnyTaskItemNode() && !(x.IsSubTaskRouterNode(out var str) &&
                                                                                                          str.SubTaskId == childSubTaskRouterFormNode.SubTaskId));
                        }
                        else
                        {
                            currentItem = currentItem.Neighbors.FirstOrDefault(x => x.IsAnyTaskItemNode());
                        }
                    }
                }
            }
        }