Include search by category and producer

+ use ransack (not sur this one is relevant)
 + fetch_products in the `before_render` lifecycle method
This commit is contained in:
Jean-Baptiste Bellet
2022-03-23 10:06:36 +01:00
parent 224daf2591
commit 8adcdf14a7
2 changed files with 84 additions and 2 deletions

View File

@@ -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

View File

@@ -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