From 8a124fb6be0bf60ef602fe33d37e708f99aba440 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Bellet Date: Mon, 3 Apr 2023 16:36:25 +0200 Subject: [PATCH 1/5] BOM: once variant has been selected, refresh data with a new search - Remove variant_filter - instantiate a new search to avoid pagination issues --- .../line_items/controllers/line_items_controller.js.coffee | 6 ++++++ .../admin/line_items/filters/variant_filter.js.coffee | 6 ------ app/views/spree/admin/orders/bulk_management.html.haml | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) delete mode 100644 app/assets/javascripts/admin/line_items/filters/variant_filter.js.coffee diff --git a/app/assets/javascripts/admin/line_items/controllers/line_items_controller.js.coffee b/app/assets/javascripts/admin/line_items/controllers/line_items_controller.js.coffee index 51df3bb2e7..50a45ae3d7 100644 --- a/app/assets/javascripts/admin/line_items/controllers/line_items_controller.js.coffee +++ b/app/assets/javascripts/admin/line_items/controllers/line_items_controller.js.coffee @@ -17,6 +17,7 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout, ] $scope.page = 1 $scope.per_page = $scope.per_page_options[0].id + $scope.filterByVariantId = null searchThrough = ["order_distributor_name", "order_bill_address_phone", "order_bill_address_firstname", @@ -36,6 +37,7 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout, $scope.query = '' $scope.startDate = undefined $scope.endDate = undefined + $scope.filterByVariantId = null event = new CustomEvent('flatpickr:clear') window.dispatchEvent(event) @@ -68,6 +70,7 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout, RequestMonitor.load LineItems.index( "q[#{searchThrough}]": $scope.query, + "q[variant_id_eq]": $scope.filterByVariantId if $scope.filterByVariantId, "q[order_state_not_eq]": "canceled", "q[order_shipment_state_not_eq]": "shipped", "q[order_completed_at_not_null]": "true", @@ -176,6 +179,9 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout, $scope.setSelectedUnitsVariant = (unitsProduct,unitsVariant) -> $scope.selectedUnitsProduct = unitsProduct $scope.selectedUnitsVariant = unitsVariant + $scope.filterByVariantId = unitsVariant.id + $scope.page = 1 + $scope.refreshData() $scope.getLineItemScale = (lineItem) -> if lineItem.units_product && lineItem.units_variant && (lineItem.units_product.variant_unit == "weight" || lineItem.units_product.variant_unit == "volume") diff --git a/app/assets/javascripts/admin/line_items/filters/variant_filter.js.coffee b/app/assets/javascripts/admin/line_items/filters/variant_filter.js.coffee deleted file mode 100644 index 8ddcf667e7..0000000000 --- a/app/assets/javascripts/admin/line_items/filters/variant_filter.js.coffee +++ /dev/null @@ -1,6 +0,0 @@ -angular.module("admin.lineItems").filter "variantFilter", -> - return (lineItems,selectedUnitsProduct,selectedUnitsVariant,sharedResource) -> - filtered = [] - filtered.push lineItem for lineItem in lineItems when (angular.equals(selectedUnitsProduct,{}) || - (lineItem.units_product.id == selectedUnitsProduct.id && (sharedResource || lineItem.units_variant.id == selectedUnitsVariant.id ) ) ) - filtered diff --git a/app/views/spree/admin/orders/bulk_management.html.haml b/app/views/spree/admin/orders/bulk_management.html.haml index 3ca93cfc81..e722459903 100644 --- a/app/views/spree/admin/orders/bulk_management.html.haml +++ b/app/views/spree/admin/orders/bulk_management.html.haml @@ -166,7 +166,7 @@ = "#{t('admin.price')} (#{Spree::Money.currency_symbol})" %th.actions - %tr.line_item{ ng: { repeat: "line_item in filteredLineItems = ( line_items | variantFilter:selectedUnitsProduct:selectedUnitsVariant:sharedResource | orderBy:sorting.predicate:sorting.reverse )", 'class-even' => "'even'", 'class-odd' => "'odd'", attr: { id: "li_{{line_item.id}}" } } } + %tr.line_item{ ng: { repeat: "line_item in filteredLineItems = ( line_items | orderBy:sorting.predicate:sorting.reverse )", 'class-even' => "'even'", 'class-odd' => "'odd'", attr: { id: "li_{{line_item.id}}" } } } %td.bulk %input{ :type => "checkbox", :name => 'bulk', 'ng-model' => 'line_item.checked', 'ignore-dirty' => true } %td.order_no{ 'ng-show' => 'columns.order_no.visible' } {{ line_item.order.number }} From df5c21048a728c3fb61902ff1d3e7983bab5c792 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Bellet Date: Tue, 4 Apr 2023 14:27:36 +0200 Subject: [PATCH 2/5] Clear on bulk submenu should reset some filters + refresh data as well --- .../controllers/line_items_controller.js.coffee | 8 ++++++++ app/views/spree/admin/orders/bulk_management.html.haml | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/admin/line_items/controllers/line_items_controller.js.coffee b/app/assets/javascripts/admin/line_items/controllers/line_items_controller.js.coffee index 50a45ae3d7..8ae1a76896 100644 --- a/app/assets/javascripts/admin/line_items/controllers/line_items_controller.js.coffee +++ b/app/assets/javascripts/admin/line_items/controllers/line_items_controller.js.coffee @@ -183,6 +183,14 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout, $scope.page = 1 $scope.refreshData() + $scope.resetSelectedUnitsVariant = -> + $scope.selectedUnitsProduct = { } + $scope.selectedUnitsVariant = { } + $scope.filterByVariantId = null + $scope.sharedResource = false + $scope.page = 1 + $scope.refreshData() + $scope.getLineItemScale = (lineItem) -> if lineItem.units_product && lineItem.units_variant && (lineItem.units_product.variant_unit == "weight" || lineItem.units_product.variant_unit == "volume") lineItem.units_product.variant_unit_scale diff --git a/app/views/spree/admin/orders/bulk_management.html.haml b/app/views/spree/admin/orders/bulk_management.html.haml index e722459903..447737cf5a 100644 --- a/app/views/spree/admin/orders/bulk_management.html.haml +++ b/app/views/spree/admin/orders/bulk_management.html.haml @@ -70,7 +70,7 @@ %h6.text-center{ 'ng-hide' => 'sharedResource' } {{ selectedUnitsVariant.full_name }} .three.columns %h6.text-right - %a{ :href => '#', 'ng-click' => 'selectedUnitsVariant = {};selectedUnitsProduct = {};sharedResource=false;' }= t('admin.clear') + %a{ :href => '#', 'ng-click' => 'resetSelectedUnitsVariant()' }= t('admin.clear') %hr .row .one.columns.alpha From 26947a64c0e75920e7dfcb44f8a720effa71750d Mon Sep 17 00:00:00 2001 From: filipefurtad0 Date: Tue, 4 Apr 2023 23:11:00 +0100 Subject: [PATCH 3/5] Adds test to check pagination upon line-item selection --- .../admin/bulk_order_management_spec.rb | 36 +++++++++++++++++-- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/spec/system/admin/bulk_order_management_spec.rb b/spec/system/admin/bulk_order_management_spec.rb index b7a5ef3a6e..e3573df5ee 100644 --- a/spec/system/admin/bulk_order_management_spec.rb +++ b/spec/system/admin/bulk_order_management_spec.rb @@ -85,13 +85,29 @@ describe ' create(:order_with_distributor, state: 'complete', shipment_state: 'ready', completed_at: Time.zone.now ) } + let!(:o3) { + create(:order_with_distributor, state: 'complete', shipment_state: 'ready', + completed_at: Time.zone.now ) + } + let!(:product) { + create(:simple_product) + } + let!(:var1) { + create(:variant, product_id: product.id, display_name: "Little Fish") + } + let!(:var2) { + create(:variant, product_id: product.id, display_name: "Big Fish") + } before do - 15.times { - create(:line_item_with_shipment, order: o1) + 10.times { + create(:line_item_with_shipment, variant: var1, order: o2) } 5.times { - create(:line_item_with_shipment, order: o2) + create(:line_item_with_shipment, variant: var2, order: o1) + } + 5.times { + create(:line_item_with_shipment, variant: var1, order: o3) } end @@ -125,6 +141,20 @@ describe ' select2_select "100 per page", from: "autogen4" # should display all 20 line items expect(page).to have_content "20 Results found. Viewing 1 to 20." end + + it "clicking the product variant" do + visit_bulk_order_management + expect(page).to have_content "Little Fish", count: 10 + expect(page).to have_content "Big Fish", count: 5 + click_on("Little Fish") # opens BOM box + within "#listing_orders" do + expect(page).to have_content "Little Fish", count: 15 + expect(page).not_to have_content "Big Fish" + end + find("a", text: "Clear").click # closes BOM box + expect(page).to have_content "Little Fish", count: 10 + expect(page).to have_content "Big Fish", count: 5 + end end context "searching" do From c0203e70917d75dd22fb8946f3447f3dc8112741 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Bellet Date: Mon, 17 Apr 2023 11:06:23 +0200 Subject: [PATCH 4/5] Refactor by putting two specs into a shared_example "It's a Surprise Tool That Will Help Us Later" --- .../admin/bulk_order_management_spec.rb | 50 ++++++++++--------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/spec/system/admin/bulk_order_management_spec.rb b/spec/system/admin/bulk_order_management_spec.rb index e3573df5ee..feca312f37 100644 --- a/spec/system/admin/bulk_order_management_spec.rb +++ b/spec/system/admin/bulk_order_management_spec.rb @@ -1054,34 +1054,38 @@ describe ' end end - it "displays group buy calc box" do - expect(page).to have_selector "div#group_buy_calculation" + shared_examples "display only group by information for selected variant" do + it "displays group buy calc box" do + expect(page).to have_selector "div#group_buy_calculation" - within "div#group_buy_calculation" do - expect(page).to have_text "Group Buy Unit Size" - expect(page).to have_text "5000 g" - expect(page).to have_text "Total Quantity Ordered" - expect(page).to have_text "4000 g" - expect(page).to have_text "Max Quantity Ordered" - expect(page).to have_text "9000 g" - expect(page).to have_text "Current Fulfilled Units" - expect(page).to have_text "0.8" - expect(page).to have_text "Max Fulfilled Units" - expect(page).to have_text "1.8" - expect(page).to have_selector "div.shared_resource" - within "div.shared_resource" do - expect(page).to have_selector "span", text: "Shared Resource?" - expect(page).to have_selector "input#shared_resource" + within "div#group_buy_calculation" do + expect(page).to have_text "Group Buy Unit Size" + expect(page).to have_text "5000 g" + expect(page).to have_text "Total Quantity Ordered" + expect(page).to have_text "4000 g" + expect(page).to have_text "Max Quantity Ordered" + expect(page).to have_text "9000 g" + expect(page).to have_text "Current Fulfilled Units" + expect(page).to have_text "0.8" + expect(page).to have_text "Max Fulfilled Units" + expect(page).to have_text "1.8" + expect(page).to have_selector "div.shared_resource" + within "div.shared_resource" do + expect(page).to have_selector "span", text: "Shared Resource?" + expect(page).to have_selector "input#shared_resource" + end end end + + it "all line items of the same variant" do + expect(page).to have_no_selector "tr#li_#{li1.id}" + expect(page).to have_no_selector "tr#li_#{li2.id}" + expect(page).to have_selector "tr#li_#{li3.id}" + expect(page).to have_selector "tr#li_#{li4.id}" + end end - it "all line items of the same variant" do - expect(page).to have_no_selector "tr#li_#{li1.id}" - expect(page).to have_no_selector "tr#li_#{li2.id}" - expect(page).to have_selector "tr#li_#{li3.id}" - expect(page).to have_selector "tr#li_#{li4.id}" - end + it_behaves_like "display only group by information for selected variant" context "clicking 'Clear' in group buy box" do before :each do From 11a7aa9f968be81926c6081ca91c1ac4cb7f63b2 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Bellet Date: Mon, 17 Apr 2023 11:08:17 +0200 Subject: [PATCH 5/5] When clicking on "Clear Filters" button, to not reset variant selection + add some specs to cover that particular case --- .../line_items_controller.js.coffee | 1 - .../admin/bulk_order_management_spec.rb | 27 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/admin/line_items/controllers/line_items_controller.js.coffee b/app/assets/javascripts/admin/line_items/controllers/line_items_controller.js.coffee index 8ae1a76896..e62f96467e 100644 --- a/app/assets/javascripts/admin/line_items/controllers/line_items_controller.js.coffee +++ b/app/assets/javascripts/admin/line_items/controllers/line_items_controller.js.coffee @@ -37,7 +37,6 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout, $scope.query = '' $scope.startDate = undefined $scope.endDate = undefined - $scope.filterByVariantId = null event = new CustomEvent('flatpickr:clear') window.dispatchEvent(event) diff --git a/spec/system/admin/bulk_order_management_spec.rb b/spec/system/admin/bulk_order_management_spec.rb index feca312f37..4284121fc7 100644 --- a/spec/system/admin/bulk_order_management_spec.rb +++ b/spec/system/admin/bulk_order_management_spec.rb @@ -1082,6 +1082,7 @@ describe ' expect(page).to have_no_selector "tr#li_#{li2.id}" expect(page).to have_selector "tr#li_#{li3.id}" expect(page).to have_selector "tr#li_#{li4.id}" + expect(page).to have_css("table#listing_orders tbody tr", count: 2) end end @@ -1098,6 +1099,32 @@ describe ' expect(page).to have_selector "tr#li_#{li2.id}" expect(page).to have_selector "tr#li_#{li3.id}" expect(page).to have_selector "tr#li_#{li4.id}" + end + end + + context "when filtering" do + before do + fill_in "quick_filter", with: li3.order.email + page.find('.filter-actions .button.icon-search').click + end + + it "shows only variant filtering by email" do + expect(page).to have_no_selector "tr#li_#{li1.id}" + expect(page).to have_no_selector "tr#li_#{li2.id}" + expect(page).to have_selector "tr#li_#{li3.id}" + expect(page).to have_no_selector "tr#li_#{li4.id}" + end + + context "clicking 'Clear Filters' button" do + before :each do + page.find('.filter-actions #clear_filters_button').click + end + + it_behaves_like "display only group by information for selected variant" + + it "but actually clears the filters" do + expect(page.find("input[name='quick_filter']").value).to eq("") + end end end end