From 9447a08e6e1cf19735fdc0de58c8d7f868dcc720 Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Fri, 20 Nov 2015 10:47:41 +0100 Subject: [PATCH] Improved performance of large object tables. --- .../_application_controller_table.coffee | 19 ++-- app/assets/javascripts/app/index.coffee | 89 +++++++++---------- .../javascripts/app/lib/app_init/log.coffee | 17 +++- .../app/views/generic/table.jst.eco | 4 +- 4 files changed, 71 insertions(+), 58 deletions(-) diff --git a/app/assets/javascripts/app/controllers/_application_controller_table.coffee b/app/assets/javascripts/app/controllers/_application_controller_table.coffee index 3daa7ea1d..3c9f6fa4b 100644 --- a/app/assets/javascripts/app/controllers/_application_controller_table.coffee +++ b/app/assets/javascripts/app/controllers/_application_controller_table.coffee @@ -262,15 +262,16 @@ class App.ControllerTable extends App.Controller # get content table = App.view('generic/table')( - table_id: @table_id - header: @headers - objects: @objects - checkbox: @checkbox - radio: @radio - groupBy: @groupBy - class: @class - destroy: destroy - callbacks: @callbackAttributes + table_id: @table_id + header: @headers + attributes: attributes + objects: @objects + checkbox: @checkbox + radio: @radio + groupBy: @groupBy + class: @class + destroy: destroy + callbacks: @callbackAttributes ) # convert to jquery object diff --git a/app/assets/javascripts/app/index.coffee b/app/assets/javascripts/app/index.coffee index f7316faa4..6db4444ab 100644 --- a/app/assets/javascripts/app/index.coffee +++ b/app/assets/javascripts/app/index.coffee @@ -1,6 +1,5 @@ # Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/ - #= require_self #= require_tree ./lib/app_init #= require ./config.coffee @@ -10,10 +9,11 @@ #= require_tree ./lib/app_post class App extends Spine.Controller - @viewPrint: (object, attribute_name) -> - attributes = {} - if object.constructor.attributesGet - attributes = object.constructor.attributesGet() + @viewPrint: (object, attribute_name, attributes) -> + if !attributes + attributes = {} + if object.constructor.attributesGet + attributes = object.constructor.attributesGet() attribute_config = attributes[attribute_name] value = object[attribute_name] valueRef = undefined @@ -34,11 +34,9 @@ class App extends Spine.Controller if parts[0] && parts[1] && object[ parts[0] ] value = object[ parts[0] ][ parts[1] ] - #console.log('Pa', attribute_name, object, attribute_config, object[attribute_name], valueRef, value) - # if we have no config, get output this way if !attribute_config - return @viewPrintItem( value ) + return @viewPrintItem(value) # check if valueRef already exists, no lookup needed later if !valueRef @@ -48,10 +46,10 @@ class App extends Spine.Controller if object[attribute_name_without_ref] valueRef = object[attribute_name_without_ref] - return @viewPrintItem( value, attribute_config, valueRef ) + @viewPrintItem(value, attribute_config, valueRef) # define print name helper - @viewPrintItem: ( item, attribute_config = {}, valueRef ) -> + @viewPrintItem: (item, attribute_config = {}, valueRef) -> return '-' if item is undefined return '-' if item is '' return item if !item @@ -77,13 +75,13 @@ class App extends Spine.Controller # execute callback on content if attribute_config.callback - result = attribute_config.callback( result, attribute_config ) + result = attribute_config.callback(result, attribute_config) # text2html in textarea view isHtmlEscape = false if attribute_config.tag is 'textarea' isHtmlEscape = true - result = App.Utils.text2html( result ) + result = App.Utils.text2html(result) # remember, html snippets are already escaped else if attribute_config.tag is 'richtext' @@ -95,9 +93,9 @@ class App extends Spine.Controller result = attribute_config.options[result] # translate content - if attribute_config.translate || ( isObject && item.translate && item.translate() ) + if attribute_config.translate || (isObject && item.translate && item.translate()) isHtmlEscape = true - result = App.i18n.translateContent( result ) + result = App.i18n.translateContent(result) # transform date if attribute_config.tag is 'date' @@ -121,71 +119,71 @@ class App extends Spine.Controller result @view: (name) -> - template = ( params = {} ) -> + template = (params = {}) -> # define print name helper - params.P = ( object, attribute_name ) -> - App.viewPrint( object, attribute_name ) + params.P = (object, attribute_name, attributes) -> + App.viewPrint(object, attribute_name, attributes) # define date format helper - params.date = ( time ) -> + params.date = (time) -> return '' if !time timeObject = new Date(time) - d = App.Utils.formatTime( timeObject.getDate(), 2 ) - m = App.Utils.formatTime( timeObject.getMonth() + 1, 2 ) + d = App.Utils.formatTime(timeObject.getDate(), 2) + m = App.Utils.formatTime(timeObject.getMonth() + 1, 2) y = timeObject.getFullYear() "#{y}-#{m}-#{d}" # define datetime format helper - params.datetime = ( time ) -> + params.datetime = (time) -> return '' if !time timeObject = new Date(time) - d = App.Utils.formatTime( timeObject.getDate(), 2 ) - m = App.Utils.formatTime( timeObject.getMonth() + 1, 2 ) + d = App.Utils.formatTime(timeObject.getDate(), 2) + m = App.Utils.formatTime(timeObject.getMonth() + 1, 2) y = timeObject.getFullYear() - S = App.Utils.formatTime( timeObject.getSeconds(), 2 ) - M = App.Utils.formatTime( timeObject.getMinutes(), 2 ) - H = App.Utils.formatTime( timeObject.getHours(), 2 ) + S = App.Utils.formatTime(timeObject.getSeconds(), 2) + M = App.Utils.formatTime(timeObject.getMinutes(), 2) + H = App.Utils.formatTime(timeObject.getHours(), 2) "#{y}-#{m}-#{d} #{H}:#{M}:#{S}" # define decimal format helper - params.decimal = ( data, positions = 2 ) -> + params.decimal = (data, positions = 2) -> App.Utils.decimal(data, positions) # define translation helper - params.T = ( item, args... ) -> - App.i18n.translateContent( item, args... ) + params.T = (item, args...) -> + App.i18n.translateContent(item, args...) # define translation inline helper - params.Ti = ( item, args... ) -> - App.i18n.translateInline( item, args... ) + params.Ti = (item, args...) -> + App.i18n.translateInline(item, args...) # define translation for date helper - params.Tdate = ( item, args... ) -> - App.i18n.translateDate( item, args... ) + params.Tdate = (item, args...) -> + App.i18n.translateDate(item, args...) # define translation for timestamp helper - params.Ttimestamp = ( item, args... ) -> - App.i18n.translateTimestamp( item, args... ) + params.Ttimestamp = (item, args...) -> + App.i18n.translateTimestamp(item, args...) # define linkify helper - params.L = ( item ) -> + params.L = (item) -> if item && typeof item is 'string' - return App.Utils.linkify( item ) + return App.Utils.linkify(item) item # define config helper - params.C = ( key ) -> - App.Config.get( key ) + params.C = (key) -> + App.Config.get(key) # define session helper - params.S = ( key ) -> - App.Session.get( key ) + params.S = (key) -> + App.Session.get(key) # define address line helper - params.AddressLine = ( line ) -> + params.AddressLine = (line) -> return '' if !line items = emailAddresses.parseAddressList(line) @@ -202,15 +200,14 @@ class App extends Spine.Controller result = result + App.Utils.htmlEscape(item.name) + ' ' if item.address result = result + " <#{App.Utils.htmlEscape(item.address)}>" - result # define file size helper - params.humanFileSize = ( size ) -> + params.humanFileSize = (size) -> App.Utils.humanFileSize(size) # define pretty/human time helper - params.humanTime = ( time, escalation = false, cssClass = '') -> + params.humanTime = (time, escalation = false, cssClass = '') -> timestamp = App.i18n.translateTimestamp(time) if escalation cssClass += ' escalation' @@ -222,7 +219,7 @@ class App extends Spine.Controller App.Utils.icon(name, className) # define richtext helper - params.RichText = ( string ) -> + params.RichText = (string) -> if string.match(/@T\('/) string = string.replace(/@T\('(.+?)'\)/g, (match, capture) -> App.i18n.translateContent(capture) diff --git a/app/assets/javascripts/app/lib/app_init/log.coffee b/app/assets/javascripts/app/lib/app_init/log.coffee index b204a7b7d..59ae526fd 100644 --- a/app/assets/javascripts/app/lib/app_init/log.coffee +++ b/app/assets/javascripts/app/lib/app_init/log.coffee @@ -27,6 +27,11 @@ class App.Log _instance ?= new _Singleton _instance.config( type, regex ) + @timeTrack: (message) -> + if _instance == undefined + _instance ?= new _Singleton + _instance.timeTrack(message) + class _Singleton constructor: -> @moduleColorsMap = {} @@ -115,4 +120,14 @@ class _Singleton goldenRatio = 0.618033988749895 @hue += goldenRatio @hue = @hue % 1 - @hue * 360 \ No newline at end of file + @hue * 360 + + timeTrack: (message) => + currentTime = new Date().getTime() + if !@lastTime + @lastTime = currentTime + console.log('timeTrack start', message) + else + diff = currentTime - @lastTime + @lastTime = currentTime + console.log('timeTrack start', message, diff) diff --git a/app/assets/javascripts/app/views/generic/table.jst.eco b/app/assets/javascripts/app/views/generic/table.jst.eco index 49e61db49..deea88296 100644 --- a/app/assets/javascripts/app/views/generic/table.jst.eco +++ b/app/assets/javascripts/app/views/generic/table.jst.eco @@ -41,7 +41,7 @@ <% groupLast = '' %> <% for object in @objects: %> <% if @groupBy: %> - <% groupByName = @P( object, @groupBy ) %> + <% groupByName = @P( object, @groupBy, @attributes ) %> <% if groupLast isnt groupByName: %> <%= groupByName %> <% groupLast = groupByName %> @@ -68,7 +68,7 @@ <% end %> <% for item in @header: %> - <% value = @P( object, item.name ) %> + <% value = @P( object, item.name, @attributes ) %> <% if @callbacks: %> <% if item.name.substr(item.name.length-3, item.name.length) is '_id' && object[ item.name.substr(0, item.name.length-3) ]: %> <% refObject = object[ item.name.substr(0, item.name.length-3) ] %>