diff --git a/app/assets/javascripts/app/controllers/ticket_zoom.coffee b/app/assets/javascripts/app/controllers/ticket_zoom.coffee index 9a9bad539..6b560691b 100644 --- a/app/assets/javascripts/app/controllers/ticket_zoom.coffee +++ b/app/assets/javascripts/app/controllers/ticket_zoom.coffee @@ -200,10 +200,10 @@ class App.TicketZoom extends App.Controller formMeta = data.form_meta # on the following states we want to rerender the ticket: - # - if the object attribute configuration has changed (attribute values, restrictions, filters) + # - if the object attribute configuration has changed (attribute values, dependecies, filters) # - if the user view has changed (agent/customer) # - if the ticket permission has changed (read/write/full) - if @view && ( !_.isEqual(@formMeta, formMeta) || @view isnt view || @readable isnt readable || @changeable isnt changeable || @fullable isnt fullable ) + if @view && ( !_.isEqual(@formMeta.configure_attributes, formMeta.configure_attributes) || !_.isEqual(@formMeta.dependencies, formMeta.dependencies) || !_.isEqual(@formMeta.filter, formMeta.filter) || @view isnt view || @readable isnt readable || @changeable isnt changeable || @fullable isnt fullable ) @renderDone = false @view = view @@ -214,6 +214,7 @@ class App.TicketZoom extends App.Controller # render page @render(local) + App.Event.trigger('ui::ticket::load', data) meta: => diff --git a/app/assets/javascripts/app/controllers/ticket_zoom/sidebar_ticket.coffee b/app/assets/javascripts/app/controllers/ticket_zoom/sidebar_ticket.coffee index 2cf626c38..bdb18819b 100644 --- a/app/assets/javascripts/app/controllers/ticket_zoom/sidebar_ticket.coffee +++ b/app/assets/javascripts/app/controllers/ticket_zoom/sidebar_ticket.coffee @@ -5,6 +5,13 @@ class Edit extends App.Controller constructor: (params) -> super + @controllerBind('ui::ticket::load', (data) => + return if data.ticket_id.toString() isnt @ticket.id.toString() + + @ticket = App.Ticket.find(@ticket.id) + @formMeta = data.form_meta + @render() + ) @render() render: => @@ -18,6 +25,9 @@ class Edit extends App.Controller if !_.isEmpty(taskState) defaults = _.extend(defaults, taskState) + # remove core workflow data because it should trigger a request to get data + # for the new ticket + eventually changed task state + @formMeta.core_workflow = undefined if followUpPossible == 'new_ticket' && ticketState != 'closed' || followUpPossible != 'new_ticket' || diff --git a/spec/system/ticket/zoom_spec.rb b/spec/system/ticket/zoom_spec.rb index ebcf07f0b..8a63fba43 100644 --- a/spec/system/ticket/zoom_spec.rb +++ b/spec/system/ticket/zoom_spec.rb @@ -2134,4 +2134,63 @@ RSpec.describe 'Ticket zoom', type: :system do end end end + + context 'Basic sidebar handling because of regressions in #3757' do + let(:ticket) { create(:ticket, group: Group.find_by(name: 'Users')) } + + before do + visit "#ticket/zoom/#{ticket.id}" + end + + it 'does show up the new priority' do + high_prio = Ticket::Priority.find_by(name: '3 high') + ticket.update(priority: high_prio) + wait(10, interval: 0.5).until { page.find("select[name='priority_id']").value == high_prio.id.to_s } + expect(page.find("select[name='priority_id']").value).to eq(high_prio.id.to_s) + end + + it 'does show up the new state and pending time' do + pending_state = Ticket::State.find_by(name: 'pending reminder') + ticket.update(state: pending_state, pending_time: 1.day.from_now) + wait(10, interval: 0.5).until { page.find("select[name='state_id']").value == pending_state.id.to_s } + expect(page.find("select[name='state_id']").value).to eq(pending_state.id.to_s) + expect(page).to have_selector("div[data-name='pending_time']") + end + + it 'does merge attributes with remote priority (ajax) and local state (user)' do + select 'closed', from: 'State' + high_prio = Ticket::Priority.find_by(name: '3 high') + closed_state = Ticket::State.find_by(name: 'closed') + ticket.update(priority: high_prio) + wait(10, interval: 0.5).until { page.find("select[name='priority_id']").value == high_prio.id.to_s } + expect(page.find("select[name='priority_id']").value).to eq(high_prio.id.to_s) + expect(page.find("select[name='state_id']").value).to eq(closed_state.id.to_s) + end + + context 'when 2 users are in 2 different tickets' do + let(:ticket2) { create(:ticket, group: Group.find_by(name: 'Users')) } + let(:agent2) { create(:agent, password: 'test', groups: [Group.find_by(name: 'Users')]) } + + before do + using_session(:second_browser) do + login( + username: agent2.login, + password: 'test', + ) + visit "#ticket/zoom/#{ticket.id}" + visit "#ticket/zoom/#{ticket2.id}" + end + end + + it 'does not make any changes to the second browser ticket' do + closed_state = Ticket::State.find_by(name: 'closed') + select 'closed', from: 'State' + find('.js-submit').click + using_session(:second_browser) do + sleep 3 + expect(page.find("select[name='state_id']").value).not_to eq(closed_state.id.to_s) + end + end + end + end end