예제 #1
0
        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);
            }
        }
예제 #2
0
        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.");
        }