UNPKG

angular-blocking-click

Version:

In place "request in progress" indicator

60 lines (52 loc) 2.31 kB
angular.module('blockingClick', []) .provider('requestCounter', function($httpProvider){ this.$get = ['$timeout', function($timeout){ var activeRequests = 0, obj = { callbacks: [] }; $httpProvider.defaults.transformRequest.push(function(data){ activeRequests++; return data; }); $httpProvider.defaults.transformResponse.push(function(data){ activeRequests--; if (activeRequests == 0){ angular.forEach(obj.callbacks, function(f){ $timeout(function(){ if (activeRequests == 0) f(); else obj.callbacks.push(f); }); }); obj.callbacks = []; } return data; }); return obj; }]; }) .directive('blockingClick', function() { return { restrict: 'A', controller: function($scope, $element, $attrs, requestCounter){ angular.element($element).on("click", function(){ var spinner, isText = false; if (!angular.isUndefined($attrs.blockingClick) && angular.isString($attrs.blockingClick) && $attrs.blockingClick != "" && $attrs.blockingClick != "$spinner"){ spinner = angular.element('<div/>').css('text-align', 'center').css('white-space', 'nowrap').text($attrs.blockingClick); isText = true; }else{ spinner = angular.element('<div class="spinner"/>'); } spinner.css('position', 'absolute'); var container = angular.element('<div class="blocking-click"/>').insertBefore($element).append(spinner); container.css({height: angular.element($element).outerHeight(true) + 'px', width: angular.element($element).outerWidth(true) + 'px', position: 'relative'}); spinner.css('top', container.innerHeight()/2 - spinner.outerHeight()/2 + 'px'); spinner.css('left', container.innerWidth()/2 - spinner.outerWidth()/2 + 'px'); var disp = angular.element($element).css('display'); angular.element($element).css('display','none'); requestCounter.callbacks.push(function() { container.remove(); angular.element($element).css('display', disp); }); return true; }); } }; });