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