mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-03-05 02:41:33 +00:00
11060: add specs
This commit is contained in:
committed by
Rachel Arnould
parent
c12d6ab7f0
commit
15ee4f6619
@@ -1,8 +1,8 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
class SearchableDropdownComponent < ViewComponent::Base
|
class SearchableDropdownComponent < ViewComponent::Base
|
||||||
REMOVED_SEARCH_PLUGIN = {"tom-select-options-value": '{ "plugins": [] }'}.freeze
|
REMOVED_SEARCH_PLUGIN = { 'tom-select-options-value': '{ "plugins": [] }' }.freeze
|
||||||
MINIMUM_OPTIONS_FOR_SEARCH_FILED = 11.freeze # at least 11 options are required for the search field
|
MINIMUM_OPTIONS_FOR_SEARCH_FILED = 11 # at least 11 options are required for the search field
|
||||||
|
|
||||||
def initialize(
|
def initialize(
|
||||||
form:,
|
form:,
|
||||||
@@ -10,7 +10,8 @@ class SearchableDropdownComponent < ViewComponent::Base
|
|||||||
options:,
|
options:,
|
||||||
selected_option:,
|
selected_option:,
|
||||||
placeholder_value:,
|
placeholder_value:,
|
||||||
include_blank: false
|
include_blank: false,
|
||||||
|
aria_label: ''
|
||||||
)
|
)
|
||||||
@f = form
|
@f = form
|
||||||
@name = name
|
@name = name
|
||||||
@@ -18,11 +19,12 @@ class SearchableDropdownComponent < ViewComponent::Base
|
|||||||
@selected_option = selected_option
|
@selected_option = selected_option
|
||||||
@placeholder_value = placeholder_value
|
@placeholder_value = placeholder_value
|
||||||
@include_blank = include_blank
|
@include_blank = include_blank
|
||||||
|
@aria_label = aria_label
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
attr_reader :f, :name, :options, :selected_option, :placeholder_value, :include_blank
|
attr_reader :f, :name, :options, :selected_option, :placeholder_value, :include_blank, :aria_label
|
||||||
|
|
||||||
def classes
|
def classes
|
||||||
"fullwidth #{remove_search_plugin? ? 'no-input' : ''}"
|
"fullwidth #{remove_search_plugin? ? 'no-input' : ''}"
|
||||||
@@ -30,7 +32,7 @@ class SearchableDropdownComponent < ViewComponent::Base
|
|||||||
|
|
||||||
def data
|
def data
|
||||||
{
|
{
|
||||||
"controller": "tom-select",
|
controller: "tom-select",
|
||||||
'tom-select-placeholder-value': placeholder_value
|
'tom-select-placeholder-value': placeholder_value
|
||||||
}.merge(remove_search_plugin? ? REMOVED_SEARCH_PLUGIN : {})
|
}.merge(remove_search_plugin? ? REMOVED_SEARCH_PLUGIN : {})
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
= f.select name, options_for_select(options, selected_option), { include_blank: }, class: classes, data:
|
= f.select name, options_for_select(options, selected_option), { include_blank: }, class: classes, data:, 'aria-label': aria_label
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
%td.naked_inputs.align-left
|
%td.naked_inputs.align-left
|
||||||
= render(SearchableDropdownComponent.new(form: f,
|
= render(SearchableDropdownComponent.new(form: f,
|
||||||
name: :supplier_id,
|
name: :supplier_id,
|
||||||
|
aria_label: t('.producer_field_name'),
|
||||||
options: producer_options,
|
options: producer_options,
|
||||||
selected_option: product.supplier_id,
|
selected_option: product.supplier_id,
|
||||||
placeholder_value: t('admin.products_v3.filters.search_for_producers')))
|
placeholder_value: t('admin.products_v3.filters.search_for_producers')))
|
||||||
|
|||||||
@@ -46,6 +46,7 @@
|
|||||||
name: :primary_taxon_id,
|
name: :primary_taxon_id,
|
||||||
options: category_options,
|
options: category_options,
|
||||||
selected_option: variant.primary_taxon_id,
|
selected_option: variant.primary_taxon_id,
|
||||||
|
aria_label: t('.category_field_name'),
|
||||||
placeholder_value: t('admin.products_v3.filters.search_for_categories')))
|
placeholder_value: t('admin.products_v3.filters.search_for_categories')))
|
||||||
%td.field.naked_inputs
|
%td.field.naked_inputs
|
||||||
= render(SearchableDropdownComponent.new(form: f,
|
= render(SearchableDropdownComponent.new(form: f,
|
||||||
@@ -53,6 +54,7 @@
|
|||||||
options: tax_category_options,
|
options: tax_category_options,
|
||||||
selected_option: variant.tax_category_id,
|
selected_option: variant.tax_category_id,
|
||||||
include_blank: t('.none_tax_category'),
|
include_blank: t('.none_tax_category'),
|
||||||
|
aria_label: t('.tax_category_field_name'),
|
||||||
placeholder_value: t('.search_for_tax_categories')))
|
placeholder_value: t('.search_for_tax_categories')))
|
||||||
%td.align-left
|
%td.align-left
|
||||||
-# empty
|
-# empty
|
||||||
|
|||||||
@@ -911,6 +911,10 @@ en:
|
|||||||
variant_row:
|
variant_row:
|
||||||
none_tax_category: None
|
none_tax_category: None
|
||||||
search_for_tax_categories: "Search for tax categories"
|
search_for_tax_categories: "Search for tax categories"
|
||||||
|
category_field_name: "Category"
|
||||||
|
tax_category_field_name: "Tax Category"
|
||||||
|
product_row:
|
||||||
|
producer_field_name: "Producer"
|
||||||
product_import:
|
product_import:
|
||||||
title: Product Import
|
title: Product Import
|
||||||
file_not_found: File not found or could not be opened
|
file_not_found: File not found or could not be opened
|
||||||
|
|||||||
@@ -14,6 +14,10 @@ describe 'As an enterprise user, I can manage my products', feature: :admin_styl
|
|||||||
login_as user
|
login_as user
|
||||||
end
|
end
|
||||||
|
|
||||||
|
let(:producer_search_selector) { 'input[placeholder="Search for producers"]' }
|
||||||
|
let(:categories_search_selector) { 'input[placeholder="Search for categories"]' }
|
||||||
|
let(:tax_categories_search_selector) { 'input[placeholder="Search for tax categories"]' }
|
||||||
|
|
||||||
it "can see the new product page" do
|
it "can see the new product page" do
|
||||||
visit admin_products_url
|
visit admin_products_url
|
||||||
expect(page).to have_content "Bulk Edit Products"
|
expect(page).to have_content "Bulk Edit Products"
|
||||||
@@ -666,6 +670,113 @@ describe 'As an enterprise user, I can manage my products', feature: :admin_styl
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "Changing producers, category and tax category" do
|
||||||
|
let!(:variant_a1) {
|
||||||
|
product_a.variants.first.tap{ |v|
|
||||||
|
v.update! display_name: "Medium box", sku: "APL-01", price: 5.25, on_hand: 5,
|
||||||
|
on_demand: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let!(:product_a) {
|
||||||
|
create(:simple_product, name: "Apples", sku: "APL-00",
|
||||||
|
variant_unit: "weight", variant_unit_scale: 1) # Grams
|
||||||
|
}
|
||||||
|
|
||||||
|
context "when they are under 11" do
|
||||||
|
before do
|
||||||
|
create_list(:supplier_enterprise, 9)
|
||||||
|
create_list(:tax_category, 9)
|
||||||
|
create_list(:taxon, 2)
|
||||||
|
|
||||||
|
visit admin_products_url
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should not display search input, change the producers, category and tax category" do
|
||||||
|
producer_to_select = random_producer(product_a)
|
||||||
|
category_to_select = random_category(variant_a1)
|
||||||
|
tax_category_to_select = random_tax_category
|
||||||
|
|
||||||
|
within row_containing_name(product_a.name) do
|
||||||
|
validate_tomselect_without_search!(
|
||||||
|
page, "Producer",
|
||||||
|
producer_to_select,
|
||||||
|
producer_search_selector
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
within row_containing_name(variant_a1.display_name) do
|
||||||
|
validate_tomselect_without_search!(
|
||||||
|
page, "Category",
|
||||||
|
category_to_select,
|
||||||
|
categories_search_selector
|
||||||
|
)
|
||||||
|
validate_tomselect_without_search!(
|
||||||
|
page, "Tax Category",
|
||||||
|
tax_category_to_select,
|
||||||
|
tax_categories_search_selector
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
click_button "Save changes"
|
||||||
|
|
||||||
|
expect(page).to have_content "Changes saved"
|
||||||
|
product_a.reload
|
||||||
|
variant_a1.reload
|
||||||
|
|
||||||
|
expect(product_a.supplier.name).to eq(producer_to_select)
|
||||||
|
expect(variant_a1.primary_taxon.name).to eq(category_to_select)
|
||||||
|
expect(variant_a1.tax_category.name).to eq(tax_category_to_select)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when they are over 11" do
|
||||||
|
before do
|
||||||
|
create_list(:supplier_enterprise, 11)
|
||||||
|
create_list(:tax_category, 11)
|
||||||
|
create_list(:taxon, 11)
|
||||||
|
|
||||||
|
visit admin_products_url
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should display search input, change the producer" do
|
||||||
|
producer_to_select = random_producer(product_a)
|
||||||
|
category_to_select = random_category(variant_a1)
|
||||||
|
tax_category_to_select = random_tax_category
|
||||||
|
|
||||||
|
within row_containing_name(product_a.name) do
|
||||||
|
validate_tomselect_with_search!(
|
||||||
|
page, "Producer",
|
||||||
|
producer_to_select,
|
||||||
|
producer_search_selector
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
within row_containing_name(variant_a1.display_name) do
|
||||||
|
validate_tomselect_with_search!(
|
||||||
|
page, "Category",
|
||||||
|
category_to_select,
|
||||||
|
categories_search_selector
|
||||||
|
)
|
||||||
|
validate_tomselect_with_search!(
|
||||||
|
page, "Tax Category",
|
||||||
|
tax_category_to_select,
|
||||||
|
tax_categories_search_selector
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
click_button "Save changes"
|
||||||
|
|
||||||
|
expect(page).to have_content "Changes saved"
|
||||||
|
product_a.reload
|
||||||
|
variant_a1.reload
|
||||||
|
|
||||||
|
expect(product_a.supplier.name).to eq(producer_to_select)
|
||||||
|
expect(variant_a1.primary_taxon.name).to eq(category_to_select)
|
||||||
|
expect(variant_a1.tax_category.name).to eq(tax_category_to_select)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe "edit image" do
|
describe "edit image" do
|
||||||
shared_examples "updating image" do
|
shared_examples "updating image" do
|
||||||
it "saves product image" do
|
it "saves product image" do
|
||||||
@@ -1032,4 +1143,41 @@ describe 'As an enterprise user, I can manage my products', feature: :admin_styl
|
|||||||
def tax_category_column
|
def tax_category_column
|
||||||
@tax_category_column ||= '[data-controller="variant"] > td:nth-child(10)'
|
@tax_category_column ||= '[data-controller="variant"] > td:nth-child(10)'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def validate_tomselect_without_search!(page, field_name, value, search_selector)
|
||||||
|
tomselect_wrapper = page.find_field(field_name).sibling(".ts-wrapper")
|
||||||
|
tomselect_wrapper.find(".ts-control").click
|
||||||
|
|
||||||
|
expect(page).not_to have_selector(search_selector)
|
||||||
|
|
||||||
|
tomselect_wrapper.find(:css, '.ts-dropdown .ts-dropdown-content .option',
|
||||||
|
text: value).click
|
||||||
|
end
|
||||||
|
|
||||||
|
def validate_tomselect_with_search!(page, field_name, value, search_selector)
|
||||||
|
tomselect_wrapper = page.find_field(field_name).sibling(".ts-wrapper")
|
||||||
|
tomselect_wrapper.find(".ts-control").click
|
||||||
|
|
||||||
|
expect(page).to have_selector(search_selector)
|
||||||
|
|
||||||
|
tomselect_wrapper.find(:css, '.ts-dropdown input.dropdown-input').send_keys(value)
|
||||||
|
tomselect_wrapper.find(:css, '.ts-dropdown .ts-dropdown-content .option', text: value).click
|
||||||
|
end
|
||||||
|
|
||||||
|
def random_producer(product)
|
||||||
|
Enterprise.is_primary_producer
|
||||||
|
.where.not(id: product.supplier.id)
|
||||||
|
.pluck(:name).sample
|
||||||
|
end
|
||||||
|
|
||||||
|
def random_category(variant)
|
||||||
|
Spree::Taxon
|
||||||
|
.where.not(id: variant.primary_taxon.id)
|
||||||
|
.pluck(:name).sample
|
||||||
|
end
|
||||||
|
|
||||||
|
def random_tax_category
|
||||||
|
Spree::TaxCategory
|
||||||
|
.pluck(:name).sample
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user