diff --git a/models/issue_comment.go b/models/issue_comment.go index 3c9fa64bbe..ac52b80da5 100644 --- a/models/issue_comment.go +++ b/models/issue_comment.go @@ -839,12 +839,19 @@ func DeleteComment(comment *Comment) error { } func fetchCodeComments(e Engine, issue *Issue, currentUser *User) (map[string]map[int64][]*Comment, error) { - pathToLineToComment := make(map[string]map[int64][]*Comment) + return fetchCodeCommentsByReview(e, issue, currentUser, nil) +} +func fetchCodeCommentsByReview(e Engine, issue *Issue, currentUser *User, review *Review) (map[string]map[int64][]*Comment, error) { + pathToLineToComment := make(map[string]map[int64][]*Comment) + if review == nil { + review = &Review{ID: 0} + } //Find comments opts := FindCommentsOptions{ - Type: CommentTypeCode, - IssueID: issue.ID, + Type: CommentTypeCode, + IssueID: issue.ID, + ReviewID: review.ID, } var comments []*Comment if err := e.Where(opts.toConds().And(builder.Eq{"invalidated": false})). @@ -870,10 +877,12 @@ func fetchCodeComments(e Engine, issue *Issue, currentUser *User) (map[string]ma } for _, comment := range comments { if re, ok := reviews[comment.ReviewID]; ok && re != nil { - // If the review is pending only the author can see the comments - if re.Type == ReviewTypePending && - (currentUser == nil || currentUser.ID != re.ReviewerID) { - continue + // If the review is pending only the author can see the comments (except the review is set) + if review.ID == 0 { + if re.Type == ReviewTypePending && + (currentUser == nil || currentUser.ID != re.ReviewerID) { + continue + } } comment.Review = re } diff --git a/models/review.go b/models/review.go index e5d4527ea3..c02f7a5ba9 100644 --- a/models/review.go +++ b/models/review.go @@ -56,11 +56,11 @@ type Review struct { UpdatedUnix util.TimeStamp `xorm:"INDEX updated"` // CodeComments are the initial code comments of the review - CodeComments []*Comment `xorm:"-"` + CodeComments map[string]map[int64][]*Comment `xorm:"-"` } func (r *Review) loadCodeComments(e Engine) (err error) { - r.CodeComments, err = findComments(e, FindCommentsOptions{IssueID: r.IssueID, ReviewID: r.ID, Type: CommentTypeCode}) + r.CodeComments, err = fetchCodeCommentsByReview(e, r.Issue, nil, r) return } @@ -75,6 +75,9 @@ func (r *Review) loadIssue(e Engine) (err error) { } func (r *Review) loadReviewer(e Engine) (err error) { + if r.ReviewerID == 0 { + return nil + } r.Reviewer, err = getUserByID(e, r.ReviewerID) return } diff --git a/models/review_test.go b/models/review_test.go index 8a968b324c..3c0444e7a3 100644 --- a/models/review_test.go +++ b/models/review_test.go @@ -37,9 +37,10 @@ func TestReview_LoadCodeComments(t *testing.T) { assert.NoError(t, PrepareTestDatabase()) review := AssertExistsAndLoadBean(t, &Review{ID: 4}).(*Review) + assert.NoError(t, review.LoadAttributes()) assert.NoError(t, review.LoadCodeComments()) assert.Len(t, review.CodeComments, 1) - assert.Equal(t, int64(4), review.CodeComments[0].Line) + assert.Equal(t, int64(4), review.CodeComments["README.md"][int64(4)][0].Line) } func TestReviewType_Icon(t *testing.T) { diff --git a/routers/repo/issue.go b/routers/repo/issue.go index 5a276f3fea..c18f0bb352 100644 --- a/routers/repo/issue.go +++ b/routers/repo/issue.go @@ -726,6 +726,17 @@ func ViewIssue(ctx *context.Context) { ctx.ServerError("LoadReview", err) return } + if comment.Review == nil { + continue + } + if err = comment.Review.LoadAttributes(); err != nil { + ctx.ServerError("Review.LoadAttributes", err) + return + } + if err = comment.Review.LoadCodeComments(); err != nil { + ctx.ServerError("Review.LoadCodeComments", err) + return + } } } diff --git a/templates/repo/issue/view_content/comments.tmpl b/templates/repo/issue/view_content/comments.tmpl index 53ce411e1c..114a4948c2 100644 --- a/templates/repo/issue/view_content/comments.tmpl +++ b/templates/repo/issue/view_content/comments.tmpl @@ -256,6 +256,168 @@ <span class="text grey">{{.Content}}</span> </div> {{end}} + {{ range $filename, $lines := .Review.CodeComments}} + {{range $line, $comms := $lines}} + <div class="ui segments"> + <div class="ui segment"> + {{if (index $comms 0).Invalidated}} + <button class="ui icon button"> + <i class="indend icon"></i> + </button> + {{end}} + <code>{{$filename}}</code> + </div> + <div class="ui table segment"> + <div class="diff-file-box diff-box file-content tab-size-8"> + <div class="file-body file-code code-view code-diff code-diff-unified"> + <table> + <tbody> + + <tr class="tag-code nl-0 ol-0"> + + <td colspan="2" class="lines-num"> + + </td> + + <td class="lines-code lines-code-old"> + <pre><code class="wrap language-json hljs">@@ <span class="hljs-number">-27</span>,<span class="hljs-number">5</span> +<span class="hljs-number">27</span>,<span class="hljs-number">5</span> @@</code></pre> + </td> + </tr> + + + <tr class="same-code nl-1 ol-1"> + + <td class="lines-num lines-num-old"> + <span rel="diff-d9bff1704388955a5d24ad2abc8aea5a312994d0L27">27</span> + </td> + <td class="lines-num lines-num-new"> + <span rel="diff-d9bff1704388955a5d24ad2abc8aea5a312994d0R27">27</span> + <a class="ui green button add-code-comment add-code-comment-right" data-path="vendor/vendor.json" data-side="right" data-idx="27">+</a> + </td> + + <td class="lines-code "> + <pre><code class="wrap language-json hljs"> <span class="hljs-string">"revisionTime"</span>: <span class="hljs-string">"2016-08-23T15:25:51Z"</span></code></pre> + </td> + </tr> + + + <tr class="same-code nl-2 ol-2"> + + <td class="lines-num lines-num-old"> + <span rel="diff-d9bff1704388955a5d24ad2abc8aea5a312994d0L28">28</span> + </td> + <td class="lines-num lines-num-new"> + <span rel="diff-d9bff1704388955a5d24ad2abc8aea5a312994d0R28">28</span> + <a class="ui green button add-code-comment add-code-comment-right" data-path="vendor/vendor.json" data-side="right" data-idx="28">+</a> + </td> + + <td class="lines-code "> + <pre><code class="wrap language-json hljs"> }</code></pre> + </td> + </tr> + + + <tr class="same-code nl-3 ol-3"> + + <td class="lines-num lines-num-old"> + <span rel="diff-d9bff1704388955a5d24ad2abc8aea5a312994d0L29">29</span> + </td> + <td class="lines-num lines-num-new"> + <span rel="diff-d9bff1704388955a5d24ad2abc8aea5a312994d0R29">29</span> + <a class="ui green button add-code-comment add-code-comment-right" data-path="vendor/vendor.json" data-side="right" data-idx="29">+</a> + </td> + + <td class="lines-code "> + <pre><code class="wrap language-json hljs"> ],</code></pre> + </td> + </tr> + + <tr class="del-code nl-4 ol-4"> + + <td class="lines-num lines-num-old"> + <span rel="diff-d9bff1704388955a5d24ad2abc8aea5a312994d0L30">30</span> + </td> + <td class="lines-num lines-num-new"> + <span rel=""></span> + <a class="ui green button add-code-comment add-code-comment-left" data-path="vendor/vendor.json" data-side="left" data-idx="30">+</a> + </td> + + <td class="lines-code lines-code-old"> + <pre><code class="wrap language-json hljs">- <span class="hljs-string">"rootPath"</span>: <span class="hljs-string">"</span><span class="removed-code"><span class="hljs-string">github.com</span></span><span class="hljs-string">/JonasFranzDEV/drone-gitea-release"</span></code></pre> + </td> + </tr> + + + <tr class="add-code nl-5 ol-5"> + + <td class="lines-num lines-num-old"> + <span rel=""></span> + </td> + <td class="lines-num lines-num-new"> + <span rel="diff-d9bff1704388955a5d24ad2abc8aea5a312994d0R30">30</span> + <a class="ui green button add-code-comment add-code-comment-right" data-path="vendor/vendor.json" data-side="right" data-idx="30">+</a> + </td> + + <td class="lines-code "> + <pre><code class="wrap language-json hljs">+ <span class="hljs-string">"rootPath"</span>: <span class="hljs-string">"</span><span class="added-code"><span class="hljs-string">localhost:3000</span></span><span class="hljs-string">/JonasFranzDEV/drone-gitea-release"</span></code></pre> + </td> + </tr> + + <tr class="same-code nl-6 ol-6"> + + <td class="lines-num lines-num-old"> + <span rel="diff-d9bff1704388955a5d24ad2abc8aea5a312994d0L31">31</span> + </td> + <td class="lines-num lines-num-new"> + <span rel="diff-d9bff1704388955a5d24ad2abc8aea5a312994d0R31">31</span> + <a class="ui green button add-code-comment add-code-comment-right" data-path="vendor/vendor.json" data-side="right" data-idx="31">+</a> + </td> + + <td class="lines-code "> + <pre><code class="wrap language-json hljs"> }</code></pre> + </td> + </tr> + + + + + + </tbody> + </table> + </div> + </div> + </div> + <div class="ui segment"> + <div class="ui comments"> + {{range $comms}} + {{ $createdSubStr:= TimeSinceUnix .CreatedUnix $.Lang }} + <div class="comment"> + <a class="avatar"> + <img src="{{.Poster.RelAvatarLink}}"> + </a> + <div class="content"> + <a class="author" {{if gt .Poster.ID 0}}href="{{.Poster.HomeLink}}"{{end}}>{{.Poster.Name}}</a> + <div class="metadata"> + <span class="date">{{$.i18n.Tr "repo.issues.commented_at" .HashTag $createdSubStr | Safe}}</span> + </div> + <div class="text"> + <div class="render-content markdown has-emoji"> + {{if .RenderedContent}} + {{.RenderedContent|Str2html}} + {{else}} + <span class="no-content">{{$.i18n.Tr "repo.issues.no_content"}}</span> + {{end}} + </div> + <div class="raw-content hide">{{.Content}}</div> + </div> + </div> + </div> + {{end}} + </div> + </div> + </div> + {{end}} + {{end}} </div> {{end}} {{end}}