protected string GetRowClass(WorkitemInformationViewModel item) { if (item.IsBlocked) { return("table-danger"); } if (item.IsOnHold) { return("table-warning"); } if (string.Equals(item.State, "active", StringComparison.OrdinalIgnoreCase)) { return("table-primary"); } if (string.Equals(item.State, "new", StringComparison.OrdinalIgnoreCase)) { return("table-secondary"); } if (string.Equals(item.State, "resolved", StringComparison.OrdinalIgnoreCase)) { return("table-success"); } return(string.Empty); }
// TODO: DataSource should not have knowledge on the type specific to reporters! public async Task <WorkitemInformationViewModel> GetWorkItemInfo(WorkItemViewModel workItem, IEnumerable <TeamMemberViewModel> team) { (var estimatedToComplete, var timeSpent) = GetEtaMetric(workItem, team, allowZeroEstimate: true); var isInCodeReview = await IsInCodeReview(workItem); if (IsResolved(workItem) || (!IsActive(workItem) && !IsNew(workItem)) || !IsAssignedToTeamMember(workItem, team)) { return(null); } var workItemInfo = new WorkitemInformationViewModel { Id = workItem.WorkItemId, Title = workItem.Fields[WorkItemTitleField], State = workItem.Fields[WorkItemStateField], Url = GetWorkItemUrl(GetProject(workItem), workItem.WorkItemId), // Priority = workItem.Fields[prio] AssignedTo = GetUserReference(workItem.Fields[WorkItemAssignedToField]), Type = workItem.Fields[WorkItemTypeField], IsBlocked = ContainsTag(workItem, "blocked"), IsOnHold = ContainsTag(workItem, "onhold"), Estimated = estimatedToComplete, Spent = timeSpent, PullRequests = Enumerable.Empty <WorkitemPullRequest>(), }; var pullRequestIds = GetPullRequestIds(workItem); if (pullRequestIds != null && pullRequestIds.Any()) { var pullRequests = await _repository.GetAsync <PullRequest>(p => pullRequestIds.Contains(p.PullRequestId)); workItemInfo.PullRequests = pullRequestIds.Select(pId => { var prInfo = new WorkitemPullRequest { Id = pId }; var pr = pullRequests.SingleOrDefault(p => p.PullRequestId == pId); if (pr == null) { return(prInfo); } prInfo.Url = GetPullRequestUrl(GetProject(workItem), pr.Repository, pId); prInfo.Title = pr.Title; prInfo.TimeActive = GetPullRequestActiveTime(pr); prInfo.Author = pr.Author; prInfo.State = pr.State.ToString(); return(prInfo); }); } workItemInfo.Warnings = GetWorkitemWarnings(workItemInfo, workItem); return(workItemInfo); }
private IEnumerable <string> GetWorkitemWarnings(WorkitemInformationViewModel workItem, WorkItemViewModel workItemVM) { if (string.Equals(workItem.State, WorkItemStateActive, StringComparison.OrdinalIgnoreCase) && workItem.Estimated == 0) { yield return("Workitem does not have an estimate"); } if (workItem.Spent / workItem.Estimated > 1.8f) { yield return("Workitem is delayed"); } var activePrWithNoCodeReview = workItem.PullRequests.Any(p => string.Equals(workItem.State, "Active", StringComparison.OrdinalIgnoreCase)) && ContainsTag(workItemVM, "code review"); if (activePrWithNoCodeReview) { yield return("Active Pull Request, but no 'Code Review' tag."); } }