diff --git a/Gemfile b/Gemfile index e32e88837..c5aa43639 100644 --- a/Gemfile +++ b/Gemfile @@ -115,6 +115,10 @@ gem 'viewpoint' # in production environments by default. group :development, :test do + # debugging + gem 'pry-rails' + gem 'pry-remote' + # test frameworks gem 'rspec-rails' gem 'test-unit' @@ -157,8 +161,10 @@ group :development, :test do gem 'webmock' end -# load onw gems for development and testing purposes -local_gemfile = File.join(File.dirname(__FILE__), 'Gemfile.local') -if File.exist?(local_gemfile) - eval_gemfile local_gemfile -end +# Want to extend Zammad with additional gems? +# ZAMMAD USERS: Specify them in Gemfile.local +# (That way, you can customize the Gemfile +# without having your changes overwritten during upgrades.) +# ZAMMAD DEVS: Consult the internal wiki +# (or else risk pushing unwanted changes to Gemfile.lock!) +eval_gemfile 'Gemfile.local' if File.exist?('Gemfile.local') diff --git a/Gemfile.lock b/Gemfile.lock index 3b6ded1ba..88a2b1173 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -296,6 +296,11 @@ GEM pry (0.11.3) coderay (~> 1.1.0) method_source (~> 0.9.0) + pry-rails (0.3.6) + pry (>= 0.10.4) + pry-remote (0.1.8) + pry (~> 0.9) + slop (~> 3.0) public_suffix (3.0.1) puma (3.11.0) rack (2.0.4) @@ -395,6 +400,7 @@ GEM simplecov-rcov (0.2.3) simplecov (>= 0.4.1) slack-notifier (2.3.1) + slop (3.6.0) sprockets (3.7.1) concurrent-ruby (~> 1.0) rack (> 1, < 3) @@ -516,6 +522,8 @@ DEPENDENCIES omniauth-weibo-oauth2 pg pre-commit + pry-rails + pry-remote puma rack-livereload rails (= 5.1.5) diff --git a/app/assets/javascripts/app/controllers/agent_ticket_create.coffee b/app/assets/javascripts/app/controllers/agent_ticket_create.coffee index f14fd7b55..fc202802d 100644 --- a/app/assets/javascripts/app/controllers/agent_ticket_create.coffee +++ b/app/assets/javascripts/app/controllers/agent_ticket_create.coffee @@ -7,12 +7,33 @@ class App.TicketCreate extends App.Controller 'submit form': 'submit' 'click .js-cancel': 'cancel' + types: { + 'phone-in': { + icon: 'received-calls', + label: 'Received Call' + }, + 'phone-out': { + icon: 'outbound-calls', + label: 'Outbound Call' + }, + 'email-out': { + icon: 'email', + label: 'Send Email' + } + } + constructor: (params) -> super @sidebarState = {} - # define default type - @default_type = 'phone-in' + # define default type and available types + @defaultType = @Config.get('ui_ticket_create_default_type') + @availableTypes = @Config.get('ui_ticket_create_available_types') || [] + if !_.isArray(@availableTypes) + @availableTypes = [@availableTypes] + + if !_.contains(@availableTypes, @defaultType) + @defaultType = @availableTypes[0] @formId = App.ControllerForm.formId() @@ -50,7 +71,7 @@ class App.TicketCreate extends App.Controller if !type type = @$('.type-tabs .tab.active').data('type') if !type - type = @default_type + type = @defaultType type changeFormType: (e) => @@ -239,10 +260,12 @@ class App.TicketCreate extends App.Controller @formId = params['form_id'] @html(App.view('agent_ticket_create')( - head: 'New Ticket' - agent: @permissionCheck('ticket.agent') - admin: @permissionCheck('admin') - form_id: @formId + head: 'New Ticket' + agent: @permissionCheck('ticket.agent') + admin: @permissionCheck('admin') + types: @types, + availableTypes: @availableTypes + form_id: @formId )) App.Ticket.configure_attributes.push { diff --git a/app/assets/javascripts/app/views/agent_ticket_create.jst.eco b/app/assets/javascripts/app/views/agent_ticket_create.jst.eco index 669cca9fe..f37872bcc 100644 --- a/app/assets/javascripts/app/views/agent_ticket_create.jst.eco +++ b/app/assets/javascripts/app/views/agent_ticket_create.jst.eco @@ -7,20 +7,16 @@
- + <% if !_.isEmpty(@availableTypes) && @availableTypes.length > 1: %> + + <% end %> <% if !_.isEmpty(@C('ui_ticket_create_notes')): %> <% for type, note of @C('ui_ticket_create_notes'): %> diff --git a/db/migrate/20180508182850_ticket_create_types_setting_issue_1987.rb b/db/migrate/20180508182850_ticket_create_types_setting_issue_1987.rb new file mode 100644 index 000000000..73f94cfc7 --- /dev/null +++ b/db/migrate/20180508182850_ticket_create_types_setting_issue_1987.rb @@ -0,0 +1,62 @@ +class TicketCreateTypesSettingIssue1987 < ActiveRecord::Migration[5.1] + def up + # return if it's a new setup + return if !Setting.find_by(name: 'system_init_done') + + Setting.create_if_not_exists( + title: 'Default type for a new ticket', + name: 'ui_ticket_create_default_type', + area: 'UI::TicketCreate', + description: 'Select default ticket type', + options: { + form: [ + { + display: '', + null: false, + multiple: false, + name: 'ui_ticket_create_default_type', + tag: 'select', + options: { + 'phone-in' => '1. Phone inbound', + 'phone-out' => '2. Phone outbound', + 'email-out' => '3. Email outbound', + }, + }, + ], + }, + state: 'phone-in', + preferences: { + permission: ['admin.ui'] + }, + frontend: true + ) + + Setting.create_if_not_exists( + title: 'Available types for a new ticket', + name: 'ui_ticket_create_available_types', + area: 'UI::TicketCreate', + description: 'Set available ticket types', + options: { + form: [ + { + display: '', + null: false, + multiple: true, + name: 'ui_ticket_create_available_types', + tag: 'select', + options: { + 'phone-in' => '1. Phone inbound', + 'phone-out' => '2. Phone outbound', + 'email-out' => '3. Email outbound', + }, + }, + ], + }, + state: %w[phone-in phone-out email-out], + preferences: { + permission: ['admin.ui'] + }, + frontend: true + ) + end +end diff --git a/db/seeds/settings.rb b/db/seeds/settings.rb index 41869c850..7d024b69b 100644 --- a/db/seeds/settings.rb +++ b/db/seeds/settings.rb @@ -795,6 +795,62 @@ Setting.create_if_not_exists( frontend: true ) +Setting.create_if_not_exists( + title: 'Default type for a new ticket', + name: 'ui_ticket_create_default_type', + area: 'UI::TicketCreate', + description: 'Select default ticket type', + options: { + form: [ + { + display: '', + null: false, + multiple: false, + name: 'ui_ticket_create_default_type', + tag: 'select', + options: { + 'phone-in' => '1. Phone inbound', + 'phone-out' => '2. Phone outbound', + 'email-out' => '3. Email outbound', + }, + }, + ], + }, + state: 'phone-in', + preferences: { + permission: ['admin.ui'] + }, + frontend: true +) + +Setting.create_if_not_exists( + title: 'Available types for a new ticket', + name: 'ui_ticket_create_available_types', + area: 'UI::TicketCreate', + description: 'Set available ticket types', + options: { + form: [ + { + display: '', + null: false, + multiple: true, + name: 'ui_ticket_create_available_types', + tag: 'select', + options: { + 'phone-in' => '1. Phone inbound', + 'phone-out' => '2. Phone outbound', + 'email-out' => '3. Email outbound', + }, + }, + ], + }, + state: %w[phone-in phone-out email-out], + preferences: { + permission: ['admin.ui'] + }, + frontend: true +) + Setting.create_if_not_exists( title: 'Open ticket indicator', name: 'ui_sidebar_open_ticket_indicator_colored', diff --git a/lib/cache.rb b/lib/cache.rb index de89def9f..5ed764832 100644 --- a/lib/cache.rb +++ b/lib/cache.rb @@ -35,6 +35,7 @@ write a cache Rails.cache.write(key.to_s, data, params) rescue => e Rails.logger.error "Can't write cache #{key}: #{e.inspect}" + Rails.logger.error e end end diff --git a/script/build/test_slice_tests.sh b/script/build/test_slice_tests.sh index db555d20d..c5d6b8df4 100755 --- a/script/build/test_slice_tests.sh +++ b/script/build/test_slice_tests.sh @@ -24,7 +24,9 @@ if [ "$LEVEL" == '1' ]; then # test/browser/agent_organization_profile_test.rb rm test/browser/agent_ticket_attachment_test.rb rm test/browser/agent_ticket_auto_assignment_test.rb + rm test/browser/agent_ticket_create_available_types_test.rb rm test/browser/agent_ticket_create_cc_tokenizer_test.rb + rm test/browser/agent_ticket_create_default_type_test.rb rm test/browser/agent_ticket_create_reset_customer_selection_test.rb rm test/browser/agent_ticket_create_template_test.rb rm test/browser/agent_ticket_email_reply_keep_body_test.rb @@ -92,7 +94,9 @@ elif [ "$LEVEL" == '2' ]; then rm test/browser/agent_organization_profile_test.rb rm test/browser/agent_ticket_attachment_test.rb rm test/browser/agent_ticket_auto_assignment_test.rb + rm test/browser/agent_ticket_create_available_types_test.rb rm test/browser/agent_ticket_create_cc_tokenizer_test.rb + rm test/browser/agent_ticket_create_default_type_test.rb rm test/browser/agent_ticket_create_reset_customer_selection_test.rb rm test/browser/agent_ticket_create_template_test.rb rm test/browser/agent_ticket_email_reply_keep_body_test.rb @@ -160,7 +164,9 @@ elif [ "$LEVEL" == '3' ]; then rm test/browser/agent_organization_profile_test.rb # test/browser/agent_ticket_attachment_test.rb # test/browser/agent_ticket_auto_assignment_test.rb + # rm test/browser/agent_ticket_create_available_types_test.rb #rm test/browser/agent_ticket_create_cc_tokenizer_test.rb + # rm test/browser/agent_ticket_create_default_type_test.rb # test/browser/agent_ticket_create_reset_customer_selection_test.rb # test/browser/agent_ticket_create_template_test.rb # test/browser/agent_ticket_email_reply_keep_body_test.rb @@ -228,7 +234,9 @@ elif [ "$LEVEL" == '4' ]; then rm test/browser/agent_organization_profile_test.rb rm test/browser/agent_ticket_attachment_test.rb rm test/browser/agent_ticket_auto_assignment_test.rb + rm test/browser/agent_ticket_create_available_types_test.rb rm test/browser/agent_ticket_create_cc_tokenizer_test.rb + rm test/browser/agent_ticket_create_default_type_test.rb rm test/browser/agent_ticket_create_reset_customer_selection_test.rb rm test/browser/agent_ticket_create_template_test.rb rm test/browser/agent_ticket_email_reply_keep_body_test.rb @@ -295,7 +303,9 @@ elif [ "$LEVEL" == '5' ]; then rm test/browser/agent_organization_profile_test.rb rm test/browser/agent_ticket_attachment_test.rb rm test/browser/agent_ticket_auto_assignment_test.rb + rm test/browser/agent_ticket_create_available_types_test.rb rm test/browser/agent_ticket_create_cc_tokenizer_test.rb + rm test/browser/agent_ticket_create_default_type_test.rb rm test/browser/agent_ticket_create_reset_customer_selection_test.rb rm test/browser/agent_ticket_create_template_test.rb rm test/browser/agent_ticket_email_reply_keep_body_test.rb @@ -365,7 +375,9 @@ elif [ "$LEVEL" == '6' ]; then rm test/browser/agent_organization_profile_test.rb rm test/browser/agent_ticket_attachment_test.rb rm test/browser/agent_ticket_auto_assignment_test.rb + rm test/browser/agent_ticket_create_available_types_test.rb rm test/browser/agent_ticket_create_cc_tokenizer_test.rb + rm test/browser/agent_ticket_create_default_type_test.rb rm test/browser/agent_ticket_create_reset_customer_selection_test.rb rm test/browser/agent_ticket_create_template_test.rb rm test/browser/agent_ticket_email_reply_keep_body_test.rb diff --git a/test/browser/agent_ticket_create_available_types_test.rb b/test/browser/agent_ticket_create_available_types_test.rb new file mode 100644 index 000000000..92ae4a877 --- /dev/null +++ b/test/browser/agent_ticket_create_available_types_test.rb @@ -0,0 +1,45 @@ + +require 'browser_test_helper' + +# Regression test for UI enhancement +# https://github.com/zammad/zammad/issues/1987 +# Ensure that available ticket types are rendered correctly +class AgentTicketCreateAvailableTypesTest < TestCase + def test_ticket_create_type + @browser = browser_instance + login( + username: 'agent1@example.com', + password: 'test', + url: browser_url, + ) + tasks_close_all() + + click( + css: 'a[href="#ticket/create"]' + ) + + exists( + css: '.type-tabs li.active[data-type=phone-in]' + ) + end + + def test_ticket_create_solo_type + @browser = browser_instance + login( + username: 'agent1@example.com', + password: 'test', + url: browser_url, + ) + tasks_close_all() + + @browser.execute_script("App.Config.set('ui_ticket_create_default_type', 'email-out')") + + click( + css: 'a[href="#ticket/create"]' + ) + + exists( + css: '.type-tabs li.active[data-type=email-out]' + ) + end +end diff --git a/test/browser/agent_ticket_create_default_type_test.rb b/test/browser/agent_ticket_create_default_type_test.rb new file mode 100644 index 000000000..4bb06798c --- /dev/null +++ b/test/browser/agent_ticket_create_default_type_test.rb @@ -0,0 +1,81 @@ + +require 'browser_test_helper' + +# Regression test for UI enhancement +# https://github.com/zammad/zammad/issues/1987 +# Ensure that available ticket types are rendered correctly +class AgentTicketCreateDefaultTypeTest < TestCase + def test_ticket_create_type + @browser = browser_instance + login( + username: 'agent1@example.com', + password: 'test', + url: browser_url, + ) + tasks_close_all() + + click( + css: 'a[href="#ticket/create"]' + ) + + exists( + css: '.type-tabs li[data-type=phone-in]' + ) + + exists( + css: '.type-tabs li[data-type=phone-out]' + ) + + exists( + css: '.type-tabs li[data-type=email-out]' + ) + end + + def test_ticket_create_disabled_type + @browser = browser_instance + login( + username: 'agent1@example.com', + password: 'test', + url: browser_url, + ) + tasks_close_all() + + @browser.execute_script("App.Config.set('ui_ticket_create_available_types', ['email-out', 'phone-out'])") + + click( + css: 'a[href="#ticket/create"]' + ) + + exists_not( + css: '.type-tabs li[data-type=phone-in]' + ) + + exists( + css: '.type-tabs li[data-type=phone-out]' + ) + + exists( + css: '.type-tabs li[data-type=email-out]' + ) + end + + def test_ticket_create_solo_type + @browser = browser_instance + login( + username: 'agent1@example.com', + password: 'test', + url: browser_url, + ) + tasks_close_all() + + @browser.execute_script("App.Config.set('ui_ticket_create_available_types', ['email-out'])") + + click( + css: 'a[href="#ticket/create"]' + ) + + exists_not( + css: '.type-tabs' + ) + end +end