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