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); }
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); }
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()); }
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()); } } } } }