diff --git a/app/assets/javascripts/app/controllers/_application_controller_table.coffee b/app/assets/javascripts/app/controllers/_application_controller_table.coffee index 1d9e8a95e..960523742 100644 --- a/app/assets/javascripts/app/controllers/_application_controller_table.coffee +++ b/app/assets/javascripts/app/controllers/_application_controller_table.coffee @@ -677,11 +677,22 @@ class App.ControllerTable extends App.Controller @lastOrderDirection = orderDirection @lastOrderBy = orderBy + # Underscore's sortBy cannot deal with null values, so we replace null values with a place holder string + sortBy = (list, iteratee) -> + _.sortBy( + list + (item) -> + res = iteratee(item) + return res if res + # null values are considered lexicographically "last" + '\uFFFF' + ) + localObjects is undefined if orderBy for header in @headers if header.name is orderBy || "#{header.name}_id" is orderBy || header.name is "#{orderBy}_id" - localObjects = _.sortBy( + localObjects = sortBy( @objects (item) -> diff --git a/script/build/test_slice_tests.sh b/script/build/test_slice_tests.sh index c44ee8c61..3a1105492 100755 --- a/script/build/test_slice_tests.sh +++ b/script/build/test_slice_tests.sh @@ -41,6 +41,7 @@ if [ "$LEVEL" == '1' ]; then rm test/browser/agent_ticket_overview_group_by_organization_test.rb rm test/browser/agent_ticket_overview_level0_test.rb rm test/browser/agent_ticket_overview_level1_test.rb + rm test/browser/agent_ticket_overview_pending_til_test.rb rm test/browser/agent_ticket_overview_tab_test.rb rm test/browser/agent_ticket_tag_test.rb rm test/browser/agent_ticket_task_changed_test.rb @@ -121,6 +122,7 @@ elif [ "$LEVEL" == '2' ]; then rm test/browser/agent_ticket_overview_group_by_organization_test.rb rm test/browser/agent_ticket_overview_level0_test.rb rm test/browser/agent_ticket_overview_level1_test.rb + rm test/browser/agent_ticket_overview_pending_til_test.rb rm test/browser/agent_ticket_overview_tab_test.rb rm test/browser/agent_ticket_tag_test.rb rm test/browser/agent_ticket_task_changed_test.rb @@ -201,6 +203,7 @@ elif [ "$LEVEL" == '3' ]; then rm test/browser/agent_ticket_overview_group_by_organization_test.rb rm test/browser/agent_ticket_overview_level0_test.rb rm test/browser/agent_ticket_overview_level1_test.rb + rm test/browser/agent_ticket_overview_pending_til_test.rb rm test/browser/agent_ticket_overview_tab_test.rb # test/browser/agent_ticket_tag_test.rb # test/browser/agent_ticket_task_changed_test.rb @@ -281,6 +284,7 @@ elif [ "$LEVEL" == '4' ]; then # test/browser/agent_ticket_overview_group_by_organization_test.rb # test/browser/agent_ticket_overview_level0_test.rb # test/browser/agent_ticket_overview_level1_test.rb + # test/browser/agent_ticket_overview_pending_til_test.rb # test/browser/agent_ticket_overview_tab_test.rb rm test/browser/agent_ticket_tag_test.rb rm test/browser/agent_ticket_task_changed_test.rb @@ -360,6 +364,7 @@ elif [ "$LEVEL" == '5' ]; then rm test/browser/agent_ticket_overview_group_by_organization_test.rb rm test/browser/agent_ticket_overview_level0_test.rb rm test/browser/agent_ticket_overview_level1_test.rb + rm test/browser/agent_ticket_overview_pending_til_test.rb rm test/browser/agent_ticket_overview_tab_test.rb rm test/browser/agent_ticket_tag_test.rb rm test/browser/agent_ticket_task_changed_test.rb @@ -442,6 +447,7 @@ elif [ "$LEVEL" == '6' ]; then rm test/browser/agent_ticket_overview_group_by_organization_test.rb rm test/browser/agent_ticket_overview_level0_test.rb rm test/browser/agent_ticket_overview_level1_test.rb + rm test/browser/agent_ticket_overview_pending_til_test.rb rm test/browser/agent_ticket_overview_tab_test.rb rm test/browser/agent_ticket_tag_test.rb rm test/browser/agent_ticket_task_changed_test.rb diff --git a/test/browser/agent_ticket_overview_pending_til_test.rb b/test/browser/agent_ticket_overview_pending_til_test.rb new file mode 100644 index 000000000..d2676cf3a --- /dev/null +++ b/test/browser/agent_ticket_overview_pending_til_test.rb @@ -0,0 +1,66 @@ +require 'browser_test_helper' + +class AgentTicketOverviewPendingTil < TestCase + + # regression for issue #2367 - cannot sort by Pending Til + def test_sorting_by_pending_til + name = "overview_pending_til_#{rand(999_999)}" + + @browser = browser_instance + login( + username: 'master@example.com', + password: 'test', + url: browser_url, + ) + tasks_close_all() + + # create 4 tickets, 2 with pending til data and 2 without + tickets = [] + 4.times do |i| + ticket = ticket_create( + data: { + customer: 'nico', + group: 'Users', + title: "pending til ticket #{i}", + body: 'test ticket', + state: i.odd? ? 'pending close' : 'open', + pending_date: '11/24/2018', + pending_time: '08:00', + } + ) + tickets.push ticket + end + + # create and open new overview that has the Pending Til column + overview_create( + data: { + name: name, + roles: %w[Admin Agent], + selector: { + 'State' => ['new', 'open', 'closed', 'merged', 'pending close', 'pending reminder'], + }, + attributes: { + 'pending_time' => true, + }, + } + ) + overview_open( + name: name, + ) + + # sort by Pending Til + click( + css: '.content.active table.table th.js-tableHead[data-column-key="pending_time"]', + ) + + # check if the first and second rows both correctly contain 'pending close' + match( + css: '.content.active table .js-tableBody tr:nth-child(1)', + value: 'pending close', + ) + match( + css: '.content.active table .js-tableBody tr:nth-child(2)', + value: 'pending close', + ) + end +end diff --git a/test/browser_test_helper.rb b/test/browser_test_helper.rb index 712adb283..6adddda56 100644 --- a/test/browser_test_helper.rb +++ b/test/browser_test_helper.rb @@ -1778,6 +1778,20 @@ wait untill text in selector disabppears end end + data[:attributes]&.each do |key, value| + if value + check( + browser: instance, + css: ".modal .checkbox input[value=\"#{key}\"]", + ) + else + uncheck( + browser: instance, + css: ".modal .checkbox input[value=\"#{key}\"]", + ) + end + end + data[:selector]&.each do |key, value| select( browser: instance, @@ -1793,6 +1807,15 @@ wait untill text in selector disabppears value: value, mute_log: true, ) + elsif value.instance_of? Array + value.each do |item| + select( + browser: instance, + css: '.modal .ticket_selector .js-value select', + value: item, + mute_log: true, + ) + end else select( browser: instance, @@ -2008,6 +2031,19 @@ wait untill text in selector disabppears disable_group_check: true, ) + ticket = ticket_create( + browser: browser1, + data: { + customer: 'nico', + priority: '2 normal', + state: 'pending close', + pending_date: '11/24/2018', + pending_time: '08:00', + title: 'overview #1', + body: 'overview #1', + }, + do_not_submit: true, + ) =end def ticket_create(params) @@ -2098,6 +2134,24 @@ wait untill text in selector disabppears value: data[:state], mute_log: true, ) + if ['pending close', 'pending reminder'].include?(data[:state]) && + data[:pending_date] && + data[:pending_time] + set( + browser: instance, + css: '.content.active .newTicket input.js-datepicker', + value: data[:pending_date], + clear: true, + mute_log: true, + ) + set( + browser: instance, + css: '.content.active .newTicket input.js-timepicker', + value: data[:pending_time], + clear: true, + mute_log: true, + ) + end end if data[:title] set(