diff --git a/app/assets/javascripts/admin/products/controllers/edit_units_controller.js.coffee b/app/assets/javascripts/admin/products/controllers/edit_units_controller.js.coffee deleted file mode 100644 index 196ca47319..0000000000 --- a/app/assets/javascripts/admin/products/controllers/edit_units_controller.js.coffee +++ /dev/null @@ -1,24 +0,0 @@ -angular.module("admin.products").controller "editUnitsCtrl", ($scope, VariantUnitManager) -> - - $scope.product = - variant_unit: angular.element('#variant_unit').val() - variant_unit_scale: angular.element('#variant_unit_scale').val() - - $scope.variant_unit_options = VariantUnitManager.variantUnitOptions() - - if $scope.product.variant_unit == 'items' - $scope.variant_unit_with_scale = 'items' - else - $scope.variant_unit_with_scale = $scope.product.variant_unit + '_' + $scope.product.variant_unit_scale.replace(/\.0$/, ''); - - $scope.setFields = -> - if $scope.variant_unit_with_scale == 'items' - variant_unit = 'items' - variant_unit_scale = null - else - options = $scope.variant_unit_with_scale.split('_') - variant_unit = options[0] - variant_unit_scale = options[1] - - $scope.product.variant_unit = variant_unit - $scope.product.variant_unit_scale = variant_unit_scale diff --git a/app/assets/javascripts/admin/products/controllers/units_controller.js.coffee b/app/assets/javascripts/admin/products/controllers/units_controller.js.coffee index a92f4aeada..446dc1794b 100644 --- a/app/assets/javascripts/admin/products/controllers/units_controller.js.coffee +++ b/app/assets/javascripts/admin/products/controllers/units_controller.js.coffee @@ -1,15 +1,14 @@ # Controller for "New Products" form (spree/admin/products/new) angular.module("admin.products") .controller "unitsCtrl", ($scope, VariantUnitManager, OptionValueNamer, UnitPrices, PriceParser) -> - $scope.product = { master: {} } - $scope.product.master.product = $scope.product + $scope.product = {} $scope.placeholder_text = "" - $scope.$watchCollection '[product.variant_unit_with_scale, product.master.unit_value_with_description, product.price, product.variant_unit_name]', -> + $scope.$watchCollection '[product.variant_unit_with_scale, product.unit_value_with_description, product.price, product.variant_unit_name]', -> $scope.processVariantUnitWithScale() $scope.processUnitValueWithDescription() $scope.processUnitPrice() - $scope.placeholder_text = new OptionValueNamer($scope.product.master).name() if $scope.product.variant_unit_scale + $scope.placeholder_text = new OptionValueNamer($scope.product).name() if $scope.product.variant_unit_scale $scope.variant_unit_options = VariantUnitManager.variantUnitOptions() @@ -38,24 +37,24 @@ angular.module("admin.products") # Extract unit_value and unit_description from text field unit_value_with_description, # and update hidden variant fields $scope.processUnitValueWithDescription = -> - if $scope.product.master.hasOwnProperty("unit_value_with_description") - match = $scope.product.master.unit_value_with_description.match(/^([\d\.,]+(?= *|$)|)( *)(.*)$/) + if $scope.product.hasOwnProperty("unit_value_with_description") + match = $scope.product.unit_value_with_description.match(/^([\d\.,]+(?= *|$)|)( *)(.*)$/) if match - $scope.product.master.unit_value = PriceParser.parse(match[1]) - $scope.product.master.unit_value = null if isNaN($scope.product.master.unit_value) - $scope.product.master.unit_value = window.bigDecimal.multiply($scope.product.master.unit_value, $scope.product.variant_unit_scale, 2) if $scope.product.master.unit_value && $scope.product.variant_unit_scale - $scope.product.master.unit_description = match[3] + $scope.product.unit_value = PriceParser.parse(match[1]) + $scope.product.unit_value = null if isNaN($scope.product.unit_value) + $scope.product.unit_value = window.bigDecimal.multiply($scope.product.unit_value, $scope.product.variant_unit_scale, 2) if $scope.product.unit_value && $scope.product.variant_unit_scale + $scope.product.unit_description = match[3] else - value = $scope.product.master.unit_value - value = window.bigDecimal.divide(value, $scope.product.variant_unit_scale, 2) if $scope.product.master.unit_value && $scope.product.variant_unit_scale - $scope.product.master.unit_value_with_description = value + " " + $scope.product.master.unit_description + value = $scope.product.unit_value + value = window.bigDecimal.divide(value, $scope.product.variant_unit_scale, 2) if $scope.product.unit_value && $scope.product.variant_unit_scale + $scope.product.unit_value_with_description = value + " " + $scope.product.unit_description # Calculate unit price based on product price and variant_unit_scale $scope.processUnitPrice = -> price = $scope.product.price scale = $scope.product.variant_unit_scale unit_type = $scope.product.variant_unit - unit_value = $scope.product.master.unit_value + unit_value = $scope.product.unit_value variant_unit_name = $scope.product.variant_unit_name $scope.unit_price = UnitPrices.displayableUnitPrice(price, scale, unit_type, unit_value, variant_unit_name) diff --git a/app/views/spree/admin/products/_form.html.haml b/app/views/spree/admin/products/_form.html.haml index 546efeace4..ab9843b7e2 100644 --- a/app/views/spree/admin/products/_form.html.haml +++ b/app/views/spree/admin/products/_form.html.haml @@ -1,5 +1,5 @@ %div.admin-product-form-fields - .left.twelve.columns.alpha + .left.sixteen.columns.alpha = f.field_container :name do = f.label :name, raw(t(:name) + content_tag(:span, ' *', :class => 'required')) = f.text_field :name, :class => 'fullwidth title' @@ -10,25 +10,6 @@ = f.hidden_field :description, id: "product_description", value: @product.description %trix-editor{ input: "product_description", "data-controller": "trixeditor" } - .right.four.columns.omega - .variant_units_form{ 'ng-app' => 'admin.products', 'ng-controller' => 'editUnitsCtrl' } - - = f.field_container :units do - = f.label :variant_unit_with_scale, t(:spree_admin_variant_unit_scale) - %select.select2.fullwidth{ id: 'product_variant_unit_with_scale', 'ng-model' => 'variant_unit_with_scale', 'ng-change' => 'setFields()', 'ng-options' => 'unit[1] as unit[0] for unit in variant_unit_options' } - %option{'value' => ''} - - = f.text_field :variant_unit, {'id' => 'variant_unit', 'ng-value' => 'product.variant_unit', 'hidden' => true} - = f.text_field :variant_unit_scale, {'id' => 'variant_unit_scale', 'ng-value' => 'product.variant_unit_scale', 'hidden' => true} - - .variant_unit_name{'ng-show' => 'product.variant_unit == "items"'} - = f.field_container :variant_unit_name do - = f.label :variant_unit_name, t(:spree_admin_variant_unit_name) - = f.text_field :variant_unit_name, {placeholder: t('admin.products.unit_name_placeholder')} - = f.error_message_on :variant_unit_name - - .clear - .clear %div diff --git a/app/views/spree/admin/products/new.html.haml b/app/views/spree/admin/products/new.html.haml index a716215738..d495fc170d 100644 --- a/app/views/spree/admin/products/new.html.haml +++ b/app/views/spree/admin/products/new.html.haml @@ -48,9 +48,9 @@ = f.field_container :unit_value do = f.label :unit_value, t(".value"), 'ng-disabled' => "!hasUnit(product)" %span.required * - = f.text_field :unit_value, placeholder: "eg. 2", 'ng-model' => 'product.master.unit_value_with_description', class: 'fullwidth', 'ng-disabled' => "!hasUnit(product)" - %input{ type: 'hidden', 'ng-value': 'product.master.unit_value', "ng-init": "product.master.unit_value='#{@product.unit_value}'", name: 'product[unit_value]' } - %input{ type: 'hidden', 'ng-value': 'product.master.unit_description', "ng-init": "product.master.unit_description='#{@product.unit_description}'", name: 'product[unit_description]' } + = f.text_field :unit_value, placeholder: "eg. 2", 'ng-model' => 'product.unit_value_with_description', class: 'fullwidth', 'ng-disabled' => "!hasUnit(product)" + %input{ type: 'hidden', 'ng-value': 'product.unit_value', "ng-init": "product.unit_value='#{@product.unit_value}'", name: 'product[unit_value]' } + %input{ type: 'hidden', 'ng-value': 'product.unit_description', "ng-init": "product.unit_description='#{@product.unit_description}'", name: 'product[unit_description]' } = f.error_message_on :unit_value = render 'display_as', f: f .six.columns.omega{ 'ng-show' => "product.variant_unit_with_scale == 'items'" } diff --git a/spec/javascripts/unit/admin/products/units_controller_spec.js.coffee b/spec/javascripts/unit/admin/products/units_controller_spec.js.coffee index b0e7908b02..4b65a40a24 100644 --- a/spec/javascripts/unit/admin/products/units_controller_spec.js.coffee +++ b/spec/javascripts/unit/admin/products/units_controller_spec.js.coffee @@ -41,64 +41,64 @@ describe "unitsCtrl", -> describe "interpretting unit_value_with_description", -> beforeEach -> - scope.product.master = {} + scope.product = {} describe "when a variant_unit_scale is present", -> beforeEach -> scope.product.variant_unit_scale = 1 it "splits by whitespace in to unit_value and unit_description", -> - scope.product.master.unit_value_with_description = "12 boxes" + scope.product.unit_value_with_description = "12 boxes" scope.processUnitValueWithDescription() - expect(scope.product.master.unit_value).toEqual 12 - expect(scope.product.master.unit_description).toEqual "boxes" + expect(scope.product.unit_value).toEqual 12 + expect(scope.product.unit_description).toEqual "boxes" it "uses whole string as unit_value when only numerical characters are present", -> - scope.product.master.unit_value_with_description = "12345" + scope.product.unit_value_with_description = "12345" scope.processUnitValueWithDescription() - expect(scope.product.master.unit_value).toEqual 12345 - expect(scope.product.master.unit_description).toEqual '' + expect(scope.product.unit_value).toEqual 12345 + expect(scope.product.unit_description).toEqual '' it "uses whole string as description when string does not start with a number", -> - scope.product.master.unit_value_with_description = "boxes 12" + scope.product.unit_value_with_description = "boxes 12" scope.processUnitValueWithDescription() - expect(scope.product.master.unit_value).toEqual null - expect(scope.product.master.unit_description).toEqual "boxes 12" + expect(scope.product.unit_value).toEqual null + expect(scope.product.unit_description).toEqual "boxes 12" it "does not require whitespace to split unit value and description", -> - scope.product.master.unit_value_with_description = "12boxes" + scope.product.unit_value_with_description = "12boxes" scope.processUnitValueWithDescription() - expect(scope.product.master.unit_value).toEqual 12 - expect(scope.product.master.unit_description).toEqual "boxes" + expect(scope.product.unit_value).toEqual 12 + expect(scope.product.unit_description).toEqual "boxes" it "once a whitespace occurs, all subsequent numerical characters are counted as description", -> - scope.product.master.unit_value_with_description = "123 54 boxes" + scope.product.unit_value_with_description = "123 54 boxes" scope.processUnitValueWithDescription() - expect(scope.product.master.unit_value).toEqual 123 - expect(scope.product.master.unit_description).toEqual "54 boxes" + expect(scope.product.unit_value).toEqual 123 + expect(scope.product.unit_description).toEqual "54 boxes" it "handle final point as decimal separator", -> - scope.product.master.unit_value_with_description = "22.22" + scope.product.unit_value_with_description = "22.22" scope.processUnitValueWithDescription() - expect(scope.product.master.unit_value).toEqual 22.22 - expect(scope.product.master.unit_description).toEqual "" + expect(scope.product.unit_value).toEqual 22.22 + expect(scope.product.unit_description).toEqual "" it "handle comma as decimal separator", -> - scope.product.master.unit_value_with_description = "22,22" + scope.product.unit_value_with_description = "22,22" scope.processUnitValueWithDescription() - expect(scope.product.master.unit_value).toEqual 22.22 - expect(scope.product.master.unit_description).toEqual "" - + expect(scope.product.unit_value).toEqual 22.22 + expect(scope.product.unit_description).toEqual "" + it "handle comma as decimal separator with description", -> - scope.product.master.unit_value_with_description = "22,22 things" + scope.product.unit_value_with_description = "22,22 things" scope.processUnitValueWithDescription() - expect(scope.product.master.unit_value).toEqual 22.22 - expect(scope.product.master.unit_description).toEqual "things" + expect(scope.product.unit_value).toEqual 22.22 + expect(scope.product.unit_description).toEqual "things" it "handles nice rounded division", -> # this is a bit absurd, but it assure use that bigDecimal is called window.bigDecimal.multiply.and.returnValue 0.7 - scope.product.master.unit_value_with_description = "700" + scope.product.unit_value_with_description = "700" scope.product.variant_unit_scale = 0.001 scope.processUnitValueWithDescription() - expect(scope.product.master.unit_value).toEqual 0.7 + expect(scope.product.unit_value).toEqual 0.7 diff --git a/spec/system/admin/products_spec.rb b/spec/system/admin/products_spec.rb index 37ad9c967c..9545f05733 100644 --- a/spec/system/admin/products_spec.rb +++ b/spec/system/admin/products_spec.rb @@ -50,11 +50,10 @@ RSpec.describe ' expect(page.find("#product_description", visible: false).value).to eq('