From 12fc2adc3ea87bffbf216693b67360a15c811d6c Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Mon, 22 Sep 2014 17:47:33 +0200 Subject: [PATCH 1/3] Improved loading content performance (reduced count of http requests). --- .../app/controllers/ticket_zoom.js.coffee | 11 +++++++++- .../app/controllers/widget/link.js.coffee | 7 +++++- .../app/controllers/widget/tag.js.coffee | 5 +++++ .../app/models/_application_model.js.coffee | 6 ++++- app/controllers/tickets_controller.rb | 22 +++++++++++++++++++ 5 files changed, 48 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/app/controllers/ticket_zoom.js.coffee b/app/assets/javascripts/app/controllers/ticket_zoom.js.coffee index dd8bbbcce..f1c7ab297 100644 --- a/app/assets/javascripts/app/controllers/ticket_zoom.js.coffee +++ b/app/assets/javascripts/app/controllers/ticket_zoom.js.coffee @@ -110,6 +110,12 @@ class App.TicketZoom extends App.Controller # remember article ids @ticket_article_ids = data.ticket_article_ids + # remember link + @links = data.links + + # remember tags + @tags = data.tags + # get edit form attributes @form_meta = data.form_meta @@ -263,7 +269,8 @@ class TicketInfo extends App.ControllerDrox new App.WidgetTag( el: @el.find('.tag_info') object_type: 'Ticket' - object: ticket + object: ticket + tags: @tags ) release: => @@ -283,6 +290,7 @@ class Widgets extends App.Controller new TicketInfo( ticket: ticket el: @el.find('.ticket_info') + tags: @ui.tags ) # start customer info controller @@ -299,6 +307,7 @@ class Widgets extends App.Controller el: @el.find('.link_info') object_type: 'Ticket' object: ticket + links: @ui.links ) # show frontend times diff --git a/app/assets/javascripts/app/controllers/widget/link.js.coffee b/app/assets/javascripts/app/controllers/widget/link.js.coffee index 5169c696a..eff942953 100644 --- a/app/assets/javascripts/app/controllers/widget/link.js.coffee +++ b/app/assets/javascripts/app/controllers/widget/link.js.coffee @@ -6,7 +6,12 @@ class App.WidgetLink extends App.ControllerDrox constructor: -> super - @fetch() + + # if links are given, do not init fetch + if @links + @render() + else + @fetch() fetch: => # fetch item on demand diff --git a/app/assets/javascripts/app/controllers/widget/tag.js.coffee b/app/assets/javascripts/app/controllers/widget/tag.js.coffee index c8af24e8d..37e657813 100644 --- a/app/assets/javascripts/app/controllers/widget/tag.js.coffee +++ b/app/assets/javascripts/app/controllers/widget/tag.js.coffee @@ -3,6 +3,11 @@ class App.WidgetTag extends App.Controller super @attribute_id = 'tags_' + @object.id + '_' + @object_type + + if @tags + @render(@tags) + return + tags = App.Store.get( "tags::#{@attribute_id}" ) if tags @render( tags ) diff --git a/app/assets/javascripts/app/models/_application_model.js.coffee b/app/assets/javascripts/app/models/_application_model.js.coffee index 4eda4c77f..64260358d 100644 --- a/app/assets/javascripts/app/models/_application_model.js.coffee +++ b/app/assets/javascripts/app/models/_application_model.js.coffee @@ -162,6 +162,7 @@ class App.Model extends Spine.Model attribute[item] = value attributesNew[ attribute.name ] = attribute + # if no screen is given or no attribute has this screen - use default attributes if !screen || _.isEmpty( attributesNew ) console.log(attributesNew) for attribute in attributes @@ -327,8 +328,11 @@ class App.Model extends Spine.Model # fetch init collection if param.initFetch is true @one 'refresh', (collection) => + @initFetchActive = false callback(collection) - @fetch( {}, { clear: true } ) + if !@initFetchActive + @initFetchActive = true + @fetch( {}, { clear: true } ) # return key key diff --git a/app/controllers/tickets_controller.rb b/app/controllers/tickets_controller.rb index 69a619abf..06a3a4911 100644 --- a/app/controllers/tickets_controller.rb +++ b/app/controllers/tickets_controller.rb @@ -279,12 +279,34 @@ class TicketsController < ApplicationController assets = article.assets(assets) } + # get links + links = Link.list( + :link_object => 'Ticket', + :link_object_value => ticket.id, + ) + link_list = [] + links.each { |item| + link_list.push item + if item['link_object'] == 'Ticket' + ticket = Ticket.lookup( :id => item['link_object_value'] ) + assets = ticket.assets(assets) + end + } + + # get tags + tags = Tag.tag_list( + :object => 'Ticket', + :o_id => ticket.id, + ) + # return result render :json => { :ticket_id => ticket.id, :ticket_article_ids => article_ids, :signature => signature, :assets => assets, + :links => link_list, + :tags => tags, :form_meta => attributes_to_change, :edit_form => attributes_to_change, } From 24d9c523c4ea4151432cb934efa5a21e9dfc488d Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Mon, 22 Sep 2014 19:36:18 +0200 Subject: [PATCH 2/3] Improved initFetch behaviour. --- .../javascripts/app/models/_application_model.js.coffee | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/app/models/_application_model.js.coffee b/app/assets/javascripts/app/models/_application_model.js.coffee index 64260358d..1b412bbe4 100644 --- a/app/assets/javascripts/app/models/_application_model.js.coffee +++ b/app/assets/javascripts/app/models/_application_model.js.coffee @@ -327,12 +327,13 @@ class App.Model extends Spine.Model # fetch init collection if param.initFetch is true - @one 'refresh', (collection) => - @initFetchActive = false - callback(collection) if !@initFetchActive - @initFetchActive = true + @one 'refresh', (collection) => + @initFetchActive = true + callback(collection) @fetch( {}, { clear: true } ) + else + callback( @all() ) # return key key From ac44bd70d3a883dcbca21fcba80b160ab7977e49 Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Tue, 23 Sep 2014 07:37:43 +0200 Subject: [PATCH 3/3] Improved performance of ticket update. --- .../app/controllers/ticket_zoom.js.coffee | 18 +--- app/controllers/tickets_controller.rb | 86 +++++++++++-------- 2 files changed, 52 insertions(+), 52 deletions(-) diff --git a/app/assets/javascripts/app/controllers/ticket_zoom.js.coffee b/app/assets/javascripts/app/controllers/ticket_zoom.js.coffee index f1c7ab297..a8e3c9d6a 100644 --- a/app/assets/javascripts/app/controllers/ticket_zoom.js.coffee +++ b/app/assets/javascripts/app/controllers/ticket_zoom.js.coffee @@ -576,26 +576,14 @@ class Edit extends App.Controller @autosaveStart() return + ticket.article = article ticket.save( done: (r) => # reset form after save - if article - article.save( - done: (r) => - @ui.fetch( ticket.id, true ) + App.TaskManager.update( @task_key, { 'state': {} }) - # reset form after save - App.TaskManager.update( @task_key, { 'state': {} }) - fail: (r) => - @log 'error', 'update article', r - ) - else - - # reset form after save - App.TaskManager.update( @task_key, { 'state': {} }) - - @ui.fetch( ticket.id, true ) + @ui.fetch( ticket.id, true ) ) reset: (e) => diff --git a/app/controllers/tickets_controller.rb b/app/controllers/tickets_controller.rb index 06a3a4911..12a5654b2 100644 --- a/app/controllers/tickets_controller.rb +++ b/app/controllers/tickets_controller.rb @@ -22,7 +22,7 @@ class TicketsController < ApplicationController # POST /api/v1/tickets def create - @ticket = Ticket.new( Ticket.param_validation( params[:ticket] ) ) + ticket = Ticket.new( Ticket.param_validation( params[:ticket] ) ) # check if article is given if !params[:article] @@ -31,8 +31,8 @@ class TicketsController < ApplicationController end # create ticket - if !@ticket.save - render :json => @ticket.errors, :status => :unprocessable_entity + if !ticket.save + render :json => ticket.errors, :status => :unprocessable_entity return end @@ -42,7 +42,7 @@ class TicketsController < ApplicationController tags.each {|tag| Tag.tag_add( :object => 'Ticket', - :o_id => @ticket.id, + :o_id => ticket.id, :item => tag, :created_by_id => current_user.id, ) @@ -51,57 +51,39 @@ class TicketsController < ApplicationController # create article if given if params[:article] - form_id = params[:article][:form_id] - params[:article].delete(:form_id) - @article = Ticket::Article.new( Ticket::Article.param_validation( params[:article] ) ) - @article.ticket_id = @ticket.id - - # find attachments in upload cache - if form_id - @article.attachments = Store.list( - :object => 'UploadCache', - :o_id => form_id, - ) - end - if !@article.save - render :json => @article.errors, :status => :unprocessable_entity - return - end - - # remove attachments from upload cache - if form_id - Store.remove( - :object => 'UploadCache', - :o_id => form_id, - ) - end + article_create( ticket, params[:article] ) end - render :json => @ticket, :status => :created + render :json => ticket, :status => :created end # PUT /api/v1/tickets/1 def update - @ticket = Ticket.find(params[:id]) + ticket = Ticket.find(params[:id]) # permissin check - return if !ticket_permission(@ticket) + return if !ticket_permission(ticket) - if @ticket.update_attributes( Ticket.param_validation( params[:ticket] ) ) - render :json => @ticket, :status => :ok + if ticket.update_attributes( Ticket.param_validation( params[:ticket] ) ) + + if params[:article] + article_create( ticket, params[:article] ) + end + + render :json => ticket, :status => :ok else - render :json => @ticket.errors, :status => :unprocessable_entity + render :json => ticket.errors, :status => :unprocessable_entity end end # DELETE /api/v1/tickets/1 def destroy - @ticket = Ticket.find( params[:id] ) + ticket = Ticket.find( params[:id] ) # permissin check - return if !ticket_permission(@ticket) + return if !ticket_permission(ticket) - @ticket.destroy + ticket.destroy head :ok end @@ -376,4 +358,34 @@ class TicketsController < ApplicationController } end + private + + def article_create(ticket, params) +puts params.inspect + # create article if given + form_id = params[:form_id] + params.delete(:form_id) + article = Ticket::Article.new( Ticket::Article.param_validation( params ) ) + article.ticket_id = ticket.id + + # find attachments in upload cache + if form_id + article.attachments = Store.list( + :object => 'UploadCache', + :o_id => form_id, + ) + end + if !article.save + render :json => article.errors, :status => :unprocessable_entity + return + end + + # remove attachments from upload cache + if form_id + Store.remove( + :object => 'UploadCache', + :o_id => form_id, + ) + end + end end