From bc0945041897b00c0408baeab8da35baa6197a0a Mon Sep 17 00:00:00 2001 From: Sylvain Date: Mon, 26 Sep 2022 15:45:52 +0200 Subject: [PATCH] (bug) product store filtering - Do not reset the category when reseting the filters - Prevent filtering by internal stock when user is not privileged --- app/controllers/api/products_controller.rb | 2 +- app/frontend/src/javascript/components/store/store.tsx | 7 +++++-- app/services/product_service.rb | 8 +++++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/app/controllers/api/products_controller.rb b/app/controllers/api/products_controller.rb index 8068c6f82..e4acbcbb9 100644 --- a/app/controllers/api/products_controller.rb +++ b/app/controllers/api/products_controller.rb @@ -9,7 +9,7 @@ class API::ProductsController < API::ApiController MOVEMENTS_PER_PAGE = 10 def index - @products = ProductService.list(params) + @products = ProductService.list(params, current_user) end def show diff --git a/app/frontend/src/javascript/components/store/store.tsx b/app/frontend/src/javascript/components/store/store.tsx index cb1912b22..b969bc464 100644 --- a/app/frontend/src/javascript/components/store/store.tsx +++ b/app/frontend/src/javascript/components/store/store.tsx @@ -89,8 +89,8 @@ const Store: React.FC = ({ onError, onSuccess, currentUser, uiRouter }, []); useEffect(() => { - fetchProducts().then(scrollToProducts); if (resources.filters.ready) { + fetchProducts().then(scrollToProducts); uiRouter.stateService.transitionTo(uiRouter.globals.current, ProductLib.indexFiltersToRouterParams(resources.filters.data)); } }, [resources.filters]); @@ -188,7 +188,10 @@ const Store: React.FC = ({ onError, onSuccess, currentUser, uiRouter ...draft, filters: { ...draft.filters, - data: initFilters + data: { + ...initFilters, + categories: draft.filters.data.categories + } } }; }); diff --git a/app/services/product_service.rb b/app/services/product_service.rb index 645eb148a..52de843d6 100644 --- a/app/services/product_service.rb +++ b/app/services/product_service.rb @@ -5,13 +5,13 @@ class ProductService class << self PRODUCTS_PER_PAGE = 12 - def list(filters) + def list(filters, operator) products = Product.includes(:product_images) products = filter_by_active(products, filters) products = filter_by_categories(products, filters) products = filter_by_machines(products, filters) products = filter_by_keyword_or_reference(products, filters) - products = filter_by_stock(products, filters) + products = filter_by_stock(products, filters, operator) products = products_ordering(products, filters) total_count = products.count @@ -110,7 +110,9 @@ class ProductService { sku: filters[:keywords], query: "%#{filters[:keywords]}%" }) end - def filter_by_stock(products, filters) + def filter_by_stock(products, filters, operator) + filters[:stock_type] = 'external' unless operator.privileged? + products.where("(stock ->> '#{filters[:stock_type]}')::int >= #{filters[:stock_from]}") if filters[:stock_from].to_i.positive? products.where("(stock ->> '#{filters[:stock_type]}')::int <= #{filters[:stock_to]}") if filters[:stock_to].to_i.positive?