diff --git a/app/models/spree/order.rb b/app/models/spree/order.rb index 6fc2ec1ac0..ea823f06b5 100644 --- a/app/models/spree/order.rb +++ b/app/models/spree/order.rb @@ -149,11 +149,13 @@ module Spree } scope :sort_by_billing_address_name_asc, -> { - joins(:bill_address).order("spree_addresses.lastname ASC, spree_addresses.firstname ASC") + references(:bill_address) + .order("spree_addresses.lastname ASC, spree_addresses.firstname ASC") } scope :sort_by_billing_address_name_desc, -> { - joins(:bill_address).order("spree_addresses.lastname DESC, spree_addresses.firstname DESC") + references(:bill_address) + .order("spree_addresses.lastname DESC, spree_addresses.firstname DESC") } scope :with_line_items_variants_and_products_outer, lambda { diff --git a/app/services/search_orders.rb b/app/services/search_orders.rb index 60cf824e63..e8992d1b90 100644 --- a/app/services/search_orders.rb +++ b/app/services/search_orders.rb @@ -15,11 +15,16 @@ class SearchOrders attr_reader :params, :current_user def fetch_orders - @search = search_query. + search = search_query. includes(:payments, :subscription, :shipments, :bill_address, :distributor, :order_cycle). - ransack(params[:q]) + ransack(params[:q]). + result(distinct: true) - @search.result(distinct: true).joins(:bill_address) + if params.dig(:q, :s)&.starts_with?("bill_address_") + search = search.select('spree_addresses.*, spree_orders.*') + end + + search end def search_query diff --git a/app/views/spree/admin/orders/_table_row.html.haml b/app/views/spree/admin/orders/_table_row.html.haml index 3f8feb8d42..b25b7c2c1a 100644 --- a/app/views/spree/admin/orders/_table_row.html.haml +++ b/app/views/spree/admin/orders/_table_row.html.haml @@ -33,7 +33,7 @@ %a{ href: "mailto:#{order.email}", target: "_blank" } = order.email %td - = order.bill_address.full_name_for_sorting + = order&.bill_address&.full_name_for_sorting %td.align-center %span = order.display_total diff --git a/spec/controllers/api/v0/orders_controller_spec.rb b/spec/controllers/api/v0/orders_controller_spec.rb index 773a9170b8..3f2e710bc2 100644 --- a/spec/controllers/api/v0/orders_controller_spec.rb +++ b/spec/controllers/api/v0/orders_controller_spec.rb @@ -149,6 +149,33 @@ module Api .map{ |o| o[:id] }).to eq serialized_orders([order2, order3, order1, order4]) .map{ |o| o["id"] } end + + context "with an order without billing address" do + let!(:order7) { + create(:order_with_line_items, billing_address: nil, order_cycle: order_cycle, + distributor: distributor) + } + + it 'can show orders without bill address' do + get :index, params: { q: {} }, + as: :json + + expect(json_response['orders'] + .map{ |o| o[:id] }).to match_array serialized_orders([order2, order3, order1, order4, + order7]) + .map{ |o| + o["id"] + } + end + + it 'can sort orders by bill_address.lastname' do + get :index, params: { q: { s: 'bill_address_lastname ASC' } }, + as: :json + expect(json_response['orders'] + .map{ |o| o[:id] }).to eq serialized_orders([order2, order3, order1, order4, order7]) + .map{ |o| o["id"] } + end + end end context 'with pagination' do diff --git a/spec/system/admin/orders_spec.rb b/spec/system/admin/orders_spec.rb index 1ed41fb713..d64b74eb9d 100644 --- a/spec/system/admin/orders_spec.rb +++ b/spec/system/admin/orders_spec.rb @@ -269,8 +269,6 @@ describe ' end it "displays non-empty cart orders" do - pending "issue #11120" - # empty cart order does not appear in the results expect(page).not_to have_content order_empty.number @@ -278,8 +276,13 @@ describe ' expect(page).to have_content order_not_empty.number # non-empty cart order, with no with bill- and ship-address appear in the results + expect(page).to have_content order_not_empty_no_address.number - # pending issue #11120 + # And the same orders are displayed when sorting by name: + find("th a", text: "NAME").click + + expect(page).to have_no_content order_empty.number + expect(page).to have_content order_not_empty.number expect(page).to have_content order_not_empty_no_address.number end end