diff --git a/app/assets/javascripts/admin/services/bulk_products.js.coffee b/app/assets/javascripts/admin/services/bulk_products.js.coffee index ae845c23b9..d898356846 100644 --- a/app/assets/javascripts/admin/services/bulk_products.js.coffee +++ b/app/assets/javascripts/admin/services/bulk_products.js.coffee @@ -1,4 +1,4 @@ -angular.module("ofn.admin").factory "BulkProducts", (dataFetcher) -> +angular.module("ofn.admin").factory "BulkProducts", (PagedFetcher, dataFetcher) -> new class BulkProducts products: [] @@ -6,13 +6,9 @@ angular.module("ofn.admin").factory "BulkProducts", (dataFetcher) -> queryString = filters.reduce (qs,f) -> return qs + "q[#{f.property.db_column}_#{f.predicate.predicate}]=#{f.value};" , "" - return dataFetcher("/api/products/bulk_products?page=1;per_page=20;#{queryString}").then (data) => - @addProducts data.products - if data.pages > 1 - for page in [2..data.pages] - dataFetcher("/api/products/bulk_products?page=#{page};per_page=20;#{queryString}").then (data) => - @addProducts data.products + url = "/api/products/bulk_products?page=::page::;per_page=20;#{queryString}" + PagedFetcher.fetch url, (data) => @addProducts data.products cloneProduct: (product) -> dataFetcher("/admin/products/" + product.permalink_live + "/clone.json").then (data) => diff --git a/app/assets/javascripts/admin/services/paged_fetcher.js.coffee b/app/assets/javascripts/admin/services/paged_fetcher.js.coffee new file mode 100644 index 0000000000..9281ed6a42 --- /dev/null +++ b/app/assets/javascripts/admin/services/paged_fetcher.js.coffee @@ -0,0 +1,16 @@ +angular.module("ofn.admin").factory "PagedFetcher", (dataFetcher) -> + new class PagedFetcher + # Given a URL like http://example.com/foo?page=::page::&per_page=20 + # And the response includes an attribute pages with the number of pages to fetch + # Fetch each page async, and call the processData callback with the resulting data + fetch: (url, processData) -> + dataFetcher(@urlForPage(url, 1)).then (data) => + processData data + + if data.pages > 1 + for page in [2..data.pages] + dataFetcher(@urlForPage(url, page)).then (data) -> + processData data + + urlForPage: (url, page) -> + url.replace("::page::", page) \ No newline at end of file diff --git a/spec/javascripts/unit/admin/services/paged_fetcher.js.coffee b/spec/javascripts/unit/admin/services/paged_fetcher.js.coffee new file mode 100644 index 0000000000..b6c2fdf9e1 --- /dev/null +++ b/spec/javascripts/unit/admin/services/paged_fetcher.js.coffee @@ -0,0 +1,13 @@ +describe "PagedFetcher service", -> + PagedFetcher = null + + beforeEach -> + module "ofn.admin" + + beforeEach inject (_PagedFetcher_) -> + PagedFetcher = _PagedFetcher_ + + describe "substituting a page in the URL", -> + it "replaces ::page:: with the given page number", -> + expect(PagedFetcher.urlForPage("http://example.com/foo?page=::page::&per_page=20", 12)). + toEqual "http://example.com/foo?page=12&per_page=20"