From 46ad6216da38d6acfd3203b77aa56a6f9ef895f2 Mon Sep 17 00:00:00 2001 From: Dannel Albert Date: Wed, 6 Jan 2016 15:01:15 -0500 Subject: [PATCH 1/2] * Made use of http loader optional via param --- app/package/js/angular-http-loader.js | 14 +++++++++++--- app/package/js/angular-http-loader.min.js | 2 +- app/src/js/httpMethodInterceptor.js | 14 +++++++++++--- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/app/package/js/angular-http-loader.js b/app/package/js/angular-http-loader.js index ef55405..29c83a9 100644 --- a/app/package/js/angular-http-loader.js +++ b/app/package/js/angular-http-loader.js @@ -191,8 +191,7 @@ angular * The response configuration */ var checkAndHide = function (config) { - if (isUrlOnWhitelist(config.url) && - (--numLoadings) === 0) { + if (config.useHttpLoader && (--numLoadings) === 0) { $rootScope.$emit('loaderHide', config.method); } }; @@ -206,8 +205,17 @@ angular * @returns {object|Promise} */ request: function (config) { - if (isUrlOnWhitelist(config.url)) { + var useHttpLoaderFlagDefined = + angular.isObject(config.params) && + angular.isDefined(config.params.$useHttpLoader); + if (isUrlOnWhitelist(config.url) && + (!useHttpLoaderFlagDefined || + (useHttpLoaderFlagDefined && config.params.$useHttpLoader))) { numLoadings++; + if (useHttpLoaderFlagDefined) { + delete config.params.$useHttpLoader; // remove flag from params + } + config.useHttpLoader = true; $rootScope.$emit('loaderShow', config.method); } diff --git a/app/package/js/angular-http-loader.min.js b/app/package/js/angular-http-loader.min.js index fc4fe41..9a47bc0 100644 --- a/app/package/js/angular-http-loader.min.js +++ b/app/package/js/angular-http-loader.min.js @@ -1 +1 @@ -angular.module("ng.httpLoader",["ng.httpLoader.httpMethodInterceptor"]).directive("ngHttpLoader",["$rootScope","$parse","$timeout",function(a,b,c){return{scope:{methods:"@",template:"@",title:"@",ttl:"@"},template:'
',link:function(d){var e=b(d.methods)()||d.methods;e=angular.isUndefined(e)?[]:e,e=angular.isArray(e)?e:[e],angular.forEach(e,function(a,b){e[b]=a.toUpperCase()});var f=b(d.ttl)()||d.ttl;f=angular.isUndefined(f)?0:f,f=1e3*Number(f),f=angular.isNumber(f)?f:0,Array.prototype.indexOf||(e.indexOf=function(a){for(var b=this.length;b--;)if(this[b]===a)return b;return-1}),d.showLoader=!1;var g,h=d.showLoader,i=function(a,b){return-1!==e.indexOf(b.toUpperCase())?h="loaderShow"===a.name:0===e.length&&(h="loaderShow"===a.name),0>=f||!g&&!h?void(d.showLoader=h):void(g||(d.showLoader=h,g=c(function(){h||(d.showLoader=h),g=void 0},f)))};a.$on("loaderShow",i),a.$on("loaderHide",i)}}}]),angular.module("ng.httpLoader.httpMethodInterceptor",[]).provider("httpMethodInterceptor",function(){var a=[],b=!1;this.whitelistDomain=function(b){a.push(b)},this.whitelistLocalRequests=function(){b=!0},this.$get=["$q","$rootScope",function(c,d){var e=0,f=function(c){if("//"!==c.substring(0,2)&&-1===c.indexOf("://")&&b)return!0;for(var d=a.length;d--;)if(-1!==c.indexOf(a[d]))return!0;return!1},g=function(a){f(a.url)&&0===--e&&d.$emit("loaderHide",a.method)};return{request:function(a){return f(a.url)&&(e++,d.$emit("loaderShow",a.method)),a||c.when(a)},response:function(a){return g(a.config),a||c.when(a)},responseError:function(a){return g(a.config),c.reject(a)}}}]}).config(["$httpProvider",function(a){a.interceptors.unshift("httpMethodInterceptor")}]); \ No newline at end of file +angular.module("ng.httpLoader",["ng.httpLoader.httpMethodInterceptor"]).directive("ngHttpLoader",["$rootScope","$parse","$timeout",function(a,b,c){return{scope:{methods:"@",template:"@",title:"@",ttl:"@"},template:'
',link:function(d){var e=b(d.methods)()||d.methods;e=angular.isUndefined(e)?[]:e,e=angular.isArray(e)?e:[e],angular.forEach(e,function(a,b){e[b]=a.toUpperCase()});var f=b(d.ttl)()||d.ttl;f=angular.isUndefined(f)?0:f,f=1e3*Number(f),f=angular.isNumber(f)?f:0,Array.prototype.indexOf||(e.indexOf=function(a){for(var b=this.length;b--;)if(this[b]===a)return b;return-1}),d.showLoader=!1;var g,h=d.showLoader,i=function(a,b){return-1!==e.indexOf(b.toUpperCase())?h="loaderShow"===a.name:0===e.length&&(h="loaderShow"===a.name),0>=f||!g&&!h?void(d.showLoader=h):void(g||(d.showLoader=h,g=c(function(){h||(d.showLoader=h),g=void 0},f)))};a.$on("loaderShow",i),a.$on("loaderHide",i)}}}]),angular.module("ng.httpLoader.httpMethodInterceptor",[]).provider("httpMethodInterceptor",function(){var a=[],b=!1;this.whitelistDomain=function(b){a.push(b)},this.whitelistLocalRequests=function(){b=!0},this.$get=["$q","$rootScope",function(c,d){var e=0,f=function(c){if("//"!==c.substring(0,2)&&-1===c.indexOf("://")&&b)return!0;for(var d=a.length;d--;)if(-1!==c.indexOf(a[d]))return!0;return!1},g=function(a){a.useHttpLoader&&0===--e&&d.$emit("loaderHide",a.method)};return{request:function(a){var b=angular.isObject(a.params)&&angular.isDefined(a.params.$useHttpLoader);return f(a.url)&&(!b||b&&a.params.$useHttpLoader)&&(e++,b&&delete a.params.$useHttpLoader,a.useHttpLoader=!0,d.$emit("loaderShow",a.method)),a||c.when(a)},response:function(a){return g(a.config),a||c.when(a)},responseError:function(a){return g(a.config),c.reject(a)}}}]}).config(["$httpProvider",function(a){a.interceptors.unshift("httpMethodInterceptor")}]); \ No newline at end of file diff --git a/app/src/js/httpMethodInterceptor.js b/app/src/js/httpMethodInterceptor.js index fc0f6ee..6289b01 100644 --- a/app/src/js/httpMethodInterceptor.js +++ b/app/src/js/httpMethodInterceptor.js @@ -63,8 +63,7 @@ angular * The response configuration */ var checkAndHide = function (config) { - if (isUrlOnWhitelist(config.url) && - (--numLoadings) === 0) { + if (config.useHttpLoader && (--numLoadings) === 0) { $rootScope.$emit('loaderHide', config.method); } }; @@ -78,8 +77,17 @@ angular * @returns {object|Promise} */ request: function (config) { - if (isUrlOnWhitelist(config.url)) { + var useHttpLoaderFlagDefined = + angular.isObject(config.params) && + angular.isDefined(config.params.$useHttpLoader); + if (isUrlOnWhitelist(config.url) && + (!useHttpLoaderFlagDefined || + (useHttpLoaderFlagDefined && config.params.$useHttpLoader))) { numLoadings++; + if (useHttpLoaderFlagDefined) { + delete config.params.$useHttpLoader; // remove flag from params + } + config.useHttpLoader = true; $rootScope.$emit('loaderShow', config.method); } From d5e6796e4e50a002588745de85d7f10162658bc5 Mon Sep 17 00:00:00 2001 From: Dannel Albert Date: Tue, 19 Jan 2016 15:30:09 -0500 Subject: [PATCH 2/2] + Documentation for $useHttpLoader parameter --- README.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/README.md b/README.md index 14f3104..4274038 100644 --- a/README.md +++ b/README.md @@ -115,6 +115,26 @@ _The loader should be now visible at least 2 seconds, independent of the total h dispatched. Should the total amount of time of the request(s) be larger than the ttl, the loader will dismiss when the last http request is done._ +### Per-request use of HTTP Loader + +The HTTP loader can also be enabled or disabled by passing the $useHttpLoader parameter to the $http config object. + +```javascript +$http.get('/someUrl', { + params: {$useHttpLoader: true}, // will enable/disable http loader for this request regardless of whitelist +}); + +// or with a resource... +var User = $resource('/user/:userId', {userId:'@id', $useHttpLoader: true}); // default to always using the HTTP loader +var user = User.get( + {userId:123, $useHttpLoader: false}, // this call overrides default parameter defined above + function() { + user.abc = true; + user.$save(); + } +); +``` + Contributing ------------