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 | 230 | updateVotes: |
| 231 | 231 | function() { |
| 232 | 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 | 235 | // only update if there is a vote display |
| 236 | 236 | if (votes.size()) { | ... | ... |
app/contexts/notes/load_context.rb
| ... | ... | @@ -13,7 +13,7 @@ module Notes |
| 13 | 13 | when "issue" |
| 14 | 14 | project.issues.find(target_id).notes.inc_author.fresh.limit(20) |
| 15 | 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 | 17 | when "snippet" |
| 18 | 18 | project.snippets.find(target_id).notes.fresh |
| 19 | 19 | when "wall" | ... | ... |
app/controllers/notes_controller.rb
| ... | ... | @@ -7,6 +7,11 @@ class NotesController < ProjectResourceController |
| 7 | 7 | |
| 8 | 8 | def index |
| 9 | 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 | 15 | respond_with(@notes) |
| 11 | 16 | end |
| 12 | 17 | ... | ... |
app/helpers/notes_helper.rb
| ... | ... | @@ -7,11 +7,20 @@ module NotesHelper |
| 7 | 7 | params[:loading_new].present? |
| 8 | 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 | 25 | end |
| 17 | 26 | end | ... | ... |
app/models/note.rb
| ... | ... | @@ -49,7 +49,7 @@ class Note < ActiveRecord::Base |
| 49 | 49 | end |
| 50 | 50 | |
| 51 | 51 | def target |
| 52 | - if noteable_type == "Commit" | |
| 52 | + if commit? | |
| 53 | 53 | project.commit(noteable_id) |
| 54 | 54 | else |
| 55 | 55 | noteable |
| ... | ... | @@ -82,6 +82,10 @@ class Note < ActiveRecord::Base |
| 82 | 82 | noteable_type == "Commit" |
| 83 | 83 | end |
| 84 | 84 | |
| 85 | + def line_note? | |
| 86 | + line_code.present? | |
| 87 | + end | |
| 88 | + | |
| 85 | 89 | def commit_author |
| 86 | 90 | @commit_author ||= |
| 87 | 91 | project.users.find_by_email(target.author_email) || | ... | ... |
app/views/commits/_text_file.html.haml
| ... | ... | @@ -4,7 +4,7 @@ |
| 4 | 4 | |
| 5 | 5 | %table{class: "#{'hide' if too_big}"} |
| 6 | 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 | 8 | - if type == "match" |
| 9 | 9 | %td.old_line= "..." |
| 10 | 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 | 2 | = image_tag gravatar_icon(note.author.email), class: "avatar s32" |
| 3 | 3 | %div.note-author |
| 4 | 4 | %strong= note.author_name |
| ... | ... | @@ -6,14 +6,25 @@ |
| 6 | 6 | %cite.cgray |
| 7 | 7 | = time_ago_in_words(note.updated_at) |
| 8 | 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 | 28 | - if(note.author_id == current_user.id) || can?(current_user, :admin_note, @project) |
| 18 | 29 | = link_to [@project, note], confirm: 'Are you sure?', method: :delete, remote: true, class: "cred delete-note btn very_small" do |
| 19 | 30 | %i.icon-trash | ... | ... |