From e7626eb0e5a37a6da7c937d3f76d3fcd6b72d92c Mon Sep 17 00:00:00 2001
From: Phil Hughes <me@iamphill.com>
Date: Fri, 15 Jul 2016 15:32:56 +0100
Subject: [PATCH] Added comment & resolve button to reply form

---
 app/assets/javascripts/gl_form.js.coffee      |  1 +
 .../components/resolve_all.js.coffee          |  8 +++---
 .../line_comments/services/resolve.js.coffee  | 13 +++++++---
 .../line_comments/stores/comments.js.coffee   |  2 +-
 app/assets/javascripts/notes.js.coffee        | 26 ++++++++++++++++++-
 .../merge_requests/_discussion.html.haml      |  1 +
 app/views/projects/notes/_note.html.haml      |  2 +-
 7 files changed, 42 insertions(+), 11 deletions(-)

diff --git a/app/assets/javascripts/gl_form.js.coffee b/app/assets/javascripts/gl_form.js.coffee
index 77512d187c9..7b4d91e4401 100644
--- a/app/assets/javascripts/gl_form.js.coffee
+++ b/app/assets/javascripts/gl_form.js.coffee
@@ -24,6 +24,7 @@ class @GLForm
       @form.find('.div-dropzone').remove()
       @form.addClass('gfm-form')
       disableButtonIfEmptyField @form.find('.js-note-text'), @form.find('.js-comment-button')
+      disableButtonIfEmptyField @form.find('.js-note-text'), @form.find('.js-comment-resolve-button')
 
       # remove notify commit author checkbox for non-commit notes
       GitLab.GfmAutoComplete.setup()
diff --git a/app/assets/javascripts/line_comments/components/resolve_all.js.coffee b/app/assets/javascripts/line_comments/components/resolve_all.js.coffee
index 3f131376cf5..6d32b03d561 100644
--- a/app/assets/javascripts/line_comments/components/resolve_all.js.coffee
+++ b/app/assets/javascripts/line_comments/components/resolve_all.js.coffee
@@ -4,19 +4,17 @@
     namespace: String
   data: ->
     comments: CommentsStore.state
-    loading: false
   computed:
     allResolved: ->
       isResolved = true
       for noteId, resolved of this.comments[this.discussionId]
-        isResolved = false unless resolved
+        unless noteId is "loading"
+          isResolved = false unless resolved
       isResolved
     buttonText: ->
       if this.allResolved then "Un-resolve all" else "Resolve all"
+    loading: -> this.comments[this.discussionId].loading
   methods:
     resolve: ->
-      this.loading = true
       ResolveService
         .resolveAll(this.namespace, this.discussionId, this.allResolved)
-        .then =>
-          this.loading = false
diff --git a/app/assets/javascripts/line_comments/services/resolve.js.coffee b/app/assets/javascripts/line_comments/services/resolve.js.coffee
index 10cf79c39f8..be241166e3c 100644
--- a/app/assets/javascripts/line_comments/services/resolve.js.coffee
+++ b/app/assets/javascripts/line_comments/services/resolve.js.coffee
@@ -9,11 +9,15 @@ class ResolveService
         url: 'notes/resolve_all'
     }
 
-    Vue.http.headers.common['X-CSRF-Token'] = $.rails.csrfToken()
     @resource = Vue.resource('notes{/id}', {}, actions)
 
+  setCSRF: ->
+    Vue.http.headers.common['X-CSRF-Token'] = $.rails.csrfToken()
+
   resolve: (namespace, discussionId, noteId, resolve) ->
+    @setCSRF()
     Vue.http.options.root = "/#{namespace}"
+
     @resource
       .resolve({ id: noteId }, { discussion: discussionId, resolved: resolve })
       .then (response) ->
@@ -21,12 +25,14 @@ class ResolveService
           CommentsStore.update(discussionId, noteId, resolve)
 
   resolveAll: (namespace, discussionId, allResolve) ->
+    @setCSRF()
     Vue.http.options.root = "/#{namespace}"
 
     ids = []
     for noteId, resolved of CommentsStore.state[discussionId]
       ids.push(noteId) if resolved is allResolve
 
+    CommentsStore.state[discussionId].loading = true
     @resource
       .all({}, { ids: ids, discussion: discussionId, resolved: !allResolve })
       .then (response) ->
@@ -34,5 +40,6 @@ class ResolveService
           for noteId in ids
             CommentsStore.update(discussionId, noteId, !allResolve)
 
-$ ->
-  @ResolveService = new ResolveService()
+        CommentsStore.state[discussionId].loading = false
+
+@ResolveService = new ResolveService()
diff --git a/app/assets/javascripts/line_comments/stores/comments.js.coffee b/app/assets/javascripts/line_comments/stores/comments.js.coffee
index 1635425dbaf..9e81b650c6c 100644
--- a/app/assets/javascripts/line_comments/stores/comments.js.coffee
+++ b/app/assets/javascripts/line_comments/stores/comments.js.coffee
@@ -4,7 +4,7 @@
     this.state[discussionId][noteId]
   create: (discussionId, noteId, resolved) ->
     unless this.state[discussionId]?
-      Vue.set(this.state, discussionId, {})
+      Vue.set(this.state, discussionId, { loading: false })
 
     Vue.set(this.state[discussionId], noteId, resolved)
   update: (discussionId, noteId, resolved) ->
diff --git a/app/assets/javascripts/notes.js.coffee b/app/assets/javascripts/notes.js.coffee
index 00c24c13cb9..df7980d9c8e 100644
--- a/app/assets/javascripts/notes.js.coffee
+++ b/app/assets/javascripts/notes.js.coffee
@@ -43,6 +43,7 @@ class @Notes
     # Reopen and close actions for Issue/MR combined with note form submit
     $(document).on "click", ".js-comment-button", @updateCloseButton
     $(document).on "keyup input", ".js-note-text", @updateTargetButtons
+    $(document).on 'click', '.js-comment-resolve-button', @resolveDiscussion
 
     # remove a note (in general)
     $(document).on "click", ".js-note-delete", @removeNote
@@ -96,6 +97,7 @@ class @Notes
     $(document).off "click", ".js-note-target-close"
     $(document).off "click", ".js-note-discard"
     $(document).off "keydown", ".js-note-text"
+    $(document).off 'click', '.js-comment-resolve-button'
 
     $('.note .js-task-list-container').taskList('disable')
     $(document).off 'tasklist:changed', '.note .js-task-list-container'
@@ -327,6 +329,7 @@ class @Notes
     form.find("#note_line_code").remove()
     form.find("#note_position").remove()
     form.find("#note_type").remove()
+    form.find('.js-comment-resolve-button').remove()
 
     @parentTimeline = form.parents('.timeline')
 
@@ -370,10 +373,18 @@ class @Notes
   Adds new note to list.
   ###
   addDiscussionNote: (xhr, note, status) =>
+    $form = $(xhr.target)
     @renderDiscussionNote(note)
 
     # cleanup after successfully creating a diff/discussion note
-    @removeDiscussionNoteForm($(xhr.target))
+    @removeDiscussionNoteForm($form)
+
+    if $form.attr('data-resolve-all')?
+      namespace = $form.attr('data-namespace')
+      discussionId = $form.attr('data-discussion-id')
+
+      if ResolveService?
+        ResolveService.resolveAll(namespace, discussionId, false)
 
   ###
   Called in response to the edit note form being submitted
@@ -541,6 +552,9 @@ class @Notes
         .text(form.find('.js-close-discussion-note-form').data('cancel-text'))
     @setupNoteForm form
     form.find(".js-note-text").focus()
+    form
+      .find('.js-comment-resolve-button')
+      .attr('data-discussion-id', dataHolder.data('discussionId'))
     form
       .removeClass('js-main-target-form')
       .addClass("discussion-form js-discussion-note-form")
@@ -701,3 +715,13 @@ class @Notes
 
   updateNotesCount: (updateCount) ->
     @notesCountBadge.text(parseInt(@notesCountBadge.text()) + updateCount)
+
+  resolveDiscussion: ->
+    $this = $(this)
+    discussionId = $this.attr('data-discussion-id')
+
+    $this
+      .closest('form')
+      .attr('data-discussion-id', discussionId)
+      .attr('data-resolve-all', 'true')
+      .attr('data-namespace', $this.attr('data-namespace'))
diff --git a/app/views/projects/merge_requests/_discussion.html.haml b/app/views/projects/merge_requests/_discussion.html.haml
index 53dd300c35c..d9da553159d 100644
--- a/app/views/projects/merge_requests/_discussion.html.haml
+++ b/app/views/projects/merge_requests/_discussion.html.haml
@@ -4,5 +4,6 @@
       = link_to 'Close merge request', merge_request_path(@merge_request, merge_request: {state_event: :close }), method: :put, class: "btn btn-nr btn-comment btn-close close-mr-link js-note-target-close", title: "Close merge request", data: {original_text: "Close merge request", alternative_text: "Comment & close merge request"}
     - if @merge_request.closed?
       = link_to 'Reopen merge request', merge_request_path(@merge_request, merge_request: {state_event: :reopen }), method: :put, class: "btn btn-nr btn-comment btn-reopen reopen-mr-link js-note-target-reopen", title: "Reopen merge request", data: {original_text: "Reopen merge request", alternative_text: "Comment & reopen merge request"}
+  = submit_tag 'Comment & resolve all', class: "btn btn-nr btn-create append-right-10 comment-btn js-comment-resolve-button", data: { namespace: "#{@merge_request.project.namespace.path}/#{@merge_request.project.path}" }
 
 #notes= render "projects/notes/notes_with_form"
diff --git a/app/views/projects/notes/_note.html.haml b/app/views/projects/notes/_note.html.haml
index 456d87c6103..8ae252a9f29 100644
--- a/app/views/projects/notes/_note.html.haml
+++ b/app/views/projects/notes/_note.html.haml
@@ -20,7 +20,7 @@
           - access = note_max_access_for_user(note)
           - if access and not note.system
             %span.note-role.hidden-xs= access
-          - if !note.system && note.discussion_id && current_user
+          - if !note.system && note.new_diff_note? && current_user
             %resolve-btn{ ":namespace" => "'#{note.project.namespace.path}/#{note.project.path}'", ":discussion-id" => "'#{note.discussion_id}'", ":note-id" => note.id, ":resolved" => "false", "inline-template" => true, "v-ref:note_#{note.id}" => true }
               .note-action-button
                 = icon("spin spinner", "v-show" => "loading")
-- 
GitLab