From 883cd81058d718936aae10bc36594c589914fec2 Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Mon, 11 Nov 2019 13:28:13 +0000 Subject: [PATCH 01/21] Load enterprise supplied products when the exchange products panel is opened for the first time --- .../directives/panel_ctrl.js.coffee | 2 +- ...order_cycle_exchanges_controller.js.coffee | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/admin/index_utils/directives/panel_ctrl.js.coffee b/app/assets/javascripts/admin/index_utils/directives/panel_ctrl.js.coffee index 4259ce63e2..d2e541992c 100644 --- a/app/assets/javascripts/admin/index_utils/directives/panel_ctrl.js.coffee +++ b/app/assets/javascripts/admin/index_utils/directives/panel_ctrl.js.coffee @@ -13,7 +13,7 @@ angular.module("admin.indexUtils").directive "panelCtrl", (Panels) -> this.registerSelectionListener = (callback) -> $scope.$on "selection:changed", (event, selection) -> - callback(selection) + callback(selection, $element) this diff --git a/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee b/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee index 82aea0a434..6a1646b3d2 100644 --- a/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee @@ -44,3 +44,26 @@ angular.module('admin.orderCycles') $scope.removeDistributionOfVariant = (variant_id) -> OrderCycle.removeDistributionOfVariant(variant_id) + + # Load exchange data + initPanel = (scope) -> + # TEMP Insert some dummy data into enterprise.supplied_products so that the UI keeps on working + scope.enterprises[scope.exchange.enterprise_id].supplied_products = [{id: 2, name: "asdasd" + scope.exchange.id }] + + # Register listener to capture first toggle open of the products panel + exchangeProdutsInitialized = [] + registerToggleListener = -> + panelRows = angular.element(".panel-row") + if panelRows.length == 0 + $timeout(registerToggleListener, 500) + return + + for panelRow in panelRows + panelCtrl = angular.element(panelRow).controller('panelCtrl') + panelCtrl.registerSelectionListener (selection, $element) -> + scope = $element.scope() + return if exchangeProdutsInitialized[scope.exchange.id] + initPanel(scope) + exchangeProdutsInitialized[scope.exchange.id] = true + + $timeout(registerToggleListener, 500) From 9adbdc377d765ae915a5bdcf11b76c9c775b2f56 Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Tue, 12 Nov 2019 18:16:29 +0000 Subject: [PATCH 02/21] Add new admin/exchange/products endpoint that replaces Enterprise/for_order_cycle#supplied_products --- ...order_cycle_exchanges_controller.js.coffee | 8 ++--- .../order_cycles/services/product.js.coffee | 22 +++++++++++++ .../admin/exchanges_products_controller.rb | 32 +++++++++++++++++++ config/routes/admin.rb | 4 +++ 4 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 app/assets/javascripts/admin/order_cycles/services/product.js.coffee create mode 100644 app/controllers/admin/exchanges_products_controller.rb diff --git a/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee b/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee index 6a1646b3d2..6864ff338a 100644 --- a/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee @@ -1,5 +1,5 @@ angular.module('admin.orderCycles') - .controller 'AdminOrderCycleExchangesCtrl', ($scope, $controller, $filter, $window, $location, $timeout, OrderCycle, Enterprise, EnterpriseFee, Schedules, RequestMonitor, ocInstance, StatusMessage) -> + .controller 'AdminOrderCycleExchangesCtrl', ($scope, $controller, $filter, $window, $location, $timeout, OrderCycle, Product, Enterprise, EnterpriseFee, Schedules, RequestMonitor, ocInstance, StatusMessage) -> $controller('AdminEditOrderCycleCtrl', {$scope: $scope, ocInstance: ocInstance, $location: $location}) $scope.supplier_enterprises = Enterprise.producer_enterprises @@ -46,9 +46,9 @@ angular.module('admin.orderCycles') OrderCycle.removeDistributionOfVariant(variant_id) # Load exchange data - initPanel = (scope) -> - # TEMP Insert some dummy data into enterprise.supplied_products so that the UI keeps on working - scope.enterprises[scope.exchange.enterprise_id].supplied_products = [{id: 2, name: "asdasd" + scope.exchange.id }] + initPanel = (scope) -> + Product.index {exchange_id: scope.exchange.id, enterprise_id: scope.exchange.enterprise_id}, (products) -> + scope.enterprises[scope.exchange.enterprise_id].supplied_products = products # Register listener to capture first toggle open of the products panel exchangeProdutsInitialized = [] diff --git a/app/assets/javascripts/admin/order_cycles/services/product.js.coffee b/app/assets/javascripts/admin/order_cycles/services/product.js.coffee new file mode 100644 index 0000000000..cb80606609 --- /dev/null +++ b/app/assets/javascripts/admin/order_cycles/services/product.js.coffee @@ -0,0 +1,22 @@ +angular.module('admin.orderCycles').factory('Product', ($resource) -> + Product = $resource('/admin/exchanges/:exchange_id/products.json', {}, { + 'index': + method: 'GET' + isArray: true + }) + { + Product: Product + products: {} + loaded: false + + index: (params={}, callback=null) -> + Product.index params, (data) => + @products[params.enterprise_id] = [] + for product in data + @products[params.enterprise_id].push(product) + + @loaded = true + (callback || angular.noop)(@products[params.enterprise_id]) + + this.products + }) diff --git a/app/controllers/admin/exchanges_products_controller.rb b/app/controllers/admin/exchanges_products_controller.rb new file mode 100644 index 0000000000..b0d0e1b3ac --- /dev/null +++ b/app/controllers/admin/exchanges_products_controller.rb @@ -0,0 +1,32 @@ +module Admin + class ExchangesProductsController < Spree::Admin::BaseController + def index + @exchange = Exchange.find_by_id(params[:exchange_id]) + + respond_to do |format| + format.json do + render json: exchange_products, + each_serializer: Api::Admin::ForOrderCycle::SuppliedProductSerializer, + order_cycle: @exchange.order_cycle + end + end + end + + private + + # So far, products for incoming exchanges only + def exchange_products + return [] unless @exchange.incoming + + products_for_incoming_exchange + end + + def products_for_incoming_exchange + if @exchange.order_cycle.prefers_product_selection_from_coordinator_inventory_only? + @exchange.sender.supplied_products.visible_for(@order_cycle.coordinator) + else + @exchange.sender.supplied_products + end + end + end +end diff --git a/config/routes/admin.rb b/config/routes/admin.rb index 3456248e25..310e954176 100644 --- a/config/routes/admin.rb +++ b/config/routes/admin.rb @@ -18,6 +18,10 @@ Openfoodnetwork::Application.routes.draw do end end + resources :exchanges do + resources :products, controller: 'exchanges_products' + end + resources :enterprises do collection do get :for_order_cycle From 89628c27f38ba4ba5cff8df8bc41cef9e0a5892e Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Wed, 13 Nov 2019 13:51:25 +0000 Subject: [PATCH 03/21] Move exchange products endpoint to api namespace and make it work for outgoing exchanges --- .../order_cycles/services/product.js.coffee | 2 +- .../admin/exchanges_products_controller.rb | 32 ------ .../api/exchanges_products_controller.rb | 97 +++++++++++++++++++ config/routes/admin.rb | 4 - config/routes/api.rb | 4 + .../api/exchanges_products_controller_spec.rb | 36 +++++++ 6 files changed, 138 insertions(+), 37 deletions(-) delete mode 100644 app/controllers/admin/exchanges_products_controller.rb create mode 100644 app/controllers/api/exchanges_products_controller.rb create mode 100644 spec/controllers/api/exchanges_products_controller_spec.rb diff --git a/app/assets/javascripts/admin/order_cycles/services/product.js.coffee b/app/assets/javascripts/admin/order_cycles/services/product.js.coffee index cb80606609..e13e2c5069 100644 --- a/app/assets/javascripts/admin/order_cycles/services/product.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/services/product.js.coffee @@ -1,5 +1,5 @@ angular.module('admin.orderCycles').factory('Product', ($resource) -> - Product = $resource('/admin/exchanges/:exchange_id/products.json', {}, { + Product = $resource('/api/exchanges/:exchange_id/products.json', {}, { 'index': method: 'GET' isArray: true diff --git a/app/controllers/admin/exchanges_products_controller.rb b/app/controllers/admin/exchanges_products_controller.rb deleted file mode 100644 index b0d0e1b3ac..0000000000 --- a/app/controllers/admin/exchanges_products_controller.rb +++ /dev/null @@ -1,32 +0,0 @@ -module Admin - class ExchangesProductsController < Spree::Admin::BaseController - def index - @exchange = Exchange.find_by_id(params[:exchange_id]) - - respond_to do |format| - format.json do - render json: exchange_products, - each_serializer: Api::Admin::ForOrderCycle::SuppliedProductSerializer, - order_cycle: @exchange.order_cycle - end - end - end - - private - - # So far, products for incoming exchanges only - def exchange_products - return [] unless @exchange.incoming - - products_for_incoming_exchange - end - - def products_for_incoming_exchange - if @exchange.order_cycle.prefers_product_selection_from_coordinator_inventory_only? - @exchange.sender.supplied_products.visible_for(@order_cycle.coordinator) - else - @exchange.sender.supplied_products - end - end - end -end diff --git a/app/controllers/api/exchanges_products_controller.rb b/app/controllers/api/exchanges_products_controller.rb new file mode 100644 index 0000000000..19689030b0 --- /dev/null +++ b/app/controllers/api/exchanges_products_controller.rb @@ -0,0 +1,97 @@ +module Api + class ExchangesProductsController < Api::BaseController + skip_authorization_check only: [:index] + + def index + @exchange = Exchange.find_by_id(params[:exchange_id]) + + render json: exchange_products, + each_serializer: Api::Admin::ForOrderCycle::SuppliedProductSerializer, + order_cycle: @exchange.order_cycle, + status: :ok + end + + private + + def exchange_products + if @exchange.incoming + products_for_incoming_exchange + else + products_for_outgoing_exchange + end + end + + def products_for_incoming_exchange + supplied_products(@exchange.order_cycle, @exchange.sender) + end + + def supplied_products(order_cycle, enterprise) + if order_cycle.prefers_product_selection_from_coordinator_inventory_only? + enterprise.supplied_products.visible_for(order_cycle.coordinator) + else + enterprise.supplied_products + end + end + + def products_for_outgoing_exchange + products = [] + enterprises_for_outgoing_exchange.each do |enterprise| + products.push( *supplied_products(@exchange.order_cycle, enterprise).to_a ) + + products.each do |product| + unless product_supplied_to_order_cycle?(product) + products.delete(product) + end + end + end + products + end + + def product_supplied_to_order_cycle?(product) + (product.variants.map(&:id) & incoming_exchanges_variants).any? + end + + def incoming_exchanges_variants + return @incoming_exchanges_variants if @incoming_exchanges_variants.present? + + scoped_exchanges = + OpenFoodNetwork::OrderCyclePermissions. + new(spree_current_user, @exchange.order_cycle). + visible_exchanges. + by_enterprise_name. + incoming + + @incoming_exchanges_variants = [] + scoped_exchanges.each do |exchange| + @incoming_exchanges_variants.push( + *exchange.variants.merge(visible_incoming_variants(exchange)).map(&:id).to_a + ) + end + @incoming_exchanges_variants + end + + def visible_incoming_variants(exchange) + if exchange.order_cycle.prefers_product_selection_from_coordinator_inventory_only? + permitted_incoming_variants(exchange).visible_for(exchange.order_cycle.coordinator) + else + permitted_incoming_variants(exchange) + end + end + + def permitted_incoming_variants(exchange) + OpenFoodNetwork::OrderCyclePermissions.new(spree_current_user, exchange.order_cycle). + visible_variants_for_incoming_exchanges_from(exchange.sender) + end + + def enterprises_for_outgoing_exchange + enterprises = OpenFoodNetwork::OrderCyclePermissions. + new(spree_current_user, @exchange.order_cycle) + .visible_enterprises + return enterprises if enterprises.empty? + + enterprises.includes( + supplied_products: [:supplier, :variants, master: [:images]] + ) + end + end +end diff --git a/config/routes/admin.rb b/config/routes/admin.rb index 310e954176..3456248e25 100644 --- a/config/routes/admin.rb +++ b/config/routes/admin.rb @@ -18,10 +18,6 @@ Openfoodnetwork::Application.routes.draw do end end - resources :exchanges do - resources :products, controller: 'exchanges_products' - end - resources :enterprises do collection do get :for_order_cycle diff --git a/config/routes/api.rb b/config/routes/api.rb index 34f80b7b13..50c12a9e0c 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -43,6 +43,10 @@ Openfoodnetwork::Application.routes.draw do get :properties, on: :member end + resources :exchanges do + resources :products, controller: 'exchanges_products' + end + resource :status do get :job_queue end diff --git a/spec/controllers/api/exchanges_products_controller_spec.rb b/spec/controllers/api/exchanges_products_controller_spec.rb new file mode 100644 index 0000000000..8648aadfc0 --- /dev/null +++ b/spec/controllers/api/exchanges_products_controller_spec.rb @@ -0,0 +1,36 @@ +require 'spec_helper' + +module Api + describe ExchangesProductsController, type: :controller do + include AuthenticationWorkflow + + let!(:order_cycle) { create(:order_cycle) } + let!(:coordinator) { order_cycle.coordinator } + + before do + allow(controller).to receive_messages spree_current_user: coordinator.owner + end + + describe "#index" do + describe "for incoming exchanges" do + it "loads data" do + exchange = order_cycle.exchanges.incoming.first + spree_get :index, exchange_id: exchange.id + + expect(json_response.first["supplier_name"]).to eq exchange.variants.first.product.supplier.name + end + end + + describe "for outgoing exchanges" do + it "loads data" do + exchange = order_cycle.exchanges.outgoing.first + spree_get :index, exchange_id: exchange.id + + suppliers = [exchange.variants[0].product.supplier.name, exchange.variants[1].product.supplier.name] + expect(suppliers).to include json_response.first["supplier_name"] + expect(suppliers).to include json_response.second["supplier_name"] + end + end + end + end +end From 24d7672abbda0a7fde0e92d87c6602ce5e8a848c Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Thu, 14 Nov 2019 19:26:11 +0000 Subject: [PATCH 04/21] Use new exchange products endpoint for outgoing exchanges and make the exchange products panel work for outgoing exchanges --- .../controllers/outgoing_controller.js.coffee | 3 +- .../services/order_cycle.js.coffee | 12 ------- .../exchange_distributed_products.html.haml | 2 +- .../order_cycles/_exchange_form.html.haml | 2 +- .../outgoing_controller_spec.js.coffee | 5 --- .../services/order_cycle_spec.js.coffee | 36 ------------------- 6 files changed, 3 insertions(+), 57 deletions(-) diff --git a/app/assets/javascripts/admin/order_cycles/controllers/outgoing_controller.js.coffee b/app/assets/javascripts/admin/order_cycles/controllers/outgoing_controller.js.coffee index 893666b1a5..ce5e348d05 100644 --- a/app/assets/javascripts/admin/order_cycles/controllers/outgoing_controller.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/controllers/outgoing_controller.js.coffee @@ -1,8 +1,7 @@ angular.module('admin.orderCycles').controller 'AdminOrderCycleOutgoingCtrl', ($scope, $controller, $filter, $location, OrderCycle, ocInstance, StatusMessage) -> $controller('AdminOrderCycleExchangesCtrl', {$scope: $scope, ocInstance: ocInstance, $location: $location}) - $scope.productSuppliedToOrderCycle = (product) -> - OrderCycle.productSuppliedToOrderCycle(product) + $scope.view = 'outgoing' $scope.variantSuppliedToOrderCycle = (variant) -> OrderCycle.variantSuppliedToOrderCycle(variant) diff --git a/app/assets/javascripts/admin/order_cycles/services/order_cycle.js.coffee b/app/assets/javascripts/admin/order_cycles/services/order_cycle.js.coffee index 58493d0214..98f9b81406 100644 --- a/app/assets/javascripts/admin/order_cycles/services/order_cycle.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/services/order_cycle.js.coffee @@ -71,18 +71,6 @@ angular.module('admin.orderCycles').factory 'OrderCycle', ($resource, $window, S removeExchangeFee: (exchange, index) -> exchange.enterprise_fees.splice(index, 1) - productSuppliedToOrderCycle: (product) -> - product_variant_ids = (variant.id for variant in product.variants) - variant_ids = [product.master_id].concat(product_variant_ids) - incomingExchangesVariants = this.incomingExchangesVariants() - - # TODO: This is an O(n^2) implementation of set intersection and thus is slooow. - # Use a better algorithm if needed. - # Also, incomingExchangesVariants is called every time, when it only needs to be - # called once per change to incoming variants. Some sort of caching? - ids = (variant_id for variant_id in variant_ids when incomingExchangesVariants.indexOf(variant_id) != -1) - ids.length > 0 - variantSuppliedToOrderCycle: (variant) -> this.incomingExchangesVariants().indexOf(variant.id) != -1 diff --git a/app/assets/javascripts/templates/admin/panels/exchange_distributed_products.html.haml b/app/assets/javascripts/templates/admin/panels/exchange_distributed_products.html.haml index 4253f54aae..5fe23e6826 100644 --- a/app/assets/javascripts/templates/admin/panels/exchange_distributed_products.html.haml +++ b/app/assets/javascripts/templates/admin/panels/exchange_distributed_products.html.haml @@ -11,7 +11,7 @@ .exchange-products -# Scope product list based on permissions the current user has to view variants in this exchange - .exchange-product{'ng-repeat' => 'product in supplied_products | filter:productSuppliedToOrderCycle | visibleProducts:exchange:order_cycle.visible_variants_for_outgoing_exchanges' } + .exchange-product{'ng-repeat' => 'product in enterprises[exchange.enterprise_id].supplied_products | filter:visibleProducts:exchange:order_cycle.visible_variants_for_outgoing_exchanges' } .exchange-product-details %label %img{'ng-src' => '{{ product.image_url }}'} diff --git a/app/views/admin/order_cycles/_exchange_form.html.haml b/app/views/admin/order_cycles/_exchange_form.html.haml index 6e5a2c3df1..da9cf926f9 100644 --- a/app/views/admin/order_cycles/_exchange_form.html.haml +++ b/app/views/admin/order_cycles/_exchange_form.html.haml @@ -40,5 +40,5 @@ - if type == 'distributor' %tr.panel-row{ object: "exchange", panels: "{products: 'exchange_distributed_products', tags: 'exchange_tags'}", - locals: "$index,order_cycle,exchange,supplied_products,setExchangeVariants,incomingExchangeVariantsFor,productSuppliedToOrderCycle,variantSuppliedToOrderCycle", + locals: "$index,order_cycle,exchange,enterprises,setExchangeVariants,incomingExchangeVariantsFor,variantSuppliedToOrderCycle", colspan: 5 } diff --git a/spec/javascripts/unit/admin/order_cycles/controllers/outgoing_controller_spec.js.coffee b/spec/javascripts/unit/admin/order_cycles/controllers/outgoing_controller_spec.js.coffee index 1b206bb683..c8c138b17b 100644 --- a/spec/javascripts/unit/admin/order_cycles/controllers/outgoing_controller_spec.js.coffee +++ b/spec/javascripts/unit/admin/order_cycles/controllers/outgoing_controller_spec.js.coffee @@ -14,7 +14,6 @@ describe 'AdminOrderCycleOutgoingCtrl', -> absUrl: -> 'example.com/admin/order_cycles/27/edit' OrderCycle = - productSuppliedToOrderCycle: jasmine.createSpy('productSuppliedToOrderCycle').and.returnValue('product supplied') variantSuppliedToOrderCycle: jasmine.createSpy('variantSuppliedToOrderCycle').and.returnValue('variant supplied') ocInstance = {} @@ -22,10 +21,6 @@ describe 'AdminOrderCycleOutgoingCtrl', -> inject ($controller) -> ctrl = $controller 'AdminOrderCycleOutgoingCtrl', {$scope: scope, $location: location, OrderCycle: OrderCycle, Enterprise: Enterprise, EnterpriseFee: EnterpriseFee, ocInstance: ocInstance} - it 'Delegates productSuppliedToOrderCycle to OrderCycle', -> - expect(scope.productSuppliedToOrderCycle('product')).toEqual('product supplied') - expect(OrderCycle.productSuppliedToOrderCycle).toHaveBeenCalledWith('product') - it 'Delegates variantSuppliedToOrderCycle to OrderCycle', -> expect(scope.variantSuppliedToOrderCycle('variant')).toEqual('variant supplied') expect(OrderCycle.variantSuppliedToOrderCycle).toHaveBeenCalledWith('variant') diff --git a/spec/javascripts/unit/admin/order_cycles/services/order_cycle_spec.js.coffee b/spec/javascripts/unit/admin/order_cycles/services/order_cycle_spec.js.coffee index 4570f8d545..a078ec2bf4 100644 --- a/spec/javascripts/unit/admin/order_cycles/services/order_cycle_spec.js.coffee +++ b/spec/javascripts/unit/admin/order_cycles/services/order_cycle_spec.js.coffee @@ -232,42 +232,6 @@ describe 'OrderCycle service', -> ] expect(OrderCycle.incomingExchangesVariants()).toEqual [1, 4, 5] - describe 'checking whether a product is supplied to the order cycle', -> - product_master_present = product_variant_present = product_master_absent = product_variant_absent = null - - beforeEach -> - product_master_present = - name: "Linseed (500g)" - master_id: 1 - variants: [] - product_variant_present = - name: "Linseed (500g)" - master_id: 2 - variants: [{id: 3}, {id: 4}] - product_master_absent = - name: "Linseed (500g)" - master_id: 5 - variants: [] - product_variant_absent = - name: "Linseed (500g)" - master_id: 6 - variants: [{id: 7}, {id: 8}] - - spyOn(OrderCycle, 'incomingExchangesVariants').and.returnValue([1, 3]) - - it 'returns true for products whose master is supplied', -> - expect(OrderCycle.productSuppliedToOrderCycle(product_master_present)).toBeTruthy() - - it 'returns true for products for whom a variant is supplied', -> - expect(OrderCycle.productSuppliedToOrderCycle(product_variant_present)).toBeTruthy() - - it 'returns false for products whose master is not supplied', -> - expect(OrderCycle.productSuppliedToOrderCycle(product_master_absent)).toBeFalsy() - - it 'returns false for products whose variants are not supplied', -> - expect(OrderCycle.productSuppliedToOrderCycle(product_variant_absent)).toBeFalsy() - - describe 'checking whether a variant is supplied to the order cycle', -> beforeEach -> spyOn(OrderCycle, 'incomingExchangesVariants').and.returnValue([1, 3]) From 2b3bc6d1ff00d5050de30069ef01287290bb5033 Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Mon, 11 Nov 2019 13:26:26 +0000 Subject: [PATCH 05/21] Remove supplied products from enterprise serializer and from UI side This list of products s now loaded in a specific call to ExchangeProducts and for each specific exchange --- ...order_cycle_exchanges_controller.js.coffee | 1 - .../services/enterprise.js.coffee | 4 -- .../for_order_cycle/enterprise_serializer.rb | 8 +-- ..._cycle_exchanges_controller_spec.js.coffee | 6 +- .../services/enterprise_spec.js.coffee | 24 ++++---- .../enterprise_serializer_spec.rb | 57 ------------------- 6 files changed, 12 insertions(+), 88 deletions(-) delete mode 100644 spec/serializers/api/admin/for_order_cycle/enterprise_serializer_spec.rb diff --git a/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee b/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee index 6864ff338a..bf42a58a89 100644 --- a/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee @@ -4,7 +4,6 @@ angular.module('admin.orderCycles') $scope.supplier_enterprises = Enterprise.producer_enterprises $scope.distributor_enterprises = Enterprise.hub_enterprises - $scope.supplied_products = Enterprise.supplied_products $scope.exchangeSelectedVariants = (exchange) -> OrderCycle.exchangeSelectedVariants(exchange) diff --git a/app/assets/javascripts/admin/order_cycles/services/enterprise.js.coffee b/app/assets/javascripts/admin/order_cycles/services/enterprise.js.coffee index 17f5bb385c..596b4ffa2a 100644 --- a/app/assets/javascripts/admin/order_cycles/services/enterprise.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/services/enterprise.js.coffee @@ -12,7 +12,6 @@ angular.module('admin.orderCycles').factory('Enterprise', ($resource) -> enterprises: {} producer_enterprises: [] hub_enterprises: [] - supplied_products: [] loaded: false index: (params={}, callback=null) -> @@ -22,9 +21,6 @@ angular.module('admin.orderCycles').factory('Enterprise', ($resource) -> @producer_enterprises.push(enterprise) if enterprise.is_primary_producer @hub_enterprises.push(enterprise) if enterprise.sells == 'any' - for product in enterprise.supplied_products - @supplied_products.push(product) - @loaded = true (callback || angular.noop)(@enterprises) diff --git a/app/serializers/api/admin/for_order_cycle/enterprise_serializer.rb b/app/serializers/api/admin/for_order_cycle/enterprise_serializer.rb index cdd78f5e5a..360f135680 100644 --- a/app/serializers/api/admin/for_order_cycle/enterprise_serializer.rb +++ b/app/serializers/api/admin/for_order_cycle/enterprise_serializer.rb @@ -1,7 +1,7 @@ require 'open_food_network/enterprise_issue_validator' class Api::Admin::ForOrderCycle::EnterpriseSerializer < ActiveModel::Serializer - attributes :id, :name, :managed, :supplied_products, + attributes :id, :name, :managed, :issues_summary_supplier, :issues_summary_distributor, :is_primary_producer, :is_distributor, :sells @@ -25,12 +25,6 @@ class Api::Admin::ForOrderCycle::EnterpriseSerializer < ActiveModel::Serializer Enterprise.managed_by(options[:spree_current_user]).include? object end - def supplied_products - serializer = Api::Admin::ForOrderCycle::SuppliedProductSerializer - ActiveModel::ArraySerializer.new(products, each_serializer: serializer, - order_cycle: order_cycle) - end - private def products_scope diff --git a/spec/javascripts/unit/admin/order_cycles/controllers/order_cycle_exchanges_controller_spec.js.coffee b/spec/javascripts/unit/admin/order_cycles/controllers/order_cycle_exchanges_controller_spec.js.coffee index adfa3b207c..5f136a629b 100644 --- a/spec/javascripts/unit/admin/order_cycles/controllers/order_cycle_exchanges_controller_spec.js.coffee +++ b/spec/javascripts/unit/admin/order_cycles/controllers/order_cycle_exchanges_controller_spec.js.coffee @@ -25,8 +25,7 @@ describe 'AdminOrderCycleExchangesCtrl', -> addExchangeFee: jasmine.createSpy('addExchangeFee') removeExchangeFee: jasmine.createSpy('removeExchangeFee') removeDistributionOfVariant: jasmine.createSpy('removeDistributionOfVariant') - Enterprise = - supplied_products: 'supplied products' + Enterprise = {} EnterpriseFee = forEnterprise: jasmine.createSpy('forEnterprise').and.returnValue('enterprise fees for enterprise') ocInstance = {} @@ -35,9 +34,6 @@ describe 'AdminOrderCycleExchangesCtrl', -> inject ($controller) -> ctrl = $controller 'AdminOrderCycleExchangesCtrl', {$scope: scope, $location: location, OrderCycle: OrderCycle, Enterprise: Enterprise, EnterpriseFee: EnterpriseFee, ocInstance: ocInstance} - it 'Loads supplied products', -> - expect(scope.supplied_products).toEqual('supplied products') - it 'Delegates exchangeSelectedVariants to OrderCycle', -> expect(scope.exchangeSelectedVariants('exchange')).toEqual('variants selected') expect(OrderCycle.exchangeSelectedVariants).toHaveBeenCalledWith('exchange') diff --git a/spec/javascripts/unit/admin/order_cycles/services/enterprise_spec.js.coffee b/spec/javascripts/unit/admin/order_cycles/services/enterprise_spec.js.coffee index b3a7d122de..7455d7652c 100644 --- a/spec/javascripts/unit/admin/order_cycles/services/enterprise_spec.js.coffee +++ b/spec/javascripts/unit/admin/order_cycles/services/enterprise_spec.js.coffee @@ -8,18 +8,18 @@ describe 'Enterprise service', -> Enterprise = $injector.get('Enterprise') $httpBackend = _$httpBackend_ $httpBackend.whenGET('/admin/enterprises/for_order_cycle.json').respond [ - {id: 1, name: 'One', supplied_products: [1, 2], is_primary_producer: true} - {id: 2, name: 'Two', supplied_products: [3, 4]} - {id: 3, name: 'Three', supplied_products: [5, 6], sells: 'any'} + {id: 1, name: 'One', is_primary_producer: true} + {id: 2, name: 'Two'} + {id: 3, name: 'Three', sells: 'any'} ] it 'loads enterprises as a hash', -> enterprises = Enterprise.index() $httpBackend.flush() expect(enterprises).toEqual - 1: new Enterprise.Enterprise({id: 1, name: 'One', supplied_products: [1, 2], is_primary_producer: true}) - 2: new Enterprise.Enterprise({id: 2, name: 'Two', supplied_products: [3, 4]}) - 3: new Enterprise.Enterprise({id: 3, name: 'Three', supplied_products: [5, 6], sells: 'any'}) + 1: new Enterprise.Enterprise({id: 1, name: 'One', is_primary_producer: true}) + 2: new Enterprise.Enterprise({id: 2, name: 'Two'}) + 3: new Enterprise.Enterprise({id: 3, name: 'Three', sells: 'any'}) it 'reports its loadedness', -> expect(Enterprise.loaded).toBe(false) @@ -30,22 +30,18 @@ describe 'Enterprise service', -> it 'loads producers as an array', -> Enterprise.index() $httpBackend.flush() - expect(Enterprise.producer_enterprises).toEqual [new Enterprise.Enterprise({id: 1, name: 'One', supplied_products: [1, 2], is_primary_producer: true})] + expect(Enterprise.producer_enterprises).toEqual [new Enterprise.Enterprise({id: 1, name: 'One', is_primary_producer: true})] it 'loads hubs as an array', -> Enterprise.index() $httpBackend.flush() - expect(Enterprise.hub_enterprises).toEqual [new Enterprise.Enterprise({id: 3, name: 'Three', supplied_products: [5, 6], sells: 'any'})] - - it 'collates all supplied products', -> - enterprises = Enterprise.index() - $httpBackend.flush() - expect(Enterprise.supplied_products).toEqual [1, 2, 3, 4, 5, 6] + expect(Enterprise.hub_enterprises).toEqual [new Enterprise.Enterprise({id: 3, name: 'Three', sells: 'any'})] it "finds supplied variants for an enterprise", -> spyOn(Enterprise, 'variantsOf').and.returnValue(10) - Enterprise.index() + enterprises = Enterprise.index() $httpBackend.flush() + Enterprise.enterprises[1].supplied_products = [1, 2] expect(Enterprise.suppliedVariants(1)).toEqual [10, 10] describe "finding the variants of a product", -> diff --git a/spec/serializers/api/admin/for_order_cycle/enterprise_serializer_spec.rb b/spec/serializers/api/admin/for_order_cycle/enterprise_serializer_spec.rb deleted file mode 100644 index f33f33d0a5..0000000000 --- a/spec/serializers/api/admin/for_order_cycle/enterprise_serializer_spec.rb +++ /dev/null @@ -1,57 +0,0 @@ -require "spec_helper" - -describe Api::Admin::ForOrderCycle::EnterpriseSerializer do - let(:coordinator) { create(:distributor_enterprise) } - let(:order_cycle) { double(:order_cycle, coordinator: coordinator) } - let(:enterprise) { create(:distributor_enterprise) } - - let(:non_inventory_product) { create(:simple_product, supplier: enterprise) } - let!(:non_inventory_variant) { non_inventory_product.variants.first } - - let(:inventory_product) { create(:simple_product, supplier: enterprise) } - let(:inventory_variant) { inventory_product.variants.first } - - let(:deleted_product) { create(:product, supplier: enterprise, deleted_at: 24.hours.ago ) } - let(:deleted_variant) { deleted_product.variants.first } - - let(:serialized_enterprise) do - Api::Admin::ForOrderCycle::EnterpriseSerializer.new( - enterprise.reload, # load the products that were created after the enterprise - order_cycle: order_cycle, - spree_current_user: enterprise.owner - ).to_json - end - - let!(:inventory_item1) { create(:inventory_item, enterprise: coordinator, variant: inventory_variant, visible: true) } - let!(:inventory_item2) { create(:inventory_item, enterprise: coordinator, variant: deleted_variant, visible: true) } - - context "when order cycle shows only variants in the coordinator's inventory" do - before do - allow(order_cycle).to receive(:prefers_product_selection_from_coordinator_inventory_only?) { true } - end - - describe "supplied products" do - it "renders only non-deleted variants that are in the coordinators inventory" do - expect(serialized_enterprise).to have_json_size(1).at_path 'supplied_products' - expect(serialized_enterprise).to have_json_size(1).at_path 'supplied_products/0/variants' - expect(serialized_enterprise).to be_json_eql(inventory_variant.id).at_path 'supplied_products/0/variants/0/id' - end - end - end - - context "when order cycle shows all available products" do - before do - allow(order_cycle).to receive(:prefers_product_selection_from_coordinator_inventory_only?) { false } - end - - describe "supplied products" do - it "renders variants that are not in the coordinators inventory but not variants of deleted products" do - expect(serialized_enterprise).to have_json_size(2).at_path 'supplied_products' - expect(serialized_enterprise).to have_json_size(1).at_path 'supplied_products/0/variants' - expect(serialized_enterprise).to have_json_size(1).at_path 'supplied_products/1/variants' - variant_ids = parse_json(serialized_enterprise)['supplied_products'].map{ |p| p['variants'].first['id'] } - expect(variant_ids).to include non_inventory_variant.id, inventory_variant.id - end - end - end -end From 3223bf930d48a5eb288b00cbe5bc24307f545b6c Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Mon, 11 Nov 2019 13:21:33 +0000 Subject: [PATCH 06/21] Make total number of products in exchange work again. Currently we are just loading the products from the server and count them. This can be improved easily in two ways: - we can switch this to a specific product count call to the server so that we dont load all products all the time - or we paginate the products result and fetch the total_number from the payload of the first page. --- .../controllers/incoming_controller.js.coffee | 22 +++++++++++++++++-- ...order_cycle_exchanges_controller.js.coffee | 14 ++++++++---- .../services/enterprise.js.coffee | 9 -------- .../order_cycles/_exchange_form.html.haml | 2 +- .../incoming_controller_spec.js.coffee | 19 +++++++++++----- .../services/enterprise_spec.js.coffee | 13 ----------- 6 files changed, 45 insertions(+), 34 deletions(-) diff --git a/app/assets/javascripts/admin/order_cycles/controllers/incoming_controller.js.coffee b/app/assets/javascripts/admin/order_cycles/controllers/incoming_controller.js.coffee index d3a1797643..266e03f569 100644 --- a/app/assets/javascripts/admin/order_cycles/controllers/incoming_controller.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/controllers/incoming_controller.js.coffee @@ -1,5 +1,23 @@ angular.module('admin.orderCycles').controller 'AdminOrderCycleIncomingCtrl', ($scope, $controller, $location, Enterprise, ocInstance) -> $controller('AdminOrderCycleExchangesCtrl', {$scope: $scope, ocInstance: ocInstance, $location: $location}) - $scope.enterpriseTotalVariants = (enterprise) -> - Enterprise.totalVariants(enterprise) + $scope.view = 'incoming' + + $scope.exchangeTotalVariants = (exchange) -> + return unless this.enterprises? && this.enterprises[exchange.enterprise_id]? + + enterprise = this.enterprises[exchange.enterprise_id] + return enterprise.numVariants if enterprise.numVariants? + + $scope.loadExchangeProducts(this, exchange) + return unless enterprise.supplied_products? + + enterprise.numVariants = $scope.countVariants(enterprise.supplied_products) + + $scope.countVariants = (products) -> + return 0 unless products + + numVariants = 0 + for product in products + numVariants += product.variants.length + numVariants diff --git a/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee b/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee index bf42a58a89..d439fd6089 100644 --- a/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee @@ -44,10 +44,16 @@ angular.module('admin.orderCycles') $scope.removeDistributionOfVariant = (variant_id) -> OrderCycle.removeDistributionOfVariant(variant_id) - # Load exchange data - initPanel = (scope) -> - Product.index {exchange_id: scope.exchange.id, enterprise_id: scope.exchange.enterprise_id}, (products) -> - scope.enterprises[scope.exchange.enterprise_id].supplied_products = products + # Load exchange products + $scope.loadExchangeProducts = (scope, exchange) -> + return if scope.enterprises[exchange.enterprise_id].supplied_products_fetched? + scope.enterprises[exchange.enterprise_id].supplied_products_fetched = true + + Product.index {exchange_id: exchange.id, enterprise_id: exchange.enterprise_id}, (products) -> + scope.enterprises[exchange.enterprise_id].supplied_products = products + + initPanel = (scope, exchange) -> + scope.loadExchangeProducts(scope, scope.exchange) # Register listener to capture first toggle open of the products panel exchangeProdutsInitialized = [] diff --git a/app/assets/javascripts/admin/order_cycles/services/enterprise.js.coffee b/app/assets/javascripts/admin/order_cycles/services/enterprise.js.coffee index 596b4ffa2a..96a303c4b3 100644 --- a/app/assets/javascripts/admin/order_cycles/services/enterprise.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/services/enterprise.js.coffee @@ -35,13 +35,4 @@ angular.module('admin.orderCycles').factory('Enterprise', ($resource) -> variant.id for variant in product.variants else [product.master_id] - - totalVariants: (enterprise) -> - numVariants = 0 - - if enterprise - counts = for product in enterprise.supplied_products - numVariants += if product.variants.length == 0 then 1 else product.variants.length - - numVariants }) diff --git a/app/views/admin/order_cycles/_exchange_form.html.haml b/app/views/admin/order_cycles/_exchange_form.html.haml index da9cf926f9..e844ffc6aa 100644 --- a/app/views/admin/order_cycles/_exchange_form.html.haml +++ b/app/views/admin/order_cycles/_exchange_form.html.haml @@ -3,7 +3,7 @@ %td.products.panel-toggle.text-center{ name: "products" } {{ exchangeSelectedVariants(exchange) }} / - if type == 'supplier' - {{ enterpriseTotalVariants(enterprises[exchange.enterprise_id]) }} + {{ exchangeTotalVariants(exchange) }} - else {{ (incomingExchangeVariantsFor(exchange.enterprise_id)).length }} = t('.selected') diff --git a/spec/javascripts/unit/admin/order_cycles/controllers/incoming_controller_spec.js.coffee b/spec/javascripts/unit/admin/order_cycles/controllers/incoming_controller_spec.js.coffee index 77f17eb419..45f56fe75d 100644 --- a/spec/javascripts/unit/admin/order_cycles/controllers/incoming_controller_spec.js.coffee +++ b/spec/javascripts/unit/admin/order_cycles/controllers/incoming_controller_spec.js.coffee @@ -13,14 +13,23 @@ describe 'AdminOrderCycleIncomingCtrl', -> location = absUrl: -> 'example.com/admin/order_cycles/27/edit' - Enterprise = - totalVariants: jasmine.createSpy('totalVariants').and.returnValue('variants total') ocInstance = {} module('admin.orderCycles') inject ($controller) -> ctrl = $controller 'AdminOrderCycleIncomingCtrl', {$scope: scope, $location: location, OrderCycle: OrderCycle, Enterprise: Enterprise, EnterpriseFee: EnterpriseFee, ocInstance: ocInstance} - it 'Delegates totalVariants to Enterprise', -> - expect(scope.enterpriseTotalVariants('enterprise')).toEqual('variants total') - expect(Enterprise.totalVariants).toHaveBeenCalledWith('enterprise') + it 'counts total variants in a list of products', -> + products = [ + {variants: [{}]}, + {variants: [{}]}, + {variants: [{}, {}, {}]} + ] + + expect(scope.countVariants(products)).toEqual(5) + + it 'returns zero when products list is null', -> + expect(scope.countVariants(null)).toEqual(0) + + it 'returns zero when products list is empty', -> + expect(scope.countVariants([])).toEqual(0) diff --git a/spec/javascripts/unit/admin/order_cycles/services/enterprise_spec.js.coffee b/spec/javascripts/unit/admin/order_cycles/services/enterprise_spec.js.coffee index 7455d7652c..959a9483bb 100644 --- a/spec/javascripts/unit/admin/order_cycles/services/enterprise_spec.js.coffee +++ b/spec/javascripts/unit/admin/order_cycles/services/enterprise_spec.js.coffee @@ -56,16 +56,3 @@ describe 'Enterprise service', -> master_id: 1 variants: [{id: 2}, {id: 3}] expect(Enterprise.variantsOf(p)).toEqual [2, 3] - - it 'counts total variants supplied by an enterprise', -> - enterprise = - supplied_products: [ - {variants: []}, - {variants: []}, - {variants: [{}, {}, {}]} - ] - - expect(Enterprise.totalVariants(enterprise)).toEqual(5) - - it 'returns zero when enterprise is null', -> - expect(Enterprise.totalVariants(null)).toEqual(0) From 3653b88da661f4d2901eed5bedd74cd244151765 Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Fri, 15 Nov 2019 15:55:23 +0000 Subject: [PATCH 07/21] Make exchanges_products_controller more independent of the exchange field --- .../api/exchanges_products_controller.rb | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/app/controllers/api/exchanges_products_controller.rb b/app/controllers/api/exchanges_products_controller.rb index 19689030b0..0ddf7d401b 100644 --- a/app/controllers/api/exchanges_products_controller.rb +++ b/app/controllers/api/exchanges_products_controller.rb @@ -3,26 +3,27 @@ module Api skip_authorization_check only: [:index] def index - @exchange = Exchange.find_by_id(params[:exchange_id]) + exchange = Exchange.find_by_id(params[:exchange_id]) + @order_cycle = exchange.order_cycle - render json: exchange_products, + render json: exchange_products(exchange.incoming, exchange.sender), each_serializer: Api::Admin::ForOrderCycle::SuppliedProductSerializer, - order_cycle: @exchange.order_cycle, + order_cycle: @order_cycle, status: :ok end private - def exchange_products - if @exchange.incoming - products_for_incoming_exchange + def exchange_products(incoming, enterprise) + if incoming + products_for_incoming_exchange(enterprise) else products_for_outgoing_exchange end end - def products_for_incoming_exchange - supplied_products(@exchange.order_cycle, @exchange.sender) + def products_for_incoming_exchange(enterprise) + supplied_products(@order_cycle, enterprise) end def supplied_products(order_cycle, enterprise) @@ -36,7 +37,7 @@ module Api def products_for_outgoing_exchange products = [] enterprises_for_outgoing_exchange.each do |enterprise| - products.push( *supplied_products(@exchange.order_cycle, enterprise).to_a ) + products.push( *supplied_products(@order_cycle, enterprise).to_a ) products.each do |product| unless product_supplied_to_order_cycle?(product) @@ -56,7 +57,7 @@ module Api scoped_exchanges = OpenFoodNetwork::OrderCyclePermissions. - new(spree_current_user, @exchange.order_cycle). + new(spree_current_user, @order_cycle). visible_exchanges. by_enterprise_name. incoming @@ -85,7 +86,7 @@ module Api def enterprises_for_outgoing_exchange enterprises = OpenFoodNetwork::OrderCyclePermissions. - new(spree_current_user, @exchange.order_cycle) + new(spree_current_user, @order_cycle) .visible_enterprises return enterprises if enterprises.empty? From 6b087adab8465df607a95b0c54ddad698a0c30c6 Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Fri, 15 Nov 2019 17:41:42 +0000 Subject: [PATCH 08/21] Add route to process requests to exchanges/products without exchange id This is needed when products for an exchange that is not yet saved are requested --- .../order_cycle_exchanges_controller.js.coffee | 4 +++- app/controllers/api/exchanges_products_controller.rb | 12 +++++++++++- config/routes/api.rb | 4 ++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee b/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee index d439fd6089..821bb8dc07 100644 --- a/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee @@ -49,7 +49,9 @@ angular.module('admin.orderCycles') return if scope.enterprises[exchange.enterprise_id].supplied_products_fetched? scope.enterprises[exchange.enterprise_id].supplied_products_fetched = true - Product.index {exchange_id: exchange.id, enterprise_id: exchange.enterprise_id}, (products) -> + incoming = true if $scope.view == 'incoming' + params = { exchange_id: exchange.id, enterprise_id: exchange.enterprise_id, order_cycle_id: $scope.order_cycle.id, incoming: incoming} + Product.index params, (products) -> scope.enterprises[exchange.enterprise_id].supplied_products = products initPanel = (scope, exchange) -> diff --git a/app/controllers/api/exchanges_products_controller.rb b/app/controllers/api/exchanges_products_controller.rb index 0ddf7d401b..a4b1f226c6 100644 --- a/app/controllers/api/exchanges_products_controller.rb +++ b/app/controllers/api/exchanges_products_controller.rb @@ -1,6 +1,16 @@ module Api class ExchangesProductsController < Api::BaseController - skip_authorization_check only: [:index] + skip_authorization_check only: [:index, :show] + + def show + enterprise = Enterprise.find_by_id(params[:enterprise_id]) + @order_cycle = OrderCycle.find_by_id(params[:order_cycle_id]) + + render json: exchange_products(params[:incoming], enterprise), + each_serializer: Api::Admin::ForOrderCycle::SuppliedProductSerializer, + order_cycle: @order_cycle, + status: :ok + end def index exchange = Exchange.find_by_id(params[:exchange_id]) diff --git a/config/routes/api.rb b/config/routes/api.rb index 50c12a9e0c..172ef5791a 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -43,8 +43,8 @@ Openfoodnetwork::Application.routes.draw do get :properties, on: :member end - resources :exchanges do - resources :products, controller: 'exchanges_products' + resources :exchanges, only: [:show], controller: 'exchanges_products' do + resources :products, controller: 'exchanges_products', only: [:index] end resource :status do From 66f3656bb523132784975188c82ba6bbc4147e69 Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Sat, 16 Nov 2019 17:35:36 +0000 Subject: [PATCH 09/21] Register products panel listeners after OrderCycle is loaded instead of using recurrent timeouts Also, use this same approach for the case where a new distributor or new supplier is added to the list of exchanges --- .../order_cycles/controllers/edit.js.coffee | 4 +- .../controllers/incoming_controller.js.coffee | 6 ++- ...order_cycle_exchanges_controller.js.coffee | 37 ++++++------------- .../controllers/outgoing_controller.js.coffee | 4 ++ .../services/order_cycle.js.coffee | 17 ++++++--- .../controllers/edit_spec.js.coffee | 4 +- .../incoming_controller_spec.js.coffee | 13 +++++++ ..._cycle_exchanges_controller_spec.js.coffee | 14 ------- .../outgoing_controller_spec.js.coffee | 12 ++++++ 9 files changed, 60 insertions(+), 51 deletions(-) diff --git a/app/assets/javascripts/admin/order_cycles/controllers/edit.js.coffee b/app/assets/javascripts/admin/order_cycles/controllers/edit.js.coffee index 73a6b3fcba..0730f1e0a3 100644 --- a/app/assets/javascripts/admin/order_cycles/controllers/edit.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/controllers/edit.js.coffee @@ -3,7 +3,9 @@ angular.module('admin.orderCycles') $controller('AdminOrderCycleBasicCtrl', {$scope: $scope, ocInstance: ocInstance}) order_cycle_id = $location.absUrl().match(/\/admin\/order_cycles\/(\d+)/)[1] - $scope.order_cycle = OrderCycle.load(order_cycle_id) + $scope.order_cycle = OrderCycle.load order_cycle_id, -> + $scope.exchangeListChanged() if $scope.exchangeListChanged? + $scope.enterprises = Enterprise.index(order_cycle_id: order_cycle_id) $scope.enterprise_fees = EnterpriseFee.index(order_cycle_id: order_cycle_id) diff --git a/app/assets/javascripts/admin/order_cycles/controllers/incoming_controller.js.coffee b/app/assets/javascripts/admin/order_cycles/controllers/incoming_controller.js.coffee index 266e03f569..f092dfe18c 100644 --- a/app/assets/javascripts/admin/order_cycles/controllers/incoming_controller.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/controllers/incoming_controller.js.coffee @@ -1,4 +1,4 @@ -angular.module('admin.orderCycles').controller 'AdminOrderCycleIncomingCtrl', ($scope, $controller, $location, Enterprise, ocInstance) -> +angular.module('admin.orderCycles').controller 'AdminOrderCycleIncomingCtrl', ($scope, $controller, $location, Enterprise, OrderCycle, ocInstance) -> $controller('AdminOrderCycleExchangesCtrl', {$scope: $scope, ocInstance: ocInstance, $location: $location}) $scope.view = 'incoming' @@ -21,3 +21,7 @@ angular.module('admin.orderCycles').controller 'AdminOrderCycleIncomingCtrl', ($ for product in products numVariants += product.variants.length numVariants + + $scope.addSupplier = ($event) -> + $event.preventDefault() + OrderCycle.addSupplier $scope.new_supplier_id, $scope.exchangeListChanged diff --git a/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee b/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee index 821bb8dc07..b3e2690732 100644 --- a/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee @@ -1,5 +1,5 @@ angular.module('admin.orderCycles') - .controller 'AdminOrderCycleExchangesCtrl', ($scope, $controller, $filter, $window, $location, $timeout, OrderCycle, Product, Enterprise, EnterpriseFee, Schedules, RequestMonitor, ocInstance, StatusMessage) -> + .controller 'AdminOrderCycleExchangesCtrl', ($scope, $controller, $filter, $window, $location, OrderCycle, Product, Enterprise, EnterpriseFee, Schedules, RequestMonitor, ocInstance, StatusMessage) -> $controller('AdminEditOrderCycleCtrl', {$scope: $scope, ocInstance: ocInstance, $location: $location}) $scope.supplier_enterprises = Enterprise.producer_enterprises @@ -28,14 +28,6 @@ angular.module('admin.orderCycles') OrderCycle.removeExchangeFee(exchange, index) $scope.order_cycle_form.$dirty = true - $scope.addSupplier = ($event) -> - $event.preventDefault() - OrderCycle.addSupplier($scope.new_supplier_id) - - $scope.addDistributor = ($event) -> - $event.preventDefault() - OrderCycle.addDistributor($scope.new_distributor_id) - $scope.setPickupTimeFieldDirty = (index) -> $timeout -> pickup_time_field_name = "order_cycle_outgoing_exchange_" + index + "_pickup_time" @@ -44,7 +36,6 @@ angular.module('admin.orderCycles') $scope.removeDistributionOfVariant = (variant_id) -> OrderCycle.removeDistributionOfVariant(variant_id) - # Load exchange products $scope.loadExchangeProducts = (scope, exchange) -> return if scope.enterprises[exchange.enterprise_id].supplied_products_fetched? scope.enterprises[exchange.enterprise_id].supplied_products_fetched = true @@ -54,23 +45,17 @@ angular.module('admin.orderCycles') Product.index params, (products) -> scope.enterprises[exchange.enterprise_id].supplied_products = products - initPanel = (scope, exchange) -> - scope.loadExchangeProducts(scope, scope.exchange) - - # Register listener to capture first toggle open of the products panel - exchangeProdutsInitialized = [] - registerToggleListener = -> + # Register listeners to capture first toggle open of the products panel of the exchange + $scope.exchangeListChanged = -> panelRows = angular.element(".panel-row") - if panelRows.length == 0 - $timeout(registerToggleListener, 500) - return - for panelRow in panelRows panelCtrl = angular.element(panelRow).controller('panelCtrl') - panelCtrl.registerSelectionListener (selection, $element) -> - scope = $element.scope() - return if exchangeProdutsInitialized[scope.exchange.id] - initPanel(scope) - exchangeProdutsInitialized[scope.exchange.id] = true + panelCtrl.registerSelectionListener($scope.initializeExchangeProductsPanel) - $timeout(registerToggleListener, 500) + # initialize exchange products panel if not yet done + $scope.exchangeProdutsPanelInitialized = [] + $scope.initializeExchangeProductsPanel = (selection, $element) -> + scope = $element.scope() + return if $scope.exchangeProdutsPanelInitialized[scope.exchange.enterprise_id] + $scope.loadExchangeProducts(scope, scope.exchange) + $scope.exchangeProdutsPanelInitialized[scope.exchange.enterprise_id] = true diff --git a/app/assets/javascripts/admin/order_cycles/controllers/outgoing_controller.js.coffee b/app/assets/javascripts/admin/order_cycles/controllers/outgoing_controller.js.coffee index ce5e348d05..e7f193de47 100644 --- a/app/assets/javascripts/admin/order_cycles/controllers/outgoing_controller.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/controllers/outgoing_controller.js.coffee @@ -9,6 +9,10 @@ angular.module('admin.orderCycles').controller 'AdminOrderCycleOutgoingCtrl', ($ $scope.incomingExchangeVariantsFor = (enterprise_id) -> $filter('filterExchangeVariants')(OrderCycle.incomingExchangesVariants(), $scope.order_cycle.visible_variants_for_outgoing_exchanges[enterprise_id]) + $scope.addDistributor = ($event) -> + $event.preventDefault() + OrderCycle.addDistributor $scope.new_distributor_id, $scope.exchangeListChanged + $scope.submit = ($event, destination) -> $event.preventDefault() StatusMessage.display 'progress', t('js.saving') diff --git a/app/assets/javascripts/admin/order_cycles/services/order_cycle.js.coffee b/app/assets/javascripts/admin/order_cycles/services/order_cycle.js.coffee index 98f9b81406..c3b5ec9b51 100644 --- a/app/assets/javascripts/admin/order_cycles/services/order_cycle.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/services/order_cycle.js.coffee @@ -1,4 +1,4 @@ -angular.module('admin.orderCycles').factory 'OrderCycle', ($resource, $window, StatusMessage, Panels) -> +angular.module('admin.orderCycles').factory 'OrderCycle', ($resource, $window, $timeout, StatusMessage, Panels) -> OrderCycleResource = $resource '/admin/order_cycles/:action_name/:order_cycle_id.json', {}, { 'index': { method: 'GET', isArray: true} 'new' : { method: 'GET', params: { action_name: "new" } } @@ -44,11 +44,15 @@ angular.module('admin.orderCycles').factory 'OrderCycle', ($resource, $window, S @removeDistributionOfVariant(variant.id) if exchange.incoming - addSupplier: (new_supplier_id) -> - this.order_cycle.incoming_exchanges.push({enterprise_id: new_supplier_id, incoming: true, active: true, variants: {}, enterprise_fees: []}) + addSupplier: (new_supplier_id, callback) -> + this.order_cycle.incoming_exchanges.push({enterprise_id: new_supplier_id, incoming: true, active: true, variants: {}, enterprise_fees: []}) + $timeout -> + callback() - addDistributor: (new_distributor_id) -> - this.order_cycle.outgoing_exchanges.push({enterprise_id: new_distributor_id, incoming: false, active: true, variants: {}, enterprise_fees: []}) + addDistributor: (new_distributor_id, callback) -> + this.order_cycle.outgoing_exchanges.push({ enterprise_id: new_distributor_id, incoming: false, active: true, variants: {}, enterprise_fees: [] }) + $timeout -> + callback() removeExchange: (exchange) -> if exchange.incoming @@ -131,7 +135,8 @@ angular.module('admin.orderCycles').factory 'OrderCycle', ($resource, $window, S delete(service.order_cycle.exchanges) service.loaded = true - (callback || angular.noop)(service.order_cycle) + $timeout -> + (callback || angular.noop)(service.order_cycle) this.order_cycle diff --git a/spec/javascripts/unit/admin/order_cycles/controllers/edit_spec.js.coffee b/spec/javascripts/unit/admin/order_cycles/controllers/edit_spec.js.coffee index 2e762a17c9..8258dd248a 100644 --- a/spec/javascripts/unit/admin/order_cycles/controllers/edit_spec.js.coffee +++ b/spec/javascripts/unit/admin/order_cycles/controllers/edit_spec.js.coffee @@ -11,6 +11,7 @@ describe 'AdminEditOrderCycleCtrl', -> scope = order_cycle_form: jasmine.createSpyObj('order_cycle_form', ['$dirty', '$setPristine']) $watch: jasmine.createSpy('$watch') + exchangeListChanged: jasmine.createSpy('exchangeListChanged') event = preventDefault: jasmine.createSpy('preventDefault') location = @@ -38,9 +39,6 @@ describe 'AdminEditOrderCycleCtrl', -> expect(EnterpriseFee.index).toHaveBeenCalled() expect(scope.enterprise_fees).toEqual('enterprise fees list') - it 'Loads order cycles', -> - expect(OrderCycle.load).toHaveBeenCalledWith('27') - it 'Removes coordinator fees', -> scope.removeCoordinatorFee(event, 0) expect(event.preventDefault).toHaveBeenCalled() diff --git a/spec/javascripts/unit/admin/order_cycles/controllers/incoming_controller_spec.js.coffee b/spec/javascripts/unit/admin/order_cycles/controllers/incoming_controller_spec.js.coffee index 45f56fe75d..0543dfd2ac 100644 --- a/spec/javascripts/unit/admin/order_cycles/controllers/incoming_controller_spec.js.coffee +++ b/spec/javascripts/unit/admin/order_cycles/controllers/incoming_controller_spec.js.coffee @@ -10,9 +10,14 @@ describe 'AdminOrderCycleIncomingCtrl', -> beforeEach -> scope = $watch: jasmine.createSpy('$watch') + exchangeListChanged: jasmine.createSpy('exchangeListChanged') location = absUrl: -> 'example.com/admin/order_cycles/27/edit' + event = + preventDefault: jasmine.createSpy('preventDefault') + OrderCycle = + addSupplier: jasmine.createSpy('addSupplier') ocInstance = {} module('admin.orderCycles') @@ -33,3 +38,11 @@ describe 'AdminOrderCycleIncomingCtrl', -> it 'returns zero when products list is empty', -> expect(scope.countVariants([])).toEqual(0) + + it 'adds order cycle suppliers', -> + scope.new_supplier_id = 'new supplier id' + + scope.addSupplier(event) + + expect(event.preventDefault).toHaveBeenCalled() + expect(OrderCycle.addSupplier).toHaveBeenCalledWith('new supplier id', scope.exchangeListChanged) diff --git a/spec/javascripts/unit/admin/order_cycles/controllers/order_cycle_exchanges_controller_spec.js.coffee b/spec/javascripts/unit/admin/order_cycles/controllers/order_cycle_exchanges_controller_spec.js.coffee index 5f136a629b..f0e348ea31 100644 --- a/spec/javascripts/unit/admin/order_cycles/controllers/order_cycle_exchanges_controller_spec.js.coffee +++ b/spec/javascripts/unit/admin/order_cycles/controllers/order_cycle_exchanges_controller_spec.js.coffee @@ -19,8 +19,6 @@ describe 'AdminOrderCycleExchangesCtrl', -> OrderCycle = exchangeSelectedVariants: jasmine.createSpy('exchangeSelectedVariants').and.returnValue('variants selected') exchangeDirection: jasmine.createSpy('exchangeDirection').and.returnValue('exchange direction') - addSupplier: jasmine.createSpy('addSupplier') - addDistributor: jasmine.createSpy('addDistributor') removeExchange: jasmine.createSpy('removeExchange') addExchangeFee: jasmine.createSpy('addExchangeFee') removeExchangeFee: jasmine.createSpy('removeExchangeFee') @@ -73,18 +71,6 @@ describe 'AdminOrderCycleExchangesCtrl', -> expect(OrderCycle.removeExchangeFee).toHaveBeenCalledWith('exchange', 0) expect(scope.order_cycle_form.$dirty).toEqual true - it 'Adds order cycle suppliers', -> - scope.new_supplier_id = 'new supplier id' - scope.addSupplier(event) - expect(event.preventDefault).toHaveBeenCalled() - expect(OrderCycle.addSupplier).toHaveBeenCalledWith('new supplier id') - - it 'Adds order cycle distributors', -> - scope.new_distributor_id = 'new distributor id' - scope.addDistributor(event) - expect(event.preventDefault).toHaveBeenCalled() - expect(OrderCycle.addDistributor).toHaveBeenCalledWith('new distributor id') - it 'Removes distribution of a variant', -> scope.removeDistributionOfVariant('variant') expect(OrderCycle.removeDistributionOfVariant).toHaveBeenCalledWith('variant') diff --git a/spec/javascripts/unit/admin/order_cycles/controllers/outgoing_controller_spec.js.coffee b/spec/javascripts/unit/admin/order_cycles/controllers/outgoing_controller_spec.js.coffee index c8c138b17b..880ec2d928 100644 --- a/spec/javascripts/unit/admin/order_cycles/controllers/outgoing_controller_spec.js.coffee +++ b/spec/javascripts/unit/admin/order_cycles/controllers/outgoing_controller_spec.js.coffee @@ -10,11 +10,15 @@ describe 'AdminOrderCycleOutgoingCtrl', -> beforeEach -> scope = $watch: jasmine.createSpy('$watch') + exchangeListChanged: jasmine.createSpy('exchangeListChanged') location = absUrl: -> 'example.com/admin/order_cycles/27/edit' + event = + preventDefault: jasmine.createSpy('preventDefault') OrderCycle = variantSuppliedToOrderCycle: jasmine.createSpy('variantSuppliedToOrderCycle').and.returnValue('variant supplied') + addDistributor: jasmine.createSpy('addDistributor') ocInstance = {} module('admin.orderCycles') @@ -24,3 +28,11 @@ describe 'AdminOrderCycleOutgoingCtrl', -> it 'Delegates variantSuppliedToOrderCycle to OrderCycle', -> expect(scope.variantSuppliedToOrderCycle('variant')).toEqual('variant supplied') expect(OrderCycle.variantSuppliedToOrderCycle).toHaveBeenCalledWith('variant') + + it 'Adds order cycle distributors', -> + scope.new_distributor_id = 'new distributor id' + + scope.addDistributor(event) + + expect(event.preventDefault).toHaveBeenCalled() + expect(OrderCycle.addDistributor).toHaveBeenCalledWith('new distributor id', scope.exchangeListChanged) From 79b24606646db98b840d0ab29c11c52bcb6d991b Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Sat, 16 Nov 2019 23:05:47 +0000 Subject: [PATCH 10/21] Make simple create and edit OC load exchange products on init Simple create makes a new type of call to exchange products with no exchange_id and no prder_cycle_id, it simply lists supplied products for a given enterprise --- .../controllers/simple_create.js.coffee | 26 +++++++++---- .../controllers/simple_edit.js.coffee | 8 +++- .../services/order_cycle.js.coffee | 4 +- .../api/exchanges_products_controller.rb | 17 +++++--- .../supplied_product_serializer.rb | 2 +- .../controllers/simple_create_spec.js.coffee | 39 +++++++++++++------ 6 files changed, 67 insertions(+), 29 deletions(-) diff --git a/app/assets/javascripts/admin/order_cycles/controllers/simple_create.js.coffee b/app/assets/javascripts/admin/order_cycles/controllers/simple_create.js.coffee index 545b35e97b..dbb47aac11 100644 --- a/app/assets/javascripts/admin/order_cycles/controllers/simple_create.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/controllers/simple_create.js.coffee @@ -1,23 +1,33 @@ -angular.module('admin.orderCycles').controller "AdminSimpleCreateOrderCycleCtrl", ($scope, $controller, $window, OrderCycle, Enterprise, EnterpriseFee, StatusMessage, Schedules, RequestMonitor, ocInstance) -> +angular.module('admin.orderCycles').controller "AdminSimpleCreateOrderCycleCtrl", ($scope, $controller, $window, OrderCycle, Enterprise, EnterpriseFee, Product, StatusMessage, Schedules, RequestMonitor, ocInstance) -> $controller('AdminOrderCycleBasicCtrl', {$scope: $scope, ocInstance: ocInstance}) $scope.order_cycle = OrderCycle.new {coordinator_id: ocInstance.coordinator_id}, => - # TODO: make this a get method, which only fetches one enterprise $scope.enterprises = Enterprise.index {coordinator_id: ocInstance.coordinator_id}, (enterprises) => $scope.init(enterprises) $scope.enterprise_fees = EnterpriseFee.index(coordinator_id: ocInstance.coordinator_id) $scope.init = (enterprises) -> enterprise = enterprises[Object.keys(enterprises)[0]] - OrderCycle.addSupplier enterprise.id - OrderCycle.addDistributor enterprise.id + OrderCycle.order_cycle.coordinator_id = enterprise.id + + OrderCycle.addDistributor enterprise.id, $scope.setOutgoingExchange + OrderCycle.addSupplier enterprise.id, $scope.loadExchangeProducts + + $scope.setOutgoingExchange = -> $scope.outgoing_exchange = OrderCycle.order_cycle.outgoing_exchanges[0] - # All variants start as checked - OrderCycle.setExchangeVariants(OrderCycle.order_cycle.incoming_exchanges[0], - Enterprise.suppliedVariants(enterprise.id), true) + $scope.loadExchangeProducts = -> + $scope.incoming_exchange = OrderCycle.order_cycle.incoming_exchanges[0] - OrderCycle.order_cycle.coordinator_id = enterprise.id + params = { enterprise_id: $scope.incoming_exchange.enterprise_id, incoming: true } + Product.index params, $scope.storeProductsAndSelectAllVariants + + $scope.storeProductsAndSelectAllVariants = (products) -> + $scope.enterprises[$scope.incoming_exchange.enterprise_id].supplied_products = products + + # All variants start as checked + OrderCycle.setExchangeVariants($scope.incoming_exchange, + Enterprise.suppliedVariants($scope.incoming_exchange.enterprise_id), true) $scope.removeDistributionOfVariant = angular.noop diff --git a/app/assets/javascripts/admin/order_cycles/controllers/simple_edit.js.coffee b/app/assets/javascripts/admin/order_cycles/controllers/simple_edit.js.coffee index 29cefaceed..2507524591 100644 --- a/app/assets/javascripts/admin/order_cycles/controllers/simple_edit.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/controllers/simple_edit.js.coffee @@ -1,4 +1,4 @@ -angular.module('admin.orderCycles').controller "AdminSimpleEditOrderCycleCtrl", ($scope, $controller, $location, $window, OrderCycle, Enterprise, EnterpriseFee, Schedules, RequestMonitor, StatusMessage, ocInstance) -> +angular.module('admin.orderCycles').controller "AdminSimpleEditOrderCycleCtrl", ($scope, $controller, $location, $window, OrderCycle, Enterprise, EnterpriseFee, Product, Schedules, RequestMonitor, StatusMessage, ocInstance) -> $controller('AdminOrderCycleBasicCtrl', {$scope: $scope, ocInstance: ocInstance}) $scope.orderCycleId = -> @@ -11,6 +11,12 @@ angular.module('admin.orderCycles').controller "AdminSimpleEditOrderCycleCtrl", $scope.init = -> $scope.outgoing_exchange = OrderCycle.order_cycle.outgoing_exchanges[0] + $scope.loadExchangeProducts() + + $scope.loadExchangeProducts = -> + exchange = OrderCycle.order_cycle.incoming_exchanges[0] + Product.index { exchange_id: exchange.id }, (products) -> + $scope.enterprises[exchange.enterprise_id].supplied_products = products $scope.removeDistributionOfVariant = angular.noop diff --git a/app/assets/javascripts/admin/order_cycles/services/order_cycle.js.coffee b/app/assets/javascripts/admin/order_cycles/services/order_cycle.js.coffee index c3b5ec9b51..d811984fb8 100644 --- a/app/assets/javascripts/admin/order_cycles/services/order_cycle.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/services/order_cycle.js.coffee @@ -47,12 +47,12 @@ angular.module('admin.orderCycles').factory 'OrderCycle', ($resource, $window, $ addSupplier: (new_supplier_id, callback) -> this.order_cycle.incoming_exchanges.push({enterprise_id: new_supplier_id, incoming: true, active: true, variants: {}, enterprise_fees: []}) $timeout -> - callback() + (callback || angular.noop)() addDistributor: (new_distributor_id, callback) -> this.order_cycle.outgoing_exchanges.push({ enterprise_id: new_distributor_id, incoming: false, active: true, variants: {}, enterprise_fees: [] }) $timeout -> - callback() + (callback || angular.noop)() removeExchange: (exchange) -> if exchange.incoming diff --git a/app/controllers/api/exchanges_products_controller.rb b/app/controllers/api/exchanges_products_controller.rb index a4b1f226c6..81ab36d095 100644 --- a/app/controllers/api/exchanges_products_controller.rb +++ b/app/controllers/api/exchanges_products_controller.rb @@ -4,7 +4,12 @@ module Api def show enterprise = Enterprise.find_by_id(params[:enterprise_id]) - @order_cycle = OrderCycle.find_by_id(params[:order_cycle_id]) + + if params[:order_cycle_id] + @order_cycle = OrderCycle.find_by_id(params[:order_cycle_id]) + elsif !params[:incoming] + raise "order_cycle_id is required to list products for new outgoing exchange" + end render json: exchange_products(params[:incoming], enterprise), each_serializer: Api::Admin::ForOrderCycle::SuppliedProductSerializer, @@ -33,12 +38,12 @@ module Api end def products_for_incoming_exchange(enterprise) - supplied_products(@order_cycle, enterprise) + supplied_products(enterprise) end - def supplied_products(order_cycle, enterprise) - if order_cycle.prefers_product_selection_from_coordinator_inventory_only? - enterprise.supplied_products.visible_for(order_cycle.coordinator) + def supplied_products(enterprise) + if @order_cycle.present? && @order_cycle.prefers_product_selection_from_coordinator_inventory_only? + enterprise.supplied_products.visible_for(@order_cycle.coordinator) else enterprise.supplied_products end @@ -47,7 +52,7 @@ module Api def products_for_outgoing_exchange products = [] enterprises_for_outgoing_exchange.each do |enterprise| - products.push( *supplied_products(@order_cycle, enterprise).to_a ) + products.push( *supplied_products(enterprise).to_a ) products.each do |product| unless product_supplied_to_order_cycle?(product) diff --git a/app/serializers/api/admin/for_order_cycle/supplied_product_serializer.rb b/app/serializers/api/admin/for_order_cycle/supplied_product_serializer.rb index 8ed387dd2e..ed12ca1c1b 100644 --- a/app/serializers/api/admin/for_order_cycle/supplied_product_serializer.rb +++ b/app/serializers/api/admin/for_order_cycle/supplied_product_serializer.rb @@ -14,7 +14,7 @@ class Api::Admin::ForOrderCycle::SuppliedProductSerializer < ActiveModel::Serial end def variants - variants = if order_cycle.prefers_product_selection_from_coordinator_inventory_only? + variants = if order_cycle.present? && order_cycle.prefers_product_selection_from_coordinator_inventory_only? object.variants.visible_for(order_cycle.coordinator) else object.variants diff --git a/spec/javascripts/unit/admin/order_cycles/controllers/simple_create_spec.js.coffee b/spec/javascripts/unit/admin/order_cycles/controllers/simple_create_spec.js.coffee index 70508bc519..e28c8d5f58 100644 --- a/spec/javascripts/unit/admin/order_cycles/controllers/simple_create_spec.js.coffee +++ b/spec/javascripts/unit/admin/order_cycles/controllers/simple_create_spec.js.coffee @@ -1,8 +1,9 @@ describe "AdminSimpleCreateOrderCycleCtrl", -> ctrl = null - scope = {} + scope = null OrderCycle = {} Enterprise = {} + Product = {} EnterpriseFee = {} incoming_exchange = {} outgoing_exchange = {} @@ -10,27 +11,32 @@ describe "AdminSimpleCreateOrderCycleCtrl", -> beforeEach -> scope = $watch: jasmine.createSpy('$watch') + setOutgoingExchange: jasmine.createSpy('setOutgoingExchange') + loadExchangeProducts: jasmine.createSpy('loadExchangeProducts') + storeProductsAndSelectAllVariants: jasmine.createSpy('storeProductsAndSelectAllVariants') order_cycle = coordinator_id: 123 incoming_exchanges: [incoming_exchange] outgoing_exchanges: [outgoing_exchange] OrderCycle = order_cycle: order_cycle - addSupplier: jasmine.createSpy() - addDistributor: jasmine.createSpy() - setExchangeVariants: jasmine.createSpy() + addSupplier: jasmine.createSpy('addSupplier') + addDistributor: jasmine.createSpy('addDistributor') + setExchangeVariants: jasmine.createSpy('setExchangeVariants') new: jasmine.createSpy().and.returnValue order_cycle Enterprise = get: jasmine.createSpy().and.returnValue {id: 123} index: jasmine.createSpy() suppliedVariants: jasmine.createSpy().and.returnValue('supplied variants') + Product = + index: jasmine.createSpy() EnterpriseFee = index: jasmine.createSpy() ocInstance = {} module('admin.orderCycles') inject ($controller) -> - ctrl = $controller 'AdminSimpleCreateOrderCycleCtrl', {$scope: scope, OrderCycle: OrderCycle, Enterprise: Enterprise, EnterpriseFee: EnterpriseFee, ocInstance: ocInstance} + ctrl = $controller 'AdminSimpleCreateOrderCycleCtrl', {$scope: scope, OrderCycle: OrderCycle, Enterprise: Enterprise, EnterpriseFee: EnterpriseFee, Product: Product, ocInstance: ocInstance} describe "initialisation", -> enterprise = {id: 123} @@ -39,15 +45,26 @@ describe "AdminSimpleCreateOrderCycleCtrl", -> beforeEach -> scope.init(enterprises) - it "sets up an incoming and outgoing exchange", -> - expect(OrderCycle.addSupplier).toHaveBeenCalledWith(enterprise.id) - expect(OrderCycle.addDistributor).toHaveBeenCalledWith(enterprise.id) - expect(scope.outgoing_exchange).toEqual outgoing_exchange + it "adds enterprise as both the supplier and the distributor", -> + expect(OrderCycle.addSupplier).toHaveBeenCalledWith(enterprise.id, scope.loadExchangeProducts) + expect(OrderCycle.addDistributor).toHaveBeenCalledWith(enterprise.id, scope.setOutgoingExchange) + + it "loads exchange products", -> + incoming_exchange.enterprise_id = enterprise.id + + scope.loadExchangeProducts() + + expect(Product.index).toHaveBeenCalledWith({ enterprise_id: enterprise.id, incoming: true }, scope.storeProductsAndSelectAllVariants) + + it "stores products and selects all variants", -> + scope.incoming_exchange = incoming_exchange + incoming_exchange.enterprise_id = enterprise.id + scope.enterprises = { "#{enterprise.id}": {}} + + scope.storeProductsAndSelectAllVariants() - it "selects all variants", -> expect(Enterprise.suppliedVariants). toHaveBeenCalledWith(enterprise.id) - expect(OrderCycle.setExchangeVariants). toHaveBeenCalledWith(incoming_exchange, 'supplied variants', true) From 62e6f09d94ccda9a5c212e3c99daf944fc413595 Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Sun, 17 Nov 2019 18:51:03 +0000 Subject: [PATCH 11/21] Make exchange products more simple --- .../api/exchanges_products_controller.rb | 75 ++++++++++++------- 1 file changed, 48 insertions(+), 27 deletions(-) diff --git a/app/controllers/api/exchanges_products_controller.rb b/app/controllers/api/exchanges_products_controller.rb index 81ab36d095..cc8ce4c5e5 100644 --- a/app/controllers/api/exchanges_products_controller.rb +++ b/app/controllers/api/exchanges_products_controller.rb @@ -2,33 +2,52 @@ module Api class ExchangesProductsController < Api::BaseController skip_authorization_check only: [:index, :show] + # Lists products for an Enterprise in an Order Cycle + # This is the same as index below but when the Exchange doesn't exist yet + # + # Parameters are: enterprise_id, order_cycle_id and incoming + # order_cycle_id is optional if for incoming def show - enterprise = Enterprise.find_by_id(params[:enterprise_id]) + load_data_from_params + + render_products + end + + # Lists products in an Exchange + def index + load_data_from_exchange + + render_products + end + + private + + def render_products + render json: exchange_products(@incoming, @enterprise), + each_serializer: Api::Admin::ForOrderCycle::SuppliedProductSerializer, + order_cycle: @order_cycle, + status: :ok + end + + def load_data_from_exchange + exchange = Exchange.find_by_id(params[:exchange_id]) + + @order_cycle = exchange.order_cycle + @incoming = exchange.incoming + @enterprise = exchange.sender + end + + def load_data_from_params + @enterprise = Enterprise.find_by_id(params[:enterprise_id]) if params[:order_cycle_id] @order_cycle = OrderCycle.find_by_id(params[:order_cycle_id]) elsif !params[:incoming] raise "order_cycle_id is required to list products for new outgoing exchange" end - - render json: exchange_products(params[:incoming], enterprise), - each_serializer: Api::Admin::ForOrderCycle::SuppliedProductSerializer, - order_cycle: @order_cycle, - status: :ok + @incoming = params[:incoming] end - def index - exchange = Exchange.find_by_id(params[:exchange_id]) - @order_cycle = exchange.order_cycle - - render json: exchange_products(exchange.incoming, exchange.sender), - each_serializer: Api::Admin::ForOrderCycle::SuppliedProductSerializer, - order_cycle: @order_cycle, - status: :ok - end - - private - def exchange_products(incoming, enterprise) if incoming products_for_incoming_exchange(enterprise) @@ -42,7 +61,8 @@ module Api end def supplied_products(enterprise) - if @order_cycle.present? && @order_cycle.prefers_product_selection_from_coordinator_inventory_only? + if @order_cycle.present? && + @order_cycle.prefers_product_selection_from_coordinator_inventory_only? enterprise.supplied_products.visible_for(@order_cycle.coordinator) else enterprise.supplied_products @@ -70,15 +90,8 @@ module Api def incoming_exchanges_variants return @incoming_exchanges_variants if @incoming_exchanges_variants.present? - scoped_exchanges = - OpenFoodNetwork::OrderCyclePermissions. - new(spree_current_user, @order_cycle). - visible_exchanges. - by_enterprise_name. - incoming - @incoming_exchanges_variants = [] - scoped_exchanges.each do |exchange| + visible_incoming_exchanges.each do |exchange| @incoming_exchanges_variants.push( *exchange.variants.merge(visible_incoming_variants(exchange)).map(&:id).to_a ) @@ -86,6 +99,14 @@ module Api @incoming_exchanges_variants end + def visible_incoming_exchanges + OpenFoodNetwork::OrderCyclePermissions. + new(spree_current_user, @order_cycle). + visible_exchanges. + by_enterprise_name. + incoming + end + def visible_incoming_variants(exchange) if exchange.order_cycle.prefers_product_selection_from_coordinator_inventory_only? permitted_incoming_variants(exchange).visible_for(exchange.order_cycle.coordinator) From 197fb365245cc7fbbc8dfdc914eb2fb3963a8720 Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Sun, 17 Nov 2019 19:26:25 +0000 Subject: [PATCH 12/21] Extract ExchangeProductsRenderer from ExchangesProductsController --- .../api/exchanges_products_controller.rb | 89 +----------------- app/services/exchange_products_renderer.rb | 91 +++++++++++++++++++ 2 files changed, 96 insertions(+), 84 deletions(-) create mode 100644 app/services/exchange_products_renderer.rb diff --git a/app/controllers/api/exchanges_products_controller.rb b/app/controllers/api/exchanges_products_controller.rb index cc8ce4c5e5..6c9e29ca89 100644 --- a/app/controllers/api/exchanges_products_controller.rb +++ b/app/controllers/api/exchanges_products_controller.rb @@ -23,7 +23,11 @@ module Api private def render_products - render json: exchange_products(@incoming, @enterprise), + products = ExchangeProductsRenderer. + new(@order_cycle, spree_current_user). + exchange_products(@incoming, @enterprise) + + render json: products, each_serializer: Api::Admin::ForOrderCycle::SuppliedProductSerializer, order_cycle: @order_cycle, status: :ok @@ -47,88 +51,5 @@ module Api end @incoming = params[:incoming] end - - def exchange_products(incoming, enterprise) - if incoming - products_for_incoming_exchange(enterprise) - else - products_for_outgoing_exchange - end - end - - def products_for_incoming_exchange(enterprise) - supplied_products(enterprise) - end - - def supplied_products(enterprise) - if @order_cycle.present? && - @order_cycle.prefers_product_selection_from_coordinator_inventory_only? - enterprise.supplied_products.visible_for(@order_cycle.coordinator) - else - enterprise.supplied_products - end - end - - def products_for_outgoing_exchange - products = [] - enterprises_for_outgoing_exchange.each do |enterprise| - products.push( *supplied_products(enterprise).to_a ) - - products.each do |product| - unless product_supplied_to_order_cycle?(product) - products.delete(product) - end - end - end - products - end - - def product_supplied_to_order_cycle?(product) - (product.variants.map(&:id) & incoming_exchanges_variants).any? - end - - def incoming_exchanges_variants - return @incoming_exchanges_variants if @incoming_exchanges_variants.present? - - @incoming_exchanges_variants = [] - visible_incoming_exchanges.each do |exchange| - @incoming_exchanges_variants.push( - *exchange.variants.merge(visible_incoming_variants(exchange)).map(&:id).to_a - ) - end - @incoming_exchanges_variants - end - - def visible_incoming_exchanges - OpenFoodNetwork::OrderCyclePermissions. - new(spree_current_user, @order_cycle). - visible_exchanges. - by_enterprise_name. - incoming - end - - def visible_incoming_variants(exchange) - if exchange.order_cycle.prefers_product_selection_from_coordinator_inventory_only? - permitted_incoming_variants(exchange).visible_for(exchange.order_cycle.coordinator) - else - permitted_incoming_variants(exchange) - end - end - - def permitted_incoming_variants(exchange) - OpenFoodNetwork::OrderCyclePermissions.new(spree_current_user, exchange.order_cycle). - visible_variants_for_incoming_exchanges_from(exchange.sender) - end - - def enterprises_for_outgoing_exchange - enterprises = OpenFoodNetwork::OrderCyclePermissions. - new(spree_current_user, @order_cycle) - .visible_enterprises - return enterprises if enterprises.empty? - - enterprises.includes( - supplied_products: [:supplier, :variants, master: [:images]] - ) - end end end diff --git a/app/services/exchange_products_renderer.rb b/app/services/exchange_products_renderer.rb new file mode 100644 index 0000000000..ffdfd1975c --- /dev/null +++ b/app/services/exchange_products_renderer.rb @@ -0,0 +1,91 @@ +class ExchangeProductsRenderer + def initialize(order_cycle, user) + @order_cycle = order_cycle + @user = user + end + + def exchange_products(incoming, enterprise) + if incoming + products_for_incoming_exchange(enterprise) + else + products_for_outgoing_exchange + end + end + + private + + def products_for_incoming_exchange(enterprise) + supplied_products(enterprise) + end + + def supplied_products(enterprise) + if @order_cycle.present? && + @order_cycle.prefers_product_selection_from_coordinator_inventory_only? + enterprise.supplied_products.visible_for(@order_cycle.coordinator) + else + enterprise.supplied_products + end + end + + def products_for_outgoing_exchange + products = [] + enterprises_for_outgoing_exchange.each do |enterprise| + products.push( *supplied_products(enterprise).to_a ) + + products.each do |product| + unless product_supplied_to_order_cycle?(product) + products.delete(product) + end + end + end + products + end + + def product_supplied_to_order_cycle?(product) + (product.variants.map(&:id) & incoming_exchanges_variants).any? + end + + def incoming_exchanges_variants + return @incoming_exchanges_variants if @incoming_exchanges_variants.present? + + @incoming_exchanges_variants = [] + visible_incoming_exchanges.each do |exchange| + @incoming_exchanges_variants.push( + *exchange.variants.merge(visible_incoming_variants(exchange)).map(&:id).to_a + ) + end + @incoming_exchanges_variants + end + + def visible_incoming_exchanges + OpenFoodNetwork::OrderCyclePermissions. + new(@user, @order_cycle). + visible_exchanges. + by_enterprise_name. + incoming + end + + def visible_incoming_variants(exchange) + if exchange.order_cycle.prefers_product_selection_from_coordinator_inventory_only? + permitted_incoming_variants(exchange).visible_for(exchange.order_cycle.coordinator) + else + permitted_incoming_variants(exchange) + end + end + + def permitted_incoming_variants(exchange) + OpenFoodNetwork::OrderCyclePermissions.new(@user, exchange.order_cycle). + visible_variants_for_incoming_exchanges_from(exchange.sender) + end + + def enterprises_for_outgoing_exchange + enterprises = OpenFoodNetwork::OrderCyclePermissions. + new(@user, @order_cycle) + .visible_enterprises + return enterprises if enterprises.empty? + + enterprises.includes( + supplied_products: [:supplier, :variants, master: [:images]] + ) + end +end From 5cf50f0adfc45ec14102c3910dd2beffe56d6c9a Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Mon, 18 Nov 2019 12:05:19 +0000 Subject: [PATCH 13/21] Convert the manipulation of arrays into active record relations: let the DB do the matching job --- app/services/exchange_products_renderer.rb | 53 ++++++++++------------ 1 file changed, 23 insertions(+), 30 deletions(-) diff --git a/app/services/exchange_products_renderer.rb b/app/services/exchange_products_renderer.rb index ffdfd1975c..c4e9a1f77e 100644 --- a/app/services/exchange_products_renderer.rb +++ b/app/services/exchange_products_renderer.rb @@ -15,43 +15,33 @@ class ExchangeProductsRenderer private def products_for_incoming_exchange(enterprise) - supplied_products(enterprise) + supplied_products(enterprise.id) end - def supplied_products(enterprise) + def supplied_products(enterprises_query_matcher) + products_relation = Spree::Product.where(supplier_id: enterprises_query_matcher) + if @order_cycle.present? && @order_cycle.prefers_product_selection_from_coordinator_inventory_only? - enterprise.supplied_products.visible_for(@order_cycle.coordinator) - else - enterprise.supplied_products + products_relation = products_relation.visible_for(@order_cycle.coordinator) end + + products_relation end def products_for_outgoing_exchange - products = [] - enterprises_for_outgoing_exchange.each do |enterprise| - products.push( *supplied_products(enterprise).to_a ) - - products.each do |product| - unless product_supplied_to_order_cycle?(product) - products.delete(product) - end - end - end - products - end - - def product_supplied_to_order_cycle?(product) - (product.variants.map(&:id) & incoming_exchanges_variants).any? + supplied_products(enterprises_for_outgoing_exchange.select(:id)). + includes(:variants). + where("spree_variants.id": incoming_exchanges_variants) end def incoming_exchanges_variants return @incoming_exchanges_variants if @incoming_exchanges_variants.present? @incoming_exchanges_variants = [] - visible_incoming_exchanges.each do |exchange| + visible_incoming_exchanges.each do |incoming_exchange| @incoming_exchanges_variants.push( - *exchange.variants.merge(visible_incoming_variants(exchange)).map(&:id).to_a + *incoming_exchange.variants.merge(visible_incoming_variants(incoming_exchange.sender)).map(&:id).to_a ) end @incoming_exchanges_variants @@ -65,17 +55,20 @@ class ExchangeProductsRenderer incoming end - def visible_incoming_variants(exchange) - if exchange.order_cycle.prefers_product_selection_from_coordinator_inventory_only? - permitted_incoming_variants(exchange).visible_for(exchange.order_cycle.coordinator) - else - permitted_incoming_variants(exchange) + def visible_incoming_variants(incoming_exchange_sender) + variants_relation = permitted_incoming_variants(incoming_exchange_sender) + + if @order_cycle.prefers_product_selection_from_coordinator_inventory_only? + variants_relation = variants_relation.visible_for(@order_cycle.coordinator) end + + variants_relation end - def permitted_incoming_variants(exchange) - OpenFoodNetwork::OrderCyclePermissions.new(@user, exchange.order_cycle). - visible_variants_for_incoming_exchanges_from(exchange.sender) + def permitted_incoming_variants(incoming_exchange_sender) + OpenFoodNetwork::OrderCyclePermissions. + new(@user, @order_cycle). + visible_variants_for_incoming_exchanges_from(incoming_exchange_sender) end def enterprises_for_outgoing_exchange From 0bec4922087a9388eabca6e62a4ebbce961fd13b Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Mon, 18 Nov 2019 15:02:21 +0000 Subject: [PATCH 14/21] Fix some rubocop issues --- .../api/admin/for_order_cycle/supplied_product_serializer.rb | 3 ++- app/services/exchange_products_renderer.rb | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/serializers/api/admin/for_order_cycle/supplied_product_serializer.rb b/app/serializers/api/admin/for_order_cycle/supplied_product_serializer.rb index ed12ca1c1b..e52d555b6f 100644 --- a/app/serializers/api/admin/for_order_cycle/supplied_product_serializer.rb +++ b/app/serializers/api/admin/for_order_cycle/supplied_product_serializer.rb @@ -14,7 +14,8 @@ class Api::Admin::ForOrderCycle::SuppliedProductSerializer < ActiveModel::Serial end def variants - variants = if order_cycle.present? && order_cycle.prefers_product_selection_from_coordinator_inventory_only? + variants = if order_cycle.present? && + order_cycle.prefers_product_selection_from_coordinator_inventory_only? object.variants.visible_for(order_cycle.coordinator) else object.variants diff --git a/app/services/exchange_products_renderer.rb b/app/services/exchange_products_renderer.rb index c4e9a1f77e..faadba34f1 100644 --- a/app/services/exchange_products_renderer.rb +++ b/app/services/exchange_products_renderer.rb @@ -41,7 +41,9 @@ class ExchangeProductsRenderer @incoming_exchanges_variants = [] visible_incoming_exchanges.each do |incoming_exchange| @incoming_exchanges_variants.push( - *incoming_exchange.variants.merge(visible_incoming_variants(incoming_exchange.sender)).map(&:id).to_a + *incoming_exchange.variants.merge( + visible_incoming_variants(incoming_exchange.sender) + ).map(&:id).to_a ) end @incoming_exchanges_variants From 81792529246bef03cc8bb16005cab8924606ef1a Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Fri, 22 Nov 2019 14:15:36 +0000 Subject: [PATCH 15/21] Replace the use of this with --- .../order_cycles/controllers/incoming_controller.js.coffee | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/admin/order_cycles/controllers/incoming_controller.js.coffee b/app/assets/javascripts/admin/order_cycles/controllers/incoming_controller.js.coffee index f092dfe18c..dabf9d2bc5 100644 --- a/app/assets/javascripts/admin/order_cycles/controllers/incoming_controller.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/controllers/incoming_controller.js.coffee @@ -4,12 +4,12 @@ angular.module('admin.orderCycles').controller 'AdminOrderCycleIncomingCtrl', ($ $scope.view = 'incoming' $scope.exchangeTotalVariants = (exchange) -> - return unless this.enterprises? && this.enterprises[exchange.enterprise_id]? + return unless $scope.enterprises? && $scope.enterprises[exchange.enterprise_id]? - enterprise = this.enterprises[exchange.enterprise_id] + enterprise = $scope.enterprises[exchange.enterprise_id] return enterprise.numVariants if enterprise.numVariants? - $scope.loadExchangeProducts(this, exchange) + $scope.loadExchangeProducts($scope, exchange) return unless enterprise.supplied_products? enterprise.numVariants = $scope.countVariants(enterprise.supplied_products) From a66a4c3edb0bae996d91cdf0ade2b54d26721133 Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Fri, 22 Nov 2019 14:29:41 +0000 Subject: [PATCH 16/21] Remove unnecessary passing of scopes around in controllers --- .../controllers/incoming_controller.js.coffee | 2 +- .../order_cycle_exchanges_controller.js.coffee | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/assets/javascripts/admin/order_cycles/controllers/incoming_controller.js.coffee b/app/assets/javascripts/admin/order_cycles/controllers/incoming_controller.js.coffee index dabf9d2bc5..e3bb5055f2 100644 --- a/app/assets/javascripts/admin/order_cycles/controllers/incoming_controller.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/controllers/incoming_controller.js.coffee @@ -9,7 +9,7 @@ angular.module('admin.orderCycles').controller 'AdminOrderCycleIncomingCtrl', ($ enterprise = $scope.enterprises[exchange.enterprise_id] return enterprise.numVariants if enterprise.numVariants? - $scope.loadExchangeProducts($scope, exchange) + $scope.loadExchangeProducts(exchange) return unless enterprise.supplied_products? enterprise.numVariants = $scope.countVariants(enterprise.supplied_products) diff --git a/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee b/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee index b3e2690732..b52a7ae188 100644 --- a/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee @@ -36,14 +36,14 @@ angular.module('admin.orderCycles') $scope.removeDistributionOfVariant = (variant_id) -> OrderCycle.removeDistributionOfVariant(variant_id) - $scope.loadExchangeProducts = (scope, exchange) -> - return if scope.enterprises[exchange.enterprise_id].supplied_products_fetched? - scope.enterprises[exchange.enterprise_id].supplied_products_fetched = true + $scope.loadExchangeProducts = (exchange) -> + return if $scope.enterprises[exchange.enterprise_id].supplied_products_fetched? + $scope.enterprises[exchange.enterprise_id].supplied_products_fetched = true incoming = true if $scope.view == 'incoming' params = { exchange_id: exchange.id, enterprise_id: exchange.enterprise_id, order_cycle_id: $scope.order_cycle.id, incoming: incoming} Product.index params, (products) -> - scope.enterprises[exchange.enterprise_id].supplied_products = products + $scope.enterprises[exchange.enterprise_id].supplied_products = products # Register listeners to capture first toggle open of the products panel of the exchange $scope.exchangeListChanged = -> @@ -57,5 +57,5 @@ angular.module('admin.orderCycles') $scope.initializeExchangeProductsPanel = (selection, $element) -> scope = $element.scope() return if $scope.exchangeProdutsPanelInitialized[scope.exchange.enterprise_id] - $scope.loadExchangeProducts(scope, scope.exchange) + $scope.loadExchangeProducts(scope.exchange) $scope.exchangeProdutsPanelInitialized[scope.exchange.enterprise_id] = true From f5ddbfbac37e9add63d489175593fcbd2e096ba9 Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Fri, 22 Nov 2019 14:51:31 +0000 Subject: [PATCH 17/21] Make Product service more simple, there's no need to keep the data structure, that is already kept in the controller --- .../admin/order_cycles/services/product.js.coffee | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/app/assets/javascripts/admin/order_cycles/services/product.js.coffee b/app/assets/javascripts/admin/order_cycles/services/product.js.coffee index e13e2c5069..d11b9b3e41 100644 --- a/app/assets/javascripts/admin/order_cycles/services/product.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/services/product.js.coffee @@ -1,22 +1,15 @@ angular.module('admin.orderCycles').factory('Product', ($resource) -> - Product = $resource('/api/exchanges/:exchange_id/products.json', {}, { + ProductResource = $resource('/api/exchanges/:exchange_id/products.json', {}, { 'index': method: 'GET' isArray: true }) { - Product: Product - products: {} + ProductResource: ProductResource loaded: false index: (params={}, callback=null) -> - Product.index params, (data) => - @products[params.enterprise_id] = [] - for product in data - @products[params.enterprise_id].push(product) - + ProductResource.index params, (data) => @loaded = true - (callback || angular.noop)(@products[params.enterprise_id]) - - this.products + (callback || angular.noop)(data) }) From a4a2f98b6eb4a1c72c19c67047d651605d2d8b1f Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Fri, 22 Nov 2019 14:54:12 +0000 Subject: [PATCH 18/21] Rename Product service to more appropriate ExchangeProduct --- .../order_cycle_exchanges_controller.js.coffee | 4 ++-- .../controllers/simple_create.js.coffee | 4 ++-- .../controllers/simple_edit.js.coffee | 4 ++-- .../services/exchange_product.js.coffee | 15 +++++++++++++++ .../admin/order_cycles/services/product.js.coffee | 15 --------------- .../controllers/simple_create_spec.js.coffee | 8 ++++---- 6 files changed, 25 insertions(+), 25 deletions(-) create mode 100644 app/assets/javascripts/admin/order_cycles/services/exchange_product.js.coffee delete mode 100644 app/assets/javascripts/admin/order_cycles/services/product.js.coffee diff --git a/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee b/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee index b52a7ae188..d4046f381a 100644 --- a/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee @@ -1,5 +1,5 @@ angular.module('admin.orderCycles') - .controller 'AdminOrderCycleExchangesCtrl', ($scope, $controller, $filter, $window, $location, OrderCycle, Product, Enterprise, EnterpriseFee, Schedules, RequestMonitor, ocInstance, StatusMessage) -> + .controller 'AdminOrderCycleExchangesCtrl', ($scope, $controller, $filter, $window, $location, OrderCycle, ExchangeProduct, Enterprise, EnterpriseFee, Schedules, RequestMonitor, ocInstance, StatusMessage) -> $controller('AdminEditOrderCycleCtrl', {$scope: $scope, ocInstance: ocInstance, $location: $location}) $scope.supplier_enterprises = Enterprise.producer_enterprises @@ -42,7 +42,7 @@ angular.module('admin.orderCycles') incoming = true if $scope.view == 'incoming' params = { exchange_id: exchange.id, enterprise_id: exchange.enterprise_id, order_cycle_id: $scope.order_cycle.id, incoming: incoming} - Product.index params, (products) -> + ExchangeProduct.index params, (products) -> $scope.enterprises[exchange.enterprise_id].supplied_products = products # Register listeners to capture first toggle open of the products panel of the exchange diff --git a/app/assets/javascripts/admin/order_cycles/controllers/simple_create.js.coffee b/app/assets/javascripts/admin/order_cycles/controllers/simple_create.js.coffee index dbb47aac11..a05c1f01a9 100644 --- a/app/assets/javascripts/admin/order_cycles/controllers/simple_create.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/controllers/simple_create.js.coffee @@ -1,4 +1,4 @@ -angular.module('admin.orderCycles').controller "AdminSimpleCreateOrderCycleCtrl", ($scope, $controller, $window, OrderCycle, Enterprise, EnterpriseFee, Product, StatusMessage, Schedules, RequestMonitor, ocInstance) -> +angular.module('admin.orderCycles').controller "AdminSimpleCreateOrderCycleCtrl", ($scope, $controller, $window, OrderCycle, Enterprise, EnterpriseFee, ExchangeProduct, StatusMessage, Schedules, RequestMonitor, ocInstance) -> $controller('AdminOrderCycleBasicCtrl', {$scope: $scope, ocInstance: ocInstance}) $scope.order_cycle = OrderCycle.new {coordinator_id: ocInstance.coordinator_id}, => @@ -20,7 +20,7 @@ angular.module('admin.orderCycles').controller "AdminSimpleCreateOrderCycleCtrl" $scope.incoming_exchange = OrderCycle.order_cycle.incoming_exchanges[0] params = { enterprise_id: $scope.incoming_exchange.enterprise_id, incoming: true } - Product.index params, $scope.storeProductsAndSelectAllVariants + ExchangeProduct.index params, $scope.storeProductsAndSelectAllVariants $scope.storeProductsAndSelectAllVariants = (products) -> $scope.enterprises[$scope.incoming_exchange.enterprise_id].supplied_products = products diff --git a/app/assets/javascripts/admin/order_cycles/controllers/simple_edit.js.coffee b/app/assets/javascripts/admin/order_cycles/controllers/simple_edit.js.coffee index 2507524591..fc043afaaa 100644 --- a/app/assets/javascripts/admin/order_cycles/controllers/simple_edit.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/controllers/simple_edit.js.coffee @@ -1,4 +1,4 @@ -angular.module('admin.orderCycles').controller "AdminSimpleEditOrderCycleCtrl", ($scope, $controller, $location, $window, OrderCycle, Enterprise, EnterpriseFee, Product, Schedules, RequestMonitor, StatusMessage, ocInstance) -> +angular.module('admin.orderCycles').controller "AdminSimpleEditOrderCycleCtrl", ($scope, $controller, $location, $window, OrderCycle, Enterprise, EnterpriseFee, ExchangeProduct, Schedules, RequestMonitor, StatusMessage, ocInstance) -> $controller('AdminOrderCycleBasicCtrl', {$scope: $scope, ocInstance: ocInstance}) $scope.orderCycleId = -> @@ -15,7 +15,7 @@ angular.module('admin.orderCycles').controller "AdminSimpleEditOrderCycleCtrl", $scope.loadExchangeProducts = -> exchange = OrderCycle.order_cycle.incoming_exchanges[0] - Product.index { exchange_id: exchange.id }, (products) -> + ExchangeProduct.index { exchange_id: exchange.id }, (products) -> $scope.enterprises[exchange.enterprise_id].supplied_products = products $scope.removeDistributionOfVariant = angular.noop diff --git a/app/assets/javascripts/admin/order_cycles/services/exchange_product.js.coffee b/app/assets/javascripts/admin/order_cycles/services/exchange_product.js.coffee new file mode 100644 index 0000000000..dfc8adeca5 --- /dev/null +++ b/app/assets/javascripts/admin/order_cycles/services/exchange_product.js.coffee @@ -0,0 +1,15 @@ +angular.module('admin.orderCycles').factory('ExchangeProduct', ($resource) -> + ExchangeProductResource = $resource('/api/exchanges/:exchange_id/products.json', {}, { + 'index': + method: 'GET' + isArray: true + }) + { + ExchangeProductResource: ExchangeProductResource + loaded: false + + index: (params={}, callback=null) -> + ExchangeProductResource.index params, (data) => + @loaded = true + (callback || angular.noop)(data) + }) diff --git a/app/assets/javascripts/admin/order_cycles/services/product.js.coffee b/app/assets/javascripts/admin/order_cycles/services/product.js.coffee deleted file mode 100644 index d11b9b3e41..0000000000 --- a/app/assets/javascripts/admin/order_cycles/services/product.js.coffee +++ /dev/null @@ -1,15 +0,0 @@ -angular.module('admin.orderCycles').factory('Product', ($resource) -> - ProductResource = $resource('/api/exchanges/:exchange_id/products.json', {}, { - 'index': - method: 'GET' - isArray: true - }) - { - ProductResource: ProductResource - loaded: false - - index: (params={}, callback=null) -> - ProductResource.index params, (data) => - @loaded = true - (callback || angular.noop)(data) - }) diff --git a/spec/javascripts/unit/admin/order_cycles/controllers/simple_create_spec.js.coffee b/spec/javascripts/unit/admin/order_cycles/controllers/simple_create_spec.js.coffee index e28c8d5f58..0461f921d8 100644 --- a/spec/javascripts/unit/admin/order_cycles/controllers/simple_create_spec.js.coffee +++ b/spec/javascripts/unit/admin/order_cycles/controllers/simple_create_spec.js.coffee @@ -3,7 +3,7 @@ describe "AdminSimpleCreateOrderCycleCtrl", -> scope = null OrderCycle = {} Enterprise = {} - Product = {} + ExchangeProduct = {} EnterpriseFee = {} incoming_exchange = {} outgoing_exchange = {} @@ -28,7 +28,7 @@ describe "AdminSimpleCreateOrderCycleCtrl", -> get: jasmine.createSpy().and.returnValue {id: 123} index: jasmine.createSpy() suppliedVariants: jasmine.createSpy().and.returnValue('supplied variants') - Product = + ExchangeProduct = index: jasmine.createSpy() EnterpriseFee = index: jasmine.createSpy() @@ -36,7 +36,7 @@ describe "AdminSimpleCreateOrderCycleCtrl", -> module('admin.orderCycles') inject ($controller) -> - ctrl = $controller 'AdminSimpleCreateOrderCycleCtrl', {$scope: scope, OrderCycle: OrderCycle, Enterprise: Enterprise, EnterpriseFee: EnterpriseFee, Product: Product, ocInstance: ocInstance} + ctrl = $controller 'AdminSimpleCreateOrderCycleCtrl', {$scope: scope, OrderCycle: OrderCycle, Enterprise: Enterprise, EnterpriseFee: EnterpriseFee, ExchangeProduct: ExchangeProduct, ocInstance: ocInstance} describe "initialisation", -> enterprise = {id: 123} @@ -54,7 +54,7 @@ describe "AdminSimpleCreateOrderCycleCtrl", -> scope.loadExchangeProducts() - expect(Product.index).toHaveBeenCalledWith({ enterprise_id: enterprise.id, incoming: true }, scope.storeProductsAndSelectAllVariants) + expect(ExchangeProduct.index).toHaveBeenCalledWith({ enterprise_id: enterprise.id, incoming: true }, scope.storeProductsAndSelectAllVariants) it "stores products and selects all variants", -> scope.incoming_exchange = incoming_exchange From a589ba38da49442144b8d7b7951a05b7a84cc159 Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Fri, 22 Nov 2019 16:58:20 +0000 Subject: [PATCH 19/21] Rename exchanges_products_controller to better exchange_products_controller --- ...products_controller.rb => exchange_products_controller.rb} | 3 ++- config/routes/api.rb | 4 ++-- ...ontroller_spec.rb => exchange_products_controller_spec.rb} | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) rename app/controllers/api/{exchanges_products_controller.rb => exchange_products_controller.rb} (92%) rename spec/controllers/api/{exchanges_products_controller_spec.rb => exchange_products_controller_spec.rb} (94%) diff --git a/app/controllers/api/exchanges_products_controller.rb b/app/controllers/api/exchange_products_controller.rb similarity index 92% rename from app/controllers/api/exchanges_products_controller.rb rename to app/controllers/api/exchange_products_controller.rb index 6c9e29ca89..a0fdecf131 100644 --- a/app/controllers/api/exchanges_products_controller.rb +++ b/app/controllers/api/exchange_products_controller.rb @@ -1,5 +1,6 @@ +# This controller lists products that can be added to an exchange module Api - class ExchangesProductsController < Api::BaseController + class ExchangeProductsController < Api::BaseController skip_authorization_check only: [:index, :show] # Lists products for an Enterprise in an Order Cycle diff --git a/config/routes/api.rb b/config/routes/api.rb index 172ef5791a..036456c407 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -43,8 +43,8 @@ Openfoodnetwork::Application.routes.draw do get :properties, on: :member end - resources :exchanges, only: [:show], controller: 'exchanges_products' do - resources :products, controller: 'exchanges_products', only: [:index] + resources :exchanges, only: [:show], controller: 'exchange_products' do + resources :products, controller: 'exchange_products', only: [:index] end resource :status do diff --git a/spec/controllers/api/exchanges_products_controller_spec.rb b/spec/controllers/api/exchange_products_controller_spec.rb similarity index 94% rename from spec/controllers/api/exchanges_products_controller_spec.rb rename to spec/controllers/api/exchange_products_controller_spec.rb index 8648aadfc0..93fcf670f4 100644 --- a/spec/controllers/api/exchanges_products_controller_spec.rb +++ b/spec/controllers/api/exchange_products_controller_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' module Api - describe ExchangesProductsController, type: :controller do + describe ExchangeProductsController, type: :controller do include AuthenticationWorkflow let!(:order_cycle) { create(:order_cycle) } From ff584f9be902642b8536bb58d42516c757ee5816 Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Fri, 22 Nov 2019 17:24:14 +0000 Subject: [PATCH 20/21] Adapt exchange products routes to make api/exchanges/products (without exchange_id) also go to exchange_products#index --- .../api/exchange_products_controller.rb | 27 +++++++++---------- config/routes/api.rb | 4 +-- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/app/controllers/api/exchange_products_controller.rb b/app/controllers/api/exchange_products_controller.rb index a0fdecf131..c87fb95c26 100644 --- a/app/controllers/api/exchange_products_controller.rb +++ b/app/controllers/api/exchange_products_controller.rb @@ -1,22 +1,21 @@ # This controller lists products that can be added to an exchange module Api class ExchangeProductsController < Api::BaseController - skip_authorization_check only: [:index, :show] + skip_authorization_check only: [:index] - # Lists products for an Enterprise in an Order Cycle - # This is the same as index below but when the Exchange doesn't exist yet + # If exchange_id is present in the URL: + # Lists Products that can be added to that Exchange # - # Parameters are: enterprise_id, order_cycle_id and incoming - # order_cycle_id is optional if for incoming - def show - load_data_from_params - - render_products - end - - # Lists products in an Exchange + # If exchange_id is not present in the URL: + # Lists Products of the Enterprise given that can be added to the given Order Cycle + # In this case parameters are: enterprise_id, order_cycle_id and incoming + # (order_cycle_id is not necessary for incoming exchanges) def index - load_data_from_exchange + if params[:exchange_id].present? + load_data_from_exchange + else + load_data_from_other_params + end render_products end @@ -42,7 +41,7 @@ module Api @enterprise = exchange.sender end - def load_data_from_params + def load_data_from_other_params @enterprise = Enterprise.find_by_id(params[:enterprise_id]) if params[:order_cycle_id] diff --git a/config/routes/api.rb b/config/routes/api.rb index 036456c407..1861e084a2 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -43,8 +43,8 @@ Openfoodnetwork::Application.routes.draw do get :properties, on: :member end - resources :exchanges, only: [:show], controller: 'exchange_products' do - resources :products, controller: 'exchange_products', only: [:index] + resources :exchanges, only: [:show], to: 'exchange_products#index' do + get :products, to: 'exchange_products#index' end resource :status do From 9451f1b66d590a5f90aec7ab46a9c6b83ded4999 Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Fri, 22 Nov 2019 17:58:08 +0000 Subject: [PATCH 21/21] Remove funky panel open listener code and initialize the panel data with a ng-init in the panel template --- .../directives/panel_ctrl.js.coffee | 2 +- .../order_cycles/controllers/edit.js.coffee | 4 +--- .../controllers/incoming_controller.js.coffee | 2 +- .../order_cycle_exchanges_controller.js.coffee | 18 +++++------------- .../controllers/outgoing_controller.js.coffee | 2 +- .../exchange_distributed_products.html.haml | 2 +- .../exchange_supplied_products.html.haml | 2 +- .../order_cycles/_exchange_form.html.haml | 4 ++-- .../controllers/edit_spec.js.coffee | 1 - .../incoming_controller_spec.js.coffee | 3 +-- .../outgoing_controller_spec.js.coffee | 3 +-- 11 files changed, 15 insertions(+), 28 deletions(-) diff --git a/app/assets/javascripts/admin/index_utils/directives/panel_ctrl.js.coffee b/app/assets/javascripts/admin/index_utils/directives/panel_ctrl.js.coffee index d2e541992c..4259ce63e2 100644 --- a/app/assets/javascripts/admin/index_utils/directives/panel_ctrl.js.coffee +++ b/app/assets/javascripts/admin/index_utils/directives/panel_ctrl.js.coffee @@ -13,7 +13,7 @@ angular.module("admin.indexUtils").directive "panelCtrl", (Panels) -> this.registerSelectionListener = (callback) -> $scope.$on "selection:changed", (event, selection) -> - callback(selection, $element) + callback(selection) this diff --git a/app/assets/javascripts/admin/order_cycles/controllers/edit.js.coffee b/app/assets/javascripts/admin/order_cycles/controllers/edit.js.coffee index 0730f1e0a3..73a6b3fcba 100644 --- a/app/assets/javascripts/admin/order_cycles/controllers/edit.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/controllers/edit.js.coffee @@ -3,9 +3,7 @@ angular.module('admin.orderCycles') $controller('AdminOrderCycleBasicCtrl', {$scope: $scope, ocInstance: ocInstance}) order_cycle_id = $location.absUrl().match(/\/admin\/order_cycles\/(\d+)/)[1] - $scope.order_cycle = OrderCycle.load order_cycle_id, -> - $scope.exchangeListChanged() if $scope.exchangeListChanged? - + $scope.order_cycle = OrderCycle.load(order_cycle_id) $scope.enterprises = Enterprise.index(order_cycle_id: order_cycle_id) $scope.enterprise_fees = EnterpriseFee.index(order_cycle_id: order_cycle_id) diff --git a/app/assets/javascripts/admin/order_cycles/controllers/incoming_controller.js.coffee b/app/assets/javascripts/admin/order_cycles/controllers/incoming_controller.js.coffee index e3bb5055f2..5e34e42c72 100644 --- a/app/assets/javascripts/admin/order_cycles/controllers/incoming_controller.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/controllers/incoming_controller.js.coffee @@ -24,4 +24,4 @@ angular.module('admin.orderCycles').controller 'AdminOrderCycleIncomingCtrl', ($ $scope.addSupplier = ($event) -> $event.preventDefault() - OrderCycle.addSupplier $scope.new_supplier_id, $scope.exchangeListChanged + OrderCycle.addSupplier $scope.new_supplier_id diff --git a/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee b/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee index d4046f381a..066bcaf25c 100644 --- a/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/controllers/order_cycle_exchanges_controller.js.coffee @@ -1,5 +1,5 @@ angular.module('admin.orderCycles') - .controller 'AdminOrderCycleExchangesCtrl', ($scope, $controller, $filter, $window, $location, OrderCycle, ExchangeProduct, Enterprise, EnterpriseFee, Schedules, RequestMonitor, ocInstance, StatusMessage) -> + .controller 'AdminOrderCycleExchangesCtrl', ($scope, $controller, $filter, $window, $location, $timeout, OrderCycle, ExchangeProduct, Enterprise, EnterpriseFee, Schedules, RequestMonitor, ocInstance, StatusMessage) -> $controller('AdminEditOrderCycleCtrl', {$scope: $scope, ocInstance: ocInstance, $location: $location}) $scope.supplier_enterprises = Enterprise.producer_enterprises @@ -45,17 +45,9 @@ angular.module('admin.orderCycles') ExchangeProduct.index params, (products) -> $scope.enterprises[exchange.enterprise_id].supplied_products = products - # Register listeners to capture first toggle open of the products panel of the exchange - $scope.exchangeListChanged = -> - panelRows = angular.element(".panel-row") - for panelRow in panelRows - panelCtrl = angular.element(panelRow).controller('panelCtrl') - panelCtrl.registerSelectionListener($scope.initializeExchangeProductsPanel) - # initialize exchange products panel if not yet done $scope.exchangeProdutsPanelInitialized = [] - $scope.initializeExchangeProductsPanel = (selection, $element) -> - scope = $element.scope() - return if $scope.exchangeProdutsPanelInitialized[scope.exchange.enterprise_id] - $scope.loadExchangeProducts(scope.exchange) - $scope.exchangeProdutsPanelInitialized[scope.exchange.enterprise_id] = true + $scope.initializeExchangeProductsPanel = (exchange) -> + return if $scope.exchangeProdutsPanelInitialized[exchange.enterprise_id] + $scope.loadExchangeProducts(exchange) + $scope.exchangeProdutsPanelInitialized[exchange.enterprise_id] = true diff --git a/app/assets/javascripts/admin/order_cycles/controllers/outgoing_controller.js.coffee b/app/assets/javascripts/admin/order_cycles/controllers/outgoing_controller.js.coffee index e7f193de47..157a723672 100644 --- a/app/assets/javascripts/admin/order_cycles/controllers/outgoing_controller.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/controllers/outgoing_controller.js.coffee @@ -11,7 +11,7 @@ angular.module('admin.orderCycles').controller 'AdminOrderCycleOutgoingCtrl', ($ $scope.addDistributor = ($event) -> $event.preventDefault() - OrderCycle.addDistributor $scope.new_distributor_id, $scope.exchangeListChanged + OrderCycle.addDistributor $scope.new_distributor_id $scope.submit = ($event, destination) -> $event.preventDefault() diff --git a/app/assets/javascripts/templates/admin/panels/exchange_distributed_products.html.haml b/app/assets/javascripts/templates/admin/panels/exchange_distributed_products.html.haml index 5fe23e6826..4dad8310ce 100644 --- a/app/assets/javascripts/templates/admin/panels/exchange_distributed_products.html.haml +++ b/app/assets/javascripts/templates/admin/panels/exchange_distributed_products.html.haml @@ -1,4 +1,4 @@ -.row.exchange-distributed-products +.row.exchange-distributed-products{'ng-init' => 'initializeExchangeProductsPanel(exchange)'} .sixteen.columns.alpha.omega .exchange-select-all-variants %label diff --git a/app/assets/javascripts/templates/admin/panels/exchange_supplied_products.html.haml b/app/assets/javascripts/templates/admin/panels/exchange_supplied_products.html.haml index 10950258f9..e6c80e973a 100644 --- a/app/assets/javascripts/templates/admin/panels/exchange_supplied_products.html.haml +++ b/app/assets/javascripts/templates/admin/panels/exchange_supplied_products.html.haml @@ -1,4 +1,4 @@ -.row.exchange-supplied-products +.row.exchange-supplied-products{'ng-init' => 'initializeExchangeProductsPanel(exchange)'} .sixteen.columns.alpha.omega .exchange-select-all-variants %label diff --git a/app/views/admin/order_cycles/_exchange_form.html.haml b/app/views/admin/order_cycles/_exchange_form.html.haml index e844ffc6aa..63a44e9a3b 100644 --- a/app/views/admin/order_cycles/_exchange_form.html.haml +++ b/app/views/admin/order_cycles/_exchange_form.html.haml @@ -35,10 +35,10 @@ - if type == 'supplier' %tr.panel-row{ object: "exchange", panels: "{products: 'exchange_supplied_products'}", - locals: "$index,order_cycle,exchange,enterprises,setExchangeVariants,suppliedVariants,removeDistributionOfVariant", + locals: "$index,order_cycle,exchange,enterprises,setExchangeVariants,suppliedVariants,removeDistributionOfVariant,initializeExchangeProductsPanel", colspan: 4 } - if type == 'distributor' %tr.panel-row{ object: "exchange", panels: "{products: 'exchange_distributed_products', tags: 'exchange_tags'}", - locals: "$index,order_cycle,exchange,enterprises,setExchangeVariants,incomingExchangeVariantsFor,variantSuppliedToOrderCycle", + locals: "$index,order_cycle,exchange,enterprises,setExchangeVariants,incomingExchangeVariantsFor,variantSuppliedToOrderCycle,initializeExchangeProductsPanel", colspan: 5 } diff --git a/spec/javascripts/unit/admin/order_cycles/controllers/edit_spec.js.coffee b/spec/javascripts/unit/admin/order_cycles/controllers/edit_spec.js.coffee index 8258dd248a..bd60efb299 100644 --- a/spec/javascripts/unit/admin/order_cycles/controllers/edit_spec.js.coffee +++ b/spec/javascripts/unit/admin/order_cycles/controllers/edit_spec.js.coffee @@ -11,7 +11,6 @@ describe 'AdminEditOrderCycleCtrl', -> scope = order_cycle_form: jasmine.createSpyObj('order_cycle_form', ['$dirty', '$setPristine']) $watch: jasmine.createSpy('$watch') - exchangeListChanged: jasmine.createSpy('exchangeListChanged') event = preventDefault: jasmine.createSpy('preventDefault') location = diff --git a/spec/javascripts/unit/admin/order_cycles/controllers/incoming_controller_spec.js.coffee b/spec/javascripts/unit/admin/order_cycles/controllers/incoming_controller_spec.js.coffee index 0543dfd2ac..e650317e44 100644 --- a/spec/javascripts/unit/admin/order_cycles/controllers/incoming_controller_spec.js.coffee +++ b/spec/javascripts/unit/admin/order_cycles/controllers/incoming_controller_spec.js.coffee @@ -10,7 +10,6 @@ describe 'AdminOrderCycleIncomingCtrl', -> beforeEach -> scope = $watch: jasmine.createSpy('$watch') - exchangeListChanged: jasmine.createSpy('exchangeListChanged') location = absUrl: -> 'example.com/admin/order_cycles/27/edit' @@ -45,4 +44,4 @@ describe 'AdminOrderCycleIncomingCtrl', -> scope.addSupplier(event) expect(event.preventDefault).toHaveBeenCalled() - expect(OrderCycle.addSupplier).toHaveBeenCalledWith('new supplier id', scope.exchangeListChanged) + expect(OrderCycle.addSupplier).toHaveBeenCalledWith('new supplier id') diff --git a/spec/javascripts/unit/admin/order_cycles/controllers/outgoing_controller_spec.js.coffee b/spec/javascripts/unit/admin/order_cycles/controllers/outgoing_controller_spec.js.coffee index 880ec2d928..5268a9e8f4 100644 --- a/spec/javascripts/unit/admin/order_cycles/controllers/outgoing_controller_spec.js.coffee +++ b/spec/javascripts/unit/admin/order_cycles/controllers/outgoing_controller_spec.js.coffee @@ -10,7 +10,6 @@ describe 'AdminOrderCycleOutgoingCtrl', -> beforeEach -> scope = $watch: jasmine.createSpy('$watch') - exchangeListChanged: jasmine.createSpy('exchangeListChanged') location = absUrl: -> 'example.com/admin/order_cycles/27/edit' @@ -35,4 +34,4 @@ describe 'AdminOrderCycleOutgoingCtrl', -> scope.addDistributor(event) expect(event.preventDefault).toHaveBeenCalled() - expect(OrderCycle.addDistributor).toHaveBeenCalledWith('new distributor id', scope.exchangeListChanged) + expect(OrderCycle.addDistributor).toHaveBeenCalledWith('new distributor id')