diff --git a/app/components/products_table_component.rb b/app/components/products_table_component.rb index 5c0a95f81f..d01101cd88 100644 --- a/app/components/products_table_component.rb +++ b/app/components/products_table_component.rb @@ -1,16 +1,29 @@ # frozen_string_literal: true class ProductsTableComponent < ViewComponentReflex::Component + include Pagy::Backend + def initialize(user:) super + @user = user @columns = [{ label: I18n.t("admin.products_page.columns_selector.price"), value: "price" }, { label: I18n.t("admin.products_page.columns_selector.unit"), value: "unit" }] @columns_selected = ["price", "unit"] @per_page = [{ label: "10", value: 10 }, { label: "25", value: 25 }, { label: "50", value: 50 }, { label: "100", value: 100 }] @per_page_selected = [10] - @user = user + @categories = [{ label: "All", value: "all" }] + + Spree::Taxon.order(:name) + .map { |taxon| { label: taxon.name, value: taxon.id.to_s } } + @categories_selected = ["all"] + @producers = [{ label: "All", value: "all" }] + + OpenFoodNetwork::Permissions.new(@user) + .managed_product_enterprises.is_primary_producer.by_name + .map { |producer| { label: producer.name, value: producer.id.to_s } } + @producers_selected = ["all"] + end + def before_render fetch_products end @@ -29,9 +42,74 @@ class ProductsTableComponent < ViewComponentReflex::Component fetch_products end + def toggle_category + category_clicked = element.dataset['value'] + @categories_selected = toggle_super_selector(category_clicked, @categories_selected) + + fetch_products + end + + def toggle_producer + producer_clicked = element.dataset['value'] + @producers_selected = toggle_super_selector(producer_clicked, @producers_selected) + + fetch_products + end + private + def toggle_super_selector(clicked, selected) + selected = if selected.include?(clicked) + selected - [clicked] + else + selected + [clicked] + end + + if clicked == "all" || selected.empty? + selected = ["all"] + elsif selected.include?("all") && selected.length > 1 + selected -= ["all"] + end + selected + end + def fetch_products - @products = Spree::Product.managed_by(@user).order('name asc').limit(@per_page_selected.first) + product_query = OpenFoodNetwork::Permissions.new(@user).editable_products.merge(product_scope) + @products = product_query.ransack(ransack_query).result + @pagy, @products = pagy(@products, items: @per_page_selected.first) + end + + def product_scope + scope = if @user.has_spree_role?("admin") || @user.enterprises.present? + Spree::Product + else + Spree::Product.active + end + + scope.includes(product_query_includes) + end + + def ransack_query + query = { s: 'created_at desc' } + + query = if @producers_selected.include?("all") + query.merge({ supplier_id_eq: "" }) + else + query.merge({ supplier_id_in: @producers_selected }) + end + + if @categories_selected.include?("all") + query.merge({ primary_taxon_id_eq: "" }) + else + query.merge({ primary_taxon_id_in: @categories_selected }) + end + end + + def product_query_includes + [ + master: [:images], + variants: [:default_price, :stock_locations, :stock_items, :variant_overrides, + { option_values: :option_type }] + ] end end diff --git a/app/components/products_table_component/products_table_component.html.haml b/app/components/products_table_component/products_table_component.html.haml index 3a0d5724bf..a39e28bf6d 100644 --- a/app/components/products_table_component/products_table_component.html.haml +++ b/app/components/products_table_component/products_table_component.html.haml @@ -5,6 +5,10 @@ %button.btn.btn-primary{type: 'submit'} Filter results + #categories_selector + = render(SuperSelectorComponent.new(title: "Categories", selected: @categories_selected, items: @categories, data: { key: key, reflex: "click->ProductsTableComponent#toggle_category" })) + #producers_selector + = render(SuperSelectorComponent.new(title: "Producers", selected: @producers_selected, items: @producers, data: { key: key, reflex: "click->ProductsTableComponent#toggle_producer" })) #per-page_selector = render(SelectorComponent.new(title: "# per page", selected: @per_page_selected, items: @per_page, data: { key: key, reflex: "click->ProductsTableComponent#toggle_per_page" })) #columns_selector