diff --git a/app/assets/javascripts/admin/enterprises/controllers/permalink_controller.js.coffee b/app/assets/javascripts/admin/enterprises/controllers/permalink_controller.js.coffee index 4201fc3be1..a842209dbc 100644 --- a/app/assets/javascripts/admin/enterprises/controllers/permalink_controller.js.coffee +++ b/app/assets/javascripts/admin/enterprises/controllers/permalink_controller.js.coffee @@ -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 \ No newline at end of file + $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) diff --git a/app/assets/javascripts/admin/enterprises/services/permalink_checker.js.coffee b/app/assets/javascripts/admin/enterprises/services/permalink_checker.js.coffee index b67856b91e..cb3fde9324 100644 --- a/app/assets/javascripts/admin/enterprises/services/permalink_checker.js.coffee +++ b/app/assets/javascripts/admin/enterprises/services/permalink_checker.js.coffee @@ -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()