From c31588d7954fb92eae67bb4d24bfa3e69801128e Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Sat, 23 Oct 2021 18:42:08 +0200 Subject: [PATCH 01/22] Add config option to hide issue events Adds a config option `HIDE_ISSUE_EVENTS` to hide most issue events (changed labels, milestones, projects...) on the issue detail page. If this is true, only the following events (comment types) are shown: * plain comments * closed/reopned/merged * reviews --- custom/conf/app.example.ini | 3 ++ .../doc/advanced/config-cheat-sheet.en-us.md | 1 + modules/setting/setting.go | 2 + routers/web/repo/issue.go | 1 + .../repo/issue/view_content/comments.tmpl | 48 +++++++++---------- 5 files changed, 31 insertions(+), 24 deletions(-) diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini index 1753ed233070..eed1df936a5e 100644 --- a/custom/conf/app.example.ini +++ b/custom/conf/app.example.ini @@ -1060,6 +1060,9 @@ PATH = ;; ;; Whether to enable a Service Worker to cache frontend assets ;USE_SERVICE_WORKER = true +;; +;; Whether to hide issue events (like added/removed labels, changed milestones/projects...). +;HIDE_ISSUE_EVENTS = false ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/docs/content/doc/advanced/config-cheat-sheet.en-us.md b/docs/content/doc/advanced/config-cheat-sheet.en-us.md index 91c62dbec34a..a2941cbdb98a 100644 --- a/docs/content/doc/advanced/config-cheat-sheet.en-us.md +++ b/docs/content/doc/advanced/config-cheat-sheet.en-us.md @@ -189,6 +189,7 @@ The following configuration set `Content-Type: application/vnd.android.package-a - `DEFAULT_SHOW_FULL_NAME`: **false**: Whether the full name of the users should be shown where possible. If the full name isn't set, the username will be used. - `SEARCH_REPO_DESCRIPTION`: **true**: Whether to search within description at repository search on explore page. - `USE_SERVICE_WORKER`: **true**: Whether to enable a Service Worker to cache frontend assets. +- `HIDE_ISSUE_EVENTS`: **false**: Whether to hide issue events (like added/removed labels, changed milestones/projects...). ### UI - Admin (`ui.admin`) diff --git a/modules/setting/setting.go b/modules/setting/setting.go index c5608c85bc53..a00d18f8d6ef 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -213,6 +213,7 @@ var ( CustomEmojisMap map[string]string `ini:"-"` SearchRepoDescription bool UseServiceWorker bool + HideIssueEvents bool Notification struct { MinTimeout time.Duration @@ -983,6 +984,7 @@ func NewContext() { UI.DefaultShowFullName = Cfg.Section("ui").Key("DEFAULT_SHOW_FULL_NAME").MustBool(false) UI.SearchRepoDescription = Cfg.Section("ui").Key("SEARCH_REPO_DESCRIPTION").MustBool(true) UI.UseServiceWorker = Cfg.Section("ui").Key("USE_SERVICE_WORKER").MustBool(true) + UI.HideIssueEvents = Cfg.Section("ui").Key("HIDE_ISSUE_EVENTS").MustBool(false) HasRobotsTxt, err = util.IsFile(path.Join(CustomPath, "robots.txt")) if err != nil { diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index 173cb49e4512..9607472182e5 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -1617,6 +1617,7 @@ func ViewIssue(ctx *context.Context) { ctx.Data["HasProjectsWritePermission"] = ctx.Repo.CanWrite(models.UnitTypeProjects) ctx.Data["IsRepoAdmin"] = ctx.IsSigned && (ctx.Repo.IsAdmin() || ctx.User.IsAdmin) ctx.Data["LockReasons"] = setting.Repository.Issue.LockReasons + ctx.Data["HideIssueEvents"] = setting.UI.HideIssueEvents ctx.Data["RefEndName"] = git.RefEndName(issue.Ref) ctx.HTML(http.StatusOK, tplIssueView) } diff --git a/templates/repo/issue/view_content/comments.tmpl b/templates/repo/issue/view_content/comments.tmpl index cb95720e296b..698a978df217 100644 --- a/templates/repo/issue/view_content/comments.tmpl +++ b/templates/repo/issue/view_content/comments.tmpl @@ -131,7 +131,7 @@ {{end}} - {{else if eq .Type 3 5 6}} + {{else if and (eq .Type 3 5 6) (not $.HideIssueEvents)}} {{ $refFrom:= "" }} {{if ne .RefRepoID .Issue.RepoID}} {{ $refFrom = $.i18n.Tr "repo.issues.ref_from" .RefRepo.FullName }} @@ -161,7 +161,7 @@ {{.RefIssueTitle | Str2html}} {{.RefIssueIdent | Str2html}} - {{else if eq .Type 4}} + {{else if and (eq .Type 4) (not $.HideIssueEvents)}}
{{svg "octicon-bookmark"}} @@ -176,7 +176,7 @@ {{.Content | Str2html}}
- {{else if eq .Type 7}} + {{else if and (eq .Type 7) (not $.HideIssueEvents)}} {{if or .AddedLabels .RemovedLabels}}
{{svg "octicon-tag"}} @@ -195,7 +195,7 @@
{{end}} - {{else if eq .Type 8}} + {{else if and (eq .Type 8) (not $.HideIssueEvents)}}
{{svg "octicon-milestone"}} @@ -206,7 +206,7 @@ {{if gt .OldMilestoneID 0}}{{if gt .MilestoneID 0}}{{$.i18n.Tr "repo.issues.change_milestone_at" (.OldMilestone.Name|Escape) (.Milestone.Name|Escape) $createdStr | Safe}}{{else}}{{$.i18n.Tr "repo.issues.remove_milestone_at" (.OldMilestone.Name|Escape) $createdStr | Safe}}{{end}}{{else if gt .MilestoneID 0}}{{$.i18n.Tr "repo.issues.add_milestone_at" (.Milestone.Name|Escape) $createdStr | Safe}}{{end}}
- {{else if eq .Type 9}} + {{else if and (eq .Type 9) (not $.HideIssueEvents)}}
{{svg "octicon-person"}} {{if gt .AssigneeID 0}} @@ -237,7 +237,7 @@ {{end}} {{end}}
- {{else if eq .Type 10}} + {{else if and (eq .Type 10) (not $.HideIssueEvents)}}
{{svg "octicon-pencil"}} @@ -248,7 +248,7 @@ {{$.i18n.Tr "repo.issues.change_title_at" (.OldTitle|RenderEmoji) (.NewTitle|RenderEmoji) $createdStr | Safe}}
- {{else if eq .Type 11}} + {{else if and (eq .Type 11) (not $.HideIssueEvents)}}
{{svg "octicon-git-branch"}} @@ -259,7 +259,7 @@ {{$.i18n.Tr "repo.issues.delete_branch_at" (.OldRef|Escape) $createdStr | Safe}}
- {{else if eq .Type 12}} + {{else if and (eq .Type 12) (not $.HideIssueEvents)}}
{{svg "octicon-clock"}} @@ -270,7 +270,7 @@ {{$.i18n.Tr "repo.issues.start_tracking_history" $createdStr | Safe}}
- {{else if eq .Type 13}} + {{else if and (eq .Type 13) (not $.HideIssueEvents)}}
{{svg "octicon-clock"}} @@ -286,7 +286,7 @@ {{.Content}}
- {{else if eq .Type 14}} + {{else if and (eq .Type 14) (not $.HideIssueEvents)}}
{{svg "octicon-clock"}} @@ -302,7 +302,7 @@ {{.Content}}
- {{else if eq .Type 15}} + {{else if and (eq .Type 15) (not $.HideIssueEvents)}}
{{svg "octicon-clock"}} @@ -313,7 +313,7 @@ {{$.i18n.Tr "repo.issues.cancel_tracking_history" $createdStr | Safe}}
- {{else if eq .Type 16}} + {{else if and (eq .Type 16) (not $.HideIssueEvents)}}
{{svg "octicon-clock"}} @@ -324,7 +324,7 @@ {{$.i18n.Tr "repo.issues.due_date_added" .Content $createdStr | Safe}}
- {{else if eq .Type 17}} + {{else if and (eq .Type 17) (not $.HideIssueEvents)}}
{{svg "octicon-clock"}} @@ -335,7 +335,7 @@ {{$.i18n.Tr "repo.issues.due_date_modified" (.Content | ParseDeadline) $createdStr | Safe}}
- {{else if eq .Type 18}} + {{else if and (eq .Type 18) (not $.HideIssueEvents)}}
{{svg "octicon-clock"}} @@ -346,7 +346,7 @@ {{$.i18n.Tr "repo.issues.due_date_remove" .Content $createdStr | Safe}}
- {{else if eq .Type 19}} + {{else if and (eq .Type 19) (not $.HideIssueEvents)}}
{{svg "octicon-package-dependents"}} @@ -371,7 +371,7 @@
{{end}} - {{else if eq .Type 20}} + {{else if and (eq .Type 20) (not $.HideIssueEvents)}}
{{svg "octicon-package-dependents"}} @@ -624,7 +624,7 @@
{{end}} - {{else if eq .Type 23}} + {{else if and (eq .Type 23) (not $.HideIssueEvents)}}
{{svg "octicon-lock"}} @@ -642,7 +642,7 @@ {{ end }}
- {{else if eq .Type 24}} + {{else if and (eq .Type 24) (not $.HideIssueEvents)}}
{{svg "octicon-key"}} @@ -653,7 +653,7 @@ {{$.i18n.Tr "repo.issues.unlock_comment" $createdStr | Safe}}
- {{else if eq .Type 25}} + {{else if and (eq .Type 25) (not $.HideIssueEvents)}}
{{svg "octicon-git-branch"}} @@ -664,7 +664,7 @@ {{$.i18n.Tr "repo.pulls.change_target_branch_at" (.OldRef|Escape) (.NewRef|Escape) $createdStr | Safe}}
- {{else if eq .Type 26}} + {{else if and (eq .Type 26) (not $.HideIssueEvents)}}
{{svg "octicon-clock"}} @@ -679,7 +679,7 @@ {{.Content}}
- {{else if eq .Type 27}} + {{else if and (eq .Type 27) (not $.HideIssueEvents)}}
{{svg "octicon-eye"}} @@ -706,7 +706,7 @@ {{end}}
- {{else if and (eq .Type 29) (or (gt .CommitsNum 0) .IsForcePush)}} + {{else if and (eq .Type 29) (or (gt .CommitsNum 0) .IsForcePush) (not $.HideIssueEvents)}}
{{svg "octicon-repo-push"}} @@ -721,7 +721,7 @@ {{if not .IsForcePush}} {{template "repo/commits_list_small" dict "comment" . "root" $}} {{end}} - {{else if eq .Type 30}} + {{else if and (eq .Type 30) (not $.HideIssueEvents)}} {{if not $.UnitProjectsGlobalDisabled}}
{{svg "octicon-project"}} @@ -742,7 +742,7 @@
{{end}} - {{else if eq .Type 32}} + {{else if and (eq .Type 32) (not $.HideIssueEvents)}}
From b2ac2a592cae2f51985f3464d4b15a296d2bfd2a Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Sun, 24 Oct 2021 15:58:16 +0200 Subject: [PATCH 02/22] Make configurable using a list --- modules/setting/setting.go | 4 +- routers/web/repo/issue.go | 8 +- .../repo/issue/view_content/comments.tmpl | 1390 +++++++++-------- 3 files changed, 705 insertions(+), 697 deletions(-) diff --git a/modules/setting/setting.go b/modules/setting/setting.go index a00d18f8d6ef..1780fd5ab493 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -213,7 +213,7 @@ var ( CustomEmojisMap map[string]string `ini:"-"` SearchRepoDescription bool UseServiceWorker bool - HideIssueEvents bool + HiddenIssueEvents []int Notification struct { MinTimeout time.Duration @@ -261,6 +261,7 @@ var ( Reactions: []string{`+1`, `-1`, `laugh`, `hooray`, `confused`, `heart`, `rocket`, `eyes`}, CustomEmojis: []string{`git`, `gitea`, `codeberg`, `gitlab`, `github`, `gogs`}, CustomEmojisMap: map[string]string{"git": ":git:", "gitea": ":gitea:", "codeberg": ":codeberg:", "gitlab": ":gitlab:", "github": ":github:", "gogs": ":gogs:"}, + HiddenIssueEvents: []int{}, Notification: struct { MinTimeout time.Duration TimeoutStep time.Duration @@ -984,7 +985,6 @@ func NewContext() { UI.DefaultShowFullName = Cfg.Section("ui").Key("DEFAULT_SHOW_FULL_NAME").MustBool(false) UI.SearchRepoDescription = Cfg.Section("ui").Key("SEARCH_REPO_DESCRIPTION").MustBool(true) UI.UseServiceWorker = Cfg.Section("ui").Key("USE_SERVICE_WORKER").MustBool(true) - UI.HideIssueEvents = Cfg.Section("ui").Key("HIDE_ISSUE_EVENTS").MustBool(false) HasRobotsTxt, err = util.IsFile(path.Join(CustomPath, "robots.txt")) if err != nil { diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index 9607472182e5..e635fa1e594d 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -1617,7 +1617,13 @@ func ViewIssue(ctx *context.Context) { ctx.Data["HasProjectsWritePermission"] = ctx.Repo.CanWrite(models.UnitTypeProjects) ctx.Data["IsRepoAdmin"] = ctx.IsSigned && (ctx.Repo.IsAdmin() || ctx.User.IsAdmin) ctx.Data["LockReasons"] = setting.Repository.Issue.LockReasons - ctx.Data["HideIssueEvents"] = setting.UI.HideIssueEvents + ctx.Data["IsEventShown"] = func(commentType models.CommentType) bool { + hiddenEvents := make([]int64, len(setting.UI.HiddenIssueEvents)) + for i, event := range setting.UI.HiddenIssueEvents { + hiddenEvents[i] = int64(event) + } + return !util.IsInt64InSlice(int64(commentType), hiddenEvents) + } ctx.Data["RefEndName"] = git.RefEndName(issue.Ref) ctx.HTML(http.StatusOK, tplIssueView) } diff --git a/templates/repo/issue/view_content/comments.tmpl b/templates/repo/issue/view_content/comments.tmpl index 698a978df217..29808d3e0045 100644 --- a/templates/repo/issue/view_content/comments.tmpl +++ b/templates/repo/issue/view_content/comments.tmpl @@ -1,785 +1,787 @@ {{ template "base/alert" }} {{range .Issue.Comments}} - {{ $createdStr:= TimeSinceUnix .CreatedUnix $.Lang }} + {{if call $.IsEventShown .Type}} + {{ $createdStr:= TimeSinceUnix .CreatedUnix $.Lang }} - - {{if eq .Type 0}} -
- {{if .OriginalAuthor }} - - {{else}} - - {{avatar .Poster}} - - {{end}} -
-
-
- {{if .OriginalAuthor }} - - {{svg (MigrationIcon $.Repository.GetOriginalURLHostname)}} - {{ .OriginalAuthor }} - - - {{$.i18n.Tr "repo.issues.commented_at" .Issue.HashTag $createdStr | Safe}} {{if $.Repository.OriginalURL}} - - - ({{$.i18n.Tr "repo.migrated_from" $.Repository.OriginalURL $.Repository.GetOriginalURLHostname | Safe }}){{end}} - - {{else}} - - - {{.Poster.GetDisplayName}} - - {{$.i18n.Tr "repo.issues.commented_at" .HashTag $createdStr | Safe}} - - {{end}} -
-
- {{if not $.Repository.IsArchived}} - {{if or (and (eq .PosterID .Issue.PosterID) (eq .Issue.OriginalAuthorID 0)) (and (eq .Issue.OriginalAuthorID .OriginalAuthorID) (not (eq .OriginalAuthorID 0))) }} -
- {{$.i18n.Tr "repo.issues.poster"}} -
+ + {{if eq .Type 0}} +
+ {{if .OriginalAuthor }} + + {{else}} + + {{avatar .Poster}} + + {{end}} +
+
+
+ {{if .OriginalAuthor }} + + {{svg (MigrationIcon $.Repository.GetOriginalURLHostname)}} + {{ .OriginalAuthor }} + + + {{$.i18n.Tr "repo.issues.commented_at" .Issue.HashTag $createdStr | Safe}} {{if $.Repository.OriginalURL}} + + + ({{$.i18n.Tr "repo.migrated_from" $.Repository.OriginalURL $.Repository.GetOriginalURLHostname | Safe }}){{end}} + + {{else}} + + + {{.Poster.GetDisplayName}} + + {{$.i18n.Tr "repo.issues.commented_at" .HashTag $createdStr | Safe}} + {{end}} - {{if gt .ShowTag 0}} -
- {{if eq .ShowTag 2}} - {{$.i18n.Tr "repo.issues.collaborator"}} - {{else if eq .ShowTag 3}} - {{$.i18n.Tr "repo.issues.owner"}} - {{end}} -
+
+
+ {{if not $.Repository.IsArchived}} + {{if or (and (eq .PosterID .Issue.PosterID) (eq .Issue.OriginalAuthorID 0)) (and (eq .Issue.OriginalAuthorID .OriginalAuthorID) (not (eq .OriginalAuthorID 0))) }} +
+ {{$.i18n.Tr "repo.issues.poster"}} +
+ {{end}} + {{if gt .ShowTag 0}} +
+ {{if eq .ShowTag 2}} + {{$.i18n.Tr "repo.issues.collaborator"}} + {{else if eq .ShowTag 3}} + {{$.i18n.Tr "repo.issues.owner"}} + {{end}} +
+ {{end}} + {{template "repo/issue/view_content/add_reaction" Dict "ctx" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID)}} + {{template "repo/issue/view_content/context_menu" Dict "ctx" $ "item" . "delete" true "issue" true "diff" false "IsCommentPoster" (and $.IsSigned (eq $.SignedUserID .PosterID))}} {{end}} - {{template "repo/issue/view_content/add_reaction" Dict "ctx" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID)}} - {{template "repo/issue/view_content/context_menu" Dict "ctx" $ "item" . "delete" true "issue" true "diff" false "IsCommentPoster" (and $.IsSigned (eq $.SignedUserID .PosterID))}} - {{end}} +
-
-
-
- {{if .RenderedContent}} - {{.RenderedContent|Str2html}} - {{else}} - {{$.i18n.Tr "repo.issues.no_content"}} +
+
+ {{if .RenderedContent}} + {{.RenderedContent|Str2html}} + {{else}} + {{$.i18n.Tr "repo.issues.no_content"}} + {{end}} +
+
{{.Content}}
+
+ {{if .Attachments}} + {{template "repo/issue/view_content/attachments" Dict "ctx" $ "Attachments" .Attachments "Content" .RenderedContent}} {{end}}
-
{{.Content}}
-
- {{if .Attachments}} - {{template "repo/issue/view_content/attachments" Dict "ctx" $ "Attachments" .Attachments "Content" .RenderedContent}} + {{$reactions := .Reactions.GroupByType}} + {{if $reactions}} +
+ {{template "repo/issue/view_content/reactions" Dict "ctx" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID) "Reactions" $reactions}} +
{{end}}
- {{$reactions := .Reactions.GroupByType}} - {{if $reactions}} -
- {{template "repo/issue/view_content/reactions" Dict "ctx" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID) "Reactions" $reactions}} -
- {{end}}
-
- {{else if eq .Type 1}} -
- {{svg "octicon-dot-fill"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{if .Issue.IsPull }} - {{$.i18n.Tr "repo.pulls.reopened_at" .EventTag $createdStr | Safe}} - {{else}} - {{$.i18n.Tr "repo.issues.reopened_at" .EventTag $createdStr | Safe}} - {{end}} - -
- {{else if eq .Type 2}} -
- {{svg "octicon-circle-slash"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{if .Issue.IsPull }} - {{$.i18n.Tr "repo.pulls.closed_at" .EventTag $createdStr | Safe}} - {{else}} - {{$.i18n.Tr "repo.issues.closed_at" .EventTag $createdStr | Safe}} - {{end}} - -
- {{else if eq .Type 28}} -
- {{svg "octicon-git-merge"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$link := printf "%s/commit/%s" $.Repository.HTMLURL $.Issue.PullRequest.MergedCommitID}} - {{if eq $.Issue.PullRequest.Status 3}} - {{$.i18n.Tr "repo.issues.manually_pull_merged_at" $link (ShortSha $.Issue.PullRequest.MergedCommitID) $.BaseTarget $createdStr | Str2html}} - {{else}} - {{$.i18n.Tr "repo.issues.pull_merged_at" $link (ShortSha $.Issue.PullRequest.MergedCommitID) $.BaseTarget $createdStr | Str2html}} - {{end}} - -
- {{else if and (eq .Type 3 5 6) (not $.HideIssueEvents)}} - {{ $refFrom:= "" }} - {{if ne .RefRepoID .Issue.RepoID}} - {{ $refFrom = $.i18n.Tr "repo.issues.ref_from" .RefRepo.FullName }} - {{end}} - {{ $refTr := "repo.issues.ref_issue_from" }} - {{if .Issue.IsPull}} - {{ $refTr = "repo.issues.ref_pull_from" }} - {{else if eq .RefAction 1 }} - {{ $refTr = "repo.issues.ref_closing_from" }} - {{else if eq .RefAction 2 }} - {{ $refTr = "repo.issues.ref_reopening_from" }} - {{end}} - {{ $createdStr:= TimeSinceUnix .CreatedUnix $.Lang }} -
- {{svg "octicon-bookmark"}} - - {{avatar .Poster}} - - {{if eq .RefAction 3}}{{end}} - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr $refTr .EventTag $createdStr .RefCommentHTMLURL $refFrom | Safe}} - - {{if eq .RefAction 3}}{{end}} - -
- {{.RefIssueTitle | Str2html}} {{.RefIssueIdent | Str2html}} + {{else if eq .Type 1}} +
+ {{svg "octicon-dot-fill"}} + + {{avatar .Poster}} + + + {{.Poster.GetDisplayName}} + {{if .Issue.IsPull }} + {{$.i18n.Tr "repo.pulls.reopened_at" .EventTag $createdStr | Safe}} + {{else}} + {{$.i18n.Tr "repo.issues.reopened_at" .EventTag $createdStr | Safe}} + {{end}} +
-
- {{else if and (eq .Type 4) (not $.HideIssueEvents)}} -
- {{svg "octicon-bookmark"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.commit_ref_at" .EventTag $createdStr | Safe}} - -
- {{svg "octicon-git-commit"}} - {{.Content | Str2html}} + {{else if eq .Type 2}} +
+ {{svg "octicon-circle-slash"}} + + {{avatar .Poster}} + + + {{.Poster.GetDisplayName}} + {{if .Issue.IsPull }} + {{$.i18n.Tr "repo.pulls.closed_at" .EventTag $createdStr | Safe}} + {{else}} + {{$.i18n.Tr "repo.issues.closed_at" .EventTag $createdStr | Safe}} + {{end}} +
-
- {{else if and (eq .Type 7) (not $.HideIssueEvents)}} - {{if or .AddedLabels .RemovedLabels}} + {{else if eq .Type 28}}
- {{svg "octicon-tag"}} + {{svg "octicon-git-merge"}} {{avatar .Poster}} {{.Poster.GetDisplayName}} - {{if and .AddedLabels (not .RemovedLabels)}} - {{$.i18n.Tr (TrN $.i18n.Lang (len .AddedLabels) "repo.issues.add_label" "repo.issues.add_labels") (RenderLabels .AddedLabels) $createdStr | Safe}} - {{else if and (not .AddedLabels) .RemovedLabels}} - {{$.i18n.Tr (TrN $.i18n.Lang (len .RemovedLabels) "repo.issues.remove_label" "repo.issues.remove_labels") (RenderLabels .RemovedLabels) $createdStr | Safe}} + {{$link := printf "%s/commit/%s" $.Repository.HTMLURL $.Issue.PullRequest.MergedCommitID}} + {{if eq $.Issue.PullRequest.Status 3}} + {{$.i18n.Tr "repo.issues.manually_pull_merged_at" $link (ShortSha $.Issue.PullRequest.MergedCommitID) $.BaseTarget $createdStr | Str2html}} {{else}} - {{$.i18n.Tr "repo.issues.add_remove_labels" (RenderLabels .AddedLabels) (RenderLabels .RemovedLabels) $createdStr | Safe}} + {{$.i18n.Tr "repo.issues.pull_merged_at" $link (ShortSha $.Issue.PullRequest.MergedCommitID) $.BaseTarget $createdStr | Str2html}} {{end}}
- {{end}} - {{else if and (eq .Type 8) (not $.HideIssueEvents)}} -
- {{svg "octicon-milestone"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{if gt .OldMilestoneID 0}}{{if gt .MilestoneID 0}}{{$.i18n.Tr "repo.issues.change_milestone_at" (.OldMilestone.Name|Escape) (.Milestone.Name|Escape) $createdStr | Safe}}{{else}}{{$.i18n.Tr "repo.issues.remove_milestone_at" (.OldMilestone.Name|Escape) $createdStr | Safe}}{{end}}{{else if gt .MilestoneID 0}}{{$.i18n.Tr "repo.issues.add_milestone_at" (.Milestone.Name|Escape) $createdStr | Safe}}{{end}} - -
- {{else if and (eq .Type 9) (not $.HideIssueEvents)}} -
- {{svg "octicon-person"}} - {{if gt .AssigneeID 0}} - {{if .RemovedAssignee}} - - {{avatar .Assignee}} - - - {{.Assignee.GetDisplayName}} - {{ if eq .Poster.ID .Assignee.ID }} - {{$.i18n.Tr "repo.issues.remove_self_assignment" $createdStr | Safe}} - {{ else }} - {{$.i18n.Tr "repo.issues.remove_assignee_at" (.Poster.GetDisplayName|Escape) $createdStr | Safe}} - {{ end }} - - {{else}} - - {{avatar .Assignee}} + {{else if eq .Type 3 5 6}} + {{ $refFrom:= "" }} + {{if ne .RefRepoID .Issue.RepoID}} + {{ $refFrom = $.i18n.Tr "repo.issues.ref_from" .RefRepo.FullName }} + {{end}} + {{ $refTr := "repo.issues.ref_issue_from" }} + {{if .Issue.IsPull}} + {{ $refTr = "repo.issues.ref_pull_from" }} + {{else if eq .RefAction 1 }} + {{ $refTr = "repo.issues.ref_closing_from" }} + {{else if eq .RefAction 2 }} + {{ $refTr = "repo.issues.ref_reopening_from" }} + {{end}} + {{ $createdStr:= TimeSinceUnix .CreatedUnix $.Lang }} +
+ {{svg "octicon-bookmark"}} + + {{avatar .Poster}} + + {{if eq .RefAction 3}}{{end}} + + {{.Poster.GetDisplayName}} + {{$.i18n.Tr $refTr .EventTag $createdStr .RefCommentHTMLURL $refFrom | Safe}} + + {{if eq .RefAction 3}}{{end}} + + +
+ {{else if eq .Type 4}} +
+ {{svg "octicon-bookmark"}} + + {{avatar .Poster}} + + + {{.Poster.GetDisplayName}} + {{$.i18n.Tr "repo.issues.commit_ref_at" .EventTag $createdStr | Safe}} + +
+ {{svg "octicon-git-commit"}} + {{.Content | Str2html}} +
+
+ {{else if eq .Type 7}} + {{if or .AddedLabels .RemovedLabels}} +
+ {{svg "octicon-tag"}} + + {{avatar .Poster}} - {{.Assignee.GetDisplayName}} - {{if eq .Poster.ID .AssigneeID}} - {{$.i18n.Tr "repo.issues.self_assign_at" $createdStr | Safe}} + {{.Poster.GetDisplayName}} + {{if and .AddedLabels (not .RemovedLabels)}} + {{$.i18n.Tr (TrN $.i18n.Lang (len .AddedLabels) "repo.issues.add_label" "repo.issues.add_labels") (RenderLabels .AddedLabels) $createdStr | Safe}} + {{else if and (not .AddedLabels) .RemovedLabels}} + {{$.i18n.Tr (TrN $.i18n.Lang (len .RemovedLabels) "repo.issues.remove_label" "repo.issues.remove_labels") (RenderLabels .RemovedLabels) $createdStr | Safe}} {{else}} - {{$.i18n.Tr "repo.issues.add_assignee_at" (.Poster.GetDisplayName|Escape) $createdStr | Safe}} + {{$.i18n.Tr "repo.issues.add_remove_labels" (RenderLabels .AddedLabels) (RenderLabels .RemovedLabels) $createdStr | Safe}} {{end}} - {{end}} +
{{end}} -
- {{else if and (eq .Type 10) (not $.HideIssueEvents)}} -
- {{svg "octicon-pencil"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.change_title_at" (.OldTitle|RenderEmoji) (.NewTitle|RenderEmoji) $createdStr | Safe}} - -
- {{else if and (eq .Type 11) (not $.HideIssueEvents)}} -
- {{svg "octicon-git-branch"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.delete_branch_at" (.OldRef|Escape) $createdStr | Safe}} - -
- {{else if and (eq .Type 12) (not $.HideIssueEvents)}} -
- {{svg "octicon-clock"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.start_tracking_history" $createdStr | Safe}} - -
- {{else if and (eq .Type 13) (not $.HideIssueEvents)}} -
- {{svg "octicon-clock"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.stop_tracking_history" $createdStr | Safe}} - - {{ template "repo/issue/view_content/comments_delete_time" Dict "ctx" $ "comment" . }} -
- {{svg "octicon-clock"}} - {{.Content}} -
-
- {{else if and (eq .Type 14) (not $.HideIssueEvents)}} -
- {{svg "octicon-clock"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.add_time_history" $createdStr | Safe}} - - {{ template "repo/issue/view_content/comments_delete_time" Dict "ctx" $ "comment" . }} -
- {{svg "octicon-clock"}} - {{.Content}} + {{else if eq .Type 8}} +
+ {{svg "octicon-milestone"}} + + {{avatar .Poster}} + + + {{.Poster.GetDisplayName}} + {{if gt .OldMilestoneID 0}}{{if gt .MilestoneID 0}}{{$.i18n.Tr "repo.issues.change_milestone_at" (.OldMilestone.Name|Escape) (.Milestone.Name|Escape) $createdStr | Safe}}{{else}}{{$.i18n.Tr "repo.issues.remove_milestone_at" (.OldMilestone.Name|Escape) $createdStr | Safe}}{{end}}{{else if gt .MilestoneID 0}}{{$.i18n.Tr "repo.issues.add_milestone_at" (.Milestone.Name|Escape) $createdStr | Safe}}{{end}} +
-
- {{else if and (eq .Type 15) (not $.HideIssueEvents)}} -
- {{svg "octicon-clock"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.cancel_tracking_history" $createdStr | Safe}} - -
- {{else if and (eq .Type 16) (not $.HideIssueEvents)}} -
- {{svg "octicon-clock"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.due_date_added" .Content $createdStr | Safe}} - -
- {{else if and (eq .Type 17) (not $.HideIssueEvents)}} -
- {{svg "octicon-clock"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.due_date_modified" (.Content | ParseDeadline) $createdStr | Safe}} - -
- {{else if and (eq .Type 18) (not $.HideIssueEvents)}} -
- {{svg "octicon-clock"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.due_date_remove" .Content $createdStr | Safe}} - -
- {{else if and (eq .Type 19) (not $.HideIssueEvents)}} -
- {{svg "octicon-package-dependents"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.dependency.added_dependency" $createdStr | Safe}} - - {{if .DependentIssue}} -
- {{svg "octicon-plus"}} - - - {{if eq .DependentIssue.RepoID .Issue.RepoID}} - #{{.DependentIssue.Index}} {{.DependentIssue.Title}} + {{else if eq .Type 9}} +
+ {{svg "octicon-person"}} + {{if gt .AssigneeID 0}} + {{if .RemovedAssignee}} + + {{avatar .Assignee}} + + + {{.Assignee.GetDisplayName}} + {{ if eq .Poster.ID .Assignee.ID }} + {{$.i18n.Tr "repo.issues.remove_self_assignment" $createdStr | Safe}} + {{ else }} + {{$.i18n.Tr "repo.issues.remove_assignee_at" (.Poster.GetDisplayName|Escape) $createdStr | Safe}} + {{ end }} + + {{else}} + + {{avatar .Assignee}} + + + {{.Assignee.GetDisplayName}} + {{if eq .Poster.ID .AssigneeID}} + {{$.i18n.Tr "repo.issues.self_assign_at" $createdStr | Safe}} {{else}} - {{.DependentIssue.Repo.FullName}}#{{.DependentIssue.Index}} - {{.DependentIssue.Title}} + {{$.i18n.Tr "repo.issues.add_assignee_at" (.Poster.GetDisplayName|Escape) $createdStr | Safe}} {{end}} - - + + {{end}} + {{end}} +
+ {{else if eq .Type 10}} +
+ {{svg "octicon-pencil"}} + + {{avatar .Poster}} + + + {{.Poster.GetDisplayName}} + {{$.i18n.Tr "repo.issues.change_title_at" (.OldTitle|RenderEmoji) (.NewTitle|RenderEmoji) $createdStr | Safe}} + +
+ {{else if eq .Type 11}} +
+ {{svg "octicon-git-branch"}} + + {{avatar .Poster}} + + + {{.Poster.GetDisplayName}} + {{$.i18n.Tr "repo.issues.delete_branch_at" (.OldRef|Escape) $createdStr | Safe}} + +
+ {{else if eq .Type 12}} +
+ {{svg "octicon-clock"}} + + {{avatar .Poster}} + + + {{.Poster.GetDisplayName}} + {{$.i18n.Tr "repo.issues.start_tracking_history" $createdStr | Safe}} + +
+ {{else if eq .Type 13}} +
+ {{svg "octicon-clock"}} + + {{avatar .Poster}} + + + {{.Poster.GetDisplayName}} + {{$.i18n.Tr "repo.issues.stop_tracking_history" $createdStr | Safe}} + + {{ template "repo/issue/view_content/comments_delete_time" Dict "ctx" $ "comment" . }} +
+ {{svg "octicon-clock"}} + {{.Content}}
- {{end}} -
- {{else if and (eq .Type 20) (not $.HideIssueEvents)}} -
- {{svg "octicon-package-dependents"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.dependency.removed_dependency" $createdStr | Safe}} - - {{if .DependentIssue}} +
+ {{else if eq .Type 14}} +
+ {{svg "octicon-clock"}} + + {{avatar .Poster}} + + + {{.Poster.GetDisplayName}} + {{$.i18n.Tr "repo.issues.add_time_history" $createdStr | Safe}} + + {{ template "repo/issue/view_content/comments_delete_time" Dict "ctx" $ "comment" . }} - {{end}} -
- {{else if eq .Type 22}} -
+
+ {{else if eq .Type 15}} +
+ {{svg "octicon-clock"}} + + {{avatar .Poster}} + + + {{.Poster.GetDisplayName}} + {{$.i18n.Tr "repo.issues.cancel_tracking_history" $createdStr | Safe}} + +
+ {{else if eq .Type 16}} +
+ {{svg "octicon-clock"}} + + {{avatar .Poster}} + + + {{.Poster.GetDisplayName}} + {{$.i18n.Tr "repo.issues.due_date_added" .Content $createdStr | Safe}} + +
+ {{else if eq .Type 17}} +
+ {{svg "octicon-clock"}} + + {{avatar .Poster}} + + + {{.Poster.GetDisplayName}} + {{$.i18n.Tr "repo.issues.due_date_modified" (.Content | ParseDeadline) $createdStr | Safe}} + +
+ {{else if eq .Type 18}}
- {{if .OriginalAuthor }} - {{else}} - + {{svg "octicon-clock"}} + {{avatar .Poster}} + + {{.Poster.GetDisplayName}} + {{$.i18n.Tr "repo.issues.due_date_remove" .Content $createdStr | Safe}} + +
+ {{else if eq .Type 19}} +
+ {{svg "octicon-package-dependents"}} + + {{avatar .Poster}} + + + {{.Poster.GetDisplayName}} + {{$.i18n.Tr "repo.issues.dependency.added_dependency" $createdStr | Safe}} + + {{if .DependentIssue}} + {{end}} - {{svg (printf "octicon-%s" .Review.Type.Icon)}} +
+ {{else if eq .Type 20}} +
+ {{svg "octicon-package-dependents"}} + + {{avatar .Poster}} + - {{if .OriginalAuthor }} - - {{svg (MigrationIcon $.Repository.GetOriginalURLHostname)}} - {{ .OriginalAuthor }} + {{.Poster.GetDisplayName}} + {{$.i18n.Tr "repo.issues.dependency.removed_dependency" $createdStr | Safe}} + + {{if .DependentIssue}} +
+ {{svg "octicon-trash"}} + + + {{if eq .DependentIssue.RepoID .Issue.RepoID}} + #{{.DependentIssue.Index}} {{.DependentIssue.Title}} + {{else}} + {{.DependentIssue.Repo.FullName}}#{{.DependentIssue.Index}} - {{.DependentIssue.Title}} + {{end}} + - {{if $.Repository.OriginalURL}} - ({{$.i18n.Tr "repo.migrated_from" $.Repository.OriginalURL $.Repository.GetOriginalURLHostname | Safe }}){{end}} +
+ {{end}} +
+ {{else if eq .Type 22}} +
+
+ {{if .OriginalAuthor }} {{else}} - {{.Poster.GetDisplayName}} + + {{avatar .Poster}} + {{end}} + {{svg (printf "octicon-%s" .Review.Type.Icon)}} + + {{if .OriginalAuthor }} + + {{svg (MigrationIcon $.Repository.GetOriginalURLHostname)}} + {{ .OriginalAuthor }} + + {{if $.Repository.OriginalURL}} + ({{$.i18n.Tr "repo.migrated_from" $.Repository.OriginalURL $.Repository.GetOriginalURLHostname | Safe }}){{end}} + {{else}} + {{.Poster.GetDisplayName}} + {{end}} - {{if eq .Review.Type 1}} - {{$.i18n.Tr "repo.issues.review.approve" $createdStr | Safe}} - {{else if eq .Review.Type 2}} - {{$.i18n.Tr "repo.issues.review.comment" $createdStr | Safe}} - {{else if eq .Review.Type 3}} - {{$.i18n.Tr "repo.issues.review.reject" $createdStr | Safe}} - {{else}} - {{$.i18n.Tr "repo.issues.review.comment" $createdStr | Safe}} - {{end}} - {{if .Review.Dismissed}} -
{{$.i18n.Tr "repo.issues.review.dismissed_label"}}
- {{end}} -
-
- {{if .Content}} -
-
-
- - {{if .OriginalAuthor }} - - {{svg (MigrationIcon $.Repository.GetOriginalURLHostname)}} - {{ .OriginalAuthor }} - - {{if $.Repository.OriginalURL}} - ({{$.i18n.Tr "repo.migrated_from" $.Repository.OriginalURL $.Repository.GetOriginalURLHostname | Safe }}){{end}} - {{else}} - {{.Poster.GetDisplayName}} - {{end}} + {{if eq .Review.Type 1}} + {{$.i18n.Tr "repo.issues.review.approve" $createdStr | Safe}} + {{else if eq .Review.Type 2}} + {{$.i18n.Tr "repo.issues.review.comment" $createdStr | Safe}} + {{else if eq .Review.Type 3}} + {{$.i18n.Tr "repo.issues.review.reject" $createdStr | Safe}} + {{else}} + {{$.i18n.Tr "repo.issues.review.comment" $createdStr | Safe}} + {{end}} + {{if .Review.Dismissed}} +
{{$.i18n.Tr "repo.issues.review.dismissed_label"}}
+ {{end}} +
+
+ {{if .Content}} +
+
+
+ + {{if .OriginalAuthor }} + + {{svg (MigrationIcon $.Repository.GetOriginalURLHostname)}} + {{ .OriginalAuthor }} + + {{if $.Repository.OriginalURL}} + ({{$.i18n.Tr "repo.migrated_from" $.Repository.OriginalURL $.Repository.GetOriginalURLHostname | Safe }}){{end}} + {{else}} + {{.Poster.GetDisplayName}} + {{end}} - {{$.i18n.Tr "repo.issues.review.left_comment" | Safe}} - -
-
-
- {{if .RenderedContent}} - {{.RenderedContent|Str2html}} - {{else}} - {{$.i18n.Tr "repo.issues.no_content"}} + {{$.i18n.Tr "repo.issues.review.left_comment" | Safe}} + +
+
+
+ {{if .RenderedContent}} + {{.RenderedContent|Str2html}} + {{else}} + {{$.i18n.Tr "repo.issues.no_content"}} + {{end}} +
+ {{if .Attachments}} + {{template "repo/issue/view_content/attachments" Dict "ctx" $ "Attachments" .Attachments "Content" .RenderedContent}} {{end}}
- {{if .Attachments}} - {{template "repo/issue/view_content/attachments" Dict "ctx" $ "Attachments" .Attachments "Content" .RenderedContent}} - {{end}}
-
- {{end}} + {{end}} - {{if .Review.CodeComments}} -
- {{ range $filename, $lines := .Review.CodeComments}} - {{range $line, $comms := $lines}} -
-
- {{$invalid := (index $comms 0).Invalidated}} - {{$resolved := (index $comms 0).IsResolved}} - {{$resolveDoer := (index $comms 0).ResolveDoer}} - {{$isNotPending := (not (eq (index $comms 0).Review.Type 0))}} -
- {{$filename}} - {{if $invalid }} - - {{$.i18n.Tr "repo.issues.review.outdated"}} - - {{end}} -
-
- {{if or $invalid $resolved}} - - - {{end}} + {{if .Review.CodeComments}} +
+ {{ range $filename, $lines := .Review.CodeComments}} + {{range $line, $comms := $lines}} +
+
+ {{$invalid := (index $comms 0).Invalidated}} + {{$resolved := (index $comms 0).IsResolved}} + {{$resolveDoer := (index $comms 0).ResolveDoer}} + {{$isNotPending := (not (eq (index $comms 0).Review.Type 0))}} +
+ {{$filename}} + {{if $invalid }} + + {{$.i18n.Tr "repo.issues.review.outdated"}} + + {{end}} +
+
+ {{if or $invalid $resolved}} + + + {{end}} +
-
- {{$diff := (CommentMustAsDiff (index $comms 0))}} - {{if $diff}} - {{$file := (index $diff.Files 0)}} -
-
-
- - - {{template "repo/diff/section_unified" dict "file" $file "root" $}} - -
+ {{$diff := (CommentMustAsDiff (index $comms 0))}} + {{if $diff}} + {{$file := (index $diff.Files 0)}} +
+
+
+ + + {{template "repo/diff/section_unified" dict "file" $file "root" $}} + +
+
-
- {{end}} -
-
- {{range $comms}} - {{ $createdSubStr:= TimeSinceUnix .CreatedUnix $.Lang }} -
-
-
-
- {{if not .OriginalAuthor }} - - {{avatar .Poster}} - - {{end}} - - {{if .OriginalAuthor }} - - {{svg (MigrationIcon $.Repository.GetOriginalURLHostname)}} - {{ .OriginalAuthor }} - - {{if $.Repository.OriginalURL}} - ({{$.i18n.Tr "repo.migrated_from" $.Repository.OriginalURL $.Repository.GetOriginalURLHostname | Safe }}){{end}} - {{else}} - {{.Poster.GetDisplayName}} - {{end}} - {{$.i18n.Tr "repo.issues.commented_at" .HashTag $createdSubStr | Safe}} - -
-
- {{if not $.Repository.IsArchived}} - {{if or (and (eq .PosterID $.Issue.PosterID) (eq $.Issue.OriginalAuthorID 0)) (eq $.Issue.OriginalAuthorID .OriginalAuthorID) }} -
- {{$.i18n.Tr "repo.issues.poster"}} -
+ {{end}} +
+
+ {{range $comms}} + {{ $createdSubStr:= TimeSinceUnix .CreatedUnix $.Lang }} +
+
+
+
+ {{if not .OriginalAuthor }} + + {{avatar .Poster}} + {{end}} - {{if gt .ShowTag 0}} -
- {{if eq .ShowTag 2}} - {{$.i18n.Tr "repo.issues.collaborator"}} - {{else if eq .ShowTag 3}} - {{$.i18n.Tr "repo.issues.owner"}} - {{end}} -
+ + {{if .OriginalAuthor }} + + {{svg (MigrationIcon $.Repository.GetOriginalURLHostname)}} + {{ .OriginalAuthor }} + + {{if $.Repository.OriginalURL}} + ({{$.i18n.Tr "repo.migrated_from" $.Repository.OriginalURL $.Repository.GetOriginalURLHostname | Safe }}){{end}} + {{else}} + {{.Poster.GetDisplayName}} + {{end}} + {{$.i18n.Tr "repo.issues.commented_at" .HashTag $createdSubStr | Safe}} + +
+
+ {{if not $.Repository.IsArchived}} + {{if or (and (eq .PosterID $.Issue.PosterID) (eq $.Issue.OriginalAuthorID 0)) (eq $.Issue.OriginalAuthorID .OriginalAuthorID) }} +
+ {{$.i18n.Tr "repo.issues.poster"}} +
+ {{end}} + {{if gt .ShowTag 0}} +
+ {{if eq .ShowTag 2}} + {{$.i18n.Tr "repo.issues.collaborator"}} + {{else if eq .ShowTag 3}} + {{$.i18n.Tr "repo.issues.owner"}} + {{end}} +
+ {{end}} + {{template "repo/issue/view_content/add_reaction" Dict "ctx" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID)}} + {{template "repo/issue/view_content/context_menu" Dict "ctx" $ "item" . "delete" true "issue" true "diff" true "IsCommentPoster" (and $.IsSigned (eq $.SignedUserID .PosterID))}} {{end}} - {{template "repo/issue/view_content/add_reaction" Dict "ctx" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID)}} - {{template "repo/issue/view_content/context_menu" Dict "ctx" $ "item" . "delete" true "issue" true "diff" true "IsCommentPoster" (and $.IsSigned (eq $.SignedUserID .PosterID))}} +
+
+
+
+ {{if .RenderedContent}} + {{.RenderedContent|Str2html}} + {{else}} + {{$.i18n.Tr "repo.issues.no_content"}} {{end}} +
+
{{.Content}}
+
-
-
-
- {{if .RenderedContent}} - {{.RenderedContent|Str2html}} - {{else}} - {{$.i18n.Tr "repo.issues.no_content"}} + {{$reactions := .Reactions.GroupByType}} + {{if $reactions}} +
+ {{template "repo/issue/view_content/reactions" Dict "ctx" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID) "Reactions" $reactions}} +
{{end}} -
-
{{.Content}}
-
- {{$reactions := .Reactions.GroupByType}} - {{if $reactions}} -
- {{template "repo/issue/view_content/reactions" Dict "ctx" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID) "Reactions" $reactions}} -
- {{end}} -
-
- {{end}} -
-
-
- {{if $resolved}} -
- {{svg "octicon-check" 16 "mr-2"}} - {{$resolveDoer.Name}} {{$.i18n.Tr "repo.issues.review.resolved_by"}}
{{end}}
-
- {{if and $.CanMarkConversation $isNotPending}} - - {{end}} - {{if and $.SignedUserID (not $.Repository.IsArchived)}} - - {{end}} +
+
+ {{if $resolved}} +
+ {{svg "octicon-check" 16 "mr-2"}} + {{$resolveDoer.Name}} {{$.i18n.Tr "repo.issues.review.resolved_by"}} +
+ {{end}} +
+
+ {{if and $.CanMarkConversation $isNotPending}} + + {{end}} + {{if and $.SignedUserID (not $.Repository.IsArchived)}} + + {{end}} +
+ {{template "repo/diff/comment_form_datahandler" dict "hidden" true "reply" (index $comms 0).ReviewID "root" $ "comment" (index $comms 0)}}
- {{template "repo/diff/comment_form_datahandler" dict "hidden" true "reply" (index $comms 0).ReviewID "root" $ "comment" (index $comms 0)}}
-
+ {{end}} {{end}} +
{{end}}
- {{end}} -
- {{else if and (eq .Type 23) (not $.HideIssueEvents)}} -
- {{svg "octicon-lock"}} - - {{avatar .Poster}} - - {{ if .Content }} + {{else if eq .Type 23}} +
+ {{svg "octicon-lock"}} + + {{avatar .Poster}} + + {{ if .Content }} + + {{.Poster.GetDisplayName}} + {{$.i18n.Tr "repo.issues.lock_with_reason" .Content $createdStr | Safe}} + + {{ else }} + + {{.Poster.GetDisplayName}} + {{$.i18n.Tr "repo.issues.lock_no_reason" $createdStr | Safe}} + + {{ end }} +
+ {{else if eq .Type 24}} +
+ {{svg "octicon-key"}} + + {{avatar .Poster}} + {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.lock_with_reason" .Content $createdStr | Safe}} + {{$.i18n.Tr "repo.issues.unlock_comment" $createdStr | Safe}} - {{ else }} +
+ {{else if eq .Type 25}} +
+ {{svg "octicon-git-branch"}} + + {{avatar .Poster}} + + + {{.Poster.Name}} + {{$.i18n.Tr "repo.pulls.change_target_branch_at" (.OldRef|Escape) (.NewRef|Escape) $createdStr | Safe}} + +
+ {{else if eq .Type 26}} +
+ {{svg "octicon-clock"}} + + {{avatar .Poster}} + {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.lock_no_reason" $createdStr | Safe}} + {{$.i18n.Tr "repo.issues.del_time_history" $createdStr | Safe}} - {{ end }} -
- {{else if and (eq .Type 24) (not $.HideIssueEvents)}} -
- {{svg "octicon-key"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.unlock_comment" $createdStr | Safe}} - -
- {{else if and (eq .Type 25) (not $.HideIssueEvents)}} -
- {{svg "octicon-git-branch"}} - - {{avatar .Poster}} - - - {{.Poster.Name}} - {{$.i18n.Tr "repo.pulls.change_target_branch_at" (.OldRef|Escape) (.NewRef|Escape) $createdStr | Safe}} - -
- {{else if and (eq .Type 26) (not $.HideIssueEvents)}} -
- {{svg "octicon-clock"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.del_time_history" $createdStr | Safe}} - -
- {{svg "octicon-clock"}} - {{.Content}} +
+ {{svg "octicon-clock"}} + {{.Content}} +
-
- {{else if and (eq .Type 27) (not $.HideIssueEvents)}} -
- {{svg "octicon-eye"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{if (gt .AssigneeID 0)}} - {{if .RemovedAssignee}} - {{if eq .PosterID .AssigneeID}} - {{$.i18n.Tr "repo.issues.review.remove_review_request_self" $createdStr | Safe}} + {{else if eq .Type 27}} +
+ {{svg "octicon-eye"}} + + {{avatar .Poster}} + + + {{.Poster.GetDisplayName}} + {{if (gt .AssigneeID 0)}} + {{if .RemovedAssignee}} + {{if eq .PosterID .AssigneeID}} + {{$.i18n.Tr "repo.issues.review.remove_review_request_self" $createdStr | Safe}} + {{else}} + {{$.i18n.Tr "repo.issues.review.remove_review_request" (.Assignee.GetDisplayName|Escape) $createdStr | Safe}} + {{end}} {{else}} - {{$.i18n.Tr "repo.issues.review.remove_review_request" (.Assignee.GetDisplayName|Escape) $createdStr | Safe}} + {{$.i18n.Tr "repo.issues.review.add_review_request" (.Assignee.GetDisplayName|Escape) $createdStr | Safe}} {{end}} {{else}} - {{$.i18n.Tr "repo.issues.review.add_review_request" (.Assignee.GetDisplayName|Escape) $createdStr | Safe}} - {{end}} - {{else}} - {{if .RemovedAssignee}} - {{$.i18n.Tr "repo.issues.review.remove_review_request" (.AssigneeTeam.Name|Escape) $createdStr | Safe}} - {{else}} - {{$.i18n.Tr "repo.issues.review.add_review_request" (.AssigneeTeam.Name|Escape) $createdStr | Safe}} + {{if .RemovedAssignee}} + {{$.i18n.Tr "repo.issues.review.remove_review_request" (.AssigneeTeam.Name|Escape) $createdStr | Safe}} + {{else}} + {{$.i18n.Tr "repo.issues.review.add_review_request" (.AssigneeTeam.Name|Escape) $createdStr | Safe}} + {{end}} {{end}} - {{end}} - -
- {{else if and (eq .Type 29) (or (gt .CommitsNum 0) .IsForcePush) (not $.HideIssueEvents)}} -
- {{svg "octicon-repo-push"}} - - {{.Poster.GetDisplayName}} - {{ if .IsForcePush }} - {{$.i18n.Tr "repo.issues.force_push_codes" $.Issue.PullRequest.HeadBranch (ShortSha .OldCommit) ($.Issue.Repo.CommitLink .OldCommit) (ShortSha .NewCommit) ($.Issue.Repo.CommitLink .NewCommit) $createdStr | Safe}} - {{else}} - {{$.i18n.Tr (TrN $.i18n.Lang (len .Commits) "repo.issues.push_commit_1" "repo.issues.push_commits_n") (len .Commits) $createdStr | Safe}} - {{end}} - -
- {{if not .IsForcePush}} - {{template "repo/commits_list_small" dict "comment" . "root" $}} - {{end}} - {{else if and (eq .Type 30) (not $.HideIssueEvents)}} - {{if not $.UnitProjectsGlobalDisabled}} -
- {{svg "octicon-project"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{if gt .OldProjectID 0}} - {{if gt .ProjectID 0}} - {{$.i18n.Tr "repo.issues.change_project_at" (.OldProject.Title|Escape) (.Project.Title|Escape) $createdStr | Safe}} + +
+ {{else if and (eq .Type 29) (or (gt .CommitsNum 0) .IsForcePush)}} +
+ {{svg "octicon-repo-push"}} + + {{.Poster.GetDisplayName}} + {{ if .IsForcePush }} + {{$.i18n.Tr "repo.issues.force_push_codes" $.Issue.PullRequest.HeadBranch (ShortSha .OldCommit) ($.Issue.Repo.CommitLink .OldCommit) (ShortSha .NewCommit) ($.Issue.Repo.CommitLink .NewCommit) $createdStr | Safe}} {{else}} - {{$.i18n.Tr "repo.issues.remove_project_at" (.OldProject.Title|Escape) $createdStr | Safe}} + {{$.i18n.Tr (TrN $.i18n.Lang (len .Commits) "repo.issues.push_commit_1" "repo.issues.push_commits_n") (len .Commits) $createdStr | Safe}} {{end}} - {{else if gt .ProjectID 0}} - {{$.i18n.Tr "repo.issues.add_project_at" (.Project.Title|Escape) $createdStr | Safe}} - {{end}} - -
- {{end}} - {{else if and (eq .Type 32) (not $.HideIssueEvents)}} -
+ +
+ {{if not .IsForcePush}} + {{template "repo/commits_list_small" dict "comment" . "root" $}} + {{end}} + {{else if eq .Type 30}} + {{if not $.UnitProjectsGlobalDisabled}}
- - + {{svg "octicon-project"}} + + {{avatar .Poster}} - {{svg "octicon-x" 16}} - {{.Poster.GetDisplayName}} - {{$reviewerName := ""}} - {{if eq .Review.OriginalAuthor ""}} - {{$reviewerName = .Review.Reviewer.Name}} - {{else}} - {{$reviewerName = .Review.OriginalAuthor}} + {{.Poster.GetDisplayName}} + {{if gt .OldProjectID 0}} + {{if gt .ProjectID 0}} + {{$.i18n.Tr "repo.issues.change_project_at" (.OldProject.Title|Escape) (.Project.Title|Escape) $createdStr | Safe}} + {{else}} + {{$.i18n.Tr "repo.issues.remove_project_at" (.OldProject.Title|Escape) $createdStr | Safe}} + {{end}} + {{else if gt .ProjectID 0}} + {{$.i18n.Tr "repo.issues.add_project_at" (.Project.Title|Escape) $createdStr | Safe}} {{end}} - {{$.i18n.Tr "repo.issues.review.dismissed" $reviewerName $createdStr | Safe}}
- {{if .Content}} -
-
-
- - {{$.i18n.Tr "action.review_dismissed_reason"}} - -
-
-
- {{if .RenderedContent}} - {{.RenderedContent|Str2html}} - {{else}} - {{$.i18n.Tr "repo.issues.no_content"}} - {{end}} + {{end}} + {{else if eq .Type 32}} +
+
+ + + + {{svg "octicon-x" 16}} + + {{.Poster.GetDisplayName}} + {{$reviewerName := ""}} + {{if eq .Review.OriginalAuthor ""}} + {{$reviewerName = .Review.Reviewer.Name}} + {{else}} + {{$reviewerName = .Review.OriginalAuthor}} + {{end}} + {{$.i18n.Tr "repo.issues.review.dismissed" $reviewerName $createdStr | Safe}} + +
+ {{if .Content}} +
+
+
+ + {{$.i18n.Tr "action.review_dismissed_reason"}} + +
+
+
+ {{if .RenderedContent}} + {{.RenderedContent|Str2html}} + {{else}} + {{$.i18n.Tr "repo.issues.no_content"}} + {{end}} +
-
- {{end}} -
+ {{end}} +
+ {{end}} {{end}} -{{end}} +{{end}} \ No newline at end of file From e49901605b07f063672ddb49002ab0114d339d81 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Sun, 24 Oct 2021 15:59:50 +0200 Subject: [PATCH 03/22] Add docs --- custom/conf/app.example.ini | 4 ++-- docs/content/doc/advanced/config-cheat-sheet.en-us.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini index eed1df936a5e..9477207d2b8d 100644 --- a/custom/conf/app.example.ini +++ b/custom/conf/app.example.ini @@ -1061,8 +1061,8 @@ PATH = ;; Whether to enable a Service Worker to cache frontend assets ;USE_SERVICE_WORKER = true ;; -;; Whether to hide issue events (like added/removed labels, changed milestones/projects...). -;HIDE_ISSUE_EVENTS = false +;; Issue comment types/events that should be hidden. +;HIDDEN_ISSUE_EVENTS = 7, 23 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/docs/content/doc/advanced/config-cheat-sheet.en-us.md b/docs/content/doc/advanced/config-cheat-sheet.en-us.md index a2941cbdb98a..16e3d253f4c3 100644 --- a/docs/content/doc/advanced/config-cheat-sheet.en-us.md +++ b/docs/content/doc/advanced/config-cheat-sheet.en-us.md @@ -189,7 +189,7 @@ The following configuration set `Content-Type: application/vnd.android.package-a - `DEFAULT_SHOW_FULL_NAME`: **false**: Whether the full name of the users should be shown where possible. If the full name isn't set, the username will be used. - `SEARCH_REPO_DESCRIPTION`: **true**: Whether to search within description at repository search on explore page. - `USE_SERVICE_WORKER`: **true**: Whether to enable a Service Worker to cache frontend assets. -- `HIDE_ISSUE_EVENTS`: **false**: Whether to hide issue events (like added/removed labels, changed milestones/projects...). +- `HIDDEN_ISSUE_EVENTS`: Issue comment types/events that should be hidden. ### UI - Admin (`ui.admin`) From d14beda43efd7d4fe40a02348b7129894307dfee Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Mon, 25 Oct 2021 17:48:39 +0200 Subject: [PATCH 04/22] Add missing newline --- templates/repo/issue/view_content/comments.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/repo/issue/view_content/comments.tmpl b/templates/repo/issue/view_content/comments.tmpl index 29808d3e0045..196b7a69c6c0 100644 --- a/templates/repo/issue/view_content/comments.tmpl +++ b/templates/repo/issue/view_content/comments.tmpl @@ -784,4 +784,4 @@
{{end}} {{end}} -{{end}} \ No newline at end of file +{{end}} From 7eabacfdbfaed3c3663e6496a9a2425ad14f1258 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Fri, 12 Nov 2021 16:38:25 +0100 Subject: [PATCH 05/22] Fix merge issues --- .../repo/issue/view_content/comments.tmpl | 315 ++++++++---------- 1 file changed, 134 insertions(+), 181 deletions(-) diff --git a/templates/repo/issue/view_content/comments.tmpl b/templates/repo/issue/view_content/comments.tmpl index 741e12b8d8b8..c851f7290a66 100644 --- a/templates/repo/issue/view_content/comments.tmpl +++ b/templates/repo/issue/view_content/comments.tmpl @@ -1,64 +1,67 @@ {{ template "base/alert" }} {{range .Issue.Comments}} {{if call $.IsEventShown .Type}} - {{ $createdStr:= TimeSinceUnix .CreatedUnix $.Lang } - - - {{if eq .Type 0}} -
- {{if .OriginalAuthor }} - - {{else}} - - {{avatar .Poster}} - - {{end}} -
-
-
- {{if .OriginalAuthor }} - - {{svg (MigrationIcon $.Repository.GetOriginalURLHostname)}} - {{ .OriginalAuthor }} - - - {{$.i18n.Tr "repo.issues.commented_at" .Issue.HashTag $createdStr | Safe}} {{if $.Repository.OriginalURL}} - - - ({{$.i18n.Tr "repo.migrated_from" $.Repository.OriginalURL $.Repository.GetOriginalURLHostname | Safe }}){{end}} - - {{else}} - - - {{.Poster.GetDisplayName}} - - {{$.i18n.Tr "repo.issues.commented_at" .HashTag $createdStr | Safe}} - - {{end}} -
-
- {{if not $.Repository.IsArchived}} - {{if (.ShowRole.HasRole "Poster")}} -
- {{$.i18n.Tr "repo.issues.poster"}} -
- {{end}} - {{if (.ShowRole.HasRole "Writer")}} -
- {{$.i18n.Tr "repo.issues.collaborator"}} -
- {{end}} - {{if (.ShowRole.HasRole "Owner")}} -
- {{$.i18n.Tr "repo.issues.owner"}} -
+ {{ $createdStr:= TimeSinceUnix .CreatedUnix $.Lang }} + + + {{if eq .Type 0}} +
+ {{if .OriginalAuthor }} + + {{else}} + + {{avatar .Poster}} + + {{end}} +
+
+
+ {{if .OriginalAuthor }} + + {{svg (MigrationIcon $.Repository.GetOriginalURLHostname)}} + {{ .OriginalAuthor }} + + + {{$.i18n.Tr "repo.issues.commented_at" .Issue.HashTag $createdStr | Safe}} {{if $.Repository.OriginalURL}} + + + ({{$.i18n.Tr "repo.migrated_from" $.Repository.OriginalURL $.Repository.GetOriginalURLHostname | Safe }}){{end}} + + {{else}} + + + {{.Poster.GetDisplayName}} + + {{$.i18n.Tr "repo.issues.commented_at" .HashTag $createdStr | Safe}} + + {{end}} +
+
+ {{if not $.Repository.IsArchived}} + {{if (.ShowRole.HasRole "Poster")}} +
+ {{$.i18n.Tr "repo.issues.poster"}} +
+ {{end}} + {{if (.ShowRole.HasRole "Writer")}} +
+ {{$.i18n.Tr "repo.issues.collaborator"}} +
+ {{end}} + {{if (.ShowRole.HasRole "Owner")}} +
+ {{$.i18n.Tr "repo.issues.owner"}} +
+ {{end}} + {{template "repo/issue/view_content/add_reaction" Dict "ctx" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID)}} + {{template "repo/issue/view_content/context_menu" Dict "ctx" $ "item" . "delete" true "issue" true "diff" false "IsCommentPoster" (and $.IsSigned (eq $.SignedUserID .PosterID))}} {{end}}
@@ -84,81 +87,20 @@ {{end}}
-
- {{else if eq .Type 1}} -
- {{svg "octicon-dot-fill"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{if .Issue.IsPull }} - {{$.i18n.Tr "repo.pulls.reopened_at" .EventTag $createdStr | Safe}} - {{else}} - {{$.i18n.Tr "repo.issues.reopened_at" .EventTag $createdStr | Safe}} - {{end}} - -
- {{else if eq .Type 2}} -
- {{svg "octicon-circle-slash"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{if .Issue.IsPull }} - {{$.i18n.Tr "repo.pulls.closed_at" .EventTag $createdStr | Safe}} - {{else}} - {{$.i18n.Tr "repo.issues.closed_at" .EventTag $createdStr | Safe}} - {{end}} - -
- {{else if eq .Type 28}} -
- {{svg "octicon-git-merge"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$link := printf "%s/commit/%s" $.Repository.HTMLURL $.Issue.PullRequest.MergedCommitID}} - {{if eq $.Issue.PullRequest.Status 3}} - {{$.i18n.Tr "repo.issues.manually_pull_merged_at" $link (ShortSha $.Issue.PullRequest.MergedCommitID) $.BaseTarget $createdStr | Str2html}} - {{else}} - {{$.i18n.Tr "repo.issues.pull_merged_at" $link (ShortSha $.Issue.PullRequest.MergedCommitID) $.BaseTarget $createdStr | Str2html}} - {{end}} - -
- {{else if eq .Type 3 5 6}} - {{ $refFrom:= "" }} - {{if ne .RefRepoID .Issue.RepoID}} - {{ $refFrom = $.i18n.Tr "repo.issues.ref_from" .RefRepo.FullName }} - {{end}} - {{ $refTr := "repo.issues.ref_issue_from" }} - {{if .Issue.IsPull}} - {{ $refTr = "repo.issues.ref_pull_from" }} - {{else if eq .RefAction 1 }} - {{ $refTr = "repo.issues.ref_closing_from" }} - {{else if eq .RefAction 2 }} - {{ $refTr = "repo.issues.ref_reopening_from" }} - {{end}} - {{ $createdStr:= TimeSinceUnix .CreatedUnix $.Lang }} -
- {{svg "octicon-bookmark"}} - - {{avatar .Poster}} - - {{if eq .RefAction 3}}{{end}} - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr $refTr .EventTag $createdStr .RefCommentHTMLURL $refFrom | Safe}} - - {{if eq .RefAction 3}}{{end}} - -
- {{.RefIssueTitle}} {{.RefIssueIdent}} + {{else if eq .Type 1}} +
+ {{svg "octicon-dot-fill"}} + + {{avatar .Poster}} + + + {{.Poster.GetDisplayName}} + {{if .Issue.IsPull }} + {{$.i18n.Tr "repo.pulls.reopened_at" .EventTag $createdStr | Safe}} + {{else}} + {{$.i18n.Tr "repo.issues.reopened_at" .EventTag $createdStr | Safe}} + {{end}} +
{{else if eq .Type 2}} {{else if eq .Type 4}} @@ -580,53 +522,64 @@
-
- {{end}} -
-
- {{range $comms}} - {{ $createdSubStr:= TimeSinceUnix .CreatedUnix $.Lang }} -
-
-
-
- {{if not .OriginalAuthor }} - - {{avatar .Poster}} - - {{end}} - - {{if .OriginalAuthor }} - - {{svg (MigrationIcon $.Repository.GetOriginalURLHostname)}} - {{ .OriginalAuthor }} - - {{if $.Repository.OriginalURL}} - ({{$.i18n.Tr "repo.migrated_from" $.Repository.OriginalURL $.Repository.GetOriginalURLHostname | Safe }}){{end}} - {{else}} - {{.Poster.GetDisplayName}} - {{end}} - {{$.i18n.Tr "repo.issues.commented_at" .HashTag $createdSubStr | Safe}} - -
-
- {{if (.ShowRole.HasRole "Poster")}} -
- {{$.i18n.Tr "repo.issues.poster"}} -
- {{end}} - {{if (.ShowRole.HasRole "Writer")}} -
- {{$.i18n.Tr "repo.issues.collaborator"}} -
- {{end}} - {{if (.ShowRole.HasRole "Owner")}} -
- {{$.i18n.Tr "repo.issues.owner"}} -
- {{end}} - {{template "repo/issue/view_content/add_reaction" Dict "ctx" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID)}} - {{template "repo/issue/view_content/context_menu" Dict "ctx" $ "item" . "delete" true "issue" true "diff" true "IsCommentPoster" (and $.IsSigned (eq $.SignedUserID .PosterID))}} + {{end}} +
+
+ {{range $comms}} + {{ $createdSubStr:= TimeSinceUnix .CreatedUnix $.Lang }} +
+
+
+
+ {{if not .OriginalAuthor }} + + {{avatar .Poster}} + + {{end}} + + {{if .OriginalAuthor }} + + {{svg (MigrationIcon $.Repository.GetOriginalURLHostname)}} + {{ .OriginalAuthor }} + + {{if $.Repository.OriginalURL}} + ({{$.i18n.Tr "repo.migrated_from" $.Repository.OriginalURL $.Repository.GetOriginalURLHostname | Safe }}){{end}} + {{else}} + {{.Poster.GetDisplayName}} + {{end}} + {{$.i18n.Tr "repo.issues.commented_at" .HashTag $createdSubStr | Safe}} + +
+
+ {{if (.ShowRole.HasRole "Poster")}} +
+ {{$.i18n.Tr "repo.issues.poster"}} +
+ {{end}} + {{if (.ShowRole.HasRole "Writer")}} +
+ {{$.i18n.Tr "repo.issues.collaborator"}} +
+ {{end}} + {{if (.ShowRole.HasRole "Owner")}} +
+ {{$.i18n.Tr "repo.issues.owner"}} +
+ {{end}} + {{template "repo/issue/view_content/add_reaction" Dict "ctx" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID)}} + {{template "repo/issue/view_content/context_menu" Dict "ctx" $ "item" . "delete" true "issue" true "diff" true "IsCommentPoster" (and $.IsSigned (eq $.SignedUserID .PosterID))}} +
+
+
+
+ {{if .RenderedContent}} + {{.RenderedContent|Str2html}} + {{else}} + {{$.i18n.Tr "repo.issues.no_content"}} + {{end}} +
+
{{.Content}}
+
{{$reactions := .Reactions.GroupByType}} {{if $reactions}} From 2f49cab4b3e146dafaa8986a2ac0ed413fc367c7 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Mon, 22 Nov 2021 17:21:57 +0100 Subject: [PATCH 06/22] Allow changes per user settings --- modules/setting/setting.go | 2 - options/locale/locale_en-US.ini | 17 ++++ routers/web/repo/issue.go | 24 +++++- routers/web/user/setting/profile.go | 36 ++++++++ routers/web/web.go | 1 + services/forms/user_form.go | 87 ++++++++++++++++++++ templates/user/settings/appearance.tmpl | 104 ++++++++++++++++++++++++ 7 files changed, 265 insertions(+), 6 deletions(-) diff --git a/modules/setting/setting.go b/modules/setting/setting.go index 260deb87b028..16ebde1791b7 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -217,7 +217,6 @@ var ( CustomEmojisMap map[string]string `ini:"-"` SearchRepoDescription bool UseServiceWorker bool - HiddenIssueEvents []int Notification struct { MinTimeout time.Duration @@ -265,7 +264,6 @@ var ( Reactions: []string{`+1`, `-1`, `laugh`, `hooray`, `confused`, `heart`, `rocket`, `eyes`}, CustomEmojis: []string{`git`, `gitea`, `codeberg`, `gitlab`, `github`, `gogs`}, CustomEmojisMap: map[string]string{"git": ":git:", "gitea": ":gitea:", "codeberg": ":codeberg:", "gitlab": ":gitlab:", "github": ":github:", "gogs": ":gogs:"}, - HiddenIssueEvents: []int{}, Notification: struct { MinTimeout time.Duration TimeoutStep time.Duration diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 6e39b4b03d83..d8312997c2c5 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -532,6 +532,23 @@ continue = Continue cancel = Cancel language = Language ui = Theme +shown_comments = Hidden comment types +comment_type_ref = References +comment_type_changed_labels = Changed labels +comment_type_changed_milestone = Changed milestone +comment_type_changed_assignees = Changed assignees +comment_type_changed_title = Changed title +comment_type_delete_branch = Delete branch +comment_type_changed_time = Changed time +comment_type_changed_deadline = Changed deadline +comment_type_changed_dependencies = Changed dependencies +comment_type_changed_lock_status = Changed lock status +comment_type_changed_target = Changed target branch +comment_type_review_request = Review requests +comment_type_pr_push = Added commits +comment_type_changed_project = Changed project +comment_type_changed_ref = Changed reference +saved_successfully = Your settings were saved successfully. privacy = Privacy keep_activity_private = Hide the activity from the profile page keep_activity_private_popup = Makes the activity visible only for you and the admins diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index e4048d4a3272..818ec32abd48 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -7,6 +7,7 @@ package repo import ( "bytes" + "encoding/json" "errors" "fmt" "io" @@ -19,6 +20,7 @@ import ( "code.gitea.io/gitea/models" "code.gitea.io/gitea/models/db" repo_model "code.gitea.io/gitea/models/repo" + user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/models/unit" "code.gitea.io/gitea/modules/base" "code.gitea.io/gitea/modules/context" @@ -1636,12 +1638,26 @@ func ViewIssue(ctx *context.Context) { ctx.Data["HasProjectsWritePermission"] = ctx.Repo.CanWrite(unit.TypeProjects) ctx.Data["IsRepoAdmin"] = ctx.IsSigned && (ctx.Repo.IsAdmin() || ctx.User.IsAdmin) ctx.Data["LockReasons"] = setting.Repository.Issue.LockReasons + var hiddenEvents *forms.UpdateCommentTypeForm + if ctx.IsSigned { + eventsRaw, err := user_model.GetSettings(ctx.User.ID, []string{"hidden_comment_types"}) + if err != nil { + ctx.ServerError("GetSettings", err) + return + } + if eventsRaw["hidden_comment_types"] != nil && eventsRaw["hidden_comment_types"].SettingValue != "" { + err = json.Unmarshal([]byte(eventsRaw["hidden_comment_types"].SettingValue), &hiddenEvents) + if err != nil { + ctx.ServerError("json.Unmarshal", err) + return + } + } + } ctx.Data["IsEventShown"] = func(commentType models.CommentType) bool { - hiddenEvents := make([]int64, len(setting.UI.HiddenIssueEvents)) - for i, event := range setting.UI.HiddenIssueEvents { - hiddenEvents[i] = int64(event) + if !ctx.IsSigned || hiddenEvents == nil { + return true } - return !util.IsInt64InSlice(int64(commentType), hiddenEvents) + return !hiddenEvents.IsHidden(int(commentType)) } ctx.Data["RefEndName"] = git.RefEndName(issue.Ref) ctx.HTML(http.StatusOK, tplIssueView) diff --git a/routers/web/user/setting/profile.go b/routers/web/user/setting/profile.go index 36fe45df04ff..1ebb061e210a 100644 --- a/routers/web/user/setting/profile.go +++ b/routers/web/user/setting/profile.go @@ -6,6 +6,7 @@ package setting import ( + "encoding/json" "errors" "fmt" "io" @@ -351,6 +352,22 @@ func Appearance(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("settings") ctx.Data["PageIsSettingsAppearance"] = true + hiddenEvents := &forms.UpdateCommentTypeForm{} + eventsRaw, err := user_model.GetSettings(ctx.User.ID, []string{"hidden_comment_types"}) + if err != nil { + ctx.ServerError("GetSettings", err) + return + } + if eventsRaw["hidden_comment_types"] != nil && eventsRaw["hidden_comment_types"].SettingValue != "" { + err = json.Unmarshal([]byte(eventsRaw["hidden_comment_types"].SettingValue), &hiddenEvents) + if err != nil { + ctx.ServerError("json.Unmarshal", err) + return + } + } + + ctx.Data["HiddenEvents"] = hiddenEvents + ctx.HTML(http.StatusOK, tplSettingsAppearance) } @@ -410,3 +427,22 @@ func UpdateUserLang(ctx *context.Context) { ctx.Redirect(setting.AppSubURL + "/user/settings/appearance") } + +// UpdateUserShownComments update a user's shown comment types +func UpdateUserShownComments(ctx *context.Context) { + form := web.GetForm(ctx).(*forms.UpdateCommentTypeForm) + ctx.Data["Title"] = ctx.Tr("settings") + ctx.Data["PageIsSettingsAppearance"] = true + + json, err := json.Marshal(form) + if err != nil { + ctx.ServerError("UpdateUserSetting", err) + return + } + user_model.SetSetting(&user_model.Setting{UserID: ctx.User.ID, SettingKey: "hidden_comment_types", SettingValue: string(json)}) + + log.Trace("User settings updated: %s", ctx.User.Name) + ctx.Flash.Success(ctx.Tr("settings.saved_successfully")) + ctx.Redirect(setting.AppSubURL + "/user/settings/appearance") + +} diff --git a/routers/web/web.go b/routers/web/web.go index f84d357bb126..4aa825269f70 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -320,6 +320,7 @@ func RegisterRoutes(m *web.Route) { m.Group("/appearance", func() { m.Get("", userSetting.Appearance) m.Post("/language", bindIgnErr(forms.UpdateLanguageForm{}), userSetting.UpdateUserLang) + m.Post("/shown_comments", bindIgnErr(forms.UpdateCommentTypeForm{}), userSetting.UpdateUserShownComments) m.Post("/theme", bindIgnErr(forms.UpdateThemeForm{}), userSetting.UpdateUIThemePost) }) m.Group("/security", func() { diff --git a/services/forms/user_form.go b/services/forms/user_form.go index 9f86bf61661f..2b7a3a0f8ca7 100644 --- a/services/forms/user_form.go +++ b/services/forms/user_form.go @@ -262,6 +262,93 @@ func (f *UpdateLanguageForm) Validate(req *http.Request, errs binding.Errors) bi return middleware.Validate(errs, ctx.Data, f, ctx.Locale) } +// UpdateCommentTypeForm form for updating profile +type UpdateCommentTypeForm struct { + Reference bool + Labels bool + Milestone bool + Assignee bool + Title bool + Branch bool // delete branch + Time bool + Deadline bool + Dependencies bool + Lock bool + Target bool // target branch + Requests bool // review requests + Push bool // push to PR + Project bool + Ref bool // issue ref +} + +// Validate validates the fields +func (f *UpdateCommentTypeForm) Validate(req *http.Request, errs binding.Errors) binding.Errors { + ctx := context.GetContext(req) + return middleware.Validate(errs, ctx.Data, f, ctx.Locale) +} + +// IsHidden checks if the given commentType is visible +func (f *UpdateCommentTypeForm) IsHidden(commentType int) bool { + switch commentType { + case 3: + return f.Reference + case 4: + return f.Reference + case 5: + return f.Reference + case 6: + return f.Reference + case 7: + return f.Labels + case 8: + return f.Milestone + case 9: + return f.Assignee + case 10: + return f.Title + case 11: + return f.Branch + case 12: + return f.Time + case 13: + return f.Time + case 14: + return f.Time + case 15: + return f.Time + case 26: + return f.Time + case 16: + return f.Deadline + case 17: + return f.Deadline + case 18: + return f.Deadline + case 19: + return f.Dependencies + case 20: + return f.Dependencies + case 23: + return f.Lock + case 24: + return f.Lock + case 25: + return f.Target + case 27: + return f.Requests + case 29: + return f.Push + case 30: + return f.Project + case 31: + return f.Project + case 33: + return f.Ref + } + return false +} + + // Avatar types const ( AvatarLocal string = "local" diff --git a/templates/user/settings/appearance.tmpl b/templates/user/settings/appearance.tmpl index 777b89c750ec..8c01c4a7620e 100644 --- a/templates/user/settings/appearance.tmpl +++ b/templates/user/settings/appearance.tmpl @@ -68,6 +68,110 @@
+ + +

+ {{.i18n.Tr "settings.shown_comments"}} +

+
+
+ {{.CsrfTokenHtml}} +
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+ +
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+
From f0e6e021d7a98b48b4c9bb44af2bf9e8aeb5b0a1 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Mon, 22 Nov 2021 17:27:47 +0100 Subject: [PATCH 07/22] Fix lint --- routers/web/repo/issue.go | 2 +- routers/web/user/setting/profile.go | 10 +++++++--- services/forms/user_form.go | 29 ++++++++++++++--------------- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index 818ec32abd48..82000fcad48f 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -20,8 +20,8 @@ import ( "code.gitea.io/gitea/models" "code.gitea.io/gitea/models/db" repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/models/unit" + user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/base" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" diff --git a/routers/web/user/setting/profile.go b/routers/web/user/setting/profile.go index 1ebb061e210a..4a2e0e39145e 100644 --- a/routers/web/user/setting/profile.go +++ b/routers/web/user/setting/profile.go @@ -365,7 +365,7 @@ func Appearance(ctx *context.Context) { return } } - + ctx.Data["HiddenEvents"] = hiddenEvents ctx.HTML(http.StatusOK, tplSettingsAppearance) @@ -436,10 +436,14 @@ func UpdateUserShownComments(ctx *context.Context) { json, err := json.Marshal(form) if err != nil { - ctx.ServerError("UpdateUserSetting", err) + ctx.ServerError("json.Marshal", err) + return + } + err = user_model.SetSetting(&user_model.Setting{UserID: ctx.User.ID, SettingKey: "hidden_comment_types", SettingValue: string(json)}) + if err != nil { + ctx.ServerError("SetSetting", err) return } - user_model.SetSetting(&user_model.Setting{UserID: ctx.User.ID, SettingKey: "hidden_comment_types", SettingValue: string(json)}) log.Trace("User settings updated: %s", ctx.User.Name) ctx.Flash.Success(ctx.Tr("settings.saved_successfully")) diff --git a/services/forms/user_form.go b/services/forms/user_form.go index 2b7a3a0f8ca7..0a0691094304 100644 --- a/services/forms/user_form.go +++ b/services/forms/user_form.go @@ -264,21 +264,21 @@ func (f *UpdateLanguageForm) Validate(req *http.Request, errs binding.Errors) bi // UpdateCommentTypeForm form for updating profile type UpdateCommentTypeForm struct { - Reference bool - Labels bool - Milestone bool - Assignee bool - Title bool - Branch bool // delete branch - Time bool - Deadline bool + Reference bool + Labels bool + Milestone bool + Assignee bool + Title bool + Branch bool // delete branch + Time bool + Deadline bool Dependencies bool - Lock bool - Target bool // target branch - Requests bool // review requests - Push bool // push to PR - Project bool - Ref bool // issue ref + Lock bool + Target bool // target branch + Requests bool // review requests + Push bool // push to PR + Project bool + Ref bool // issue ref } // Validate validates the fields @@ -348,7 +348,6 @@ func (f *UpdateCommentTypeForm) IsHidden(commentType int) bool { return false } - // Avatar types const ( AvatarLocal string = "local" From 15a5ab6e890e3aa8b807e7e306d7928036de4716 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Sat, 27 Nov 2021 15:12:11 +0100 Subject: [PATCH 08/22] Rm old docs --- custom/conf/app.example.ini | 3 --- docs/content/doc/advanced/config-cheat-sheet.en-us.md | 1 - 2 files changed, 4 deletions(-) diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini index 21cbc805ba23..18985e04e954 100644 --- a/custom/conf/app.example.ini +++ b/custom/conf/app.example.ini @@ -1070,9 +1070,6 @@ PATH = ;; ;; Whether to enable a Service Worker to cache frontend assets ;USE_SERVICE_WORKER = true -;; -;; Issue comment types/events that should be hidden. -;HIDDEN_ISSUE_EVENTS = 7, 23 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/docs/content/doc/advanced/config-cheat-sheet.en-us.md b/docs/content/doc/advanced/config-cheat-sheet.en-us.md index d17e05d9f572..3e9b27961418 100644 --- a/docs/content/doc/advanced/config-cheat-sheet.en-us.md +++ b/docs/content/doc/advanced/config-cheat-sheet.en-us.md @@ -189,7 +189,6 @@ The following configuration set `Content-Type: application/vnd.android.package-a - `DEFAULT_SHOW_FULL_NAME`: **false**: Whether the full name of the users should be shown where possible. If the full name isn't set, the username will be used. - `SEARCH_REPO_DESCRIPTION`: **true**: Whether to search within description at repository search on explore page. - `USE_SERVICE_WORKER`: **true**: Whether to enable a Service Worker to cache frontend assets. -- `HIDDEN_ISSUE_EVENTS`: Issue comment types/events that should be hidden. ### UI - Admin (`ui.admin`) From 02ba95197279db097c84c21d34bc1f1fef824c00 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Sat, 27 Nov 2021 19:14:12 +0100 Subject: [PATCH 09/22] Apply suggestions from code review --- routers/web/repo/issue.go | 4 ++-- routers/web/user/setting/profile.go | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index 893183da79eb..9ef6f1200398 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -1648,13 +1648,13 @@ func ViewIssue(ctx *context.Context) { if eventsRaw["hidden_comment_types"] != nil && eventsRaw["hidden_comment_types"].SettingValue != "" { err = json.Unmarshal([]byte(eventsRaw["hidden_comment_types"].SettingValue), &hiddenEvents) if err != nil { - ctx.ServerError("json.Unmarshal", err) + log.Error("error while parsing JSON: %v", err) return } } } ctx.Data["IsEventShown"] = func(commentType models.CommentType) bool { - if !ctx.IsSigned || hiddenEvents == nil { + if hiddenEvents == nil { return true } return !hiddenEvents.IsHidden(int(commentType)) diff --git a/routers/web/user/setting/profile.go b/routers/web/user/setting/profile.go index 15329ff9bf32..4a63a889488f 100644 --- a/routers/web/user/setting/profile.go +++ b/routers/web/user/setting/profile.go @@ -367,8 +367,7 @@ func Appearance(ctx *context.Context) { if eventsRaw["hidden_comment_types"] != nil && eventsRaw["hidden_comment_types"].SettingValue != "" { err = json.Unmarshal([]byte(eventsRaw["hidden_comment_types"].SettingValue), &hiddenEvents) if err != nil { - ctx.ServerError("json.Unmarshal", err) - return + log.Error("error parsing JSON: %v", err) } } From afc675c9384d26725ee23fac8e6812fe07e7dca8 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Thu, 2 Dec 2021 07:43:52 +0100 Subject: [PATCH 10/22] Use bitsets --- routers/web/repo/issue.go | 15 +-- routers/web/user/setting/profile.go | 29 +++-- services/forms/user_form.go | 137 ++++++++++++++---------- templates/user/settings/appearance.tmpl | 30 +++--- 4 files changed, 124 insertions(+), 87 deletions(-) diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index 9eb0c3a20292..efc7b8d1035c 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -7,10 +7,10 @@ package repo import ( "bytes" - "encoding/json" "errors" "fmt" "io" + "math/big" "net/http" "net/url" "path" @@ -1636,7 +1636,7 @@ func ViewIssue(ctx *context.Context) { ctx.Data["HasProjectsWritePermission"] = ctx.Repo.CanWrite(unit.TypeProjects) ctx.Data["IsRepoAdmin"] = ctx.IsSigned && (ctx.Repo.IsAdmin() || ctx.User.IsAdmin) ctx.Data["LockReasons"] = setting.Repository.Issue.LockReasons - var hiddenEvents *forms.UpdateCommentTypeForm + var hiddenEvents *big.Int if ctx.IsSigned { eventsRaw, err := user_model.GetSettings(ctx.User.ID, []string{"hidden_comment_types"}) if err != nil { @@ -1644,10 +1644,11 @@ func ViewIssue(ctx *context.Context) { return } if eventsRaw["hidden_comment_types"] != nil && eventsRaw["hidden_comment_types"].SettingValue != "" { - err = json.Unmarshal([]byte(eventsRaw["hidden_comment_types"].SettingValue), &hiddenEvents) - if err != nil { - log.Error("error while parsing JSON: %v", err) - return + var ok bool + hiddenEvents, ok = new(big.Int).SetString(eventsRaw["hidden_comment_types"].SettingValue, 10) + if !ok { + hiddenEvents = nil + log.Error("SetString: error") } } } @@ -1655,7 +1656,7 @@ func ViewIssue(ctx *context.Context) { if hiddenEvents == nil { return true } - return !hiddenEvents.IsHidden(int(commentType)) + return hiddenEvents.Bit(int(commentType)) == 0 } ctx.Data["RefEndName"] = git.RefEndName(issue.Ref) ctx.HTML(http.StatusOK, tplIssueView) diff --git a/routers/web/user/setting/profile.go b/routers/web/user/setting/profile.go index 4a63a889488f..02e1f2b57e02 100644 --- a/routers/web/user/setting/profile.go +++ b/routers/web/user/setting/profile.go @@ -6,10 +6,10 @@ package setting import ( - "encoding/json" "errors" "fmt" "io" + "math/big" "net/http" "os" "path/filepath" @@ -358,20 +358,29 @@ func Appearance(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("settings") ctx.Data["PageIsSettingsAppearance"] = true - hiddenEvents := &forms.UpdateCommentTypeForm{} + //hiddenEvents := &forms.UpdateCommentTypeForm{} + var hiddenEvents *big.Int eventsRaw, err := user_model.GetSettings(ctx.User.ID, []string{"hidden_comment_types"}) if err != nil { ctx.ServerError("GetSettings", err) return } if eventsRaw["hidden_comment_types"] != nil && eventsRaw["hidden_comment_types"].SettingValue != "" { - err = json.Unmarshal([]byte(eventsRaw["hidden_comment_types"].SettingValue), &hiddenEvents) - if err != nil { - log.Error("error parsing JSON: %v", err) + var ok bool + hiddenEvents, ok = new(big.Int).SetString(eventsRaw["hidden_comment_types"].SettingValue, 10) + if !ok { + hiddenEvents = nil + log.Error("SetString: error") } } - ctx.Data["HiddenEvents"] = hiddenEvents + //ctx.Data["HiddenEvents"] = hiddenEvents + ctx.Data["IsHidden"] = func(commentType int) bool { + if hiddenEvents == nil { + return false + } + return hiddenEvents.Bit(commentType) != 0 + } ctx.HTML(http.StatusOK, tplSettingsAppearance) } @@ -439,12 +448,14 @@ func UpdateUserShownComments(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("settings") ctx.Data["PageIsSettingsAppearance"] = true - json, err := json.Marshal(form) + /*json, err := json.Marshal(form.Bitset()) if err != nil { ctx.ServerError("json.Marshal", err) return - } - err = user_model.SetSetting(&user_model.Setting{UserID: ctx.User.ID, SettingKey: "hidden_comment_types", SettingValue: string(json)}) + }*/ + bitset := form.Bitset() + json := /*strconv.Itoa(form.Bitset().Uint64())*/ bitset.String() + err := user_model.SetSetting(&user_model.Setting{UserID: ctx.User.ID, SettingKey: "hidden_comment_types", SettingValue: string(json)}) if err != nil { ctx.ServerError("SetSetting", err) return diff --git a/services/forms/user_form.go b/services/forms/user_form.go index 0a0691094304..45d98df66b64 100644 --- a/services/forms/user_form.go +++ b/services/forms/user_form.go @@ -6,6 +6,7 @@ package forms import ( + "math/big" "mime/multipart" "net/http" "strings" @@ -289,63 +290,87 @@ func (f *UpdateCommentTypeForm) Validate(req *http.Request, errs binding.Errors) // IsHidden checks if the given commentType is visible func (f *UpdateCommentTypeForm) IsHidden(commentType int) bool { - switch commentType { - case 3: - return f.Reference - case 4: - return f.Reference - case 5: - return f.Reference - case 6: - return f.Reference - case 7: - return f.Labels - case 8: - return f.Milestone - case 9: - return f.Assignee - case 10: - return f.Title - case 11: - return f.Branch - case 12: - return f.Time - case 13: - return f.Time - case 14: - return f.Time - case 15: - return f.Time - case 26: - return f.Time - case 16: - return f.Deadline - case 17: - return f.Deadline - case 18: - return f.Deadline - case 19: - return f.Dependencies - case 20: - return f.Dependencies - case 23: - return f.Lock - case 24: - return f.Lock - case 25: - return f.Target - case 27: - return f.Requests - case 29: - return f.Push - case 30: - return f.Project - case 31: - return f.Project - case 33: - return f.Ref + bitset := f.Bitset() + return bitset.Bit(commentType) != 0 +} + +func (f *UpdateCommentTypeForm) Bitset() big.Int { + var bitset big.Int + types := []struct{ + variable bool + types []int + }{ + { + variable: f.Reference, + types: []int{3, 4, 5, 6}, + }, + { + variable: f.Labels, + types: []int{7}, + }, + { + variable: f.Milestone, + types: []int{8}, + }, + { + variable: f.Assignee, + types: []int{9}, + }, + { + variable: f.Title, + types: []int{10}, + }, + { + variable: f.Branch, + types: []int{11}, + }, + { + variable: f.Time, + types: []int{12, 13, 14, 15, 26}, + }, + { + variable: f.Deadline, + types: []int{16, 17, 18}, + }, + { + variable: f.Dependencies, + types: []int{19, 20}, + }, + { + variable: f.Lock, + types: []int{23, 24}, + }, + { + variable: f.Target, + types: []int{25}, + }, + { + variable: f.Requests, + types: []int{27}, + }, + { + variable: f.Push, + types: []int{29}, + }, + { + variable: f.Project, + types: []int{30, 31}, + }, + { + variable: f.Ref, + types: []int{33}, + }, } - return false + for _, v := range types { + for _, w := range v.types { + var bitSetVar uint + if v.variable { + bitSetVar = 1 + } + bitset.SetBit(&bitset, w, bitSetVar) + } + } + return bitset } // Avatar types diff --git a/templates/user/settings/appearance.tmpl b/templates/user/settings/appearance.tmpl index 8c01c4a7620e..e37adf524b70 100644 --- a/templates/user/settings/appearance.tmpl +++ b/templates/user/settings/appearance.tmpl @@ -78,92 +78,92 @@ {{.CsrfTokenHtml}}
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
From d2b84b58c7adbf5349d6206738243067255e0900 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Thu, 2 Dec 2021 07:46:34 +0100 Subject: [PATCH 11/22] Rm comment --- routers/web/user/setting/profile.go | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/routers/web/user/setting/profile.go b/routers/web/user/setting/profile.go index 02e1f2b57e02..947758f2ad69 100644 --- a/routers/web/user/setting/profile.go +++ b/routers/web/user/setting/profile.go @@ -358,7 +358,6 @@ func Appearance(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("settings") ctx.Data["PageIsSettingsAppearance"] = true - //hiddenEvents := &forms.UpdateCommentTypeForm{} var hiddenEvents *big.Int eventsRaw, err := user_model.GetSettings(ctx.User.ID, []string{"hidden_comment_types"}) if err != nil { @@ -374,7 +373,6 @@ func Appearance(ctx *context.Context) { } } - //ctx.Data["HiddenEvents"] = hiddenEvents ctx.Data["IsHidden"] = func(commentType int) bool { if hiddenEvents == nil { return false @@ -448,13 +446,8 @@ func UpdateUserShownComments(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("settings") ctx.Data["PageIsSettingsAppearance"] = true - /*json, err := json.Marshal(form.Bitset()) - if err != nil { - ctx.ServerError("json.Marshal", err) - return - }*/ bitset := form.Bitset() - json := /*strconv.Itoa(form.Bitset().Uint64())*/ bitset.String() + json := bitset.String() err := user_model.SetSetting(&user_model.Setting{UserID: ctx.User.ID, SettingKey: "hidden_comment_types", SettingValue: string(json)}) if err != nil { ctx.ServerError("SetSetting", err) From e16472baf0a3cbf82f402f5b35acfd6d62df92da Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Thu, 2 Dec 2021 07:47:55 +0100 Subject: [PATCH 12/22] fmt --- services/forms/user_form.go | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/services/forms/user_form.go b/services/forms/user_form.go index 45d98df66b64..3a07961b4bc9 100644 --- a/services/forms/user_form.go +++ b/services/forms/user_form.go @@ -296,69 +296,69 @@ func (f *UpdateCommentTypeForm) IsHidden(commentType int) bool { func (f *UpdateCommentTypeForm) Bitset() big.Int { var bitset big.Int - types := []struct{ + types := []struct { variable bool - types []int + types []int }{ { variable: f.Reference, - types: []int{3, 4, 5, 6}, + types: []int{3, 4, 5, 6}, }, { variable: f.Labels, - types: []int{7}, + types: []int{7}, }, { variable: f.Milestone, - types: []int{8}, + types: []int{8}, }, { variable: f.Assignee, - types: []int{9}, + types: []int{9}, }, { variable: f.Title, - types: []int{10}, + types: []int{10}, }, { variable: f.Branch, - types: []int{11}, + types: []int{11}, }, { variable: f.Time, - types: []int{12, 13, 14, 15, 26}, + types: []int{12, 13, 14, 15, 26}, }, { variable: f.Deadline, - types: []int{16, 17, 18}, + types: []int{16, 17, 18}, }, { variable: f.Dependencies, - types: []int{19, 20}, + types: []int{19, 20}, }, { variable: f.Lock, - types: []int{23, 24}, + types: []int{23, 24}, }, { variable: f.Target, - types: []int{25}, + types: []int{25}, }, { variable: f.Requests, - types: []int{27}, + types: []int{27}, }, { variable: f.Push, - types: []int{29}, + types: []int{29}, }, { variable: f.Project, - types: []int{30, 31}, + types: []int{30, 31}, }, { variable: f.Ref, - types: []int{33}, + types: []int{33}, }, } for _, v := range types { From 3a76a144088a1c2e9571f7c846a243cb70089b61 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Thu, 2 Dec 2021 07:54:31 +0100 Subject: [PATCH 13/22] Fix lint --- services/forms/user_form.go | 1 + 1 file changed, 1 insertion(+) diff --git a/services/forms/user_form.go b/services/forms/user_form.go index 3a07961b4bc9..71458dfd6683 100644 --- a/services/forms/user_form.go +++ b/services/forms/user_form.go @@ -294,6 +294,7 @@ func (f *UpdateCommentTypeForm) IsHidden(commentType int) bool { return bitset.Bit(commentType) != 0 } +// Bitset created the bitset to the update comment form func (f *UpdateCommentTypeForm) Bitset() big.Int { var bitset big.Int types := []struct { From ff70bdb7505fbdee66cb88bb6f468ac9540bdfce Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Tue, 14 Dec 2021 19:00:11 +0100 Subject: [PATCH 14/22] Use variable/constant to provide key --- routers/web/repo/issue.go | 8 +++++--- routers/web/user/setting/profile.go | 9 +++++---- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index c75440ccb7bf..3f5c2827f4be 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -67,6 +67,8 @@ var ( ".github/ISSUE_TEMPLATE.md", ".github/issue_template.md", } + + HiddenCommentTypesSettingsKey = "hidden_comment_types" ) // MustAllowUserComment checks to make sure if an issue is locked. @@ -1638,14 +1640,14 @@ func ViewIssue(ctx *context.Context) { ctx.Data["LockReasons"] = setting.Repository.Issue.LockReasons var hiddenEvents *big.Int if ctx.IsSigned { - eventsRaw, err := user_model.GetSettings(ctx.User.ID, []string{"hidden_comment_types"}) + eventsRaw, err := user_model.GetSettings(ctx.User.ID, []string{HiddenCommentTypesSettingsKey}) if err != nil { ctx.ServerError("GetSettings", err) return } - if eventsRaw["hidden_comment_types"] != nil && eventsRaw["hidden_comment_types"].SettingValue != "" { + if eventsRaw[HiddenCommentTypesSettingsKey] != nil && eventsRaw[HiddenCommentTypesSettingsKey].SettingValue != "" { var ok bool - hiddenEvents, ok = new(big.Int).SetString(eventsRaw["hidden_comment_types"].SettingValue, 10) + hiddenEvents, ok = new(big.Int).SetString(eventsRaw[HiddenCommentTypesSettingsKey].SettingValue, 10) if !ok { hiddenEvents = nil log.Error("SetString: error") diff --git a/routers/web/user/setting/profile.go b/routers/web/user/setting/profile.go index 947758f2ad69..f1a0ec682188 100644 --- a/routers/web/user/setting/profile.go +++ b/routers/web/user/setting/profile.go @@ -26,6 +26,7 @@ import ( "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/modules/web/middleware" + repo_router "code.gitea.io/gitea/routers/web/repo" "code.gitea.io/gitea/services/agit" "code.gitea.io/gitea/services/forms" user_service "code.gitea.io/gitea/services/user" @@ -359,14 +360,14 @@ func Appearance(ctx *context.Context) { ctx.Data["PageIsSettingsAppearance"] = true var hiddenEvents *big.Int - eventsRaw, err := user_model.GetSettings(ctx.User.ID, []string{"hidden_comment_types"}) + eventsRaw, err := user_model.GetSettings(ctx.User.ID, []string{repo_router.HiddenCommentTypesSettingsKey}) if err != nil { ctx.ServerError("GetSettings", err) return } - if eventsRaw["hidden_comment_types"] != nil && eventsRaw["hidden_comment_types"].SettingValue != "" { + if eventsRaw[repo_router.HiddenCommentTypesSettingsKey] != nil && eventsRaw[repo_router.HiddenCommentTypesSettingsKey].SettingValue != "" { var ok bool - hiddenEvents, ok = new(big.Int).SetString(eventsRaw["hidden_comment_types"].SettingValue, 10) + hiddenEvents, ok = new(big.Int).SetString(eventsRaw[repo_router.HiddenCommentTypesSettingsKey].SettingValue, 10) if !ok { hiddenEvents = nil log.Error("SetString: error") @@ -448,7 +449,7 @@ func UpdateUserShownComments(ctx *context.Context) { bitset := form.Bitset() json := bitset.String() - err := user_model.SetSetting(&user_model.Setting{UserID: ctx.User.ID, SettingKey: "hidden_comment_types", SettingValue: string(json)}) + err := user_model.SetSetting(&user_model.Setting{UserID: ctx.User.ID, SettingKey: repo_router.HiddenCommentTypesSettingsKey, SettingValue: string(json)}) if err != nil { ctx.ServerError("SetSetting", err) return From 9f61e51b8c1b07fbed8ef5df5cbf28f5059d2db7 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Tue, 14 Dec 2021 19:01:03 +0100 Subject: [PATCH 15/22] fmt --- modules/indexer/code/indexer_test.go | 3 ++- modules/indexer/issues/indexer_test.go | 3 ++- modules/indexer/stats/indexer_test.go | 3 ++- services/asymkey/ssh_key_test.go | 1 + services/mailer/mailer_test.go | 1 + services/webhook/main_test.go | 3 ++- 6 files changed, 10 insertions(+), 4 deletions(-) diff --git a/modules/indexer/code/indexer_test.go b/modules/indexer/code/indexer_test.go index 98494afceb24..42f21ed0df2d 100644 --- a/modules/indexer/code/indexer_test.go +++ b/modules/indexer/code/indexer_test.go @@ -8,9 +8,10 @@ import ( "path/filepath" "testing" - _ "code.gitea.io/gitea/models" "code.gitea.io/gitea/models/unittest" + _ "code.gitea.io/gitea/models" + "github.com/stretchr/testify/assert" ) diff --git a/modules/indexer/issues/indexer_test.go b/modules/indexer/issues/indexer_test.go index 0855165556da..866e3cc7c920 100644 --- a/modules/indexer/issues/indexer_test.go +++ b/modules/indexer/issues/indexer_test.go @@ -11,11 +11,12 @@ import ( "testing" "time" - _ "code.gitea.io/gitea/models" "code.gitea.io/gitea/models/unittest" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/util" + _ "code.gitea.io/gitea/models" + "github.com/stretchr/testify/assert" "gopkg.in/ini.v1" ) diff --git a/modules/indexer/stats/indexer_test.go b/modules/indexer/stats/indexer_test.go index b32100b45829..50c6cc38e9bb 100644 --- a/modules/indexer/stats/indexer_test.go +++ b/modules/indexer/stats/indexer_test.go @@ -9,11 +9,12 @@ import ( "testing" "time" - _ "code.gitea.io/gitea/models" repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/models/unittest" "code.gitea.io/gitea/modules/setting" + _ "code.gitea.io/gitea/models" + "github.com/stretchr/testify/assert" "gopkg.in/ini.v1" ) diff --git a/services/asymkey/ssh_key_test.go b/services/asymkey/ssh_key_test.go index 0ce235f7f65c..9de6a4c11bbd 100644 --- a/services/asymkey/ssh_key_test.go +++ b/services/asymkey/ssh_key_test.go @@ -11,6 +11,7 @@ import ( "code.gitea.io/gitea/models/login" "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" + "github.com/stretchr/testify/assert" ) diff --git a/services/mailer/mailer_test.go b/services/mailer/mailer_test.go index 1739a68a6441..56f2eb52b0bc 100644 --- a/services/mailer/mailer_test.go +++ b/services/mailer/mailer_test.go @@ -9,6 +9,7 @@ import ( "time" "code.gitea.io/gitea/modules/setting" + "github.com/stretchr/testify/assert" ) diff --git a/services/webhook/main_test.go b/services/webhook/main_test.go index e64acf3b6112..a87b74e89d74 100644 --- a/services/webhook/main_test.go +++ b/services/webhook/main_test.go @@ -8,8 +8,9 @@ import ( "path/filepath" "testing" - _ "code.gitea.io/gitea/models" "code.gitea.io/gitea/models/unittest" + + _ "code.gitea.io/gitea/models" ) func TestMain(m *testing.M) { From 050af8b9a4f3760d00976a8baa7dbdf04f09f392 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Tue, 14 Dec 2021 19:05:21 +0100 Subject: [PATCH 16/22] fix lint --- routers/web/repo/issue.go | 1 + 1 file changed, 1 insertion(+) diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index 6db53031f9da..6564e421cab4 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -69,6 +69,7 @@ var ( ".github/issue_template.md", } + // HiddenCommentTypesSettingsKey is the settings key for hidden comment types HiddenCommentTypesSettingsKey = "hidden_comment_types" ) From 241def9da2f76e770688f66c54bc9523db020b79 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Sun, 26 Dec 2021 01:45:23 +0800 Subject: [PATCH 17/22] refactor --- models/issue_comment.go | 6 +- models/user/setting.go | 51 ++++++-- models/user/setting_keys.go | 6 + models/user/setting_test.go | 18 ++- modules/context/form.go | 10 +- modules/notification/mail/mail.go | 2 +- options/locale/locale_en-US.ini | 31 +++-- routers/web/repo/issue.go | 31 ++--- routers/web/user/setting/profile.go | 38 ++---- routers/web/web.go | 2 +- services/forms/user_form.go | 112 ------------------ services/forms/user_form_hidden_comments.go | 99 ++++++++++++++++ services/mailer/mail.go | 2 +- services/mailer/mail_comment.go | 2 +- services/pull/pull.go | 2 +- .../repo/issue/view_content/comments.tmpl | 2 +- templates/user/settings/appearance.tmpl | 66 +++++------ 17 files changed, 239 insertions(+), 241 deletions(-) create mode 100644 models/user/setting_keys.go create mode 100644 services/forms/user_form_hidden_comments.go diff --git a/models/issue_comment.go b/models/issue_comment.go index e54d41bf0d8b..7b706868e8fd 100644 --- a/models/issue_comment.go +++ b/models/issue_comment.go @@ -99,7 +99,7 @@ const ( // 28 merge pull request CommentTypeMergePull // 29 push to PR head branch - CommentTypePullPush + CommentTypePullRequestPush // 30 Project changed CommentTypeProject // 31 Project board changed @@ -685,7 +685,7 @@ func (c *Comment) CodeCommentURL() string { // LoadPushCommits Load push commits func (c *Comment) LoadPushCommits() (err error) { - if c.Content == "" || c.Commits != nil || c.Type != CommentTypePullPush { + if c.Content == "" || c.Commits != nil || c.Type != CommentTypePullRequestPush { return nil } @@ -1285,7 +1285,7 @@ func CreatePushPullComment(pusher *user_model.User, pr *PullRequest, oldCommitID } ops := &CreateCommentOptions{ - Type: CommentTypePullPush, + Type: CommentTypePullRequestPush, Doer: pusher, Repo: pr.BaseRepo, } diff --git a/models/user/setting.go b/models/user/setting.go index 5ff18f826540..0f679f3fb1fa 100644 --- a/models/user/setting.go +++ b/models/user/setting.go @@ -31,8 +31,8 @@ func init() { db.RegisterModel(new(Setting)) } -// GetSettings returns specific settings from user -func GetSettings(uid int64, keys []string) (map[string]*Setting, error) { +// GetUserSettings returns specific settings from user +func GetUserSettings(uid int64, keys []string) (map[string]*Setting, error) { settings := make([]*Setting, 0, len(keys)) if err := db.GetEngine(db.DefaultContext). Where("user_id=?", uid). @@ -62,21 +62,50 @@ func GetUserAllSettings(uid int64) (map[string]*Setting, error) { return settingsMap, nil } -// DeleteSetting deletes a specific setting for a user -func DeleteSetting(setting *Setting) error { - _, err := db.GetEngine(db.DefaultContext).Delete(setting) +func validateUserSettingKey(key string) error { + if strings.ToLower(key) != key { + return fmt.Errorf("setting key should be lowercase") + } + return nil +} + +// GetUserSetting gets a specific setting for a user +func GetUserSetting(userID int64, key string, def ...string) (string, error) { + if err := validateUserSettingKey(key); err != nil { + return "", err + } + setting := &Setting{UserID: userID, SettingKey: key} + has, err := db.GetEngine(db.DefaultContext).Get(setting) + if err != nil { + return "", err + } + if !has { + if len(def) == 1 { + return def[0], nil + } + return "", nil + } + return setting.SettingValue, nil +} + +// DeleteUserSetting deletes a specific setting for a user +func DeleteUserSetting(userID int64, key string) error { + if err := validateUserSettingKey(key); err != nil { + return err + } + _, err := db.GetEngine(db.DefaultContext).Delete(&Setting{UserID: userID, SettingKey: key}) return err } -// SetSetting updates a users' setting for a specific key -func SetSetting(setting *Setting) error { - if strings.ToLower(setting.SettingKey) != setting.SettingKey { - return fmt.Errorf("setting key should be lowercase") +// SetUserSetting updates a users' setting for a specific key +func SetUserSetting(userID int64, key, value string) error { + if err := validateUserSettingKey(key); err != nil { + return err } - return upsertSettingValue(setting.UserID, setting.SettingKey, setting.SettingValue) + return upsertUserSettingValue(userID, key, value) } -func upsertSettingValue(userID int64, key, value string) error { +func upsertUserSettingValue(userID int64, key, value string) error { return db.WithTx(func(ctx context.Context) error { e := db.GetEngine(ctx) diff --git a/models/user/setting_keys.go b/models/user/setting_keys.go new file mode 100644 index 000000000000..b8dca67cbb26 --- /dev/null +++ b/models/user/setting_keys.go @@ -0,0 +1,6 @@ +package user + +const ( + // SettingsKeyHiddenCommentTypes is the settings key for hidden comment types + SettingsKeyHiddenCommentTypes = "hidden_comment_types" +) diff --git a/models/user/setting_test.go b/models/user/setting_test.go index 81445a9f6f78..0b42e0fe2a1d 100644 --- a/models/user/setting_test.go +++ b/models/user/setting_test.go @@ -19,21 +19,29 @@ func TestSettings(t *testing.T) { newSetting := &Setting{UserID: 99, SettingKey: keyName, SettingValue: "Gitea User Setting Test"} // create setting - err := SetSetting(newSetting) + err := SetUserSetting(newSetting.UserID, newSetting.SettingKey, newSetting.SettingValue) assert.NoError(t, err) // test about saving unchanged values - err = SetSetting(newSetting) + err = SetUserSetting(newSetting.UserID, newSetting.SettingKey, newSetting.SettingValue) assert.NoError(t, err) // get specific setting - settings, err := GetSettings(99, []string{keyName}) + settings, err := GetUserSettings(99, []string{keyName}) assert.NoError(t, err) assert.Len(t, settings, 1) assert.EqualValues(t, newSetting.SettingValue, settings[keyName].SettingValue) + settingValue, err := GetUserSetting(99, keyName) + assert.NoError(t, err) + assert.EqualValues(t, newSetting.SettingValue, settingValue) + + settingValue, err = GetUserSetting(99, "no_such") + assert.NoError(t, err) + assert.EqualValues(t, "", settingValue) + // updated setting updatedSetting := &Setting{UserID: 99, SettingKey: keyName, SettingValue: "Updated"} - err = SetSetting(updatedSetting) + err = SetUserSetting(updatedSetting.UserID, updatedSetting.SettingKey, updatedSetting.SettingValue) assert.NoError(t, err) // get all settings @@ -43,7 +51,7 @@ func TestSettings(t *testing.T) { assert.EqualValues(t, updatedSetting.SettingValue, settings[updatedSetting.SettingKey].SettingValue) // delete setting - err = DeleteSetting(&Setting{UserID: 99, SettingKey: keyName}) + err = DeleteUserSetting(99, keyName) assert.NoError(t, err) settings, err = GetUserAllSettings(99) assert.NoError(t, err) diff --git a/modules/context/form.go b/modules/context/form.go index 8d185909737c..4f48d746b95c 100644 --- a/modules/context/form.go +++ b/modules/context/form.go @@ -46,9 +46,11 @@ func (ctx *Context) FormInt64(key string) int64 { return v } -// FormBool returns true if the value for the provided key in the form is "1" or "true" +// FormBool returns true if the value for the provided key in the form is "1", "true" or "on" func (ctx *Context) FormBool(key string) bool { - v, _ := strconv.ParseBool(ctx.Req.FormValue(key)) + s := ctx.Req.FormValue(key) + v, _ := strconv.ParseBool(s) + v = v || strings.EqualFold(s, "on") return v } @@ -59,6 +61,8 @@ func (ctx *Context) FormOptionalBool(key string) util.OptionalBool { if len(value) == 0 { return util.OptionalBoolNone } - v, _ := strconv.ParseBool(ctx.Req.FormValue(key)) + s := ctx.Req.FormValue(key) + v, _ := strconv.ParseBool(s) + v = v || strings.EqualFold(s, "on") return util.OptionalBoolOf(v) } diff --git a/modules/notification/mail/mail.go b/modules/notification/mail/mail.go index 6ad0ca0d85cf..d4ac8391039d 100644 --- a/modules/notification/mail/mail.go +++ b/modules/notification/mail/mail.go @@ -39,7 +39,7 @@ func (m *mailNotifier) NotifyCreateIssueComment(doer *user_model.User, repo *rep act = models.ActionCommentIssue } else if comment.Type == models.CommentTypeCode { act = models.ActionCommentIssue - } else if comment.Type == models.CommentTypePullPush { + } else if comment.Type == models.CommentTypePullRequestPush { act = 0 } diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index a98ba369bd8c..e98a2aea156a 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -542,22 +542,21 @@ continue = Continue cancel = Cancel language = Language ui = Theme -shown_comments = Hidden comment types -comment_type_ref = References -comment_type_changed_labels = Changed labels -comment_type_changed_milestone = Changed milestone -comment_type_changed_assignees = Changed assignees -comment_type_changed_title = Changed title -comment_type_delete_branch = Delete branch -comment_type_changed_time = Changed time -comment_type_changed_deadline = Changed deadline -comment_type_changed_dependencies = Changed dependencies -comment_type_changed_lock_status = Changed lock status -comment_type_changed_target = Changed target branch -comment_type_review_request = Review requests -comment_type_pr_push = Added commits -comment_type_changed_project = Changed project -comment_type_changed_ref = Changed reference +hidden_comment_types = Hidden comment types +comment_type_group_reference = Reference +comment_type_group_label = Label +comment_type_group_milestone = Milestone +comment_type_group_assignee = Assignee +comment_type_group_title = Title +comment_type_group_branch = Branch +comment_type_group_time_tracking = Time Tracking +comment_type_group_deadline = Deadline +comment_type_group_dependency = Dependency +comment_type_group_lock = Lock Status +comment_type_group_review_request = Review request +comment_type_group_pull_request_push = Added commits +comment_type_group_project = Project +comment_type_group_issue_ref = Issue reference saved_successfully = Your settings were saved successfully. privacy = Privacy keep_activity_private = Hide the activity from the profile page diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index 6924a7d11d75..163b8a924404 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -68,9 +68,6 @@ var ( ".github/ISSUE_TEMPLATE.md", ".github/issue_template.md", } - - // HiddenCommentTypesSettingsKey is the settings key for hidden comment types - HiddenCommentTypesSettingsKey = "hidden_comment_types" ) // MustAllowUserComment checks to make sure if an issue is locked. @@ -1476,7 +1473,7 @@ func ViewIssue(ctx *context.Context) { ctx.ServerError("LoadResolveDoer", err) return } - } else if comment.Type == models.CommentTypePullPush { + } else if comment.Type == models.CommentTypePullRequestPush { participants = addParticipant(comment.Poster, participants) if err = comment.LoadPushCommits(); err != nil { ctx.ServerError("LoadPushCommits", err) @@ -1648,29 +1645,21 @@ func ViewIssue(ctx *context.Context) { ctx.Data["HasProjectsWritePermission"] = ctx.Repo.CanWrite(unit.TypeProjects) ctx.Data["IsRepoAdmin"] = ctx.IsSigned && (ctx.Repo.IsAdmin() || ctx.User.IsAdmin) ctx.Data["LockReasons"] = setting.Repository.Issue.LockReasons - var hiddenEvents *big.Int + ctx.Data["RefEndName"] = git.RefEndName(issue.Ref) + + var hiddenCommentTypes *big.Int if ctx.IsSigned { - eventsRaw, err := user_model.GetSettings(ctx.User.ID, []string{HiddenCommentTypesSettingsKey}) + val, err := user_model.GetUserSetting(ctx.User.ID, user_model.SettingsKeyHiddenCommentTypes) if err != nil { - ctx.ServerError("GetSettings", err) + ctx.ServerError("GetUserSetting", err) return } - if eventsRaw[HiddenCommentTypesSettingsKey] != nil && eventsRaw[HiddenCommentTypesSettingsKey].SettingValue != "" { - var ok bool - hiddenEvents, ok = new(big.Int).SetString(eventsRaw[HiddenCommentTypesSettingsKey].SettingValue, 10) - if !ok { - hiddenEvents = nil - log.Error("SetString: error") - } - } + hiddenCommentTypes, _ = new(big.Int).SetString(val, 10) // we can safely ignore the failed conversion here } - ctx.Data["IsEventShown"] = func(commentType models.CommentType) bool { - if hiddenEvents == nil { - return true - } - return hiddenEvents.Bit(int(commentType)) == 0 + ctx.Data["ShouldShowCommentType"] = func(commentType models.CommentType) bool { + return hiddenCommentTypes == nil || hiddenCommentTypes.Bit(int(commentType)) == 0 } - ctx.Data["RefEndName"] = git.RefEndName(issue.Ref) + ctx.HTML(http.StatusOK, tplIssueView) } diff --git a/routers/web/user/setting/profile.go b/routers/web/user/setting/profile.go index 4df1de1d43f2..25137d2d0f3c 100644 --- a/routers/web/user/setting/profile.go +++ b/routers/web/user/setting/profile.go @@ -27,7 +27,6 @@ import ( "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/modules/web/middleware" - repo_router "code.gitea.io/gitea/routers/web/repo" "code.gitea.io/gitea/services/agit" "code.gitea.io/gitea/services/forms" user_service "code.gitea.io/gitea/services/user" @@ -360,26 +359,16 @@ func Appearance(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("settings") ctx.Data["PageIsSettingsAppearance"] = true - var hiddenEvents *big.Int - eventsRaw, err := user_model.GetSettings(ctx.User.ID, []string{repo_router.HiddenCommentTypesSettingsKey}) + var hiddenCommentTypes *big.Int + val, err := user_model.GetUserSetting(ctx.User.ID, user_model.SettingsKeyHiddenCommentTypes) if err != nil { - ctx.ServerError("GetSettings", err) + ctx.ServerError("GetUserSetting", err) return } - if eventsRaw[repo_router.HiddenCommentTypesSettingsKey] != nil && eventsRaw[repo_router.HiddenCommentTypesSettingsKey].SettingValue != "" { - var ok bool - hiddenEvents, ok = new(big.Int).SetString(eventsRaw[repo_router.HiddenCommentTypesSettingsKey].SettingValue, 10) - if !ok { - hiddenEvents = nil - log.Error("SetString: error") - } - } + hiddenCommentTypes, _ = new(big.Int).SetString(val, 10) // we can safely ignore the failed conversion here - ctx.Data["IsHidden"] = func(commentType int) bool { - if hiddenEvents == nil { - return false - } - return hiddenEvents.Bit(commentType) != 0 + ctx.Data["IsCommentTypeGroupChecked"] = func(commentTypeGroup string) bool { + return forms.IsUserHiddenCommentTypeGroupChecked(commentTypeGroup, hiddenCommentTypes) } ctx.HTML(http.StatusOK, tplSettingsAppearance) @@ -442,22 +431,15 @@ func UpdateUserLang(ctx *context.Context) { } -// UpdateUserShownComments update a user's shown comment types -func UpdateUserShownComments(ctx *context.Context) { - form := web.GetForm(ctx).(*forms.UpdateCommentTypeForm) - ctx.Data["Title"] = ctx.Tr("settings") - ctx.Data["PageIsSettingsAppearance"] = true - - bitset := form.Bitset() - json := bitset.String() - err := user_model.SetSetting(&user_model.Setting{UserID: ctx.User.ID, SettingKey: repo_router.HiddenCommentTypesSettingsKey, SettingValue: string(json)}) +// UpdateUserHiddenComments update a user's shown comment types +func UpdateUserHiddenComments(ctx *context.Context) { + err := user_model.SetUserSetting(ctx.User.ID, user_model.SettingsKeyHiddenCommentTypes, forms.UserHiddenCommentTypesFromRequest(ctx).String()) if err != nil { - ctx.ServerError("SetSetting", err) + ctx.ServerError("SetUserSetting", err) return } log.Trace("User settings updated: %s", ctx.User.Name) ctx.Flash.Success(ctx.Tr("settings.saved_successfully")) ctx.Redirect(setting.AppSubURL + "/user/settings/appearance") - } diff --git a/routers/web/web.go b/routers/web/web.go index 2a3b00722fc6..1c526200391c 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -326,7 +326,7 @@ func RegisterRoutes(m *web.Route) { m.Group("/appearance", func() { m.Get("", userSetting.Appearance) m.Post("/language", bindIgnErr(forms.UpdateLanguageForm{}), userSetting.UpdateUserLang) - m.Post("/shown_comments", bindIgnErr(forms.UpdateCommentTypeForm{}), userSetting.UpdateUserShownComments) + m.Post("/hidden_comments", userSetting.UpdateUserHiddenComments) m.Post("/theme", bindIgnErr(forms.UpdateThemeForm{}), userSetting.UpdateUIThemePost) }) m.Group("/security", func() { diff --git a/services/forms/user_form.go b/services/forms/user_form.go index 2de95491e710..88e50762f842 100644 --- a/services/forms/user_form.go +++ b/services/forms/user_form.go @@ -6,7 +6,6 @@ package forms import ( - "math/big" "mime/multipart" "net/http" "strings" @@ -268,117 +267,6 @@ func (f *UpdateLanguageForm) Validate(req *http.Request, errs binding.Errors) bi return middleware.Validate(errs, ctx.Data, f, ctx.Locale) } -// UpdateCommentTypeForm form for updating profile -type UpdateCommentTypeForm struct { - Reference bool - Labels bool - Milestone bool - Assignee bool - Title bool - Branch bool // delete branch - Time bool - Deadline bool - Dependencies bool - Lock bool - Target bool // target branch - Requests bool // review requests - Push bool // push to PR - Project bool - Ref bool // issue ref -} - -// Validate validates the fields -func (f *UpdateCommentTypeForm) Validate(req *http.Request, errs binding.Errors) binding.Errors { - ctx := context.GetContext(req) - return middleware.Validate(errs, ctx.Data, f, ctx.Locale) -} - -// IsHidden checks if the given commentType is visible -func (f *UpdateCommentTypeForm) IsHidden(commentType int) bool { - bitset := f.Bitset() - return bitset.Bit(commentType) != 0 -} - -// Bitset created the bitset to the update comment form -func (f *UpdateCommentTypeForm) Bitset() big.Int { - var bitset big.Int - types := []struct { - variable bool - types []int - }{ - { - variable: f.Reference, - types: []int{3, 4, 5, 6}, - }, - { - variable: f.Labels, - types: []int{7}, - }, - { - variable: f.Milestone, - types: []int{8}, - }, - { - variable: f.Assignee, - types: []int{9}, - }, - { - variable: f.Title, - types: []int{10}, - }, - { - variable: f.Branch, - types: []int{11}, - }, - { - variable: f.Time, - types: []int{12, 13, 14, 15, 26}, - }, - { - variable: f.Deadline, - types: []int{16, 17, 18}, - }, - { - variable: f.Dependencies, - types: []int{19, 20}, - }, - { - variable: f.Lock, - types: []int{23, 24}, - }, - { - variable: f.Target, - types: []int{25}, - }, - { - variable: f.Requests, - types: []int{27}, - }, - { - variable: f.Push, - types: []int{29}, - }, - { - variable: f.Project, - types: []int{30, 31}, - }, - { - variable: f.Ref, - types: []int{33}, - }, - } - for _, v := range types { - for _, w := range v.types { - var bitSetVar uint - if v.variable { - bitSetVar = 1 - } - bitset.SetBit(&bitset, w, bitSetVar) - } - } - return bitset -} - // Avatar types const ( AvatarLocal string = "local" diff --git a/services/forms/user_form_hidden_comments.go b/services/forms/user_form_hidden_comments.go new file mode 100644 index 000000000000..9f0b1fb9a14a --- /dev/null +++ b/services/forms/user_form_hidden_comments.go @@ -0,0 +1,99 @@ +package forms + +import ( + "math/big" + + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/context" + "code.gitea.io/gitea/modules/log" +) + +type hiddenCommentTypeGroupsType map[string][]models.CommentType + +// hiddenCommentTypeGroups maps the group names to comment types, these group names comes from the Web UI (appearance.tmpl) +var hiddenCommentTypeGroups = hiddenCommentTypeGroupsType{ + "reference": { + /*3*/ models.CommentTypeIssueRef, + /*4*/ models.CommentTypeCommitRef, + /*5*/ models.CommentTypeCommentRef, + /*6*/ models.CommentTypePullRef, + }, + "label": { + /*7*/ models.CommentTypeLabel, + }, + "milestone": { + /*8*/ models.CommentTypeMilestone, + }, + "assignee": { + /*9*/ models.CommentTypeAssignees, + }, + "title": { + /*10*/ models.CommentTypeChangeTitle, + }, + "branch": { + /*11*/ models.CommentTypeDeleteBranch, + /*25*/ models.CommentTypeChangeTargetBranch, + }, + "time_tracking": { + /*12*/ models.CommentTypeStartTracking, + /*13*/ models.CommentTypeStopTracking, + /*14*/ models.CommentTypeAddTimeManual, + /*15*/ models.CommentTypeCancelTracking, + /*26*/ models.CommentTypeDeleteTimeManual, + }, + "deadline": { + /*16*/ models.CommentTypeAddedDeadline, + /*17*/ models.CommentTypeModifiedDeadline, + /*18*/ models.CommentTypeRemovedDeadline, + }, + "dependency": { + /*19*/ models.CommentTypeAddDependency, + /*20*/ models.CommentTypeRemoveDependency, + }, + "lock": { + /*23*/ models.CommentTypeLock, + /*24*/ models.CommentTypeUnlock, + }, + "review_request": { + /*27*/ models.CommentTypeReviewRequest, + }, + "pull_request_push": { + /*29*/ models.CommentTypePullRequestPush, + }, + "project": { + /*30*/ models.CommentTypeProject, + /*31*/ models.CommentTypeProjectBoard, + }, + "issue_ref": { + /*33*/ models.CommentTypeChangeIssueRef, + }, +} + +// UserHiddenCommentTypesFromRequest parse the form to hidden comment types bitset +func UserHiddenCommentTypesFromRequest(ctx *context.Context) *big.Int { + bitset := new(big.Int) + for group, commentTypes := range hiddenCommentTypeGroups { + if ctx.FormBool(group) { + for _, commentType := range commentTypes { + bitset = bitset.SetBit(bitset, int(commentType), 1) + } + } + } + return bitset +} + +// IsUserHiddenCommentTypeGroupChecked check whether a hidden comment type group is "enabled" (checked on UI) +func IsUserHiddenCommentTypeGroupChecked(group string, hiddenCommentTypes *big.Int) (ret bool) { + commentTypes, ok := hiddenCommentTypeGroups[group] + if !ok { + log.Critical("the group map for hidden comment types is out of sync, unknown group: %v", group) + return + } + if hiddenCommentTypes == nil { + return false + } + for _, commentType := range commentTypes { + ret = ret || hiddenCommentTypes.Bit(int(commentType)) != 0 + } + return ret +} diff --git a/services/mailer/mail.go b/services/mailer/mail.go index 0a5573707396..9f9b7b2bcde7 100644 --- a/services/mailer/mail.go +++ b/services/mailer/mail.go @@ -453,7 +453,7 @@ func actionToTemplate(issue *models.Issue, actionType models.ActionType, name = "code" case models.CommentTypeAssignees: name = "assigned" - case models.CommentTypePullPush: + case models.CommentTypePullRequestPush: name = "push" default: name = "default" diff --git a/services/mailer/mail_comment.go b/services/mailer/mail_comment.go index 3662164092c4..9f44aa997436 100644 --- a/services/mailer/mail_comment.go +++ b/services/mailer/mail_comment.go @@ -19,7 +19,7 @@ func MailParticipantsComment(c *models.Comment, opType models.ActionType, issue } content := c.Content - if c.Type == models.CommentTypePullPush { + if c.Type == models.CommentTypePullRequestPush { content = "" } if err := mailIssueCommentToParticipants( diff --git a/services/pull/pull.go b/services/pull/pull.go index 9103da07f499..905158b63e83 100644 --- a/services/pull/pull.go +++ b/services/pull/pull.go @@ -100,7 +100,7 @@ func NewPullRequest(repo *repo_model.Repository, pull *models.Issue, labelIDs [] } ops := &models.CreateCommentOptions{ - Type: models.CommentTypePullPush, + Type: models.CommentTypePullRequestPush, Doer: pull.Poster, Repo: repo, Issue: pr.Issue, diff --git a/templates/repo/issue/view_content/comments.tmpl b/templates/repo/issue/view_content/comments.tmpl index f1103b3e70e1..7a55eb8b9807 100644 --- a/templates/repo/issue/view_content/comments.tmpl +++ b/templates/repo/issue/view_content/comments.tmpl @@ -1,6 +1,6 @@ {{ template "base/alert" }} {{range .Issue.Comments}} - {{if call $.IsEventShown .Type}} + {{if call $.ShouldShowCommentType .Type}} {{ $createdStr:= TimeSinceUnix .CreatedUnix $.Lang }}

- {{.i18n.Tr "settings.shown_comments"}} + {{.i18n.Tr "settings.hidden_comment_types"}}

-
+ {{.CsrfTokenHtml}}
- - + +
- - + +
- - + +
- - + +
- - + +
- - + +
- - + +
- - + +
- - + +
- - + +
- - -
-
-
-
- - + +
- - + +
- - + +
- - + +
From 7a48acdd3cd66238c20567c7d6d1976b634d2807 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Sun, 26 Dec 2021 01:59:39 +0800 Subject: [PATCH 18/22] Add a prefix for user setting key --- models/user/setting_keys.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/user/setting_keys.go b/models/user/setting_keys.go index b8dca67cbb26..d94af35b8065 100644 --- a/models/user/setting_keys.go +++ b/models/user/setting_keys.go @@ -2,5 +2,5 @@ package user const ( // SettingsKeyHiddenCommentTypes is the settings key for hidden comment types - SettingsKeyHiddenCommentTypes = "hidden_comment_types" + SettingsKeyHiddenCommentTypes = "issue.hidden_comment_types" ) From e05fb4b6ae2f3dce80eaffda2d377fa22f1bb999 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Mon, 27 Dec 2021 11:42:57 +0800 Subject: [PATCH 19/22] Add license comment --- services/forms/user_form_hidden_comments.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/services/forms/user_form_hidden_comments.go b/services/forms/user_form_hidden_comments.go index 9f0b1fb9a14a..f2d6aac1b5b0 100644 --- a/services/forms/user_form_hidden_comments.go +++ b/services/forms/user_form_hidden_comments.go @@ -1,3 +1,7 @@ +// Copyright 2021 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + package forms import ( From a9666b19780d897b9165db8d332d393a0a93f153 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Mon, 27 Dec 2021 11:58:12 +0800 Subject: [PATCH 20/22] Add license comment --- models/user/setting_keys.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/models/user/setting_keys.go b/models/user/setting_keys.go index d94af35b8065..458b78e357f0 100644 --- a/models/user/setting_keys.go +++ b/models/user/setting_keys.go @@ -1,3 +1,7 @@ +// Copyright 2021 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + package user const ( From e6b31adbaafa1ac987cea7358ea4d608bc7e1de0 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Sat, 8 Jan 2022 09:13:11 +0800 Subject: [PATCH 21/22] Update services/forms/user_form_hidden_comments.go Co-authored-by: Gusted --- services/forms/user_form_hidden_comments.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/services/forms/user_form_hidden_comments.go b/services/forms/user_form_hidden_comments.go index f2d6aac1b5b0..e0c26e8ddf88 100644 --- a/services/forms/user_form_hidden_comments.go +++ b/services/forms/user_form_hidden_comments.go @@ -97,7 +97,9 @@ func IsUserHiddenCommentTypeGroupChecked(group string, hiddenCommentTypes *big.I return false } for _, commentType := range commentTypes { - ret = ret || hiddenCommentTypes.Bit(int(commentType)) != 0 + if hiddenCommentTypes.Bit(int(commentType)) == 1 { + return true + } } - return ret + return false } From c3933baada0da878d486de20c16038fc4aaae654 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Fri, 21 Jan 2022 18:22:01 +0100 Subject: [PATCH 22/22] check len == 0 --- models/user/setting.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/models/user/setting.go b/models/user/setting.go index 0f679f3fb1fa..fbb6fbab3033 100644 --- a/models/user/setting.go +++ b/models/user/setting.go @@ -63,6 +63,9 @@ func GetUserAllSettings(uid int64) (map[string]*Setting, error) { } func validateUserSettingKey(key string) error { + if len(key) == 0 { + return fmt.Errorf("setting key must be set") + } if strings.ToLower(key) != key { return fmt.Errorf("setting key should be lowercase") }