diff --git a/models/issues/milestone.go b/models/issues/milestone.go index 52433e735d..67a23246cf 100644 --- a/models/issues/milestone.go +++ b/models/issues/milestone.go @@ -67,6 +67,13 @@ type Milestone struct { TotalTrackedTime int64 `xorm:"-"` } +// Ghost milestone is a milestone which has been deleted +const GhostMilestoneID = -1 + +func (m *Milestone) IsGhost() bool { + return m.ID == GhostMilestoneID +} + func init() { db.RegisterModel(new(Milestone)) } diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index 3f17e30cec..5e228507c0 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -1693,7 +1693,7 @@ func ViewIssue(ctx *context.Context) { return } ghostMilestone := &issues_model.Milestone{ - ID: -1, + ID: issues_model.GhostMilestoneID, Name: ctx.Locale.TrString("repo.issues.deleted_milestone"), } if comment.OldMilestoneID > 0 && comment.OldMilestone == nil { diff --git a/templates/repo/issue/view_content/comments.tmpl b/templates/repo/issue/view_content/comments.tmpl index aca77a92e5..2e9ba3dcd7 100644 --- a/templates/repo/issue/view_content/comments.tmpl +++ b/templates/repo/issue/view_content/comments.tmpl @@ -191,7 +191,31 @@ {{template "shared/user/avatarlink" dict "user" .Poster}} {{template "shared/user/authorlink" .Poster}} - {{if gt .OldMilestoneID 0}}{{if gt .MilestoneID 0}}{{ctx.Locale.Tr "repo.issues.change_milestone_at" .OldMilestone.Name .Milestone.Name $createdStr}}{{else}}{{ctx.Locale.Tr "repo.issues.remove_milestone_at" .OldMilestone.Name $createdStr}}{{end}}{{else if gt .MilestoneID 0}}{{ctx.Locale.Tr "repo.issues.add_milestone_at" .Milestone.Name $createdStr}}{{end}} + {{$newMilestoneDisplayHtml := ""}} + {{if gt .MilestoneID 0}} + {{if .Milestone.IsGhost}} + {{$newMilestoneDisplayHtml = .Milestone.Name}} + {{else}} + {{$newMilestoneDisplayHtml = HTMLFormat `%s` $.RepoLink .MilestoneID .Milestone.Name}} + {{end}} + {{end}} + {{$oldMilestoneDisplayHtml := ""}} + {{if gt .OldMilestoneID 0}} + {{if .OldMilestone.IsGhost}} + {{$oldMilestoneDisplayHtml = .OldMilestone.Name}} + {{else}} + {{$oldMilestoneDisplayHtml = HTMLFormat `%s` $.RepoLink .OldMilestoneID .OldMilestone.Name}} + {{end}} + {{end}} + {{if gt .OldMilestoneID 0}} + {{if gt .MilestoneID 0}} + {{ctx.Locale.Tr "repo.issues.change_milestone_at" $oldMilestoneDisplayHtml $newMilestoneDisplayHtml $createdStr}} + {{else}} + {{ctx.Locale.Tr "repo.issues.remove_milestone_at" $oldMilestoneDisplayHtml $createdStr}} + {{end}} + {{else}} + {{ctx.Locale.Tr "repo.issues.add_milestone_at" $newMilestoneDisplayHtml $createdStr}} + {{end}} {{else if and (eq .Type 9) (gt .AssigneeID 0)}} @@ -574,27 +598,33 @@ {{template "shared/user/avatarlink" dict "user" .Poster}} {{template "shared/user/authorlink" .Poster}} - {{$oldProjectDisplayHtml := "Unknown Project"}} + {{$oldProjectDisplayHtml := ""}} {{if .OldProject}} - {{$tooltip := ctx.Locale.Tr "projects.deleted.display_name"}} - {{if not .OldProject.IsGhost}} - {{$tooltip = ctx.Locale.Tr (printf "projects.type-%d.display_name" .OldProject.Type)}} + {{if .OldProject.IsGhost}} + {{$tooltip := ctx.Locale.Tr "projects.deleted.display_name"}} + {{$oldProjectDisplayHtml = HTMLFormat `%s` $tooltip .OldProject.Title}} + {{else}} + {{$tooltip := ctx.Locale.Tr (printf "projects.type-%d.display_name" .OldProject.Type)}} + {{$oldProjectDisplayHtml = HTMLFormat `%s` $.RepoLink .OldProjectID $tooltip .OldProject.Title}} {{end}} - {{$oldProjectDisplayHtml = HTMLFormat `%s` $tooltip .OldProject.Title}} {{end}} - {{$newProjectDisplayHtml := "Unknown Project"}} + {{$newProjectDisplayHtml := ""}} {{if .Project}} - {{$tooltip := ctx.Locale.Tr "projects.deleted.display_name"}} - {{if not .Project.IsGhost}} - {{$tooltip = ctx.Locale.Tr (printf "projects.type-%d.display_name" .Project.Type)}} + {{if .Project.IsGhost}} + {{$tooltip := ctx.Locale.Tr "projects.deleted.display_name"}} + {{$newProjectDisplayHtml = HTMLFormat `%s` $tooltip .Project.Title}} + {{else}} + {{$tooltip := ctx.Locale.Tr (printf "projects.type-%d.display_name" .Project.Type)}} + {{$newProjectDisplayHtml = HTMLFormat `%s` $.RepoLink .ProjectID $tooltip .Project.Title}} {{end}} - {{$newProjectDisplayHtml = HTMLFormat `%s` $tooltip .Project.Title}} {{end}} - {{if and (gt .OldProjectID 0) (gt .ProjectID 0)}} - {{ctx.Locale.Tr "repo.issues.change_project_at" $oldProjectDisplayHtml $newProjectDisplayHtml $createdStr}} - {{else if gt .OldProjectID 0}} - {{ctx.Locale.Tr "repo.issues.remove_project_at" $oldProjectDisplayHtml $createdStr}} - {{else if gt .ProjectID 0}} + {{if .OldProject}} + {{if .Project}} + {{ctx.Locale.Tr "repo.issues.change_project_at" $oldProjectDisplayHtml $newProjectDisplayHtml $createdStr}} + {{else}} + {{ctx.Locale.Tr "repo.issues.remove_project_at" $oldProjectDisplayHtml $createdStr}} + {{end}} + {{else}} {{ctx.Locale.Tr "repo.issues.add_project_at" $newProjectDisplayHtml $createdStr}} {{end}} diff --git a/tests/integration/issue_comment_test.go b/tests/integration/issue_comment_test.go index ee62b418f4..f77bfaa9bd 100644 --- a/tests/integration/issue_comment_test.go +++ b/tests/integration/issue_comment_test.go @@ -88,22 +88,19 @@ func TestIssueCommentChangeMilestone(t *testing.T) { testIssueCommentChangeEvent(t, htmlDoc, "2000", "octicon-milestone", "User One", "/user1", []string{"user1 added this to the milestone1 milestone"}, - []string{"/user1"}) - // []string{"/user1", "/user2/repo1/milestone/1"}) + []string{"/user1", "/user2/repo1/milestone/1"}) // Modify milestone testIssueCommentChangeEvent(t, htmlDoc, "2001", "octicon-milestone", "User One", "/user1", []string{"user1 modified the milestone from milestone1 to milestone2"}, - []string{"/user1"}) - // []string{"/user1", "/user2/repo1/milestone/1", "/user2/repo1/milestone/2"}) + []string{"/user1", "/user2/repo1/milestone/1", "/user2/repo1/milestone/2"}) // Remove milestone testIssueCommentChangeEvent(t, htmlDoc, "2002", "octicon-milestone", "User One", "/user1", []string{"user1 removed this from the milestone2 milestone"}, - []string{"/user1"}) - // []string{"/user1", "/user2/repo1/milestone/2"}) + []string{"/user1", "/user2/repo1/milestone/2"}) // Deleted milestone testIssueCommentChangeEvent(t, htmlDoc, "2003", @@ -123,22 +120,19 @@ func TestIssueCommentChangeProject(t *testing.T) { testIssueCommentChangeEvent(t, htmlDoc, "2010", "octicon-project", "User One", "/user1", []string{"user1 added this to the First project project"}, - []string{"/user1"}) - // []string{"/user1", "/user2/repo1/projects/1"}) + []string{"/user1", "/user2/repo1/projects/1"}) // Modify project testIssueCommentChangeEvent(t, htmlDoc, "2011", "octicon-project", "User One", "/user1", []string{"user1 modified the project from First project to second project"}, - []string{"/user1"}) - // []string{"/user1", "/user2/repo1/projects/1", "/user2/repo1/projects/2"}) + []string{"/user1", "/user2/repo1/projects/1", "/user2/repo1/projects/2"}) // Remove project testIssueCommentChangeEvent(t, htmlDoc, "2012", "octicon-project", "User One", "/user1", []string{"user1 removed this from the second project project"}, - []string{"/user1"}) - // []string{"/user1", "/user2/repo1/projects/2"}) + []string{"/user1", "/user2/repo1/projects/2"}) // Deleted project testIssueCommentChangeEvent(t, htmlDoc, "2013",