You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

lubusy.js 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. /**
  2. * Created by robin on 10/24/15.
  3. */
  4. angular.module('luticateUtils')
  5. .directive('luBusy', ['$compile', 'luticatePromises', function($compile, luticatePromises){
  6. return {
  7. restrict: 'A',
  8. scope: {},
  9. link: function($scope, element, attrs) {
  10. var position = element.css('position');
  11. if (position === 'static' || position === '' || typeof position === 'undefined'){
  12. element.css('position','relative');
  13. }
  14. var group = attrs.luBusy;
  15. $scope.isLoading = false;
  16. $scope.hasError = false;
  17. $scope.update = function()
  18. {
  19. var loaders = luticatePromises.getLoadersGroup(group);
  20. $scope.isLoading = false;
  21. if (loaders != null) {
  22. $scope.isLoading = loaders.some(function (promise) {
  23. return promise.status == 0;
  24. });
  25. }
  26. var errors = luticatePromises.getLoadersGroup(group);
  27. $scope.hasError = false;
  28. if (loaders != null) {
  29. $scope.hasError = errors.some(function (promise) {
  30. return promise.status == 2;
  31. });
  32. }
  33. };
  34. $scope.loaderSplashIsActive = function() {
  35. $scope.update();
  36. return $scope.isLoading && !$scope.hasError;
  37. };
  38. $scope.errorSplashIsActive = function() {
  39. $scope.update();
  40. return $scope.hasError;
  41. };
  42. var backdrop = '<div class="lu-busy lu-busy-backdrop lu-busy-backdrop-animation ng-hide" ng-show="loaderSplashIsActive()"></div>';
  43. var backdropElement = $compile(backdrop)($scope);
  44. element.append(backdropElement);
  45. var template = '<div class="lu-busy lu-busy-animation ng-hide" ng-show="loaderSplashIsActive()"><div class="lu-busy-default-wrapper">' +
  46. '<div class="lu-busy-default-sign">' +
  47. '<div class="lu-busy-default-text">Please wait...</div>' +
  48. '</div>' +
  49. '</div></div>';
  50. var templateElement = $compile(template)($scope);
  51. angular.element(templateElement.children()[0])
  52. .css('position','absolute')
  53. .css('top',0)
  54. .css('left',0)
  55. .css('right',0)
  56. .css('bottom',0);
  57. element.append(templateElement);
  58. }
  59. };
  60. }
  61. ]);
  62. /*
  63. angular.module('luticateUtils').factory('_luBusyTrackerFactory',['$timeout','$q',function($timeout,$q){
  64. return function(){
  65. var tracker = {};
  66. tracker.promises = [];
  67. tracker.delayPromise = null;
  68. tracker.durationPromise = null;
  69. tracker.delayJustFinished = false;
  70. tracker.reset = function(options){
  71. tracker.minDuration = options.minDuration;
  72. tracker.promises = [];
  73. angular.forEach(options.promises,function(p){
  74. if (!p || p.$luBusyFulfilled) {
  75. return;
  76. }
  77. addPromiseLikeThing(p);
  78. });
  79. if (tracker.promises.length === 0) {
  80. //if we have no promises then dont do the delay or duration stuff
  81. return;
  82. }
  83. tracker.delayJustFinished = false;
  84. if (options.delay) {
  85. tracker.delayPromise = $timeout(function(){
  86. tracker.delayPromise = null;
  87. tracker.delayJustFinished = true;
  88. },parseInt(options.delay,10));
  89. }
  90. if (options.minDuration) {
  91. tracker.durationPromise = $timeout(function(){
  92. tracker.durationPromise = null;
  93. },parseInt(options.minDuration,10) + (options.delay ? parseInt(options.delay,10) : 0));
  94. }
  95. };
  96. tracker.isPromise = function(promiseThing){
  97. var then = promiseThing && (promiseThing.then || promiseThing.$then ||
  98. (promiseThing.$promise && promiseThing.$promise.then));
  99. return typeof then !== 'undefined';
  100. };
  101. tracker.callThen = function(promiseThing,success,error){
  102. var promise;
  103. if (promiseThing.then || promiseThing.$then){
  104. promise = promiseThing;
  105. } else if (promiseThing.$promise){
  106. promise = promiseThing.$promise;
  107. } else if (promiseThing.denodeify){
  108. promise = $q.when(promiseThing);
  109. }
  110. var then = (promise.then || promise.$then);
  111. then.call(promise,success,error);
  112. };
  113. var addPromiseLikeThing = function(promise){
  114. if (!tracker.isPromise(promise)) {
  115. throw new Error('luBusy expects a promise (or something that has a .promise or .$promise');
  116. }
  117. if (tracker.promises.indexOf(promise) !== -1){
  118. return;
  119. }
  120. tracker.promises.push(promise);
  121. tracker.callThen(promise, function(){
  122. promise.$luBusyFulfilled = true;
  123. if (tracker.promises.indexOf(promise) === -1) {
  124. return;
  125. }
  126. tracker.promises.splice(tracker.promises.indexOf(promise),1);
  127. },function(){
  128. promise.$luBusyFulfilled = true;
  129. if (tracker.promises.indexOf(promise) === -1) {
  130. return;
  131. }
  132. tracker.promises.splice(tracker.promises.indexOf(promise),1);
  133. });
  134. };
  135. tracker.active = function(){
  136. if (tracker.delayPromise){
  137. return false;
  138. }
  139. if (!tracker.delayJustFinished){
  140. if (tracker.durationPromise){
  141. return true;
  142. }
  143. return tracker.promises.length > 0;
  144. } else {
  145. //if both delay and min duration are set,
  146. //we don't want to initiate the min duration if the
  147. //promise finished before the delay was complete
  148. tracker.delayJustFinished = false;
  149. if (tracker.promises.length === 0) {
  150. tracker.durationPromise = null;
  151. }
  152. return tracker.promises.length > 0;
  153. }
  154. };
  155. return tracker;
  156. };
  157. }]);
  158. angular.module('luticateUtils').value('luBusyDefaults',{});
  159. angular.module('luticateUtils').directive('luBusy',['$compile','$templateCache','luBusyDefaults','$http','_luBusyTrackerFactory',
  160. function($compile,$templateCache,luBusyDefaults,$http,_luBusyTrackerFactory){
  161. return {
  162. restrict: 'A',
  163. link: function(scope, element, attrs, fn) {
  164. //Apply position:relative to parent element if necessary
  165. var position = element.css('position');
  166. if (position === 'static' || position === '' || typeof position === 'undefined'){
  167. element.css('position','relative');
  168. }
  169. var templateElement;
  170. var backdropElement;
  171. var currentTemplate;
  172. var templateScope;
  173. var backdrop;
  174. var tracker = _luBusyTrackerFactory();
  175. var defaults = {
  176. templateUrl: 'luticate-busy.html',
  177. delay:0,
  178. minDuration:0,
  179. backdrop: true,
  180. message:'Please Wait...',
  181. wrapperClass: 'lu-busy lu-busy-animation'
  182. };
  183. angular.extend(defaults,luBusyDefaults);
  184. scope.$watchCollection(attrs.luBusy,function(options){
  185. if (!options) {
  186. options = {promise:null};
  187. }
  188. if (angular.isString(options)) {
  189. throw new Error('Invalid value for lu-busy. luBusy no longer accepts string ids to represent promises/trackers.');
  190. }
  191. //is it an array (of promises) or one promise
  192. if (angular.isArray(options) || tracker.isPromise(options)) {
  193. options = {promise:options};
  194. }
  195. options = angular.extend(angular.copy(defaults),options);
  196. if (!options.templateUrl){
  197. options.templateUrl = defaults.templateUrl;
  198. }
  199. if (!angular.isArray(options.promise)){
  200. options.promise = [options.promise];
  201. }
  202. // options.promise = angular.isArray(options.promise) ? options.promise : [options.promise];
  203. // options.message = options.message ? options.message : 'Please Wait...';
  204. // options.template = options.template ? options.template : luBusyTemplateName;
  205. // options.minDuration = options.minDuration ? options.minDuration : 0;
  206. // options.delay = options.delay ? options.delay : 0;
  207. if (!templateScope) {
  208. templateScope = scope.$new();
  209. }
  210. templateScope.$message = options.message;
  211. if (!angular.equals(tracker.promises,options.promise)) {
  212. tracker.reset({
  213. promises:options.promise,
  214. delay:options.delay,
  215. minDuration: options.minDuration
  216. });
  217. }
  218. templateScope.$luBusyIsActive = function() {
  219. return tracker.active();
  220. };
  221. if (!templateElement || currentTemplate !== options.templateUrl || backdrop !== options.backdrop) {
  222. if (templateElement) {
  223. templateElement.remove();
  224. }
  225. if (backdropElement){
  226. backdropElement.remove();
  227. }
  228. currentTemplate = options.templateUrl;
  229. backdrop = options.backdrop;
  230. $http.get(currentTemplate,{cache: $templateCache}).success(function(indicatorTemplate){
  231. options.backdrop = typeof options.backdrop === 'undefined' ? true : options.backdrop;
  232. if (options.backdrop){
  233. var backdrop = '<div class="lu-busy lu-busy-backdrop lu-busy-backdrop-animation ng-hide" ng-show="$luBusyIsActive()"></div>';
  234. backdropElement = $compile(backdrop)(templateScope);
  235. element.append(backdropElement);
  236. }
  237. var template = '<div class="'+options.wrapperClass+' ng-hide" ng-show="$luBusyIsActive()">' + indicatorTemplate + '</div>';
  238. templateElement = $compile(template)(templateScope);
  239. angular.element(templateElement.children()[0])
  240. .css('position','absolute')
  241. .css('top',0)
  242. .css('left',0)
  243. .css('right',0)
  244. .css('bottom',0);
  245. element.append(templateElement);
  246. }).error(function(data){
  247. throw new Error('Template specified for luBusy ('+options.templateUrl+') could not be loaded. ' + data);
  248. });
  249. }
  250. },true);
  251. }
  252. };
  253. }
  254. ]);
  255. angular.module('luticateUtils').run(['$templateCache', function($templateCache) {
  256. 'use strict';
  257. $templateCache.put('luticate-busy.html',
  258. "<div class=\"lu-busy-default-wrapper\">\n" +
  259. "\n" +
  260. " <div class=\"lu-busy-default-sign\">\n" +
  261. "\n" +
  262. " <div class=\"lu-busy-default-spinner\">\n" +
  263. " <div class=\"bar1\"></div>\n" +
  264. " <div class=\"bar2\"></div>\n" +
  265. " <div class=\"bar3\"></div>\n" +
  266. " <div class=\"bar4\"></div>\n" +
  267. " <div class=\"bar5\"></div>\n" +
  268. " <div class=\"bar6\"></div>\n" +
  269. " <div class=\"bar7\"></div>\n" +
  270. " <div class=\"bar8\"></div>\n" +
  271. " <div class=\"bar9\"></div>\n" +
  272. " <div class=\"bar10\"></div>\n" +
  273. " <div class=\"bar11\"></div>\n" +
  274. " <div class=\"bar12\"></div>\n" +
  275. " </div>\n" +
  276. "\n" +
  277. " <div class=\"lu-busy-default-text\">{{$message}}</div>\n" +
  278. "\n" +
  279. " </div>\n" +
  280. "\n" +
  281. "</div>"
  282. );
  283. }]);*/