From 404913dcfad6b123e8eebda06cd2496ebdf30f85 Mon Sep 17 00:00:00 2001 From: Rob Harrington Date: Fri, 10 Nov 2017 15:51:33 +1100 Subject: [PATCH] Move form-saving logic into dedicated StandingOrderForm service --- .../standing_order_controller.js.coffee | 39 ++++--------------- .../services/standing_order_form.js.coffee | 35 +++++++++++++++++ 2 files changed, 43 insertions(+), 31 deletions(-) create mode 100644 app/assets/javascripts/admin/standing_orders/services/standing_order_form.js.coffee diff --git a/app/assets/javascripts/admin/standing_orders/controllers/standing_order_controller.js.coffee b/app/assets/javascripts/admin/standing_orders/controllers/standing_order_controller.js.coffee index 7e9bd7aa08..87435d099f 100644 --- a/app/assets/javascripts/admin/standing_orders/controllers/standing_order_controller.js.coffee +++ b/app/assets/javascripts/admin/standing_orders/controllers/standing_order_controller.js.coffee @@ -1,46 +1,18 @@ -angular.module("admin.standingOrders").controller "StandingOrderController", ($scope, $http, $window, StatusMessage, StandingOrder, customers, schedules, paymentMethods, shippingMethods) -> +angular.module("admin.standingOrders").controller "StandingOrderController", ($scope, $http, StandingOrder, StandingOrderForm, customers, schedules, paymentMethods, shippingMethods) -> $scope.standingOrder = new StandingOrder() + $scope.errors = null + $scope.save = null $scope.customers = customers $scope.schedules = schedules $scope.paymentMethods = paymentMethods $scope.shippingMethods = shippingMethods - $scope.errors = {} $scope.distributor_id = $scope.standingOrder.shop_id # variant selector requires distributor_id $scope.view = if $scope.standingOrder.id? then 'review' else 'details' $scope.nextCallbacks = {} $scope.backCallbacks = {} $scope.creditCards = [] - - successCallback = (response) -> - StatusMessage.display 'success', 'Saved. Redirecting...' - $window.location.href = "/admin/standing_orders" - - errorCallback = (response) -> - if response.data?.errors? - angular.extend($scope.errors, response.data.errors) - keys = Object.keys(response.data.errors) - StatusMessage.display 'failure', response.data.errors[keys[0]][0] - else - # Happens when there are sync issues between SO and initialised orders - # We save the SO, but open a dialog, so want to stay on the page - StatusMessage.display 'success', 'Saved' - - formInvalid = -> StatusMessage.display 'failure', t('admin.standing_orders.details.invalid_error') - - $scope.save = -> - return formInvalid() unless $scope.standing_order_form.$valid - delete $scope.errors[k] for k, v of $scope.errors - $scope.standing_order_form.$setPristine() - StatusMessage.display 'progress', 'Saving...' - if $scope.standingOrder.id? - $scope.standingOrder.update().then successCallback, errorCallback - else - $scope.standingOrder.create().then successCallback, errorCallback - $scope.setView = (view) -> $scope.view = view - $scope.stepTitleFor = (step) -> t("admin.standing_orders.steps.#{step}") - $scope.registerNextCallback = (view, callback) => $scope.nextCallbacks[view] = callback $scope.registerBackCallback = (view, callback) => $scope.backCallbacks[view] = callback $scope.next = -> $scope.nextCallbacks[$scope.view]() @@ -60,3 +32,8 @@ angular.module("admin.standingOrders").controller "StandingOrderController", ($s $scope.shipAddressFromBilling = => angular.extend($scope.standingOrder.ship_address, $scope.standingOrder.bill_address) + + $scope.$watch 'standing_order_form', -> + form = new StandingOrderForm($scope.standing_order_form, $scope.standingOrder) + $scope.errors = form.errors + $scope.save = form.save diff --git a/app/assets/javascripts/admin/standing_orders/services/standing_order_form.js.coffee b/app/assets/javascripts/admin/standing_orders/services/standing_order_form.js.coffee new file mode 100644 index 0000000000..24fe032eb8 --- /dev/null +++ b/app/assets/javascripts/admin/standing_orders/services/standing_order_form.js.coffee @@ -0,0 +1,35 @@ +angular.module("admin.standingOrders").factory 'StandingOrderForm', ($window, StatusMessage) -> + class StandingOrderForm + form: null + standingOrder: null + errors: {} + + constructor: (form, standingOrder) -> + @form = form + @standingOrder = standingOrder + + save: => + return @formInvalid() unless @form.$valid + delete @errors[k] for k, v of @errors + @form.$setPristine() + StatusMessage.display 'progress', 'Saving...' + if @standingOrder.id? + @standingOrder.update().then @successCallback, @errorCallback + else + @standingOrder.create().then @successCallback, @errorCallback + + successCallback: (response) => + StatusMessage.display 'success', 'Saved. Redirecting...' + $window.location.href = "/admin/standing_orders" + + errorCallback: (response) => + if response.data?.errors? + angular.extend(@errors, response.data.errors) + keys = Object.keys(response.data.errors) + StatusMessage.display 'failure', response.data.errors[keys[0]][0] + else + # Happens when there are sync issues between SO and initialised orders + # We save the SO, but open a dialog, so want to stay on the page + StatusMessage.display 'success', 'Saved' + + formInvalid: -> StatusMessage.display 'failure', t('admin.standing_orders.details.invalid_error')