From 41bba5dda3e8cd01c0dad2675557321849b73be6 Mon Sep 17 00:00:00 2001 From: Mantas Masalskis Date: Wed, 15 Jul 2020 13:51:13 +0200 Subject: [PATCH] Fixes #2985 - Adding a note during bulk operation only works for one ticket --- .../app/controllers/ticket_overview.coffee | 58 +++---- spec/system/ticket/view_spec.rb | 153 ++++++++++-------- 2 files changed, 121 insertions(+), 90 deletions(-) diff --git a/app/assets/javascripts/app/controllers/ticket_overview.coffee b/app/assets/javascripts/app/controllers/ticket_overview.coffee index 1fa7f54cd..574ad965a 100644 --- a/app/assets/javascripts/app/controllers/ticket_overview.coffee +++ b/app/assets/javascripts/app/controllers/ticket_overview.coffee @@ -1575,33 +1575,7 @@ class BulkForm extends App.Controller if _.isEmpty(ticket.title) ticket.title = '-' - ticket.save( - done: (r) => - @bulkCountIndex++ - - # reset form after save - if article - article.save( - fail: (r) => - @log 'error', 'update article', r - ) - - # refresh view after all tickets are proceeded - if @bulkCountIndex == @bulkCount - @render() - @hide() - - # fetch overview data again - App.Event.trigger('overview:fetch') - - fail: (r) => - @bulkCountIndex++ - @log 'error', 'update ticket', r - App.Event.trigger 'notify', { - type: 'error' - msg: App.i18n.translateContent('Can\'t update Ticket %s!', ticket.number) - } - ) + @saveTicketArticle(ticket, article) @holder.find('.table-overview').find('[name="bulk"]:checked').prop('checked', false) App.Event.trigger 'notify', { @@ -1609,6 +1583,36 @@ class BulkForm extends App.Controller msg: App.i18n.translateContent('Bulk action executed!') } + saveTicketArticle: (ticket, article) => + ticket.save( + done: (r) => + @bulkCountIndex++ + + # reset form after save + if article + article.save( + fail: (r) => + @log 'error', 'update article', r + ) + + # refresh view after all tickets are proceeded + if @bulkCountIndex == @bulkCount + @render() + @hide() + + # fetch overview data again + App.Event.trigger('overview:fetch') + + fail: (r) => + @bulkCountIndex++ + @log 'error', 'update ticket', r + App.Event.trigger 'notify', { + type: 'error' + msg: App.i18n.translateContent('Can\'t update Ticket %s!', ticket.number) + } + ) + + class App.OverviewSettings extends App.ControllerModal buttonClose: true buttonCancel: true diff --git a/spec/system/ticket/view_spec.rb b/spec/system/ticket/view_spec.rb index 7674a0140..e4fe74a49 100644 --- a/spec/system/ticket/view_spec.rb +++ b/spec/system/ticket/view_spec.rb @@ -1,88 +1,115 @@ require 'rails_helper' RSpec.describe 'Ticket views', type: :system do + context 'macros' do + let!(:group1) { create :group } + let!(:group2) { create :group } + let!(:macro_without_group) { create :macro } + let!(:macro_group1) { create :macro, groups: [group1] } + let!(:macro_group2) { create :macro, groups: [group2] } - let!(:group1) { create :group } - let!(:group2) { create :group } - let!(:macro_without_group) { create :macro } - let!(:macro_group1) { create :macro, groups: [group1] } - let!(:macro_group2) { create :macro, groups: [group2] } + it 'supports group-dependent macros' do - it 'supports group-dependent macros' do + ticket1 = create :ticket, group: group1 + ticket2 = create :ticket, group: group2 - ticket1 = create :ticket, group: group1 - ticket2 = create :ticket, group: group2 + # give user access to all groups including those created + # by using FactoryBot outside of the example + group_names_access_map = Group.all.pluck(:name).each_with_object({}) do |group_name, result| + result[group_name] = 'full'.freeze + end - # give user access to all groups including those created - # by using FactoryBot outside of the example - group_names_access_map = Group.all.pluck(:name).each_with_object({}) do |group_name, result| - result[group_name] = 'full'.freeze - end - - current_user do |user| - user.group_names_access_map = group_names_access_map - user.save! - end - - # refresh browser to get macro accessable - refresh - visit '#ticket/view/all_open' - - within(:active_content) do - - ticket = page.find(:table_row, 1).native - - # click and hold first ticket in table - click_and_hold(ticket) - - # move ticket to y -ticket.location.y - move_mouse_by(0, -ticket.location.y + 5) - - # move a bit to the left to display macro batches - move_mouse_by(-250, 0) - - expect(page).to have_selector(:macro_batch, macro_without_group.id, visible: :visible) - expect(page).to have_no_selector(:macro_batch, macro_group1.id) - expect(page).to have_no_selector(:macro_batch, macro_group2.id) - - release_mouse + current_user do |user| + user.group_names_access_map = group_names_access_map + user.save! + end + # refresh browser to get macro accessable refresh + visit '#ticket/view/all_open' - ticket = page.find(:table_row, ticket1.id).native + within(:active_content) do - # click and hold first ticket in table - click_and_hold(ticket) + ticket = page.find(:table_row, 1).native - # move ticket to y -ticket.location.y - move_mouse_by(0, -ticket.location.y + 5) + # click and hold first ticket in table + click_and_hold(ticket) - # move a bit to the left to display macro batches - move_mouse_by(-250, 0) + # move ticket to y -ticket.location.y + move_mouse_by(0, -ticket.location.y + 5) - expect(page).to have_selector(:macro_batch, macro_without_group.id, visible: :visible) - expect(page).to have_selector(:macro_batch, macro_group1.id) - expect(page).to have_no_selector(:macro_batch, macro_group2.id) + # move a bit to the left to display macro batches + move_mouse_by(-250, 0) - release_mouse + expect(page).to have_selector(:macro_batch, macro_without_group.id, visible: :visible) + expect(page).to have_no_selector(:macro_batch, macro_group1.id) + expect(page).to have_no_selector(:macro_batch, macro_group2.id) - refresh + release_mouse - ticket = page.find(:table_row, ticket2.id).native + refresh - # click and hold first ticket in table - click_and_hold(ticket) + ticket = page.find(:table_row, ticket1.id).native - # move ticket to y -ticket.location.y - move_mouse_by(0, -ticket.location.y + 5) + # click and hold first ticket in table + click_and_hold(ticket) - # move a bit to the left to display macro batches - move_mouse_by(-250, 0) + # move ticket to y -ticket.location.y + move_mouse_by(0, -ticket.location.y + 5) - expect(page).to have_selector(:macro_batch, macro_without_group.id, visible: :visible) - expect(page).to have_no_selector(:macro_batch, macro_group1.id) - expect(page).to have_selector(:macro_batch, macro_group2.id) + # move a bit to the left to display macro batches + move_mouse_by(-250, 0) + expect(page).to have_selector(:macro_batch, macro_without_group.id, visible: :visible) + expect(page).to have_selector(:macro_batch, macro_group1.id) + expect(page).to have_no_selector(:macro_batch, macro_group2.id) + + release_mouse + + refresh + + ticket = page.find(:table_row, ticket2.id).native + + # click and hold first ticket in table + click_and_hold(ticket) + + # move ticket to y -ticket.location.y + move_mouse_by(0, -ticket.location.y + 5) + + # move a bit to the left to display macro batches + move_mouse_by(-250, 0) + + expect(page).to have_selector(:macro_batch, macro_without_group.id, visible: :visible) + expect(page).to have_no_selector(:macro_batch, macro_group1.id) + expect(page).to have_selector(:macro_batch, macro_group2.id) + + end + end + end + + context 'bulk note', authenticated_as: :user do + let(:group) { create :group } + let(:user) { create :admin, groups: [group] } + let!(:ticket1) { create(:ticket, state_name: 'open', owner: user, group: group) } + let!(:ticket2) { create(:ticket, state_name: 'open', owner: user, group: group) } + let(:note) { Faker::Lorem.sentence } + + it 'adds note to all selected tickets' do + visit 'ticket/view/my_assigned' + + within :active_content do + all('.js-checkbox-field', count: 2).each(&:click) + click '.js-confirm' + find('.js-confirm-step textarea').fill_in with: note + click '.js-submit' + end + + await_empty_ajax_queue + + expect([ + ticket1.articles.last&.body, + ticket2.articles.last&.body + ]).to be_all note end end end