diff --git a/app/controllers/notes_controller.rb b/app/controllers/notes_controller.rb index d794f368f57..79e8bcc7866 100644 --- a/app/controllers/notes_controller.rb +++ b/app/controllers/notes_controller.rb @@ -6,10 +6,15 @@ class NotesController < ProjectResourceController respond_to :js def index - notes + @notes = Notes::LoadContext.new(project, current_user, params).execute + if params[:target_type] == "merge_request" - @mixed_targets = true + @mixed_targets = true @main_target_type = params[:target_type].camelize + @discussions = discussions_from_notes + @has_diff = true + elsif params[:target_type] == "commit" + @has_diff = true end respond_with(@notes) @@ -40,7 +45,33 @@ class NotesController < ProjectResourceController protected - def notes - @notes = Notes::LoadContext.new(project, current_user, params).execute + def discussion_notes_for(note) + @notes.select do |other_note| + note.discussion_id == other_note.discussion_id + end + end + + def discussions_from_notes + discussion_ids = [] + discussions = [] + + @notes.each do |note| + next if discussion_ids.include?(note.discussion_id) + + # don't group notes for the main target + if for_main_target?(note) + discussions << [note] + else + discussions << discussion_notes_for(note) + discussion_ids << note.discussion_id + end + end + + discussions + end + + # Helps to distinguish e.g. commit notes in mr notes list + def for_main_target?(note) + !@mixed_targets || (@main_target_type == note.noteable_type && !note.for_diff_line?) end end