Added signature support to new and zoom ticket.
This commit is contained in:
parent
f4341f5c4b
commit
1fdc985816
5 changed files with 200 additions and 60 deletions
|
@ -87,6 +87,9 @@ class App.TicketCreate extends App.Controller
|
||||||
# update form
|
# update form
|
||||||
@el.find('[name="formSenderType"]').val(type)
|
@el.find('[name="formSenderType"]').val(type)
|
||||||
|
|
||||||
|
# force changing signature
|
||||||
|
@el.find('[name="group_id"]').trigger('change')
|
||||||
|
|
||||||
meta: =>
|
meta: =>
|
||||||
text = ''
|
text = ''
|
||||||
if @articleAttributes
|
if @articleAttributes
|
||||||
|
@ -168,7 +171,7 @@ class App.TicketCreate extends App.Controller
|
||||||
|
|
||||||
# reset owner
|
# reset owner
|
||||||
t.owner_id = 0
|
t.owner_id = 0
|
||||||
t.customer_id_autocompletion = a.from
|
t.customer_id_completion = a.from
|
||||||
t.subject = a.subject || t.title
|
t.subject = a.subject || t.title
|
||||||
t.body = a.body
|
t.body = a.body
|
||||||
|
|
||||||
|
@ -220,6 +223,35 @@ class App.TicketCreate extends App.Controller
|
||||||
# replace new option list
|
# replace new option list
|
||||||
form.find('[name="' + fieldNameToChange + '"]').closest('.form-group').replaceWith( newElement )
|
form.find('[name="' + fieldNameToChange + '"]').closest('.form-group').replaceWith( newElement )
|
||||||
|
|
||||||
|
signatureChanges = (params, attribute, attributes, classname, form, ui) =>
|
||||||
|
if attribute && attribute.name is 'group_id'
|
||||||
|
signature = undefined
|
||||||
|
if params['group_id']
|
||||||
|
group = App.Group.find( params['group_id'] )
|
||||||
|
if group && group.signature_id
|
||||||
|
signature = App.Signature.find( group.signature_id )
|
||||||
|
|
||||||
|
# check if signature need to be added
|
||||||
|
type = @$('[name="formSenderType"]').val()
|
||||||
|
|
||||||
|
if signature isnt undefined && signature.body && type is 'email-out'
|
||||||
|
signatureFinished = App.Utils.text2html(
|
||||||
|
App.Utils.replaceTags( signature.body, { user: App.Session.get() } )
|
||||||
|
)
|
||||||
|
|
||||||
|
# get current body
|
||||||
|
body = @$('[data-name="body"]').html() || ''
|
||||||
|
if App.Utils.signatureCheck( body, signatureFinished )
|
||||||
|
if !App.Utils.lastLineEmpty(body)
|
||||||
|
body = body + '<br>'
|
||||||
|
body = body + "<div data-signature=\"true\" data-signature-id=\"#{signature.id}\">#{signatureFinished}</div>"
|
||||||
|
|
||||||
|
@$('[data-name="body"]').html(body)
|
||||||
|
|
||||||
|
# remove old signature
|
||||||
|
else
|
||||||
|
@$('[data-name="body"]').find("[data-signature=true]").remove()
|
||||||
|
|
||||||
new App.ControllerForm(
|
new App.ControllerForm(
|
||||||
el: @el.find('.ticket-form-top')
|
el: @el.find('.ticket-form-top')
|
||||||
form_id: @form_id
|
form_id: @form_id
|
||||||
|
@ -228,7 +260,8 @@ class App.TicketCreate extends App.Controller
|
||||||
events:
|
events:
|
||||||
'change [name=customer_id]': @localUserInfo
|
'change [name=customer_id]': @localUserInfo
|
||||||
handlers: [
|
handlers: [
|
||||||
formChanges
|
formChanges,
|
||||||
|
signatureChanges,
|
||||||
]
|
]
|
||||||
filter: @form_meta.filter
|
filter: @form_meta.filter
|
||||||
autofocus: true
|
autofocus: true
|
||||||
|
@ -250,7 +283,8 @@ class App.TicketCreate extends App.Controller
|
||||||
events:
|
events:
|
||||||
'change [name=customer_id]': @localUserInfo
|
'change [name=customer_id]': @localUserInfo
|
||||||
handlers: [
|
handlers: [
|
||||||
formChanges
|
formChanges,
|
||||||
|
signatureChanges,
|
||||||
]
|
]
|
||||||
filter: @form_meta.filter
|
filter: @form_meta.filter
|
||||||
params: params
|
params: params
|
||||||
|
@ -264,7 +298,8 @@ class App.TicketCreate extends App.Controller
|
||||||
events:
|
events:
|
||||||
'change [name=customer_id]': @localUserInfo
|
'change [name=customer_id]': @localUserInfo
|
||||||
handlers: [
|
handlers: [
|
||||||
formChanges
|
formChanges,
|
||||||
|
signatureChanges,
|
||||||
]
|
]
|
||||||
filter: @form_meta.filter
|
filter: @form_meta.filter
|
||||||
params: params
|
params: params
|
||||||
|
@ -330,7 +365,7 @@ class App.TicketCreate extends App.Controller
|
||||||
if sender.name is 'Customer'
|
if sender.name is 'Customer'
|
||||||
params['article'] = {
|
params['article'] = {
|
||||||
to: (group && group.name) || ''
|
to: (group && group.name) || ''
|
||||||
from: params.customer_id_autocompletion
|
from: params.customer_id_completion
|
||||||
cc: params.cc
|
cc: params.cc
|
||||||
subject: params.subject
|
subject: params.subject
|
||||||
body: params.body
|
body: params.body
|
||||||
|
@ -342,7 +377,7 @@ class App.TicketCreate extends App.Controller
|
||||||
else
|
else
|
||||||
params['article'] = {
|
params['article'] = {
|
||||||
from: (group && group.name) || ''
|
from: (group && group.name) || ''
|
||||||
to: params.customer_id_autocompletion
|
to: params.customer_id_completion
|
||||||
cc: params.cc
|
cc: params.cc
|
||||||
subject: params.subject
|
subject: params.subject
|
||||||
body: params.body
|
body: params.body
|
||||||
|
|
|
@ -21,7 +21,6 @@ class App.TicketZoom extends App.Controller
|
||||||
@form_meta = undefined
|
@form_meta = undefined
|
||||||
@ticket_id = params.ticket_id
|
@ticket_id = params.ticket_id
|
||||||
@article_id = params.article_id
|
@article_id = params.article_id
|
||||||
@signature = undefined
|
|
||||||
|
|
||||||
@key = 'ticket::' + @ticket_id
|
@key = 'ticket::' + @ticket_id
|
||||||
cache = App.Store.get( @key )
|
cache = App.Store.get( @key )
|
||||||
|
@ -137,9 +136,6 @@ class App.TicketZoom extends App.Controller
|
||||||
# get edit form attributes
|
# get edit form attributes
|
||||||
@form_meta = data.form_meta
|
@form_meta = data.form_meta
|
||||||
|
|
||||||
# get signature
|
|
||||||
@signature = data.signature
|
|
||||||
|
|
||||||
# load assets
|
# load assets
|
||||||
App.Collection.loadAssets( data.assets )
|
App.Collection.loadAssets( data.assets )
|
||||||
|
|
||||||
|
@ -860,14 +856,15 @@ class Edit extends App.Controller
|
||||||
if data.ticket.id is @ticket.id
|
if data.ticket.id is @ticket.id
|
||||||
#@setArticleType(data.type.name)
|
#@setArticleType(data.type.name)
|
||||||
|
|
||||||
# preselect article type
|
|
||||||
@setArticleType( 'email' )
|
|
||||||
@open_textarea(null, true)
|
@open_textarea(null, true)
|
||||||
for key, value of data.article
|
for key, value of data.article
|
||||||
if key is 'body'
|
if key is 'body'
|
||||||
@$('[data-name="' + key + '"]').html(value)
|
@$('[data-name="' + key + '"]').html(value)
|
||||||
else
|
else
|
||||||
@$('[name="' + key + '"]').val(value)
|
@$('[name="' + key + '"]').val(value)
|
||||||
|
|
||||||
|
# preselect article type
|
||||||
|
@setArticleType( 'email' )
|
||||||
)
|
)
|
||||||
|
|
||||||
isIE10: ->
|
isIE10: ->
|
||||||
|
@ -905,7 +902,7 @@ class Edit extends App.Controller
|
||||||
@$('[data-name="body"]').ce({
|
@$('[data-name="body"]').ce({
|
||||||
mode: 'richtext'
|
mode: 'richtext'
|
||||||
multiline: true
|
multiline: true
|
||||||
maxlength: 2500
|
maxlength: 5000
|
||||||
})
|
})
|
||||||
|
|
||||||
html5Upload.initialize(
|
html5Upload.initialize(
|
||||||
|
@ -1075,10 +1072,29 @@ class Edit extends App.Controller
|
||||||
# show/hide attributes
|
# show/hide attributes
|
||||||
for articleType in @articleTypes
|
for articleType in @articleTypes
|
||||||
if articleType.name is type
|
if articleType.name is type
|
||||||
@$(".form-group").addClass('hide')
|
@$('.form-group').addClass('hide')
|
||||||
for name in articleType.attributes
|
for name in articleType.attributes
|
||||||
@$("[name=#{name}]").closest('.form-group').removeClass('hide')
|
@$("[name=#{name}]").closest('.form-group').removeClass('hide')
|
||||||
|
|
||||||
|
# check if signature need to be added
|
||||||
|
body = @$('[data-name="body"]').html() || ''
|
||||||
|
signature = undefined
|
||||||
|
if @ticket.group.signature_id
|
||||||
|
signature = App.Signature.find( @ticket.group.signature_id )
|
||||||
|
if signature && signature.body && @type is 'email'
|
||||||
|
signatureFinished = App.Utils.text2html(
|
||||||
|
App.Utils.replaceTags( signature.body, { user: App.Session.get(), ticket: @ticket } )
|
||||||
|
)
|
||||||
|
if App.Utils.signatureCheck( body, signatureFinished )
|
||||||
|
if !App.Utils.lastLineEmpty(body)
|
||||||
|
body = body + '<br>'
|
||||||
|
body = body + "<div data-signature=\"true\" data-signature-id=\"#{signature.id}\">#{signatureFinished}</div>"
|
||||||
|
@$('[data-name="body"]').html(body)
|
||||||
|
|
||||||
|
# remove old signature
|
||||||
|
else
|
||||||
|
@$('[data-name="body"]').find("[data-signature=true]").remove()
|
||||||
|
|
||||||
detect_empty_textarea: =>
|
detect_empty_textarea: =>
|
||||||
if !@textarea.text().trim()
|
if !@textarea.text().trim()
|
||||||
@add_textarea_catcher()
|
@add_textarea_catcher()
|
||||||
|
@ -1488,12 +1504,6 @@ class ArticleView extends App.Controller
|
||||||
# get current body
|
# get current body
|
||||||
body = @ui.el.find('[data-name="body"]').html() || ''
|
body = @ui.el.find('[data-name="body"]').html() || ''
|
||||||
|
|
||||||
# check if signature need to be added
|
|
||||||
if @ui.signature && @ui.signature.body && type.name is 'email'
|
|
||||||
signature = App.Utils.text2html( @ui.signature.body )
|
|
||||||
if App.Utils.signatureCheck( body, signature )
|
|
||||||
body = body + signature
|
|
||||||
|
|
||||||
# check if quote need to be added
|
# check if quote need to be added
|
||||||
selectedText = App.ClipBoard.getSelected()
|
selectedText = App.ClipBoard.getSelected()
|
||||||
if selectedText
|
if selectedText
|
||||||
|
|
|
@ -166,3 +166,27 @@ class App.Utils
|
||||||
else
|
else
|
||||||
true
|
true
|
||||||
|
|
||||||
|
# textReplaced = App.Utils.replaceTags( template, { user: { firstname: 'Bob', lastname: 'Smith' } } )
|
||||||
|
@replaceTags: (template, objects) ->
|
||||||
|
template = template.replace( /#\{\s{0,2}(.+?)\s{0,2}\}/g, ( index, key ) ->
|
||||||
|
levels = key.split(/\./)
|
||||||
|
dataRef = objects
|
||||||
|
for level in levels
|
||||||
|
if dataRef[level]
|
||||||
|
dataRef = dataRef[level]
|
||||||
|
if typeof dataRef is 'function'
|
||||||
|
value = dataRef()
|
||||||
|
else if typeof dataRef is 'string'
|
||||||
|
value = dataRef
|
||||||
|
else
|
||||||
|
value = ''
|
||||||
|
#console.log( "tag replacement #{key}, #{value} env: ", objects)
|
||||||
|
value
|
||||||
|
)
|
||||||
|
|
||||||
|
# true|false = App.Utils.lastLineEmpty( message )
|
||||||
|
@lastLineEmpty: (message) ->
|
||||||
|
messageCleanup = message.replace(/>\s+</g, '><').replace(/(\n|\r|\t)/g, '').trim()
|
||||||
|
return true if messageCleanup.match(/<(br|\s+?|\/)>$/im)
|
||||||
|
return true if messageCleanup.match(/<div(|\s.+?)><\/div>$/im)
|
||||||
|
false
|
||||||
|
|
|
@ -228,22 +228,6 @@ class TicketsController < ApplicationController
|
||||||
ticket = Ticket.find( params[:id] )
|
ticket = Ticket.find( params[:id] )
|
||||||
return if !ticket_permission( ticket )
|
return if !ticket_permission( ticket )
|
||||||
|
|
||||||
# get signature
|
|
||||||
signature = {}
|
|
||||||
if ticket.group.signature
|
|
||||||
signature = ticket.group.signature.attributes
|
|
||||||
|
|
||||||
# replace tags
|
|
||||||
signature['body'] = NotificationFactory.build(
|
|
||||||
:locale => current_user.preferences[:locale],
|
|
||||||
:string => signature['body'],
|
|
||||||
:objects => {
|
|
||||||
:ticket => ticket,
|
|
||||||
:user => current_user,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
# get attributes to update
|
# get attributes to update
|
||||||
attributes_to_change = Ticket::ScreenOptions.attributes_to_change( :user => current_user, :ticket => ticket )
|
attributes_to_change = Ticket::ScreenOptions.attributes_to_change( :user => current_user, :ticket => ticket )
|
||||||
|
|
||||||
|
@ -292,7 +276,6 @@ class TicketsController < ApplicationController
|
||||||
render :json => {
|
render :json => {
|
||||||
:ticket_id => ticket.id,
|
:ticket_id => ticket.id,
|
||||||
:ticket_article_ids => article_ids,
|
:ticket_article_ids => article_ids,
|
||||||
:signature => signature,
|
|
||||||
:assets => assets,
|
:assets => assets,
|
||||||
:links => link_list,
|
:links => link_list,
|
||||||
:tags => tags,
|
:tags => tags,
|
||||||
|
|
|
@ -439,4 +439,92 @@ test( "check signature", function() {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// replace tags
|
||||||
|
test( "check replace tags", function() {
|
||||||
|
|
||||||
|
var message = "<div>#{user.firstname} #{user.lastname}</div>"
|
||||||
|
var result = '<div>Bob Smith</div>'
|
||||||
|
var data = {
|
||||||
|
user: {
|
||||||
|
firstname: 'Bob',
|
||||||
|
lastname: 'Smith',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
var verify = App.Utils.replaceTags( message, data )
|
||||||
|
equal( verify, result )
|
||||||
|
|
||||||
|
message = "<div>#{user.firstname} #{user.lastname}</div>"
|
||||||
|
result = '<div>Bob Smith</div>'
|
||||||
|
data = {
|
||||||
|
user: {
|
||||||
|
firstname: function() { return 'Bob' },
|
||||||
|
lastname: function() { return 'Smith' },
|
||||||
|
},
|
||||||
|
}
|
||||||
|
verify = App.Utils.replaceTags( message, data )
|
||||||
|
equal( verify, result )
|
||||||
|
|
||||||
|
message = "<div>#{user.firstname} #{user.lastname}</div>"
|
||||||
|
result = '<div>Bob </div>'
|
||||||
|
data = {
|
||||||
|
user: {
|
||||||
|
firstname: 'Bob',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
verify = App.Utils.replaceTags( message, data )
|
||||||
|
equal( verify, result )
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
// check if last line is a empty line
|
||||||
|
test( "check if last line is a empty line", function() {
|
||||||
|
|
||||||
|
var message = "123"
|
||||||
|
var result = false
|
||||||
|
var verify = App.Utils.lastLineEmpty( message )
|
||||||
|
equal( verify, result, message )
|
||||||
|
|
||||||
|
message = "<div>123</div>"
|
||||||
|
result = false
|
||||||
|
verify = App.Utils.lastLineEmpty( message )
|
||||||
|
equal( verify, result, message )
|
||||||
|
|
||||||
|
message = "<p><div>123 </div></p>"
|
||||||
|
result = false
|
||||||
|
verify = App.Utils.lastLineEmpty( message )
|
||||||
|
equal( verify, result, message )
|
||||||
|
|
||||||
|
message = "<div></div>"
|
||||||
|
result = true
|
||||||
|
verify = App.Utils.lastLineEmpty( message )
|
||||||
|
equal( verify, result, message )
|
||||||
|
|
||||||
|
message = "<div class=\"some_class\"></div>"
|
||||||
|
result = true
|
||||||
|
verify = App.Utils.lastLineEmpty( message )
|
||||||
|
equal( verify, result, message )
|
||||||
|
|
||||||
|
message = "<div class=\"some_class\"></div> "
|
||||||
|
result = true
|
||||||
|
verify = App.Utils.lastLineEmpty( message )
|
||||||
|
equal( verify, result, message )
|
||||||
|
|
||||||
|
message = "<div class=\"some_class\"></div> \n \n\t"
|
||||||
|
result = true
|
||||||
|
verify = App.Utils.lastLineEmpty( message )
|
||||||
|
equal( verify, result, message )
|
||||||
|
|
||||||
|
message = "<div class=\"some_class\"> </div> \n \n\t"
|
||||||
|
result = true
|
||||||
|
verify = App.Utils.lastLineEmpty( message )
|
||||||
|
equal( verify, result, message )
|
||||||
|
|
||||||
|
message = "<div class=\"some_class\"\n> \n</div> \n \n\t"
|
||||||
|
result = true
|
||||||
|
verify = App.Utils.lastLineEmpty( message )
|
||||||
|
equal( verify, result, message )
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in a new issue