diff --git a/app/assets/javascripts/admin/customers/controllers/customers_controller.js.coffee b/app/assets/javascripts/admin/customers/controllers/customers_controller.js.coffee index 9e956a1977..2506e994ac 100644 --- a/app/assets/javascripts/admin/customers/controllers/customers_controller.js.coffee +++ b/app/assets/javascripts/admin/customers/controllers/customers_controller.js.coffee @@ -3,8 +3,8 @@ angular.module("admin.customers").controller "customersCtrl", ($scope, $q, $filt $scope.availableCountries = availableCountries $scope.RequestMonitor = RequestMonitor $scope.submitAll = pendingChanges.submitAll - $scope.add = Customers.add $scope.customerLimit = 20 + $scope.customers = Customers.all $scope.columns = Columns.columns $scope.confirmRefresh = (event) -> @@ -16,7 +16,6 @@ angular.module("admin.customers").controller "customersCtrl", ($scope, $q, $filt Customers.index({enterprise_id: $scope.shop_id}).then (data) -> pendingChanges.removeAll() $scope.customers_form.$setPristine() - $scope.customers = data $scope.shop_id = shops[0].id if shops.length == 1 diff --git a/app/assets/javascripts/admin/customers/services/customer_resource.js.coffee b/app/assets/javascripts/admin/resources/resources/customer_resource.js.coffee similarity index 86% rename from app/assets/javascripts/admin/customers/services/customer_resource.js.coffee rename to app/assets/javascripts/admin/resources/resources/customer_resource.js.coffee index 3904d0333d..0a67586374 100644 --- a/app/assets/javascripts/admin/customers/services/customer_resource.js.coffee +++ b/app/assets/javascripts/admin/resources/resources/customer_resource.js.coffee @@ -1,4 +1,4 @@ -angular.module("admin.customers").factory 'CustomerResource', ($resource) -> +angular.module("admin.resources").factory 'CustomerResource', ($resource) -> $resource('/admin/customers/:id.json', {}, { 'index': method: 'GET' diff --git a/app/assets/javascripts/admin/customers/services/customers.js.coffee b/app/assets/javascripts/admin/resources/services/customers.js.coffee similarity index 58% rename from app/assets/javascripts/admin/customers/services/customers.js.coffee rename to app/assets/javascripts/admin/resources/services/customers.js.coffee index f4c6f6f3cd..6b73f5c4db 100644 --- a/app/assets/javascripts/admin/customers/services/customers.js.coffee +++ b/app/assets/javascripts/admin/resources/services/customers.js.coffee @@ -1,19 +1,24 @@ -angular.module("admin.customers").factory "Customers", ($q, InfoDialog, RequestMonitor, CustomerResource, CurrentShop) -> +angular.module("admin.resources").factory "Customers", ($q, InfoDialog, RequestMonitor, CustomerResource, CurrentShop) -> new class Customers - customers: [] + all: [] + byID: {} + pristineByID: {} add: (email) -> params = enterprise_id: CurrentShop.shop.id email: email CustomerResource.create params, (customer) => - @customers.unshift customer if customer.id + if customer.id + @all.unshift customer + @byID[customer.id] = customer + @pristineByID[customer.id] = angular.copy(customer) remove: (customer) -> params = id: customer.id CustomerResource.destroy params, => - i = @customers.indexOf customer - @customers.splice i, 1 unless i < 0 + i = @all.indexOf customer + @all.splice i, 1 unless i < 0 , (response) => errors = response.data.errors if errors? @@ -22,14 +27,19 @@ angular.module("admin.customers").factory "Customers", ($q, InfoDialog, RequestM InfoDialog.open 'error', "Could not delete customer: #{customer.email}" index: (params) -> - request = CustomerResource.index(params, (data) => @customers = data) + request = CustomerResource.index(params, (data) => @load(data)) RequestMonitor.load(request.$promise) request.$promise + load: (customers) -> + for customer in customers + @all.push customer + @byID[customer.id] = customer + @pristineByID[customer.id] = angular.copy(customer) + update: (address, customer, addressType) -> params = id: customer.id customer: "#{addressType}_attributes": address CustomerResource.update params - diff --git a/spec/javascripts/unit/admin/customers/controllers/customers_controller_spec.js.coffee b/spec/javascripts/unit/admin/customers/controllers/customers_controller_spec.js.coffee index 5f3deff550..ce4b967f90 100644 --- a/spec/javascripts/unit/admin/customers/controllers/customers_controller_spec.js.coffee +++ b/spec/javascripts/unit/admin/customers/controllers/customers_controller_spec.js.coffee @@ -62,28 +62,17 @@ describe "CustomersCtrl", -> as = scope.findByCode('b') expect(as).toDeepEqual [] - describe "scope.add", -> - it "creates a new customer", -> - email = "customer@example.org" - newCustomer = {id: 6, email: email} - customers.unshift(newCustomer) - http.expectPOST('/admin/customers.json?email=' + email + '&enterprise_id=3').respond 200, newCustomer - scope.add(email) - http.flush() - expect(scope.customers).toDeepEqual customers - describe "scope.deleteCustomer", -> beforeEach -> spyOn(window, 'confirm').and.returnValue(true) it "deletes a customer", -> - expect(scope.customers.length).toBe 2 + expect(scope.customers.length).toBe 1 customer = scope.customers[0] http.expectDELETE('/admin/customers/' + customer.id + '.json').respond 200 scope.deleteCustomer(customer) http.flush() - expect(scope.customers.length).toBe 1 - expect(scope.customers[0]).not.toDeepEqual customer + expect(scope.customers.length).toBe 0 describe "scope.findTags", -> tags = [ diff --git a/spec/javascripts/unit/admin/customers/services/customers_spec.js.coffee b/spec/javascripts/unit/admin/customers/services/customers_spec.js.coffee new file mode 100644 index 0000000000..569701d29c --- /dev/null +++ b/spec/javascripts/unit/admin/customers/services/customers_spec.js.coffee @@ -0,0 +1,23 @@ +describe "Customers", -> + Customers = CurrentShop = customers = $httpBackend = null + + beforeEach -> + module 'admin.customers' + + jasmine.addMatchers + toDeepEqual: (util, customEqualityTesters) -> + compare: (actual, expected) -> + { pass: angular.equals(actual, expected) } + + inject ($q, _$httpBackend_, _Customers_, _CurrentShop_) -> + Customers = _Customers_ + + describe "scope.add", -> + it "creates a new customer", inject ($httpBackend, CurrentShop) -> + email = "customer@example.org" + newCustomer = {id: 6, email: email} + CurrentShop.shop = { id: 3 } + $httpBackend.expectPOST('/admin/customers.json?email=' + email + '&enterprise_id=3').respond 200, newCustomer + Customers.add(email) + $httpBackend.flush() + expect(Customers.all).toDeepEqual [newCustomer]