From 767671c3b4eaf643b52ff956fc75ddedb3e6173e Mon Sep 17 00:00:00 2001 From: Rob Harrington Date: Mon, 16 Nov 2015 10:30:44 +1100 Subject: [PATCH] New pattern: blank Options for index drop down filters are added within service Rather than in the controller after data is loaded --- .../services/enterprises.js.coffee | 10 ++++- .../line_items_controller.js.coffee | 9 ++-- .../admin/order_cycles/order_cycles.js.coffee | 2 +- .../services/order_cycles.js.coffee | 10 ++++- .../services/enterprises_spec.js.coffee | 44 ++++++++++++++----- .../services/order_cycles_spec.js.coffee | 44 ++++++++++++++----- 6 files changed, 88 insertions(+), 31 deletions(-) diff --git a/app/assets/javascripts/admin/enterprises/services/enterprises.js.coffee b/app/assets/javascripts/admin/enterprises/services/enterprises.js.coffee index 152d4ce4fb..b159816709 100644 --- a/app/assets/javascripts/admin/enterprises/services/enterprises.js.coffee +++ b/app/assets/javascripts/admin/enterprises/services/enterprises.js.coffee @@ -1,16 +1,22 @@ -angular.module("admin.enterprises").factory 'Enterprises', ($q, EnterpriseResource) -> +angular.module("admin.enterprises").factory 'Enterprises', ($q, EnterpriseResource, blankOption) -> new class Enterprises enterprisesByID: {} pristineByID: {} index: (params={}, callback=null) -> - EnterpriseResource.index params, (data) => + includeBlank = !!params['includeBlank'] + delete params['includeBlank'] + EnterpriseResource.index(params, (data) => for enterprise in data @enterprisesByID[enterprise.id] = enterprise @pristineByID[enterprise.id] = angular.copy(enterprise) (callback || angular.noop)(data) + data.unshift(blankOption()) if includeBlank + data + ) + save: (enterprise) -> deferred = $q.defer() enterprise.$update({id: enterprise.permalink}) diff --git a/app/assets/javascripts/admin/line_items/controllers/line_items_controller.js.coffee b/app/assets/javascripts/admin/line_items/controllers/line_items_controller.js.coffee index b64eb44968..ad65328ea7 100644 --- a/app/assets/javascripts/admin/line_items/controllers/line_items_controller.js.coffee +++ b/app/assets/javascripts/admin/line_items/controllers/line_items_controller.js.coffee @@ -43,9 +43,9 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout, RequestMonitor.load $scope.lineItems = LineItems.index("q[order][state_not_eq]": "canceled", "q[order][completed_at_not_null]": "true", "q[order][completed_at_gt]": "#{$scope.startDate}", "q[order][completed_at_lt]": "#{$scope.endDate}") unless $scope.initialized - RequestMonitor.load $scope.distributors = Enterprises.index(action: "for_line_items", ams_prefix: "basic", "q[sells_in][]": ["own", "any"] ) - RequestMonitor.load $scope.orderCycles = OrderCycles.index(ams_prefix: "basic", as: "distributor", "q[orders_close_at_gt]": "#{formatDate(daysFromToday(-90))}") - RequestMonitor.load $scope.suppliers = Enterprises.index(action: "for_line_items", ams_prefix: "basic", "q[is_primary_producer_eq]": "true" ) + RequestMonitor.load $scope.distributors = Enterprises.index(includeBlank: true, action: "for_line_items", ams_prefix: "basic", "q[sells_in][]": ["own", "any"]) + RequestMonitor.load $scope.orderCycles = OrderCycles.index(includeBlank: true, ams_prefix: "basic", as: "distributor", "q[orders_close_at_gt]": "#{formatDate(daysFromToday(-90))}") + RequestMonitor.load $scope.suppliers = Enterprises.index(includeBlank: true, action: "for_line_items", ams_prefix: "basic", "q[is_primary_producer_eq]": "true") RequestMonitor.load $q.all([$scope.orders.$promise, $scope.distributors.$promise, $scope.orderCycles.$promise]).then -> Dereferencer.dereferenceAttr $scope.orders, "distributor", Enterprises.enterprisesByID @@ -58,9 +58,6 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout, unless $scope.initialized $scope.initialized = true $timeout -> - $scope.orderCycles.unshift blankOption() - $scope.suppliers.unshift blankOption() - $scope.distributors.unshift blankOption() $scope.resetSelectFilters() $scope.refreshData() diff --git a/app/assets/javascripts/admin/order_cycles/order_cycles.js.coffee b/app/assets/javascripts/admin/order_cycles/order_cycles.js.coffee index 1362751b80..2f97440e71 100644 --- a/app/assets/javascripts/admin/order_cycles/order_cycles.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/order_cycles.js.coffee @@ -1 +1 @@ -angular.module('admin.orderCycles', ['ngResource']) +angular.module('admin.orderCycles', ['ngResource', 'admin.indexUtils']) diff --git a/app/assets/javascripts/admin/order_cycles/services/order_cycles.js.coffee b/app/assets/javascripts/admin/order_cycles/services/order_cycles.js.coffee index 48bdf57147..a182f19f12 100644 --- a/app/assets/javascripts/admin/order_cycles/services/order_cycles.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/services/order_cycles.js.coffee @@ -1,16 +1,22 @@ -angular.module("admin.orderCycles").factory 'OrderCycles', ($q, OrderCycleResource) -> +angular.module("admin.orderCycles").factory 'OrderCycles', ($q, OrderCycleResource, blankOption) -> new class OrderCycles orderCyclesByID: {} pristineByID: {} index: (params={}, callback=null) -> - OrderCycleResource.index params, (data) => + includeBlank = !!params['includeBlank'] + delete params['includeBlank'] + OrderCycleResource.index(params, (data) => for orderCycle in data @orderCyclesByID[orderCycle.id] = orderCycle @pristineByID[orderCycle.id] = angular.copy(orderCycle) (callback || angular.noop)(data) + data.unshift(blankOption()) if includeBlank + data + ) + save: (order_cycle) -> deferred = $q.defer() order_cycle.$update({id: order_cycle.id}) diff --git a/spec/javascripts/unit/admin/enterprises/services/enterprises_spec.js.coffee b/spec/javascripts/unit/admin/enterprises/services/enterprises_spec.js.coffee index ae28114ae0..fb653d2df4 100644 --- a/spec/javascripts/unit/admin/enterprises/services/enterprises_spec.js.coffee +++ b/spec/javascripts/unit/admin/enterprises/services/enterprises_spec.js.coffee @@ -18,19 +18,43 @@ describe "Enterprises service", -> beforeEach -> response = [{ id: 5, name: 'Enterprise 1'}] - $httpBackend.expectGET('/admin/enterprises.json').respond 200, response - result = Enterprises.index() - $httpBackend.flush() - it "stores returned data in @enterprisesByID, with ids as keys", -> - # EnterpriseResource returns instances of Resource rather than raw objects - expect(Enterprises.enterprisesByID).toDeepEqual { 5: response[0] } + describe "when no params are passed", -> + beforeEach -> + $httpBackend.expectGET('/admin/enterprises.json').respond 200, response + result = Enterprises.index() + $httpBackend.flush() - it "stores returned data in @pristineByID, with ids as keys", -> - expect(Enterprises.pristineByID).toDeepEqual { 5: response[0] } + it "stores returned data in @enterprisesByID, with ids as keys", -> + # EnterpriseResource returns instances of Resource rather than raw objects + expect(Enterprises.enterprisesByID).toDeepEqual { 5: response[0] } - it "returns an array of enterprises", -> - expect(result).toDeepEqual response + it "stores returned data in @pristineByID, with ids as keys", -> + expect(Enterprises.pristineByID).toDeepEqual { 5: response[0] } + + it "returns an array of enterprises", -> + expect(result).toDeepEqual response + + describe "when params are passed", -> + describe "where includeBlank param is truthy", -> + beforeEach -> + params = {includeBlank: true, someParam: 'someVal'} + $httpBackend.expectGET('/admin/enterprises.json?someParam=someVal').respond 200, response + result = Enterprises.index(params) + $httpBackend.flush() + + it "returns an array of enterprises, with a blank option appended to the beginning", -> + expect(result).toDeepEqual [{id: '0', name: 'All'} ,{ id: 5, name: 'Enterprise 1'}] + + describe "where includeBlank param is falsey", -> + beforeEach -> + params = {includeBlank: false, someParam: 'someVal'} + $httpBackend.expectGET('/admin/enterprises.json?someParam=someVal').respond 200, response + result = Enterprises.index(params) + $httpBackend.flush() + + it "returns an array of enterprises, with a blank option appended to the beginning", -> + expect(result).toDeepEqual response describe "#save", -> diff --git a/spec/javascripts/unit/admin/order_cycles/services/order_cycles_spec.js.coffee b/spec/javascripts/unit/admin/order_cycles/services/order_cycles_spec.js.coffee index 2004ec378b..2ddfe92407 100644 --- a/spec/javascripts/unit/admin/order_cycles/services/order_cycles_spec.js.coffee +++ b/spec/javascripts/unit/admin/order_cycles/services/order_cycles_spec.js.coffee @@ -18,19 +18,43 @@ describe "OrderCycles service", -> beforeEach -> response = [{ id: 5, name: 'OrderCycle 1'}] - $httpBackend.expectGET('/admin/order_cycles.json').respond 200, response - result = OrderCycles.index() - $httpBackend.flush() - it "stores returned data in @orderCyclesByID, with ids as keys", -> - # OrderCycleResource returns instances of Resource rather than raw objects - expect(OrderCycles.orderCyclesByID).toDeepEqual { 5: response[0] } + describe "when no params are passed", -> + beforeEach -> + $httpBackend.expectGET('/admin/order_cycles.json').respond 200, response + result = OrderCycles.index() + $httpBackend.flush() - it "stores returned data in @pristineByID, with ids as keys", -> - expect(OrderCycles.pristineByID).toDeepEqual { 5: response[0] } + it "stores returned data in @orderCyclesByID, with ids as keys", -> + # OrderCycleResource returns instances of Resource rather than raw objects + expect(OrderCycles.orderCyclesByID).toDeepEqual { 5: response[0] } - it "returns an array of orderCycles", -> - expect(result).toDeepEqual response + it "stores returned data in @pristineByID, with ids as keys", -> + expect(OrderCycles.pristineByID).toDeepEqual { 5: response[0] } + + it "returns an array of orderCycles", -> + expect(result).toDeepEqual response + + describe "when no params are passed", -> + describe "where includeBlank param is truthy", -> + beforeEach -> + params = {includeBlank: true, someParam: 'someVal'} + $httpBackend.expectGET('/admin/order_cycles.json?someParam=someVal').respond 200, response + result = OrderCycles.index(params) + $httpBackend.flush() + + it "returns an array of orderCycles", -> + expect(result).toDeepEqual [{id: '0', name: 'All'} ,{ id: 5, name: 'OrderCycle 1'}] + + describe "where includeBlank param is falsey", -> + beforeEach -> + params = {includeBlank: false, someParam: 'someVal'} + $httpBackend.expectGET('/admin/order_cycles.json?someParam=someVal').respond 200, response + result = OrderCycles.index(params) + $httpBackend.flush() + + it "returns an array of orderCycles", -> + expect(result).toDeepEqual response describe "#save", ->