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 @@
-
- -
- <%- @Icon('received-calls', 'tab-icon') %>
- <%- @T('Received Call') %>
-
- -
- <%- @Icon('outbound-calls', 'tab-icon') %>
- <%- @T('Outbound Call') %>
-
- -
- <%- @Icon('email', 'tab-icon') %>
- <%- @T('Send Email') %>
-
-
+ <% if !_.isEmpty(@availableTypes) && @availableTypes.length > 1: %>
+
+ <% for type in @availableTypes: %>
+ -
+ <%- @Icon(@types[type]['icon'], 'tab-icon') %>
+ <%- @T(@types[type]['label']) %>
+
+ <% end %>
+
+ <% 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