UNPKG

12.7 kBJavaScriptView Raw
1
2if (typeof exports === "undefined" || exports === null) {
3 if (!this.gi) {
4 this.gi = {};
5 }
6 if (!this.gi.util) {
7 this.gi['util'] = {};
8 }
9 if (!this.gi.util.common) {
10 this.gi.util['common'] = {};
11 }
12}
13
14(function(exports) {
15 var calculatePeriodStart, enrichPeriod, moment;
16 moment = typeof window !== "undefined" && window !== null ? window.moment : require('moment');
17 enrichPeriod = function(pattern, recurrence) {
18 var calculatedPeriodLength, i, length, missingSecondsInPattern, onTime, s, secondsInADay, _i, _len;
19 length = 0;
20 secondsInADay = 60 * 60 * 24;
21 if (recurrence === 'weekly') {
22 length = secondsInADay * 7;
23 }
24 onTime = 0;
25 calculatedPeriodLength = 0;
26 for (i = _i = 0, _len = pattern.length; _i < _len; i = ++_i) {
27 s = pattern[i];
28 if (i % 2 === 1) {
29 onTime += s;
30 }
31 calculatedPeriodLength += s;
32 }
33 if (calculatedPeriodLength < length) {
34 missingSecondsInPattern = length - calculatedPeriodLength;
35 pattern.push(missingSecondsInPattern);
36 if (pattern.length % 2 === 0) {
37 onTime += missingSecondsInPattern;
38 }
39 }
40 return {
41 length: length,
42 onTime: onTime
43 };
44 };
45 calculatePeriodStart = function(period, start, pattern, recurrence) {
46 period.start = moment(start);
47 if (recurrence === 'weekly') {
48 period.start = moment(start).startOf('week');
49 }
50 period.secondsToStart = start.diff(period.start, 'seconds');
51 return period;
52 };
53 exports.timeOnBetween = function(_start, _stop, pattern, recurrence) {
54 var index, period, result, secondsFromStartToStop, start, stop;
55 start = moment(_start);
56 stop = moment(_stop);
57 result = 0;
58 period = enrichPeriod(pattern, recurrence);
59 secondsFromStartToStop = stop.diff(start, 'seconds');
60 while (secondsFromStartToStop > period.length) {
61 result += period.onTime;
62 start.add('seconds', period.length);
63 secondsFromStartToStop = stop.diff(start, 'seconds');
64 }
65 period = calculatePeriodStart(period, start, pattern, recurrence);
66 index = 0;
67 while (true) {
68 if (period.secondsToStart >= pattern[index]) {
69 period.secondsToStart -= pattern[index];
70 index += 1;
71 } else {
72 break;
73 }
74 }
75 if (index % 2 === 0) {
76 if (secondsFromStartToStop >= pattern[index] - period.secondsToStart) {
77 secondsFromStartToStop -= pattern[index] - period.secondsToStart;
78 index += 1;
79 } else {
80 secondsFromStartToStop = 0;
81 }
82 } else {
83 if (secondsFromStartToStop >= pattern[index] - period.secondsToStart) {
84 result += pattern[index] - period.secondsToStart;
85 secondsFromStartToStop -= pattern[index] - period.secondsToStart;
86 index += 1;
87 } else {
88 result += secondsFromStartToStop;
89 secondsFromStartToStop = 0;
90 }
91 }
92 while (secondsFromStartToStop > 0) {
93 if (index % 2 === 0) {
94 if (secondsFromStartToStop >= pattern[index]) {
95 secondsFromStartToStop -= pattern[index];
96 index += 1;
97 } else {
98 secondsFromStartToStop = 0;
99 }
100 } else {
101 if (secondsFromStartToStop >= pattern[index]) {
102 result += pattern[index];
103 secondsFromStartToStop -= pattern[index];
104 index += 1;
105 } else {
106 result += secondsFromStartToStop;
107 secondsFromStartToStop = 0;
108 }
109 }
110 }
111 return result;
112 };
113 return exports.timeAfterXSecondsOnFrom = function(_start, x, pattern, recurrence) {
114 var index, onSeconds, period, result, start;
115 start = moment(_start);
116 result = moment(start);
117 period = enrichPeriod(pattern, recurrence);
118 while (x > period.onTime) {
119 result.add('seconds', period.length);
120 start.add('seconds', period.length);
121 x -= period.onTime;
122 }
123 period = calculatePeriodStart(period, start, pattern, recurrence);
124 index = 0;
125 while (true) {
126 if (period.secondsToStart >= pattern[index]) {
127 period.secondsToStart -= pattern[index];
128 index += 1;
129 if (index === pattern.length) {
130 index = 0;
131 }
132 } else {
133 if (index % 2 === 1) {
134 x += period.secondsToStart;
135 }
136 result.subtract('seconds', period.secondsToStart);
137 break;
138 }
139 }
140 while (x > 0) {
141 if (index % 2 === 0) {
142 result.add('seconds', pattern[index]);
143 index += 1;
144 if (index === pattern.length) {
145 index = 0;
146 }
147 } else {
148 onSeconds = pattern[index];
149 if (x >= onSeconds) {
150 result.add('seconds', onSeconds);
151 x -= onSeconds;
152 index += 1;
153 if (index === pattern.length) {
154 index = 0;
155 }
156 } else {
157 result.add('seconds', x);
158 x = 0;
159 }
160 }
161 }
162 return result;
163 };
164})((typeof exports !== "undefined" && exports !== null ? exports : this.gi.util.common['timePatterns'] = {}));
165
166angular.module('gi.util', ['ngResource']);
167
168angular.module('gi.util').factory('giCrud', [
169 '$resource', '$q', 'giSocket', function($resource, $q, Socket) {
170 var factory;
171 factory = function(resourceName, prefix, idField) {
172 var all, allCached, bulkMethods, bulkResource, clearCache, count, destroy, exports, get, getCached, items, itemsById, methods, queryMethods, queryResource, resource, save, updateMasterList, version, _version;
173 if (prefix == null) {
174 prefix = '/api';
175 }
176 if (idField == null) {
177 idField = '_id';
178 }
179 methods = {
180 query: {
181 method: 'GET',
182 params: {},
183 isArray: true
184 },
185 save: {
186 method: 'PUT',
187 params: {},
188 isArray: false
189 },
190 create: {
191 method: 'POST',
192 params: {},
193 isArray: false
194 }
195 };
196 bulkMethods = {
197 save: {
198 method: 'PUT',
199 params: {},
200 isArray: true
201 }
202 };
203 queryMethods = {
204 query: {
205 method: 'POST',
206 params: {},
207 isArray: true
208 }
209 };
210 bulkResource = $resource('/api/' + resourceName + '', {}, bulkMethods);
211 resource = $resource('/api/' + resourceName + '/:id', {}, methods);
212 queryResource = $resource('/api/' + resourceName + '/query', {}, queryMethods);
213 items = [];
214 itemsById = {};
215 updateMasterList = function(newItem) {
216 var replaced;
217 replaced = false;
218 if (angular.isArray(newItem)) {
219 angular.forEach(newItem, function(newRec, i) {
220 replaced = false;
221 if (itemsById[newRec[idField]] != null) {
222 angular.forEach(items, function(item, j) {
223 if (!replaced) {
224 if (item[idField] === newRec[idField]) {
225 items[j] = newRec;
226 return replaced = true;
227 }
228 }
229 });
230 } else {
231 items.push(newRec);
232 }
233 return itemsById[newRec[idField]] = newRec;
234 });
235 } else {
236 replaced = false;
237 angular.forEach(items, function(item, index) {
238 if (!replaced) {
239 if (newItem[idField] === item[idField]) {
240 replaced = true;
241 return items[index] = newItem;
242 }
243 }
244 });
245 if (!replaced) {
246 items.push(newItem);
247 }
248 itemsById[newItem[idField]] = newItem;
249 }
250 };
251 all = function(params) {
252 var cacheable, deferred, options, r;
253 deferred = $q.defer();
254 options = {};
255 cacheable = true;
256 r = resource;
257 if ((params == null) && items.length > 0) {
258 deferred.resolve(items);
259 } else {
260 if (params != null) {
261 cacheable = false;
262 }
263 options = params;
264 if ((params != null ? params.query : void 0) != null) {
265 r = queryResource;
266 }
267 r.query(options, function(results) {
268 if (cacheable) {
269 items = results;
270 angular.forEach(results, function(item, index) {
271 return itemsById[item[idField]] = item;
272 });
273 }
274 return deferred.resolve(results);
275 }, function(err) {
276 return deferred.reject(err);
277 });
278 }
279 return deferred.promise;
280 };
281 save = function(item) {
282 var deferred;
283 deferred = $q.defer();
284 if (angular.isArray(item)) {
285 bulkResource.save({}, item, function(result) {
286 updateMasterList(result);
287 return deferred.resolve(result);
288 }, function(failure) {
289 return deferred.reject(failure);
290 });
291 } else {
292 if (item[idField]) {
293 resource.save({
294 id: item[idField]
295 }, item, function(result) {
296 updateMasterList(result);
297 return deferred.resolve(result);
298 }, function(failure) {
299 return deferred.reject(failure);
300 });
301 } else {
302 resource.create({}, item, function(result) {
303 updateMasterList(result);
304 return deferred.resolve(result);
305 }, function(failure) {
306 return deferred.reject(failure);
307 });
308 }
309 }
310 return deferred.promise;
311 };
312 getCached = function(id) {
313 return itemsById[id];
314 };
315 allCached = function() {
316 return items;
317 };
318 get = function(id) {
319 var deferred;
320 deferred = $q.defer();
321 resource.get({
322 id: id
323 }, function(item) {
324 if (items.length > 0) {
325 updateMasterList(item);
326 }
327 return deferred.resolve(item);
328 }, function(err) {
329 return deferred.reject(err);
330 });
331 return deferred.promise;
332 };
333 destroy = function(id) {
334 var deferred;
335 deferred = $q.defer();
336 resource["delete"]({
337 id: id
338 }, function() {
339 var removed;
340 removed = false;
341 delete itemsById[id];
342 angular.forEach(items, function(item, index) {
343 if (!removed) {
344 if (item[idField] === id) {
345 removed = true;
346 return items.splice(index, 1);
347 }
348 }
349 });
350 return deferred.resolve();
351 }, function(err) {
352 return deferred.reject(err);
353 });
354 return deferred.promise;
355 };
356 count = function() {
357 return items.length;
358 };
359 clearCache = function() {
360 items = [];
361 return itemsById = {};
362 };
363 Socket.emit('watch:' + resourceName);
364 Socket.on(resourceName + '_created', function(data) {
365 updateMasterList(data);
366 return _version += 1;
367 });
368 Socket.on(resourceName + '_updated', function(data) {
369 updateMasterList(data);
370 return _version += 1;
371 });
372 _version = 0;
373 version = function() {
374 return _version;
375 };
376 exports = {
377 query: all,
378 all: all,
379 cache: updateMasterList,
380 get: get,
381 getCached: getCached,
382 allCached: allCached,
383 destroy: destroy,
384 save: save,
385 count: count,
386 version: version,
387 clearCache: clearCache
388 };
389 return exports;
390 };
391 return {
392 factory: factory
393 };
394 }
395]);
396
397angular.module('gi.util').factory('giSocket', [
398 '$rootScope', function($rootScope) {
399 var socket;
400 if (typeof io !== "undefined" && io !== null) {
401 socket = io.connect();
402 }
403 return {
404 on: function(eventName, callback) {
405 if (typeof io !== "undefined" && io !== null) {
406 return socket.on(eventName, function() {
407 var args;
408 args = arguments;
409 if (callback) {
410 return $rootScope.$apply(function() {
411 return callback.apply(socket, args);
412 });
413 }
414 });
415 }
416 },
417 emit: function(eventName, data, callback) {
418 if (typeof io !== "undefined" && io !== null) {
419 return socket.emit(eventName, data, function() {
420 var args;
421 args = arguments;
422 if (callback) {
423 return $rootScope.$apply(function() {
424 return callback.apply(socket, args);
425 });
426 }
427 });
428 }
429 }
430 };
431 }
432]);
433
434;
\No newline at end of file