asyncForm.coffee 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. define [
  2. "base"
  3. ], (App) ->
  4. App.directive "asyncForm", ($http) ->
  5. return {
  6. link: (scope, element, attrs) ->
  7. formName = attrs.asyncForm
  8. scope[attrs.name].response = response = {}
  9. scope[attrs.name].inflight = false
  10. element.on "submit", (e) ->
  11. e.preventDefault()
  12. formData = {}
  13. for data in element.serializeArray()
  14. formData[data.name] = data.value
  15. scope[attrs.name].inflight = true
  16. $http
  17. .post(element.attr('action'), formData)
  18. .success (data, status, headers, config) ->
  19. scope[attrs.name].inflight = false
  20. response.success = true
  21. response.error = false
  22. if data.redir?
  23. ga('send', 'event', formName, 'success')
  24. window.location = data.redir
  25. else if data.message?
  26. response.message = data.message
  27. if data.message.type == "error"
  28. response.success = false
  29. response.error = true
  30. ga('send', 'event', formName, 'failure', data.message)
  31. else
  32. ga('send', 'event', formName, 'success')
  33. .error (data, status, headers, config) ->
  34. scope[attrs.name].inflight = false
  35. response.success = false
  36. response.error = true
  37. response.message =
  38. text: data.message?.text or data.message or "Something went wrong talking to the server :(. Please try again."
  39. type: 'error'
  40. ga('send', 'event', formName, 'failure', data.message)
  41. }
  42. App.directive "formMessages", () ->
  43. return {
  44. restrict: "E"
  45. template: """
  46. <div class="alert" ng-class="{
  47. 'alert-danger': form.response.message.type == 'error',
  48. 'alert-success': form.response.message.type != 'error'
  49. }" ng-show="!!form.response.message">
  50. {{form.response.message.text}}
  51. </div>
  52. <div ng-transclude></div>
  53. """
  54. transclude: true
  55. scope: {
  56. form: "=for"
  57. }
  58. }