From 896e4f0492b9a298aee01d68d21400922983c721 Mon Sep 17 00:00:00 2001 From: Mantas Date: Wed, 2 May 2018 18:49:35 +0300 Subject: [PATCH] Fixes #1987 makes ticket create types configurable --- .../controllers/agent_ticket_create.coffee | 37 +++++++-- .../app/views/agent_ticket_create.jst.eco | 24 +++--- ..._ticket_create_types_setting_issue_1987.rb | 62 ++++++++++++++ db/seeds/settings.rb | 56 +++++++++++++ script/build/test_slice_tests.sh | 12 +++ ...gent_ticket_create_available_types_test.rb | 45 +++++++++++ .../agent_ticket_create_default_type_test.rb | 81 +++++++++++++++++++ 7 files changed, 296 insertions(+), 21 deletions(-) create mode 100644 db/migrate/20180508182850_ticket_create_types_setting_issue_1987.rb create mode 100644 test/browser/agent_ticket_create_available_types_test.rb create mode 100644 test/browser/agent_ticket_create_default_type_test.rb 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/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