Commit 4a535e17c93dbe0ed8c309633064db6bd27e4061
Exists in
master
and in
4 other branches
Merge pull request #1630 from riyad/show-commit-notes-with-mr-notes
Mix commit notes with merge request notes on MR show page
Showing
7 changed files
with
48 additions
and
19 deletions
Show diff stats
app/assets/javascripts/notes.js
| @@ -230,7 +230,7 @@ var NoteList = { | @@ -230,7 +230,7 @@ var NoteList = { | ||
| 230 | updateVotes: | 230 | updateVotes: |
| 231 | function() { | 231 | function() { |
| 232 | var votes = $("#votes .votes"); | 232 | var votes = $("#votes .votes"); |
| 233 | - var notes = $("#notes-list, #new-notes-list").find(".note.vote"); | 233 | + var notes = $("#notes-list, #new-notes-list").find(".note .vote"); |
| 234 | 234 | ||
| 235 | // only update if there is a vote display | 235 | // only update if there is a vote display |
| 236 | if (votes.size()) { | 236 | if (votes.size()) { |
app/contexts/notes/load_context.rb
| @@ -13,7 +13,7 @@ module Notes | @@ -13,7 +13,7 @@ module Notes | ||
| 13 | when "issue" | 13 | when "issue" |
| 14 | project.issues.find(target_id).notes.inc_author.fresh.limit(20) | 14 | project.issues.find(target_id).notes.inc_author.fresh.limit(20) |
| 15 | when "merge_request" | 15 | when "merge_request" |
| 16 | - project.merge_requests.find(target_id).notes.inc_author.fresh.limit(20) | 16 | + project.merge_requests.find(target_id).mr_and_commit_notes.inc_author.fresh.limit(20) |
| 17 | when "snippet" | 17 | when "snippet" |
| 18 | project.snippets.find(target_id).notes.fresh | 18 | project.snippets.find(target_id).notes.fresh |
| 19 | when "wall" | 19 | when "wall" |
app/controllers/notes_controller.rb
| @@ -7,6 +7,11 @@ class NotesController < ProjectResourceController | @@ -7,6 +7,11 @@ class NotesController < ProjectResourceController | ||
| 7 | 7 | ||
| 8 | def index | 8 | def index |
| 9 | notes | 9 | notes |
| 10 | + if params[:target_type] == "merge_request" | ||
| 11 | + @mixed_targets = true | ||
| 12 | + @main_target_type = params[:target_type].camelize | ||
| 13 | + end | ||
| 14 | + | ||
| 10 | respond_with(@notes) | 15 | respond_with(@notes) |
| 11 | end | 16 | end |
| 12 | 17 |
app/helpers/notes_helper.rb
| @@ -7,11 +7,20 @@ module NotesHelper | @@ -7,11 +7,20 @@ module NotesHelper | ||
| 7 | params[:loading_new].present? | 7 | params[:loading_new].present? |
| 8 | end | 8 | end |
| 9 | 9 | ||
| 10 | - def note_vote_class(note) | ||
| 11 | - if note.upvote? | ||
| 12 | - "vote upvote" | ||
| 13 | - elsif note.downvote? | ||
| 14 | - "vote downvote" | ||
| 15 | - end | 10 | + # Helps to distinguish e.g. commit notes in mr notes list |
| 11 | + def note_for_main_target?(note) | ||
| 12 | + !@mixed_targets || @main_target_type == note.noteable_type | ||
| 13 | + end | ||
| 14 | + | ||
| 15 | + def link_to_commit_diff_line_note(note) | ||
| 16 | + return unless note.line_note? | ||
| 17 | + | ||
| 18 | + commit = note.target | ||
| 19 | + diff_index, diff_old_line, diff_new_line = note.line_code.split('_') | ||
| 20 | + | ||
| 21 | + link_file = commit.diffs[diff_index.to_i].new_path | ||
| 22 | + link_line = diff_new_line | ||
| 23 | + | ||
| 24 | + link_to "#{link_file}:L#{link_line}", project_commit_path(@project, commit, anchor: note.line_code) | ||
| 16 | end | 25 | end |
| 17 | end | 26 | end |
app/models/note.rb
| @@ -49,7 +49,7 @@ class Note < ActiveRecord::Base | @@ -49,7 +49,7 @@ class Note < ActiveRecord::Base | ||
| 49 | end | 49 | end |
| 50 | 50 | ||
| 51 | def target | 51 | def target |
| 52 | - if noteable_type == "Commit" | 52 | + if commit? |
| 53 | project.commit(noteable_id) | 53 | project.commit(noteable_id) |
| 54 | else | 54 | else |
| 55 | noteable | 55 | noteable |
| @@ -82,6 +82,10 @@ class Note < ActiveRecord::Base | @@ -82,6 +82,10 @@ class Note < ActiveRecord::Base | ||
| 82 | noteable_type == "Commit" | 82 | noteable_type == "Commit" |
| 83 | end | 83 | end |
| 84 | 84 | ||
| 85 | + def line_note? | ||
| 86 | + line_code.present? | ||
| 87 | + end | ||
| 88 | + | ||
| 85 | def commit_author | 89 | def commit_author |
| 86 | @commit_author ||= | 90 | @commit_author ||= |
| 87 | project.users.find_by_email(target.author_email) || | 91 | project.users.find_by_email(target.author_email) || |
app/views/commits/_text_file.html.haml
| @@ -4,7 +4,7 @@ | @@ -4,7 +4,7 @@ | ||
| 4 | 4 | ||
| 5 | %table{class: "#{'hide' if too_big}"} | 5 | %table{class: "#{'hide' if too_big}"} |
| 6 | - each_diff_line(diff.diff.lines.to_a, index) do |line, type, line_code, line_new, line_old| | 6 | - each_diff_line(diff.diff.lines.to_a, index) do |line, type, line_code, line_new, line_old| |
| 7 | - %tr.line_holder | 7 | + %tr.line_holder{ id: line_code } |
| 8 | - if type == "match" | 8 | - if type == "match" |
| 9 | %td.old_line= "..." | 9 | %td.old_line= "..." |
| 10 | %td.new_line= "..." | 10 | %td.new_line= "..." |
app/views/notes/_note.html.haml
| 1 | -%li{id: dom_id(note), class: "note #{note_vote_class(note)}"} | 1 | +%li{id: dom_id(note), class: "note"} |
| 2 | = image_tag gravatar_icon(note.author.email), class: "avatar s32" | 2 | = image_tag gravatar_icon(note.author.email), class: "avatar s32" |
| 3 | %div.note-author | 3 | %div.note-author |
| 4 | %strong= note.author_name | 4 | %strong= note.author_name |
| @@ -6,14 +6,25 @@ | @@ -6,14 +6,25 @@ | ||
| 6 | %cite.cgray | 6 | %cite.cgray |
| 7 | = time_ago_in_words(note.updated_at) | 7 | = time_ago_in_words(note.updated_at) |
| 8 | ago | 8 | ago |
| 9 | - - if note.upvote? | ||
| 10 | - %span.label.label-success | ||
| 11 | - %i.icon-thumbs-up | ||
| 12 | - \+1 | ||
| 13 | - - if note.downvote? | ||
| 14 | - %span.label.label-error | ||
| 15 | - %i.icon-thumbs-down | ||
| 16 | - \-1 | 9 | + |
| 10 | + - unless note_for_main_target?(note) | ||
| 11 | + - if note.commit? | ||
| 12 | + %span.cgray | ||
| 13 | + on #{link_to note.target.short_id, project_commit_path(@project, note.target)} | ||
| 14 | + = link_to_commit_diff_line_note(note) if note.line_note? | ||
| 15 | + | ||
| 16 | + -# only show vote if it's a note for the main target | ||
| 17 | + - if note_for_main_target?(note) | ||
| 18 | + - if note.upvote? | ||
| 19 | + %span.vote.upvote.label.label-success | ||
| 20 | + %i.icon-thumbs-up | ||
| 21 | + \+1 | ||
| 22 | + - if note.downvote? | ||
| 23 | + %span.vote.downvote.label.label-error | ||
| 24 | + %i.icon-thumbs-down | ||
| 25 | + \-1 | ||
| 26 | + | ||
| 27 | + -# remove button | ||
| 17 | - if(note.author_id == current_user.id) || can?(current_user, :admin_note, @project) | 28 | - if(note.author_id == current_user.id) || can?(current_user, :admin_note, @project) |
| 18 | = link_to [@project, note], confirm: 'Are you sure?', method: :delete, remote: true, class: "cred delete-note btn very_small" do | 29 | = link_to [@project, note], confirm: 'Are you sure?', method: :delete, remote: true, class: "cred delete-note btn very_small" do |
| 19 | %i.icon-trash | 30 | %i.icon-trash |