diff --git a/app/assets/javascripts/darkswarm/directives/enterprise_modal.js.coffee b/app/assets/javascripts/darkswarm/directives/enterprise_modal.js.coffee index fa6378afe2..099f2a39e4 100644 --- a/app/assets/javascripts/darkswarm/directives/enterprise_modal.js.coffee +++ b/app/assets/javascripts/darkswarm/directives/enterprise_modal.js.coffee @@ -1,9 +1,15 @@ -Darkswarm.directive "enterpriseModal", ($modal)-> +Darkswarm.directive "enterpriseModal", ($modal, Enterprises, EnterpriseResource) -> restrict: 'E' replace: true template: "" transclude: true - link: (scope, elem, attrs, ctrl)-> - elem.on "click", (ev)=> + link: (scope, elem, attrs, ctrl) -> + elem.on "click", (ev) => ev.stopPropagation() + params = + id: scope.enterprise.id + EnterpriseResource.relatives params, (data) => + Enterprises.addEnterprises data + scope.enterprise = Enterprises.enterprises_by_id[scope.enterprise.id] + Enterprises.dereferenceEnterprise scope.enterprise scope.modalInstance = $modal.open(controller: ctrl, templateUrl: 'enterprise_modal.html', scope: scope) diff --git a/app/assets/javascripts/darkswarm/services/dereferencer.js.coffee b/app/assets/javascripts/darkswarm/services/dereferencer.js.coffee index 2061f95ea1..dbe092b0be 100644 --- a/app/assets/javascripts/darkswarm/services/dereferencer.js.coffee +++ b/app/assets/javascripts/darkswarm/services/dereferencer.js.coffee @@ -1,6 +1,8 @@ Darkswarm.factory 'Dereferencer', -> new class Dereferencer - dereference: (array, data)-> + dereference: (array, data) -> if array for object, i in array - array[i] = data[object.id] + key = undefined + key = object.id if object + array[i] = data[key] diff --git a/app/assets/javascripts/darkswarm/services/enterprise_resource.js.coffee b/app/assets/javascripts/darkswarm/services/enterprise_resource.js.coffee new file mode 100644 index 0000000000..e66ec7c176 --- /dev/null +++ b/app/assets/javascripts/darkswarm/services/enterprise_resource.js.coffee @@ -0,0 +1,8 @@ +Darkswarm.factory 'EnterpriseResource', ($resource) -> + $resource('/enterprise/:id.json', {}, { + 'relatives': + method: 'GET' + url: '/enterprises/:id/relatives.json' + isArray: true + cache: true + }) diff --git a/app/assets/javascripts/darkswarm/services/enterprises.js.coffee b/app/assets/javascripts/darkswarm/services/enterprises.js.coffee index 2dddfbc7ef..b030c6e723 100644 --- a/app/assets/javascripts/darkswarm/services/enterprises.js.coffee +++ b/app/assets/javascripts/darkswarm/services/enterprises.js.coffee @@ -1,4 +1,4 @@ -Darkswarm.factory 'Enterprises', (enterprises, CurrentHub, Taxons, Dereferencer, visibleFilter, Matcher, Geo, $rootScope)-> +Darkswarm.factory 'Enterprises', (enterprises, CurrentHub, Taxons, Dereferencer, visibleFilter, Matcher, Geo, $rootScope) -> new class Enterprises enterprises_by_id: {} constructor: -> @@ -20,14 +20,32 @@ Darkswarm.factory 'Enterprises', (enterprises, CurrentHub, Taxons, Dereferencer, if CurrentHub.hub?.id CurrentHub.hub = @enterprises_by_id[CurrentHub.hub.id] for enterprise in @enterprises - Dereferencer.dereference enterprise.hubs, @enterprises_by_id - Dereferencer.dereference enterprise.producers, @enterprises_by_id + @dereferenceEnterprise enterprise + + dereferenceEnterprise: (enterprise) -> + # keep a backup of enterprise ids + # in case we dereference again after adding more enterprises + if enterprise.hub_references + enterprise.hubs = enterprise.hub_references.slice() + else + enterprise.hub_references = enterprise.hubs.slice() + if enterprise.producer_references + enterprise.producers = enterprise.producer_references.slice() + else + enterprise.producer_references = enterprise.producers.slice() + Dereferencer.dereference enterprise.hubs, @enterprises_by_id + Dereferencer.dereference enterprise.producers, @enterprises_by_id dereferenceTaxons: -> for enterprise in @enterprises Dereferencer.dereference enterprise.taxons, Taxons.taxons_by_id Dereferencer.dereference enterprise.supplied_taxons, Taxons.taxons_by_id + addEnterprises: (new_enterprises) -> + return unless new_enterprises && new_enterprises.length + for enterprise in new_enterprises + @enterprises_by_id[enterprise.id] = enterprise + flagMatching: (query) -> for enterprise in @enterprises enterprise.matches_name_query = if query? && query.length > 0 diff --git a/app/controllers/enterprises_controller.rb b/app/controllers/enterprises_controller.rb index 7f627ec73a..83d7c42f62 100644 --- a/app/controllers/enterprises_controller.rb +++ b/app/controllers/enterprises_controller.rb @@ -1,3 +1,5 @@ +require 'open_food_network/enterprise_injection_data' + class EnterprisesController < BaseController layout "darkswarm" helper Spree::ProductsHelper @@ -11,11 +13,21 @@ class EnterprisesController < BaseController respond_to :js, only: :permalink_checker + def relatives + respond_to do |format| + format.json do + enterprises = Enterprise.find(params[:id]).andand.relatives.activated + render(json: enterprises, + each_serializer: Api::EnterpriseSerializer, + data: OpenFoodNetwork::EnterpriseInjectionData.new) + end + end + end def check_permalink return render text: params[:permalink], status: 409 if Enterprise.find_by_permalink params[:permalink] - path = Rails.application.routes.recognize_path( "/#{ params[:permalink].to_s }" ) + path = Rails.application.routes.recognize_path("/#{params[:permalink].to_s}") if path && path[:controller] == "cms_content" render text: params[:permalink], status: 200 else @@ -23,7 +35,6 @@ class EnterprisesController < BaseController end end - private def clean_permalink diff --git a/app/helpers/injection_helper.rb b/app/helpers/injection_helper.rb index 50b9c93fca..d76f37bf62 100644 --- a/app/helpers/injection_helper.rb +++ b/app/helpers/injection_helper.rb @@ -5,6 +5,10 @@ module InjectionHelper inject_json_ams "enterprises", Enterprise.activated.includes(address: :state).all, Api::EnterpriseSerializer, enterprise_injection_data end + def inject_shop_enterprises + inject_json_ams "enterprises", current_distributor.relatives_including_self.activated.includes(address: :state).all, Api::EnterpriseSerializer, enterprise_injection_data + end + def inject_group_enterprises inject_json_ams "group_enterprises", @group.enterprises.activated.all, Api::EnterpriseSerializer, enterprise_injection_data end diff --git a/app/views/enterprises/shop.html.haml b/app/views/enterprises/shop.html.haml index d635f68164..569009db09 100644 --- a/app/views/enterprises/shop.html.haml +++ b/app/views/enterprises/shop.html.haml @@ -5,7 +5,7 @@ - content_for(:image) do = current_distributor.logo.url -= inject_enterprises += inject_shop_enterprises %shop.darkswarm - content_for :order_cycle_form do diff --git a/config/routes.rb b/config/routes.rb index f1b96de181..cd7c7780c4 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -55,6 +55,7 @@ Openfoodnetwork::Application.routes.draw do member do get :shop + get :relatives end end get '/:id/shop', to: 'enterprises#shop', as: 'enterprise_shop'