diff --git a/app/assets/javascripts/admin/bulk_product_update.js.coffee b/app/assets/javascripts/admin/bulk_product_update.js.coffee index eea60e9d09..d18c48b771 100644 --- a/app/assets/javascripts/admin/bulk_product_update.js.coffee +++ b/app/assets/javascripts/admin/bulk_product_update.js.coffee @@ -289,6 +289,16 @@ productsApp.controller "AdminBulkProductsCtrl", [ else product.variant_unit = product.variant_unit_with_scale product.variant_unit_scale = null + if product.variants + for id, variant of product.variants + $scope.packVariant variant + + + $scope.packVariant = (variant) -> + match = variant.unit_value_with_description.match(/^([\d\.]+|)( |)(.*)$/) + if match + variant.unit_value = parseFloat(match[1]) || null + variant.unit_description = match[3] $scope.productsWithoutDerivedAttributes = -> @@ -377,6 +387,12 @@ filterSubmitProducts = (productsToFilter) -> if variant.hasOwnProperty("price") filteredVariant.price = variant.price hasUpdatableProperty = true + if variant.hasOwnProperty("unit_value") + filteredVariant.unit_value = variant.unit_value + hasUpdatableProperty = true + if variant.hasOwnProperty("unit_description") + filteredVariant.unit_description = variant.unit_description + hasUpdatableProperty = true filteredVariants.push filteredVariant if hasUpdatableProperty hasUpdatableProperty = false diff --git a/app/models/spree/variant_decorator.rb b/app/models/spree/variant_decorator.rb index 28e422049f..e55fc5d04f 100644 --- a/app/models/spree/variant_decorator.rb +++ b/app/models/spree/variant_decorator.rb @@ -1,4 +1,6 @@ Spree::Variant.class_eval do + attr_accessible :unit_value, :unit_description + validates_presence_of :unit_value, if: -> v { %w(weight volume).include? v.product.variant_unit }, unless: :is_master diff --git a/spec/features/admin/bulk_product_update_spec.rb b/spec/features/admin/bulk_product_update_spec.rb index 7c1307a23e..2cbb520454 100644 --- a/spec/features/admin/bulk_product_update_spec.rb +++ b/spec/features/admin/bulk_product_update_spec.rb @@ -262,8 +262,8 @@ feature %q{ scenario "updating a product with variants" do s1 = FactoryGirl.create(:supplier_enterprise) s2 = FactoryGirl.create(:supplier_enterprise) - p = FactoryGirl.create(:product, supplier: s1, available_on: Date.today) - v = FactoryGirl.create(:variant, product: p, price: 3.0, on_hand: 9) + p = FactoryGirl.create(:product, supplier: s1, available_on: Date.today, variant_unit: 'volume', variant_unit_scale: 0.001) + v = FactoryGirl.create(:variant, product: p, price: 3.0, on_hand: 9, unit_value: 250, unit_description: '(bottle)') login_to_admin_section @@ -272,11 +272,13 @@ feature %q{ first("a.view-variants").click page.should have_field "variant_price", with: "3.0" + page.should have_field "variant_unit_value_with_description", with: "250 (bottle)" page.should have_field "variant_on_hand", with: "9" page.should have_selector "span[name='on_hand']", text: "9" fill_in "variant_price", with: "4.0" fill_in "variant_on_hand", with: "10" + fill_in "variant_unit_value_with_description", with: "4000 (12x250 mL bottles)" page.should have_selector "span[name='on_hand']", text: "10" @@ -289,6 +291,7 @@ feature %q{ page.should have_field "variant_price", with: "4.0" page.should have_field "variant_on_hand", with: "10" + page.should have_field "variant_unit_value_with_description", with: "4000 (12x250 mL bottles)" end scenario "updating delegated attributes of variants in isolation" do diff --git a/spec/javascripts/unit/bulk_product_update_spec.js.coffee b/spec/javascripts/unit/bulk_product_update_spec.js.coffee index bd449602a8..1728fcc4e8 100644 --- a/spec/javascripts/unit/bulk_product_update_spec.js.coffee +++ b/spec/javascripts/unit/bulk_product_update_spec.js.coffee @@ -76,6 +76,8 @@ describe "filtering products", -> id: 1 on_hand: 5 price: 12.0 + unit_value: 250 + unit_description: "(bottle)" ] expect(filterSubmitProducts([testProduct])).toEqual [ @@ -84,6 +86,8 @@ describe "filtering products", -> id: 1 on_hand: 5 price: 12.0 + unit_value: 250 + unit_description: "(bottle)" ] ] @@ -169,6 +173,8 @@ describe "filtering products", -> id: 1 on_hand: 2 price: 10.0 + unit_value: 250 + unit_description: "(bottle)" ] variant_unit: 'volume' variant_unit_scale: 1 @@ -187,6 +193,8 @@ describe "filtering products", -> id: 1 on_hand: 2 price: 10.0 + unit_value: 250 + unit_description: "(bottle)" ] ] @@ -500,6 +508,50 @@ describe "AdminBulkProductsCtrl", -> variant_unit_scale: null variant_unit_with_scale: 'items' + it "packs each variant", -> + spyOn scope, "packVariant" + testVariant = {id: 1} + testProduct = + id: 1 + variants: {1: testVariant} + + scope.packProduct(testProduct) + + expect(scope.packVariant).toHaveBeenCalledWith(testVariant) + + describe "packing variants", -> + it "extracts unit_value and unit_description from unit_value_with_description", -> + testVariant = {unit_value_with_description: "250.5 (bottle)"} + scope.packVariant(testVariant) + expect(testVariant).toEqual + unit_value: 250.5 + unit_description: "(bottle)" + unit_value_with_description: "250.5 (bottle)" + + it "extracts into unit_value when only a number is provided", -> + testVariant = {unit_value_with_description: "250.5"} + scope.packVariant(testVariant) + expect(testVariant).toEqual + unit_value: 250.5 + unit_description: '' + unit_value_with_description: "250.5" + + it "extracts into unit_description when only a string is provided", -> + testVariant = {unit_value_with_description: "Medium"} + scope.packVariant(testVariant) + expect(testVariant).toEqual + unit_value: null + unit_description: 'Medium' + unit_value_with_description: "Medium" + + it "sets blank values when no value provided", -> + testVariant = {unit_value_with_description: ""} + scope.packVariant(testVariant) + expect(testVariant).toEqual + unit_value: null + unit_description: '' + unit_value_with_description: "" + describe "filtering products", -> beforeEach ->