From 90cba959719a13d86b189f2a62faa1136c1cb1a9 Mon Sep 17 00:00:00 2001 From: Angel Perez Date: Wed, 10 Apr 2019 09:20:08 -0400 Subject: [PATCH 1/4] Add search form for user orders --- .../views/spree/admin/users/orders.html.erb | 97 ++++++++++++++++++- 1 file changed, 95 insertions(+), 2 deletions(-) diff --git a/backend/app/views/spree/admin/users/orders.html.erb b/backend/app/views/spree/admin/users/orders.html.erb index b4bbbe085de..f5eb6dba327 100644 --- a/backend/app/views/spree/admin/users/orders.html.erb +++ b/backend/app/views/spree/admin/users/orders.html.erb @@ -2,18 +2,111 @@ <% admin_breadcrumb(link_to @user.email, edit_admin_user_url(@user)) %> <% admin_breadcrumb(t('spree.admin.user.order_history')) %> - <%= render 'spree/admin/users/sidebar' %> <%= render 'spree/admin/users/tabs', current: :orders %> <%= render partial: 'spree/admin/users/user_page_actions' %> +<% content_for :table_filter_title do %> + <%= t('spree.search') %> +<% end %> + +<% content_for :table_filter do %> +
+ <%= search_form_for [:admin, @search], url: orders_admin_user_path(@user.id) do |f| %> +
+
+
+ <%= label_tag :q_created_at_gt, t('spree.date_range') %> + +
+ <%= f.text_field :created_at_gt, class: "datepicker form-control datepicker-from", + value: params[:q][:created_at_gt], + placeholder: t("spree.start") %> + +
+ + + +
+ + <%= f.text_field :created_at_lt, class: "datepicker form-control datepicker-to", + value: params[:q][:created_at_lt], + placeholder: t("spree.end") %> +
+
+ +
+ <%= label_tag :q_state_eq, t("spree.status") %> + <%= f.select :state_eq, Spree::Order.state_machines[:state].states.collect { + |s| [t(s.name, scope: "spree.order_state"), s.value] + }, { include_blank: true }, class: "custom-select fullwidth" %> +
+
+ +
+
+
+
+ <%= label_tag :q_number_start, t("spree.order_number", number: "") %> + <%= f.text_field :number_start %> +
+ +
+ <%= label_tag :q_email_start, t("spree.email") %> + <%= f.text_field :email_start %> +
+
+ +
+
+ <%= label_tag :q_bill_address_firstname_start, t("spree.first_name_begins_with") %> + <%= f.text_field :bill_address_firstname_start, size: 25 %> +
+ +
+ <%= label_tag :q_bill_address_lastname_start, t("spree.last_name_begins_with") %> + <%= f.text_field :bill_address_lastname_start, size: 25 %> +
+
+
+
+ +
+ <% if Spree::Store.count > 1 %> +
+ <%= label_tag :q_store_id_eq, t("spree.store") %> + <%= f.select :store_id_eq, Spree::Store.find_each.map { + |s| [s.name, s.id] + }, { include_blank: true }, { class: "custom-select fullwidth" } %> +
+ <% end %> + +
+ +
+
+
+ +
+ +
+
+ <%= button_tag t("spree.filter_results"), class: "btn btn-primary" %> +
+
+ <% end %> +
+<% end %> +
<%= t("spree.admin.user.order_history") %> <%= paginate @orders, theme: "solidus_admin" %> <% if @orders.any? %> - <%# TODO add search interface %> From f6e74fe1820e0e4c238bc0fe3c6b8991ec3b732e Mon Sep 17 00:00:00 2001 From: Angel Perez Date: Wed, 10 Apr 2019 09:31:01 -0400 Subject: [PATCH 2/4] Adjust pagination buttons to fit the new search form --- backend/app/views/spree/admin/users/orders.html.erb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/app/views/spree/admin/users/orders.html.erb b/backend/app/views/spree/admin/users/orders.html.erb index f5eb6dba327..86800913398 100644 --- a/backend/app/views/spree/admin/users/orders.html.erb +++ b/backend/app/views/spree/admin/users/orders.html.erb @@ -101,11 +101,11 @@ <% end %> +<%= paginate @orders, theme: "solidus_admin" %> +
<%= t("spree.admin.user.order_history") %> - <%= paginate @orders, theme: "solidus_admin" %> - <% if @orders.any? %>
@@ -170,6 +170,6 @@ new_resource_url: spree.new_admin_order_path(user_id: @user.id) %> <% end %> - - <%= paginate @orders, theme: "solidus_admin" %> + +<%= paginate @orders, theme: "solidus_admin" %> From 2cc164fc32209411850e857a4a7911ee34fe849d Mon Sep 17 00:00:00 2001 From: Angel Perez Date: Wed, 10 Apr 2019 15:57:01 -0400 Subject: [PATCH 3/4] Allow search for user orders via Admin panel --- .../spree/admin/users_controller.rb | 31 +++++++++++++++++-- .../spree/admin/users_controller_spec.rb | 2 +- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/backend/app/controllers/spree/admin/users_controller.rb b/backend/app/controllers/spree/admin/users_controller.rb index a288a265045..4bbba3c782f 100644 --- a/backend/app/controllers/spree/admin/users_controller.rb +++ b/backend/app/controllers/spree/admin/users_controller.rb @@ -65,8 +65,35 @@ def addresses def orders params[:q] ||= {} - @search = Spree::Order.reverse_chronological.ransack(params[:q].merge(user_id_eq: @user.id)) - @orders = @search.result.page(params[:page]).per(Spree::Config[:admin_products_per_page]) + params[:q][:completed_at_not_null] ||= '1' if Spree::Config[:show_only_complete_orders_by_default] + + @only_completed_orders = params[:q][:completed_at_not_null] == '1' + + params[:q][:s] ||= @only_completed_orders ? 'completed_at DESC' : 'created_at ASC' + params[:q][:completed_at_not_null] = '' unless @only_completed_orders + + if params[:q][:created_at_gt].present? + params[:q][:created_at_gt] = begin + Time.zone.parse(params[:q][:created_at_gt]).beginning_of_day + rescue StandardError + "" + end + end + + if params[:q][:created_at_lt].present? + params[:q][:created_at_lt] = begin + Time.zone.parse(params[:q][:created_at_lt]).end_of_day + rescue StandardError + "" + end + end + + @search = Spree::Order.reverse_chronological + .ransack(params[:q].merge(user_id_eq: @user.id)) + + @orders = @search.result.includes([:user]) + .page(params[:page]) + .per(params[:per_page] || Spree::Config[:orders_per_page]) end def items diff --git a/backend/spec/controllers/spree/admin/users_controller_spec.rb b/backend/spec/controllers/spree/admin/users_controller_spec.rb index 27d9319a7dc..d5029645d8d 100644 --- a/backend/spec/controllers/spree/admin/users_controller_spec.rb +++ b/backend/spec/controllers/spree/admin/users_controller_spec.rb @@ -225,7 +225,7 @@ def user can :manage, Spree.user_class end - let(:order) { create(:order) } + let(:order) { create(:completed_order_with_totals) } before { user.orders << order } it "assigns a list of the users orders" do From d13c53b6cff42a1682cb9587e1727cfb8fe6d6ea Mon Sep 17 00:00:00 2001 From: Angel Perez Date: Thu, 11 Apr 2019 14:26:00 -0400 Subject: [PATCH 4/4] Add feature specs --- backend/spec/features/admin/users_spec.rb | 89 +++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/backend/spec/features/admin/users_spec.rb b/backend/spec/features/admin/users_spec.rb index 7d9bafddb32..d0795ff1908 100644 --- a/backend/spec/features/admin/users_spec.rb +++ b/backend/spec/features/admin/users_spec.rb @@ -354,6 +354,95 @@ def always_invalid_email end end + context 'searching orders', js: true do + before do + allow_any_instance_of(Spree::OrderInventory).to receive(:add_to_shipment) + visit spree.orders_admin_user_path(user_b) + end + + let!(:old_order) { create(:completed_order_with_totals, user: user_b) } + let!(:new_order) { create(:completed_order_with_totals, user: user_b) } + + context 'by dates' do + before do + old_order.created_at = 1.year.ago + old_order.completed_at = 1.year.ago + old_order.save! + end + + it 'filters orders based in the selected date range' do + fill_in 'q_created_at_gt', with: 1.week.ago + # No need to fill out the `q_created_at_lt` field + # as it automatically defaults to the current date + # + # Take into consideration that, given that JS elements + # do not dismiss automatically under test environments, + # it is complicated to fill out said field without blocking + # the "Filter Results" button or without relying on manually + # handling the DOM, something which is not recommended since + # it may cause fragile and/or flaky specs + click_button 'Filter Results' + + within_table 'listing_orders' do + expect(page).to have_content(new_order.number) + expect(page).not_to have_content(old_order.number) + end + end + end + + context 'by status' do + let!(:not_completed) { create(:order_ready_to_complete, user: user_b) } + + it 'filters orders based on their status' do + uncheck 'q_completed_at_not_null' + select 'Confirm', from: 'q_state_eq' + click_button 'Filter Results' + + within_table 'listing_orders' do + expect(page).to have_content(not_completed.number) + expect(page).not_to have_content(old_order.number) + expect(page).not_to have_content(new_order.number) + end + end + end + + context 'by order number' do + it 'filters orders based on their order number' do + fill_in 'q_number_start', with: new_order.number + click_button 'Filter Results' + + within_table 'listing_orders' do + expect(page).to have_content(new_order.number) + expect(page).not_to have_content(old_order.number) + end + end + end + + context 'by store' do + let!(:us_store) { create(:store, name: 'US Store') } + let!(:eu_store) { create(:store, name: 'EU Store') } + + before do + new_order.update_attributes!(number: "R-#{us_store.id}-6320", store: us_store) + old_order.update_attributes!(number: "R-#{eu_store.id}-3477", store: eu_store) + + # For some reason, the dropdown list for stores is not available when the page + # first load, hence a reload is necessary in here + visit current_path + end + + it 'filters orders based on the store they were created' do + select eu_store.name, from: 'q_store_id_eq' + click_button 'Filter Results' + + within_table 'listing_orders' do + expect(page).to have_content(old_order.number) + expect(page).not_to have_content(new_order.number) + end + end + end + end + context 'items purchased with sorting' do before do orders