code.gitea.io/gitea@v1.22.3/templates/repo/issue/view_content/comments.tmpl (about)

     1  {{template "base/alert"}}
     2  {{range .Issue.Comments}}
     3  	{{if call $.ShouldShowCommentType .Type}}
     4  		{{$createdStr:= TimeSinceUnix .CreatedUnix ctx.Locale}}
     5  
     6  		<!-- 0 = COMMENT, 1 = REOPEN, 2 = CLOSE, 3 = ISSUE_REF, 4 = COMMIT_REF,
     7  		5 = COMMENT_REF, 6 = PULL_REF, 7 = COMMENT_LABEL, 8 = MILESTONE_CHANGE,
     8  		9 = ASSIGNEES_CHANGE, 10 = TITLE_CHANGE, 11 = DELETE_BRANCH, 12 = START_TRACKING,
     9  		13 = STOP_TRACKING, 14 = ADD_TIME_MANUAL, 16 = ADDED_DEADLINE, 17 = MODIFIED_DEADLINE,
    10  		18 = REMOVED_DEADLINE, 19 = ADD_DEPENDENCY, 20 = REMOVE_DEPENDENCY, 21 = CODE,
    11  		22 = REVIEW, 23 = ISSUE_LOCKED, 24 = ISSUE_UNLOCKED, 25 = TARGET_BRANCH_CHANGED,
    12  		26 = DELETE_TIME_MANUAL, 27 = REVIEW_REQUEST, 28 = MERGE_PULL_REQUEST,
    13  		29 = PULL_PUSH_EVENT, 30 = PROJECT_CHANGED, 31 = PROJECT_BOARD_CHANGED
    14  		32 = DISMISSED_REVIEW, 33 = COMMENT_TYPE_CHANGE_ISSUE_REF, 34 = PR_SCHEDULE_TO_AUTO_MERGE,
    15  		35 = CANCEL_SCHEDULED_AUTO_MERGE_PR, 36 = PIN_ISSUE, 37 = UNPIN_ISSUE -->
    16  		{{if eq .Type 0}}
    17  			<div class="timeline-item comment" id="{{.HashTag}}">
    18  			{{if .OriginalAuthor}}
    19  				<span class="timeline-avatar">
    20  					{{ctx.AvatarUtils.Avatar nil 40}}
    21  				</span>
    22  			{{else}}
    23  				<a class="timeline-avatar"{{if gt .Poster.ID 0}} href="{{.Poster.HomeLink}}"{{end}}>
    24  					{{ctx.AvatarUtils.Avatar .Poster 40}}
    25  				</a>
    26  			{{end}}
    27  				<div class="content comment-container">
    28  					<div class="ui top attached header comment-header tw-flex tw-items-center tw-justify-between" role="heading" aria-level="3">
    29  						<div class="comment-header-left tw-flex tw-items-center">
    30  							{{if .OriginalAuthor}}
    31  								<span class="text black tw-font-semibold tw-mr-1">
    32  									{{svg (MigrationIcon $.Repository.GetOriginalURLHostname)}}
    33  									{{.OriginalAuthor}}
    34  								</span>
    35  								<span class="text grey muted-links">
    36  									{{ctx.Locale.Tr "repo.issues.commented_at" .HashTag $createdStr}} {{if $.Repository.OriginalURL}}
    37  								</span>
    38  								<span class="text migrate">
    39  									({{ctx.Locale.Tr "repo.migrated_from" $.Repository.OriginalURL $.Repository.GetOriginalURLHostname}}){{end}}
    40  								</span>
    41  							{{else}}
    42  								{{if gt .Poster.ID 0}}
    43  									<a class="inline-timeline-avatar" href="{{.Poster.HomeLink}}">
    44  										{{ctx.AvatarUtils.Avatar .Poster 24}}
    45  									</a>
    46  								{{end}}
    47  								<span class="text grey muted-links">
    48  									{{template "shared/user/authorlink" .Poster}}
    49  									{{ctx.Locale.Tr "repo.issues.commented_at" .HashTag $createdStr}}
    50  								</span>
    51  							{{end}}
    52  						</div>
    53  						<div class="comment-header-right actions tw-flex tw-items-center">
    54  							{{template "repo/issue/view_content/show_role" dict "ShowRole" .ShowRole}}
    55  							{{if not $.Repository.IsArchived}}
    56  								{{template "repo/issue/view_content/add_reaction" dict "ActionURL" (printf "%s/comments/%d/reactions" $.RepoLink .ID)}}
    57  							{{end}}
    58  							{{template "repo/issue/view_content/context_menu" dict "ctxData" $ "item" . "delete" true "issue" true "diff" false "IsCommentPoster" (and $.IsSigned (eq $.SignedUserID .PosterID))}}
    59  						</div>
    60  					</div>
    61  					<div class="ui attached segment comment-body" role="article">
    62  						<div class="render-content markup" {{if or $.Permission.IsAdmin $.HasIssuesOrPullsWritePermission (and $.IsSigned (eq $.SignedUserID .PosterID))}}data-can-edit="true"{{end}}>
    63  							{{if .RenderedContent}}
    64  								{{.RenderedContent}}
    65  							{{else}}
    66  								<span class="no-content">{{ctx.Locale.Tr "repo.issues.no_content"}}</span>
    67  							{{end}}
    68  						</div>
    69  						<div id="issuecomment-{{.ID}}-raw" class="raw-content tw-hidden">{{.Content}}</div>
    70  						<div class="edit-content-zone tw-hidden" data-update-url="{{$.RepoLink}}/comments/{{.ID}}" data-context="{{$.RepoLink}}" data-attachment-url="{{$.RepoLink}}/comments/{{.ID}}/attachments"></div>
    71  						{{if .Attachments}}
    72  							{{template "repo/issue/view_content/attachments" dict "Attachments" .Attachments "RenderedContent" .RenderedContent}}
    73  						{{end}}
    74  					</div>
    75  					{{$reactions := .Reactions.GroupByType}}
    76  					{{if $reactions}}
    77  						{{template "repo/issue/view_content/reactions" dict "ActionURL" (printf "%s/comments/%d/reactions" $.RepoLink .ID) "Reactions" $reactions}}
    78  					{{end}}
    79  				</div>
    80  			</div>
    81  		{{else if eq .Type 1}}
    82  			<div class="timeline-item event" id="{{.HashTag}}">
    83  				<span class="badge tw-bg-green tw-text-white">{{svg "octicon-dot-fill"}}</span>
    84  				{{if not .OriginalAuthor}}
    85  					{{template "shared/user/avatarlink" dict "user" .Poster}}
    86  				{{end}}
    87  				<span class="text grey muted-links">
    88  					{{template "repo/issue/view_content/comments_authorlink" dict "ctxData" $ "comment" .}}
    89  					{{if .Issue.IsPull}}
    90  						{{ctx.Locale.Tr "repo.pulls.reopened_at" .EventTag $createdStr}}
    91  					{{else}}
    92  						{{ctx.Locale.Tr "repo.issues.reopened_at" .EventTag $createdStr}}
    93  					{{end}}
    94  				</span>
    95  			</div>
    96  		{{else if eq .Type 2}}
    97  			<div class="timeline-item event" id="{{.HashTag}}">
    98  				<span class="badge tw-bg-red tw-text-white">{{svg "octicon-circle-slash"}}</span>
    99  				{{if not .OriginalAuthor}}
   100  					{{template "shared/user/avatarlink" dict "user" .Poster}}
   101  				{{end}}
   102  				<span class="text grey muted-links">
   103  					{{template "repo/issue/view_content/comments_authorlink" dict "ctxData" $ "comment" .}}
   104  					{{if .Issue.IsPull}}
   105  						{{ctx.Locale.Tr "repo.pulls.closed_at" .EventTag $createdStr}}
   106  					{{else}}
   107  						{{ctx.Locale.Tr "repo.issues.closed_at" .EventTag $createdStr}}
   108  					{{end}}
   109  				</span>
   110  			</div>
   111  		{{else if eq .Type 28}}
   112  			<div class="timeline-item event" id="{{.HashTag}}">
   113  				<span class="badge tw-bg-purple tw-text-white">{{svg "octicon-git-merge"}}</span>
   114  				{{if not .OriginalAuthor}}
   115  					{{template "shared/user/avatarlink" dict "user" .Poster}}
   116  				{{end}}
   117  				<span class="text grey muted-links">
   118  					{{template "repo/issue/view_content/comments_authorlink" dict "ctxData" $ "comment" .}}
   119  					{{$link := printf "%s/commit/%s" $.Repository.Link ($.Issue.PullRequest.MergedCommitID|PathEscape)}}
   120  					{{if eq $.Issue.PullRequest.Status 3}}
   121  						{{ctx.Locale.Tr "repo.issues.comment_manually_pull_merged_at" (HTMLFormat `<a class="ui sha" href="%[1]s"><b>%[2]s</b></a>` $link (ShortSha $.Issue.PullRequest.MergedCommitID)) (HTMLFormat "<b>%[1]s</b>" $.BaseTarget) $createdStr}}
   122  					{{else}}
   123  						{{ctx.Locale.Tr "repo.issues.comment_pull_merged_at" (HTMLFormat `<a class="ui sha" href="%[1]s"><b>%[2]s</b></a>` $link (ShortSha $.Issue.PullRequest.MergedCommitID)) (HTMLFormat "<b>%[1]s</b>" $.BaseTarget) $createdStr}}
   124  					{{end}}
   125  				</span>
   126  			</div>
   127  		{{else if eq .Type 3 5 6}}
   128  			{{$refFrom:= ""}}
   129  			{{if ne .RefRepoID .Issue.RepoID}}
   130  				{{$refFrom = ctx.Locale.Tr "repo.issues.ref_from" .RefRepo.FullName}}
   131  			{{end}}
   132  			{{$refTr := "repo.issues.ref_issue_from"}}
   133  			{{if .Issue.IsPull}}
   134  				{{$refTr = "repo.issues.ref_pull_from"}}
   135  			{{else if eq .RefAction 1}}
   136  				{{$refTr = "repo.issues.ref_closing_from"}}
   137  			{{else if eq .RefAction 2}}
   138  				{{$refTr = "repo.issues.ref_reopening_from"}}
   139  			{{end}}
   140  			{{$createdStr:= TimeSinceUnix .CreatedUnix ctx.Locale}}
   141  			<div class="timeline-item event" id="{{.HashTag}}">
   142  				<span class="badge">{{svg "octicon-bookmark"}}</span>
   143  				{{template "shared/user/avatarlink" dict "user" .Poster}}
   144  				{{if eq .RefAction 3}}<del>{{end}}
   145  				<span class="text grey muted-links">
   146  					{{template "shared/user/authorlink" .Poster}}
   147  					{{ctx.Locale.Tr $refTr .EventTag $createdStr (.RefCommentLink ctx) $refFrom}}
   148  				</span>
   149  				{{if eq .RefAction 3}}</del>{{end}}
   150  
   151  				<div class="detail flex-text-block">
   152  					<span class="text grey muted-links"><a href="{{.RefIssueLink ctx}}"><b>{{.RefIssueTitle ctx}}</b> {{.RefIssueIdent ctx}}</a></span>
   153  				</div>
   154  			</div>
   155  		{{else if eq .Type 4}}
   156  			<div class="timeline-item event" id="{{.HashTag}}">
   157  				<span class="badge">{{svg "octicon-bookmark"}}</span>
   158  				{{template "shared/user/avatarlink" dict "user" .Poster}}
   159  				<span class="text grey muted-links">
   160  					{{template "shared/user/authorlink" .Poster}}
   161  					{{ctx.Locale.Tr "repo.issues.commit_ref_at" .EventTag $createdStr}}
   162  				</span>
   163  				<div class="detail flex-text-block">
   164  					{{svg "octicon-git-commit"}}
   165  					<span class="text grey muted-links">{{.Content | SanitizeHTML}}</span>
   166  				</div>
   167  			</div>
   168  		{{else if eq .Type 7}}
   169  			{{if or .AddedLabels .RemovedLabels}}
   170  				<div class="timeline-item event" id="{{.HashTag}}">
   171  					<span class="badge">{{svg "octicon-tag"}}</span>
   172  					{{template "shared/user/avatarlink" dict "user" .Poster}}
   173  					<span class="text grey muted-links">
   174  						{{template "shared/user/authorlink" .Poster}}
   175  						{{if and .AddedLabels (not .RemovedLabels)}}
   176  							{{ctx.Locale.TrN (len .AddedLabels) "repo.issues.add_label" "repo.issues.add_labels" (RenderLabels ctx ctx.Locale .AddedLabels $.RepoLink .Issue) $createdStr}}
   177  						{{else if and (not .AddedLabels) .RemovedLabels}}
   178  							{{ctx.Locale.TrN (len .RemovedLabels) "repo.issues.remove_label" "repo.issues.remove_labels" (RenderLabels ctx ctx.Locale .RemovedLabels $.RepoLink .Issue) $createdStr}}
   179  						{{else}}
   180  							{{ctx.Locale.Tr "repo.issues.add_remove_labels" (RenderLabels ctx ctx.Locale .AddedLabels $.RepoLink .Issue) (RenderLabels ctx ctx.Locale .RemovedLabels $.RepoLink .Issue) $createdStr}}
   181  						{{end}}
   182  					</span>
   183  				</div>
   184  			{{end}}
   185  		{{else if eq .Type 8}}
   186  			<div class="timeline-item event" id="{{.HashTag}}">
   187  				<span class="badge">{{svg "octicon-milestone"}}</span>
   188  				{{template "shared/user/avatarlink" dict "user" .Poster}}
   189  				<span class="text grey muted-links">
   190  					{{template "shared/user/authorlink" .Poster}}
   191  					{{if gt .OldMilestoneID 0}}{{if gt .MilestoneID 0}}{{ctx.Locale.Tr "repo.issues.change_milestone_at" .OldMilestone.Name .Milestone.Name $createdStr}}{{else}}{{ctx.Locale.Tr "repo.issues.remove_milestone_at" .OldMilestone.Name $createdStr}}{{end}}{{else if gt .MilestoneID 0}}{{ctx.Locale.Tr "repo.issues.add_milestone_at" .Milestone.Name $createdStr}}{{end}}
   192  				</span>
   193  			</div>
   194  		{{else if and (eq .Type 9) (gt .AssigneeID 0)}}
   195  			<div class="timeline-item event" id="{{.HashTag}}">
   196  				<span class="badge">{{svg "octicon-person"}}</span>
   197  				{{if .RemovedAssignee}}
   198  					{{template "shared/user/avatarlink" dict "user" .Assignee}}
   199  					<span class="text grey muted-links">
   200  						{{template "shared/user/authorlink" .Assignee}}
   201  						{{if eq .Poster.ID .Assignee.ID}}
   202  							{{ctx.Locale.Tr "repo.issues.remove_self_assignment" $createdStr}}
   203  						{{else}}
   204  							{{ctx.Locale.Tr "repo.issues.remove_assignee_at" .Poster.GetDisplayName $createdStr}}
   205  						{{end}}
   206  					</span>
   207  				{{else}}
   208  					{{template "shared/user/avatarlink" dict "user" .Assignee}}
   209  					<span class="text grey muted-links">
   210  						{{template "shared/user/authorlink" .Assignee}}
   211  						{{if eq .Poster.ID .AssigneeID}}
   212  							{{ctx.Locale.Tr "repo.issues.self_assign_at" $createdStr}}
   213  						{{else}}
   214  							{{ctx.Locale.Tr "repo.issues.add_assignee_at" .Poster.GetDisplayName $createdStr}}
   215  						{{end}}
   216  					</span>
   217  				{{end}}
   218  			</div>
   219  		{{else if eq .Type 10}}
   220  			<div class="timeline-item event" id="{{.HashTag}}">
   221  				<span class="badge">{{svg "octicon-pencil"}}</span>
   222  				{{template "shared/user/avatarlink" dict "user" .Poster}}
   223  				<span class="text grey muted-links">
   224  					{{template "shared/user/authorlink" .Poster}}
   225  					{{ctx.Locale.Tr "repo.issues.change_title_at" (.OldTitle|RenderEmoji $.Context) (.NewTitle|RenderEmoji $.Context) $createdStr}}
   226  				</span>
   227  			</div>
   228  		{{else if eq .Type 11}}
   229  			<div class="timeline-item event" id="{{.HashTag}}">
   230  				<span class="badge">{{svg "octicon-git-branch"}}</span>
   231  				{{template "shared/user/avatarlink" dict "user" .Poster}}
   232  				<span class="text grey muted-links">
   233  					{{template "shared/user/authorlink" .Poster}}
   234  					{{ctx.Locale.Tr "repo.issues.delete_branch_at" .OldRef $createdStr}}
   235  				</span>
   236  			</div>
   237  		{{else if eq .Type 12}}
   238  			<div class="timeline-item event" id="{{.HashTag}}">
   239  				<span class="badge">{{svg "octicon-clock"}}</span>
   240  				{{template "shared/user/avatarlink" dict "user" .Poster}}
   241  				<span class="text grey muted-links">
   242  					{{template "shared/user/authorlink" .Poster}}
   243  					{{ctx.Locale.Tr "repo.issues.start_tracking_history" $createdStr}}
   244  				</span>
   245  			</div>
   246  		{{else if eq .Type 13}}
   247  			<div class="timeline-item event" id="{{.HashTag}}">
   248  				<span class="badge">{{svg "octicon-clock"}}</span>
   249  				{{template "shared/user/avatarlink" dict "user" .Poster}}
   250  				<span class="text grey muted-links">
   251  					{{template "shared/user/authorlink" .Poster}}
   252  					{{ctx.Locale.Tr "repo.issues.stop_tracking_history" $createdStr}}
   253  				</span>
   254  				{{template "repo/issue/view_content/comments_delete_time" dict "ctxData" $ "comment" .}}
   255  				<div class="detail flex-text-block">
   256  					{{svg "octicon-clock"}}
   257  					{{if .RenderedContent}}
   258  						{{/* compatibility with time comments made before v1.21 */}}
   259  						<span class="text grey muted-links">{{.RenderedContent}}</span>
   260  					{{else}}
   261  						<span class="text grey muted-links">{{.Content|Sec2Time}}</span>
   262  					{{end}}
   263  				</div>
   264  			</div>
   265  		{{else if eq .Type 14}}
   266  			<div class="timeline-item event" id="{{.HashTag}}">
   267  				<span class="badge">{{svg "octicon-clock"}}</span>
   268  				{{template "shared/user/avatarlink" dict "user" .Poster}}
   269  				<span class="text grey muted-links">
   270  					{{template "shared/user/authorlink" .Poster}}
   271  					{{ctx.Locale.Tr "repo.issues.add_time_history" $createdStr}}
   272  				</span>
   273  				{{template "repo/issue/view_content/comments_delete_time" dict "ctxData" $ "comment" .}}
   274  				<div class="detail flex-text-block">
   275  					{{svg "octicon-clock"}}
   276  					{{if .RenderedContent}}
   277  						{{/* compatibility with time comments made before v1.21 */}}
   278  						<span class="text grey muted-links">{{.RenderedContent}}</span>
   279  					{{else}}
   280  						<span class="text grey muted-links">{{.Content|Sec2Time}}</span>
   281  					{{end}}
   282  				</div>
   283  			</div>
   284  		{{else if eq .Type 15}}
   285  			<div class="timeline-item event" id="{{.HashTag}}">
   286  				<span class="badge">{{svg "octicon-clock"}}</span>
   287  				{{template "shared/user/avatarlink" dict "user" .Poster}}
   288  				<span class="text grey muted-links">
   289  					{{template "shared/user/authorlink" .Poster}}
   290  					{{ctx.Locale.Tr "repo.issues.cancel_tracking_history" $createdStr}}
   291  				</span>
   292  			</div>
   293  		{{else if eq .Type 16}}
   294  			<div class="timeline-item event" id="{{.HashTag}}">
   295  				<span class="badge">{{svg "octicon-clock"}}</span>
   296  				{{template "shared/user/avatarlink" dict "user" .Poster}}
   297  				<span class="text grey muted-links">
   298  					{{template "shared/user/authorlink" .Poster}}
   299  					{{ctx.Locale.Tr "repo.issues.due_date_added" (DateTime "long" .Content) $createdStr}}
   300  				</span>
   301  			</div>
   302  		{{else if eq .Type 17}}
   303  			<div class="timeline-item event" id="{{.HashTag}}">
   304  				<span class="badge">{{svg "octicon-clock"}}</span>
   305  				{{template "shared/user/avatarlink" dict "user" .Poster}}
   306  				<span class="text grey muted-links">
   307  					{{template "shared/user/authorlink" .Poster}}
   308  					{{$parsedDeadline := StringUtils.Split .Content "|"}}
   309  					{{if eq (len $parsedDeadline) 2}}
   310  						{{$from := DateTime "long" (index $parsedDeadline 1)}}
   311  						{{$to := DateTime "long" (index $parsedDeadline 0)}}
   312  						{{ctx.Locale.Tr "repo.issues.due_date_modified" $to $from $createdStr}}
   313  					{{end}}
   314  				</span>
   315  			</div>
   316  		{{else if eq .Type 18}}
   317  			<div class="timeline-item event" id="{{.HashTag}}">
   318  				<span class="badge">{{svg "octicon-clock"}}</span>
   319  				{{template "shared/user/avatarlink" dict "user" .Poster}}
   320  				<span class="text grey muted-links">
   321  					{{template "shared/user/authorlink" .Poster}}
   322  					{{ctx.Locale.Tr "repo.issues.due_date_remove" (DateTime "long" .Content) $createdStr}}
   323  				</span>
   324  			</div>
   325  		{{else if eq .Type 19}}
   326  			<div class="timeline-item event" id="{{.HashTag}}">
   327  				<span class="badge">{{svg "octicon-package-dependents"}}</span>
   328  				{{template "shared/user/avatarlink" dict "user" .Poster}}
   329  				<span class="text grey muted-links">
   330  					{{template "shared/user/authorlink" .Poster}}
   331  					{{ctx.Locale.Tr "repo.issues.dependency.added_dependency" $createdStr}}
   332  				</span>
   333  				{{if .DependentIssue}}
   334  					<div class="detail flex-text-block">
   335  						{{svg "octicon-plus"}}
   336  						<span class="text grey muted-links">
   337  							<a href="{{.DependentIssue.Link}}">
   338  								{{if eq .DependentIssue.RepoID .Issue.RepoID}}
   339  									#{{.DependentIssue.Index}} {{.DependentIssue.Title}}
   340  								{{else}}
   341  									{{.DependentIssue.Repo.FullName}}#{{.DependentIssue.Index}} - {{.DependentIssue.Title}}
   342  								{{end}}
   343  							</a>
   344  						</span>
   345  					</div>
   346  				{{end}}
   347  			</div>
   348  		{{else if eq .Type 20}}
   349  			<div class="timeline-item event" id="{{.HashTag}}">
   350  				<span class="badge">{{svg "octicon-package-dependents"}}</span>
   351  				{{template "shared/user/avatarlink" dict "user" .Poster}}
   352  				<span class="text grey muted-links">
   353  					{{template "shared/user/authorlink" .Poster}}
   354  					{{ctx.Locale.Tr "repo.issues.dependency.removed_dependency" $createdStr}}
   355  				</span>
   356  				{{if .DependentIssue}}
   357  					<div class="detail flex-text-block">
   358  						{{svg "octicon-trash"}}
   359  						<span class="text grey muted-links">
   360  							<a href="{{.DependentIssue.Link}}">
   361  								{{if eq .DependentIssue.RepoID .Issue.RepoID}}
   362  									#{{.DependentIssue.Index}} {{.DependentIssue.Title}}
   363  								{{else}}
   364  									{{.DependentIssue.Repo.FullName}}#{{.DependentIssue.Index}} - {{.DependentIssue.Title}}
   365  								{{end}}
   366  							</a>
   367  						</span>
   368  					</div>
   369  				{{end}}
   370  			</div>
   371  		{{else if eq .Type 22}}
   372  			<div class="timeline-item-group" id="{{.HashTag}}">
   373  				<div class="timeline-item event">
   374  					{{$reviewType := -1}}
   375  					{{if .Review}}{{$reviewType = .Review.Type}}{{end}}
   376  					{{if not .OriginalAuthor}}
   377  					{{/* Some timeline avatars need a offset to correctly align with their speech bubble.
   378  						The condition depends on whether the comment has contents/attachments or reviews */}}
   379  					<a class="timeline-avatar{{if or .Content .Attachments (and .Review .Review.CodeComments)}} timeline-avatar-offset{{end}}"{{if gt .Poster.ID 0}} href="{{.Poster.HomeLink}}"{{end}}>
   380  						{{ctx.AvatarUtils.Avatar .Poster 40}}
   381  					</a>
   382  					{{end}}
   383  					<span class="badge{{if eq $reviewType 1}} tw-bg-green tw-text-white{{else if eq $reviewType 3}} tw-bg-red tw-text-white{{end}}">
   384  						{{if .Review}}{{svg (printf "octicon-%s" .Review.Type.Icon)}}{{end}}
   385  					</span>
   386  					<span class="text grey muted-links">
   387  						{{template "repo/issue/view_content/comments_authorlink" dict "ctxData" $ "comment" .}}
   388  						{{if eq $reviewType 1}}
   389  							{{ctx.Locale.Tr "repo.issues.review.approve" $createdStr}}
   390  						{{else if eq $reviewType 2}}
   391  							{{ctx.Locale.Tr "repo.issues.review.comment" $createdStr}}
   392  						{{else if eq $reviewType 3}}
   393  							{{ctx.Locale.Tr "repo.issues.review.reject" $createdStr}}
   394  						{{else}}
   395  							{{ctx.Locale.Tr "repo.issues.review.comment" $createdStr}}
   396  						{{end}}
   397  						{{if and .Review .Review.Dismissed}}
   398  							<div class="ui small label">{{ctx.Locale.Tr "repo.issues.review.dismissed_label"}}</div>
   399  						{{end}}
   400  					</span>
   401  				</div>
   402  				{{if or .Content .Attachments}}
   403  				<div class="timeline-item comment">
   404  					<div class="content comment-container">
   405  						<div class="ui top attached header comment-header tw-flex tw-items-center tw-justify-between">
   406  							<div class="comment-header-left tw-flex tw-items-center">
   407  								{{if gt .Poster.ID 0}}
   408  									<a class="inline-timeline-avatar" href="{{.Poster.HomeLink}}">
   409  										{{ctx.AvatarUtils.Avatar .Poster 24}}
   410  									</a>
   411  								{{end}}
   412  								<span class="text grey muted-links">
   413  									{{if .OriginalAuthor}}
   414  										<span class="text black tw-font-semibold">
   415  											{{svg (MigrationIcon $.Repository.GetOriginalURLHostname)}}
   416  											{{.OriginalAuthor}}
   417  										</span>
   418  										<span class="text grey muted-links"> {{if $.Repository.OriginalURL}}</span>
   419  										<span class="text migrate">({{ctx.Locale.Tr "repo.migrated_from" $.Repository.OriginalURL $.Repository.GetOriginalURLHostname}}){{end}}</span>
   420  									{{else}}
   421  										{{template "shared/user/authorlink" .Poster}}
   422  									{{end}}
   423  
   424  									{{ctx.Locale.Tr "repo.issues.review.left_comment"}}
   425  								</span>
   426  							</div>
   427  							<div class="comment-header-right actions tw-flex tw-items-center">
   428  								{{template "repo/issue/view_content/show_role" dict "ShowRole" .ShowRole}}
   429  								{{if not $.Repository.IsArchived}}
   430  									{{template "repo/issue/view_content/add_reaction" dict "ActionURL" (printf "%s/comments/%d/reactions" $.RepoLink .ID)}}
   431  									{{template "repo/issue/view_content/context_menu" dict "ctxData" $ "item" . "delete" false "issue" true "diff" false "IsCommentPoster" (and $.IsSigned (eq $.SignedUserID .PosterID))}}
   432  								{{end}}
   433  							</div>
   434  						</div>
   435  						<div class="ui attached segment comment-body">
   436  							<div class="render-content markup" {{if or $.Permission.IsAdmin $.HasIssuesOrPullsWritePermission (and $.IsSigned (eq $.SignedUserID .PosterID))}}data-can-edit="true"{{end}}>
   437  								{{if .RenderedContent}}
   438  									{{.RenderedContent}}
   439  								{{else}}
   440  									<span class="no-content">{{ctx.Locale.Tr "repo.issues.no_content"}}</span>
   441  								{{end}}
   442  							</div>
   443  							<div id="issuecomment-{{.ID}}-raw" class="raw-content tw-hidden">{{.Content}}</div>
   444  							<div class="edit-content-zone tw-hidden" data-update-url="{{$.RepoLink}}/comments/{{.ID}}" data-context="{{$.RepoLink}}" data-attachment-url="{{$.RepoLink}}/comments/{{.ID}}/attachments"></div>
   445  							{{if .Attachments}}
   446  								{{template "repo/issue/view_content/attachments" dict "Attachments" .Attachments "RenderedContent" .RenderedContent}}
   447  							{{end}}
   448  						</div>
   449  						{{$reactions := .Reactions.GroupByType}}
   450  						{{if $reactions}}
   451  							{{template "repo/issue/view_content/reactions" dict "ActionURL" (printf "%s/comments/%d/reactions" $.RepoLink .ID) "Reactions" $reactions}}
   452  						{{end}}
   453  					</div>
   454  				</div>
   455  				{{end}}
   456  
   457  				{{if and .Review .Review.CodeComments}}
   458  				<div class="timeline-item event">
   459  					{{range $filename, $lines := .Review.CodeComments}}
   460  						{{range $line, $comms := $lines}}
   461  							{{template "repo/issue/view_content/conversation" dict "." $ "comments" $comms}}
   462  						{{end}}
   463  					{{end}}
   464  				</div>
   465  				{{end}}
   466  			</div>
   467  		{{else if eq .Type 23}}
   468  			<div class="timeline-item event" id="{{.HashTag}}">
   469  				<span class="badge">{{svg "octicon-lock"}}</span>
   470  				{{template "shared/user/avatarlink" dict "user" .Poster}}
   471  				{{if .Content}}
   472  					<span class="text grey muted-links">
   473  						{{template "shared/user/authorlink" .Poster}}
   474  						{{ctx.Locale.Tr "repo.issues.lock_with_reason" .Content $createdStr}}
   475  					</span>
   476  				{{else}}
   477  					<span class="text grey muted-links">
   478  						{{template "shared/user/authorlink" .Poster}}
   479  						{{ctx.Locale.Tr "repo.issues.lock_no_reason" $createdStr}}
   480  					</span>
   481  				{{end}}
   482  			</div>
   483  		{{else if eq .Type 24}}
   484  			<div class="timeline-item event" id="{{.HashTag}}">
   485  				<span class="badge">{{svg "octicon-key"}}</span>
   486  				{{template "shared/user/avatarlink" dict "user" .Poster}}
   487  				<span class="text grey muted-links">
   488  					{{template "shared/user/authorlink" .Poster}}
   489  					{{ctx.Locale.Tr "repo.issues.unlock_comment" $createdStr}}
   490  				</span>
   491  			</div>
   492  		{{else if eq .Type 25}}
   493  			<div class="timeline-item event">
   494  				<span class="badge">{{svg "octicon-git-branch"}}</span>
   495  				{{if not .OriginalAuthor}}
   496  					{{template "shared/user/avatarlink" dict "user" .Poster}}
   497  				{{end}}
   498  				<span class="text grey muted-links">
   499  					{{template "repo/issue/view_content/comments_authorlink" dict "ctxData" $ "comment" .}}
   500  					{{ctx.Locale.Tr "repo.pulls.change_target_branch_at" .OldRef .NewRef $createdStr}}
   501  				</span>
   502  			</div>
   503  		{{else if eq .Type 26}}
   504  			<div class="timeline-item event" id="{{.HashTag}}">
   505  				<span class="badge">{{svg "octicon-clock"}}</span>
   506  				{{template "shared/user/avatarlink" dict "user" .Poster}}
   507  				<span class="text grey muted-links">
   508  					{{template "shared/user/authorlink" .Poster}}
   509  
   510  					{{ctx.Locale.Tr "repo.issues.del_time_history" $createdStr}}
   511  				</span>
   512  				<div class="detail flex-text-block">
   513  					{{svg "octicon-clock"}}
   514  					{{if .RenderedContent}}
   515  						{{/* compatibility with time comments made before v1.21 */}}
   516  						<span class="text grey muted-links">{{.RenderedContent}}</span>
   517  					{{else}}
   518  						<span class="text grey muted-links">- {{.Content|Sec2Time}}</span>
   519  					{{end}}
   520  				</div>
   521  			</div>
   522  		{{else if eq .Type 27}}
   523  			<div class="timeline-item event" id="{{.HashTag}}">
   524  				<span class="badge">{{svg "octicon-eye"}}</span>
   525  				{{template "shared/user/avatarlink" dict "user" .Poster}}
   526  				<span class="text grey muted-links">
   527  					{{template "shared/user/authorlink" .Poster}}
   528  					{{if (gt .AssigneeID 0)}}
   529  						{{if .RemovedAssignee}}
   530  							{{if eq .PosterID .AssigneeID}}
   531  								{{ctx.Locale.Tr "repo.issues.review.remove_review_request_self" $createdStr}}
   532  							{{else}}
   533  								{{ctx.Locale.Tr "repo.issues.review.remove_review_request" .Assignee.GetDisplayName $createdStr}}
   534  							{{end}}
   535  						{{else}}
   536  							{{ctx.Locale.Tr "repo.issues.review.add_review_request" .Assignee.GetDisplayName $createdStr}}
   537  						{{end}}
   538  					{{else}}
   539  						<!-- If the assigned team is deleted, just displaying "Ghost Team" in the comment -->
   540  						{{$teamName := "Ghost Team"}}
   541  						{{if .AssigneeTeam}}
   542  							{{$teamName = .AssigneeTeam.Name}}
   543  						{{end}}
   544  						{{if .RemovedAssignee}}
   545  							{{ctx.Locale.Tr "repo.issues.review.remove_review_request" $teamName $createdStr}}
   546  						{{else}}
   547  							{{ctx.Locale.Tr "repo.issues.review.add_review_request" $teamName $createdStr}}
   548  						{{end}}
   549  					{{end}}
   550  				</span>
   551  			</div>
   552  		{{else if and (eq .Type 29) (or (gt .CommitsNum 0) .IsForcePush)}}
   553  			<!-- If PR is closed, the comments whose type is CommentTypePullRequestPush(29) after latestCloseCommentID won't be rendered. //-->
   554  			{{if and .Issue.IsClosed (gt .ID $.LatestCloseCommentID)}}
   555  				{{continue}}
   556  			{{end}}
   557  			<div class="timeline-item event" id="{{.HashTag}}">
   558  				<span class="badge">{{svg "octicon-repo-push"}}</span>
   559  				<span class="text grey muted-links">
   560  					{{template "shared/user/authorlink" .Poster}}
   561  					{{if .IsForcePush}}
   562  						{{ctx.Locale.Tr "repo.issues.force_push_codes" $.Issue.PullRequest.HeadBranch (ShortSha .OldCommit) ($.Issue.Repo.CommitLink .OldCommit) (ShortSha .NewCommit) ($.Issue.Repo.CommitLink .NewCommit) $createdStr}}
   563  					{{else}}
   564  						{{ctx.Locale.TrN (len .Commits) "repo.issues.push_commit_1" "repo.issues.push_commits_n" (len .Commits) $createdStr}}
   565  					{{end}}
   566  				</span>
   567  				{{if and .IsForcePush $.Issue.PullRequest.BaseRepo.Name}}
   568  				<span class="tw-float-right comparebox">
   569  					<a href="{{$.Issue.PullRequest.BaseRepo.Link}}/compare/{{PathEscape .OldCommit}}..{{PathEscape .NewCommit}}" rel="nofollow" class="ui compare label">{{ctx.Locale.Tr "repo.issues.force_push_compare"}}</a>
   570  				</span>
   571  				{{end}}
   572  			</div>
   573  			{{if not .IsForcePush}}
   574  				{{template "repo/commits_list_small" dict "comment" . "root" $}}
   575  			{{end}}
   576  		{{else if eq .Type 30}}
   577  			{{if not $.UnitProjectsGlobalDisabled}}
   578  			<div class="timeline-item event" id="{{.HashTag}}">
   579  				<span class="badge">{{svg "octicon-project"}}</span>
   580  				{{template "shared/user/avatarlink" dict "user" .Poster}}
   581  				<span class="text grey muted-links">
   582  					{{template "shared/user/authorlink" .Poster}}
   583  					{{$oldProjectDisplayHtml := "Unknown Project"}}
   584  					{{if .OldProject}}
   585  						{{$tooltip := ctx.Locale.Tr "projects.deleted.display_name"}}
   586  						{{if not .OldProject.IsGhost}}
   587  							{{$tooltip = ctx.Locale.Tr (printf "projects.type-%d.display_name" .OldProject.Type)}}
   588  						{{end}}
   589  						{{$oldProjectDisplayHtml = HTMLFormat `<span data-tooltip-content="%s">%s</span>` $tooltip .OldProject.Title}}
   590  					{{end}}
   591  					{{$newProjectDisplayHtml := "Unknown Project"}}
   592  					{{if .Project}}
   593  						{{$tooltip := ctx.Locale.Tr "projects.deleted.display_name"}}
   594  						{{if not .Project.IsGhost}}
   595  							{{$tooltip = ctx.Locale.Tr (printf "projects.type-%d.display_name" .Project.Type)}}
   596  						{{end}}
   597  						{{$newProjectDisplayHtml = HTMLFormat `<span data-tooltip-content="%s">%s</span>` $tooltip .Project.Title}}
   598  					{{end}}
   599  					{{if and (gt .OldProjectID 0) (gt .ProjectID 0)}}
   600  						{{ctx.Locale.Tr "repo.issues.change_project_at" $oldProjectDisplayHtml $newProjectDisplayHtml $createdStr}}
   601  					{{else if gt .OldProjectID 0}}
   602  						{{ctx.Locale.Tr "repo.issues.remove_project_at" $oldProjectDisplayHtml $createdStr}}
   603  					{{else if gt .ProjectID 0}}
   604  						{{ctx.Locale.Tr "repo.issues.add_project_at" $newProjectDisplayHtml $createdStr}}
   605  					{{end}}
   606  				</span>
   607  			</div>
   608  			{{end}}
   609  		{{else if eq .Type 32}}
   610  			<div class="timeline-item-group">
   611  				<div class="timeline-item event" id="{{.HashTag}}">
   612  					<a class="timeline-avatar"{{if gt .Poster.ID 0}} href="{{.Poster.HomeLink}}"{{end}}>
   613  						<img src="{{.Poster.AvatarLink $.Context}}" width="40" height="40">
   614  					</a>
   615  					<span class="badge grey">{{svg "octicon-x" 16}}</span>
   616  					<span class="text grey muted-links">
   617  						{{template "shared/user/authorlink" .Poster}}
   618  						{{$reviewerName := ""}}
   619  						{{if .Review}}
   620  							{{if eq .Review.OriginalAuthor ""}}
   621  								{{$reviewerName = .Review.Reviewer.Name}}
   622  							{{else}}
   623  								{{$reviewerName = .Review.OriginalAuthor}}
   624  							{{end}}
   625  						{{end}}
   626  						{{ctx.Locale.Tr "repo.issues.review.dismissed" $reviewerName $createdStr}}
   627  					</span>
   628  				</div>
   629  				{{if .Content}}
   630  					<div class="timeline-item comment">
   631  						<div class="content">
   632  							<div class="ui top attached header comment-header-left tw-flex tw-items-center arrow-top">
   633  								{{if gt .Poster.ID 0}}
   634  									<a class="inline-timeline-avatar" href="{{.Poster.HomeLink}}">
   635  										{{ctx.AvatarUtils.Avatar .Poster 24}}
   636  									</a>
   637  								{{end}}
   638  								<span class="text grey muted-links">
   639  									{{ctx.Locale.Tr "action.review_dismissed_reason"}}
   640  								</span>
   641  							</div>
   642  							<div class="ui attached segment">
   643  								<div class="render-content markup">
   644  									{{if .RenderedContent}}
   645  										{{.RenderedContent}}
   646  									{{else}}
   647  										<span class="no-content">{{ctx.Locale.Tr "repo.issues.no_content"}}</span>
   648  									{{end}}
   649  								</div>
   650  							</div>
   651  						</div>
   652  					</div>
   653  				{{end}}
   654  			</div>
   655  		{{else if eq .Type 33}}
   656  			<div class="timeline-item event" id="{{.HashTag}}">
   657  				<span class="badge">{{svg "octicon-git-branch"}}</span>
   658  				{{template "shared/user/avatarlink" dict "user" .Poster}}
   659  				<span class="text grey muted-links">
   660  					{{template "shared/user/authorlink" .Poster}}
   661  					{{if and .OldRef .NewRef}}
   662  						{{ctx.Locale.Tr "repo.issues.change_ref_at" .OldRef .NewRef $createdStr}}
   663  					{{else if .OldRef}}
   664  						{{ctx.Locale.Tr "repo.issues.remove_ref_at" .OldRef $createdStr}}
   665  					{{else}}
   666  						{{ctx.Locale.Tr "repo.issues.add_ref_at" .NewRef $createdStr}}
   667  					{{end}}
   668  				</span>
   669  			</div>
   670  		{{else if or (eq .Type 34) (eq .Type 35)}}
   671  			<div class="timeline-item event" id="{{.HashTag}}">
   672  				<span class="badge">{{svg "octicon-git-merge" 16}}</span>
   673  				<span class="text grey muted-links">
   674  					{{template "repo/issue/view_content/comments_authorlink" dict "ctxData" $ "comment" .}}
   675  					{{if eq .Type 34}}{{ctx.Locale.Tr "repo.pulls.auto_merge_newly_scheduled_comment" $createdStr}}
   676  					{{else}}{{ctx.Locale.Tr "repo.pulls.auto_merge_canceled_schedule_comment" $createdStr}}{{end}}
   677  				</span>
   678  			</div>
   679  		{{else if or (eq .Type 36) (eq .Type 37)}}
   680  			<div class="timeline-item event" id="{{.HashTag}}">
   681  				<span class="badge">{{svg "octicon-pin" 16}}</span>
   682  				{{template "shared/user/avatarlink" dict "user" .Poster}}
   683  				<span class="text grey muted-links">
   684  					{{template "shared/user/authorlink" .Poster}}
   685  					{{if eq .Type 36}}{{ctx.Locale.Tr "repo.issues.pin_comment" $createdStr}}
   686  					{{else}}{{ctx.Locale.Tr "repo.issues.unpin_comment" $createdStr}}{{end}}
   687  				</span>
   688  			</div>
   689  		{{end}}
   690  	{{end}}
   691  {{end}}