diff --git a/app/assets/javascripts/app/controllers/agent_ticket_zoom.js.coffee b/app/assets/javascripts/app/controllers/agent_ticket_zoom.js.coffee index 70bfb12b6..1e886fe95 100644 --- a/app/assets/javascripts/app/controllers/agent_ticket_zoom.js.coffee +++ b/app/assets/javascripts/app/controllers/agent_ticket_zoom.js.coffee @@ -7,9 +7,6 @@ class Index extends App.Controller # 'click [data-type=reply-all]': 'replyall', 'click [data-type=public]': 'public_internal', 'click [data-type=internal]': 'public_internal', - 'click [data-type=history]': 'history_dialog', - 'click [data-type=merge]': 'merge_dialog', - 'click [data-type=customer]': 'customer_dialog', 'change [name="ticket_article_type_id"]': 'form_update', 'click .show_toogle': 'show_toogle', @@ -70,8 +67,7 @@ class Index extends App.Controller render: => - if !App.Ticket.exists(@ticket_id) - return + return if !App.Ticket.exists(@ticket_id) # get data if !@ticket @@ -80,103 +76,27 @@ class Index extends App.Controller @articles = [] for article_id in @ticket.article_ids article = App.TicketArticle.find(article_id) - - # build html body - # cleanup body - article['html'] = article.body.trim() - article['html'].replace(/\n\r/g, "\n"); - article['html'].replace(/\n\n\n/g, "\n\n"); - - # if body has more then x lines / else search for signature - preview = 15 - preview_mode = false - article_lines = article['html'].split(/\n/) - if article_lines.length > preview - preview_mode = true - if article_lines[preview] is '' - article_lines.splice( preview, 0, '----SEEMORE----' ) - else - article_lines.splice( preview + 1, 0, '----SEEMORE----' ) - article['html'] = article_lines.join("\n") - article['html'] = window.linkify( article['html'] ) - notify = '' + T('See more') + '' - - # preview mode - if preview_mode - @article_changed = false - article['html'] = article['html'].replace /^\n{0,10}----SEEMORE----\n/m, (match) => - @article_changed = true - notify + '
' - if @article_changed - article['html'] = article['html'] + '
' - - # hide signatures and so on - else - @article_changed = false - article['html'] = article['html'].replace /^\n{0,10}(--|__)/m, (match) => - @article_changed = true - notify + '
' + match - if @article_changed - article['html'] = article['html'] + '
' - @articles.push article - # check attachments + # rework articles for article in @articles - if article.attachments - for attachment in article.attachments - attachment.size = @humanFileSize(attachment.size) - - # define actions - for article in @articles - actions = [] - if article.internal is true - actions = [ - { - name: 'set to public', - type: 'public', - } - ] - else - actions = [ - { - name: 'set to internal', - type: 'internal', - } - ] - if article.article_type.name is 'note' -# actions.push [] - else - if article.article_sender.name is 'Customer' - actions.push { - name: 'reply', - type: 'reply', - href: '#', - } - actions.push { - name: 'reply all', - type: 'reply-all', - href: '#', - } - actions.push { - name: 'split', - type: 'split', - href: '#ticket_create/' + article.ticket_id + '/' + article.id, - } - article.actions = actions + new Article( article: article ) # set title @title 'Ticket Zoom ' + @ticket.number - @configure_attributes_ticket = [ { name: 'ticket_state_id', display: 'State', tag: 'select', multiple: false, null: true, relation: 'TicketState', translate: true, class: 'span2', item_class: 'keepleft' }, { name: 'ticket_priority_id', display: 'Priority', tag: 'select', multiple: false, null: true, relation: 'TicketPriority', translate: true, class: 'span2', item_class: 'keepleft' }, { name: 'group_id', display: 'Group', tag: 'select', multiple: false, null: true, relation: 'Group', class: 'span2', item_class: 'keepleft' }, { name: 'owner_id', display: 'Owner', tag: 'select', multiple: false, null: true, relation: 'User', filter: @edit_form, nulloption: true, class: 'span2', item_class: 'keepleft' }, ] - form_ticket = @formGen( model: { configure_attributes: @configure_attributes_ticket, className: 'create' }, params: @ticket ) + if @isRole('Customer') + @configure_attributes_ticket = [ + { name: 'ticket_state_id', display: 'State', tag: 'select', multiple: false, null: true, relation: 'TicketState', translate: true, class: 'span2', item_class: 'keepleft' }, + { name: 'ticket_priority_id', display: 'Priority', tag: 'select', multiple: false, null: true, relation: 'TicketPriority', translate: true, class: 'span2', item_class: 'keepleft' }, + ] + @configure_attributes_article = [ -# { name: 'from', display: 'From', tag: 'input', type: 'text', limit: 100, null: false, class: 'span8', }, { name: 'ticket_article_type_id', display: 'Type', tag: 'select', multiple: false, null: true, relation: 'TicketArticleType', default: '9', translate: true, class: 'medium', item_class: '' }, { name: 'to', display: 'To', tag: 'input', type: 'text', limit: 100, null: true, class: 'span7', item_class: 'hide' }, { name: 'cc', display: 'Cc', tag: 'input', type: 'text', limit: 100, null: true, class: 'span7', item_class: 'hide' }, @@ -184,10 +104,19 @@ class Index extends App.Controller { name: 'in_reply_to', display: 'In Reply to', tag: 'input', type: 'text', limit: 100, null: true, class: 'span7', item_class: 'hide' }, { name: 'body', display: 'Text', tag: 'textarea', rows: 5, limit: 100, null: true, class: 'span7', item_class: '' }, { name: 'internal', display: 'Visability', tag: 'select', default: false, null: true, options: { true: 'internal', false: 'public' }, class: 'medium', item_class: '' }, -# { name: 'ticket_article_sender_id', display: 'Sender', tag: 'select', multiple: false, null: true, relation: 'TicketArticleSender', default: '', class: 'medium' }, ] + if @isRole('Customer') + @configure_attributes_article = [ + { name: 'to', display: 'To', tag: 'input', type: 'text', limit: 100, null: true, class: 'span7', item_class: 'hide' }, + { name: 'cc', display: 'Cc', tag: 'input', type: 'text', limit: 100, null: true, class: 'span7', item_class: 'hide' }, + { name: 'subject', display: 'Subject', tag: 'input', type: 'text', limit: 100, null: true, class: 'span7', item_class: 'hide' }, + { name: 'in_reply_to', display: 'In Reply to', tag: 'input', type: 'text', limit: 100, null: true, class: 'span7', item_class: 'hide' }, + { name: 'body', display: 'Text', tag: 'textarea', rows: 5, limit: 100, null: true, class: 'span7', item_class: '' }, + ] + + form_ticket = @formGen( model: { configure_attributes: @configure_attributes_ticket, className: 'create' }, params: @ticket ) form_article = @formGen( model: { configure_attributes: @configure_attributes_article } ) - + @html App.view('agent_ticket_zoom')( ticket: @ticket, articles: @articles, @@ -198,21 +127,11 @@ class Index extends App.Controller @el.find('textarea').elastic() + # enable user popups @userPopups() - - # start customer info controller - new App.UserInfo( - el: @el.find('#customer_info'), - user_id: @ticket.customer_id, - ticket: @ticket, - ) - # start link info controller - new App.LinkInfo( - el: @el.find('#link_info'), - object_type: 'Ticket', - object: @ticket, - ) + # show ticket action row + @ticket_action_row() # scrall to article if given if @article_id @@ -223,7 +142,7 @@ class Index extends App.Controller @delay( scrollTo, 100 ) @delay(@u, 200) - + u: => uploader = new qq.FileUploader( element: document.getElementById('file-uploader'), @@ -235,6 +154,32 @@ class Index extends App.Controller debug: false ) + ticket_action_row: => + + # start customer info controller + if !@isRole('Customer') + new App.UserInfo( + el: @el.find('#customer_info'), + user_id: @ticket.customer_id, + ticket: @ticket, + ) + + # start action controller + if !@isRole('Customer') + new TicketActionRow( + el: @el.find('#action_info'), + ticket: @ticket, + zoom: @, + ) + + # start link info controller + if !@isRole('Customer') + new App.LinkInfo( + el: @el.find('#link_info'), + object_type: 'Ticket', + object: @ticket, + ) + show_toogle: (e) -> e.preventDefault() $(e.target).hide() @@ -243,18 +188,6 @@ class Index extends App.Controller else $(e.target).parent().next('div').show() - history_dialog: (e) -> - e.preventDefault() - new App.TicketHistory( ticket_id: @ticket_id ) - - merge_dialog: (e) -> - e.preventDefault() - new App.TicketMerge( ticket_id: @ticket_id ) - - customer_dialog: (e) -> - e.preventDefault() - new App.TicketCustomer( ticket_id: @ticket_id, zoom: @ ) - public_internal: (e) -> e.preventDefault() article_id = $(e.target).parents('[data-id]').data('id') @@ -376,8 +309,9 @@ class Index extends App.Controller ticket_update[item.name] = params[item.name] # check owner assignment - if !ticket_update['owner_id'] - ticket_update['owner_id'] = 1 + if !@isRole('Customer') + if !ticket_update['owner_id'] + ticket_update['owner_id'] = 1 @ticket.load( ticket_update ) @log 'update ticket', ticket_update, @ticket @@ -393,25 +327,161 @@ class Index extends App.Controller article = new App.TicketArticle params.from = window.Session['firstname'] + ' ' + window.Session['lastname'] params.ticket_id = @ticket.id - + if !params['internal'] + params['internal'] = false + # find sender_id - sender = App.TicketArticleSender.findByAttribute("name", "Agent") + if @isRole('Customer') + sender = App.TicketArticleSender.findByAttribute( 'name', 'Customer' ) + type = App.TicketArticleType.findByAttribute( 'name', 'web' ) + params['ticket_article_type_id'] = type.id + else + sender = App.TicketArticleSender.findByAttribute( 'name', 'Agent' ) params.ticket_article_sender_id = sender.id @log 'updateAttributes', params, sender, sender.id article.load(params) + errors = article.validate() + if errors + @log 'error new article', errors article.save( success: (r) => @fetch(@ticket.id) + error: (r) => + @log 'error', r ) else @fetch(@ticket.id) ) - + # errors = article.validate() # @log 'error new', errors # @validateForm( form: e.target, errors: errors ) return false +class Article extends App.Controller + constructor: -> + super + + # define actions + @actionRow() + + # check attachments + @attachments() + + # html rework + @preview() + + preview: -> + + # build html body + # cleanup body + @article['html'] = @article.body.trim() + @article['html'].replace(/\n\r/g, "\n") + @article['html'].replace(/\n\n\n/g, "\n\n") + + # if body has more then x lines / else search for signature + preview = 15 + preview_mode = false + article_lines = @article['html'].split(/\n/) + if article_lines.length > preview + preview_mode = true + if article_lines[preview] is '' + article_lines.splice( preview, 0, '----SEEMORE----' ) + else + article_lines.splice( preview + 1, 0, '----SEEMORE----' ) + @article['html'] = article_lines.join("\n") + @article['html'] = window.linkify( @article['html'] ) + notify = '' + T('See more') + '' + + # preview mode + if preview_mode + @article_changed = false + @article['html'] = @article['html'].replace /^\n{0,10}----SEEMORE----\n/m, (match) => + @article_changed = true + notify + '
' + if @article_changed + @article['html'] = @article['html'] + '
' + + # hide signatures and so on + else + @article_changed = false + @article['html'] = @article['html'].replace /^\n{0,10}(--|__)/m, (match) => + @article_changed = true + notify + '
' + match + if @article_changed + @article['html'] = @article['html'] + '
' + + + actionRow: -> + if @isRole('Customer') + @article.actions = [] + return + + actions = [] + if @article.internal is true + actions = [ + { + name: 'set to public', + type: 'public', + } + ] + else + actions = [ + { + name: 'set to internal', + type: 'internal', + } + ] + if @article.article_type.name is 'note' +# actions.push [] + else + if @article.article_sender.name is 'Customer' + actions.push { + name: 'reply', + type: 'reply', + href: '#', + } + actions.push { + name: 'reply all', + type: 'reply-all', + href: '#', + } + actions.push { + name: 'split', + type: 'split', + href: '#ticket_create/' + @article.ticket_id + '/' + @article.id, + } + @article.actions = actions + + attachments: -> + if @article.attachments + for attachment in @article.attachments + attachment.size = @humanFileSize(attachment.size) + +class TicketActionRow extends App.Controller + events: + 'click [data-type=history]': 'history_dialog', + 'click [data-type=merge]': 'merge_dialog', + 'click [data-type=customer]': 'customer_dialog', + + constructor: -> + super + @render() + + render: -> + @html App.view('ticket_action')() + + history_dialog: (e) -> + e.preventDefault() + new App.TicketHistory( ticket_id: @ticket.id ) + + merge_dialog: (e) -> + e.preventDefault() + new App.TicketMerge( ticket_id: @ticket.id ) + + customer_dialog: (e) -> + e.preventDefault() + new App.TicketCustomer( ticket_id: @ticket.id, zoom: @zoom ) Config.Routes['ticket/zoom/:ticket_id'] = Index Config.Routes['ticket/zoom/:ticket_id/nav/:nav'] = Index