diff --git a/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee b/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee index 338ec21f0b..ad5bfff97d 100644 --- a/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee +++ b/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee @@ -25,8 +25,9 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, 'q[email_cont]': $scope['q']['email_cont'], 'q[bill_address_firstname_start]': $scope['q']['bill_address_firstname_start'], 'q[bill_address_lastname_start]': $scope['q']['bill_address_lastname_start'], - 'q[completed_at_not_null]': $scope['q']['completed_at_not_null'], - 'q[inventory_units_shipment_id_null]': $scope['q']['inventory_units_shipment_id_null'], + # Set default checkbox values to null. See: https://github.com/openfoodfoundation/openfoodnetwork/pull/3076#issuecomment-440010498 + 'q[completed_at_not_null]': $scope['q']['completed_at_not_null'] || null, + 'q[inventory_units_shipment_id_null]': $scope['q']['inventory_units_shipment_id_null'] || null, 'q[distributor_id_in]': $scope['q']['distributor_id_in'], 'q[order_cycle_id_in]': $scope['q']['order_cycle_id_in'], 'q[order_cycle_id_in]': $scope['q']['order_cycle_id_in'], diff --git a/app/services/search_orders.rb b/app/services/search_orders.rb index 127a53625e..c1120ffb19 100644 --- a/app/services/search_orders.rb +++ b/app/services/search_orders.rb @@ -26,11 +26,11 @@ class SearchOrders @search = OpenFoodNetwork::Permissions.new(current_user).editable_orders.ransack(params[:q]) return paginated_results if using_pagination? - @search.result + @search.result(distinct: true) end def paginated_results - @search.result + @search.result(distinct: true) .page(params[:page]) .per(params[:per_page]) end diff --git a/spec/controllers/api/orders_controller_spec.rb b/spec/controllers/api/orders_controller_spec.rb index 9bcdbeb7ad..760094570d 100644 --- a/spec/controllers/api/orders_controller_spec.rb +++ b/spec/controllers/api/orders_controller_spec.rb @@ -24,6 +24,8 @@ module Api create(:order, order_cycle: order_cycle, state: 'complete', completed_at: Time.zone.now, distributor: distributor, billing_address: create(:address) ) end + let!(:order4) { create(:completed_order_with_fees) } + let!(:order5) { create(:order, state: 'cart', completed_at: nil) } let!(:line_item1) do create(:line_item, order: order1, product: create(:product, supplier: supplier)) @@ -119,6 +121,24 @@ module Api end end + context 'using search filters' do + before do + allow(controller).to receive(:spree_current_user) { admin_user } + end + + it 'can show only completed orders' do + get :index, format: :json, q: { completed_at_not_null: true, s: 'created_at desc' } + + expect(json_response['orders']).to eq serialized_orders([order4, order3, order2, order1]) + end + + it 'can show only unfulfilled orders' do + get :index, format: :json, q: { inventory_units_shipment_id_null: true, s: 'created_at desc' } + + expect(json_response['orders']).to eq serialized_orders([order3, order2, order1]) + end + end + context 'with pagination' do before do allow(controller).to receive(:spree_current_user) { distributor.owner } @@ -128,7 +148,7 @@ module Api get :index, per_page: 15, page: 1 pagination_data = { - 'results' => 2, + 'results' => 3, 'pages' => 1, 'page' => 1, 'per_page' => 15 @@ -141,6 +161,16 @@ module Api private + def serialized_orders(orders) + serialized_orders = ActiveModel::ArraySerializer.new( + orders, + each_serializer: Api::Admin::OrderSerializer, + root: false + ) + + JSON.parse(serialized_orders.to_json) + end + def returns_orders(response) keys = response['orders'].first.keys.map(&:to_sym) expect(order_attributes.all?{ |attr| keys.include? attr }).to be_truthy