diff --git a/app/assets/javascripts/app/controllers/customer_ticket_new.js.coffee b/app/assets/javascripts/app/controllers/customer_ticket_new.js.coffee new file mode 100644 index 000000000..111204f79 --- /dev/null +++ b/app/assets/javascripts/app/controllers/customer_ticket_new.js.coffee @@ -0,0 +1,181 @@ +$ = jQuery.sub() + +class Index extends App.Controller + events: + 'submit form': 'submit', + 'click .submit': 'submit', + 'click .cancel': 'cancel', + + constructor: (params) -> + super + + # check authentication + return if !@authenticate() + + # set title + @title 'New Ticket' + @fetch(params) + @navupdate '#customer_ticket_new' + + @edit_form = undefined + + # get data / in case also ticket data for split + fetch: (params) -> + + # use cache + cache = App.Store.get( 'ticket_create_attributes' ) + + if cache && !params.ticket_id && !params.article_id + + # get edit form attributes + @edit_form = cache.edit_form + + # load user collection + @loadCollection( type: 'User', data: cache.users ) + + @render() + else + App.Com.ajax( + id: 'ticket_create', + type: 'GET', + url: '/ticket_create', + data: { + ticket_id: params.ticket_id, + article_id: params.article_id, + }, + processData: true, + success: (data, status, xhr) => + + # cache request + App.Store.write( 'ticket_create_attributes', data ) + + # get edit form attributes + @edit_form = data.edit_form + + # load user collection + @loadCollection( type: 'User', data: data.users ) + + # load ticket collection + if data.ticket && data.articles + @loadCollection( type: 'Ticket', data: [data.ticket] ) + + # load article collections + @loadCollection( type: 'TicketArticle', data: data.articles || [] ) + + # render page + t = App.Ticket.find(params.ticket_id).attributes() + a = App.TicketArticle.find(params.article_id) + + # reset owner + t.owner_id = 0 + t.customer_id_autocompletion = a.from + t.subject = a.subject || t.title + t.body = a.body + @log '11111', t + @render( options: t ) + ) + + render: (template = {}) -> + + # set defaults + defaults = template['options'] || {} + if !( 'ticket_state_id' of defaults ) + defaults['ticket_state_id'] = App.TicketState.findByAttribute( 'name', 'new' ) + if !( 'ticket_priority_id' of defaults ) + defaults['ticket_priority_id'] = App.TicketPriority.findByAttribute( 'name', '2 normal' ) + + # generate form + configure_attributes = [ +# { name: 'customer_id', display: 'Customer', tag: 'autocompletion', type: 'text', limit: 100, null: false, relation: 'User', class: 'span7', autocapitalize: false, help: 'Select the customer of the Ticket or create one.', link: '»', callback: @userInfo }, + { name: 'group_id', display: 'Group', tag: 'select', multiple: false, null: false, filter: @edit_form, nulloption: true, relation: 'Group', default: defaults['group_id'], class: 'span7', }, +# { name: 'owner_id', display: 'Owner', tag: 'select', multiple: false, null: true, filter: @edit_form, nulloption: true, relation: 'User', default: defaults['owner_id'], class: 'span7', }, + { name: 'subject', display: 'Subject', tag: 'input', type: 'text', limit: 100, null: false, default: defaults['subject'], class: 'span7', }, + { name: 'body', display: 'Text', tag: 'textarea', rows: 10, null: false, default: defaults['body'], class: 'span7', }, +# { name: 'ticket_state_id', display: 'State', tag: 'select', multiple: false, null: false, filter: @edit_form, relation: 'TicketState', default: defaults['ticket_state_id'], translate: true, class: 'medium' }, +# { name: 'ticket_priority_id', display: 'Priority', tag: 'select', multiple: false, null: false, filter: @edit_form, relation: 'TicketPriority', default: defaults['ticket_priority_id'], translate: true, class: 'medium' }, + ] + @html App.view('agent_ticket_create')( + head: 'New Ticket', + form: @formGen( model: { configure_attributes: configure_attributes, className: 'create' } ), + ) + + # add elastic to textarea + @el.find('textarea').elastic() + + # update textarea size + @el.find('textarea').trigger('change') + + cancel: -> + @render() + + submit: (e) -> + e.preventDefault() + + # get params + params = @formParam(e.target) + + # set customer id + params.customer_id = Session['id'] + + # set prio + priority = App.TicketPriority.findByAttribute( 'name', '2 normal' ) + params.ticket_state_id = priority.id + + # set state + state = App.TicketState.findByAttribute( 'name', 'new' ) + params.ticket_priority_id = state.id + + # fillup params + if !params.title + params.title = params.subject + + # create ticket + object = new App.Ticket + @log 'updateAttributes', params + + # find sender_id + sender = App.TicketArticleSender.findByAttribute( 'name', 'Customer' ) + type = App.TicketArticleType.findByAttribute( 'name', 'web' ) + if params.group_id + group = App.Group.find(params.group_id) + + # create article + params['article'] = { + from: "#{Session['firstname']} #{Session['lastname']}", + to: (group && group.name) || '', + subject: params.subject, + body: params.body, + ticket_article_type_id: type.id, + ticket_article_sender_id: sender.id, + created_by_id: Session['id'], + } +# console.log('params', params) + + object.load(params) + + # validate form + errors = object.validate() + + # show errors in form + if errors + @log 'error new', errors + @validateForm( form: e.target, errors: errors ) + + # save ticket, create article + else + + # disable form + @formDisable(e) + ui = @ + object.save( + success: -> + + # redirect to zoom + ui.navigate '#ticket/zoom/' + this.id + + error: -> + ui.log 'save failed!' + ui.formEnable(e) + ) + +Config.Routes['customer_ticket_new'] = Index diff --git a/app/assets/javascripts/app/controllers/customer_tickets.js.coffee b/app/assets/javascripts/app/controllers/customer_tickets.js.coffee new file mode 100644 index 000000000..a5dc9e28a --- /dev/null +++ b/app/assets/javascripts/app/controllers/customer_tickets.js.coffee @@ -0,0 +1,199 @@ +$ = jQuery.sub() + +class Index extends App.Controller + events: + 'submit form': 'submit', + 'click .submit': 'submit', + 'click .cancel': 'cancel', + + constructor: (params) -> + super + + # check authentication + return if !@authenticate() + + # set title + @title 'My Tickets' + @fetch(params) + @navupdate '#customer_tickets' + + @edit_form = undefined + + # lisen if view need to be rerendert + Spine.bind 'ticket_create_rerender', (defaults) => + @log 'rerender', defaults + @render(defaults) + + # get data / in case also ticket data for split + fetch: (params) -> + + # use cache + cache = App.Store.get( 'ticket_create_attributes' ) + + if cache && !params.ticket_id && !params.article_id + + # get edit form attributes + @edit_form = cache.edit_form + + # load user collection + @loadCollection( type: 'User', data: cache.users ) + + @render() + else + App.Com.ajax( + id: 'ticket_create', + type: 'GET', + url: '/ticket_create', + data: { + ticket_id: params.ticket_id, + article_id: params.article_id, + }, + processData: true, + success: (data, status, xhr) => + + # cache request + App.Store.write( 'ticket_create_attributes', data ) + + # get edit form attributes + @edit_form = data.edit_form + + # load user collection + @loadCollection( type: 'User', data: data.users ) + + # load ticket collection + if data.ticket && data.articles + @loadCollection( type: 'Ticket', data: [data.ticket] ) + + # load article collections + @loadCollection( type: 'TicketArticle', data: data.articles || [] ) + + # render page + t = App.Ticket.find(params.ticket_id).attributes() + a = App.TicketArticle.find(params.article_id) + + # reset owner + t.owner_id = 0 + t.customer_id_autocompletion = a.from + t.subject = a.subject || t.title + t.body = a.body + @log '11111', t + @render( options: t ) + ) + + render: (template = {}) -> + + # set defaults + defaults = template['options'] || {} + if !( 'ticket_state_id' of defaults ) + defaults['ticket_state_id'] = App.TicketState.findByAttribute( 'name', 'new' ) + if !( 'ticket_priority_id' of defaults ) + defaults['ticket_priority_id'] = App.TicketPriority.findByAttribute( 'name', '2 normal' ) + + # remember customers + if $('#create_customer_id').val() + defaults['customer_id'] = $('#create_customer_id').val() + defaults['customer_id_autocompletion'] = $('#create_customer_id_autocompletion').val() + else +# defaults['customer_id'] = '2' +# defaults['customer_id_autocompletion'] = '12312313' + + # generate form + configure_attributes = [ +# { name: 'customer_id', display: 'Customer', tag: 'autocompletion', type: 'text', limit: 100, null: false, relation: 'User', class: 'span7', autocapitalize: false, help: 'Select the customer of the Ticket or create one.', link: '»', callback: @userInfo }, + { name: 'group_id', display: 'Group', tag: 'select', multiple: false, null: false, filter: @edit_form, nulloption: true, relation: 'Group', default: defaults['group_id'], class: 'span7', }, +# { name: 'owner_id', display: 'Owner', tag: 'select', multiple: false, null: true, filter: @edit_form, nulloption: true, relation: 'User', default: defaults['owner_id'], class: 'span7', }, + { name: 'subject', display: 'Subject', tag: 'input', type: 'text', limit: 100, null: false, default: defaults['subject'], class: 'span7', }, + { name: 'body', display: 'Text', tag: 'textarea', rows: 10, null: false, default: defaults['body'], class: 'span7', }, +# { name: 'ticket_state_id', display: 'State', tag: 'select', multiple: false, null: false, filter: @edit_form, relation: 'TicketState', default: defaults['ticket_state_id'], translate: true, class: 'medium' }, +# { name: 'ticket_priority_id', display: 'Priority', tag: 'select', multiple: false, null: false, filter: @edit_form, relation: 'TicketPriority', default: defaults['ticket_priority_id'], translate: true, class: 'medium' }, + ] + @html App.view('agent_ticket_create')( + head: 'My Ticket', + form: @formGen( model: { configure_attributes: configure_attributes, className: 'create' } ), + ) + + # add elastic to textarea + @el.find('textarea').elastic() + + # update textarea size + @el.find('textarea').trigger('change') + + # start customer info controller + if defaults['customer_id'] + $('#create_customer_id').val( defaults['customer_id'] ) + $('#create_customer_id_autocompletion').val( defaults['customer_id_autocompletion'] ) + @userInfo( user_id: defaults['customer_id'] ) + + cancel: -> + @render() + + submit: (e) -> + e.preventDefault() + + # get params + params = @formParam(e.target) + + # fillup params + if !params.title + params.title = params.subject + + # create ticket + object = new App.Ticket + @log 'updateAttributes', params + + # find sender_id + sender = App.TicketArticleSender.findByAttribute( 'name', 'Customer' ) + type = App.TicketArticleType.findByAttribute( 'name', 'phone' ) + if params.group_id + group = App.Group.find(params.group_id) + + # create article + params['article'] = { + from: params.customer_id_autocompletion, + to: (group && group.name) || '', + subject: params.subject, + body: params.body, + ticket_article_type_id: type.id, + ticket_article_sender_id: sender.id, + created_by_id: params.customer_id, + } +# console.log('params', params) + + object.load(params) + + # validate form + errors = object.validate() + + # show errors in form + if errors + @log 'error new', errors + @validateForm( form: e.target, errors: errors ) + + # save ticket, create article + else + + # disable form + @formDisable(e) + ui = @ + object.save( + success: -> + + # notify UI + ui.notify + type: 'success', + msg: T('Ticket %s created!', @.number), + link: "#ticket/zoom/#{@.id}" + timeout: 12000, + + # create new create screen + ui.render() + + # scroll to top + ui.scrollTo() + + error: -> + ui.log 'save failed!' + ui.formEnable(e) + ) + +Config.Routes['customer_tickets'] = Index