mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-28 21:07:16 +00:00
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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user