diff --git a/app/assets/javascripts/app/controllers/ticket_zoom.coffee b/app/assets/javascripts/app/controllers/ticket_zoom.coffee
index 4901f2ecc..cc9dd7fe0 100644
--- a/app/assets/javascripts/app/controllers/ticket_zoom.coffee
+++ b/app/assets/javascripts/app/controllers/ticket_zoom.coffee
@@ -605,6 +605,7 @@ class App.TicketZoom extends App.Controller
body: ''
internal: internal
in_reply_to: ''
+ subtype: ''
if @permissionCheck('ticket.customer')
currentStore.article.internal = ''
diff --git a/app/assets/javascripts/app/controllers/ticket_zoom/article_action/email_reply.coffee b/app/assets/javascripts/app/controllers/ticket_zoom/article_action/email_reply.coffee
index 204dbd7d4..ca2df890c 100644
--- a/app/assets/javascripts/app/controllers/ticket_zoom/article_action/email_reply.coffee
+++ b/app/assets/javascripts/app/controllers/ticket_zoom/article_action/email_reply.coffee
@@ -157,6 +157,8 @@ class EmailReply extends App.Controller
type = App.TicketArticleType.findByAttribute(name:'email')
+ articleNew.subtype = 'reply'
+
App.Event.trigger('ui::ticket::setArticleType', {
ticket: ticket
type: type
@@ -187,12 +189,14 @@ class EmailReply extends App.Controller
if ui.Config.get('ui_ticket_zoom_article_email_subject')
if _.isEmpty(article.subject)
- articleNew.subject = "FW: #{ticket.title}"
+ articleNew.subject = ticket.title
else
- articleNew.subject = "FW: #{article.subject}"
+ articleNew.subject = article.subject
type = App.TicketArticleType.findByAttribute(name:'email')
+ articleNew.subtype = 'forward'
+
App.Event.trigger('ui::ticket::setArticleType', {
ticket: ticket
type: type
diff --git a/app/assets/javascripts/app/models/ticket_article.coffee b/app/assets/javascripts/app/models/ticket_article.coffee
index 7c3523ace..03ab869b5 100644
--- a/app/assets/javascripts/app/models/ticket_article.coffee
+++ b/app/assets/javascripts/app/models/ticket_article.coffee
@@ -1,5 +1,5 @@
class App.TicketArticle extends App.Model
- @configure 'TicketArticle', 'from', 'to', 'cc', 'subject', 'body', 'content_type', 'ticket_id', 'type_id', 'sender_id', 'internal', 'in_reply_to', 'form_id', 'time_unit', 'preferences', 'updated_at'
+ @configure 'TicketArticle', 'from', 'to', 'cc', 'subject', 'body', 'content_type', 'ticket_id', 'type_id', 'sender_id', 'internal', 'in_reply_to', 'form_id', 'subtype', 'time_unit', 'preferences', 'updated_at'
@extend Spine.Model.Ajax
@url: @apiPath + '/ticket_articles'
@configure_attributes = [
diff --git a/app/assets/javascripts/app/views/ticket_zoom/article_new.jst.eco b/app/assets/javascripts/app/views/ticket_zoom/article_new.jst.eco
index a4d1ae0b3..08e6d13c0 100644
--- a/app/assets/javascripts/app/views/ticket_zoom/article_new.jst.eco
+++ b/app/assets/javascripts/app/views/ticket_zoom/article_new.jst.eco
@@ -2,6 +2,7 @@
+
diff --git a/app/controllers/concerns/creates_ticket_articles.rb b/app/controllers/concerns/creates_ticket_articles.rb
index ca1e2eb6a..6d5ca281b 100644
--- a/app/controllers/concerns/creates_ticket_articles.rb
+++ b/app/controllers/concerns/creates_ticket_articles.rb
@@ -8,6 +8,7 @@ module CreatesTicketArticles
# create article if given
form_id = params[:form_id]
params.delete(:form_id)
+ subtype = params.delete(:subtype)
# check min. params
raise Exceptions::UnprocessableEntity, 'Need at least article: { body: "some text" }' if !params[:body]
@@ -59,6 +60,10 @@ module CreatesTicketArticles
o_id: form_id,
)
end
+
+ # set subtype of present
+ article.preferences[:subtype] = subtype if subtype.present?
+
article.save!
# store inline attachments
diff --git a/app/models/observer/ticket/article/communicate_email/background_job.rb b/app/models/observer/ticket/article/communicate_email/background_job.rb
index 87c4ceaef..1b2e14f29 100644
--- a/app/models/observer/ticket/article/communicate_email/background_job.rb
+++ b/app/models/observer/ticket/article/communicate_email/background_job.rb
@@ -9,11 +9,10 @@ class Observer::Ticket::Article::CommunicateEmail::BackgroundJob
# build subject
ticket = Ticket.lookup(id: record.ticket_id)
article_count = Ticket::Article.where(ticket_id: ticket.id).count
- subject = if article_count > 1
- ticket.subject_build(record.subject, true)
- else
- ticket.subject_build(record.subject)
- end
+
+ subject_prefix_mode = record.preferences[:subtype]
+
+ subject = ticket.subject_build(record.subject, subject_prefix_mode)
# set retry count
if !record.preferences['delivery_retry']
diff --git a/app/models/ticket/subject.rb b/app/models/ticket/subject.rb
index 2516b0424..d3267eda2 100644
--- a/app/models/ticket/subject.rb
+++ b/app/models/ticket/subject.rb
@@ -6,7 +6,8 @@ module Ticket::Subject
build new subject with ticket number in there
ticket = Ticket.find(123)
- result = ticket.subject_build('some subject', is_reply_true_false)
+ prefix_mode = :reply # :forward, nil
+ result = ticket.subject_build('some subject', prefix_mode)
returns
@@ -14,36 +15,25 @@ returns
=end
- def subject_build(subject, is_reply = false)
+ def subject_build(subject, prefix_mode = nil)
# clena subject
- subject = subject_clean(subject)
+ subject_parts = [subject_clean(subject)]
- ticket_hook = Setting.get('ticket_hook')
- ticket_hook_divider = Setting.get('ticket_hook_divider')
- ticket_subject_re = Setting.get('ticket_subject_re')
-
- # none position
- if Setting.get('ticket_hook_position') == 'none'
- if is_reply && ticket_subject_re.present?
- subject = "#{ticket_subject_re}: #{subject}"
- end
- return subject
+ # add hook
+ case Setting.get('ticket_hook_position')
+ when 'left'
+ subject_parts.unshift subject_build_hook
+ when 'right'
+ subject_parts.push subject_build_hook
end
- # right position
- if Setting.get('ticket_hook_position') == 'right'
- if is_reply && ticket_subject_re.present?
- subject = "#{ticket_subject_re}: #{subject}"
- end
- return "#{subject} [#{ticket_hook}#{ticket_hook_divider}#{number}]"
- end
+ # add prefix
+ subject_parts
+ .unshift(subject_build_prefix(prefix_mode))
+ .compact!
- # left position
- if is_reply && ticket_subject_re.present?
- return "#{ticket_subject_re}: [#{ticket_hook}#{ticket_hook_divider}#{number}] #{subject}"
- end
- "[#{ticket_hook}#{ticket_hook_divider}#{number}] #{subject}"
+ subject_parts.join ' '
end
=begin
@@ -85,4 +75,24 @@ returns
subject.strip!
subject
end
+
+ private
+
+ def subject_build_hook
+ ticket_hook = Setting.get('ticket_hook')
+ ticket_hook_divider = Setting.get('ticket_hook_divider')
+
+ "[#{ticket_hook}#{ticket_hook_divider}#{number}]"
+ end
+
+ def subject_build_prefix(prefix_mode)
+ prefix = case prefix_mode
+ when 'reply'
+ Setting.get('ticket_subject_re')
+ when 'forward'
+ Setting.get('ticket_subject_fwd')
+ end
+
+ prefix.present? ? "#{prefix}:" : nil
+ end
end
diff --git a/db/migrate/20180518100316_email_forward_prefix_setting_issue_1730.rb b/db/migrate/20180518100316_email_forward_prefix_setting_issue_1730.rb
new file mode 100644
index 000000000..dec4b5cf0
--- /dev/null
+++ b/db/migrate/20180518100316_email_forward_prefix_setting_issue_1730.rb
@@ -0,0 +1,28 @@
+class EmailForwardPrefixSettingIssue1730 < ActiveRecord::Migration[5.1]
+ def up
+ # return if it's a new setup
+ return if !Setting.find_by(name: 'system_init_done')
+
+ Setting.create_if_not_exists(
+ title: 'Ticket Subject Forward',
+ name: 'ticket_subject_fwd',
+ area: 'Email::Base',
+ description: 'The text at the beginning of the subject in an email forward, e. g. FWD.',
+ options: {
+ form: [
+ {
+ display: '',
+ null: true,
+ name: 'ticket_subject_fwd',
+ tag: 'input',
+ },
+ ],
+ },
+ state: 'FWD',
+ preferences: {
+ permission: ['admin.channel_email'],
+ },
+ frontend: false
+ )
+ end
+end
diff --git a/db/seeds/settings.rb b/db/seeds/settings.rb
index 7166fa0d2..42eeed444 100644
--- a/db/seeds/settings.rb
+++ b/db/seeds/settings.rb
@@ -2308,6 +2308,28 @@ Setting.create_if_not_exists(
frontend: false
)
+Setting.create_if_not_exists(
+ title: 'Ticket Subject Forward',
+ name: 'ticket_subject_fwd',
+ area: 'Email::Base',
+ description: 'The text at the beginning of the subject in an email forward, e. g. FWD.',
+ options: {
+ form: [
+ {
+ display: '',
+ null: true,
+ name: 'ticket_subject_fwd',
+ tag: 'input',
+ },
+ ],
+ },
+ state: 'FWD',
+ preferences: {
+ permission: ['admin.channel_email'],
+ },
+ frontend: false
+)
+
Setting.create_if_not_exists(
title: 'Sender Format',
name: 'ticket_define_email_from',
diff --git a/test/unit/ticket_test.rb b/test/unit/ticket_test.rb
index 90dae91ea..bd6b89952 100644
--- a/test/unit/ticket_test.rb
+++ b/test/unit/ticket_test.rb
@@ -300,9 +300,10 @@ class TicketTest < ActiveSupport::TestCase
)
assert_equal('subject test 1', ticket.title)
assert_equal("ABC subject test 1 [Ticket##{ticket.number}]", ticket.subject_build('ABC subject test 1'))
- assert_equal("RE: ABC subject test 1 [Ticket##{ticket.number}]", ticket.subject_build('ABC subject test 1', true))
- assert_equal("RE: ABC subject test 1 [Ticket##{ticket.number}]", ticket.subject_build(' ABC subject test 1', true))
- assert_equal("RE: ABC subject test 1 [Ticket##{ticket.number}]", ticket.subject_build('ABC subject test 1 ', true))
+ assert_equal("RE: ABC subject test 1 [Ticket##{ticket.number}]", ticket.subject_build('ABC subject test 1', 'reply'))
+ assert_equal("RE: ABC subject test 1 [Ticket##{ticket.number}]", ticket.subject_build(' ABC subject test 1', 'reply'))
+ assert_equal("RE: ABC subject test 1 [Ticket##{ticket.number}]", ticket.subject_build('ABC subject test 1 ', 'reply'))
+ assert_equal("FWD: ABC subject test 1 [Ticket##{ticket.number}]", ticket.subject_build('ABC subject test 1 ', 'forward'))
ticket.destroy
Setting.set('ticket_hook_position', 'left')
@@ -318,9 +319,10 @@ class TicketTest < ActiveSupport::TestCase
)
assert_equal('subject test 1', ticket.title)
assert_equal("[Ticket##{ticket.number}] ABC subject test 1", ticket.subject_build('ABC subject test 1'))
- assert_equal("RE: [Ticket##{ticket.number}] ABC subject test 1", ticket.subject_build('ABC subject test 1', true))
- assert_equal("RE: [Ticket##{ticket.number}] ABC subject test 1", ticket.subject_build(' ABC subject test 1', true))
- assert_equal("RE: [Ticket##{ticket.number}] ABC subject test 1", ticket.subject_build('ABC subject test 1 ', true))
+ assert_equal("RE: [Ticket##{ticket.number}] ABC subject test 1", ticket.subject_build('ABC subject test 1', 'reply'))
+ assert_equal("RE: [Ticket##{ticket.number}] ABC subject test 1", ticket.subject_build(' ABC subject test 1', 'reply'))
+ assert_equal("RE: [Ticket##{ticket.number}] ABC subject test 1", ticket.subject_build('ABC subject test 1 ', 'reply'))
+ assert_equal("FWD: [Ticket##{ticket.number}] ABC subject test 1", ticket.subject_build('ABC subject test 1 ', 'forward'))
ticket.destroy
Setting.set('ticket_hook_position', 'none')
@@ -336,9 +338,10 @@ class TicketTest < ActiveSupport::TestCase
)
assert_equal('subject test 1', ticket.title)
assert_equal('ABC subject test 1', ticket.subject_build('ABC subject test 1'))
- assert_equal('RE: ABC subject test 1', ticket.subject_build('ABC subject test 1', true))
- assert_equal('RE: ABC subject test 1', ticket.subject_build(' ABC subject test 1', true))
- assert_equal('RE: ABC subject test 1', ticket.subject_build('ABC subject test 1 ', true))
+ assert_equal('RE: ABC subject test 1', ticket.subject_build('ABC subject test 1', 'reply'))
+ assert_equal('RE: ABC subject test 1', ticket.subject_build(' ABC subject test 1', 'reply'))
+ assert_equal('RE: ABC subject test 1', ticket.subject_build('ABC subject test 1 ', 'reply'))
+ assert_equal('FWD: ABC subject test 1', ticket.subject_build('ABC subject test 1 ', 'forward'))
ticket.destroy
end