private async Task CreatePlaceholderItemAsync(SqlConnection cn, int projectId, Milestone milestone) { // if there's already at least one open work item in this milestone, don't create a placeholder var workItems = await cn.QueryAsync <int>( "SELECT [Id] FROM [dbo].[WorkItem] WHERE [ProjectId]=@projectId AND [MilestoneId]=@msId AND [CloseReasonId] IS NULL", new { projectId, msId = milestone.Id }); if (workItems.Any()) { return; } if (!milestone.TeamId.HasValue) { milestone.TeamId = CurrentOrgUser.CurrentTeamId; } // can't create placeholder without known team if (!milestone.TeamId.HasValue) { return; } const string text = @"Placeholder item created with milestone. This enables you to filter for this project on the milestone dashboard. This will automatically close when you add another work item to this milestone."; var team = await cn.FindAsync <Team>(milestone.TeamId.Value); var prj = await cn.FindAsync <Project>(projectId); var workItem = new Ginseng.Models.WorkItem() { OrganizationId = team.OrganizationId, TeamId = team.Id, ApplicationId = prj.ApplicationId, MilestoneId = milestone.Id, ProjectId = projectId, Title = "Placeholder item created with milestone", HtmlBody = $"<p>{text}</p>", TextBody = text }; await workItem.SetNumberAsync(cn); if (await Data.TrySaveAsync(cn, workItem)) { var wil = new WorkItemLabel() { WorkItemId = workItem.Id, LabelId = await GetPlaceholderLabelIdAsync(cn) }; await Data.TrySaveAsync(cn, wil); } }
public async Task <PartialViewResult> WorkItemLabel(int workItemNumber, int labelId, bool selected) { using (var cn = _data.GetConnection()) { var workItem = await cn.FindWhereAsync <WorkItem>(new { OrganizationId = _data.CurrentOrg.Id, number = workItemNumber }); if (workItem != null) { if (selected) { var wil = new WorkItemLabel() { WorkItemId = workItem.Id, LabelId = labelId }; await cn.MergeAsync(wil, _data.CurrentUser); } else { var wil = await cn.FindWhereAsync <WorkItemLabel>(new { WorkItemId = workItem.Id, LabelId = labelId }); if (wil != null) { await cn.DeleteAsync <WorkItemLabel>(wil.Id, _data.CurrentUser); } } var results = await new LabelsInUse() { OrgId = _data.CurrentOrg.Id, WorkItemIds = new int[] { workItem.Id } }.ExecuteAsync(cn); return(PartialView("/Pages/Dashboard/Items/_Labels.cshtml", results)); } } throw new Exception($"Work item number {workItemNumber} not found."); }