From fb9fd5089aa1ad3809cc0cb8bef50943286572c6 Mon Sep 17 00:00:00 2001 From: Rob H Date: Sun, 5 Jan 2014 17:04:27 +0800 Subject: [PATCH] WIP: Adding a hard filter to BPE works --- .../admin/bulk_product_update.js.coffee | 20 +++++++--- .../admin/bulk_product_update_spec.rb | 33 ++++++++++----- .../unit/bulk_product_update_spec.js.coffee | 40 +++++++++++++++++-- 3 files changed, 75 insertions(+), 18 deletions(-) diff --git a/app/assets/javascripts/admin/bulk_product_update.js.coffee b/app/assets/javascripts/admin/bulk_product_update.js.coffee index 809e1a0628..1043305ddb 100644 --- a/app/assets/javascripts/admin/bulk_product_update.js.coffee +++ b/app/assets/javascripts/admin/bulk_product_update.js.coffee @@ -139,13 +139,13 @@ productsApp.controller "AdminBulkProductsCtrl", [ ] $scope.filterableColumns = [ - { name: "Supplier", db_column: "supplier" }, + { name: "Supplier", db_column: "supplier_name" }, { name: "Name", db_column: "name" } ] $scope.filterTypes = [ { name: "Equals", predicate: "eq" }, - { name: "Contains", predicate: "eq" } + { name: "Contains", predicate: "cont" } ] @@ -177,15 +177,24 @@ productsApp.controller "AdminBulkProductsCtrl", [ dataFetcher("/api/enterprises/managed?template=bulk_index&q[is_primary_producer_eq]=true").then (data) -> $scope.suppliers = data # Need to have suppliers before we get products so we can match suppliers to product.supplier - dataFetcher("/api/products/managed?template=bulk_index;page=1;per_page=500").then (data) -> - $scope.resetProducts data - $scope.loading = false + $scope.fetchProducts() else if authorise_api_reponse.hasOwnProperty("error") $scope.api_error_msg = authorise_api_reponse("error") else api_error_msg = "You don't have an API key yet. An attempt was made to generate one, but you are currently not authorised, please contact your site administrator for access." + $scope.fetchProducts = -> # WARNING: returns a promise + #apply current filters + $scope.loading = true + queryString = $scope.currentFilters.reduce (qs,f) -> + return qs + "q[#{f.property.db_column}_#{f.predicate.predicate}]=#{f.value};" + , "" + return dataFetcher("/api/products/managed?template=bulk_index;page=1;per_page=500;#{queryString}").then (data) -> + $scope.resetProducts data + $scope.loading = false + + $scope.resetProducts = (data) -> $scope.products = data $scope.dirtyProducts = {} @@ -241,6 +250,7 @@ productsApp.controller "AdminBulkProductsCtrl", [ if $scope.filterableColumns.indexOf(filter.property) >= 0 if $scope.filterTypes.indexOf(filter.predicate) >= 0 $scope.currentFilters.push filter + $scope.fetchProducts() $scope.editWarn = (product, variant) -> diff --git a/spec/features/admin/bulk_product_update_spec.rb b/spec/features/admin/bulk_product_update_spec.rb index 8c56588a9a..f34c4080ec 100644 --- a/spec/features/admin/bulk_product_update_spec.rb +++ b/spec/features/admin/bulk_product_update_spec.rb @@ -621,19 +621,32 @@ feature %q{ page.should have_field "filter_value" end - it "adds a new filter when the 'Apply Filter' button is clicked" do - FactoryGirl.create(:simple_product, :name => "Product1") - FactoryGirl.create(:simple_product, :name => "Product2") + describe "clicking the 'Apply Filter' Button" do + before(:each) do + FactoryGirl.create(:simple_product, :name => "Product1") + FactoryGirl.create(:simple_product, :name => "Product2") - login_to_admin_section - visit '/admin/products/bulk_edit' + login_to_admin_section + visit '/admin/products/bulk_edit' - select "Name", :from => "filter_property" - select "Equals", :from => "filter_predicate" - fill_in "filter_value", :with => "Product1" - click_button "Apply Filter" + select "Name", :from => "filter_property" + select "Equals", :from => "filter_predicate" + fill_in "filter_value", :with => "Product1" + click_button "Apply Filter" + end - page.should have_text "Name Equals Product1" + it "adds a new filter to the list of applied filters" do + page.should have_text "Name Equals Product1" + end + + it "displays the 'loading' splash" do + page.should have_selector "div.loading", :text => "Loading Products..." + end + + it "loads appropriate products" do + page.should have_field "product_name", :with => "Product1" + page.should_not have_field "product_name", :with => "Product2" + end end end end diff --git a/spec/javascripts/unit/bulk_product_update_spec.js.coffee b/spec/javascripts/unit/bulk_product_update_spec.js.coffee index 7857fbb375..c1cdd8958a 100644 --- a/spec/javascripts/unit/bulk_product_update_spec.js.coffee +++ b/spec/javascripts/unit/bulk_product_update_spec.js.coffee @@ -274,15 +274,41 @@ describe "AdminBulkProductsCtrl", -> it "gets a list of suppliers and then resets products with a list of data", -> httpBackend.expectGET("/api/users/authorise_api?token=api_key").respond success: "Use of API Authorised" httpBackend.expectGET("/api/enterprises/managed?template=bulk_index&q[is_primary_producer_eq]=true").respond "list of suppliers" - httpBackend.expectGET("/api/products/managed?template=bulk_index;page=1;per_page=500").respond "list of products" - spyOn scope, "resetProducts" + spyOn(scope, "fetchProducts").andReturn "nothing" scope.initialise "api_key" httpBackend.flush() expect(scope.suppliers).toEqual "list of suppliers" - expect(scope.resetProducts).toHaveBeenCalledWith "list of products" + expect(scope.fetchProducts.calls.length).toEqual 1 expect(scope.spree_api_key_ok).toEqual true + describe "fetching products", -> + it "makes a standard call to dataFetcher when no filters exist", -> + httpBackend.expectGET("/api/products/managed?template=bulk_index;page=1;per_page=500;").respond "list of products" + scope.fetchProducts() + + it "calls resetProducts after data has been received", -> + spyOn scope, "resetProducts" + httpBackend.expectGET("/api/products/managed?template=bulk_index;page=1;per_page=500;").respond "list of products" + scope.fetchProducts() + httpBackend.flush() + expect(scope.resetProducts).toHaveBeenCalledWith "list of products" + + it "applies filters when they are present", -> + filter = {property: scope.filterableColumns[1], predicate:scope.filterTypes[0], value:"Product1"} + scope.currentFilters.push filter # Don't use addFilter as that is not what we are testing + expect(scope.currentFilters).toEqual [filter] + httpBackend.expectGET("/api/products/managed?template=bulk_index;page=1;per_page=500;q[name_eq]=Product1;").respond "list of products" + scope.fetchProducts() + + it "sets the loading property to true before fetching products and unsets it when loading is complete", -> + httpBackend.expectGET("/api/products/managed?template=bulk_index;page=1;per_page=500;").respond "list of products" + scope.fetchProducts() + expect(scope.loading).toEqual true + httpBackend.flush() + expect(scope.loading).toEqual false + + describe "resetting products", -> beforeEach -> spyOn scope, "unpackProduct" @@ -902,6 +928,7 @@ describe "AdminBulkProductsCtrl", -> describe "filtering products", -> describe "adding a filter to the filter list", -> it "adds objects sent to addFilter() to $scope.currentFilters", -> + spyOn(scope, "fetchProducts").andReturn "nothing" filterObject1 = {property: scope.filterableColumns[0], predicate: scope.filterTypes[0], value: "Product1"} filterObject2 = {property: scope.filterableColumns[0], predicate: scope.filterTypes[0], value: "Product2"} scope.addFilter(filterObject1) @@ -909,6 +936,7 @@ describe "AdminBulkProductsCtrl", -> expect(scope.currentFilters).toEqual [filterObject1, filterObject2] it "ignores objects sent to addFilter() which do not contain a 'property' with a corresponding key in filterableColumns", -> + spyOn(scope, "fetchProducts").andReturn "nothing" filterObject1 = {property: scope.filterableColumns[0], predicate: scope.filterTypes[0], value: "value1"} filterObject2 = {property: scope.filterableColumns[1], predicate: scope.filterTypes[0], value: "value2"} filterObject3 = {property: "some_random_property", predicate: scope.filterTypes[0], value: "value3"} @@ -918,6 +946,7 @@ describe "AdminBulkProductsCtrl", -> expect(scope.currentFilters).toEqual [filterObject1, filterObject2] it "ignores objects sent to addFilter() which do not contain a query with a corresponding key in filterTypes", -> + spyOn(scope, "fetchProducts").andReturn "nothing" filterObject1 = {property: scope.filterableColumns[0], predicate: scope.filterTypes[0], value: "value1"} filterObject2 = {property: scope.filterableColumns[0], predicate: scope.filterTypes[1], value: "value2"} filterObject3 = {property: scope.filterableColumns[0], predicate: "something", value: "value3"} @@ -926,6 +955,11 @@ describe "AdminBulkProductsCtrl", -> scope.addFilter(filterObject3) expect(scope.currentFilters).toEqual [filterObject1, filterObject2] + it "calls fetchProducts when adding a new filter", -> + spyOn(scope, "fetchProducts").andReturn "nothing" + scope.addFilter( { property: scope.filterableColumns[0], predicate: scope.filterTypes[0], value: "value1" } ) + expect(scope.fetchProducts.calls.length).toEqual(1) + describe "converting arrays of objects with ids to an object with ids as keys", -> it "returns an object", ->