From 356a03ac4eea4e57162b90256f0c4f24239d3c57 Mon Sep 17 00:00:00 2001 From: Rohan Mitchell Date: Wed, 3 Sep 2014 17:06:17 +1000 Subject: [PATCH] WIP: Extract bulk product edit product management to BulkProducts service Conflicts: app/assets/javascripts/admin/bulk_product_update.js.coffee --- .../admin/bulk_product_update.js.coffee | 97 +++---------------- .../admin/services/bulk_products.js.coffee | 80 +++++++++++++++ 2 files changed, 93 insertions(+), 84 deletions(-) create mode 100644 app/assets/javascripts/admin/services/bulk_products.js.coffee diff --git a/app/assets/javascripts/admin/bulk_product_update.js.coffee b/app/assets/javascripts/admin/bulk_product_update.js.coffee index 417ace3d6b..9694ff761e 100644 --- a/app/assets/javascripts/admin/bulk_product_update.js.coffee +++ b/app/assets/javascripts/admin/bulk_product_update.js.coffee @@ -1,6 +1,4 @@ -angular.module("ofn.admin").controller "AdminProductEditCtrl", [ - "$scope", "$timeout", "$http", "dataFetcher", "DirtyProducts", "VariantUnitManager", "producers", "Taxons", "SpreeApiKey", - ($scope, $timeout, $http, dataFetcher, DirtyProducts, VariantUnitManager, producers, Taxons, SpreeApiKey) -> +angular.module("ofn.admin").controller "AdminProductEditCtrl", ($scope, $timeout, $http, BulkProducts, dataFetcher, DirtyProducts, VariantUnitManager, producers, Taxons, SpreeApiKey) -> $scope.loading = true $scope.updateStatusMessage = @@ -38,12 +36,13 @@ angular.module("ofn.admin").controller "AdminProductEditCtrl", [ $scope.filterTaxons = [{id: "0", name: ""}].concat $scope.taxons $scope.producerFilter = "0" $scope.categoryFilter = "0" - $scope.products = [] + $scope.products = BulkProducts.products $scope.filteredProducts = [] $scope.currentFilters = [] $scope.limit = 15 $scope.productsWithUnsavedVariants = [] $scope.query = "" + $scope.displayProperties = {} $scope.initialise = -> authorise_api_reponse = "" @@ -61,36 +60,18 @@ angular.module("ofn.admin").controller "AdminProductEditCtrl", [ $scope.$watchCollection '[query, producerFilter, categoryFilter]', -> $scope.limit = 15 # Reset limit whenever searching - $scope.fetchProducts = -> # WARNING: returns a promise + $scope.fetchProducts = -> $scope.loading = true - queryString = $scope.currentFilters.reduce (qs,f) -> - return qs + "q[#{f.property.db_column}_#{f.predicate.predicate}]=#{f.value};" - , "" - return dataFetcher("/api/products/bulk_products?page=1;per_page=20;#{queryString}").then (data) -> - $scope.resetProducts data.products + BulkProducts.fetch($scope.currentFilters).then -> + $scope.resetProducts() $scope.loading = false - if data.pages > 1 - for page in [2..data.pages] - dataFetcher("/api/products/bulk_products?page=#{page};per_page=20;#{queryString}").then (data) -> - for product in data.products - $scope.unpackProduct product - $scope.products.push product - $scope.resetProducts = (data) -> - $scope.products = data + $scope.resetProducts = -> DirtyProducts.clear() $scope.setMessage $scope.updateStatusMessage, "", {}, false - $scope.displayProperties ||= {} - angular.forEach $scope.products, (product) -> - $scope.unpackProduct product - - - $scope.unpackProduct = (product) -> - $scope.displayProperties ||= {} - $scope.displayProperties[product.id] ||= showVariants: false - #$scope.matchProducer product - $scope.loadVariantUnit product + for product in $scope.products + $scope.displayProperties[product.id] ||= showVariants: false # $scope.matchProducer = (product) -> @@ -99,37 +80,6 @@ angular.module("ofn.admin").controller "AdminProductEditCtrl", [ # product.producer = producer # break - $scope.loadVariantUnit = (product) -> - product.variant_unit_with_scale = - if product.variant_unit && product.variant_unit_scale && product.variant_unit != 'items' - "#{product.variant_unit}_#{product.variant_unit_scale}" - else if product.variant_unit - product.variant_unit - else - null - - $scope.loadVariantUnitValues product if product.variants - $scope.loadVariantUnitValue product, product.master if product.master - - $scope.loadVariantUnitValues = (product) -> - for variant in product.variants - $scope.loadVariantUnitValue product, variant - - $scope.loadVariantUnitValue = (product, variant) -> - unit_value = $scope.variantUnitValue product, variant - unit_value = if unit_value? then unit_value else '' - variant.unit_value_with_description = "#{unit_value} #{variant.unit_description || ''}".trim() - - - $scope.variantUnitValue = (product, variant) -> - if variant.unit_value? - if product.variant_unit_scale - variant.unit_value / product.variant_unit_scale - else - variant.unit_value - else - null - $scope.updateOnHand = (product) -> on_demand_variants = [] @@ -183,12 +133,6 @@ angular.module("ofn.admin").controller "AdminProductEditCtrl", [ $scope.variantIdCounter -= 1 $scope.variantIdCounter - $scope.updateVariantLists = (server_products) -> - for product in $scope.productsWithUnsavedVariants - server_product = $scope.findProduct(product.id, server_products) - product.variants = server_product.variants - $scope.loadVariantUnitValues product - $scope.deleteProduct = (product) -> if confirm("Are you sure?") $http( @@ -218,18 +162,7 @@ angular.module("ofn.admin").controller "AdminProductEditCtrl", [ $scope.cloneProduct = (product) -> - dataFetcher("/admin/products/" + product.permalink_live + "/clone.json").then (data) -> - # Ideally we would use Spree's built in respond_override helper here to redirect the - # user after a successful clone with .json in the accept headers - # However, at the time of writing there appears to be an issue which causes the - # respond_with block in the destroy action of Spree::Admin::Product to break - # when a respond_overrride for the clone action is used. - id = data.product.id - dataFetcher("/api/products/" + id + "?template=bulk_show").then (data) -> - newProduct = data - $scope.unpackProduct newProduct - $scope.products.push newProduct - + BulkProducts.cloneProduct product $scope.hasVariants = (product) -> product.variants.length > 0 @@ -270,7 +203,7 @@ angular.module("ofn.admin").controller "AdminProductEditCtrl", [ filters: $scope.currentFilters ).success((data) -> DirtyProducts.clear() - $scope.updateVariantLists(data.products) + BulkProducts.updateVariantLists(data.products, $scope.productsWithUnsavedVariants) $timeout -> $scope.displaySuccess() ).error (data, status) -> if status == 400 && data.errors? && data.errors.length > 0 @@ -304,16 +237,12 @@ angular.module("ofn.admin").controller "AdminProductEditCtrl", [ if variant.hasOwnProperty("unit_value_with_description") match = variant.unit_value_with_description.match(/^([\d\.]+(?= |$)|)( |)(.*)$/) if match - product = $scope.findProduct(product.id, $scope.products) + product = BulkProducts.find product.id variant.unit_value = parseFloat(match[1]) variant.unit_value = null if isNaN(variant.unit_value) variant.unit_value *= product.variant_unit_scale if variant.unit_value && product.variant_unit_scale variant.unit_description = match[3] - $scope.findProduct = (id, product_list) -> - products = (product for product in product_list when product.id == id) - if products.length == 0 then null else products[0] - $scope.incrementLimit = -> if $scope.limit < $scope.products.length $scope.limit = $scope.limit + 5 @@ -354,7 +283,7 @@ angular.module("ofn.admin").controller "AdminProductEditCtrl", [ , false else $scope.setMessage $scope.updateStatusMessage, "", {}, false -] + filterSubmitProducts = (productsToFilter) -> filteredProducts = [] diff --git a/app/assets/javascripts/admin/services/bulk_products.js.coffee b/app/assets/javascripts/admin/services/bulk_products.js.coffee new file mode 100644 index 0000000000..dd2e6536af --- /dev/null +++ b/app/assets/javascripts/admin/services/bulk_products.js.coffee @@ -0,0 +1,80 @@ +angular.module("ofn.admin").factory "BulkProducts", (dataFetcher) -> + new class BulkProducts + products: [] + + fetch: (filters, onComplete) -> + queryString = filters.reduce (qs,f) -> + return qs + "q[#{f.property.db_column}_#{f.predicate.predicate}]=#{f.value};" + , "" + return dataFetcher("/api/products/bulk_products?page=1;per_page=20;#{queryString}").then (data) => + @addProducts data.products + + if data.pages > 1 + for page in [2..data.pages] + dataFetcher("/api/products/bulk_products?page=#{page};per_page=20;#{queryString}").then (data) => + @addProducts data.products + + cloneProduct: (product) -> + dataFetcher("/admin/products/" + product.permalink_live + "/clone.json").then (data) => + # Ideally we would use Spree's built in respond_override helper here to redirect the + # user after a successful clone with .json in the accept headers + # However, at the time of writing there appears to be an issue which causes the + # respond_with block in the destroy action of Spree::Admin::Product to break + # when a respond_overrride for the clone action is used. + id = data.product.id + dataFetcher("/api/products/" + id + "?template=bulk_show").then (data) => + newProduct = data + @unpackProduct newProduct + @products.push newProduct + + updateVariantLists: (serverProducts, productsWithUnsavedVariants) -> + for product in productsWithUnsavedVariants + server_product = @findProductInList(product.id, serverProducts) + product.variants = server_product.variants + @loadVariantUnitValues product + + find: (id) -> + @findProductInList id, @products + + findProductInList: (id, product_list) -> + products = (product for product in product_list when product.id == id) + if products.length == 0 then null else products[0] + + addProducts: (products) -> + for product in products + @unpackProduct product + @products.push product + + unpackProduct: (product) -> + #$scope.matchProducer product + @loadVariantUnit product + + loadVariantUnit: (product) -> + product.variant_unit_with_scale = + if product.variant_unit && product.variant_unit_scale && product.variant_unit != 'items' + "#{product.variant_unit}_#{product.variant_unit_scale}" + else if product.variant_unit + product.variant_unit + else + null + + @loadVariantUnitValues product if product.variants + @loadVariantUnitValue product, product.master if product.master + + loadVariantUnitValues: (product) -> + for variant in product.variants + @loadVariantUnitValue product, variant + + loadVariantUnitValue: (product, variant) -> + unit_value = @variantUnitValue product, variant + unit_value = if unit_value? then unit_value else '' + variant.unit_value_with_description = "#{unit_value} #{variant.unit_description || ''}".trim() + + variantUnitValue: (product, variant) -> + if variant.unit_value? + if product.variant_unit_scale + variant.unit_value / product.variant_unit_scale + else + variant.unit_value + else + null