mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-04-05 07:19:14 +00:00
Display filter by variant tag rule
We only support one of filter by inventory variants or filter by variants at any given time, based on enabled feature. If both features inventory and variant tag are enabled, variant tag takes precedence.
This commit is contained in:
@@ -47,6 +47,13 @@ class TagRuleFormComponent < ViewComponent::Base
|
||||
taggable: "variant",
|
||||
visibility_field: "preferred_matched_variants_visibility",
|
||||
}
|
||||
when "TagRule::FilterVariants"
|
||||
{
|
||||
text_top: t('components.tag_rule_form.tag_rules.variant_tagged_top'),
|
||||
text_bottom: t('components.tag_rule_form.tag_rules.variant_tagged_bottom'),
|
||||
taggable: "variant",
|
||||
visibility_field: "preferred_matched_variants_visibility",
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -51,6 +51,7 @@ module Admin
|
||||
|
||||
load_tag_rule_types
|
||||
|
||||
load_tag_rules
|
||||
return unless params[:stimulus]
|
||||
|
||||
@enterprise.is_primary_producer = params[:is_primary_producer]
|
||||
@@ -398,9 +399,26 @@ module Admin
|
||||
[t(".form.tag_rules.show_hide_order_cycles"), "FilterOrderCycles"]
|
||||
]
|
||||
|
||||
return unless helpers.feature?(:inventory, @object)
|
||||
if helpers.feature?(:variant_tag, @object)
|
||||
@tag_rule_types.prepend([t(".form.tag_rules.show_hide_variants_new"), "FilterVariants"])
|
||||
elsif helpers.feature?(:inventory, @object)
|
||||
@tag_rule_types.prepend([t(".form.tag_rules.show_hide_variants"), "FilterProducts"])
|
||||
end
|
||||
end
|
||||
|
||||
@tag_rule_types.prepend([t(".form.tag_rules.show_hide_variants"), "FilterProducts"])
|
||||
def load_tag_rules
|
||||
if helpers.feature?(:variant_tag, @object)
|
||||
@default_rules = @enterprise.tag_rules.exclude_inventory.select(&:is_default)
|
||||
@rules = @enterprise.tag_rules.exclude_inventory.prioritised.reject(&:is_default)
|
||||
elsif helpers.feature?(:inventory, @object)
|
||||
@default_rules = @enterprise.tag_rules.exclude_variant.select(&:is_default)
|
||||
@rules = @enterprise.tag_rules.exclude_variant.prioritised.reject(&:is_default)
|
||||
else
|
||||
@default_rules =
|
||||
@enterprise.tag_rules.exclude_inventory.exclude_variant.select(&:is_default)
|
||||
@rules =
|
||||
@enterprise.tag_rules.exclude_inventory.exclude_variant.prioritised.reject(&:is_default)
|
||||
end
|
||||
end
|
||||
|
||||
def setup_property
|
||||
|
||||
@@ -78,7 +78,7 @@ module Admin
|
||||
end
|
||||
|
||||
def permitted_tag_rule_type
|
||||
%w{FilterOrderCycles FilterPaymentMethods FilterProducts FilterShippingMethods}
|
||||
%w{FilterOrderCycles FilterPaymentMethods FilterProducts FilterShippingMethods FilterVariants}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -7,6 +7,8 @@ class TagRule < ApplicationRecord
|
||||
|
||||
scope :for, ->(enterprise) { where(enterprise_id: enterprise) }
|
||||
scope :prioritised, -> { order('priority ASC') }
|
||||
scope :exclude_inventory, -> { where.not(type: "TagRule::FilterProducts") }
|
||||
scope :exclude_variant, -> { where.not(type: "TagRule::FilterVariants") }
|
||||
|
||||
def self.mapping_for(enterprises)
|
||||
self.for(enterprises).each_with_object({}) do |rule, mapping|
|
||||
|
||||
@@ -5,15 +5,14 @@
|
||||
- # We use a high enough index increment so that the default tag rule should not overlap with the tag rules
|
||||
- # Rails will deal with non continous numbered tag_rules_attributes just fine, it saves us from having to manage the index state in javascript
|
||||
- current_rule_index = 1000
|
||||
- rules = @enterprise.tag_rules.prioritised.reject(&:is_default)
|
||||
- if rules.empty?
|
||||
- if @rules.empty?
|
||||
.no_tags
|
||||
= t('.no_tags_yet')
|
||||
|
||||
= render 'admin/enterprises/form/tag_rules/default_rules', f:, current_rule_index:
|
||||
|
||||
#customer-tag-rule
|
||||
- tag_groups(rules).each_with_index do |group, group_index|
|
||||
- tag_groups(@rules).each_with_index do |group, group_index|
|
||||
- current_group_index = group_index + 1
|
||||
= render TagRuleGroupFormComponent.new(group:, index: group_index, customer_rule_index: current_rule_index, tag_rule_types: @tag_rule_types)
|
||||
- # Same as above, We use a high enough increcment so that the previous tag rule group does not overlap with the next tag rule group
|
||||
|
||||
@@ -9,13 +9,12 @@
|
||||
= t('.by_default')
|
||||
%i.text-big.icon-question-sign{ "data-controller": "help-modal-link", "data-action": "click->help-modal-link#open", "data-help-modal-link-target-value": "tag_rule_help_modal" }
|
||||
#default-tag-rule
|
||||
- default_rules = @enterprise.tag_rules.select(&:is_default)
|
||||
- current_rule_index = 0
|
||||
- if default_rules.empty?
|
||||
- if @default_rules.empty?
|
||||
.no_rules
|
||||
= t('.no_rules_yet')
|
||||
- else
|
||||
- default_rules.each_with_index do |default_rule, index|
|
||||
- @default_rules.each_with_index do |default_rule, index|
|
||||
- current_rule_index = index + 1
|
||||
= render TagRuleFormComponent.new(rule: default_rule, index: index)
|
||||
%hr
|
||||
|
||||
@@ -1419,6 +1419,7 @@ en:
|
||||
no_tags_yet: No tags apply to this enterprise yet
|
||||
add_new_tag: '+ Add A New Tag'
|
||||
show_hide_variants: 'Show or Hide variants in my shopfront'
|
||||
show_hide_variants_new: 'Show or Hide variants in my shopfront'
|
||||
show_hide_shipping: 'Show or Hide shipping methods at checkout'
|
||||
show_hide_payment: 'Show or Hide payment methods at checkout'
|
||||
show_hide_order_cycles: 'Show or Hide order cycles in my shopfront'
|
||||
@@ -5076,6 +5077,8 @@ en:
|
||||
order_cycle_tagged_bottom: "are:"
|
||||
inventory_tagged_top: "Inventory variants tagged"
|
||||
inventory_tagged_bottom: "are:"
|
||||
variant_tagged_top: "Variants tagged"
|
||||
variant_tagged_bottom: "are:"
|
||||
visible: VISIBLE
|
||||
not_visible: NOT VISIBLE
|
||||
tag_rule_group_form:
|
||||
|
||||
@@ -8,6 +8,71 @@ RSpec.describe 'Tag Rules' do
|
||||
|
||||
let!(:enterprise) { create(:distributor_enterprise) }
|
||||
|
||||
describe "loading rules" do
|
||||
let!(:default_order_cycle_tag_rule) {
|
||||
create(:filter_order_cycles_tag_rule, enterprise:, is_default: true)
|
||||
}
|
||||
let!(:inventory_order_cycle_rule) { create(:filter_order_cycles_tag_rule, enterprise:) }
|
||||
let!(:default_inventory_tag_rule) {
|
||||
create(:filter_products_tag_rule, enterprise:, is_default: true)
|
||||
}
|
||||
let!(:inventory_tag_rule) { create(:filter_products_tag_rule, enterprise:) }
|
||||
let!(:default_variant_tag_rule) {
|
||||
create(:filter_variants_tag_rule, enterprise:, is_default: true)
|
||||
}
|
||||
let!(:variant_tag_rule) { create(:filter_variants_tag_rule, enterprise:) }
|
||||
|
||||
before do
|
||||
visit_tag_rules
|
||||
end
|
||||
|
||||
it "displays all existing rules" do
|
||||
within "#default-tag-rule" do
|
||||
expect(page).to have_content "Order Cycles tagged"
|
||||
expect(page).not_to have_content "Inventory variants tagged"
|
||||
expect(page).not_to have_content "Variants tagged"
|
||||
end
|
||||
|
||||
within "#customer-tag-rule" do
|
||||
expect(page).to have_content "Order Cycles tagged"
|
||||
expect(page).not_to have_content "Inventory variants tagged"
|
||||
expect(page).not_to have_content "Variants tagged"
|
||||
end
|
||||
end
|
||||
|
||||
context "with inventory enabled", feature: :inventory do
|
||||
it "does not display filter by variants rules" do
|
||||
within "#default-tag-rule" do
|
||||
expect(page).to have_content "Order Cycles tagged"
|
||||
expect(page).to have_content "Inventory variants tagged"
|
||||
expect(page).not_to have_content "Variants tagged"
|
||||
end
|
||||
|
||||
within "#customer-tag-rule" do
|
||||
expect(page).to have_content "Order Cycles tagged"
|
||||
expect(page).to have_content "Inventory variants tagged"
|
||||
expect(page).not_to have_content "Variants tagged"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context "with variant tag enabled", feature: :variant_tag do
|
||||
it "does not display filter by inventory variants rules" do
|
||||
within "#default-tag-rule" do
|
||||
expect(page).to have_content "Order Cycles tagged"
|
||||
expect(page).not_to have_content "Inventory variants tagged"
|
||||
expect(page).to have_content "Variants tagged"
|
||||
end
|
||||
|
||||
within "#customer-tag-rule" do
|
||||
expect(page).to have_content "Order Cycles tagged"
|
||||
expect(page).not_to have_content "Inventory variants tagged"
|
||||
expect(page).to have_content "Variants tagged"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context "creating" do
|
||||
before do
|
||||
visit_tag_rules
|
||||
@@ -90,6 +155,33 @@ RSpec.describe 'Tag Rules' do
|
||||
expect(tag_rule.preferred_matched_order_cycles_visibility).to eq "hidden"
|
||||
end
|
||||
|
||||
context "when variant_tag enabled", feature: :variant_tag do
|
||||
it "allows creation of filter variant type" do
|
||||
# Creating a new tag
|
||||
expect(page).to have_content 'No tags apply to this enterprise yet'
|
||||
click_button '+ Add A New Tag'
|
||||
fill_in_tag "New Product"
|
||||
|
||||
# New FilterProducts Rule
|
||||
click_button '+ Add A New Rule'
|
||||
tomselect_select 'Show or Hide variants in my shop', from: 'rule_type_selector'
|
||||
click_button "Add Rule"
|
||||
within("#customer-tag-rule #tr_1001") do
|
||||
fill_in_tag "new product"
|
||||
tomselect_select "VISIBLE",
|
||||
from: "enterprise_tag_rules_attributes_1001_preferred_matched_" \
|
||||
"variants_visibility"
|
||||
end
|
||||
|
||||
click_button 'Update'
|
||||
|
||||
tag_rule = TagRule::FilterVariants.last
|
||||
expect(tag_rule.preferred_customer_tags).to eq "New Product"
|
||||
expect(tag_rule.preferred_variant_tags).to eq "new product"
|
||||
expect(tag_rule.preferred_matched_variants_visibility).to eq "visible"
|
||||
end
|
||||
end
|
||||
|
||||
context "when inventory enabled", feature: :inventory do
|
||||
it "allows creation of filter variant type" do
|
||||
# Creating a new tag
|
||||
@@ -118,7 +210,7 @@ RSpec.describe 'Tag Rules' do
|
||||
end
|
||||
end
|
||||
|
||||
context "updating" do
|
||||
context "updating", feature: :inventory do
|
||||
let!(:default_fsm_tag_rule) {
|
||||
create(:filter_shipping_methods_tag_rule, enterprise:,
|
||||
preferred_matched_shipping_methods_visibility:
|
||||
@@ -242,10 +334,10 @@ RSpec.describe 'Tag Rules' do
|
||||
|
||||
context "deleting" do
|
||||
let!(:tag_rule) {
|
||||
create(:filter_products_tag_rule, enterprise:, preferred_customer_tags: "member" )
|
||||
create(:filter_order_cycles_tag_rule, enterprise:, preferred_customer_tags: "member" )
|
||||
}
|
||||
let!(:default_rule) {
|
||||
create(:filter_products_tag_rule, is_default: true, enterprise: )
|
||||
create(:filter_order_cycles_tag_rule, is_default: true, enterprise: )
|
||||
}
|
||||
|
||||
before do
|
||||
|
||||
Reference in New Issue
Block a user