Просмотр исходного кода

Fixes #1123 Attachments get doubled when suspending a draft

Mantas 6 лет назад
Родитель
Сommit
7bb7e7a438

+ 2 - 0
app/assets/javascripts/app/controllers/agent_ticket_create.coffee

@@ -256,6 +256,8 @@ class App.TicketCreate extends App.Controller
       params = template.options
       params = template.options
     else if App.TaskManager.get(@taskKey) && !_.isEmpty(App.TaskManager.get(@taskKey).state)
     else if App.TaskManager.get(@taskKey) && !_.isEmpty(App.TaskManager.get(@taskKey).state)
       params = App.TaskManager.get(@taskKey).state
       params = App.TaskManager.get(@taskKey).state
+      params.attachments = App.TaskManager.get(@taskKey).attachments
+
       if !_.isEmpty(params['form_id'])
       if !_.isEmpty(params['form_id'])
         @formId = params['form_id']
         @formId = params['form_id']
 
 

+ 10 - 2
app/assets/javascripts/app/controllers/ticket_zoom.coffee

@@ -439,7 +439,7 @@ class App.TicketZoom extends App.Controller
       #if @shown
       #if @shown
       #  @attributeBar.start()
       #  @attributeBar.start()
 
 
-      @form_id = App.ControllerForm.formId()
+      @form_id = @taskGet('article').form_id || App.ControllerForm.formId()
 
 
       @articleNew = new App.TicketZoomArticleNew(
       @articleNew = new App.TicketZoomArticleNew(
         ticket:    @ticket
         ticket:    @ticket
@@ -666,7 +666,6 @@ class App.TicketZoom extends App.Controller
     else
     else
       delete currentParams.article.attachments
       delete currentParams.article.attachments
 
 
-    # remove not needed attributes
     delete currentParams.article.form_id
     delete currentParams.article.form_id
 
 
     if @permissionCheck('ticket.customer')
     if @permissionCheck('ticket.customer')
@@ -966,6 +965,10 @@ class App.TicketZoom extends App.Controller
   taskGet: (area) =>
   taskGet: (area) =>
     return {} if !App.TaskManager.get(@taskKey)
     return {} if !App.TaskManager.get(@taskKey)
     @localTaskData = App.TaskManager.get(@taskKey).state || {}
     @localTaskData = App.TaskManager.get(@taskKey).state || {}
+
+    if _.isObject(@localTaskData.article) && _.isArray(App.TaskManager.get(@taskKey).attachments)
+      @localTaskData.article['attachments'] = App.TaskManager.get(@taskKey).attachments
+
     if area
     if area
       if !@localTaskData[area]
       if !@localTaskData[area]
         @localTaskData[area] = {}
         @localTaskData[area] = {}
@@ -980,10 +983,15 @@ class App.TicketZoom extends App.Controller
 
 
   taskUpdateAll: (data) =>
   taskUpdateAll: (data) =>
     @localTaskData = data
     @localTaskData = data
+    @localTaskData.article['form_id'] = @form_id
     App.TaskManager.update(@taskKey, { 'state': @localTaskData })
     App.TaskManager.update(@taskKey, { 'state': @localTaskData })
 
 
   # reset task state
   # reset task state
   taskReset: =>
   taskReset: =>
+    @form_id = App.ControllerForm.formId()
+    @articleNew.form_id = @form_id
+    @articleNew.render()
+
     @localTaskData =
     @localTaskData =
       ticket:  {}
       ticket:  {}
       article: {}
       article: {}

+ 4 - 0
app/assets/javascripts/app/controllers/ticket_zoom/article_new.coffee

@@ -47,6 +47,10 @@ class App.TicketZoomArticleNew extends App.Controller
     if @defaults.body or @isIE10()
     if @defaults.body or @isIE10()
       @openTextarea(null, true)
       @openTextarea(null, true)
 
 
+    if _.isArray(@defaults.attachments)
+      for attachment in @defaults.attachments
+        @renderAttachment(attachment)
+
     # set article type and expand text area
     # set article type and expand text area
     @bind('ui::ticket::setArticleType', (data) =>
     @bind('ui::ticket::setArticleType', (data) =>
       return if data.ticket.id.toString() isnt @ticket_id.toString()
       return if data.ticket.id.toString() isnt @ticket_id.toString()

+ 1 - 1
app/assets/javascripts/app/models/taskbar.coffee

@@ -1,5 +1,5 @@
 class App.Taskbar extends App.Model
 class App.Taskbar extends App.Model
-  @configure 'Taskbar', 'key', 'client_id', 'callback', 'state', 'params', 'prio', 'notify', 'active', 'updated_at'
+  @configure 'Taskbar', 'key', 'client_id', 'callback', 'state', 'params', 'prio', 'notify', 'active', 'attachments', 'updated_at'
 #  @extend Spine.Model.Local
 #  @extend Spine.Model.Local
   @extend Spine.Model.Ajax
   @extend Spine.Model.Ajax
   @url: @apiPath + '/taskbar'
   @url: @apiPath + '/taskbar'

+ 6 - 0
app/controllers/concerns/creates_ticket_articles.rb

@@ -119,6 +119,12 @@ module CreatesTicketArticles
 
 
     return article if form_id.blank?
     return article if form_id.blank?
 
 
+    # clear in-progress state from taskbar
+    Taskbar
+      .where(user_id: current_user.id)
+      .first { |taskbar| taskbar.persisted_form_id == form_id }
+      &.update!(state: {})
+
     # remove attachments from upload cache
     # remove attachments from upload cache
     Store.remove(
     Store.remove(
       object: 'UploadCache',
       object: 'UploadCache',

+ 4 - 0
app/models/store.rb

@@ -192,6 +192,10 @@ returns
     path
     path
   end
   end
 
 
+  def attributes_for_display
+    slice :id, :filename, :size, :preferences
+  end
+
   def provider
   def provider
     file = Store::File.find_by(id: store_file_id)
     file = Store::File.find_by(id: store_file_id)
     if !file
     if !file

+ 31 - 1
app/models/taskbar.rb

@@ -16,8 +16,9 @@ class Taskbar < ApplicationModel
     return false if state.blank?
     return false if state.blank?
     state.each_value do |value|
     state.each_value do |value|
       if value.is_a? Hash
       if value.is_a? Hash
-        value.each_value do |value1|
+        value.each do |key1, value1|
           next if value1.blank?
           next if value1.blank?
+          next if key1 == 'form_id'
           return true
           return true
         end
         end
       else
       else
@@ -28,8 +29,37 @@ class Taskbar < ApplicationModel
     false
     false
   end
   end
 
 
+  def attributes_with_association_names
+    add_attachments_to_attributes(super)
+  end
+
+  def attributes_with_association_ids
+    add_attachments_to_attributes(super)
+  end
+
+  def as_json(options = {})
+    add_attachments_to_attributes(super)
+  end
+
+  # form_id is saved directly in a new ticket, but inside of the article when updating an existing ticket
+  def persisted_form_id
+    state&.dig(:form_id) || state&.dig(:article, :form_id)
+  end
+
   private
   private
 
 
+  def attachments
+    return [] if persisted_form_id.blank?
+
+    Store.list(object: 'UploadCache', o_id: persisted_form_id)
+  end
+
+  def add_attachments_to_attributes(attributes)
+    attributes.tap do |result|
+      result['attachments'] = attachments.map(&:attributes_for_display)
+    end
+  end
+
   def update_last_contact
   def update_last_contact
     return true if local_update
     return true if local_update
     return true if changes.blank?
     return true if changes.blank?

+ 7 - 20
app/models/ticket/article.rb

@@ -238,16 +238,7 @@ returns
 
 
   def attributes_with_association_names
   def attributes_with_association_names
     attributes = super
     attributes = super
-    attributes['attachments'] = []
-    attachments.each do |attachment|
-      item = {
-        id: attachment['id'],
-        filename: attachment['filename'],
-        size: attachment['size'],
-        preferences: attachment['preferences'],
-      }
-      attributes['attachments'].push item
-    end
+    add_attachments_to_attributes(attributes)
     Ticket::Article.insert_urls(attributes)
     Ticket::Article.insert_urls(attributes)
   end
   end
 
 
@@ -266,16 +257,7 @@ returns
 
 
   def attributes_with_association_ids
   def attributes_with_association_ids
     attributes = super
     attributes = super
-    attributes['attachments'] = []
-    attachments.each do |attachment|
-      item = {
-        id: attachment['id'],
-        filename: attachment['filename'],
-        size: attachment['size'],
-        preferences: attachment['preferences'],
-      }
-      attributes['attachments'].push item
-    end
+    add_attachments_to_attributes(attributes)
     if attributes['body'] && attributes['content_type'] =~ %r{text/html}i
     if attributes['body'] && attributes['content_type'] =~ %r{text/html}i
       attributes['body'] = HtmlSanitizer.dynamic_image_size(attributes['body'])
       attributes['body'] = HtmlSanitizer.dynamic_image_size(attributes['body'])
     end
     end
@@ -284,6 +266,11 @@ returns
 
 
   private
   private
 
 
+  def add_attachments_to_attributes(attributes)
+    attributes['attachments'] = attachments.map(&:attributes_for_display)
+    attributes
+  end
+
   # strip not wanted chars
   # strip not wanted chars
   def check_subject
   def check_subject
     return true if subject.blank?
     return true if subject.blank?

+ 12 - 0
script/build/test_slice_tests.sh

@@ -27,6 +27,7 @@ if [ "$LEVEL" == '1' ]; then
   rm test/browser/agent_ticket_attachment_test.rb
   rm test/browser/agent_ticket_attachment_test.rb
   rm test/browser/agent_ticket_auto_assignment_test.rb
   rm test/browser/agent_ticket_auto_assignment_test.rb
   rm test/browser/agent_ticket_create_available_types_test.rb
   rm test/browser/agent_ticket_create_available_types_test.rb
+  rm test/browser/agent_ticket_create_attachment_missing_after_reload_test.rb
   rm test/browser/agent_ticket_create_cc_tokenizer_test.rb
   rm test/browser/agent_ticket_create_cc_tokenizer_test.rb
   rm test/browser/agent_ticket_create_default_type_test.rb
   rm test/browser/agent_ticket_create_default_type_test.rb
   rm test/browser/agent_ticket_create_reset_customer_selection_test.rb
   rm test/browser/agent_ticket_create_reset_customer_selection_test.rb
@@ -49,6 +50,7 @@ if [ "$LEVEL" == '1' ]; then
   rm test/browser/agent_ticket_update3_test.rb
   rm test/browser/agent_ticket_update3_test.rb
   rm test/browser/agent_ticket_update4_test.rb
   rm test/browser/agent_ticket_update4_test.rb
   rm test/browser/agent_ticket_update5_test.rb
   rm test/browser/agent_ticket_update5_test.rb
+  rm test/browser/agent_ticket_update_with_attachment_refresh_test.rb
   rm test/browser/agent_ticket_update_and_reload_test.rb
   rm test/browser/agent_ticket_update_and_reload_test.rb
   rm test/browser/agent_user_manage_test.rb
   rm test/browser/agent_user_manage_test.rb
   rm test/browser/agent_user_profile_test.rb
   rm test/browser/agent_user_profile_test.rb
@@ -102,6 +104,7 @@ elif [ "$LEVEL" == '2' ]; then
   rm test/browser/agent_ticket_attachment_test.rb
   rm test/browser/agent_ticket_attachment_test.rb
   rm test/browser/agent_ticket_auto_assignment_test.rb
   rm test/browser/agent_ticket_auto_assignment_test.rb
   rm test/browser/agent_ticket_create_available_types_test.rb
   rm test/browser/agent_ticket_create_available_types_test.rb
+  rm test/browser/agent_ticket_create_attachment_missing_after_reload_test.rb
   rm test/browser/agent_ticket_create_cc_tokenizer_test.rb
   rm test/browser/agent_ticket_create_cc_tokenizer_test.rb
   rm test/browser/agent_ticket_create_default_type_test.rb
   rm test/browser/agent_ticket_create_default_type_test.rb
   rm test/browser/agent_ticket_create_reset_customer_selection_test.rb
   rm test/browser/agent_ticket_create_reset_customer_selection_test.rb
@@ -124,6 +127,7 @@ elif [ "$LEVEL" == '2' ]; then
   # test/browser/agent_ticket_update3_test.rb
   # test/browser/agent_ticket_update3_test.rb
   # test/browser/agent_ticket_update4_test.rb
   # test/browser/agent_ticket_update4_test.rb
   # rm test/browser/agent_ticket_update5_test.rb
   # rm test/browser/agent_ticket_update5_test.rb
+  # rm test/browser/agent_ticket_update_with_attachment_refresh_test.rb
   # test/browser/agent_ticket_update_and_reload_test.rb
   # test/browser/agent_ticket_update_and_reload_test.rb
   rm test/browser/agent_user_manage_test.rb
   rm test/browser/agent_user_manage_test.rb
   rm test/browser/agent_user_profile_test.rb
   rm test/browser/agent_user_profile_test.rb
@@ -177,6 +181,7 @@ elif [ "$LEVEL" == '3' ]; then
   # test/browser/agent_ticket_attachment_test.rb
   # test/browser/agent_ticket_attachment_test.rb
   # test/browser/agent_ticket_auto_assignment_test.rb
   # test/browser/agent_ticket_auto_assignment_test.rb
   # rm test/browser/agent_ticket_create_available_types_test.rb
   # rm test/browser/agent_ticket_create_available_types_test.rb
+  # rm test/browser/agent_ticket_create_attachment_missing_after_reload_test.rb
   #rm test/browser/agent_ticket_create_cc_tokenizer_test.rb
   #rm test/browser/agent_ticket_create_cc_tokenizer_test.rb
   # rm test/browser/agent_ticket_create_default_type_test.rb
   # rm test/browser/agent_ticket_create_default_type_test.rb
   # test/browser/agent_ticket_create_reset_customer_selection_test.rb
   # test/browser/agent_ticket_create_reset_customer_selection_test.rb
@@ -199,6 +204,7 @@ elif [ "$LEVEL" == '3' ]; then
   rm test/browser/agent_ticket_update3_test.rb
   rm test/browser/agent_ticket_update3_test.rb
   rm test/browser/agent_ticket_update4_test.rb
   rm test/browser/agent_ticket_update4_test.rb
   rm test/browser/agent_ticket_update5_test.rb
   rm test/browser/agent_ticket_update5_test.rb
+  rm test/browser/agent_ticket_update_with_attachment_refresh_test.rb
   rm test/browser/agent_ticket_update_and_reload_test.rb
   rm test/browser/agent_ticket_update_and_reload_test.rb
   rm test/browser/agent_user_manage_test.rb
   rm test/browser/agent_user_manage_test.rb
   rm test/browser/agent_user_profile_test.rb
   rm test/browser/agent_user_profile_test.rb
@@ -252,6 +258,7 @@ elif [ "$LEVEL" == '4' ]; then
   rm test/browser/agent_ticket_attachment_test.rb
   rm test/browser/agent_ticket_attachment_test.rb
   rm test/browser/agent_ticket_auto_assignment_test.rb
   rm test/browser/agent_ticket_auto_assignment_test.rb
   rm test/browser/agent_ticket_create_available_types_test.rb
   rm test/browser/agent_ticket_create_available_types_test.rb
+  rm test/browser/agent_ticket_create_attachment_missing_after_reload_test.rb
   rm test/browser/agent_ticket_create_cc_tokenizer_test.rb
   rm test/browser/agent_ticket_create_cc_tokenizer_test.rb
   rm test/browser/agent_ticket_create_default_type_test.rb
   rm test/browser/agent_ticket_create_default_type_test.rb
   rm test/browser/agent_ticket_create_reset_customer_selection_test.rb
   rm test/browser/agent_ticket_create_reset_customer_selection_test.rb
@@ -274,6 +281,7 @@ elif [ "$LEVEL" == '4' ]; then
   rm test/browser/agent_ticket_update3_test.rb
   rm test/browser/agent_ticket_update3_test.rb
   rm test/browser/agent_ticket_update4_test.rb
   rm test/browser/agent_ticket_update4_test.rb
   rm test/browser/agent_ticket_update5_test.rb
   rm test/browser/agent_ticket_update5_test.rb
+  rm test/browser/agent_ticket_update_with_attachment_refresh_test.rb
   rm test/browser/agent_ticket_update_and_reload_test.rb
   rm test/browser/agent_ticket_update_and_reload_test.rb
   rm test/browser/agent_user_manage_test.rb
   rm test/browser/agent_user_manage_test.rb
   rm test/browser/agent_user_profile_test.rb
   rm test/browser/agent_user_profile_test.rb
@@ -326,6 +334,7 @@ elif [ "$LEVEL" == '5' ]; then
   rm test/browser/agent_ticket_attachment_test.rb
   rm test/browser/agent_ticket_attachment_test.rb
   rm test/browser/agent_ticket_auto_assignment_test.rb
   rm test/browser/agent_ticket_auto_assignment_test.rb
   rm test/browser/agent_ticket_create_available_types_test.rb
   rm test/browser/agent_ticket_create_available_types_test.rb
+  rm test/browser/agent_ticket_create_attachment_missing_after_reload_test.rb
   rm test/browser/agent_ticket_create_cc_tokenizer_test.rb
   rm test/browser/agent_ticket_create_cc_tokenizer_test.rb
   rm test/browser/agent_ticket_create_default_type_test.rb
   rm test/browser/agent_ticket_create_default_type_test.rb
   rm test/browser/agent_ticket_create_reset_customer_selection_test.rb
   rm test/browser/agent_ticket_create_reset_customer_selection_test.rb
@@ -348,6 +357,7 @@ elif [ "$LEVEL" == '5' ]; then
   rm test/browser/agent_ticket_update3_test.rb
   rm test/browser/agent_ticket_update3_test.rb
   rm test/browser/agent_ticket_update4_test.rb
   rm test/browser/agent_ticket_update4_test.rb
   rm test/browser/agent_ticket_update5_test.rb
   rm test/browser/agent_ticket_update5_test.rb
+  rm test/browser/agent_ticket_update_with_attachment_refresh_test.rb
   rm test/browser/agent_ticket_update_and_reload_test.rb
   rm test/browser/agent_ticket_update_and_reload_test.rb
   # test/browser/agent_user_manage_test.rb
   # test/browser/agent_user_manage_test.rb
   # test/browser/agent_user_profile_test.rb
   # test/browser/agent_user_profile_test.rb
@@ -403,6 +413,7 @@ elif [ "$LEVEL" == '6' ]; then
   rm test/browser/agent_ticket_attachment_test.rb
   rm test/browser/agent_ticket_attachment_test.rb
   rm test/browser/agent_ticket_auto_assignment_test.rb
   rm test/browser/agent_ticket_auto_assignment_test.rb
   rm test/browser/agent_ticket_create_available_types_test.rb
   rm test/browser/agent_ticket_create_available_types_test.rb
+  rm test/browser/agent_ticket_create_attachment_missing_after_reload_test.rb
   rm test/browser/agent_ticket_create_cc_tokenizer_test.rb
   rm test/browser/agent_ticket_create_cc_tokenizer_test.rb
   rm test/browser/agent_ticket_create_default_type_test.rb
   rm test/browser/agent_ticket_create_default_type_test.rb
   rm test/browser/agent_ticket_create_reset_customer_selection_test.rb
   rm test/browser/agent_ticket_create_reset_customer_selection_test.rb
@@ -425,6 +436,7 @@ elif [ "$LEVEL" == '6' ]; then
   rm test/browser/agent_ticket_update3_test.rb
   rm test/browser/agent_ticket_update3_test.rb
   rm test/browser/agent_ticket_update4_test.rb
   rm test/browser/agent_ticket_update4_test.rb
   rm test/browser/agent_ticket_update5_test.rb
   rm test/browser/agent_ticket_update5_test.rb
+  rm test/browser/agent_ticket_update_with_attachment_refresh_test.rb
   rm test/browser/agent_ticket_update_and_reload_test.rb
   rm test/browser/agent_ticket_update_and_reload_test.rb
   rm test/browser/agent_user_manage_test.rb
   rm test/browser/agent_user_manage_test.rb
   rm test/browser/agent_user_profile_test.rb
   rm test/browser/agent_user_profile_test.rb

+ 60 - 0
test/browser/agent_ticket_create_attachment_missing_after_reload_test.rb

@@ -0,0 +1,60 @@
+require 'browser_test_helper'
+
+# https://github.com/zammad/zammad/issues/1123
+# Make sure attachment is shown after reloading a new in-progress ticket
+
+class AgentticketCreateAttachmentMissingAfterReloadTest < TestCase
+  def test_attachments
+    @browser = browser_instance
+    login(
+      username: 'agent1@example.com',
+      password: 'test',
+      url: browser_url,
+    )
+    tasks_close_all()
+
+    #
+    # attachment checks - new ticket
+    #
+
+    # create new ticket with no attachment, attachment check should pop up
+    ticket_create(
+      data: {
+        customer: 'nico',
+        group: 'Users',
+        title: 'test 6 - ticket 1',
+        body: 'test 6 - ticket 1 body',
+      },
+      do_not_submit: true,
+    )
+    sleep 1
+
+    # since selenium webdriver with firefox is not able to upload files, skipp here
+    # https://github.com/w3c/webdriver/issues/1230
+    return if browser == 'firefox'
+
+    # add attachment, attachment check should quiet
+    file_upload(
+      css:   '.content.active .attachmentPlaceholder-inputHolder input',
+      files: ['test/data/upload/upload1.txt'],
+    )
+
+    sleep 2
+
+    # check if attachment is shown
+    match(
+      css: '.content.active .newTicket .attachments .attachment:nth-child(1) .attachment-name',
+      value: 'upload1.txt'
+    )
+
+    @browser.navigate.refresh
+
+    sleep 1
+
+    # check if attachment is shown
+    match(
+      css: '.content.active .newTicket .attachments .attachment:nth-child(1) .attachment-name',
+      value: 'upload1.txt'
+    )
+  end
+end

Некоторые файлы не были показаны из-за большого количества измененных файлов