internal static int AddLeadTaskRow( DataGridView dgv, ViewFiltersBuilder viewFiltersBuilder, WorkItemInfoFiller workItemInfoFiller, ViewColumnsIndexes viewColumnsIndexes, FreeDaysCalculator freeDaysCalculator, FocusFactorCalculator focusFactorCalculator, WorkItem leadTask, DataContainer data, Dictionary<int, string> planningAssignments) { dgv.Rows.Add(new DataGridViewRow()); var leadTaskRow = dgv.Rows[dgv.Rows.Count - 1]; List<int> blockersIds = data.BlockersDict.ContainsKey(leadTask.Id) ? data.BlockersDict[leadTask.Id] : null; bool shouldCheckEstimate = workItemInfoFiller.FillLeadTaskInfo( viewFiltersBuilder, leadTask, leadTaskRow, data, blockersIds); viewFiltersBuilder.MarkLeadTaskRow(leadTaskRow); if (blockersIds != null) foreach (int blockerId in blockersIds) { AddBlockerRow( dgv, viewFiltersBuilder, workItemInfoFiller, data, planningAssignments, blockerId); } if (leadTask.IsProposed()) return ScheduleFiller.AddDatesProposed( viewColumnsIndexes, freeDaysCalculator, focusFactorCalculator, leadTask, leadTaskRow, viewColumnsIndexes.FirstDateColumnIndex, m_proposedLtMark, m_proposedLtMark, shouldCheckEstimate); return ScheduleFiller.AddDatesActive( viewColumnsIndexes, freeDaysCalculator, focusFactorCalculator, leadTask, leadTaskRow, viewColumnsIndexes.FirstDateColumnIndex, m_activeLtMark, m_activeLtMark); }
internal ViewFiltersApplier PresentData( DataContainer data, Dictionary<int, string> planningAssignments, List<string> allUsers, ViewColumnsIndexes viewColumnsIndexes, FreeDaysCalculator freeDaysCalculator, FocusFactorCalculator focusFactorCalculator, DataGridView dgv) { var tasksSchedule = WorkItemsScheduler.MakeSchedule( data, planningAssignments, freeDaysCalculator, focusFactorCalculator); var alreadyAdded = new Dictionary<int, int>(); var tasksByUser = new Dictionary<string, int>(); var resultBuilder = new ViewFiltersBuilder(dgv, viewColumnsIndexes); var workItemInfoFiller = new WorkItemInfoFiller(dgv, viewColumnsIndexes); foreach (var leadTaskChildren in data.LeadTaskChildrenDict) { var leadTask = data.WiDict[leadTaskChildren.Key]; int nextLtInd = RowsAdder.AddLeadTaskRow( dgv, resultBuilder, workItemInfoFiller, viewColumnsIndexes, freeDaysCalculator, focusFactorCalculator, leadTask, data, planningAssignments); int ltRowInd = dgv.Rows.Count - 1; var childrenTasks = leadTaskChildren.Value .Where(i => data.WiDict.ContainsKey(i)) .Select(i => data.WiDict[i]) .OrderBy(i => i.Priority() ?? 999) .ToList(); if (childrenTasks.Count > 0) { int lastTaskInd = childrenTasks .Select(task => RowsAdder.AddTaskRow( dgv, resultBuilder, workItemInfoFiller, viewColumnsIndexes, freeDaysCalculator, focusFactorCalculator, task, childrenTasks, leadTask, data, planningAssignments, allUsers, alreadyAdded, tasksByUser, tasksSchedule)) .Max(); ScheduleFiller.ColorFdOutDays( viewColumnsIndexes, freeDaysCalculator, dgv.Rows[ltRowInd], nextLtInd, lastTaskInd); } var notAccessableChildren = leadTaskChildren.Value .Where(i => !data.WiDict.ContainsKey(i)) .ToList(); foreach (int notAccessableChildId in notAccessableChildren) { dgv.Rows.Add(new DataGridViewRow()); var taskRow = dgv.Rows[dgv.Rows.Count - 1]; workItemInfoFiller.FillNotAccessibleTaskInfo(viewColumnsIndexes, taskRow, notAccessableChildId); resultBuilder.MarkTaskRow(taskRow); } } return resultBuilder.Build(); }
internal bool FillLeadTaskInfo( ViewFiltersBuilder viewFiltersBuilder, WorkItem leadTask, DataGridViewRow leadTaskRow, DataContainer data, List<int> blockersIds) { var priorityCell = leadTaskRow.Cells[m_viewColumnsIndexes.PriorityColumnIndex]; priorityCell.Value = leadTask.Priority(); priorityCell.SetColorByState(leadTask); priorityCell.ToolTipText = leadTask.IsDevCompleted() ? WorkItemState.DevCompleted : leadTask.State; var iterationCell = leadTaskRow.Cells[m_viewColumnsIndexes.IterationColumnIndex]; string iteration = leadTask.IterationPath; int ind = iteration.IndexOf(m_iterationSeparator); if (ind != -1) iteration = iteration.Substring(ind + 1); iterationCell.Value = iteration; var sprintCell = leadTaskRow.Cells[m_viewColumnsIndexes.SprintColumnIndex]; sprintCell.Value = leadTask.Sprint(); var idCell = leadTaskRow.Cells[m_viewColumnsIndexes.IdColumnIndex]; idCell.Value = leadTask.Id; idCell.ToolTipText = leadTask.IterationPath; idCell.Style.BackColor = priorityCell.Style.BackColor; var verificationResult = WorkItemVerifier.VerifyChildrenExistance(leadTask, data); if (verificationResult.Result != VerificationResult.Ok) { idCell.SetColorByVerification(verificationResult.Result); idCell.ToolTipText += Environment.NewLine + verificationResult.AllMessagesString; } var docsCell = leadTaskRow.Cells[m_viewColumnsIndexes.DocsColumnIndex]; bool result; verificationResult = WorkItemVerifier.VerifyDocumentsAgreement(leadTask); if (verificationResult.Result == VerificationResult.Ok) { docsCell.Style.BackColor = priorityCell.Style.BackColor; result = true; } else { docsCell.Value = verificationResult.AddidtionalData; docsCell.SetColorByVerification(verificationResult.Result); docsCell.ToolTipText = verificationResult.AllMessagesString; result = false; } var titleCell = leadTaskRow.Cells[m_viewColumnsIndexes.TitleColumnIndex]; titleCell.Value = leadTask.Title; titleCell.Style.Font = new Font( titleCell.Style.Font ?? titleCell.OwningColumn.DefaultCellStyle.Font ?? m_dataGridView.ColumnHeadersDefaultCellStyle.Font, FontStyle.Underline); titleCell.Style.BackColor = priorityCell.Style.BackColor; verificationResult = WorkItemVerifier.VerifyNoProposedChildTask(leadTask, data); if (verificationResult.Result != VerificationResult.Ok) { priorityCell.SetColorByVerification(verificationResult.Result); priorityCell.ToolTipText = verificationResult.AllMessagesString; } var blockersCell = leadTaskRow.Cells[m_viewColumnsIndexes.BlockersColumnIndex]; verificationResult = WorkItemVerifier.VerifyBlockersExistance(blockersIds); if (verificationResult.Result != VerificationResult.Ok) { blockersCell.SetColorByVerification(verificationResult.Result); blockersCell.Value = verificationResult.AllMessagesString; } if (!string.IsNullOrEmpty(leadTask.BlockingReason())) { if (!string.IsNullOrEmpty(leadTaskRow.Cells[4].ToolTipText)) blockersCell.ToolTipText += Environment.NewLine; else blockersCell.Value = leadTask.BlockingReason(); blockersCell.ToolTipText += "Blocking Reason: " + leadTask.BlockingReason(); } leadTaskRow.Cells[m_viewColumnsIndexes.AssignedToColumnIndex].Value = leadTask.AssignedTo(); return result; }
internal void FillTaskInfo( ViewFiltersBuilder viewFiltersBuilder, WorkItem task, List<WorkItem> siblings, WorkItem leadTask, DataGridViewRow taskRow, DataContainer data, Dictionary<int, string> planningAssignments, List<string> allUsers, List<int> blockerIds) { var priorityCell = taskRow.Cells[m_viewColumnsIndexes.PriorityColumnIndex]; priorityCell.Value = task.Priority(); priorityCell.SetColorByState(task); priorityCell.ToolTipText = task.State; var idCell = taskRow.Cells[m_viewColumnsIndexes.IdColumnIndex]; idCell.Value = task.Id; var verificationResult = WorkItemVerifier.VerifyTaskPriority(task, leadTask.Priority()); if (verificationResult.Result != VerificationResult.Ok) { idCell.SetColorByVerification(verificationResult.Result); idCell.ToolTipText = verificationResult.AllMessagesString; } else { verificationResult = WorkItemVerifier.VerifyTaskWithParentOnSameIteration(task, leadTask); if (verificationResult.Result != VerificationResult.Ok) { idCell.SetColorByVerification(verificationResult.Result); idCell.ToolTipText = verificationResult.AllMessagesString; } } var titleCell = taskRow.Cells[m_viewColumnsIndexes.TitleColumnIndex]; titleCell.Value = task.Title; titleCell.ToolTipText = task.Discipline() + " " + task.Title; titleCell.Style.BackColor = priorityCell.Style.BackColor; var blockersCell = taskRow.Cells[m_viewColumnsIndexes.BlockersColumnIndex]; if (blockerIds != null) { string blockerIdsStr = string.Join(",", blockerIds); blockersCell.Value = blockerIdsStr; verificationResult = WorkItemVerifier.VerifyNonChildBlockerExistance(blockerIds, siblings); if (verificationResult.Result == VerificationResult.Ok) verificationResult = WorkItemVerifier.VerifyActiveTaskBlocking(task, blockerIds); if (verificationResult.Result == VerificationResult.Ok) { blockerIdsStr = string.Join(Environment.NewLine, blockerIds.Select(b => data.WiDict[b].Title)); blockersCell.ToolTipText = blockerIdsStr; } else { blockersCell.SetColorByVerification(verificationResult.Result); blockersCell.ToolTipText = verificationResult.AllMessagesString; } } if (!string.IsNullOrEmpty(task.BlockingReason())) { if (!string.IsNullOrEmpty(blockersCell.ToolTipText)) blockersCell.ToolTipText += Environment.NewLine; else blockersCell.Value = task.BlockingReason(); blockersCell.ToolTipText += "Blocking Reason: " + task.BlockingReason(); } var assignedCell = taskRow.Cells[m_viewColumnsIndexes.AssignedToColumnIndex]; var comboBoxCell = assignedCell as DataGridViewComboBoxCell; if (comboBoxCell != null) comboBoxCell.DataSource = allUsers; assignedCell.Value = planningAssignments.GetAssignee(task); verificationResult = WorkItemVerifier.VerifyAssignation(task); if (verificationResult.Result != VerificationResult.Ok) { assignedCell.SetColorByVerification(verificationResult.Result); assignedCell.ToolTipText = verificationResult.AllMessagesString; } var workCell = taskRow.Cells[m_viewColumnsIndexes.WorkColumnIndex]; workCell.Value = task.IsActive() ? task.Remaining() : task.Estimate(); workCell.Style.BackColor = priorityCell.Style.BackColor; }
internal static int AddTaskRow( DataGridView dgv, ViewFiltersBuilder viewFiltersBuilder, WorkItemInfoFiller workItemInfoFiller, ViewColumnsIndexes viewColumnsIndexes, FreeDaysCalculator freeDaysCalculator, FocusFactorCalculator focusFactorCalculator, WorkItem task, List<WorkItem> siblings, WorkItem leadTask, DataContainer data, Dictionary<int, string> planningAssignments, List<string> allUsers, Dictionary<int, int> alreadyAdded, Dictionary<string, int> tasksByUser, Dictionary<int, Tuple<int?, int>> tasksSchedule) { if (alreadyAdded.ContainsKey(task.Id)) return viewColumnsIndexes.FirstDateColumnIndex; var nextInds = new List<int>(); List<int> blockerIds = ProcessBlockers( dgv, viewFiltersBuilder, workItemInfoFiller, viewColumnsIndexes, freeDaysCalculator, focusFactorCalculator, data, planningAssignments, allUsers, task, siblings, leadTask, alreadyAdded, nextInds, tasksByUser, tasksSchedule); dgv.Rows.Add(new DataGridViewRow()); var taskRow = dgv.Rows[dgv.Rows.Count - 1]; workItemInfoFiller.FillTaskInfo( viewFiltersBuilder, task, siblings, leadTask, taskRow, data, planningAssignments, allUsers, blockerIds); viewFiltersBuilder.MarkTaskRow(taskRow); if (blockerIds != null) foreach (int blockerId in blockerIds) { AddBlockerRow( dgv, viewFiltersBuilder, workItemInfoFiller, data, planningAssignments, blockerId); } if (task.IsResolved()) { alreadyAdded.Add(task.Id, viewColumnsIndexes.FirstDateColumnIndex); return viewColumnsIndexes.FirstDateColumnIndex; } string assignedTo = planningAssignments.GetAssignee(task); if (!assignedTo.IsUnassigned() && tasksByUser.ContainsKey(assignedTo)) nextInds.Add(tasksByUser[assignedTo]); int maxNextInd = viewColumnsIndexes.FirstDateColumnIndex; if (nextInds.Count > 0) maxNextInd = nextInds.Max(); string userMark = GetUserMark(assignedTo); Tuple<int?, int> taskSchedule = null; int nextInd; if (tasksSchedule != null && tasksSchedule.ContainsKey(task.Id)) taskSchedule = tasksSchedule[task.Id]; if (taskSchedule != null && taskSchedule.Item1 != null) { nextInd = ScheduleFiller.AddDatesFromSchedule( viewColumnsIndexes, freeDaysCalculator, taskRow, taskSchedule.Item1.Value, taskSchedule.Item2, assignedTo, userMark); } else { nextInd = task.IsProposed() ? ScheduleFiller.AddDatesProposed( viewColumnsIndexes, freeDaysCalculator, focusFactorCalculator, task, taskRow, maxNextInd, assignedTo, userMark, true) : ScheduleFiller.AddDatesActive( viewColumnsIndexes, freeDaysCalculator, focusFactorCalculator, task, taskRow, maxNextInd, assignedTo, userMark); } alreadyAdded.Add(task.Id, nextInd); tasksByUser[assignedTo] = nextInd; return nextInd; }
private static List<int> ProcessBlockers( DataGridView dgv, ViewFiltersBuilder viewFiltersBuilder, WorkItemInfoFiller workItemInfoFiller, ViewColumnsIndexes viewColumnsIndexes, FreeDaysCalculator freeDaysCalculator, FocusFactorCalculator focusFactorCalculator, DataContainer data, Dictionary<int, string> planningAssignments, List<string> allUsers, WorkItem task, List<WorkItem> childrenTasks, WorkItem leadTask, Dictionary<int, int> alreadyAdded, List<int> nextInds, Dictionary<string, int> tasksByUser, Dictionary<int, Tuple<int?, int>> tasksSchedule) { if (!data.BlockersDict.ContainsKey(task.Id)) return null; var blockerIds = data.BlockersDict[task.Id]; var blokers = blockerIds .Where(b => data.WiDict.ContainsKey(b)) .Select(b => data.WiDict[b]) .OrderBy(b => b.Priority()) .ToList(); foreach (var blocker in blokers) { if (alreadyAdded.ContainsKey(blocker.Id)) { nextInds.Add(alreadyAdded[blocker.Id]); continue; } var blockerSiblingTask = childrenTasks.FirstOrDefault(t => t.Id == blocker.Id); if (blockerSiblingTask != null) { int blockerNextInd = AddTaskRow( dgv, viewFiltersBuilder, workItemInfoFiller, viewColumnsIndexes, freeDaysCalculator, focusFactorCalculator, blockerSiblingTask, childrenTasks, leadTask, data, planningAssignments, allUsers, alreadyAdded, tasksByUser, tasksSchedule); nextInds.Add(blockerNextInd); } } return blockerIds; }
private static void AddBlockerRow( DataGridView dgv, ViewFiltersBuilder viewFiltersBuilder, WorkItemInfoFiller workItemInfoFiller, DataContainer data, Dictionary<int, string> planningAssignments, int blockerId) { dgv.Rows.Add(new DataGridViewRow()); var blockerRow = dgv.Rows[dgv.Rows.Count - 1]; WorkItem blocker = data.WiDict[blockerId]; workItemInfoFiller.FillBlockerInfo( blockerRow, blocker, planningAssignments); viewFiltersBuilder.MarkBlockerRow(blockerRow); }