diff --git a/Gemfile b/Gemfile index d7d92b436..5690a0b8f 100644 --- a/Gemfile +++ b/Gemfile @@ -92,5 +92,4 @@ group :development, :test do # gem 'em-websocket-client' end -gem 'business_time' gem 'thin' diff --git a/app/assets/javascripts/app/controllers/_application_controller.js.coffee b/app/assets/javascripts/app/controllers/_application_controller.js.coffee index 327f0ead7..883a0cbe6 100644 --- a/app/assets/javascripts/app/controllers/_application_controller.js.coffee +++ b/app/assets/javascripts/app/controllers/_application_controller.js.coffee @@ -23,6 +23,12 @@ class App.Controller extends Spine.Controller # create common accessors @apiPath = @Config.get('api_path') + # remember ajax calls to abort them on dom release + @ajaxCalls = [] + @ajax = (data) => + ajaxId = App.Ajax.request(data) + @ajaxCalls.push ajaxId + bind: (event, callback) => App.Event.bind( event @@ -53,6 +59,9 @@ class App.Controller extends Spine.Controller App.Event.unbindLevel(@controllerId) App.Delay.clearLevel(@controllerId) App.Interval.clearLevel(@controllerId) + if @ajaxCalls + for callId in @ajaxCalls + App.Ajax.abort(callId) release: => # release custom bindings after it got removed from dom @@ -74,7 +83,6 @@ class App.Controller extends Spine.Controller App.Interval.reset() App.WebSocket.close( force: true ) - # add @notify methode to create notification notify: (data) -> App.Event.trigger 'notify', data @@ -376,7 +384,7 @@ class App.Controller extends Spine.Controller # get data tickets = {} - App.Com.ajax( + App.Ajax.request( type: 'GET', url: @Config.get('api_path') + '/ticket_customer', data: { diff --git a/app/assets/javascripts/app/controllers/_dashboard/activity_stream.js.coffee b/app/assets/javascripts/app/controllers/_dashboard/activity_stream.js.coffee index 4e47ae52b..70a74d844 100644 --- a/app/assets/javascripts/app/controllers/_dashboard/activity_stream.js.coffee +++ b/app/assets/javascripts/app/controllers/_dashboard/activity_stream.js.coffee @@ -20,7 +20,7 @@ class App.DashboardActivityStream extends App.Controller # init fetch via ajax, all other updates on time via websockets else - App.Com.ajax( + @ajax( id: 'dashoard_activity_stream' type: 'GET' url: @apiPath + '/activity_stream' diff --git a/app/assets/javascripts/app/controllers/_dashboard/recent_viewed.js.coffee b/app/assets/javascripts/app/controllers/_dashboard/recent_viewed.js.coffee index f6106d3bd..56cbde3e5 100644 --- a/app/assets/javascripts/app/controllers/_dashboard/recent_viewed.js.coffee +++ b/app/assets/javascripts/app/controllers/_dashboard/recent_viewed.js.coffee @@ -8,7 +8,7 @@ class App.DashboardRecentViewed extends App.Controller @items = [] # get data - App.Com.ajax( + @ajax( id: 'dashboard_recent_viewed', type: 'GET', url: @apiPath + '/recent_viewed', diff --git a/app/assets/javascripts/app/controllers/_dashboard/rss.js.coffee b/app/assets/javascripts/app/controllers/_dashboard/rss.js.coffee index da2a71d3d..554162483 100644 --- a/app/assets/javascripts/app/controllers/_dashboard/rss.js.coffee +++ b/app/assets/javascripts/app/controllers/_dashboard/rss.js.coffee @@ -18,7 +18,7 @@ class App.DashboardRss extends App.Controller # init fetch via ajax, all other updates on time via websockets else - App.Com.ajax( + @ajax( id: 'dashboard_rss' type: 'GET' url: @apiPath + '/rss_fetch' diff --git a/app/assets/javascripts/app/controllers/_dashboard/ticket.js.coffee b/app/assets/javascripts/app/controllers/_dashboard/ticket.js.coffee index cd575d591..03678756a 100644 --- a/app/assets/javascripts/app/controllers/_dashboard/ticket.js.coffee +++ b/app/assets/javascripts/app/controllers/_dashboard/ticket.js.coffee @@ -27,7 +27,7 @@ class App.DashboardTicket extends App.Controller # init fetch via ajax, all other updates on time via websockets else - App.Com.ajax( + @ajax( id: 'dashboard_ticket_' + @key, type: 'GET', url: @apiPath + '/ticket_overviews', diff --git a/app/assets/javascripts/app/controllers/_profile/language.js.coffee b/app/assets/javascripts/app/controllers/_profile/language.js.coffee index 83dc0c9a6..ee378377f 100644 --- a/app/assets/javascripts/app/controllers/_profile/language.js.coffee +++ b/app/assets/javascripts/app/controllers/_profile/language.js.coffee @@ -34,7 +34,7 @@ class Index extends App.Controller # get data @locale = params['locale'] - App.Com.ajax( + @ajax( id: 'preferences' type: 'PUT' url: @apiPath + '/users/preferences' diff --git a/app/assets/javascripts/app/controllers/_profile/linked_accounts.js.coffee b/app/assets/javascripts/app/controllers/_profile/linked_accounts.js.coffee index 9928eddf5..942cfccb1 100644 --- a/app/assets/javascripts/app/controllers/_profile/linked_accounts.js.coffee +++ b/app/assets/javascripts/app/controllers/_profile/linked_accounts.js.coffee @@ -50,7 +50,7 @@ class Index extends App.Controller uid = $(e.target).data('uid') # get data - App.Com.ajax( + @ajax( id: 'account' type: 'DELETE' url: @apiPath + '/users/account' diff --git a/app/assets/javascripts/app/controllers/_profile/password.js.coffee b/app/assets/javascripts/app/controllers/_profile/password.js.coffee index 834cad4ce..abafaab68 100644 --- a/app/assets/javascripts/app/controllers/_profile/password.js.coffee +++ b/app/assets/javascripts/app/controllers/_profile/password.js.coffee @@ -35,7 +35,7 @@ class Index extends App.Controller @formDisable(e) # get data - App.Com.ajax( + @ajax( id: 'password_reset' type: 'POST' url: @apiPath + '/users/password_change' diff --git a/app/assets/javascripts/app/controllers/agent_ticket_create.js.coffee b/app/assets/javascripts/app/controllers/agent_ticket_create.js.coffee index 348c8ee3b..f7dbba21e 100644 --- a/app/assets/javascripts/app/controllers/agent_ticket_create.js.coffee +++ b/app/assets/javascripts/app/controllers/agent_ticket_create.js.coffee @@ -102,7 +102,7 @@ class App.TicketCreate extends App.Controller @render() else - App.Com.ajax( + @ajax( id: 'ticket_create' type: 'GET' url: @apiPath + '/ticket_create' diff --git a/app/assets/javascripts/app/controllers/agent_ticket_history.js.coffee b/app/assets/javascripts/app/controllers/agent_ticket_history.js.coffee index 0c048a4d0..2c89a6ad8 100644 --- a/app/assets/javascripts/app/controllers/agent_ticket_history.js.coffee +++ b/app/assets/javascripts/app/controllers/agent_ticket_history.js.coffee @@ -10,7 +10,7 @@ class App.TicketHistory extends App.ControllerModal fetch: (@ticket_id) -> # get data - App.Com.ajax( + @ajax( id: 'ticket_history', type: 'GET', url: @apiPath + '/ticket_history/' + ticket_id, diff --git a/app/assets/javascripts/app/controllers/agent_ticket_merge.js.coffee b/app/assets/javascripts/app/controllers/agent_ticket_merge.js.coffee index 4ffb9689d..6daae0830 100644 --- a/app/assets/javascripts/app/controllers/agent_ticket_merge.js.coffee +++ b/app/assets/javascripts/app/controllers/agent_ticket_merge.js.coffee @@ -6,7 +6,7 @@ class App.TicketMerge extends App.ControllerModal fetch: -> # merge tickets - App.Com.ajax( + @ajax( id: 'ticket_merge_list', type: 'GET', url: @apiPath + '/ticket_merge_list/' + @ticket_id, @@ -104,7 +104,7 @@ class App.TicketMerge extends App.ControllerModal params = @formParam(e.target) # merge tickets - App.Com.ajax( + @ajax( id: 'ticket_merge', type: 'GET', url: @apiPath + '/ticket_merge/' + @ticket_id + '/' + params['master_ticket_number'], diff --git a/app/assets/javascripts/app/controllers/customer_ticket_create.js.coffee b/app/assets/javascripts/app/controllers/customer_ticket_create.js.coffee index 3c37e9b2e..a3af61b45 100644 --- a/app/assets/javascripts/app/controllers/customer_ticket_create.js.coffee +++ b/app/assets/javascripts/app/controllers/customer_ticket_create.js.coffee @@ -34,7 +34,7 @@ class Index extends App.ControllerContent @render() else - App.Com.ajax( + @ajax( id: 'ticket_create', type: 'GET', url: @apiPath + '/ticket_create', diff --git a/app/assets/javascripts/app/controllers/getting_started.js.coffee b/app/assets/javascripts/app/controllers/getting_started.js.coffee index 8422c45be..edf8f1606 100644 --- a/app/assets/javascripts/app/controllers/getting_started.js.coffee +++ b/app/assets/javascripts/app/controllers/getting_started.js.coffee @@ -18,7 +18,7 @@ class Index extends App.ControllerContent fetch: -> # get data - App.Com.ajax( + @ajax( id: 'getting_started', type: 'GET', url: @apiPath + '/getting_started', diff --git a/app/assets/javascripts/app/controllers/link_info_widget.js.coffee b/app/assets/javascripts/app/controllers/link_info_widget.js.coffee index 01c803cae..9bf17db04 100644 --- a/app/assets/javascripts/app/controllers/link_info_widget.js.coffee +++ b/app/assets/javascripts/app/controllers/link_info_widget.js.coffee @@ -11,7 +11,7 @@ class App.LinkInfo extends App.Controller fetch: () => # fetch item on demand # get data - App.Com.ajax( + @ajax( id: 'links_' + @object.id + '_' + @object_type, type: 'GET', url: @apiPath + '/links', @@ -80,7 +80,7 @@ class App.LinkInfo extends App.Controller link_object_target_value = @object.id # get data - App.Com.ajax( + @ajax( id: 'links_remove_' + @object.id + '_' + @object_type, type: 'GET', url: @apiPath + '/links/remove', @@ -123,7 +123,7 @@ class App.LinkAdd extends App.ControllerModal params = @formParam(e.target) # get data - App.Com.ajax( + @ajax( id: 'links_add_' + @object.id + '_' + @object_type, type: 'GET', url: @apiPath + '/links/add', diff --git a/app/assets/javascripts/app/controllers/navigation.js.coffee b/app/assets/javascripts/app/controllers/navigation.js.coffee index baa7703f3..713b74828 100644 --- a/app/assets/javascripts/app/controllers/navigation.js.coffee +++ b/app/assets/javascripts/app/controllers/navigation.js.coffee @@ -90,8 +90,8 @@ class App.Navigation extends App.Controller @searchFocusSet = false searchFunction = => - App.Com.ajax( - id: 'ticket_search' + App.Ajax.request( + id: 'search' type: 'GET' url: @apiPath + '/search' data: diff --git a/app/assets/javascripts/app/controllers/package.js.coffee b/app/assets/javascripts/app/controllers/package.js.coffee index a061bad34..f6e16fceb 100644 --- a/app/assets/javascripts/app/controllers/package.js.coffee +++ b/app/assets/javascripts/app/controllers/package.js.coffee @@ -13,7 +13,7 @@ class Index extends App.ControllerContent @load() load: -> - App.Com.ajax( + @ajax( id: 'packages', type: 'GET', url: @apiPath + '/packages', @@ -47,7 +47,7 @@ class Index extends App.ControllerContent httpType = 'DELETE' if httpType - App.Com.ajax( + @ajax( id: 'packages', type: httpType, url: @apiPath + '/packages', diff --git a/app/assets/javascripts/app/controllers/reset_password.js.coffee b/app/assets/javascripts/app/controllers/reset_password.js.coffee index c154d2f11..e65b12ad3 100644 --- a/app/assets/javascripts/app/controllers/reset_password.js.coffee +++ b/app/assets/javascripts/app/controllers/reset_password.js.coffee @@ -43,7 +43,7 @@ class Index extends App.ControllerContent @formDisable(e) # get data - App.Com.ajax( + @ajax( id: 'password_reset' type: 'POST' url: @apiPath + '/users/password_reset' @@ -83,7 +83,7 @@ class Verify extends App.ControllerContent # get data params = {} params['token'] = @token - App.Com.ajax( + @ajax( id: 'password_reset_verify' type: 'POST' url: @apiPath + '/users/password_reset_verify' @@ -119,7 +119,7 @@ class Verify extends App.ControllerContent @password = params['password'] # get data - App.Com.ajax( + @ajax( id: 'password_reset_verify' type: 'POST' url: @apiPath + '/users/password_reset_verify' diff --git a/app/assets/javascripts/app/controllers/session.js.coffee b/app/assets/javascripts/app/controllers/session.js.coffee index a9959ac1c..99ee13ed5 100644 --- a/app/assets/javascripts/app/controllers/session.js.coffee +++ b/app/assets/javascripts/app/controllers/session.js.coffee @@ -9,15 +9,15 @@ class Index extends App.ControllerContent return if !@authenticate() @load() -# @interval( -# => -# @load() -# 10000 -# ) + @interval( + => + @load() + 45000 + ) # fetch data, render view load: -> - App.Com.ajax( + @ajax( id: 'sessions' type: 'GET' url: @apiPath + '/sessions' @@ -43,7 +43,7 @@ class Index extends App.ControllerContent destroy: (e) -> e.preventDefault() sessionId = $( e.target ).data('session-id') - App.Com.ajax( + @ajax( id: 'sessions/' + sessionId type: 'DELETE' url: @apiPath + '/sessions/' + sessionId diff --git a/app/assets/javascripts/app/controllers/tag_widget.js.coffee b/app/assets/javascripts/app/controllers/tag_widget.js.coffee index 2b08c1936..01eefabfd 100644 --- a/app/assets/javascripts/app/controllers/tag_widget.js.coffee +++ b/app/assets/javascripts/app/controllers/tag_widget.js.coffee @@ -9,7 +9,7 @@ class App.TagWidget extends App.Controller load: => @attribute_id = 'tags_' + @object.id + '_' + @object_type - App.Com.ajax( + @ajax( id: @attribute_id type: 'GET' url: @apiPath + '/tags' @@ -40,7 +40,7 @@ class App.TagWidget extends App.Controller # @el.find('#tags').elastic() onAddTag: (item) => - App.Com.ajax( + @ajax( type: 'GET', url: @apiPath + '/tags/add', data: @@ -53,7 +53,7 @@ class App.TagWidget extends App.Controller ) onRemoveTag: (item) => - App.Com.ajax( + @ajax( type: 'GET' url: @apiPath + '/tags/remove' data: diff --git a/app/assets/javascripts/app/controllers/ticket_overview.js.coffee b/app/assets/javascripts/app/controllers/ticket_overview.js.coffee index 9cbafda9f..ff8f94b81 100644 --- a/app/assets/javascripts/app/controllers/ticket_overview.js.coffee +++ b/app/assets/javascripts/app/controllers/ticket_overview.js.coffee @@ -64,7 +64,7 @@ class Table extends App.ControllerContent # init fetch via ajax, all other updates on time via websockets else - App.Com.ajax( + @ajax( id: 'ticket_overview_' + @key, type: 'GET', url: @apiPath + '/ticket_overviews', @@ -559,7 +559,7 @@ class Router extends App.Controller @ticket_list = cache.ticket_list @redirect() else - App.Com.ajax( + @ajax( type: 'GET' url: @apiPath + '/ticket_overviews' data: diff --git a/app/assets/javascripts/app/controllers/ticket_zoom.js.coffee b/app/assets/javascripts/app/controllers/ticket_zoom.js.coffee index dbc62c92c..277392992 100644 --- a/app/assets/javascripts/app/controllers/ticket_zoom.js.coffee +++ b/app/assets/javascripts/app/controllers/ticket_zoom.js.coffee @@ -64,7 +64,7 @@ class App.TicketZoom extends App.Controller return if !@Session.all() # get data - App.Com.ajax( + @ajax( id: 'ticket_zoom_' + ticket_id type: 'GET' url: @apiPath + '/ticket_full/' + ticket_id + '?do_not_log=' + @doNotLog diff --git a/app/assets/javascripts/app/lib/app_init/track.js.coffee b/app/assets/javascripts/app/lib/app_init/track.js.coffee index a94c1cc92..e1e1209ba 100644 --- a/app/assets/javascripts/app/lib/app_init/track.js.coffee +++ b/app/assets/javascripts/app/lib/app_init/track.js.coffee @@ -29,7 +29,10 @@ class _trackSingleton @log( 'start', 'notice', {} ) - App.Interval.set @send, 60000 + # start initial submit 10 sec. later to avoid ie10 cookie issues + delay = => + App.Interval.set @send, 60000 + App.Delay.set delay, 10000 # log clicks $(document).bind( @@ -113,7 +116,7 @@ class _trackSingleton catch e # nothing - App.Com.ajax( + App.Ajax.request( type: 'POST' url: @url async: async diff --git a/app/assets/javascripts/app/lib/app_post/ajax.js.coffee b/app/assets/javascripts/app/lib/app_post/ajax.js.coffee index 6a0c8512c..4dc599d99 100644 --- a/app/assets/javascripts/app/lib/app_post/ajax.js.coffee +++ b/app/assets/javascripts/app/lib/app_post/ajax.js.coffee @@ -1,9 +1,14 @@ -class App.Com +class App.Ajax _instance = undefined # Must be declared here to force the closure on the class - @ajax: (args) -> # Must be a static method + @request: (args) -> # Must be a static method if _instance == undefined _instance ?= new _ajaxSingleton - _instance.ajax(args) + _instance.request(args) + + @abort: (args) -> # Must be a static method + if _instance == undefined + _instance ?= new _ajaxSingleton + _instance.abort(args) # The actual Singleton class class _ajaxSingleton @@ -61,19 +66,44 @@ class _ajaxSingleton ) ) - ajax: (params) -> + request: (params) -> data = $.extend({}, @defaults, params ) + + # execute call with id, clear old call first if exists if params['id'] - if @current_request[ params['id'] ] - @current_request[ params['id'] ].abort() + @abort( params['id'] ) @current_request[ params['id'] ] = $.ajax( data ) + return params['id'] + + # generate a uniq rand id + params['id'] = 'rand-' + new Date().getTime() + '-' + Math.floor( Math.random() * 99999 ) + + # queue request + if params['queue'] + @queue_list.push data + if !@queue_running + @_run() + + # execute request else - if params['queue'] - @queue_list.push data - if !@queue_running - @_run() - else - $.ajax(data) + @current_request[ params['id'] ] = $.ajax(data) + + params['id'] + + abort: (id) => + + # abort current_request + if @current_request[ id ] + @current_request[ id ].abort() + delete @current_request[ id ] + + # remove from queue list + @queue_list = _.filter( + @queue_list + (item) -> + return item if item['id'] isnt id + return + ) _run: => if @queue_list && @queue_list[0] @@ -82,7 +112,7 @@ class _ajaxSingleton request.complete = => @queue_running = false @_run() - $.ajax( request ) + @current_request[ request['id'] ] = $.ajax( request ) _show_spinner: => @count++ diff --git a/app/assets/javascripts/app/lib/app_post/auth.js.coffee b/app/assets/javascripts/app/lib/app_post/auth.js.coffee index beb9c7832..cc728c952 100644 --- a/app/assets/javascripts/app/lib/app_post/auth.js.coffee +++ b/app/assets/javascripts/app/lib/app_post/auth.js.coffee @@ -2,7 +2,7 @@ class App.Auth @login: (params) -> App.Log.notice 'Auth', 'login', params - App.Com.ajax( + App.Ajax.request( id: 'login', type: 'POST', url: App.Config.get('api_path') + '/signin', @@ -22,7 +22,7 @@ class App.Auth @loginCheck: -> App.Log.notice 'Auth', 'loginCheck' - App.Com.ajax( + App.Ajax.request( id: 'login_check' async: false type: 'GET' @@ -38,7 +38,7 @@ class App.Auth @logout: -> App.Log.notice 'Auth', 'logout' - App.Com.ajax( + App.Ajax.request( id: 'logout' type: 'DELETE' url: App.Config.get('api_path') + '/signout' diff --git a/app/assets/javascripts/app/lib/app_post/browser.coffee b/app/assets/javascripts/app/lib/app_post/browser.coffee index 8ff09a060..6b5559ed1 100644 --- a/app/assets/javascripts/app/lib/app_post/browser.coffee +++ b/app/assets/javascripts/app/lib/app_post/browser.coffee @@ -14,8 +14,8 @@ class App.Browser console.log('Browser not supported') return false - # disable Firefox 6 and older - else if data.browser == 'Firefox' && data.version <= 6 + # disable Firefox 9 and older + else if data.browser == 'Firefox' && data.version <= 9 @message(data) console.log('Browser not supported') return false diff --git a/app/assets/javascripts/app/lib/app_post/i18n.js.coffee b/app/assets/javascripts/app/lib/app_post/i18n.js.coffee index 8c2a442ff..5f3fe4bc4 100644 --- a/app/assets/javascripts/app/lib/app_post/i18n.js.coffee +++ b/app/assets/javascripts/app/lib/app_post/i18n.js.coffee @@ -100,7 +100,7 @@ class _i18nSingleton extends Spine.Module @locale = locale @map = {} - App.Com.ajax( + App.Ajax.request( id: 'i18n-set-' + locale, type: 'GET', url: App.Config.get('api_path') + '/translations/lang/' + locale, diff --git a/app/assets/javascripts/app/lib/app_post/task_manager.js.coffee b/app/assets/javascripts/app/lib/app_post/task_manager.js.coffee index 66c624fb4..e2b67d0db 100644 --- a/app/assets/javascripts/app/lib/app_post/task_manager.js.coffee +++ b/app/assets/javascripts/app/lib/app_post/task_manager.js.coffee @@ -68,7 +68,6 @@ class _taskManagerSingleton extends App.Controller @workersStarted = {} @allTasks = [] @tasksToUpdate = {} - @initialLoad = true @activeTask = undefined @tasksInitial() @@ -76,8 +75,6 @@ class _taskManagerSingleton extends App.Controller App.Event.bind( 'auth:login' => - @initialLoad = true - @all() @tasksInitial() 'task' ) @@ -95,13 +92,6 @@ class _taskManagerSingleton extends App.Controller all: -> - # initial load of taskbar collection - if @initialLoad - @initialLoad = false - tasks = App.Taskbar.all() - for task in tasks - @allTasks.push task.attributes() - # sort by prio @allTasks = _(@allTasks).sortBy( (task) -> return task.prio; @@ -130,8 +120,9 @@ class _taskManagerSingleton extends App.Controller # create new task if not exists task = @get( key ) - #console.log('add', key, callback, params, to_not_show, task) + console.log('add', key, callback, params, to_not_show, task) if !task + console.log('add, create new taskbar in backend') task = new App.Taskbar task.load( key: key @@ -211,7 +202,7 @@ class _taskManagerSingleton extends App.Controller startController: (key, callback, params, to_not_show) => -# console.log('controller started...', callback, key, params) + console.log('controller start try...', callback, key) # activate controller worker = @worker( key ) @@ -221,6 +212,7 @@ class _taskManagerSingleton extends App.Controller # return if controller is already started return if @workersStarted[key] @workersStarted[key] = true + console.log('controller start now...', callback, key) # create new controller instanz params_app = _.clone(params) @@ -231,11 +223,14 @@ class _taskManagerSingleton extends App.Controller params_app['doNotLog'] = 1 a = new App[callback]( params_app ) @workers[ key ] = a + console.log('controller start now 2...', callback, key) # activate controller if !to_not_show + console.log('controller start now 2 activate...', callback, key) a.activate() + console.log('controller start now 2 return...', callback, key) return a get: ( key ) => @@ -311,7 +306,7 @@ class _taskManagerSingleton extends App.Controller @allTasks = [] @activeTask = undefined - # clear inmem tasks + # clear in mem tasks App.Taskbar.deleteAll() # rerender task bar @@ -343,6 +338,7 @@ class _taskManagerSingleton extends App.Controller if ui.tasksToUpdate[ @key ] is 'inProgress' delete ui.tasksToUpdate[ @key ] error: (task) => + ui.log 'error', "can't update task '#{task.id}'" if ui.tasksToUpdate[ @key ] is 'inProgress' delete ui.tasksToUpdate[ @key ] ) @@ -366,17 +362,19 @@ class _taskManagerSingleton extends App.Controller tasksInitial: => + # initial load of taskbar collection + tasks = App.Taskbar.all() + @allTasks = [] + for task in tasks + @allTasks.push task.attributes() + # reopen tasks App.Event.trigger 'taskbar:init' - # check if we have different - - tasks = @all() - return if !tasks - task_count = 0 - for task in tasks + for task in @allTasks task_count += 1 + console.log('START', task) App.Delay.set( => task = tasks.shift() diff --git a/app/assets/javascripts/app/lib/app_post/websocket.js.coffee b/app/assets/javascripts/app/lib/app_post/websocket.js.coffee index e5be0b9ba..f2c9a1c03 100644 --- a/app/assets/javascripts/app/lib/app_post/websocket.js.coffee +++ b/app/assets/javascripts/app/lib/app_post/websocket.js.coffee @@ -287,11 +287,9 @@ class _webSocketSingleton extends App.Controller # return if init is already done and not forced return if @_ajaxInitDone && !data.force - # stop init request if new one is started - if @_ajaxInitWorking - @_ajaxInitWorking.abort() # call init request - @_ajaxInitWorking = App.Com.ajax( + App.Ajax.request( + id: 'ws-login' type: 'POST' url: @Config.get('api_path') + '/message_send' data: JSON.stringify({ data: { action: 'login' } }) @@ -304,10 +302,8 @@ class _webSocketSingleton extends App.Controller @_ajaxReceive() @_ajaxSendQueue() @_ajaxInitDone = true - @_ajaxInitWorking = false error: => @_ajaxInitDone = true - @_ajaxInitWorking = false # try reconnect on error after x sec. reconnect = => @@ -327,7 +323,7 @@ class _webSocketSingleton extends App.Controller _ajaxSendQueue: => while !_.isEmpty(@queue) data = @queue.shift() - App.Com.ajax( + App.Ajax.request( type: 'POST' url: @Config.get('api_path') + '/message_send' data: JSON.stringify({ client_id: @client_id, data: data }) @@ -346,7 +342,7 @@ class _webSocketSingleton extends App.Controller return if !@client_id return if @_ajaxReceiveWorking is true @_ajaxReceiveWorking = true - App.Com.ajax( + App.Ajax.request( id: 'message_receive', type: 'POST' url: @Config.get('api_path') + '/message_receive' diff --git a/app/assets/javascripts/app/models/ticket.js.coffee b/app/assets/javascripts/app/models/ticket.js.coffee index f4283ac6b..0dcea0da6 100644 --- a/app/assets/javascripts/app/models/ticket.js.coffee +++ b/app/assets/javascripts/app/models/ticket.js.coffee @@ -33,17 +33,29 @@ class App.Ticket extends App.Model # customer if data.customer_id - data.customer = App.User.find( data.customer_id ) + if !App.User.exists( data.customer_id ) + console.error("Can't find user for data.customer_id #{data.customer_id} for ticket #{data.id}") + else + data.customer = App.User.find( data.customer_id ) # owner if data.owner_id - data.owner = App.User.find( data.owner_id ) + if !App.User.exists( data.owner_id ) + console.error("Can't find user for data.owner_id #{data.owner_id} for ticket #{data.id}") + else + data.owner = App.User.find( data.owner_id ) # add created & updated if data.created_by_id - data.created_by = App.User.find( data.created_by_id ) + if !App.User.exists( data.created_by_id ) + console.error("Can't find user for data.created_by_id #{data.created_by_id} for ticket #{data.id}") + else + data.created_by = App.User.find( data.created_by_id ) if data.updated_by_id - data.updated_by = App.User.find( data.updated_by_id ) + if !App.User.exists( data.updated_by_id ) + console.error("Can't find user for data.updated_by_id #{data.updated_by_id} for ticket #{data.id}") + else + data.updated_by = App.User.find( data.updated_by_id ) data diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index a57407fa1..bd2d0293d 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -27,7 +27,7 @@ class ApplicationController < ActionController::Base headers['Access-Control-Allow-Origin'] = '*' headers['Access-Control-Allow-Methods'] = 'POST, GET, PUT, DELETE, OPTIONS' headers['Access-Control-Max-Age'] = '1728000' - headers['Access-Control-Allow-Headers'] = 'Content-Type, Depth, User-Agent, X-File-Size, X-Requested-With, If-Modified-Since, X-File-Name, Cache-Control' + headers['Access-Control-Allow-Headers'] = 'Content-Type, Depth, User-Agent, X-File-Size, X-Requested-With, If-Modified-Since, X-File-Name, Cache-Control, Accept-Language' headers['Access-Control-Allow-Credentials'] = 'true' end @@ -39,7 +39,7 @@ class ApplicationController < ActionController::Base if request.method == 'OPTIONS' headers['Access-Control-Allow-Origin'] = '*' headers['Access-Control-Allow-Methods'] = 'POST, GET, PUT, DELETE, OPTIONS' - headers['Access-Control-Allow-Headers'] = 'Content-Type, Depth, User-Agent, X-File-Size, X-Requested-With, If-Modified-Since, X-File-Name, Cache-Control' + headers['Access-Control-Allow-Headers'] = 'Content-Type, Depth, User-Agent, X-File-Size, X-Requested-With, If-Modified-Since, X-File-Name, Cache-Control, Accept-Language' headers['Access-Control-Max-Age'] = '1728000' headers['Access-Control-Allow-Credentials'] = 'true' render :text => '', :content_type => 'text/plain' diff --git a/doc/X-Headers.txt b/doc/X-Headers.txt index 1b2d44a5c..a429f7ff5 100644 --- a/doc/X-Headers.txt +++ b/doc/X-Headers.txt @@ -8,7 +8,7 @@ Presort of group (highest sort priority). X-Zammad-Owner: [login of agent] -------------------------------- -Assigne ticket to agent. +Assign ticket to agent. X-Zammad-Ignore: [yes|true] ------------------------- @@ -26,9 +26,9 @@ X-Zammad-Article-Type: (email|phone|fax|sms|webrequest|note|twitter status|direc ------------------------------------------------------------------------------------------------------- Article type (for whole list check your database). -X-Zammad-Article-Visability: (internal|external) +X-Zammad-Article-Visibility: (internal|external) ------------------------------------------------ -Article visability. +Article visibility. X-Zammad-Customer-Email: [email address] ---------------------------------------- diff --git a/public/assets/tests/core.js b/public/assets/tests/core.js index 411073597..db2e584ff 100644 --- a/public/assets/tests/core.js +++ b/public/assets/tests/core.js @@ -1,6 +1,6 @@ // ajax -App.Com.ajax({ +App.Ajax.request({ type: 'GET', url: '/assets/tests/ajax-test.json', success: function (data) { @@ -18,7 +18,7 @@ App.Com.ajax({ }); // ajax queueing -App.Com.ajax({ +App.Ajax.request({ type: 'GET', url: '/tests/wait/2', queue: true, @@ -38,7 +38,7 @@ App.Com.ajax({ }); } }); -App.Com.ajax({ +App.Ajax.request({ type: 'GET', url: '/tests/wait/1', queue: true, @@ -60,7 +60,7 @@ App.Com.ajax({ }); // ajax parallel -App.Com.ajax({ +App.Ajax.request({ type: 'GET', url: '/tests/wait/2', success: function (data) { @@ -79,7 +79,7 @@ App.Com.ajax({ }); } }); -App.Com.ajax({ +App.Ajax.request({ type: 'GET', url: '/tests/wait/1', success: function (data) { @@ -210,7 +210,7 @@ App.Delay.set( function() { App.Interval.clear('interval-test1') }); }, - 2500 + 2400 ); App.Delay.set( function() { test( "interval - test 1 - 1/1", function() { @@ -240,7 +240,7 @@ App.Delay.set( function() { App.Interval.clearLevel('page') }); }, - 2500 + 2400 ); App.Delay.set( function() { test( "interval - test 2 - 1/1", function() { diff --git a/test/browser/aaa_getting_started_test.rb b/test/browser/aaa_getting_started_test.rb index d1ea88fc3..899515f48 100644 --- a/test/browser/aaa_getting_started_test.rb +++ b/test/browser/aaa_getting_started_test.rb @@ -9,10 +9,6 @@ class AaaGettingStartedTest < TestCase :instance => browser_instance, :url => browser_url + '/', :action => [ - { - :execute => 'wait', - :value => 1, - }, { :execute => 'check', :css => '#form-master', @@ -54,12 +50,7 @@ class AaaGettingStartedTest < TestCase }, { :execute => 'wait', - :value => 4, - }, - { - :execute => 'check', - :css => '#login', - :result => false, + :value => 3, }, { :execute => 'check', @@ -80,10 +71,6 @@ class AaaGettingStartedTest < TestCase :value => 'Invite Agents', :match_result => true, }, - { - :execute => 'wait', - :value => 4, - }, { :execute => 'set', :css => '#form-agent input[name="firstname"]', diff --git a/test/browser/agent_ticket_actions_level3_test.rb b/test/browser/agent_ticket_actions_level3_test.rb index 01cdf1ad8..04b3ba9d7 100644 --- a/test/browser/agent_ticket_actions_level3_test.rb +++ b/test/browser/agent_ticket_actions_level3_test.rb @@ -299,7 +299,7 @@ class AgentTicketActionsLevel3Test < TestCase }, { :execute => 'wait', - :value => 2, + :value => 4, }, { :where => :instance2, diff --git a/test/browser/agent_user_manage_test.rb b/test/browser/agent_user_manage_test.rb index 969251e6d..0f2cdeb7d 100644 --- a/test/browser/agent_user_manage_test.rb +++ b/test/browser/agent_user_manage_test.rb @@ -23,10 +23,6 @@ class AgentUserManageTest < TestCase :execute => 'click', :css => 'a[href="#ticket_create/call_inbound"]', }, - { - :execute => 'wait', - :value => 5, - }, { :execute => 'click', :css => '.active .customer_new', @@ -76,10 +72,6 @@ class AgentUserManageTest < TestCase }, # call new ticket screen again - { - :execute => 'wait', - :value => 2, - }, { :execute => 'click', :css => '.taskbar span[data-type="close"]', @@ -143,6 +135,10 @@ class AgentUserManageTest < TestCase :css => '.active .ticket_create input[name="customer_id_autocompletion"]', :value => :tab, }, + { + :execute => 'wait', + :value => 1, + }, { :execute => 'match', :css => '.active input[name="customer_id"]', diff --git a/test/browser/auth_customer_test.rb b/test/browser/auth_customer_test.rb index e2b8970b6..ea923bbdd 100644 --- a/test/browser/auth_customer_test.rb +++ b/test/browser/auth_customer_test.rb @@ -1,7 +1,7 @@ # encoding: utf-8 require 'browser_test_helper' -class AuthTest < TestCase +class AuthCustomerTest < TestCase def test_authentication tests = [ { @@ -37,10 +37,6 @@ class AuthTest < TestCase { :name => 'login', :action => [ - { - :execute => 'wait', - :value => 2, - }, { :execute => 'check', :css => '#login', @@ -62,7 +58,7 @@ class AuthTest < TestCase }, { :execute => 'wait', - :value => 3, + :value => 5, }, # check action diff --git a/test/browser/auth_master_test.rb b/test/browser/auth_master_test.rb index 8dd13c266..392bb244f 100644 --- a/test/browser/auth_master_test.rb +++ b/test/browser/auth_master_test.rb @@ -1,6 +1,6 @@ # encoding: utf-8 require 'browser_test_helper' - + class AuthMasterTest < TestCase def test_authentication tests = [ @@ -37,10 +37,6 @@ class AuthMasterTest < TestCase { :name => 'login', :action => [ - { - :execute => 'wait', - :value => 2, - }, { :execute => 'check', :css => '#login', @@ -82,4 +78,4 @@ class AuthMasterTest < TestCase ] browser_single_test(tests) end -end \ No newline at end of file +end diff --git a/test/browser/core.rb b/test/browser/core.rb new file mode 100644 index 000000000..60521227b --- /dev/null +++ b/test/browser/core.rb @@ -0,0 +1,49 @@ +# encoding: utf-8 +require 'browser_test_helper' + +class CoreTest < TestCase + def test_core + tests = [ + { + :name => 'start', + :instance => browser_instance, + :url => browser_url + '/tests-core', + :action => [ + { + :execute => 'wait', + :value => 8, + }, + { + :execute => 'match', + :css => '.result .failed', + :value => '0', + :match_result => true, + }, + ], + }, + ] + browser_single_test(tests) + end + def test_form + tests = [ + { + :name => 'start', + :instance => browser_instance, + :url => browser_url + '/tests-form', + :action => [ + { + :execute => 'wait', + :value => 8, + }, + { + :execute => 'match', + :css => '.result .failed', + :value => '0', + :match_result => true, + }, + ], + }, + ] + browser_single_test(tests) + end +end diff --git a/test/browser/customer_ticket_create_test.rb b/test/browser/customer_ticket_create_test.rb index 60aa4d422..d22f50045 100644 --- a/test/browser/customer_ticket_create_test.rb +++ b/test/browser/customer_ticket_create_test.rb @@ -11,10 +11,6 @@ class CustomerTicketCreateTest < TestCase :execute => 'click', :css => 'a[href="#customer_ticket_new"]', }, - { - :execute => 'wait', - :value => 3, - }, { :execute => 'check', :css => '.ticket-create', @@ -47,11 +43,6 @@ class CustomerTicketCreateTest < TestCase :execute => 'wait', :value => 3, }, - { - :execute => 'check', - :css => '#login', - :result => false, - }, { :execute => 'check', :element => :url, diff --git a/test/browser/prefereces_test.rb b/test/browser/prefereces_test.rb index c28aab939..6046ad92e 100644 --- a/test/browser/prefereces_test.rb +++ b/test/browser/prefereces_test.rb @@ -15,17 +15,14 @@ class PreferencesTest < TestCase :execute => 'click', :css => 'a[href="#profile"]', }, - { - :execute => 'wait', - :value => 1, - }, { :execute => 'click', :css => 'a[href="#profile/language"]', }, { - :execute => 'wait', - :value => 1, + :execute => 'check', + :css => '#language', + :result => true, }, { :execute => 'select', @@ -40,11 +37,6 @@ class PreferencesTest < TestCase :execute => 'wait', :value => 6, }, - { - :execute => 'check', - :css => '#login', - :result => false, - }, { :execute => 'match', :css => 'body', diff --git a/test/browser/setting_test.rb b/test/browser/setting_test.rb index 45756bc42..e7c42f324 100644 --- a/test/browser/setting_test.rb +++ b/test/browser/setting_test.rb @@ -19,10 +19,6 @@ class SettingTest < TestCase :execute => 'click', :css => 'a[href="#settings/security/third_party_auth"]', }, - { - :execute => 'wait', - :value => 2, - }, { :execute => 'check', :css => '#auth_facebook select[name="auth_facebook"]', diff --git a/test/browser/signup_test.rb b/test/browser/signup_test.rb index 07cbb5aad..4d541539c 100644 --- a/test/browser/signup_test.rb +++ b/test/browser/signup_test.rb @@ -55,15 +55,10 @@ class SignupTest < TestCase }, { :execute => 'wait', - :value => 4, + :value => 2, }, # check action - { - :execute => 'check', - :css => '#login', - :result => false, - }, { :execute => 'check', :css => '#form-signup', @@ -80,4 +75,4 @@ class SignupTest < TestCase ] browser_single_test(tests) end -end \ No newline at end of file +end diff --git a/test/browser_test_helper.rb b/test/browser_test_helper.rb index 05a9c8331..69ddec753 100644 --- a/test/browser_test_helper.rb +++ b/test/browser_test_helper.rb @@ -23,19 +23,14 @@ class TestCase < Test::Unit::TestCase if !@browsers @browsers = [] end - if !ENV['REMOTE_URL'] + if !ENV['REMOTE_URL'] || ENV['REMOTE_URL'].empty? local_browser = Selenium::WebDriver.for( browser.to_sym ) browser_instance_preferences(local_browser) @browsers.push local_browser return local_browser end - caps = Selenium::WebDriver::Remote::Capabilities.send( - browser, - #:forceCreateProcess => true, - #:ensureCleanSession => true, - #:internetExplorerSwitches => 'InetCpl.cpl,ClearMyTracksByProcess 2', - ) + caps = Selenium::WebDriver::Remote::Capabilities.send( browser ) caps.platform = ENV['BROWSER_OS'] || 'Windows 2008' caps.version = ENV['BROWSER_VERSION'] || '8' local_browser = Selenium::WebDriver.for( @@ -61,9 +56,21 @@ class TestCase < Test::Unit::TestCase def teardown return if !@browsers - @browsers.each{ |local_browser| - local_browser.quit - } + + # only shut down browser type once on local webdriver tests + # otherwise this error will happen "Errno::ECONNREFUSED: Connection refused - connect(2)" + if !ENV['REMOTE_URL'] + shutdown = {} + @browsers.each{ |local_browser| + next if shutdown[ local_browser.browser ] + shutdown[ local_browser.browser ] = true + local_browser.quit + } + else + @browsers.each{ |local_browser| + local_browser.quit + } + end end # Add more helper methods to be used by all tests here... @@ -204,13 +211,11 @@ puts "NOTICE #{Time.now.to_s}: " + action.inspect elsif action[:element] == :alert element = instance.switch_to.alert elsif action[:execute] == 'login' - sleep 1 - login = instance.find_element( { :css => '#login' } ) - if !login + element = instance.find_element( { :css => '#login input[name="username"]' } ) + if !element assert( false, "(#{test[:name]}) no login box found!" ) return end - element = instance.find_element( { :css => '#login input[name="username"]' } ) element.clear element.send_keys( action[:username] ) element = instance.find_element( { :css => '#login input[name="password"]' } ) @@ -234,13 +239,12 @@ puts "NOTICE #{Time.now.to_s}: " + action.inspect elsif action[:execute] == 'create_ticket' instance.find_element( { :css => 'a[href="#new"]' } ).click instance.find_element( { :css => 'a[href="#ticket_create/call_inbound"]' } ).click - sleep 4 element = instance.find_element( { :css => '.active .ticket_create' } ) if !element assert( false, "(#{test[:name]}) no ticket create screen found!" ) return end - sleep 5 + sleep 4 element = instance.find_element( { :css => '.active .ticket_create input[name="customer_id_autocompletion"]' } ) element.clear element.send_keys( 'ma' )