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",