Move form-saving logic into dedicated StandingOrderForm service

This commit is contained in:
Rob Harrington
2017-11-10 15:51:33 +11:00
parent c94badbf36
commit 404913dcfa
2 changed files with 43 additions and 31 deletions

View File

@@ -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

View File

@@ -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')