mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-03-04 02:31:33 +00:00
Refactoring permalink checker to handle multiple requests elegantly
This commit is contained in:
@@ -1,17 +1,23 @@
|
||||
angular.module("admin.enterprises")
|
||||
.controller "permalinkCtrl", ($scope, PermalinkChecker) ->
|
||||
$scope.pristinePermalink = $scope.Enterprise.permalink
|
||||
# locals
|
||||
initialPermalink = $scope.Enterprise.permalink
|
||||
pendingRequest = null
|
||||
|
||||
# variables on $scope
|
||||
$scope.availablility = ""
|
||||
$scope.checking = false
|
||||
|
||||
$scope.$watch "Enterprise.permalink", (newValue, oldValue) ->
|
||||
if newValue == $scope.pristinePermalink
|
||||
$scope.availability = ""
|
||||
else
|
||||
$scope.checking = true
|
||||
PermalinkChecker.check(newValue).then (data) ->
|
||||
$scope.availability = 'Available'
|
||||
$scope.checking = false
|
||||
, (data) ->
|
||||
$scope.availability = 'Unavailable'
|
||||
$scope.checking = false
|
||||
$scope.checking = true
|
||||
pendingRequest = PermalinkChecker.check(newValue)
|
||||
|
||||
pendingRequest.then (data) ->
|
||||
if data.permalink == initialPermalink
|
||||
$scope.availability = ""
|
||||
else
|
||||
$scope.availability = data.available
|
||||
$scope.Enterprise.permalink = data.permalink
|
||||
$scope.checking = false
|
||||
, (data) ->
|
||||
# Do nothing (this is hopefully an aborted request)
|
||||
|
||||
@@ -1,11 +1,36 @@
|
||||
angular.module("admin.enterprises").factory 'PermalinkChecker', ($q, $http) ->
|
||||
new class PermalinkChecker
|
||||
check: (permalink) ->
|
||||
deferred = $q.defer()
|
||||
$http.get("/enterprises/check_permalink?permalink=#{permalink}", { headers: { 'Accept': 'application/javascript' } } )
|
||||
.success( (data) ->
|
||||
deferred.resolve data
|
||||
).error (data) ->
|
||||
deferred.reject(data)
|
||||
deferredRequest: null
|
||||
deferredAbort: null
|
||||
|
||||
deferred.promise
|
||||
check: (permalink) =>
|
||||
@abort(@deferredAbort) if @deferredRequest && @deferredRequest.promise
|
||||
@deferredRequest = deferredRequest = $q.defer()
|
||||
@deferredAbort = deferredAbort = $q.defer()
|
||||
request = $http(
|
||||
method: "GET"
|
||||
url: "/enterprises/check_permalink?permalink=#{permalink}"
|
||||
headers:
|
||||
Accept: 'application/javascript'
|
||||
timeout: deferredAbort.promise
|
||||
)
|
||||
.success( (data) =>
|
||||
deferredRequest.resolve
|
||||
permalink: data
|
||||
available: "Available"
|
||||
).error (data,status) =>
|
||||
if status == 409
|
||||
deferredRequest.resolve
|
||||
permalink: data
|
||||
available: "Unavailable"
|
||||
else
|
||||
# Something went wrong or request was aborted
|
||||
deferredRequest.reject()
|
||||
|
||||
deferredRequest.promise.finally ->
|
||||
request = deferredRequest.promise = null;
|
||||
|
||||
deferredRequest.promise
|
||||
|
||||
abort: (deferredAbort) ->
|
||||
deferredAbort.resolve()
|
||||
|
||||
Reference in New Issue
Block a user