Extract unit_value and unit_description values

Copied from display_as.js.coffee (ofn.admin.ofnDisplayAs.variantUnitProperties).
This commit is contained in:
David Cook
2024-03-21 16:54:57 +11:00
parent c98956bf5a
commit 49226ffdbc
3 changed files with 66 additions and 22 deletions

View File

@@ -14,7 +14,9 @@
= variant.unit_to_display # Show the generated summary of unit values = variant.unit_to_display # Show the generated summary of unit values
%div.popout__container{ style: 'display: none;', 'data-controller': 'toggle-control', 'data-popout-target': "dialog" } %div.popout__container{ style: 'display: none;', 'data-controller': 'toggle-control', 'data-popout-target': "dialog" }
.field .field
-# Composite field for unit_value and unit_description -# Show a composite field for unit_value and unit_description
= f.hidden_field :unit_value
= f.hidden_field :unit_description
-# todo: create a method for value_with_description -# todo: create a method for value_with_description
= f.text_field :unit_value_with_description, = f.text_field :unit_value_with_description,
value: [number_with_precision(variant.unit_value, precision: nil,strip_insignificant_zeros: true), variant.unit_description].compact_blank.join(" "), value: [number_with_precision(variant.unit_value, precision: nil,strip_insignificant_zeros: true), variant.unit_description].compact_blank.join(" "),

View File

@@ -10,6 +10,8 @@ export default class VariantController extends Controller {
this.variantUnitScale = product.querySelector('[name$="[variant_unit_scale]"]'); this.variantUnitScale = product.querySelector('[name$="[variant_unit_scale]"]');
this.variantUnitName = product.querySelector('[name$="[variant_unit_name]"]'); this.variantUnitName = product.querySelector('[name$="[variant_unit_name]"]');
this.unitValue = this.element.querySelector('[name$="[unit_value]"]');
this.unitDescription = this.element.querySelector('[name$="[unit_description]"]');
this.unitValueWithDescription = this.element.querySelector( this.unitValueWithDescription = this.element.querySelector(
'[name$="[unit_value_with_description]"]', '[name$="[unit_value_with_description]"]',
); );
@@ -23,7 +25,7 @@ export default class VariantController extends Controller {
// on unit_value_with_description changed; update unit_value and unit_description // on unit_value_with_description changed; update unit_value and unit_description
// on unit_value and/or unit_description changed; update display_as:placeholder and unit_to_display // on unit_value and/or unit_description changed; update display_as:placeholder and unit_to_display
this.unitValueWithDescription.addEventListener("input", this.#unitValueChanged.bind(this), { this.unitValueWithDescription.addEventListener("input", this.#unitChanged.bind(this), {
passive: true, passive: true,
}); });
@@ -42,14 +44,22 @@ export default class VariantController extends Controller {
#unitChanged(event) { #unitChanged(event) {
//todo: deduplicate events. //todo: deduplicate events.
//Hmm in hindsight the logic in product_controller should be inn this controller already. then we can do everything in one event, and store the generated name in an instance variable. //Hmm in hindsight the logic in product_controller should be inn this controller already. then we can do everything in one event, and store the generated name in an instance variable.
this.#extractUnitValues();
this.#updateUnitDisplay(); this.#updateUnitDisplay();
} }
// Extract unit_value and unit_description from unit_value_with_description, // Extract unit_value and unit_description
// and update hidden fields #extractUnitValues() {
#unitValueChanged(event) { // Extract a number (optional) and text value, separated by a space.
//todo: deduplicate events. const match = this.unitValueWithDescription.value.match(/^([\d\.\,]+(?= |$)|)( |)(.*)$/);
this.#updateUnitDisplay(); if (match) {
let unit_value = parseFloat(match[1].replace(",", "."));
unit_value = isNaN(unit_value) ? null : unit_value;
unit_value *= this.variantUnitScale.value ? this.variantUnitScale.value : 1;
this.unitValue.value = unit_value;
this.unitDescription.value = match[3];
}
} }
// Update display_as placeholder and unit_to_display // Update display_as placeholder and unit_to_display

View File

@@ -186,7 +186,18 @@ describe 'As an admin, I can manage products', feature: :admin_style_v3 do
within row_containing_name("Medium box") do within row_containing_name("Medium box") do
fill_in "Name", with: "Large box" fill_in "Name", with: "Large box"
fill_in "SKU", with: "POM-01" fill_in "SKU", with: "POM-01"
fill_in "Unit", with: "500.1"
click_on "Unit" # activate popout
end
# Unit popout
# TODO: prevent empty value
# fill_in "Unit value", with: ""
# click_button "Save changes" # attempt to save or close the popout
# expect(page).to have_field "Unit value", with: "" # popout is still open
fill_in "Unit value", with: "500.1"
within row_containing_name("Medium box") do
fill_in "Price", with: "10.25" fill_in "Price", with: "10.25"
click_on "On Hand" # activate popout click_on "On Hand" # activate popout
@@ -210,7 +221,7 @@ describe 'As an admin, I can manage products', feature: :admin_style_v3 do
.and change{ product_a.variant_unit_scale }.to(0.001) .and change{ product_a.variant_unit_scale }.to(0.001)
.and change{ variant_a1.display_name }.to("Large box") .and change{ variant_a1.display_name }.to("Large box")
.and change{ variant_a1.sku }.to("POM-01") .and change{ variant_a1.sku }.to("POM-01")
.and change{ variant_a1.unit_value }.to(500.1) .and change{ variant_a1.unit_value }.to(0.5001) # volumes are stored in litres
.and change{ variant_a1.price }.to(10.25) .and change{ variant_a1.price }.to(10.25)
.and change{ variant_a1.on_hand }.to(6) .and change{ variant_a1.on_hand }.to(6)
@@ -221,8 +232,6 @@ describe 'As an admin, I can manage products', feature: :admin_style_v3 do
within row_containing_name("Large box") do within row_containing_name("Large box") do
expect(page).to have_field "Name", with: "Large box" expect(page).to have_field "Name", with: "Large box"
expect(page).to have_field "SKU", with: "POM-01" expect(page).to have_field "SKU", with: "POM-01"
expect(page).to have_field "Unit value", with: "500.1"
pending "Units values not handled" # similar to old admin screen
expect(page).to have_button "Unit", text: "500.1mL" expect(page).to have_button "Unit", text: "500.1mL"
expect(page).to have_field "Price", with: "10.25" expect(page).to have_field "Price", with: "10.25"
expect(page).to have_button "On Hand", text: "6" expect(page).to have_button "On Hand", text: "6"
@@ -269,21 +278,44 @@ describe 'As an admin, I can manage products', feature: :admin_style_v3 do
end end
end end
it "saves a custom variant unit display name" do describe "Changing unit values" do
within row_containing_name("Medium box") do # This is a rather strange feature, I wonder if anyone actually uses it.
fill_in "Display unit as", with: "250g box" it "saves a variant unit description" do
within row_containing_name("Medium box") do
click_on "Unit" # activate popout
fill_in "Unit value", with: "1000 boxed" # 1000 grams
end
expect {
click_button "Save changes"
expect(page).to have_content "Changes saved"
variant_a1.reload
}.to change{ variant_a1.unit_value }.to(1000)
.and change{ variant_a1.unit_description }.to("boxed")
within row_containing_name("Medium box") do
# New value is visible immediately
expect(page).to have_button "Unit", text: "1kg boxed"
end
end end
expect { it "saves a custom variant unit display name" do
click_button "Save changes" within row_containing_name("Medium box") do
fill_in "Display unit as", with: "250g box"
end
expect(page).to have_content "Changes saved" expect {
variant_a1.reload click_button "Save changes"
}.to change{ variant_a1.unit_to_display }.to("250g box")
within row_containing_name("Medium box") do expect(page).to have_content "Changes saved"
expect(page).to have_field "Display unit as", with: "250g box" variant_a1.reload
expect(page).to have_button "Unit", text: "250g box" }.to change{ variant_a1.unit_to_display }.to("250g box")
within row_containing_name("Medium box") do
expect(page).to have_field "Display unit as", with: "250g box"
expect(page).to have_button "Unit", text: "250g box"
end
end end
end end