From 71466e643f7d9e1e83c32c2ee12a7a347dd10fca Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Bellet Date: Fri, 23 Apr 2021 20:42:54 +0200 Subject: [PATCH 1/6] Instanciate only one `ProductsCtrl` - instead of 2: therefore, for each shop display, we only request products one time instead of two times. --- app/views/shop/messages/_select_oc.html.haml | 2 +- app/views/shop/products/_form.html.haml | 2 +- app/views/shopping_shared/tabs/_shop.html.haml | 13 +++++++------ 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/app/views/shop/messages/_select_oc.html.haml b/app/views/shop/messages/_select_oc.html.haml index 2f44ed827f..6256789d32 100644 --- a/app/views/shop/messages/_select_oc.html.haml +++ b/app/views/shop/messages/_select_oc.html.haml @@ -1,4 +1,4 @@ -.content.footer-pad{ "darker-background" => true, "ng-controller" => "ProductsCtrl", "ng-show" => "order_cycle.order_cycle_id == null" } +.content.footer-pad{ "darker-background" => true, "ng-show" => "order_cycle.order_cycle_id == null" } .row .small-12.columns .select-oc-message diff --git a/app/views/shop/products/_form.html.haml b/app/views/shop/products/_form.html.haml index 3fbdb1c43f..a4000aa6ce 100644 --- a/app/views/shop/products/_form.html.haml +++ b/app/views/shop/products/_form.html.haml @@ -1,5 +1,5 @@ %form{action: main_app.cart_path} - %products{"ng-controller" => "ProductsCtrl", "ng-init" => "refreshStaleData()", "ng-show" => "order_cycle.order_cycle_id != null", "ng-cloak" => true } + %products{"ng-init" => "refreshStaleData()", "ng-show" => "order_cycle.order_cycle_id != null", "ng-cloak" => true } = render partial: "shop/products/searchbar" diff --git a/app/views/shopping_shared/tabs/_shop.html.haml b/app/views/shopping_shared/tabs/_shop.html.haml index 0a8df040f5..f8a2747c94 100644 --- a/app/views/shopping_shared/tabs/_shop.html.haml +++ b/app/views/shopping_shared/tabs/_shop.html.haml @@ -2,10 +2,11 @@ .order-cycle-bar.hide-for-large-up = render partial: "shopping_shared/order_cycles" - - if no_open_order_cycles? - = render partial: "shop/messages/closed_shop" - - else - = render partial: "shop/messages/select_oc" + %div{"ng-controller" => "ProductsCtrl"} + - if no_open_order_cycles? + = render partial: "shop/messages/closed_shop" + - else + = render partial: "shop/messages/select_oc" - -# Rendering the form, even if there are no open OCs, makes display only shops possible - = render partial: "shop/products/form" + -# Rendering the form, even if there are no open OCs, makes display only shops possible + = render partial: "shop/products/form" From 523b957ba7f7400497ca3bfb088762b009d81c10 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Bellet Date: Fri, 23 Apr 2021 20:44:35 +0200 Subject: [PATCH 2/6] Initialize activeTaxons and activeProperties - so there is no unwanted changes (from `undefined` to `[]`) that would trigger a loadProducts request --- .../darkswarm/controllers/products_controller.js.coffee | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/assets/javascripts/darkswarm/controllers/products_controller.js.coffee b/app/assets/javascripts/darkswarm/controllers/products_controller.js.coffee index 34c8941836..a2d6b63631 100644 --- a/app/assets/javascripts/darkswarm/controllers/products_controller.js.coffee +++ b/app/assets/javascripts/darkswarm/controllers/products_controller.js.coffee @@ -11,6 +11,8 @@ Darkswarm.controller "ProductsCtrl", ($scope, $sce, $filter, $rootScope, Product $scope.supplied_taxons = null $scope.supplied_properties = null $scope.showFilterSidebar = false + $scope.activeTaxons = [] + $scope.activeProperties = [] # Update filters after initial load of shop tab $timeout => From cdbcbf421479666dc3c545bd1f8e7d379feddee1 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Bellet Date: Fri, 23 Apr 2021 20:45:00 +0200 Subject: [PATCH 3/6] Reinitialize `page` params when changing order cycle --- .../darkswarm/controllers/products_controller.js.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/javascripts/darkswarm/controllers/products_controller.js.coffee b/app/assets/javascripts/darkswarm/controllers/products_controller.js.coffee index a2d6b63631..fec1974e34 100644 --- a/app/assets/javascripts/darkswarm/controllers/products_controller.js.coffee +++ b/app/assets/javascripts/darkswarm/controllers/products_controller.js.coffee @@ -22,6 +22,7 @@ Darkswarm.controller "ProductsCtrl", ($scope, $sce, $filter, $rootScope, Product $rootScope.$on "orderCycleSelected", -> $scope.update_filters() $scope.clearAll() + $scope.page = 1 $scope.update_filters = -> order_cycle_id = OrderCycle.order_cycle.order_cycle_id From 07881ede2d7a789c8552cbec527db4c7d7fe194b Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Bellet Date: Mon, 26 Apr 2021 16:41:39 +0200 Subject: [PATCH 4/6] Do not trigger loadMore method immediatly - This avoid to request unwanted resources, ie. the next 10 products of a shop --- app/views/shop/products/_form.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/shop/products/_form.html.haml b/app/views/shop/products/_form.html.haml index a4000aa6ce..cb60087bf5 100644 --- a/app/views/shop/products/_form.html.haml +++ b/app/views/shop/products/_form.html.haml @@ -9,7 +9,7 @@ .medium-12.large-9.columns.full = render partial: "shop/products/search_feedback" - %div.pad-top{ "infinite-scroll" => "loadMore()", "infinite-scroll-distance" => "1", "infinite-scroll-disabled" => 'Products.loading' } + %div.pad-top{ "infinite-scroll" => "loadMore()", "infinite-scroll-distance" => "1", "infinite-scroll-disabled" => 'Products.loading', "infinite-scroll-immediate-check": "false" } %product.animate-repeat{"ng-controller" => "ProductNodeCtrl", "ng-repeat" => "product in Products.products track by product.id", "id" => "product-{{ product.id }}"} = render "shop/products/summary" .shop-variants From 5085501f8975b44a9c14b483544e23ca61eb010b Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Bellet Date: Tue, 27 Apr 2021 11:24:22 +0200 Subject: [PATCH 5/6] Add automated tests around pagination in product list for a shop - with two order cycles and go from one to the other --- .../consumer/shopping/shopping_spec.rb | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/spec/features/consumer/shopping/shopping_spec.rb b/spec/features/consumer/shopping/shopping_spec.rb index 3be9aa346e..c0ec640554 100644 --- a/spec/features/consumer/shopping/shopping_spec.rb +++ b/spec/features/consumer/shopping/shopping_spec.rb @@ -159,6 +159,31 @@ feature "As a consumer I want to shop with a distributor", js: true do end end end + + describe "two order cycles and more than 20 products for each" do + before do + 20.times do + product = create(:simple_product, supplier: supplier) + add_variant_to_order_cycle(exchange1, product.variants.first) + add_variant_to_order_cycle(exchange2, product.variants.first) + end + end + + it "show the whole products list for each OC" do + visit shop_path + select "turtles", from: "order_cycle_id" + select "frogs", from: "order_cycle_id" + expect(page).to have_selector("product", count: 10) + scroll_to(page.find(".product-listing"), align: :bottom) + expect(page).to have_selector("product", count: 20) + + scroll_to(page.find("distributor")) + select "turtles", from: "order_cycle_id" + expect(page).to have_selector("product", count: 10) + scroll_to(page.find(".product-listing"), align: :bottom) + expect(page).to have_selector("product", count: 20) + end + end end end From 5a3771fc4242bcedf623f28f5d0ef6c0f35f9048 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Bellet Date: Thu, 29 Apr 2021 15:31:24 +0200 Subject: [PATCH 6/6] Add special config to avoid a inconsistant LoadError Error is ``` Failure/Error: @app.call(env) LoadError: Unable to autoload constant Api::V0::OrderCyclesController, expected /Users/jibees/dev/openfoodnetwork/app/controllers/api/v0/order_cycles_controller.rb to define it ``` --- spec/features/consumer/shopping/shopping_spec.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/spec/features/consumer/shopping/shopping_spec.rb b/spec/features/consumer/shopping/shopping_spec.rb index c0ec640554..590afc8202 100644 --- a/spec/features/consumer/shopping/shopping_spec.rb +++ b/spec/features/consumer/shopping/shopping_spec.rb @@ -161,6 +161,12 @@ feature "As a consumer I want to shop with a distributor", js: true do end describe "two order cycles and more than 20 products for each" do + around do |example| + Capybara.raise_server_errors = false + example.run + Capybara.raise_server_errors = true + end + before do 20.times do product = create(:simple_product, supplier: supplier)