From 6b81b791ed08477afd05be78d4014f56e518eb2e Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Tue, 27 Sep 2016 19:46:23 +0200 Subject: [PATCH] Detach not shown task to deduce dom nodes and increase speed. --- .../_application_controller.coffee | 18 +- .../_application_controller_generic.coffee | 149 +++++++------ .../app/controllers/_channel/chat.coffee | 4 +- .../app/controllers/_channel/facebook.coffee | 8 +- .../app/controllers/_channel/form.coffee | 4 +- .../app/controllers/_channel/twitter.coffee | 7 +- .../app/controllers/_profile/avatar.coffee | 4 +- .../_profile/calendar_subscriptions.coffee | 4 +- .../app/controllers/_profile/devices.coffee | 4 +- .../app/controllers/_profile/language.coffee | 4 +- .../_profile/linked_accounts.coffee | 4 +- .../controllers/_profile/notification.coffee | 4 +- .../app/controllers/_profile/password.coffee | 4 +- .../controllers/_profile/token_access.coffee | 4 +- .../javascripts/app/controllers/api.coffee | 6 +- .../app/controllers/calendar.coffee | 7 +- .../javascripts/app/controllers/chat.coffee | 6 + .../javascripts/app/controllers/cti.coffee | 14 ++ .../javascripts/app/controllers/groups.coffee | 4 +- .../app/controllers/integrations.coffee | 34 ++- .../javascripts/app/controllers/job.coffee | 4 +- .../javascripts/app/controllers/macro.coffee | 4 +- .../app/controllers/maintenance.coffee | 6 +- .../javascripts/app/controllers/manage.coffee | 35 +++- .../app/controllers/object_manager.coffee | 6 +- .../controllers/organization_profile.coffee | 6 + .../app/controllers/organizations.coffee | 4 +- .../app/controllers/overview.coffee | 4 +- .../app/controllers/package.coffee | 4 +- .../app/controllers/profile.coffee | 25 ++- .../app/controllers/report_profile.coffee | 4 +- .../javascripts/app/controllers/role.coffee | 4 +- .../app/controllers/session.coffee | 4 +- .../javascripts/app/controllers/sla.coffee | 3 +- .../javascripts/app/controllers/tag.coffee | 5 +- .../app/controllers/text_module.coffee | 4 +- .../app/controllers/ticket_overview.coffee | 126 ++++++++++- .../app/controllers/ticket_zoom.coffee | 196 ++++++++++-------- .../app/controllers/translation.coffee | 11 +- .../app/controllers/trigger.coffee | 4 +- .../app/controllers/user_profile.coffee | 6 + .../javascripts/app/controllers/users.coffee | 7 +- .../app_post/overview_list_collection.coffee | 2 +- .../app/lib/app_post/task_manager.coffee | 99 ++++++--- .../generic/navbar_level2/navbar.jst.eco | 2 +- public/assets/tests/taskbar.js | 88 ++++---- test/browser/aaa_getting_started_test.rb | 8 +- test/browser/admin_channel_email_test.rb | 14 +- test/browser/admin_object_manager_test.rb | 46 ++-- test/browser/agent_ticket_tag_test.rb | 32 +-- test/browser/chat_test.rb | 8 +- test/browser/first_steps_test.rb | 2 +- test/browser/form_test.rb | 6 +- test/browser/integration_test.rb | 134 ++++++------ .../browser/maintenance_login_message_test.rb | 6 +- test/browser/maintenance_mode_test.rb | 16 +- .../maintenance_session_message_test.rb | 20 +- test/browser/preferences_language_test.rb | 8 +- test/browser/preferences_token_access_test.rb | 32 +-- test/browser/setting_test.rb | 8 +- test/browser/switch_to_user_test.rb | 8 +- test/browser/translation_test.rb | 32 +-- test/browser_test_helper.rb | 158 +++++++------- test/integration/facebook_browser_test.rb | 62 +++--- test/integration/twitter_browser_test.rb | 78 +++---- 65 files changed, 975 insertions(+), 659 deletions(-) diff --git a/app/assets/javascripts/app/controllers/_application_controller.coffee b/app/assets/javascripts/app/controllers/_application_controller.coffee index 5209d4d4f..5479c089d 100644 --- a/app/assets/javascripts/app/controllers/_application_controller.coffee +++ b/app/assets/javascripts/app/controllers/_application_controller.coffee @@ -645,9 +645,19 @@ class App.ControllerPermanent extends App.Controller super - $('.content').addClass('hide') @navShow() +class App.ControllerSubContent extends App.Controller + constructor: -> + if @requiredPermission + @permissionCheckRedirect(@requiredPermission) + + super + + show: => + return if !@header + @title @header, true + class App.ControllerContent extends App.Controller constructor: -> if @requiredPermission @@ -655,10 +665,10 @@ class App.ControllerContent extends App.Controller super - $('.content').addClass('hide') - $('#content').removeClass('hide') - @navShow() + # hide tasks App.TaskManager.hideAll() + $('#content').removeClass('hide').removeClass('active') + @navShow() class App.ControllerModal extends App.Controller authenticateRequired: false diff --git a/app/assets/javascripts/app/controllers/_application_controller_generic.coffee b/app/assets/javascripts/app/controllers/_application_controller_generic.coffee index 4c4b0d864..a216e625d 100644 --- a/app/assets/javascripts/app/controllers/_application_controller_generic.coffee +++ b/app/assets/javascripts/app/controllers/_application_controller_generic.coffee @@ -373,19 +373,65 @@ class App.ControllerTabs extends App.Controller @lastActiveTab = $(e.target).attr('href') @Config.set('lastTab', @lastActiveTab) -class App.ControllerNavSidbar extends App.ControllerContent +class App.ControllerNavSidbar extends App.Controller constructor: (params) -> super - @navupdate '' - if @authenticateRequired @authenticateCheckRedirect() - @params = params + @user = App.User.find(App.Session.get('id')) + + @render(true) + + @bind('ui:rerender', + => + @render(true) + @updateNavigation(true) + ) + + show: (params) => + @navupdate '' + @shown = true + for key, value of params + if key isnt 'el' && key isnt 'shown' && key isnt 'match' + @[key] = value + @updateNavigation() + if @activeController && _.isFunction(@activeController.show) + @activeController.show(params) + + hide: => + @shown = false + if @activeController && _.isFunction(@activeController.hide) + @activeController.hide() + + render: (force = false) => + groups = @groupsSorted() + selectedItem = @selectedItem(groups) + + @html App.view('generic/navbar_level2/index')( + className: @configKey + ) + @$('.sidebar').html App.view('generic/navbar_level2/navbar')( + groups: groups + className: @configKey + selectedItem: selectedItem + ) + + updateNavigation: (force) => + groups = @groupsSorted() + selectedItem = @selectedItem(groups) + return if !selectedItem + return if !force && @lastTarget && selectedItem.target is @lastTarget + @lastTarget = selectedItem.target + @$('.sidebar li').removeClass('active') + @$(".sidebar li a[href=\"#{selectedItem.target}\"]").parent().addClass('active') + + @executeController(selectedItem) + + groupsSorted: => # get accessable groups - user = App.User.find(App.Session.get('id')) groups = App.Config.get(@configKey) groupsUnsorted = [] for key, item of groups @@ -395,13 +441,15 @@ class App.ControllerNavSidbar extends App.ControllerContent else match = false for permissionName in item.permission - if !match && user.permission(permissionName) + if !match && @user.permission(permissionName) match = true groupsUnsorted.push item - @groupsSorted = _.sortBy(groupsUnsorted, (item) -> return item.prio) + _.sortBy(groupsUnsorted, (item) -> return item.prio) + + selectedItem: (groups) => # get items of group - for group in @groupsSorted + for group in groups items = App.Config.get(@configKey) itemsUnsorted = [] for key, item of items @@ -412,76 +460,57 @@ class App.ControllerNavSidbar extends App.ControllerContent else match = false for permissionName in item.permission - if !match && user && user.permission(permissionName) + if !match && @user && @user.permission(permissionName) match = true itemsUnsorted.push item group.items = _.sortBy(itemsUnsorted, (item) -> return item.prio) - # check last selected item - selectedItem = undefined - selectedItemMeta = App.Config.get("Runtime::#{@configKey}") - keepLastMenuFor = 1000 * 60 * 10 - if selectedItemMeta && selectedItemMeta.date && new Date < new Date( selectedItemMeta.date.getTime() + keepLastMenuFor ) - selectedItem = selectedItemMeta.selectedItem - # set active item - for group in @groupsSorted + selectedItem = undefined + for group in groups if group.items for item in group.items - if !@target && !selectedItem - item.active = true - selectedItem = item - else if @target && item.target is window.location.hash - item.active = true - selectedItem = item - else if @target && window.location.hash.match(item.target) + if item.target.match("/#{@target}$") item.active = true selectedItem = item else item.active = false - @renderContainer(selectedItem) - @renderNavBar(selectedItem) + if !selectedItem + for group in groups + break if selectedItem + if group.items + for item in group.items + item.active = true + selectedItem = item + break - @bind( - 'ui:rerender' - => - @renderNavBar(selectedItem) - ) - - renderContainer: => - return if $( ".#{@configKey}" )[0] - @html App.view('generic/navbar_level2/index')( - className: @configKey - ) - - renderNavBar: (selectedItem) => - - # remember latest selected item - selectedItemMeta = - selectedItem: selectedItem - date: new Date - App.Config.set("Runtime::#{@configKey}", selectedItemMeta) - - @$('.sidebar').html App.view('generic/navbar_level2/navbar')( - groups: @groupsSorted - className: @configKey - ) - if selectedItem - @$('li').removeClass('active') - @$("a[href=\"#{selectedItem.target}\"]").parent().addClass('active') - @executeController(selectedItem) + selectedItem executeController: (selectedItem) => - # in case of rerendering - if @activeController && @activeController.render - @activeController.render() - return + if @activeController + @activeController.el.remove() + @activeController = undefined - @params.el = @$('.main') - @activeController = new selectedItem.controller(@params) + @$('.main').append('
') + @activeController = new selectedItem.controller( + el: @$('.main div') + ) + + setPosition: (position) => + return if @shown + return if !position + if position.main + @$('.main').scrollTop(position.main) + if position.main + @$('.sidebar').scrollTop(position.sidebar) + + currentPosition: => + data = + main: @$('.main').scrollTop() + sidebar: @$('.sidebar').scrollTop() class App.GenericHistory extends App.ControllerModal buttonClose: true diff --git a/app/assets/javascripts/app/controllers/_channel/chat.coffee b/app/assets/javascripts/app/controllers/_channel/chat.coffee index a08dcab2b..a33ee73d7 100644 --- a/app/assets/javascripts/app/controllers/_channel/chat.coffee +++ b/app/assets/javascripts/app/controllers/_channel/chat.coffee @@ -1,5 +1,6 @@ -class App.ChannelChat extends App.ControllerContent +class App.ChannelChat extends App.ControllerSubContent requiredPermission: 'admin.channel_chat' + header: 'Chat' events: 'change .js-params': 'updateParams' 'input .js-params': 'updateParams' @@ -111,7 +112,6 @@ class App.ChannelChat extends App.ControllerContent constructor: -> super - @title 'Chat' if @Session.get('email') @previewUrl = "www.#{@Session.get('email').replace(/^.+?\@/, '')}" diff --git a/app/assets/javascripts/app/controllers/_channel/facebook.coffee b/app/assets/javascripts/app/controllers/_channel/facebook.coffee index d9da63b37..af76b9415 100644 --- a/app/assets/javascripts/app/controllers/_channel/facebook.coffee +++ b/app/assets/javascripts/app/controllers/_channel/facebook.coffee @@ -1,5 +1,6 @@ -class Index extends App.ControllerContent +class Index extends App.ControllerSubContent requiredPermission: 'admin.channel_facebook' + header: 'Facebook' events: 'click .js-new': 'new' 'click .js-edit': 'edit' @@ -66,6 +67,11 @@ class Index extends App.ControllerContent if @channel_id @edit(undefined, @channel_id) + show: (params) => + for key, value of params + if key isnt 'el' && key isnt 'shown' && key isnt 'match' + @[key] = value + configApp: => external_credential = App.ExternalCredential.findByAttribute('name', 'facebook') contentInline = $(App.view('facebook/app_config')( diff --git a/app/assets/javascripts/app/controllers/_channel/form.coffee b/app/assets/javascripts/app/controllers/_channel/form.coffee index 1c4868605..23d8d5ec7 100644 --- a/app/assets/javascripts/app/controllers/_channel/form.coffee +++ b/app/assets/javascripts/app/controllers/_channel/form.coffee @@ -1,6 +1,7 @@ # coffeelint: disable=no_unnecessary_double_quotes -class App.ChannelForm extends App.ControllerContent +class App.ChannelForm extends App.ControllerSubContent requiredPermission: 'admin.channel_formular' + header: 'Form' events: 'change form.js-params': 'updateParams' 'keyup form.js-params': 'updateParams' @@ -12,7 +13,6 @@ class App.ChannelForm extends App.ControllerContent constructor: -> super - @title 'Form' App.Setting.fetchFull( @render force: false diff --git a/app/assets/javascripts/app/controllers/_channel/twitter.coffee b/app/assets/javascripts/app/controllers/_channel/twitter.coffee index 9becfbed4..9a0b8b6eb 100644 --- a/app/assets/javascripts/app/controllers/_channel/twitter.coffee +++ b/app/assets/javascripts/app/controllers/_channel/twitter.coffee @@ -1,4 +1,4 @@ -class Index extends App.ControllerContent +class Index extends App.ControllerSubContent requiredPermission: 'admin.channel_twitter' events: 'click .js-new': 'new' @@ -66,6 +66,11 @@ class Index extends App.ControllerContent if @channel_id @edit(undefined, @channel_id) + show: (params) => + for key, value of params + if key isnt 'el' && key isnt 'shown' && key isnt 'match' + @[key] = value + configApp: => external_credential = App.ExternalCredential.findByAttribute('name', 'twitter') contentInline = $(App.view('twitter/app_config')( diff --git a/app/assets/javascripts/app/controllers/_profile/avatar.coffee b/app/assets/javascripts/app/controllers/_profile/avatar.coffee index e7bbab7d3..eaf9cdcfd 100644 --- a/app/assets/javascripts/app/controllers/_profile/avatar.coffee +++ b/app/assets/javascripts/app/controllers/_profile/avatar.coffee @@ -1,5 +1,6 @@ -class Index extends App.ControllerContent +class Index extends App.ControllerSubContent requiredPermission: 'user_preferences.avatar' + header: 'Avatar' elements: '.js-upload': 'fileInput' '.avatar-gallery': 'avatarGallery' @@ -12,7 +13,6 @@ class Index extends App.ControllerContent constructor: -> super - @title 'Avatar', true @avatars = [] @loadAvatarList() diff --git a/app/assets/javascripts/app/controllers/_profile/calendar_subscriptions.coffee b/app/assets/javascripts/app/controllers/_profile/calendar_subscriptions.coffee index c785404d0..c07264bea 100644 --- a/app/assets/javascripts/app/controllers/_profile/calendar_subscriptions.coffee +++ b/app/assets/javascripts/app/controllers/_profile/calendar_subscriptions.coffee @@ -1,5 +1,6 @@ -class CalendarSubscriptions extends App.ControllerContent +class CalendarSubscriptions extends App.ControllerSubContent requiredPermission: 'user_preferences.calendar+ticket.agent' + header: 'Calendar' elements: 'input[type=checkbox]': 'options' 'output': 'output' @@ -11,7 +12,6 @@ class CalendarSubscriptions extends App.ControllerContent constructor: -> super - @title 'Calendar', true @translationTable = new_open: App.i18n.translatePlain('new & open') diff --git a/app/assets/javascripts/app/controllers/_profile/devices.coffee b/app/assets/javascripts/app/controllers/_profile/devices.coffee index 173a91f30..de387907c 100644 --- a/app/assets/javascripts/app/controllers/_profile/devices.coffee +++ b/app/assets/javascripts/app/controllers/_profile/devices.coffee @@ -1,11 +1,11 @@ -class Index extends App.ControllerContent +class Index extends App.ControllerSubContent requiredPermission: 'user_preferences.device' + header: 'Devices' events: 'click [data-type=delete]': 'delete' constructor: -> super - @title 'Devices', true @load() @interval( => diff --git a/app/assets/javascripts/app/controllers/_profile/language.coffee b/app/assets/javascripts/app/controllers/_profile/language.coffee index 8218fde92..051fae300 100644 --- a/app/assets/javascripts/app/controllers/_profile/language.coffee +++ b/app/assets/javascripts/app/controllers/_profile/language.coffee @@ -1,11 +1,11 @@ -class Index extends App.ControllerContent +class Index extends App.ControllerSubContent requiredPermission: 'user_preferences.language' + header: 'Language' events: 'submit form': 'update' constructor: -> super - @title 'Language', true @render() render: => diff --git a/app/assets/javascripts/app/controllers/_profile/linked_accounts.coffee b/app/assets/javascripts/app/controllers/_profile/linked_accounts.coffee index 4bbab8d95..dc6b76911 100644 --- a/app/assets/javascripts/app/controllers/_profile/linked_accounts.coffee +++ b/app/assets/javascripts/app/controllers/_profile/linked_accounts.coffee @@ -1,11 +1,11 @@ -class Index extends App.ControllerContent +class Index extends App.ControllerSubContent requiredPermission: 'user_preferences.linked_accounts' + header: 'Linked Accounts' events: 'click .js-remove': 'remove' constructor: -> super - @title 'Linked Accounts', true @render() render: => diff --git a/app/assets/javascripts/app/controllers/_profile/notification.coffee b/app/assets/javascripts/app/controllers/_profile/notification.coffee index 4b8bd7d32..147e375cd 100644 --- a/app/assets/javascripts/app/controllers/_profile/notification.coffee +++ b/app/assets/javascripts/app/controllers/_profile/notification.coffee @@ -1,5 +1,6 @@ -class Index extends App.ControllerContent +class Index extends App.ControllerSubContent requiredPermission: 'user_preferences.notifications+ticket.agent' + header: 'Notifications' events: 'submit form': 'update' 'change .js-notificationSound': 'previewSound' @@ -45,7 +46,6 @@ class Index extends App.ControllerContent constructor: -> super - @title 'Notifications', true @render() render: => diff --git a/app/assets/javascripts/app/controllers/_profile/password.coffee b/app/assets/javascripts/app/controllers/_profile/password.coffee index d8ad6fb80..5d60c79f6 100644 --- a/app/assets/javascripts/app/controllers/_profile/password.coffee +++ b/app/assets/javascripts/app/controllers/_profile/password.coffee @@ -1,11 +1,11 @@ -class Index extends App.ControllerContent +class Index extends App.ControllerSubContent requiredPermission: 'user_preferences.password' + header: 'Password' events: 'submit form': 'update' constructor: -> super - @title 'Password', true @render() render: => diff --git a/app/assets/javascripts/app/controllers/_profile/token_access.coffee b/app/assets/javascripts/app/controllers/_profile/token_access.coffee index 378426c30..fdb8dba52 100644 --- a/app/assets/javascripts/app/controllers/_profile/token_access.coffee +++ b/app/assets/javascripts/app/controllers/_profile/token_access.coffee @@ -1,12 +1,12 @@ -class Index extends App.ControllerContent +class Index extends App.ControllerSubContent requiredPermission: 'user_preferences.access_token' + header: 'Token Access' events: 'click .js-delete': 'delete' 'click .js-create': 'create' constructor: -> super - @title 'Token Access', true @load() @interval( diff --git a/app/assets/javascripts/app/controllers/api.coffee b/app/assets/javascripts/app/controllers/api.coffee index fcba593c3..50cd78ce1 100644 --- a/app/assets/javascripts/app/controllers/api.coffee +++ b/app/assets/javascripts/app/controllers/api.coffee @@ -1,5 +1,6 @@ -class Index extends App.ControllerContent +class Index extends App.ControllerSubContent requiredPermission: 'admin.api' + header: 'API' events: 'click .action': 'action' 'change .js-TokenAccess input': 'toggleTokenAccess' @@ -12,9 +13,6 @@ class Index extends App.ControllerContent constructor: -> super - - @title 'API', true - App.Setting.fetchFull( @render force: false diff --git a/app/assets/javascripts/app/controllers/calendar.coffee b/app/assets/javascripts/app/controllers/calendar.coffee index fc2006757..3e361bc9e 100644 --- a/app/assets/javascripts/app/controllers/calendar.coffee +++ b/app/assets/javascripts/app/controllers/calendar.coffee @@ -1,5 +1,6 @@ -class Index extends App.ControllerContent +class Index extends App.ControllerSubContent requiredPermission: 'admin.calendar' + header: 'Calendars' events: 'click .js-new': 'new' 'click .js-edit': 'edit' @@ -73,7 +74,7 @@ class Index extends App.ControllerContent new: => new App.ControllerGenericNew( pageData: - title: 'Calendars' + title: @header object: 'Calendar' objects: 'Calendars' genericObject: 'Calendar' @@ -87,7 +88,7 @@ class Index extends App.ControllerContent new App.ControllerGenericEdit( id: id pageData: - title: 'Calendars' + title: @header object: 'Calendar' objects: 'Calendars' genericObject: 'Calendar' diff --git a/app/assets/javascripts/app/controllers/chat.coffee b/app/assets/javascripts/app/controllers/chat.coffee index b1ca174cb..0381eff35 100644 --- a/app/assets/javascripts/app/controllers/chat.coffee +++ b/app/assets/javascripts/app/controllers/chat.coffee @@ -318,6 +318,12 @@ class App.CustomerChat extends App.Controller @clearDelay(@idleTimeoutId) @idleTimeoutId = undefined + setPosition: (position) => + @$('.main').scrollTop(position) + + currentPosition: => + @$('.main').scrollTop() + class CustomerChatRouter extends App.ControllerPermanent requiredPermission: 'chat.agent' constructor: (params) -> diff --git a/app/assets/javascripts/app/controllers/cti.coffee b/app/assets/javascripts/app/controllers/cti.coffee index 9b5d4da8f..c05a8ed4c 100644 --- a/app/assets/javascripts/app/controllers/cti.coffee +++ b/app/assets/javascripts/app/controllers/cti.coffee @@ -58,6 +58,14 @@ class App.CTI extends App.Controller 'cti_rerender' ) + # after a new websocket connection, load again + @bind('spool:sent', => + if @initSpoolSent + @load() + return + @initSpoolSent = true + ) + # fetch data, render view load: -> @ajax( @@ -191,6 +199,12 @@ class App.CTI extends App.Controller processData: true ) + setPosition: (position) => + @$('.main').scrollTop(position) + + currentPosition: => + @$('.main').scrollTop() + class CTIRouter extends App.ControllerPermanent requiredPermission: 'cti.agent' constructor: (params) -> diff --git a/app/assets/javascripts/app/controllers/groups.coffee b/app/assets/javascripts/app/controllers/groups.coffee index 49737e87f..c84d07c21 100644 --- a/app/assets/javascripts/app/controllers/groups.coffee +++ b/app/assets/javascripts/app/controllers/groups.coffee @@ -1,5 +1,6 @@ -class Index extends App.ControllerContent +class Index extends App.ControllerSubContent requiredPermission: 'admin.group' + header: 'Groups' constructor: -> super @@ -8,7 +9,6 @@ class Index extends App.ControllerContent id: @id genericObject: 'Group' pageData: - title: 'Groups' home: 'groups' object: 'Group' objects: 'Groups' diff --git a/app/assets/javascripts/app/controllers/integrations.coffee b/app/assets/javascripts/app/controllers/integrations.coffee index a650e85c4..5d419e068 100644 --- a/app/assets/javascripts/app/controllers/integrations.coffee +++ b/app/assets/javascripts/app/controllers/integrations.coffee @@ -1,37 +1,57 @@ -class Index extends App.ControllerContent +class Index extends App.ControllerSubContent requiredPermission: 'admin.integration' + header: 'Integrations' constructor: -> super - @title 'Integrations', true - @integrationItems = App.Config.get('NavBarIntegrations') + @subscribeId = App.Setting.subscribe(@render, initFetch: true, clear: false) + + show: (params) => + return if !params.target && !params.integration if @initRender + + @target = params.target + @integration = params.integration + if !@initRender + @requestedIntegration = true + return if !@integration - @subscribeId = App.Setting.subscribe(@render, initFetch: true, clear: false) + if !params.noRender + @render() return for key, value of @integrationItems - if value.target is "#system/#{@target}/#{@integration}" + if value.target is "#system/#{params.target}/#{params.integration}" config = value break new config.controller( - el: @el.closest('.main') + el: @el ) render: => + return if @initRender && @integration + + @initRender = true integrations = [] for key, value of @integrationItems value.key = key integrations.push value integrations = _.sortBy(integrations, (item) -> return item.name) - @html App.view('integration/index')( head: 'Integrations' integrations: integrations ) + return if !@requestedIntegration + @show( + target: @target + integration: @integration + noRender: true + ) + @requestedIntegration = undefined + release: => if @subscribeId App.Setting.unsubscribe(@subscribeId) diff --git a/app/assets/javascripts/app/controllers/job.coffee b/app/assets/javascripts/app/controllers/job.coffee index 3d56bb87f..22d3526e1 100644 --- a/app/assets/javascripts/app/controllers/job.coffee +++ b/app/assets/javascripts/app/controllers/job.coffee @@ -1,5 +1,6 @@ -class Index extends App.ControllerContent +class Index extends App.ControllerSubContent requiredPermission: 'admin.scheduler' + header: 'Scheduler' constructor: -> super @@ -9,7 +10,6 @@ class Index extends App.ControllerContent genericObject: 'Job' defaultSortBy: 'name' pageData: - title: 'Scheduler' home: 'Jobs' object: 'Scheduler' objects: 'Schedulers' diff --git a/app/assets/javascripts/app/controllers/macro.coffee b/app/assets/javascripts/app/controllers/macro.coffee index 122766445..2fd21084b 100644 --- a/app/assets/javascripts/app/controllers/macro.coffee +++ b/app/assets/javascripts/app/controllers/macro.coffee @@ -1,5 +1,6 @@ -class Index extends App.ControllerContent +class Index extends App.ControllerSubContent requiredPermission: 'admin.macro' + header: 'Macros' constructor: -> super @@ -8,7 +9,6 @@ class Index extends App.ControllerContent id: @id genericObject: 'Macro' pageData: - title: 'Macros' home: 'macros' object: 'Macro' objects: 'Macros' diff --git a/app/assets/javascripts/app/controllers/maintenance.coffee b/app/assets/javascripts/app/controllers/maintenance.coffee index 871b3207e..874a2ae21 100644 --- a/app/assets/javascripts/app/controllers/maintenance.coffee +++ b/app/assets/javascripts/app/controllers/maintenance.coffee @@ -1,5 +1,6 @@ -class Index extends App.ControllerContent +class Index extends App.ControllerSubContent requiredPermission: 'admin.maintenance' + header: 'Maintenance' events: 'change .js-modeSetting input': 'setMode' 'change .js-loginSetting input': 'setLogin' @@ -12,9 +13,6 @@ class Index extends App.ControllerContent constructor: -> super - - @title 'Maintenance', true - @subscribeId = App.Setting.subscribe(@render, initFetch: true, clear: false) release: => diff --git a/app/assets/javascripts/app/controllers/manage.coffee b/app/assets/javascripts/app/controllers/manage.coffee index 23b2cb5fb..ecbd3a1f4 100644 --- a/app/assets/javascripts/app/controllers/manage.coffee +++ b/app/assets/javascripts/app/controllers/manage.coffee @@ -1,16 +1,33 @@ -class IndexRouter extends App.ControllerNavSidbar +class App.Manage extends App.ControllerNavSidbar authenticateRequired: true configKey: 'NavBarAdmin' -App.Config.set('manage', IndexRouter, 'Routes') -App.Config.set('manage/:target', IndexRouter, 'Routes') -App.Config.set('settings/:target', IndexRouter, 'Routes') -App.Config.set('channels/:target', IndexRouter, 'Routes') -App.Config.set('channels/:target/:channel_id', IndexRouter, 'Routes') -App.Config.set('system/:target', IndexRouter, 'Routes') -App.Config.set('system/:target/:integration', IndexRouter, 'Routes') +class ManageRouter extends App.ControllerPermanent + requiredPermission: ['admin.*'] + + constructor: (params) -> + super + + # check authentication + @authenticateCheckRedirect() + + App.TaskManager.execute( + key: 'Manage' + controller: 'Manage' + params: params + show: true + persistent: true + ) + +App.Config.set('manage', ManageRouter, 'Routes') +App.Config.set('manage/:target', ManageRouter, 'Routes') +App.Config.set('settings/:target', ManageRouter, 'Routes') +App.Config.set('channels/:target', ManageRouter, 'Routes') +App.Config.set('channels/:target/:channel_id', ManageRouter, 'Routes') +App.Config.set('system/:target', ManageRouter, 'Routes') +App.Config.set('system/:target/:integration', ManageRouter, 'Routes') App.Config.set('Manage', { prio: 1000, name: 'Manage', target: '#manage', permission: ['admin.*'] }, 'NavBarAdmin') App.Config.set('Channels', { prio: 2500, name: 'Channels', target: '#channels', permission: ['admin.*'] }, 'NavBarAdmin') App.Config.set('Settings', { prio: 7000, name: 'Settings', target: '#settings', permission: ['admin.*'] }, 'NavBarAdmin') -App.Config.set('System', { prio: 8000, name: 'System', target: '#system', permission: ['admin.*'] }, 'NavBarAdmin') +App.Config.set('System', { prio: 8000, name: 'System', target: '#system', permission: ['admin.*'] }, 'NavBarAdmin') \ No newline at end of file diff --git a/app/assets/javascripts/app/controllers/object_manager.coffee b/app/assets/javascripts/app/controllers/object_manager.coffee index 9ea95dba8..09b7edd1a 100644 --- a/app/assets/javascripts/app/controllers/object_manager.coffee +++ b/app/assets/javascripts/app/controllers/object_manager.coffee @@ -1,12 +1,9 @@ # coffeelint: disable=duplicate_key class Index extends App.ControllerTabs requiredPermission: 'admin.object' - header: 'Object Manager' constructor: -> super - @title 'Objects', true - # get data @startLoading() @ajax( @@ -32,7 +29,8 @@ class Index extends App.ControllerTabs @render() -class Items extends App.ControllerContent +class Items extends App.ControllerSubContent + header: 'Object Manager' events: 'click .js-delete': 'destroy' 'click .js-new': 'new' diff --git a/app/assets/javascripts/app/controllers/organization_profile.coffee b/app/assets/javascripts/app/controllers/organization_profile.coffee index 46c603367..069191cf9 100644 --- a/app/assets/javascripts/app/controllers/organization_profile.coffee +++ b/app/assets/javascripts/app/controllers/organization_profile.coffee @@ -62,6 +62,12 @@ class App.OrganizationProfile extends App.Controller genericObject: organization ) + setPosition: (position) => + @$('.profile').scrollTop(position) + + currentPosition: => + @$('.profile').scrollTop() + class ActionRow extends App.ObserverController model: 'Organization' observe: diff --git a/app/assets/javascripts/app/controllers/organizations.coffee b/app/assets/javascripts/app/controllers/organizations.coffee index 0942363f8..0e0f0b1da 100644 --- a/app/assets/javascripts/app/controllers/organizations.coffee +++ b/app/assets/javascripts/app/controllers/organizations.coffee @@ -1,5 +1,6 @@ -class Index extends App.ControllerContent +class Index extends App.ControllerSubContent requiredPermission: 'admin.organization' + header: 'Organizations' constructor: -> super @@ -8,7 +9,6 @@ class Index extends App.ControllerContent id: @id genericObject: 'Organization' pageData: - title: 'Organizations' home: 'organizations' object: 'Organization' objects: 'Organizations' diff --git a/app/assets/javascripts/app/controllers/overview.coffee b/app/assets/javascripts/app/controllers/overview.coffee index ce4c31182..3a8fae430 100644 --- a/app/assets/javascripts/app/controllers/overview.coffee +++ b/app/assets/javascripts/app/controllers/overview.coffee @@ -1,5 +1,6 @@ -class Index extends App.ControllerContent +class Index extends App.ControllerSubContent requiredPermission: 'admin.overview' + header: 'Overviews' constructor: -> super @@ -10,7 +11,6 @@ class Index extends App.ControllerContent defaultSortBy: 'prio' #groupBy: 'role' pageData: - title: 'Overviews' home: 'overviews' object: 'Overview' objects: 'Overviews' diff --git a/app/assets/javascripts/app/controllers/package.coffee b/app/assets/javascripts/app/controllers/package.coffee index 650f06683..00d9702a0 100644 --- a/app/assets/javascripts/app/controllers/package.coffee +++ b/app/assets/javascripts/app/controllers/package.coffee @@ -1,11 +1,11 @@ -class Index extends App.ControllerContent +class Index extends App.ControllerSubContent requiredPermission: 'admin.package' + header: 'Packages' events: 'click .action': 'action' constructor: -> super - @title 'Packages', true @load() load: -> diff --git a/app/assets/javascripts/app/controllers/profile.coffee b/app/assets/javascripts/app/controllers/profile.coffee index afec160b6..00e6bf92f 100644 --- a/app/assets/javascripts/app/controllers/profile.coffee +++ b/app/assets/javascripts/app/controllers/profile.coffee @@ -1,9 +1,28 @@ -class Index extends App.ControllerNavSidbar +class App.Profile extends App.ControllerNavSidbar authenticateRequired: true configKey: 'NavBarProfile' -App.Config.set('profile', Index, 'Routes') -App.Config.set('profile/:target', Index, 'Routes') +class ProfileRouter extends App.ControllerPermanent + requiredPermission: ['user_preferences.*'] + + constructor: (params) -> + super + + # check authentication + @authenticateCheckRedirect() + + App.TaskManager.execute( + key: 'Profile' + controller: 'Profile' + params: params + show: true + persistent: true + ) + +App.Config.set('profile', ProfileRouter, 'Routes') +App.Config.set('profile/:target', ProfileRouter, 'Routes') + +App.Config.set('Profile', { controller: 'Profile', permission: ['user_preferences.*'] }, 'permanentTask') App.Config.set('Profile', { prio: 1000, name: 'Profile', target: '#profile' }, 'NavBarProfile') App.Config.set('Profile', { prio: 1700, parent: '#current_user', name: 'Profile', target: '#profile', translate: true }, 'NavBarRight') diff --git a/app/assets/javascripts/app/controllers/report_profile.coffee b/app/assets/javascripts/app/controllers/report_profile.coffee index e250b60b4..060e85806 100644 --- a/app/assets/javascripts/app/controllers/report_profile.coffee +++ b/app/assets/javascripts/app/controllers/report_profile.coffee @@ -1,5 +1,6 @@ -class Index extends App.ControllerContent +class Index extends App.ControllerSubContent requiredPermission: 'admin.report_profile' + header: 'Report Profile' constructor: -> super @@ -8,7 +9,6 @@ class Index extends App.ControllerContent id: @id genericObject: 'ReportProfile' pageData: - title: 'Report Profile' home: 'report_profiles' object: 'Report Profile' objects: 'Report Profiles' diff --git a/app/assets/javascripts/app/controllers/role.coffee b/app/assets/javascripts/app/controllers/role.coffee index 1c280f8a8..b4b4d7034 100644 --- a/app/assets/javascripts/app/controllers/role.coffee +++ b/app/assets/javascripts/app/controllers/role.coffee @@ -1,5 +1,6 @@ -class Index extends App.ControllerContent +class Index extends App.ControllerSubContent requiredPermission: 'admin.role' + header: 'Roles' constructor: -> super @@ -8,7 +9,6 @@ class Index extends App.ControllerContent id: @id genericObject: 'Role' pageData: - title: 'Roles' home: 'roles' object: 'Role' objects: 'Roles' diff --git a/app/assets/javascripts/app/controllers/session.coffee b/app/assets/javascripts/app/controllers/session.coffee index d1e5af483..57bdd0a16 100644 --- a/app/assets/javascripts/app/controllers/session.coffee +++ b/app/assets/javascripts/app/controllers/session.coffee @@ -1,11 +1,11 @@ -class Index extends App.ControllerContent +class Index extends App.ControllerSubContent requiredPermission: 'admin.session' + header: 'Sessions' events: 'click .js-delete': 'destroy' constructor: -> super - @title 'Sessions', true @load() @interval( => diff --git a/app/assets/javascripts/app/controllers/sla.coffee b/app/assets/javascripts/app/controllers/sla.coffee index 33a9dc373..c591bc96d 100644 --- a/app/assets/javascripts/app/controllers/sla.coffee +++ b/app/assets/javascripts/app/controllers/sla.coffee @@ -1,5 +1,6 @@ -class Index extends App.ControllerContent +class Index extends App.ControllerSubContent requiredPermission: 'admin.sla' + header: 'SLAs' events: 'click .js-new': 'new' 'click .js-edit': 'edit' diff --git a/app/assets/javascripts/app/controllers/tag.coffee b/app/assets/javascripts/app/controllers/tag.coffee index 1c322ea8f..49039a90c 100644 --- a/app/assets/javascripts/app/controllers/tag.coffee +++ b/app/assets/javascripts/app/controllers/tag.coffee @@ -1,5 +1,6 @@ -class Index extends App.ControllerContent +class Index extends App.ControllerSubContent requiredPermission: 'admin.tag' + header: 'Tags' events: 'change .js-newTagSetting input': 'setTagNew' 'submit .js-create': 'create' @@ -9,7 +10,6 @@ class Index extends App.ControllerContent constructor: -> super - @title 'Tags', true @subscribeId = App.Setting.subscribe(@render, initFetch: true, clear: false) release: => @@ -27,7 +27,6 @@ class Index extends App.ControllerContent setTagNew: (e) => value = @tagNewSetting.prop('checked') - console.log('aa', value) App.Setting.set('tag_new', value) create: (e) => diff --git a/app/assets/javascripts/app/controllers/text_module.coffee b/app/assets/javascripts/app/controllers/text_module.coffee index 98ecde19f..5cfa39dec 100644 --- a/app/assets/javascripts/app/controllers/text_module.coffee +++ b/app/assets/javascripts/app/controllers/text_module.coffee @@ -1,5 +1,6 @@ -class Index extends App.ControllerContent +class Index extends App.ControllerSubContent requiredPermission: 'admin.text_module' + header: 'TextModules' constructor: -> super @@ -8,7 +9,6 @@ class Index extends App.ControllerContent id: @id genericObject: 'TextModule' pageData: - title: 'TextModules' home: 'text_modules' object: 'TextModule' objects: 'TextModules' diff --git a/app/assets/javascripts/app/controllers/ticket_overview.coffee b/app/assets/javascripts/app/controllers/ticket_overview.coffee index 62a13af8b..ed9aba9de 100644 --- a/app/assets/javascripts/app/controllers/ticket_overview.coffee +++ b/app/assets/javascripts/app/controllers/ticket_overview.coffee @@ -1,5 +1,6 @@ class App.TicketOverview extends App.Controller className: 'overviews' + activeFocus: 'nav' constructor: -> super @@ -18,12 +19,22 @@ class App.TicketOverview extends App.Controller view: @view @contentController = new Table - el: elLocal.find('.overview-table') - view: @view + el: elLocal.find('.overview-table') + view: @view + keyboardOn: @keyboardOn + keyboardOff: @keyboardOff @html elLocal + @el.find('.main').on('click', => + @activeFocus = 'overview' + ) + @el.find('.sidebar').on('click', => + @activeFocus = 'nav' + ) + @bind 'overview:fetch', => + return if !@view update = => App.OverviewListCollection.fetch(@view) @delay(update, 2800, 'overview:fetch') @@ -36,6 +47,7 @@ class App.TicketOverview extends App.Controller "#ticket/view/#{@view}" show: (params) => + @keyboardOn() # highlight navbar @navupdate '#ticket/view' @@ -70,16 +82,109 @@ class App.TicketOverview extends App.Controller ) hide: => + @keyboardOff() + if @navBarController @navBarController.active(false) if @navBarControllerVertical @navBarControllerVertical.active(false) + setPosition: (position) => + @$('.main').scrollTop(position) + + currentPosition: => + @$('.main').scrollTop() + changed: -> false release: -> - # no + @keyboardOff() + super + + keyboardOn: => + $(window).off 'keydown.overview_navigation' + $(window).on 'keydown.overview_navigation', @listNavigate + + keyboardOff: -> + $(window).off 'keydown.overview_navigation' + + listNavigate: (e) => + if e.keyCode is 38 # up + e.preventDefault() + @nudge(e, -1) + return + else if e.keyCode is 40 # down + e.preventDefault() + @nudge(e, 1) + return + else if e.keyCode is 32 # space + e.preventDefault() + if @activeFocus is 'overview' + @$('.table-overview table tbody tr.is-hover td.js-checkbox-field label input').first().click() + else if e.keyCode is 9 # tab + e.preventDefault() + if @activeFocus is 'nav' + @activeFocus = 'overview' + @nudge(e, 1) + else + @activeFocus = 'nav' + else if e.keyCode is 13 # enter + if @activeFocus is 'overview' + location = @$('.table-overview table tbody tr.is-hover a').first().attr('href') + if location + @navigate location + + nudge: (e, position) -> + + if @activeFocus is 'overview' + items = @$('.table-overview table tbody') + current = items.find('tr.is-hover') + + if !current.size() + items.find('tr').first().addClass('is-hover') + return + + if position is 1 + next = current.next('tr') + if next.size() + current.removeClass('is-hover') + next.addClass('is-hover') + else + prev = current.prev('tr') + if prev.size() + current.removeClass('is-hover') + prev.addClass('is-hover') + + if next + @scrollToIfNeeded(next, true) + if prev + @scrollToIfNeeded(prev, true) + + else + # get current + items = @$('.sidebar') + current = items.find('li.active') + + if !current.size() + location = items.find('li a').first().attr('href') + if location + @navigate location + return + + if position is 1 + next = current.next('li') + if next.size() + @navigate next.find('a').attr('href') + else + prev = current.prev('li') + if prev.size() + @navigate prev.find('a').attr('href') + + if next + @scrollToIfNeeded(next, true) + if prev + @scrollToIfNeeded(prev, true) class Navbar extends App.Controller elements: @@ -204,6 +309,7 @@ class Table extends App.Controller # rerender view, e. g. on langauge change @bind 'ui:rerender', => return if !@authenticateCheck() + return if !@view @render(App.OverviewListCollection.get(@view)) release: => @@ -380,7 +486,7 @@ class Table extends App.Controller [ callbackLinkToTicket, callbackTicketTitleAdd ] bindCheckbox: events: - 'click': callbackCheckbox + 'click': callbackCheckbox ) @setSelected(@selected) @@ -440,10 +546,12 @@ class Table extends App.Controller settings: (e) => e.preventDefault() + @keyboardOff() new App.OverviewSettings( - overview_id: @overview.id - view_mode: @view_mode - container: @el.closest('.content') + overview_id: @overview.id + view_mode: @view_mode + container: @el.closest('.content') + onCloseCallback: @keyboardOn ) class BulkForm extends App.Controller @@ -735,6 +843,10 @@ class App.OverviewSettings extends App.ControllerModal ) controller.form + onClose: => + if @onCloseCallback + @onCloseCallback() + onSubmit: (e) => params = @formParam(e.target) diff --git a/app/assets/javascripts/app/controllers/ticket_zoom.coffee b/app/assets/javascripts/app/controllers/ticket_zoom.coffee index b87c11797..76bbdbcc9 100644 --- a/app/assets/javascripts/app/controllers/ticket_zoom.coffee +++ b/app/assets/javascripts/app/controllers/ticket_zoom.coffee @@ -84,46 +84,10 @@ class App.TicketZoom extends App.Controller processData: true queue: true success: (data, status, xhr) => - console.log('fetched', ignoreSame) - - # check if ticket has changed - newTicketRaw = data.assets.Ticket[@ticket_id] - console.log(newTicketRaw.updated_at) - console.log(@ticketUpdatedAtLastCall) - - if @ticketUpdatedAtLastCall - - # ignore if record is already shown - if ignoreSame && new Date(newTicketRaw.updated_at).getTime() is new Date(@ticketUpdatedAtLastCall).getTime() - console.log('debug no fetched, current ticket already there or requested') - return - - # do not render if newer ticket is already requested - if new Date(newTicketRaw.updated_at).getTime() < new Date(@ticketUpdatedAtLastCall).getTime() - console.log('fetched no fetch, current ticket already newer') - return - - # remember current record if newer as requested record - if new Date(newTicketRaw.updated_at).getTime() > new Date(@ticketUpdatedAtLastCall).getTime() - @ticketUpdatedAtLastCall = newTicketRaw.updated_at - else - @ticketUpdatedAtLastCall = newTicketRaw.updated_at - - # notify if ticket changed not by my self - if @initFetched - if newTicketRaw.updated_by_id isnt @Session.get('id') - App.TaskManager.notify(@task_key) - @initFetched = true - - @load(data) + @load(data, ignoreSame) App.SessionStorage.set(@key, data) - if !@doNotLog - @doNotLog = 1 - @recentView('Ticket', @ticket_id) - error: (xhr) => - statusText = xhr.statusText status = xhr.status detail = xhr.responseText @@ -160,7 +124,40 @@ class App.TicketZoom extends App.Controller ) ) - load: (data) => + load: (data, ignoreSame = false, local = false) => + + # check if ticket has changed + newTicketRaw = data.assets.Ticket[@ticket_id] + console.log(newTicketRaw.updated_at) + console.log(@ticketUpdatedAtLastCall) + + if @ticketUpdatedAtLastCall + + # ignore if record is already shown + if ignoreSame && new Date(newTicketRaw.updated_at).getTime() is new Date(@ticketUpdatedAtLastCall).getTime() + console.log('debug no fetched, current ticket already there or requested') + return + + # do not render if newer ticket is already requested + if new Date(newTicketRaw.updated_at).getTime() < new Date(@ticketUpdatedAtLastCall).getTime() + console.log('fetched no fetch, current ticket already newer') + return + + # remember current record if newer as requested record + if new Date(newTicketRaw.updated_at).getTime() > new Date(@ticketUpdatedAtLastCall).getTime() + @ticketUpdatedAtLastCall = newTicketRaw.updated_at + else + @ticketUpdatedAtLastCall = newTicketRaw.updated_at + + # notify if ticket changed not by my self + if @initFetched + if newTicketRaw.updated_by_id isnt @Session.get('id') + App.TaskManager.notify(@task_key) + @initFetched = true + + if !@doNotLog + @doNotLog = 1 + @recentView('Ticket', @ticket_id) # remember article ids @ticket_article_ids = data.ticket_article_ids @@ -182,7 +179,7 @@ class App.TicketZoom extends App.Controller @ticket.article = undefined # render page - @render() + @render(local) meta: => @@ -217,39 +214,69 @@ class App.TicketZoom extends App.Controller # set all notifications to seen App.OnlineNotification.seen('Ticket', @ticket_id) - scrollToPosition = (position, delay) => - scrollToDelay = => - if position is 'article' - @scrollToArticle(@last_article_id) - return - @scrollToBottom() - @delay(scrollToDelay, delay, 'scrollToPosition') - - # scroll to article if given - if params.article_id && params.article_id isnt @last_article_id - @last_article_id = params.article_id - scrollToPosition('article', 300) - # if controller is executed twice, go to latest article (e. g. click on notification) if @activeState - scrollToPosition('bottom', 300) - return + if @ticket_article_ids + @shown = false @activeState = true - - # if ticket is shown the first time - if !@shown - @shown = true - - # trigger shown to article - App.Event.trigger('ui::ticket::shown', { ticket_id: @ticket_id }) - - # scroll to end of page - scrollToPosition('bottom', 100) + @pagePosition(params) @positionPageHeaderStart() @autosaveStart() @shortcutNavigationStart() + pagePosition: (params = {}) => + + # remember for later + return if params.type is 'init' && !@shown + + if params.article_id + article_id = params.article_id + params.article_id = undefined + else if @pagePositionData + article_id = @pagePositionData + @pagePositionData = undefined + + # scroll to article if given + scrollToPosition = (position, delay) => + scrollToDelay = => + if position is 'article' + @scrollToArticle(article_id) + @positionPageHeaderUpdate() + return + @scrollToBottom() + @positionPageHeaderUpdate() + @delay(scrollToDelay, delay, 'scrollToPosition') + + # trigger shown to article + if !@shown + @shown = true + App.Event.trigger('ui::ticket::shown', { ticket_id: @ticket_id }) + scrollToPosition('bottom', 50) + return + + # scroll to article if given + if article_id && article_id isnt @last_article_id + @last_article_id = article_id + scrollToPosition('article', 300) + return + + # scroll to end if new article has been added + if !@last_ticket_article_ids || !_.isEqual(_.sortBy(@last_ticket_article_ids), _.sortBy(@ticket_article_ids)) + @last_ticket_article_ids = @ticket_article_ids + scrollToPosition('bottom', 100) + return + + setPosition: (position) => + @$('.main').scrollTop(position) + + currentPosition: => + element = @$('.main .ticketZoom') + offset = element.offset() + if offset + position = offset.top + Math.abs(position) + hide: => @activeState = false @positionPageHeaderStop() @@ -354,7 +381,7 @@ class App.TicketZoom extends App.Controller @scrollHeaderPos = scroll - render: => + render: (local) => # update taskbar with new meta data App.TaskManager.touch(@task_key) @@ -458,28 +485,15 @@ class App.TicketZoom extends App.Controller if @sidebar.linkWidget @sidebar.linkWidget.reload(@links) - if @shown + if !@initDone + if @article_id + @pagePositionData = @article_id + @pagePosition(type: 'init') + @initDone = true + return - # scroll to article if given - if @article_id && @article_id isnt @last_article_id - @last_article_id = @article_id - scrollTo = => - @scrollToArticle(@article_id) - @delay(scrollTo, 300) - - # scroll to end if new article has been added - if !@last_ticket_article_ids || !_.isEqual(_.sortBy(@last_ticket_article_ids), _.sortBy(@ticket_article_ids)) - @last_ticket_article_ids = @ticket_article_ids - @scrollToBottom() - @positionPageHeaderUpdate() - - return if @initDone - @initDone = true - - # if shown was before init rendering, start actions again - return if !@shown - @positionPageHeaderStart() - App.Event.trigger('ui::ticket::shown', { ticket_id: @ticket_id }) + return if local + @pagePosition(type: 'init') scrollToArticle: (article_id) => articleContainer = document.getElementById("article-#{article_id}") @@ -499,7 +513,9 @@ class App.TicketZoom extends App.Controller realContentHeight += @$('.ticket-article').height() realContentHeight += @$('.article-new').height() viewableContentHeight = @$('.main').height() - return if viewableContentHeight > realContentHeight + if viewableContentHeight > realContentHeight + @main.scrollTop(0) + return @main.scrollTop( @main.prop('scrollHeight') ) autosaveStop: => @@ -729,12 +745,8 @@ class App.TicketZoom extends App.Controller processData: true success: (data) => - # remember current data - newTicketRaw = data.assets.Ticket[ticket.id] - @ticketUpdatedAtLastCall = newTicketRaw.updated_at - #App.SessionStorage.set(@key, data) - @load(data) + @load(data, true, true) # reset article - should not be resubmited on next ticket update ticket.article = undefined diff --git a/app/assets/javascripts/app/controllers/translation.coffee b/app/assets/javascripts/app/controllers/translation.coffee index fe9d0f806..3280f0e4f 100644 --- a/app/assets/javascripts/app/controllers/translation.coffee +++ b/app/assets/javascripts/app/controllers/translation.coffee @@ -1,5 +1,6 @@ -class Index extends App.ControllerContent +class Index extends App.ControllerSubContent requiredPermission: 'admin.translation' + header: 'Translations' events: 'click .js-pushChanges': 'pushChanges' 'click .js-resetChanges': 'resetChanges' @@ -7,8 +8,6 @@ class Index extends App.ControllerContent constructor: -> super - - @title 'Translations', true @locale = App.i18n.get() @render() @bind('i18n:translation_update_todo', => @@ -80,7 +79,13 @@ class Index extends App.ControllerContent @toggleAction() ) + hide: => + @rerender() + release: => + @rerender() + + rerender: => rerender = -> App.Event.trigger('ui:rerender') if @translationList && @translationList.changes() diff --git a/app/assets/javascripts/app/controllers/trigger.coffee b/app/assets/javascripts/app/controllers/trigger.coffee index c8758aeb9..c726aeced 100644 --- a/app/assets/javascripts/app/controllers/trigger.coffee +++ b/app/assets/javascripts/app/controllers/trigger.coffee @@ -1,5 +1,6 @@ -class Index extends App.ControllerContent +class Index extends App.ControllerSubContent requiredPermission: 'admin.trigger' + header: 'Triggers' constructor: -> super @@ -9,7 +10,6 @@ class Index extends App.ControllerContent genericObject: 'Trigger' defaultSortBy: 'name' pageData: - title: 'Triggers' home: 'triggers' object: 'Trigger' objects: 'Triggers' diff --git a/app/assets/javascripts/app/controllers/user_profile.coffee b/app/assets/javascripts/app/controllers/user_profile.coffee index d6be96d64..9bf0326d8 100644 --- a/app/assets/javascripts/app/controllers/user_profile.coffee +++ b/app/assets/javascripts/app/controllers/user_profile.coffee @@ -63,6 +63,12 @@ class App.UserProfile extends App.Controller genericObject: user ) + setPosition: (position) => + @$('.profile').scrollTop(position) + + currentPosition: => + @$('.profile').scrollTop() + class ActionRow extends App.ObserverController model: 'User' observe: diff --git a/app/assets/javascripts/app/controllers/users.coffee b/app/assets/javascripts/app/controllers/users.coffee index 178600cf6..11238b25d 100644 --- a/app/assets/javascripts/app/controllers/users.coffee +++ b/app/assets/javascripts/app/controllers/users.coffee @@ -1,5 +1,6 @@ -class Index extends App.ControllerContent +class Index extends App.ControllerSubContent requiredPermission: 'admin.user' + header: 'Users' elements: '.js-search': 'searchInput' events: @@ -7,10 +8,6 @@ class Index extends App.ControllerContent constructor: -> super - - # set title - @title 'Users', true - @render() render: -> diff --git a/app/assets/javascripts/app/lib/app_post/overview_list_collection.coffee b/app/assets/javascripts/app/lib/app_post/overview_list_collection.coffee index 5dc34ca8b..b58ad30f1 100644 --- a/app/assets/javascripts/app/lib/app_post/overview_list_collection.coffee +++ b/app/assets/javascripts/app/lib/app_post/overview_list_collection.coffee @@ -39,7 +39,7 @@ class _Singleton # view: view # ) # return - + throw 'No view to fetch list!' if !view App.OverviewIndexCollection.fetch() return if @fetchActive[view] @fetchActive[view] = true diff --git a/app/assets/javascripts/app/lib/app_post/task_manager.coffee b/app/assets/javascripts/app/lib/app_post/task_manager.coffee index c2d646aae..3325dbf07 100644 --- a/app/assets/javascripts/app/lib/app_post/task_manager.coffee +++ b/app/assets/javascripts/app/lib/app_post/task_manager.coffee @@ -87,6 +87,8 @@ class _taskManagerSingleton extends App.Controller App.Interval.set(@taskUpdateLoop, 3000, 'check_update_to_server_pending', 'task') init: -> + @domStore = {} + @shownStore = {} @workers = {} @allTasksByKey = {} @tasksToUpdate = {} @@ -220,13 +222,6 @@ class _taskManagerSingleton extends App.Controller if params.show @el.find('#content').empty() - # hide all tasks - @el.find('.content').addClass('hide').removeClass('active') - - # create div for task if not exists - if !@el.find("##{@domID(params.key)}")[0] - @el.append("
") - # set all tasks to active false, only new/selected one to active if params.show for key, task of @allTasksByKey @@ -252,8 +247,15 @@ class _taskManagerSingleton extends App.Controller @log 'debug', 'controller start try...', params # create clean params - params_app = _.clone(params.params) - params_app['el'] = $("##{@domID(params.key)}") + params_app = _.clone(params.params) + domKey = @domID(params.key) + domStoreItem = @domStore[domKey] + if domStoreItem + el = domStoreItem.el + else + el = $("
") + @domStore[domKey] = { el: el } + params_app['el'] = el params_app['task_key'] = params.key if !params.show params_app['doNotLog'] = 1 @@ -273,34 +275,62 @@ class _taskManagerSingleton extends App.Controller @tasksAutoCleanupDelay() showControllerHideOthers: (thisKey, params_app) => + for key of @workers + if key isnt thisKey + if @shownStore[key] isnt false + @hide(key) + $('#content').addClass('hide') + for key of @workers if key is thisKey @show(key, params_app) - else - @hide(key) # show task content - show: (key, params_app) -> - @el.find("##{@domID(key)}").removeClass('hide').addClass('active') - + show: (key, params_app) => controller = @workers[ key ] - return false if !controller + @shownStore[key] = true - # set controller state to active - if controller.active && _.isFunction(controller.active) - controller.active(true) + domKey = @domID(key) + domStoreItem = @domStore[domKey] + localEl = domStoreItem.el + if !@$("##{domKey}").get(0) && localEl + @el.append(localEl) + @$("##{domKey}").removeClass('hide').addClass('active') - # execute controllers show - if controller.show && _.isFunction(controller.show) - controller.show(params_app) + if controller + + # set position of view + position = @domStore[@domID(key)].position + if position + controller.setPosition(position) + + # set controller state to active + if controller.active && _.isFunction(controller.active) + controller.active(true) + + # execute controllers show + if controller.show && _.isFunction(controller.show) + controller.show(params_app) true # hide task content - hide: (key) -> - @el.find("##{@domID(key)}").addClass('hide').removeClass('active') - + hide: (key) => controller = @workers[ key ] + @shownStore[key] = false + + if @$("##{@domID(key)}").get(0) + domKey = @domID(key) + domStoreItem = @domStore[domKey] + + if controller && _.isFunction(controller.currentPosition) + position = controller.currentPosition() + domStoreItem.position = position + @$("##{@domID(key)}").addClass('hide').removeClass('active') + domStoreItem.el = @$("##{@domID(key)}").detach() + else + @$("##{@domID(key)}").addClass('hide').removeClass('active') + return false if !controller # set controller state to active @@ -311,6 +341,8 @@ class _taskManagerSingleton extends App.Controller if controller.hide && _.isFunction(controller.hide) controller.hide() + @anyPopoversDestroy() + true # get task @@ -339,7 +371,6 @@ class _taskManagerSingleton extends App.Controller # remove task certain task from tasks remove: (key) => - task = @allTasksByKey[key] delete @allTasksByKey[key] return if !task @@ -386,14 +417,24 @@ class _taskManagerSingleton extends App.Controller # release one task release: (key) => + domKey = @domID(key) + localDomStore = @domStore[domKey] + if localDomStore + if localDomStore.el + $('#app').append("
") + $("#app ##{domKey}_trash").append(localDomStore.el).remove() + localDomStore = undefined + delete @domStore[@domID(key)] + worker = @workers[key] + if worker + worker = undefined + delete @workers[key] try - @el.find("##{@domID(key)}").html('') - @el.find("##{@domID(key)}").remove() + @$("##{@domID(key)}").html('') + @$("##{@domID(key)}").remove() catch @log 'notice', "invalid key '#{key}'" - delete @workers[ key ] - # reset while tasks reset: => diff --git a/app/assets/javascripts/app/views/generic/navbar_level2/navbar.jst.eco b/app/assets/javascripts/app/views/generic/navbar_level2/navbar.jst.eco index 9e23a08c9..a07caf019 100644 --- a/app/assets/javascripts/app/views/generic/navbar_level2/navbar.jst.eco +++ b/app/assets/javascripts/app/views/generic/navbar_level2/navbar.jst.eco @@ -5,7 +5,7 @@ diff --git a/public/assets/tests/taskbar.js b/public/assets/tests/taskbar.js index 3312ca3a0..2a02dec93 100644 --- a/public/assets/tests/taskbar.js +++ b/public/assets/tests/taskbar.js @@ -55,6 +55,7 @@ test( "taskbar basic tests", function() { equal($('#taskbars .content.active').text(), "some test controller message:'#2',show:'true',hide:'false',active:'true'", "check active content!") equal($('#taskbars #content_permanent_TestKey1').text(), "some test controller message:'#1',show:'true',hide:'true',active:'false'", "check active content!") + equal($('#taskbars #content_permanent_TestKey2').text(), "some test controller message:'#2',show:'true',hide:'false',active:'true'", "check active content!") // check task history equal(App.TaskManager.nextTaskUrl(), '#/some/url/#2') @@ -69,13 +70,29 @@ test( "taskbar basic tests", function() { show: false, persistent: false, }) - equal($('#taskbars .content').length, 3, "check available active contents") + equal($('#taskbars .content').length, 2, "check available active contents") equal($('#taskbars .content.active').length, 1, "check available active contents") equal($('#taskbars .content.active').text(), "some test controller message:'#2',show:'true',hide:'false',active:'true'") equal($('#taskbars #content_permanent_TestKey1').text(), "some test controller message:'#1',show:'true',hide:'true',active:'false'", "check active content!") - equal($('#taskbars #content_permanent_TestKey3').text(), "some test controller message:'#3',show:'false',hide:'true',active:'false'", "check active content!") + equal($('#taskbars #content_permanent_TestKey2').text(), "some test controller message:'#2',show:'true',hide:'false',active:'true'", "check active content!") + App.TaskManager.execute({ + key: 'TestKey3', + controller: 'TestController1', + params: { + message: '#3', + }, + show: true, + persistent: false, + }) + equal($('#taskbars .content').length, 3, "check available active contents") + equal($('#taskbars .content.active').length, 1, "check available active contents") + equal($('#taskbars .content.active').text(), "some test controller message:'#3',show:'true',hide:'true',active:'true'", "check active content!") + + equal($('#taskbars #content_permanent_TestKey1').text(), "some test controller message:'#1',show:'true',hide:'true',active:'false'", "check active content!") + equal($('#taskbars #content_permanent_TestKey2').text(), "some test controller message:'#2',show:'true',hide:'true',active:'false'", "check active content!") + equal($('#taskbars #content_permanent_TestKey3').text(), "some test controller message:'#3',show:'true',hide:'true',active:'true'", "check active content!") App.TaskManager.execute({ key: 'TestKey4', @@ -86,14 +103,13 @@ test( "taskbar basic tests", function() { show: false, persistent: true, }) - equal($('#taskbars .content').length, 4, "check available active contents") + equal($('#taskbars .content').length, 3, "check available active contents") equal($('#taskbars .content.active').length, 1, "check available active contents") - equal($('#taskbars .content.active').text(), "some test controller message:'#2',show:'true',hide:'false',active:'true'") + equal($('#taskbars .content.active').text(), "some test controller message:'#3',show:'true',hide:'true',active:'true'", "check active content!") equal($('#taskbars #content_permanent_TestKey1').text(), "some test controller message:'#1',show:'true',hide:'true',active:'false'", "check active content!") - equal($('#taskbars #content_permanent_TestKey3').text(), "some test controller message:'#3',show:'false',hide:'true',active:'false'", "check active content!") - equal($('#taskbars #content_permanent_TestKey4').text(), "some test controller message:'#4',show:'false',hide:'true',active:'false'", "check active content!") - + equal($('#taskbars #content_permanent_TestKey2').text(), "some test controller message:'#2',show:'true',hide:'true',active:'false'", "check active content!") + equal($('#taskbars #content_permanent_TestKey3').text(), "some test controller message:'#3',show:'true',hide:'true',active:'true'", "check active content!") App.TaskManager.execute({ key: 'TestKey5', @@ -104,15 +120,14 @@ test( "taskbar basic tests", function() { show: true, persistent: true, }) - equal($('#taskbars .content').length, 5, "check available active contents") + equal($('#taskbars .content').length, 4, "check available active contents") equal($('#taskbars .content.active').length, 1, "check available active contents") equal($('#taskbars .content.active').text(), "some test controller message:'#5',show:'true',hide:'false',active:'true'") equal($('#taskbars #content_permanent_TestKey1').text(), "some test controller message:'#1',show:'true',hide:'true',active:'false'", "check active content!") equal($('#taskbars #content_permanent_TestKey2').text(), "some test controller message:'#2',show:'true',hide:'true',active:'false'", "check active content!") - equal($('#taskbars #content_permanent_TestKey3').text(), "some test controller message:'#3',show:'false',hide:'true',active:'false'", "check active content!") - equal($('#taskbars #content_permanent_TestKey4').text(), "some test controller message:'#4',show:'false',hide:'true',active:'false'", "check active content!") - + equal($('#taskbars #content_permanent_TestKey3').text(), "some test controller message:'#3',show:'true',hide:'true',active:'false'", "check active content!") + equal($('#taskbars #content_permanent_TestKey5').text(), "some test controller message:'#5',show:'true',hide:'false',active:'true'", "check active content!") App.TaskManager.execute({ key: 'TestKey6', @@ -123,28 +138,27 @@ test( "taskbar basic tests", function() { show: true, persistent: false, }) - equal($('#taskbars .content').length, 6, "check available active contents") - equal($('#taskbars .content.active').length, 1, "check available active contents") - equal($('#taskbars .content.active').text(), "some test controller message:'#6',show:'true',hide:'false',active:'true'") - - equal($('#taskbars #content_permanent_TestKey1').text(), "some test controller message:'#1',show:'true',hide:'true',active:'false'", "check active content!") - equal($('#taskbars #content_permanent_TestKey2').text(), "some test controller message:'#2',show:'true',hide:'true',active:'false'", "check active content!") - equal($('#taskbars #content_permanent_TestKey3').text(), "some test controller message:'#3',show:'false',hide:'true',active:'false'", "check active content!") - equal($('#taskbars #content_permanent_TestKey4').text(), "some test controller message:'#4',show:'false',hide:'true',active:'false'", "check active content!") - equal($('#taskbars #content_permanent_TestKey5').text(), "some test controller message:'#5',show:'true',hide:'true',active:'false'", "check active content!") - - - // remove task#2 - App.TaskManager.remove('TestKey2') - equal($('#taskbars .content').length, 5, "check available active contents") equal($('#taskbars .content.active').length, 1, "check available active contents") equal($('#taskbars .content.active').text(), "some test controller message:'#6',show:'true',hide:'false',active:'true'") equal($('#taskbars #content_permanent_TestKey1').text(), "some test controller message:'#1',show:'true',hide:'true',active:'false'", "check active content!") - equal($('#taskbars #content_permanent_TestKey3').text(), "some test controller message:'#3',show:'false',hide:'true',active:'false'", "check active content!") - equal($('#taskbars #content_permanent_TestKey4').text(), "some test controller message:'#4',show:'false',hide:'true',active:'false'", "check active content!") + equal($('#taskbars #content_permanent_TestKey2').text(), "some test controller message:'#2',show:'true',hide:'true',active:'false'", "check active content!") + equal($('#taskbars #content_permanent_TestKey3').text(), "some test controller message:'#3',show:'true',hide:'true',active:'false'", "check active content!") equal($('#taskbars #content_permanent_TestKey5').text(), "some test controller message:'#5',show:'true',hide:'true',active:'false'", "check active content!") + equal($('#taskbars #content_permanent_TestKey6').text(), "some test controller message:'#6',show:'true',hide:'false',active:'true'", "check active content!") + + // remove task#2 + App.TaskManager.remove('TestKey2') + + equal($('#taskbars .content').length, 4, "check available active contents") + equal($('#taskbars .content.active').length, 1, "check available active contents") + equal($('#taskbars .content.active').text(), "some test controller message:'#6',show:'true',hide:'false',active:'true'") + + equal($('#taskbars #content_permanent_TestKey1').text(), "some test controller message:'#1',show:'true',hide:'true',active:'false'", "check active content!") + equal($('#taskbars #content_permanent_TestKey3').text(), "some test controller message:'#3',show:'true',hide:'true',active:'false'", "check active content!") + equal($('#taskbars #content_permanent_TestKey5').text(), "some test controller message:'#5',show:'true',hide:'true',active:'false'", "check active content!") + equal($('#taskbars #content_permanent_TestKey6').text(), "some test controller message:'#6',show:'true',hide:'false',active:'true'", "check active content!") // activate task#3 App.TaskManager.execute({ @@ -156,13 +170,14 @@ test( "taskbar basic tests", function() { show: true, persistent: false, }) - equal($('#taskbars .content').length, 5, "check available active contents") + equal($('#taskbars .content').length, 4, "check available active contents") equal($('#taskbars .content.active').length, 1, "check available active contents") equal($('#taskbars .content.active').text(), "some test controller message:'#3',show:'true',hide:'true',active:'true'") equal($('#taskbars #content_permanent_TestKey1').text(), "some test controller message:'#1',show:'true',hide:'true',active:'false'", "check active content!") - equal($('#taskbars #content_permanent_TestKey4').text(), "some test controller message:'#4',show:'false',hide:'true',active:'false'", "check active content!") + equal($('#taskbars #content_permanent_TestKey3').text(), "some test controller message:'#3',show:'true',hide:'true',active:'true'", "check active content!") equal($('#taskbars #content_permanent_TestKey5').text(), "some test controller message:'#5',show:'true',hide:'true',active:'false'", "check active content!") + equal($('#taskbars #content_permanent_TestKey6').text(), "some test controller message:'#6',show:'true',hide:'true',active:'false'", "check active content!") // activate task#1 @@ -175,19 +190,20 @@ test( "taskbar basic tests", function() { show: true, persistent: false, }) - equal($('#taskbars .content').length, 5, "check available active contents") + equal($('#taskbars .content').length, 4, "check available active contents") equal($('#taskbars .content.active').length, 1, "check available active contents") equal($('#taskbars .content.active').text(), "some test controller message:'#1',show:'true',hide:'true',active:'true'") + equal($('#taskbars #content_permanent_TestKey1').text(), "some test controller message:'#1',show:'true',hide:'true',active:'true'", "check active content!") equal($('#taskbars #content_permanent_TestKey3').text(), "some test controller message:'#3',show:'true',hide:'true',active:'false'", "check active content!") - equal($('#taskbars #content_permanent_TestKey4').text(), "some test controller message:'#4',show:'false',hide:'true',active:'false'", "check active content!") equal($('#taskbars #content_permanent_TestKey5').text(), "some test controller message:'#5',show:'true',hide:'true',active:'false'", "check active content!") + equal($('#taskbars #content_permanent_TestKey6').text(), "some test controller message:'#6',show:'true',hide:'true',active:'false'", "check active content!") // remove task#1 App.TaskManager.remove('TestKey1') // verify if task#3 is active - equal($('#taskbars .content').length, 4, "check available active contents") + equal($('#taskbars .content').length, 3, "check available active contents") equal($('#taskbars .content.active').length, 0, "check available active contents") equal($('#taskbars .content.active').text(), "") @@ -195,7 +211,7 @@ test( "taskbar basic tests", function() { App.TaskManager.remove('TestKey3') // verify if task#5 is active - equal($('#taskbars .content').length, 3, "check available active contents") + equal($('#taskbars .content').length, 2, "check available active contents") equal($('#taskbars .content.active').length, 0, "check available active contents") equal($('#taskbars .content.active').text(), "") @@ -203,7 +219,7 @@ test( "taskbar basic tests", function() { App.TaskManager.remove('TestKey5') // verify if task#5 is active - equal($('#taskbars .content').length, 3, "check available active contents") + equal($('#taskbars .content').length, 2, "check available active contents") equal($('#taskbars .content.active').length, 0, "check available active contents") equal($('#taskbars .content.active').text(), "") @@ -217,7 +233,7 @@ test( "taskbar basic tests", function() { show: true, persistent: false, }) - equal($('#taskbars .content').length, 4, "check available active contents") + equal($('#taskbars .content').length, 3, "check available active contents") equal($('#taskbars .content.active').length, 1, "check available active contents") equal($('#taskbars .content.active').text(), "some test controller message:'#7',show:'true',hide:'false',active:'true'", "check active content!") @@ -225,7 +241,7 @@ test( "taskbar basic tests", function() { App.TaskManager.remove('TestKey7') // verify if task#5 is active - equal($('#taskbars .content').length, 3, "check available active contents") + equal($('#taskbars .content').length, 2, "check available active contents") equal($('#taskbars .content.active').length, 0, "check available active contents") equal($('#taskbars .content.active').text(), "") diff --git a/test/browser/aaa_getting_started_test.rb b/test/browser/aaa_getting_started_test.rb index 045e6cb59..ecd7c32c6 100644 --- a/test/browser/aaa_getting_started_test.rb +++ b/test/browser/aaa_getting_started_test.rb @@ -175,15 +175,15 @@ class AaaGettingStartedTest < TestCase css: 'a[href="#manage"]', ) click( - css: 'a[href="#settings/branding"]', + css: '.content.active a[href="#settings/branding"]', ) match( - css: '#content input[name="organization"]', + css: '.content.active input[name="organization"]', value: 'Some Organization', ) click( - css: 'a[href="#settings/system"]', + css: '.content.active a[href="#settings/system"]', ) fqdn = nil @@ -192,7 +192,7 @@ class AaaGettingStartedTest < TestCase end raise "Unable to get fqdn based on #{browser_url}" if !fqdn match( - css: '#content input[name="fqdn"]', + css: '.content.active input[name="fqdn"]', value: fqdn, ) end diff --git a/test/browser/admin_channel_email_test.rb b/test/browser/admin_channel_email_test.rb index bfc342348..a8938f504 100644 --- a/test/browser/admin_channel_email_test.rb +++ b/test/browser/admin_channel_email_test.rb @@ -21,9 +21,9 @@ class AdminChannelEmailTest < TestCase tasks_close_all() click(css: 'a[href="#manage"]') - click(css: 'a[href="#channels/email"]') + click(css: '.content.active a[href="#channels/email"]') - click(css: '#content .js-channelNew') + click(css: '.content.active .js-channelNew') modal_ready() @@ -55,15 +55,15 @@ class AdminChannelEmailTest < TestCase # delete all channels loop do - break if !@browser.find_elements(css: '#content .js-channelDelete')[0] - click(css: '#content .js-channelDelete') + break if !@browser.find_elements(css: '.content.active .js-channelDelete')[0] + click(css: '.content.active .js-channelDelete') sleep 2 click(css: '.modal .js-submit') sleep 2 end # re-create - click(css: '#content .js-channelNew') + click(css: '.content.active .js-channelNew') modal_ready() @@ -93,12 +93,12 @@ class AdminChannelEmailTest < TestCase exists_not(css: '.modal') watch_for( - css: '#content', + css: '.content.active', value: mailbox_user, ) # set invalid folder - click(css: '#content .js-editInbound') + click(css: '.content.active .js-editInbound') modal_ready() diff --git a/test/browser/admin_object_manager_test.rb b/test/browser/admin_object_manager_test.rb index bae55d9d7..d01243b88 100644 --- a/test/browser/admin_object_manager_test.rb +++ b/test/browser/admin_object_manager_test.rb @@ -62,10 +62,10 @@ class AdminObjectManagerTest < TestCase ) watch_for( - css: '#content', + css: '.content.active', value: 'Database Update required', ) - click(css: '#content .tab-pane.active div.js-execute') + click(css: '.content.active .tab-pane.active div.js-execute') watch_for( css: '.modal', value: 'restart', @@ -76,7 +76,7 @@ class AdminObjectManagerTest < TestCase ) sleep 5 watch_for( - css: '#content', + css: '.content.active', ) # create new ticket @@ -113,11 +113,11 @@ class AdminObjectManagerTest < TestCase click(css: 'a[href="#manage"]') click(css: 'a[href="#system/object_manager"]') watch_for( - css: '#content table', + css: '.content.active table', value: 'browser_test1', ) match_not( - css: '#content', + css: '.content.active', value: 'Database Update required', ) object_manager_attribute_delete( @@ -126,14 +126,14 @@ class AdminObjectManagerTest < TestCase }, ) watch_for( - css: '#content', + css: '.content.active', value: 'Database Update required', ) watch_for( - css: '#content table', + css: '.content.active table', value: 'browser_test1', ) - click(css: '#content .tab-pane.active div.js-execute') + click(css: '.content.active .tab-pane.active div.js-execute') watch_for( css: '.modal', value: 'restart', @@ -144,14 +144,14 @@ class AdminObjectManagerTest < TestCase ) sleep 5 watch_for( - css: '#content', + css: '.content.active', ) match_not( - css: '#content', + css: '.content.active', value: 'Database Update required', ) match_not( - css: '#content table', + css: '.content.active table', value: 'browser_test1', ) end @@ -263,10 +263,10 @@ class AdminObjectManagerTest < TestCase ) watch_for( - css: '#content', + css: '.content.active', value: 'Database Update required', ) - click(css: '#content .tab-pane.active div.js-execute') + click(css: '.content.active .tab-pane.active div.js-execute') watch_for( css: '.modal', value: 'restart', @@ -277,7 +277,7 @@ class AdminObjectManagerTest < TestCase ) sleep 5 watch_for( - css: '#content', + css: '.content.active', ) # create new ticket @@ -345,7 +345,7 @@ class AdminObjectManagerTest < TestCase name: 'browser_test7', }, ) - click(css: '#content .tab-pane.active div.js-execute') + click(css: '.content.active .tab-pane.active div.js-execute') watch_for( css: '.modal', value: 'restart', @@ -356,34 +356,34 @@ class AdminObjectManagerTest < TestCase ) sleep 5 watch_for( - css: '#content', + css: '.content.active', ) match_not( - css: '#content', + css: '.content.active', value: 'Database Update required', ) match_not( - css: '#content table', + css: '.content.active table', value: 'browser_test2', ) match_not( - css: '#content table', + css: '.content.active table', value: 'browser_test3', ) match_not( - css: '#content table', + css: '.content.active table', value: 'browser_test4', ) match_not( - css: '#content table', + css: '.content.active table', value: 'browser_test5', ) match_not( - css: '#content table', + css: '.content.active table', value: 'browser_test6', ) match_not( - css: '#content table', + css: '.content.active table', value: 'browser_test7', ) end diff --git a/test/browser/agent_ticket_tag_test.rb b/test/browser/agent_ticket_tag_test.rb index e7fb24659..a298304f4 100644 --- a/test/browser/agent_ticket_tag_test.rb +++ b/test/browser/agent_ticket_tag_test.rb @@ -247,12 +247,12 @@ class AgentTicketTagTest < TestCase ) click( browser: browser2, - css: 'a[href="#manage/tags"]', + css: '.content.active a[href="#manage/tags"]', ) sleep 3 execute( browser: browser2, - js: "$('#content .js-name:contains(\"tag3\")').click()", + js: "$('.content.active .js-name:contains(\"tag3\")').click()", ) sleep 2 set( @@ -301,12 +301,12 @@ class AgentTicketTagTest < TestCase ) click( browser: browser2, - css: 'a[href="#manage/tags"]', + css: '.content.active a[href="#manage/tags"]', ) sleep 3 execute( browser: browser2, - js: "$('#content .js-name:contains(\"tag5\")').closest('tr').find('.js-delete').click()", + js: "$('.content.active .js-name:contains(\"tag5\")').closest('tr').find('.js-delete').click()", ) sleep 2 click( @@ -357,32 +357,32 @@ class AgentTicketTagTest < TestCase tasks_close_all() click(css: 'a[href="#manage"]') - click(css: 'a[href="#manage/tags"]') + click(css: '.content.active a[href="#manage/tags"]') switch( - css: '#content .js-newTagSetting', + css: '.content.active .js-newTagSetting', type: 'off', ) set( - css: '#content .js-create input[name="name"]', + css: '.content.active .js-create input[name="name"]', value: tag_prefix + ' A', ) - click(css: '#content .js-create .js-submit') + click(css: '.content.active .js-create .js-submit') set( - css: '#content .js-create input[name="name"]', + css: '.content.active .js-create input[name="name"]', value: tag_prefix + ' a', ) - click(css: '#content .js-create .js-submit') + click(css: '.content.active .js-create .js-submit') set( - css: '#content .js-create input[name="name"]', + css: '.content.active .js-create input[name="name"]', value: tag_prefix + ' B', ) - click(css: '#content .js-create .js-submit') + click(css: '.content.active .js-create .js-submit') set( - css: '#content .js-create input[name="name"]', + css: '.content.active .js-create input[name="name"]', value: tag_prefix + ' C', ) - click(css: '#content .js-create .js-submit') + click(css: '.content.active .js-create .js-submit') # set tag (by tab) ticket1 = ticket_create( @@ -509,9 +509,9 @@ class AgentTicketTagTest < TestCase ) click(css: 'a[href="#manage"]') - click(css: 'a[href="#manage/tags"]') + click(css: '.content.active a[href="#manage/tags"]') switch( - css: '#content .js-newTagSetting', + css: '.content.active .js-newTagSetting', type: 'on', ) end diff --git a/test/browser/chat_test.rb b/test/browser/chat_test.rb index 34452be89..1d8954bb4 100644 --- a/test/browser/chat_test.rb +++ b/test/browser/chat_test.rb @@ -23,11 +23,11 @@ class ChatTest < TestCase ) click( browser: agent, - css: 'a[href="#channels/chat"]', + css: '.content.active a[href="#channels/chat"]', ) switch( browser: agent, - css: '#content .js-chatSetting', + css: '.content.active .js-chatSetting', type: 'off', ) @@ -60,11 +60,11 @@ class ChatTest < TestCase ) click( browser: agent, - css: 'a[href="#channels/chat"]', + css: '.content.active a[href="#channels/chat"]', ) switch( browser: agent, - css: '#content .js-chatSetting', + css: '.content.active .js-chatSetting', type: 'on', ) sleep 15 # wait for rerendering diff --git a/test/browser/first_steps_test.rb b/test/browser/first_steps_test.rb index 6854cabaf..167703b23 100644 --- a/test/browser/first_steps_test.rb +++ b/test/browser/first_steps_test.rb @@ -112,7 +112,7 @@ class FirstStepsTest < TestCase click(css: '.active.content a[href="#channels/form"]') sleep 2 switch( - css: '#content .js-formSetting', + css: '.content.active .js-formSetting', type: 'on', ) click(css: '#navigation a[href="#dashboard"]') diff --git a/test/browser/form_test.rb b/test/browser/form_test.rb index e6b5ad08c..4354585d3 100644 --- a/test/browser/form_test.rb +++ b/test/browser/form_test.rb @@ -22,11 +22,11 @@ class FormTest < TestCase ) click( browser: agent, - css: 'a[href="#channels/form"]', + css: '.content.active a[href="#channels/form"]', ) switch( browser: agent, - css: '#content .js-formSetting', + css: '.content.active .js-formSetting', type: 'off', ) @@ -43,7 +43,7 @@ class FormTest < TestCase ) switch( browser: agent, - css: '#content .js-formSetting', + css: '.content.active .js-formSetting', type: 'on', ) diff --git a/test/browser/integration_test.rb b/test/browser/integration_test.rb index 75f5577ee..1eb9c175e 100644 --- a/test/browser/integration_test.rb +++ b/test/browser/integration_test.rb @@ -18,25 +18,25 @@ class IntegrationTest < TestCase click(css: 'a[href="#system/integration/sipgate"]') sleep 2 switch( - css: '#content .main .js-switch', + css: '.content.active .main .js-switch', type: 'on', ) set( - css: '#content .main .js-inboundBlockCallerId input[name=caller_id]', + css: '.content.active .main .js-inboundBlockCallerId input[name=caller_id]', value: '041 1234567', ) set( - css: '#content .main .js-inboundBlockCallerId input[name=note]', + css: '.content.active .main .js-inboundBlockCallerId input[name=note]', value: 'block spam caller id', ) - click(css: '#content .main .js-inboundBlockCallerId .js-add') - click(css: '#content .main .js-submit') + click(css: '.content.active .main .js-inboundBlockCallerId .js-add') + click(css: '.content.active .main .js-submit') exists( - css: '#content .main .js-inboundBlockCallerId [value="0411234567"]', + css: '.content.active .main .js-inboundBlockCallerId [value="0411234567"]', ) exists( - css: '#content .main .js-inboundBlockCallerId [value="block spam caller id"]', + css: '.content.active .main .js-inboundBlockCallerId [value="block spam caller id"]', ) click(css: 'a[href="#dashboard"]') @@ -45,33 +45,33 @@ class IntegrationTest < TestCase click(css: 'a[href="#system/integration/sipgate"]') exists( - css: '#content .main .js-inboundBlockCallerId [value="0411234567"]', + css: '.content.active .main .js-inboundBlockCallerId [value="0411234567"]', ) exists( - css: '#content .main .js-inboundBlockCallerId [value="block spam caller id"]', + css: '.content.active .main .js-inboundBlockCallerId [value="block spam caller id"]', ) reload() exists( - css: '#content .main .js-inboundBlockCallerId [value="0411234567"]', + css: '.content.active .main .js-inboundBlockCallerId [value="0411234567"]', ) exists( - css: '#content .main .js-inboundBlockCallerId [value="block spam caller id"]', + css: '.content.active .main .js-inboundBlockCallerId [value="block spam caller id"]', ) - click(css: '#content .main .js-inboundBlockCallerId .js-remove') - click(css: '#content .main .js-submit') + click(css: '.content.active .main .js-inboundBlockCallerId .js-remove') + click(css: '.content.active .main .js-submit') sleep 6 switch( - css: '#content .main .js-switch', + css: '.content.active .main .js-switch', type: 'off', ) reload() exists_not( - css: '#content .main .js-inboundBlockCallerId [value="0411234567"]', + css: '.content.active .main .js-inboundBlockCallerId [value="0411234567"]', ) exists_not( - css: '#content .main .js-inboundBlockCallerId [value="block spam caller id"]', + css: '.content.active .main .js-inboundBlockCallerId [value="block spam caller id"]', ) end @@ -90,35 +90,35 @@ class IntegrationTest < TestCase click(css: 'a[href="#system/integration/slack"]') sleep 2 switch( - css: '#content .main .js-switch', + css: '.content.active .main .js-switch', type: 'on', ) - click(css: '#content .main .checkbox-replacement') + click(css: '.content.active .main .checkbox-replacement') select( - css: '#content .main select[name="group_id"]', + css: '.content.active .main select[name="group_id"]', value: 'Users', ) set( - css: '#content .main input[name="webhook"]', + css: '.content.active .main input[name="webhook"]', value: 'http://some_url/webhook/123', ) set( - css: '#content .main input[name="username"]', + css: '.content.active .main input[name="username"]', value: 'someuser', ) - click(css: '#content .main .js-submit') + click(css: '.content.active .main .js-submit') match( - css: '#content .main select[name="group_id"]', + css: '.content.active .main select[name="group_id"]', value: 'Users', ) match( - css: '#content .main input[name="webhook"]', + css: '.content.active .main input[name="webhook"]', value: 'http://some_url/webhook/123', ) match( - css: '#content .main input[name="username"]', + css: '.content.active .main input[name="username"]', value: 'someuser', ) @@ -128,35 +128,35 @@ class IntegrationTest < TestCase click(css: 'a[href="#system/integration/slack"]') match( - css: '#content .main select[name="group_id"]', + css: '.content.active .main select[name="group_id"]', value: 'Users', ) match( - css: '#content .main input[name="webhook"]', + css: '.content.active .main input[name="webhook"]', value: 'http://some_url/webhook/123', ) match( - css: '#content .main input[name="username"]', + css: '.content.active .main input[name="username"]', value: 'someuser', ) reload() match( - css: '#content .main select[name="group_id"]', + css: '.content.active .main select[name="group_id"]', value: 'Users', ) match( - css: '#content .main input[name="webhook"]', + css: '.content.active .main input[name="webhook"]', value: 'http://some_url/webhook/123', ) match( - css: '#content .main input[name="username"]', + css: '.content.active .main input[name="username"]', value: 'someuser', ) switch( - css: '#content .main .js-switch', + css: '.content.active .main .js-switch', type: 'off', ) end @@ -176,23 +176,23 @@ class IntegrationTest < TestCase click(css: 'a[href="#system/integration/clearbit"]') sleep 2 switch( - css: '#content .main .js-switch', + css: '.content.active .main .js-switch', type: 'on', ) set( - css: '#content .main input[name="api_key"]', + css: '.content.active .main input[name="api_key"]', value: 'some_api_key', ) set( - css: '#content .main .js-userSync .js-new [name="source"]', + css: '.content.active .main .js-userSync .js-new [name="source"]', value: 'source1', ) set( - css: '#content .main .js-userSync .js-new [name="destination"]', + css: '.content.active .main .js-userSync .js-new [name="destination"]', value: 'destination1', ) - click(css: '#content .main .js-userSync .js-add') - click(css: '#content .main .js-submit') + click(css: '.content.active .main .js-userSync .js-add') + click(css: '.content.active .main .js-submit') click(css: 'a[href="#dashboard"]') click(css: 'a[href="#manage"]') @@ -200,54 +200,54 @@ class IntegrationTest < TestCase click(css: 'a[href="#system/integration/clearbit"]') match( - css: '#content .main input[name="api_key"]', + css: '.content.active .main input[name="api_key"]', value: 'some_api_key', ) exists( - css: '#content .main .js-userSync [value="source1"]', + css: '.content.active .main .js-userSync [value="source1"]', ) exists( - css: '#content .main .js-userSync [value="destination1"]', + css: '.content.active .main .js-userSync [value="destination1"]', ) reload() match( - css: '#content .main input[name="api_key"]', + css: '.content.active .main input[name="api_key"]', value: 'some_api_key', ) exists( - css: '#content .main .js-userSync [value="source1"]', + css: '.content.active .main .js-userSync [value="source1"]', ) exists( - css: '#content .main .js-userSync [value="destination1"]', + css: '.content.active .main .js-userSync [value="destination1"]', ) switch( - css: '#content .main .js-switch', + css: '.content.active .main .js-switch', type: 'off', ) set( - css: '#content .main input[name="api_key"]', + css: '.content.active .main input[name="api_key"]', value: '-empty-', ) - click(css: '#content .main .js-submit') + click(css: '.content.active .main .js-submit') reload() match_not( - css: '#content .main input[name="api_key"]', + css: '.content.active .main input[name="api_key"]', value: 'some_api_key', ) match( - css: '#content .main input[name="api_key"]', + css: '.content.active .main input[name="api_key"]', value: '-empty-', ) exists( - css: '#content .main .js-userSync [value="source1"]', + css: '.content.active .main .js-userSync [value="source1"]', ) exists( - css: '#content .main .js-userSync [value="destination1"]', + css: '.content.active .main .js-userSync [value="destination1"]', ) end @@ -266,25 +266,25 @@ class IntegrationTest < TestCase click(css: 'a[href="#system/integration/icinga"]') sleep 2 switch( - css: '#content .main .js-switch', + css: '.content.active .main .js-switch', type: 'on', ) set( - css: '#content .main input[name="icinga_sender"]', + css: '.content.active .main input[name="icinga_sender"]', value: 'some@othersender.com', ) select( - css: '#content .main select[name="icinga_auto_close"]', + css: '.content.active .main select[name="icinga_auto_close"]', value: 'no', ) - click(css: '#content .main .js-submit') + click(css: '.content.active .main .js-submit') match( - css: '#content .main input[name="icinga_sender"]', + css: '.content.active .main input[name="icinga_sender"]', value: 'some@othersender.com', ) match( - css: '#content .main select[name="icinga_auto_close"]', + css: '.content.active .main select[name="icinga_auto_close"]', value: 'no', ) @@ -294,45 +294,45 @@ class IntegrationTest < TestCase click(css: 'a[href="#system/integration/icinga"]') match( - css: '#content .main input[name="icinga_sender"]', + css: '.content.active .main input[name="icinga_sender"]', value: 'some@othersender.com', ) match( - css: '#content .main select[name="icinga_auto_close"]', + css: '.content.active .main select[name="icinga_auto_close"]', value: 'no', ) reload() match( - css: '#content .main input[name="icinga_sender"]', + css: '.content.active .main input[name="icinga_sender"]', value: 'some@othersender.com', ) match( - css: '#content .main select[name="icinga_auto_close"]', + css: '.content.active .main select[name="icinga_auto_close"]', value: 'no', ) switch( - css: '#content .main .js-switch', + css: '.content.active .main .js-switch', type: 'off', ) set( - css: '#content .main input[name="icinga_sender"]', + css: '.content.active .main input[name="icinga_sender"]', value: 'icinga@monitoring.example.com', ) select( - css: '#content .main select[name="icinga_auto_close"]', + css: '.content.active .main select[name="icinga_auto_close"]', value: 'yes', ) - click(css: '#content .main .js-submit') + click(css: '.content.active .main .js-submit') match( - css: '#content .main input[name="icinga_sender"]', + css: '.content.active .main input[name="icinga_sender"]', value: 'icinga@monitoring.example.com', ) match( - css: '#content .main select[name="icinga_auto_close"]', + css: '.content.active .main select[name="icinga_auto_close"]', value: 'yes', ) end diff --git a/test/browser/maintenance_login_message_test.rb b/test/browser/maintenance_login_message_test.rb index d72973f8b..d08077dc0 100644 --- a/test/browser/maintenance_login_message_test.rb +++ b/test/browser/maintenance_login_message_test.rb @@ -25,7 +25,7 @@ class MaintenanceLoginMessageTest < TestCase message = "test #{string}" set( browser: browser1, - css: '#content .js-loginPreview [data-name="message"]', + css: '.content.active .js-loginPreview [data-name="message"]', value: message, ) click( @@ -45,7 +45,7 @@ class MaintenanceLoginMessageTest < TestCase switch( browser: browser1, - css: '#content .js-loginSetting', + css: '.content.active .js-loginSetting', type: 'on', ) @@ -57,7 +57,7 @@ class MaintenanceLoginMessageTest < TestCase switch( browser: browser1, - css: '#content .js-loginSetting', + css: '.content.active .js-loginSetting', type: 'off', ) diff --git a/test/browser/maintenance_mode_test.rb b/test/browser/maintenance_mode_test.rb index a2cec131f..a214a5409 100644 --- a/test/browser/maintenance_mode_test.rb +++ b/test/browser/maintenance_mode_test.rb @@ -33,7 +33,7 @@ class MaintenanceModeTest < TestCase switch( browser: browser1, - css: '#content .js-modeSetting', + css: '.content.active .js-modeSetting', type: 'on', no_check: true, ) @@ -41,12 +41,12 @@ class MaintenanceModeTest < TestCase # check warning watch_for( browser: browser1, - css: '#content .modal .modal-header', + css: '.content.active .modal .modal-header', value: 'confirm', ) click( browser: browser1, - css: '#content .modal .js-submit', + css: '.content.active .modal .js-submit', ) watch_for( @@ -92,7 +92,7 @@ class MaintenanceModeTest < TestCase switch( browser: browser1, - css: '#content .js-modeSetting', + css: '.content.active .js-modeSetting', type: 'off', ) @@ -121,7 +121,7 @@ class MaintenanceModeTest < TestCase switch( browser: browser1, - css: '#content .js-modeSetting', + css: '.content.active .js-modeSetting', type: 'on', no_check: true, ) @@ -129,12 +129,12 @@ class MaintenanceModeTest < TestCase # check warning watch_for( browser: browser1, - css: '#content .modal .modal-header', + css: '.content.active .modal .modal-header', value: 'confirm', ) click( browser: browser1, - css: '#content .modal .js-submit', + css: '.content.active .modal .js-submit', ) watch_for( @@ -148,7 +148,7 @@ class MaintenanceModeTest < TestCase switch( browser: browser1, - css: '#content .js-modeSetting', + css: '.content.active .js-modeSetting', type: 'off', ) diff --git a/test/browser/maintenance_session_message_test.rb b/test/browser/maintenance_session_message_test.rb index d61a4ffb8..5cde06359 100644 --- a/test/browser/maintenance_session_message_test.rb +++ b/test/browser/maintenance_session_message_test.rb @@ -36,18 +36,18 @@ class MaintenanceSessionMessageTest < TestCase set( browser: browser1, - css: '#content .js-Message input[name="head"]', + css: '.content.active .js-Message input[name="head"]', value: title_html, ) set( browser: browser1, - css: '#content .js-Message .js-textarea[data-name="message"]', + css: '.content.active .js-Message .js-textarea[data-name="message"]', value: message_html, ) click( browser: browser1, - css: '#content .js-Message button.js-submit', + css: '.content.active .js-Message button.js-submit', ) watch_for( @@ -84,18 +84,18 @@ class MaintenanceSessionMessageTest < TestCase set( browser: browser1, - css: '#content .js-Message input[name="head"]', + css: '.content.active .js-Message input[name="head"]', value: title_html + ' #2', ) set( browser: browser1, - css: '#content .js-Message .js-textarea[data-name="message"]', + css: '.content.active .js-Message .js-textarea[data-name="message"]', value: message_html + ' #2', ) click( browser: browser1, - css: '#content .js-Message button.js-submit', + css: '.content.active .js-Message button.js-submit', ) watch_for( @@ -132,21 +132,21 @@ class MaintenanceSessionMessageTest < TestCase set( browser: browser1, - css: '#content .js-Message input[name="head"]', + css: '.content.active .js-Message input[name="head"]', value: title_html + ' #3', ) set( browser: browser1, - css: '#content .js-Message .js-textarea[data-name="message"]', + css: '.content.active .js-Message .js-textarea[data-name="message"]', value: message_html + ' #3', ) click( browser: browser1, - css: '#content .js-Message input[name="reload"] + .icon-checkbox.icon-unchecked', + css: '.content.active .js-Message input[name="reload"] + .icon-checkbox.icon-unchecked', ) click( browser: browser1, - css: '#content .js-Message button.js-submit', + css: '.content.active .js-Message button.js-submit', ) watch_for( diff --git a/test/browser/preferences_language_test.rb b/test/browser/preferences_language_test.rb index 1a8d5e161..2dfa5ef87 100644 --- a/test/browser/preferences_language_test.rb +++ b/test/browser/preferences_language_test.rb @@ -50,7 +50,7 @@ class PreferencesLanguageTest < TestCase css: '.language_item [name="locale"]', value: 'Deutsch', ) - click(css: '.content button[type="submit"]') + click(css: '.content.active button[type="submit"]') watch_for( css: 'body', value: 'Sprache', @@ -163,7 +163,7 @@ class PreferencesLanguageTest < TestCase css: '.language_item [name="locale"]', value: 'English (United States)', ) - click(css: '.content button[type="submit"]') + click(css: '.content.active button[type="submit"]') sleep 2 watch_for( css: 'body', @@ -279,7 +279,7 @@ class PreferencesLanguageTest < TestCase css: '.language_item [name="locale"]', value: 'Deutsch', ) - click(css: '.content button[type="submit"]') + click(css: '.content.active button[type="submit"]') sleep 4 watch_for( css: 'body', @@ -324,7 +324,7 @@ class PreferencesLanguageTest < TestCase css: '.language_item [name="locale"]', value: 'English (United States)', ) - click(css: '.content button[type="submit"]') + click(css: '.content.active button[type="submit"]') sleep 2 watch_for( css: 'body', diff --git a/test/browser/preferences_token_access_test.rb b/test/browser/preferences_token_access_test.rb index 58053b1ca..11f153440 100644 --- a/test/browser/preferences_token_access_test.rb +++ b/test/browser/preferences_token_access_test.rb @@ -15,48 +15,48 @@ class PreferencesTokenAccessTest < TestCase click(css: 'a[href="#profile"]') click(css: 'a[href="#profile/token_access"]') - click(css: '#content .js-create') + click(css: '.content.active .js-create') watch_for( css: '.modal .modal-title', value: 'Add a Personal Access Token' ) set( - css: '#content .modal .js-input', + css: '.content.active .modal .js-input', value: 'Some App#1', ) set( - css: '#content .modal .js-datepicker', + css: '.content.active .modal .js-datepicker', value: '05/15/2022', ) sendkey(value: :tab) - click(css: '#content .modal input[value="ticket.agent"] ~ .label-text') - click(css: '#content .modal .js-submit') + click(css: '.content.active .modal input[value="ticket.agent"] ~ .label-text') + click(css: '.content.active .modal .js-submit') watch_for( css: '.modal .modal-title', value: 'Your New Personal Access Token' ) click(css: '.modal .js-submit') watch_for( - css: '#content .js-tokenList', + css: '.content.active .js-tokenList', value: 'Some App#1' ) watch_for( - css: '#content .js-tokenList', + css: '.content.active .js-tokenList', value: '05/15/2022' ) - click(css: '#content .js-create') + click(css: '.content.active .js-create') watch_for( css: '.modal .modal-title', value: 'Add a Personal Access Token' ) set( - css: '#content .modal .js-input', + css: '.content.active .modal .js-input', value: 'Some App#2', ) - click(css: '#content .modal input[value="ticket.agent"] ~ .label-text') - click(css: '#content .modal .js-submit') + click(css: '.content.active .modal input[value="ticket.agent"] ~ .label-text') + click(css: '.content.active .modal .js-submit') watch_for( css: '.modal .modal-title', @@ -64,20 +64,20 @@ class PreferencesTokenAccessTest < TestCase ) click(css: '.modal .js-submit') watch_for( - css: '#content .js-tokenList', + css: '.content.active .js-tokenList', value: 'Some App#2' ) - click(css: '#content .js-tokenList a') + click(css: '.content.active .js-tokenList a') watch_for( - css: '#content .modal .modal-header', + css: '.content.active .modal .modal-header', value: 'confirm', ) click( - css: '#content .modal .js-submit', + css: '.content.active .modal .js-submit', ) watch_for_disappear( - css: '#content .js-tokenList', + css: '.content.active .js-tokenList', value: 'Some App#2' ) diff --git a/test/browser/setting_test.rb b/test/browser/setting_test.rb index b38748d36..6512348eb 100644 --- a/test/browser/setting_test.rb +++ b/test/browser/setting_test.rb @@ -19,7 +19,7 @@ class SettingTest < TestCase css: '.language_item [name="locale"]', value: 'English (United States)', ) - click(css: '.content button[type="submit"]') + click(css: '.content.active button[type="submit"]') sleep 2 # change settings @@ -28,7 +28,7 @@ class SettingTest < TestCase click(css: 'a[href="#third_party_auth"]') sleep 2 switch( - css: '#content .js-setting[data-name="auth_facebook"]', + css: '.content.active .js-setting[data-name="auth_facebook"]', type: 'off', ) @@ -50,7 +50,7 @@ class SettingTest < TestCase # set yes switch( - css: '#content .js-setting[data-name="auth_facebook"]', + css: '.content.active .js-setting[data-name="auth_facebook"]', type: 'on', ) @@ -124,7 +124,7 @@ class SettingTest < TestCase ) sleep 2 switch( - css: '#content .js-setting[data-name="auth_facebook"]', + css: '.content.active .js-setting[data-name="auth_facebook"]', type: 'off', ) diff --git a/test/browser/switch_to_user_test.rb b/test/browser/switch_to_user_test.rb index f41e1a0ff..6148dcb05 100644 --- a/test/browser/switch_to_user_test.rb +++ b/test/browser/switch_to_user_test.rb @@ -12,18 +12,18 @@ class SwitchToUserTest < TestCase tasks_close_all() click(css: 'a[href="#manage"]') - click(css: 'a[href="#manage/users"]') + click(css: '.content.active a[href="#manage/users"]') set( - css: '#content .js-search', + css: '.content.active .js-search', value: 'nicole', ) sleep 3 - @browser.mouse.move_to(@browser.find_elements({ css: '#content .table-overview tbody tr:first-child' } )[0]) + @browser.mouse.move_to(@browser.find_elements({ css: '.content.active .table-overview tbody tr:first-child' } )[0]) sleep 0.5 click( - css: '#content .icon-switchView', + css: '.content.active .icon-switchView', ) sleep 3 diff --git a/test/browser/translation_test.rb b/test/browser/translation_test.rb index e9fa63ee4..8a71ac2d2 100644 --- a/test/browser/translation_test.rb +++ b/test/browser/translation_test.rb @@ -18,7 +18,7 @@ class TranslationTest < TestCase css: '.language_item [name="locale"]', value: 'English (United States)', ) - click(css: '.content button[type="submit"]') + click(css: '.content.active button[type="submit"]') sleep 2 watch_for( css: 'body', @@ -29,7 +29,7 @@ class TranslationTest < TestCase click(css: 'a[href="#system/translation"]') watch_for( - css: '#content', + css: '.content.active', value: 'English is the source language, so we have nothing to translate', ) @@ -40,7 +40,7 @@ class TranslationTest < TestCase css: '.language_item [name="locale"]', value: 'Deutsch', ) - click(css: '.content button[type="submit"]') + click(css: '.content.active button[type="submit"]') watch_for( css: 'body', value: 'Sprache', @@ -51,7 +51,7 @@ class TranslationTest < TestCase notify_close(optional: true) # to be not in click area set( - css: '#content input.js-Item[data-source="Translations"]', + css: '.content.active input.js-Item[data-source="Translations"]', value: 'Übersetzung2', ) sleep 5 # wait until nofify is gone @@ -65,11 +65,11 @@ class TranslationTest < TestCase click(css: 'a[href="#system/translation"]') match( - css: '#content .sidebar', + css: '.content.active .sidebar', value: 'Übersetzung2', ) match( - css: '#content input.js-Item[data-source="Translations"]', + css: '.content.active input.js-Item[data-source="Translations"]', value: 'Übersetzung2', ) @@ -79,11 +79,11 @@ class TranslationTest < TestCase sleep 5 match( - css: '#content .sidebar', + css: '.content.active .sidebar', value: 'Übersetzung2', ) match_not( - css: '#content input.js-Item[data-source="Translations"]', + css: '.content.active input.js-Item[data-source="Translations"]', value: 'Übersetzung2', ) @@ -95,15 +95,15 @@ class TranslationTest < TestCase sleep 2 match_not( - css: '#content .sidebar', + css: '.content.active .sidebar', value: 'Übersetzung2', ) match_not( - css: '#content input.js-Item[data-source="Translations"]', + css: '.content.active input.js-Item[data-source="Translations"]', value: 'Übersetzung2', ) match_not( - css: '#content .sidebar', + css: '.content.active .sidebar', value: 'Übersetzung2', ) @@ -156,7 +156,7 @@ class TranslationTest < TestCase sleep 4 match( - css: '#content input.js-Item[data-source="Overviews"]', + css: '.content.active input.js-Item[data-source="Overviews"]', value: 'Übersichten123', ) @@ -184,7 +184,7 @@ class TranslationTest < TestCase css: '.language_item [name="locale"]', value: 'English (United States)', ) - click(css: '.content button[type="submit"]') + click(css: '.content.active button[type="submit"]') sleep 2 watch_for( css: 'body', @@ -232,11 +232,11 @@ class TranslationTest < TestCase sleep 4 match( - css: '#content input.js-Item[data-source="Overviews"]', + css: '.content.active input.js-Item[data-source="Overviews"]', value: 'Overviews123', ) match_not( - css: '#content', + css: '.content.active', value: 'English is the source language, so we have nothing to translate', ) @@ -245,7 +245,7 @@ class TranslationTest < TestCase ) watch_for( - css: '#content', + css: '.content.active', value: 'English is the source language, so we have nothing to translate', ) diff --git a/test/browser_test_helper.rb b/test/browser_test_helper.rb index 8f3ff55c4..bab23df05 100644 --- a/test/browser_test_helper.rb +++ b/test/browser_test_helper.rb @@ -1193,7 +1193,7 @@ class TestCase < Test::Unit::TestCase file_upload( browser: browser1, - css: '.active .attachmentPlaceholder-inputHolder input' + css: '.content.active .attachmentPlaceholder-inputHolder input' files: ['path/in/home/some_file.ext'], # 'test/fixtures/test1.pdf' ) @@ -1571,12 +1571,12 @@ wait untill text in selector disabppears ) click( browser: instance, - css: 'a[href="#manage/overviews"]', + css: '.content.active a[href="#manage/overviews"]', mute_log: true, ) click( browser: instance, - css: '#content a[data-type="new"]', + css: '.content.active a[data-type="new"]', mute_log: true, ) modal_ready(browser: instance) @@ -1669,16 +1669,16 @@ wait untill text in selector disabppears click( browser: instance, - css: 'a[href="#manage"]', + css: 'a[href="#manage"]', mute_log: true, ) click( browser: instance, - css: 'a[href="#manage/overviews"]', + css: '.content.active a[href="#manage/overviews"]', mute_log: true, ) - instance.execute_script("$(\"#content td:contains('#{data[:name]}')\").first().click()") + instance.execute_script("$(\".content.active td:contains('#{data[:name]}')\").first().click()") sleep 2 if data[:name] @@ -1797,18 +1797,18 @@ wait untill text in selector disabppears click( browser: instance, - css: 'a[href="#new"]', + css: 'a[href="#new"]', mute_log: true, ) click( browser: instance, - css: 'a[href="#ticket/create"]', + css: 'a[href="#ticket/create"]', mute_log: true, ) found = false 7.times { - element = instance.find_elements(css: '.active .newTicket')[0] + element = instance.find_elements(css: '.content.active .newTicket')[0] if element found = true break @@ -1824,23 +1824,23 @@ wait untill text in selector disabppears if data[:group] == '-NONE-' # check if owner selection exists - count = instance.find_elements(css: '.active .newTicket select[name="group_id"] option').count + count = instance.find_elements(css: '.content.active .newTicket select[name="group_id"] option').count assert_equal(0, count, 'owner selection should not be showm') # check count of agents, should be only 3 / - selection + master + agent on init screen - count = instance.find_elements(css: '.active .newTicket select[name="owner_id"] option').count + count = instance.find_elements(css: '.content.active .newTicket select[name="owner_id"] option').count assert_equal(3, count, 'check if owner selection is - selection + master + agent per default') else # check count of agents, should be only 1 / - selection on init screen if !params[:disable_group_check] - count = instance.find_elements(css: '.active .newTicket select[name="owner_id"] option').count + count = instance.find_elements(css: '.content.active .newTicket select[name="owner_id"] option').count assert_equal(1, count, 'check if owner selection is empty per default') end select( browser: instance, - css: '.active .newTicket select[name="group_id"]', + css: '.content.active .newTicket select[name="group_id"]', value: data[:group], mute_log: true, ) @@ -1850,7 +1850,7 @@ wait untill text in selector disabppears if data[:priority] select( browser: instance, - css: '.active .newTicket select[name="priority_id"]', + css: '.content.active .newTicket select[name="priority_id"]', value: data[:priority], mute_log: true, ) @@ -1858,7 +1858,7 @@ wait untill text in selector disabppears if data[:state] select( browser: instance, - css: '.active .newTicket select[name="state_id"]', + css: '.content.active .newTicket select[name="state_id"]', value: data[:state], mute_log: true, ) @@ -1866,7 +1866,7 @@ wait untill text in selector disabppears if data[:title] set( browser: instance, - css: '.active .newTicket input[name="title"]', + css: '.content.active .newTicket input[name="title"]', value: data[:title], clear: true, mute_log: true, @@ -1875,20 +1875,20 @@ wait untill text in selector disabppears if data[:body] set( browser: instance, - css: '.active .newTicket div[data-name=body]', + css: '.content.active .newTicket div[data-name=body]', value: data[:body], clear: true, mute_log: true, ) end if data[:customer] - element = instance.find_elements(css: '.active .newTicket input[name="customer_id_completion"]')[0] + element = instance.find_elements(css: '.content.active .newTicket input[name="customer_id_completion"]')[0] element.click element.clear # ff issue, sometimes focus event gets dropped # if drowdown is not open, try it again - if !instance.find_elements(css: '.active .newTicket .js-recipientDropdown.open')[0] + if !instance.find_elements(css: '.content.active .newTicket .js-recipientDropdown.open')[0] instance.execute_script('$(".active .newTicket .js-recipientDropdown").addClass("open")') end @@ -1899,8 +1899,8 @@ wait untill text in selector disabppears sleep 0.4 # ff issue, sometimes enter event gets dropped # take user manually - if instance.find_elements(css: '.active .newTicket .js-recipientDropdown.open')[0] - instance.find_elements(css: '.active .newTicket .recipientList-entry.js-user.is-active')[0].click + if instance.find_elements(css: '.content.active .newTicket .js-recipientDropdown.open')[0] + instance.find_elements(css: '.content.active .newTicket .recipientList-entry.js-user.is-active')[0].click sleep 0.4 end end @@ -1909,7 +1909,7 @@ wait untill text in selector disabppears params[:custom_data_select].each { |local_key, local_value| select( browser: instance, - css: ".active .newTicket select[name=\"#{local_key}\"]", + css: ".content.active .newTicket select[name=\"#{local_key}\"]", value: local_value, ) } @@ -1918,7 +1918,7 @@ wait untill text in selector disabppears params[:custom_data_input].each { |local_key, local_value| set( browser: instance, - css: ".active .newTicket input[name=\"#{local_key}\"]", + css: ".content.active .newTicket input[name=\"#{local_key}\"]", value: local_value, clear: true, ) @@ -1928,7 +1928,7 @@ wait untill text in selector disabppears if data[:attachment] file_upload( browser: instance, - css: '#content .text-1', + css: '.content.active .text-1', value: 'some text', ) end @@ -1941,7 +1941,7 @@ wait untill text in selector disabppears #instance.execute_script('$(".content.active .newTicket form").submit();') click( browser: instance, - css: '.active .newTicket button.js-submit', + css: '.content.active .newTicket button.js-submit', mute_log: true, ) @@ -1954,7 +1954,7 @@ wait untill text in selector disabppears id.gsub!(//,) id.gsub!(%r{^.+?/(\d+)$}, '\\1') - element = instance.find_elements(css: '.active .ticketZoom-header .ticket-number')[0] + element = instance.find_elements(css: '.content.active .ticketZoom-header .ticket-number')[0] if element number = element.text ticket = { @@ -2045,10 +2045,10 @@ wait untill text in selector disabppears if data[:customer] # select tab - click(browser: instance, css: '.active .tabsSidebar-tab[data-tab="customer"]') + click(browser: instance, css: '.content.active .tabsSidebar-tab[data-tab="customer"]') - click(browser: instance, css: '.active div[data-tab="customer"] .js-actions .icon-arrow-down') - click(browser: instance, css: '.active div[data-tab="customer"] .js-actions [data-type="customer-change"]') + click(browser: instance, css: '.content.active div[data-tab="customer"] .js-actions .icon-arrow-down') + click(browser: instance, css: '.content.active div[data-tab="customer"] .js-actions [data-type="customer-change"]') watch_for( browser: instance, css: '.modal', @@ -2072,12 +2072,12 @@ wait untill text in selector disabppears watch_for( browser: instance, - css: '.active .tabsSidebar', + css: '.content.active .tabsSidebar', value: data[:customer], ) # select tab - click(browser: instance, css: '.active .tabsSidebar-tab[data-tab="ticket"]') + click(browser: instance, css: '.content.active .tabsSidebar-tab[data-tab="ticket"]') end if data[:body] @@ -2102,17 +2102,17 @@ wait untill text in selector disabppears if data[:group] == '-NONE-' # check if owner selection exists - count = instance.find_elements(css: '.active .sidebar select[name="group_id"] option').count + count = instance.find_elements(css: '.content.active .sidebar select[name="group_id"] option').count assert_equal(0, count, 'owner selection should not be showm') # check count of agents, should be only 3 / - selection + master + agent on init screen - count = instance.find_elements(css: '.active .sidebar select[name="owner_id"] option').count + count = instance.find_elements(css: '.content.active .sidebar select[name="owner_id"] option').count assert_equal(3, count, 'check if owner selection is - selection + master + agent per default') else select( browser: instance, - css: '.active .sidebar select[name="group_id"]', + css: '.content.active .sidebar select[name="group_id"]', value: data[:group], mute_log: true, ) @@ -2123,7 +2123,7 @@ wait untill text in selector disabppears if data[:priority] select( browser: instance, - css: '.active .sidebar select[name="priority_id"]', + css: '.content.active .sidebar select[name="priority_id"]', value: data[:priority], mute_log: true, ) @@ -2132,7 +2132,7 @@ wait untill text in selector disabppears if data[:state] select( browser: instance, - css: '.active .sidebar select[name="state_id"]', + css: '.content.active .sidebar select[name="state_id"]', value: data[:state], mute_log: true, ) @@ -2313,7 +2313,7 @@ wait untill text in selector disabppears screenshot(browser: instance, comment: 'ticket_open_by_overview_search') instance.find_elements(partial_link_text: params[:number])[0].click sleep 1 - number = instance.find_elements(css: '.active .ticketZoom-header .ticket-number')[0].text + number = instance.find_elements(css: '.content.active .ticketZoom-header .ticket-number')[0].text if number !~ /#{params[:number]}/ screenshot(browser: instance, comment: 'ticket_open_by_overview_failed') raise "unable to search/find ticket #{params[:number]}!" @@ -2359,7 +2359,7 @@ wait untill text in selector disabppears #instance.find_element(partial_link_text: params[:number] } ).click instance.execute_script("$(\".js-global-search-result a:contains('#{params[:number]}') .nav-tab-icon\").first().click()") sleep 1 - number = instance.find_elements(css: '.active .ticketZoom-header .ticket-number')[0].text + number = instance.find_elements(css: '.content.active .ticketZoom-header .ticket-number')[0].text if number !~ /#{params[:number]}/ screenshot(browser: instance, comment: 'ticket_open_by_search_failed') raise "unable to search/find ticket #{params[:number]}!" @@ -2395,7 +2395,7 @@ wait untill text in selector disabppears #instance.find_element(partial_link_text: params[:title] } ).click instance.execute_script("$(\".js-global-search-result a:contains('#{params[:title]}') .nav-tab-icon\").click()") sleep 1 - title = instance.find_elements(css: '.active .ticketZoom-header .js-objectTitle')[0].text + title = instance.find_elements(css: '.content.active .ticketZoom-header .js-objectTitle')[0].text if title !~ /#{params[:title]}/ screenshot(browser: instance, comment: 'ticket_open_by_title_failed') raise "unable to search/find ticket #{params[:title]}!" @@ -2483,7 +2483,7 @@ wait untill text in selector disabppears #instance.find_element(partial_link_text: params[:value] } ).click instance.execute_script("$(\".js-global-search-result a:contains('#{params[:value]}') .nav-tab-icon\").click()") sleep 1 - name = instance.find_elements(css: '.active h1')[0].text + name = instance.find_elements(css: '.content.active h1')[0].text if name !~ /#{params[:value]}/ screenshot(browser: instance, comment: 'organization_open_by_search_failed') raise "unable to search/find org #{params[:value]}!" @@ -2518,7 +2518,7 @@ wait untill text in selector disabppears #instance.find_element(partial_link_text: params[:value]).click instance.execute_script("$(\".js-global-search-result a:contains('#{params[:value]}') .nav-tab-icon\").click()") sleep 1 - name = instance.find_elements(css: '.active h1')[0].text + name = instance.find_elements(css: '.content.active h1')[0].text if name !~ /#{params[:value]}/ screenshot(browser: instance, comment: 'user_open_by_search_failed') raise "unable to search/find user #{params[:value]}!" @@ -2557,12 +2557,12 @@ wait untill text in selector disabppears ) click( browser: instance, - css: 'a[href="#manage/users"]', + css: '.content.active a[href="#manage/users"]', mute_log: true, ) click( browser: instance, - css: 'a[data-type="new"]', + css: '.content.active a[data-type="new"]', mute_log: true, ) modal_ready(browser: instance) @@ -2630,12 +2630,12 @@ wait untill text in selector disabppears ) click( browser: instance, - css: 'a[href="#manage/slas"]', + css: '.content.active a[href="#manage/slas"]', mute_log: true, ) click( browser: instance, - css: 'a.js-new', + css: '.content.active a.js-new', mute_log: true, ) modal_ready(browser: instance) @@ -2688,12 +2688,12 @@ wait untill text in selector disabppears ) click( browser: instance, - css: 'a[href="#manage/text_modules"]', + css: '.content.active a[href="#manage/text_modules"]', mute_log: true, ) click( browser: instance, - css: 'a[data-type="new"]', + css: '.content.active a[data-type="new"]', mute_log: true, ) modal_ready(browser: instance) @@ -2749,23 +2749,23 @@ wait untill text in selector disabppears click( browser: instance, - css: 'a[href="#manage"]', + css: 'a[href="#manage"]', mute_log: true, ) click( browser: instance, - css: 'a[href="#channels/email"]', + css: '.content.active a[href="#channels/email"]', mute_log: true, ) click( browser: instance, - css: 'a[href="#c-signature"]', + css: '.content.active a[href="#c-signature"]', mute_log: true, ) sleep 4 click( browser: instance, - css: '#content #c-signature a[data-type="new"]', + css: '.content.active #c-signature a[data-type="new"]', mute_log: true, ) modal_ready(browser: instance) @@ -2819,17 +2819,17 @@ wait untill text in selector disabppears click( browser: instance, - css: 'a[href="#manage"]', + css: 'a[href="#manage"]', mute_log: true, ) click( browser: instance, - css: 'a[href="#manage/groups"]', + css: '.content.active a[href="#manage/groups"]', mute_log: true, ) click( browser: instance, - css: 'a[data-type="new"]', + css: '.content.active a[data-type="new"]', mute_log: true, ) modal_ready(browser: instance) @@ -2859,14 +2859,14 @@ wait untill text in selector disabppears data[:member].each { |login| instance.find_elements(css: 'a[href="#manage"]')[0].click sleep 1 - instance.find_elements(css: 'a[href="#manage/users"]')[0].click + instance.find_elements(css: '.content.active a[href="#manage/users"]')[0].click sleep 3 - element = instance.find_elements(css: '#content [name="search"]')[0] + element = instance.find_elements(css: '.content.active [name="search"]')[0] element.clear element.send_keys(login) sleep 3 - #instance.find_elements(:css => '#content table [data-id]')[0].click - instance.execute_script('$("#content table [data-id] td").first().click()') + #instance.find_elements(:css => '.content.active table [data-id]')[0].click + instance.execute_script('$(".content.active table [data-id] td").first().click()') sleep 3 #instance.find_elements(:css => 'label:contains(" ' + action[:name] + '")')[0].click instance.execute_script('$(\'label:contains(" ' + data[:name] + '")\').first().click()') @@ -2915,12 +2915,12 @@ wait untill text in selector disabppears ) click( browser: instance, - css: 'a[href="#manage/roles"]', + css: '.content.active a[href="#manage/roles"]', mute_log: true, ) click( browser: instance, - css: 'a[data-type="new"]', + css: '.content.active a[data-type="new"]', mute_log: true, ) modal_ready(browser: instance) @@ -2961,14 +2961,14 @@ wait untill text in selector disabppears data[:member].each { |login| instance.find_elements(css: 'a[href="#manage"]')[0].click sleep 1 - instance.find_elements(css: 'a[href="#manage/users"]')[0].click + instance.find_elements(css: '.content.active a[href="#manage/users"]')[0].click sleep 3 - element = instance.find_elements(css: '#content [name="search"]')[0] + element = instance.find_elements(css: '.content.active [name="search"]')[0] element.clear element.send_keys(login) sleep 3 - #instance.find_elements(:css => '#content table [data-id]')[0].click - instance.execute_script('$("#content table [data-id] td").first().click()') + #instance.find_elements(:css => '.content.active table [data-id]')[0].click + instance.execute_script('$(".content.active table [data-id] td").first().click()') sleep 3 #instance.find_elements(:css => 'label:contains(" ' + action[:name] + '")')[0].click instance.execute_script('$(\'label:contains(" ' + data[:name] + '")\').first().click()') @@ -3017,10 +3017,10 @@ wait untill text in selector disabppears ) click( browser: instance, - css: 'a[href="#manage/roles"]', + css: '.content.active a[href="#manage/roles"]', mute_log: true, ) - instance.execute_script('$(\'#content table tr td:contains(" ' + data[:name] + '")\').first().click()') + instance.execute_script('$(\'.content.active table tr td:contains(" ' + data[:name] + '")\').first().click()') modal_ready(browser: instance) element = instance.find_elements(css: '.modal input[name=name]')[0] @@ -3070,14 +3070,14 @@ wait untill text in selector disabppears data[:member].each { |login| instance.find_elements(css: 'a[href="#manage"]')[0].click sleep 1 - instance.find_elements(css: 'a[href="#manage/users"]')[0].click + instance.find_elements(css: '.content.active a[href="#manage/users"]')[0].click sleep 3 - element = instance.find_elements(css: '#content [name="search"]')[0] + element = instance.find_elements(css: '.content.active [name="search"]')[0] element.clear element.send_keys(login) sleep 3 - #instance.find_elements(:css => '#content table [data-id]')[0].click - instance.execute_script('$("#content table [data-id] td").first().click()') + #instance.find_elements(:css => '.content.active table [data-id]')[0].click + instance.execute_script('$(".content.active table [data-id] td").first().click()') sleep 3 #instance.find_elements(:css => 'label:contains(" ' + action[:name] + '")')[0].click instance.execute_script('$(\'label:contains(" ' + data[:name] + '")\').first().click()') @@ -3204,13 +3204,13 @@ wait untill text in selector disabppears ) click( browser: instance, - css: 'a[href="#system/object_manager"]', + css: '.content.active a[href="#system/object_manager"]', mute_log: true, ) sleep 4 click( browser: instance, - css: '#content .js-new', + css: '.content.active .js-new', mute_log: true, ) modal_ready(browser: instance) @@ -3316,20 +3316,20 @@ wait untill text in selector disabppears click( browser: instance, - css: 'a[href="#manage"]', + css: 'a[href="#manage"]', mute_log: true, ) click( browser: instance, - css: 'a[href="#system/object_manager"]', + css: '.content.active a[href="#system/object_manager"]', mute_log: true, ) sleep 4 instance = params[:browser] || @browser data = params[:data] - r = instance.execute_script("$(\"#content td:contains('#{data[:name]}')\").first().closest('tr').find('.js-delete').click()") - p "rrr #{r.inspect}" + r = instance.execute_script("$(\".content.active td:contains('#{data[:name]}')\").first().closest('tr').find('.js-delete').click()") + #p "rrr #{r.inspect}" end =begin @@ -3353,17 +3353,17 @@ wait untill text in selector disabppears ) click( browser: instance, - css: 'a[href="#system/object_manager"]', + css: '.content.active a[href="#system/object_manager"]', mute_log: true, ) sleep 4 - element = instance.find_elements(css: '#content .js-discard').first + element = instance.find_elements(css: '.content.active .js-discard').first element.click watch_for_disappear( browser: instance, - css: '#content .js-discard', + css: '.content.active .js-discard', ) end diff --git a/test/integration/facebook_browser_test.rb b/test/integration/facebook_browser_test.rb index 07d8745c5..c42135d5b 100644 --- a/test/integration/facebook_browser_test.rb +++ b/test/integration/facebook_browser_test.rb @@ -43,71 +43,71 @@ class FacebookBrowserTest < TestCase tasks_close_all() click(css: 'a[href="#manage"]') - click(css: 'a[href="#channels/facebook"]') + click(css: '.content.active a[href="#channels/facebook"]') - click(css: '#content .js-configApp') + click(css: '.content.active .js-configApp') modal_ready() set( - css: '#content .modal [name=application_id]', + css: '.content.active .modal [name=application_id]', value: app_id, ) set( - css: '#content .modal [name=application_secret]', + css: '.content.active .modal [name=application_secret]', value: 'wrong', ) - click(css: '#content .modal .js-submit') + click(css: '.content.active .modal .js-submit') watch_for( - css: '#content .modal .alert', + css: '.content.active .modal .alert', value: 'Error', ) set( - css: '#content .modal [name=application_secret]', + css: '.content.active .modal [name=application_secret]', value: app_secret, ) - click(css: '#content .modal .js-submit') + click(css: '.content.active .modal .js-submit') watch_for_disappear( - css: '#content .modal .alert', + css: '.content.active .modal .alert', value: 'Error', ) watch_for( - css: '#content .js-new', + css: '.content.active .js-new', value: 'add account', ) - click(css: '#content .js-configApp') + click(css: '.content.active .js-configApp') modal_ready() set( - css: '#content .modal [name=application_secret]', + css: '.content.active .modal [name=application_secret]', value: 'wrong', ) - click(css: '#content .modal .js-submit') + click(css: '.content.active .modal .js-submit') watch_for( - css: '#content .modal .alert', + css: '.content.active .modal .alert', value: 'Error', ) set( - css: '#content .modal [name=application_secret]', + css: '.content.active .modal [name=application_secret]', value: app_secret, ) - click(css: '#content .modal .js-submit') + click(css: '.content.active .modal .js-submit') watch_for_disappear( - css: '#content .modal .alert', + css: '.content.active .modal .alert', value: 'Error', ) watch_for( - css: '#content .js-new', + css: '.content.active .js-new', value: 'add account', ) - click(css: '#content .js-new') + click(css: '.content.active .js-new') watch_for( css: 'body', @@ -131,7 +131,7 @@ class FacebookBrowserTest < TestCase #sleep 10 #watch_for( - # css: '#content .modal', + # css: '.content.active .modal', # value: '', #) @@ -140,44 +140,44 @@ class FacebookBrowserTest < TestCase value: 'Dashboard', ) - select(css: '#content .modal [name="pages::' + page_id + '::group_id"]', value: 'Users') + select(css: '.content.active .modal [name="pages::' + page_id + '::group_id"]', value: 'Users') sleep 1 - click(css: '#content .modal .js-submit') + click(css: '.content.active .modal .js-submit') sleep 5 watch_for( - css: '#content', + css: '.content.active', value: 'Hansi Merkur', ) exists( - css: '#content .main .action:nth-child(1)' + css: '.content.active .main .action:nth-child(1)' ) exists_not( - css: '#content .main .action:nth-child(2)' + css: '.content.active .main .action:nth-child(2)' ) - click(css: '#content .js-new') + click(css: '.content.active .js-new') sleep 10 #click(css: '#login_button_inline') #watch_for( - # css: '#content .modal', + # css: '.content.active .modal', # value: 'Search Terms', #) - click(css: '#content .modal .js-close') + click(css: '.content.active .modal .js-close') watch_for( - css: '#content', + css: '.content.active', value: 'Hansi Merkur', ) exists( - css: '#content .main .action:nth-child(1)' + css: '.content.active .main .action:nth-child(1)' ) exists_not( - css: '#content .main .action:nth-child(2)' + css: '.content.active .main .action:nth-child(2)' ) # watch till post is in app diff --git a/test/integration/twitter_browser_test.rb b/test/integration/twitter_browser_test.rb index 7cfed4ecd..abd763ae8 100644 --- a/test/integration/twitter_browser_test.rb +++ b/test/integration/twitter_browser_test.rb @@ -46,70 +46,70 @@ class TwitterBrowserTest < TestCase tasks_close_all() click(css: 'a[href="#manage"]') - click(css: 'a[href="#channels/twitter"]') - click(css: '#content .js-configApp') + click(css: '.content.active a[href="#channels/twitter"]') + click(css: '.content.active .js-configApp') sleep 2 set( - css: '#content .modal [name=consumer_key]', + css: '.content.active .modal [name=consumer_key]', value: consumer_key, ) set( - css: '#content .modal [name=consumer_secret]', + css: '.content.active .modal [name=consumer_secret]', value: 'wrong', ) - click(css: '#content .modal .js-submit') + click(css: '.content.active .modal .js-submit') watch_for( - css: '#content .modal .alert', + css: '.content.active .modal .alert', value: 'Authorization Required', ) set( - css: '#content .modal [name=consumer_secret]', + css: '.content.active .modal [name=consumer_secret]', value: consumer_secret, ) - click(css: '#content .modal .js-submit') + click(css: '.content.active .modal .js-submit') watch_for_disappear( - css: '#content .modal .alert', + css: '.content.active .modal .alert', value: 'Authorization Required', ) watch_for( - css: '#content .js-new', + css: '.content.active .js-new', value: 'add account', ) - click(css: '#content .js-configApp') + click(css: '.content.active .js-configApp') set( - css: '#content .modal [name=consumer_secret]', + css: '.content.active .modal [name=consumer_secret]', value: 'wrong', ) - click(css: '#content .modal .js-submit') + click(css: '.content.active .modal .js-submit') watch_for( - css: '#content .modal .alert', + css: '.content.active .modal .alert', value: 'Authorization Required', ) set( - css: '#content .modal [name=consumer_secret]', + css: '.content.active .modal [name=consumer_secret]', value: consumer_secret, ) - click(css: '#content .modal .js-submit') + click(css: '.content.active .modal .js-submit') watch_for_disappear( - css: '#content .modal .alert', + css: '.content.active .modal .alert', value: 'Authorization Required', ) watch_for( - css: '#content .js-new', + css: '.content.active .js-new', value: 'add account', ) - click(css: '#content .js-new') + click(css: '.content.active .js-new') sleep 10 @@ -131,59 +131,59 @@ class TwitterBrowserTest < TestCase #) watch_for( - css: '#content .modal', + css: '.content.active .modal', value: 'Search Terms', ) # add hash tag to search - click(css: '#content .modal .js-searchTermAdd') - set(css: '#content .modal [name="search::term"]', value: hash) - select(css: '#content .modal [name="search::group_id"]', value: 'Users') - click(css: '#content .modal .js-submit') + click(css: '.content.active .modal .js-searchTermAdd') + set(css: '.content.active .modal [name="search::term"]', value: hash) + select(css: '.content.active .modal [name="search::group_id"]', value: 'Users') + click(css: '.content.active .modal .js-submit') sleep 5 watch_for( - css: '#content', + css: '.content.active', value: 'Bob Mutschler', ) watch_for( - css: '#content', + css: '.content.active', value: "@#{twitter_user_login}", ) exists( - css: '#content .main .action:nth-child(1)' + css: '.content.active .main .action:nth-child(1)' ) exists_not( - css: '#content .main .action:nth-child(2)' + css: '.content.active .main .action:nth-child(2)' ) # add account again - click(css: '#content .js-new') + click(css: '.content.active .js-new') sleep 10 click(css: '#allow') watch_for( - css: '#content .modal', + css: '.content.active .modal', value: 'Search Terms', ) - click(css: '#content .modal .js-close') + click(css: '.content.active .modal .js-close') watch_for( - css: '#content', + css: '.content.active', value: 'Bob Mutschler', ) watch_for( - css: '#content', + css: '.content.active', value: "@#{twitter_user_login}", ) exists( - css: '#content .main .action:nth-child(1)' + css: '.content.active .main .action:nth-child(1)' ) exists_not( - css: '#content .main .action:nth-child(2)' + css: '.content.active .main .action:nth-child(2)' ) # wait till new streaming of channel is active @@ -203,14 +203,14 @@ class TwitterBrowserTest < TestCase ) # watch till tweet is in app - click( text: 'Overviews' ) + click(text: 'Overviews') # enable full overviews execute( js: '$(".content.active .sidebar").css("display", "block")', ) - click( text: 'Unassigned & Open' ) + click(text: 'Unassigned & Open') sleep 6 # till overview is rendered watch_for( @@ -224,7 +224,7 @@ class TwitterBrowserTest < TestCase ) # reply via app - click( css: '.content.active [data-type="twitterStatusReply"]' ) + click(css: '.content.active [data-type="twitterStatusReply"]') ticket_update( data: { @@ -246,7 +246,7 @@ class TwitterBrowserTest < TestCase value: '1234567890', ) - click( css: '.content.active [data-type="twitterStatusReply"]' ) + click(css: '.content.active [data-type="twitterStatusReply"]') sleep 2 re_hash = "#{hash}re#{rand(99_999)}"