From f58cf2d3b2126e2d12c6978d619cfdde211e42db Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Bellet Date: Mon, 3 Jul 2023 12:31:36 +0200 Subject: [PATCH] Can filter by producer Not sur the request nor the `producers` in the reflex should be like this. This is a proof of concept, and should probably be reviewed Fix linter issues --- app/reflexes/products_reflex.rb | 17 +++++++++++-- .../admin/products_v3/_content.html.haml | 2 +- .../admin/products_v3/_filters.html.haml | 2 ++ app/webpacker/css/admin/products_v3.scss | 1 + config/locales/en.yml | 1 + .../system/admin/products_v3/products_spec.rb | 24 ++++++++++++++++++- 6 files changed, 43 insertions(+), 4 deletions(-) diff --git a/app/reflexes/products_reflex.rb b/app/reflexes/products_reflex.rb index 378380ba4c..0ab4035927 100644 --- a/app/reflexes/products_reflex.rb +++ b/app/reflexes/products_reflex.rb @@ -24,6 +24,7 @@ class ProductsReflex < ApplicationReflex @per_page = params[:per_page] @page = 1 @search_term = params[:search_term] + @producer_id = params[:producer_id] fetch_products render_products @@ -35,7 +36,8 @@ class ProductsReflex < ApplicationReflex cable_ready.replace( selector: "#products-content", html: render(partial: "admin/products_v3/content", - locals: { products: @products, pagy: @pagy, search_term: @search_term }) + locals: { products: @products, pagy: @pagy, search_term: @search_term, + producer_options: producers, producer_id: @producer_id }) ).broadcast cable_ready.replace_state( @@ -45,6 +47,15 @@ class ProductsReflex < ApplicationReflex morph :nothing end + def producers + producers = if current_user.has_spree_role?("admin") + Enterprise.all + else + current_user.enterprises + end + producers.map { |p| [p.name, p.id] } + end + # copied from ProductsTableComponent def fetch_products product_query = OpenFoodNetwork::Permissions.new(current_user) @@ -64,7 +75,9 @@ class ProductsReflex < ApplicationReflex def ransack_query query = { s: "name desc" } - query.merge({ name_cont: @search_term }) if @search_term.present? + query = query.merge({ supplier_id_in: @producer_id }) if @producer_id.present? + query = query.merge({ name_cont: @search_term }) if @search_term.present? + query end # Optimise by pre-loading required columns diff --git a/app/views/admin/products_v3/_content.html.haml b/app/views/admin/products_v3/_content.html.haml index 157426e009..e7e6e9ee3a 100644 --- a/app/views/admin/products_v3/_content.html.haml +++ b/app/views/admin/products_v3/_content.html.haml @@ -2,7 +2,7 @@ - if products.any? .container .sixteen.columns - = render partial: 'filters', locals: { search_term: search_term } + = render partial: 'filters', locals: { search_term: search_term, producer_id: producer_id, producer_options: producer_options } .container .sixteen.columns = render partial: 'sort', locals: { pagy: pagy } diff --git a/app/views/admin/products_v3/_filters.html.haml b/app/views/admin/products_v3/_filters.html.haml index f7fe523942..26a1d9e3c6 100644 --- a/app/views/admin/products_v3/_filters.html.haml +++ b/app/views/admin/products_v3/_filters.html.haml @@ -2,6 +2,8 @@ .query .search-input = text_field_tag :search_term, search_term, placeholder: t('.search_products') + .producers + = select_tag :producer_id, options_for_select(producer_options, producer_id), include_blank: t('.all_producers') .submit .search-button = submit_tag t(".search"), class: "secondary" diff --git a/app/webpacker/css/admin/products_v3.scss b/app/webpacker/css/admin/products_v3.scss index 2a3d397926..fda1510109 100644 --- a/app/webpacker/css/admin/products_v3.scss +++ b/app/webpacker/css/admin/products_v3.scss @@ -99,6 +99,7 @@ } #filters { + gap: 20px; .query { flex-grow: 2; .search-input { diff --git a/config/locales/en.yml b/config/locales/en.yml index 416202c4b1..bca84fb4b2 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -775,6 +775,7 @@ en: per_page: "%{num} per page" filters: search_products: Search for products + all_producers: All producers search: Search content: no_products_found: No products found diff --git a/spec/system/admin/products_v3/products_spec.rb b/spec/system/admin/products_v3/products_spec.rb index 0cea950004..fe809fe6ed 100644 --- a/spec/system/admin/products_v3/products_spec.rb +++ b/spec/system/admin/products_v3/products_spec.rb @@ -11,6 +11,12 @@ describe 'As an admin, I can see the new product page' do let!(:products) { create_list(:simple_product, 70) } # create a product with a name that can be searched let!(:product_by_name) { create(:simple_product, name: "searchable product") } + # create a product with a supplier that can be searched + let!(:product_by_supplier) { + create(:simple_product, + supplier: create(:enterprise, name: "Producer 1")) + } + before do # activate feature toggle admin_style_v3 to use new admin interface Flipper.enable(:admin_style_v3) @@ -80,6 +86,17 @@ describe 'As an admin, I can see the new product page' do end end + context "search by producer" do + it "has a producer select" do + expect(page).to have_selector "select#producer_id" + end + + it "can search for a product" do + search_by_producer "Producer 1" + + expect(page).to have_select "producer_id", selected: "Producer 1" + expect_page_to_be 1 + expect_products_count_to_be 1 end end end @@ -94,11 +111,16 @@ describe 'As an admin, I can see the new product page' do end def expect_products_count_to_be(count) - expect(page).to have_selector "table.products tbody", count: count + expect(page).to have_selector("table.products tbody", count:) end def search_for(term) fill_in "search_term", with: term click_button "Search" end + + def search_by_producer(producer) + select producer, from: "producer_id" + click_button "Search" + end end