/
spinner.js.coffee
56 lines (45 loc) · 1.49 KB
/
spinner.js.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
spinner = angular.module("mb.spinner", [])
spinner.value "pendingRequests",
counter: 0
increment: -> @counter += 1
decrement: -> if @isPending() then @counter -= 1
isPending: -> @counter > 0
spinner.factory "pendingRequestsInterceptor", [
"$injector", "$q", "pendingRequests", ($injector, $q, pendingRequests) ->
(promise) ->
$http = $injector.get("$http")
onSuccess = (response) ->
pendingRequests.decrement()
response
onError = (response) ->
pendingRequests.decrement()
$q.reject(response)
promise.then(onSuccess, onError)
]
spinner.config [
"$httpProvider", "pendingRequestsProvider", ($httpProvider, pendingRequestsProvider) ->
# TODO use request interceptor
pendingRequests = pendingRequestsProvider.$get()
$httpProvider.defaults.transformRequest.push (data) ->
pendingRequests.increment()
data
$httpProvider.responseInterceptors.push("pendingRequestsInterceptor")
]
class SpinnerController
@$inject = ["$scope", "pendingRequests"]
constructor: (@$scope, @pendingRequests) ->
@$scope.showSpinner = @showSpinner
showSpinner: =>
@pendingRequests.isPending()
spinner.controller "spinner", SpinnerController
spinner.directive "spinner", ->
replace: true
restrict: "E"
template: """
<li class="spinner">
<a href="#">
<img ng-show="showSpinner()" src="/assets/ajax-loader.gif" />
</a>
</li>
"""
controller: "spinner"