diff --git a/app/assets/javascripts/notes.js b/app/assets/javascripts/notes.js index e1ad1d2f9e8c04d941863efa5854ae59c1be6cba..558643d504db3710cd5a13706bfcfe2ba5101120 100644 --- a/app/assets/javascripts/notes.js +++ b/app/assets/javascripts/notes.js @@ -230,7 +230,7 @@ var NoteList = { updateVotes: function() { var votes = $("#votes .votes"); - var notes = $("#notes-list, #new-notes-list").find(".note.vote"); + var notes = $("#notes-list, #new-notes-list").find(".note .vote"); // only update if there is a vote display if (votes.size()) { diff --git a/app/contexts/notes/load_context.rb b/app/contexts/notes/load_context.rb index f92a780187d8245e0c19c33779cb4787dfd0ac16..f3949149a06cc5317a062e5c3c0cfee947ae095f 100644 --- a/app/contexts/notes/load_context.rb +++ b/app/contexts/notes/load_context.rb @@ -13,7 +13,7 @@ module Notes when "issue" project.issues.find(target_id).notes.inc_author.fresh.limit(20) when "merge_request" - project.merge_requests.find(target_id).notes.inc_author.fresh.limit(20) + project.merge_requests.find(target_id).mr_and_commit_notes.inc_author.fresh.limit(20) when "snippet" project.snippets.find(target_id).notes.fresh when "wall" diff --git a/app/controllers/notes_controller.rb b/app/controllers/notes_controller.rb index 7f5f5cd28696d41c794e90dc878b4785e70f1077..d794f368f577b29f7ecc8863e9ab02a5258c8876 100644 --- a/app/controllers/notes_controller.rb +++ b/app/controllers/notes_controller.rb @@ -7,6 +7,11 @@ class NotesController < ProjectResourceController def index notes + if params[:target_type] == "merge_request" + @mixed_targets = true + @main_target_type = params[:target_type].camelize + end + respond_with(@notes) end diff --git a/app/helpers/notes_helper.rb b/app/helpers/notes_helper.rb index 65389e383d93ae61c97802d6ebbe93171993dcab..99db8b6f6b7f80fe288a0574570889182af62165 100644 --- a/app/helpers/notes_helper.rb +++ b/app/helpers/notes_helper.rb @@ -7,11 +7,20 @@ module NotesHelper params[:loading_new].present? end - def note_vote_class(note) - if note.upvote? - "vote upvote" - elsif note.downvote? - "vote downvote" - end + # Helps to distinguish e.g. commit notes in mr notes list + def note_for_main_target?(note) + !@mixed_targets || @main_target_type == note.noteable_type + end + + def link_to_commit_diff_line_note(note) + return unless note.line_note? + + commit = note.target + diff_index, diff_old_line, diff_new_line = note.line_code.split('_') + + link_file = commit.diffs[diff_index.to_i].new_path + link_line = diff_new_line + + link_to "#{link_file}:L#{link_line}", project_commit_path(@project, commit, anchor: note.line_code) end end diff --git a/app/models/note.rb b/app/models/note.rb index 65b20fe0b11c3e5ac20efc2308e3e786ad7aeb54..ae51e4866759c0456a3814554c525cc2fe184f4b 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -49,7 +49,7 @@ class Note < ActiveRecord::Base end def target - if noteable_type == "Commit" + if commit? project.commit(noteable_id) else noteable @@ -82,6 +82,10 @@ class Note < ActiveRecord::Base noteable_type == "Commit" end + def line_note? + line_code.present? + end + def commit_author @commit_author ||= project.users.find_by_email(target.author_email) || diff --git a/app/views/commits/_text_file.html.haml b/app/views/commits/_text_file.html.haml index 9f5b5345d5f76a735b335a283c5d53d0f3910b97..02117386d71c93a024b3c438771e0144dcfe5236 100644 --- a/app/views/commits/_text_file.html.haml +++ b/app/views/commits/_text_file.html.haml @@ -4,7 +4,7 @@ %table{class: "#{'hide' if too_big}"} - each_diff_line(diff.diff.lines.to_a, index) do |line, type, line_code, line_new, line_old| - %tr.line_holder + %tr.line_holder{ id: line_code } - if type == "match" %td.old_line= "..." %td.new_line= "..." diff --git a/app/views/notes/_note.html.haml b/app/views/notes/_note.html.haml index 5234e55dcd098754717f22ded7e2a8f5e38bf5cd..0901e4b8302df1cb26072881da6113935eed5ddd 100644 --- a/app/views/notes/_note.html.haml +++ b/app/views/notes/_note.html.haml @@ -1,4 +1,4 @@ -%li{id: dom_id(note), class: "note #{note_vote_class(note)}"} +%li{id: dom_id(note), class: "note"} = image_tag gravatar_icon(note.author.email), class: "avatar s32" %div.note-author %strong= note.author_name @@ -6,14 +6,25 @@ %cite.cgray = time_ago_in_words(note.updated_at) ago - - if note.upvote? - %span.label.label-success - %i.icon-thumbs-up - \+1 - - if note.downvote? - %span.label.label-error - %i.icon-thumbs-down - \-1 + + - unless note_for_main_target?(note) + - if note.commit? + %span.cgray + on #{link_to note.target.short_id, project_commit_path(@project, note.target)} + = link_to_commit_diff_line_note(note) if note.line_note? + + -# only show vote if it's a note for the main target + - if note_for_main_target?(note) + - if note.upvote? + %span.vote.upvote.label.label-success + %i.icon-thumbs-up + \+1 + - if note.downvote? + %span.vote.downvote.label.label-error + %i.icon-thumbs-down + \-1 + + -# remove button - if(note.author_id == current_user.id) || can?(current_user, :admin_note, @project) = link_to [@project, note], confirm: 'Are you sure?', method: :delete, remote: true, class: "cred delete-note btn very_small" do %i.icon-trash