Free cookie consent management tool by TermsFeed Policy Generator

source: branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/Scripts/Hubs/CalendarHubber.js @ 13775

Last change on this file since 13775 was 13775, checked in by jlodewyc, 8 years ago

#2582 Event recurring finished (small bugs)

File size: 25.3 KB
Line 
1
2angular.module('wjm', ['ui.bootstrap', 'ui.calendar', 'angularTreeview', 'ngDialog']).
3
4           controller('resourceCtrl', function ($rootScope, $scope, uiCalendarConfig, $compile, ngDialog, $timeout) {
5               var vm = $scope;
6
7               var date = new Date();
8
9               var d = date.getDate();
10               var m = date.getMonth();
11               var y = date.getFullYear();
12               var hubber = $.connection.calendarHub;
13
14               vm.alertMessage = "No alerts";
15               vm.currentcal = [];
16               vm.selectedEventId = -1;
17
18               vm.init = function () {
19
20                   //  $.connection.hub.logging = true;
21
22
23                   var v = document.getElementById("userId").innerHTML;
24                   $.connection.hub.qs = { 'userid': v };
25                   $.connection.hub.start().done(function () {
26                       hubber.server.requestInfo();
27                   });
28                   hubber.client.processData = function (data) {
29                       vm.data = JSON.parse(data);
30                       $scope.buildTree();
31
32                       $scope.$apply();
33                   };
34                   hubber.client.savingCurrentDone = function () {
35                       $scope.clearCurrentCalendar();
36                       $scope.$apply();
37                   };
38                   hubber.client.savingAllDone = function () {
39                       clearAllCalendarsFunc();
40                       $scope.$apply();
41                   };
42                   hubber.client.processDowntime = function (id, down) {
43                       var json = JSON.parse(down);
44                       var arrdown = [];
45                       var str = "";
46                       for (var i = 0; i < json.length; i++) {
47                           if (json[i].DowntimeType === 0) {
48                               str = "Unavailable";
49                               col = "#006080";
50                           }
51                           else {
52                               str = "Shutdown";
53                               col = "#993300";
54                           }
55                           arrdown.push({
56                               id: json[i].Id,
57                               title: str,
58                               start: new Date(json[i].StartDate),
59                               end: new Date(json[i].EndDate),
60                               allDay: json[i].AllDayEvent,
61                               color: col,
62                               rec: {
63                                   recurrence: json[i].Recurring,
64                                   recid: json[i].RecurringId,
65                                   days: [false, false, false, false, false, false, false],
66                                   start: new Date(json[i].StartDate),
67                                   end: new Date(json[i].EndDate)
68
69                               },
70                               changed: false
71                           });
72                       }
73                       var dat = { 'id': id, 'down': [arrdown] };
74                       $scope.treeview.currentNode.calendar = dat;
75
76                       $scope.currentcal = $scope.treeview.currentNode.calendar;
77                       $("#resourcecalendar").fullCalendar('refresh');
78                       $scope.$apply();
79                   }
80
81                   $scope.$watch("treeview.currentNode", function (newValue, oldValue) {
82                       $scope.currentcal = [];
83                       $(".selected.ng-binding").addClass('loaded');
84                       $scope.selectedEventId = -1;
85                       if ($scope.treeview.currentNode != null) {
86                           if ($scope.treeview.currentNode.calendar.length === 0) {
87                               hubber.server.requestDownTime(vm.treeview.currentNode.Id);
88
89                           }
90                           else {
91                               $timeout(function () {
92                                   $scope.currentcal = $scope.treeview.currentNode.calendar;
93
94                               }, 0);
95
96                           }
97                       }
98
99                   });
100               }
101               $scope.buildTree = function () {
102                   vm.tree = [];
103                   vm.temptree = [];
104                   vm.top = false;
105                   for (; vm.data.length > 0;) {
106
107                       if (vm.data[0].ParentResourceId == null) {
108                           var curr = $scope.seekChildren(vm.data.splice(0, 1)[0]);
109                           vm.tree.push(curr);
110                       }
111                       else {
112                           var curr = $scope.seekChildren(vm.data.splice(0, 1)[0]);
113                           vm.temptree.push(curr);
114                       }
115                   }
116
117               };
118
119               $scope.seekChildren = function (current) {
120                   current.calendar = [];
121                   current.children = [];
122                   current.todelete = [];
123                   current.changes = false;
124                   current.collapsed = true;
125                   for (var t = 0; t < vm.temptree.length;) {
126                       if (current.Id == vm.temptree[t].ParentResourceId) {
127                           current.children.push(vm.temptree.splice(t, 1)[0]);
128                       }
129                       else {
130                           t++;
131                       }
132                   }
133                   var childc = current.children.length;//Remembers count of children received from temp tree;
134                   for (var t = 0; t < vm.data.length;) {
135                       if (current.Id == vm.data[t].ParentResourceId) {
136                           current.children.push(vm.data.splice(t, 1)[0]);
137                       }
138                       else {
139                           t++;
140                       }
141                   }
142                   for (var t = childc; t < current.children.length; t++) {
143                       current.children[t] = $scope.seekChildren(current.children[t]);
144                   }
145                   return current;
146               }
147               function collectInfoToSave(node, refresh, last) {
148                   var arr = node.calendar.down[0];
149                   var toadd = [];
150                   var todel = node.todelete;
151                   var toupd = [];
152                   for (var i = 0; i < arr.length; i++) {
153                       if (arr[i].id === '00000000-0000-0000-0000-000000000000') {
154                           var t = arr[i].allDay.toString();
155                           toadd.push([
156                               arr[i].title,//status
157                               "" + Date.parse(arr[i].start),//start
158                               "" + Date.parse(arr[i].end),//end
159                               t,// allday
160                               node.Id, //resource id
161                               arr[i].rec.recurrence.toString(),//true on recur
162                               arr[i].rec.recid,//recur id
163                               "" + Date.parse(arr[i].rec.start),
164                               "" + Date.parse(arr[i].rec.end),
165                               arr[i].rec.days.join(",")
166                               
167
168                           ]);
169                       }
170                       else if (arr[i].changed === true) {
171                           var t = arr[i].allDay.toString();
172                           toupd.push([
173                               arr[i].id,//id to update
174                               arr[i].title,//status
175                               "" + Date.parse(arr[i].start),//start
176                               "" + Date.parse(arr[i].end),//end
177                               t,//allday
178                               arr[i].rec.recurrence.toString(),//true on recur
179                               arr[i].rec.recid,//recur id
180                               "" + Date.parse(arr[i].rec.start),
181                               "" + Date.parse(arr[i].rec.end),
182                               arr[i].rec.days.join(",")
183                               
184                           ]);
185                       }
186                   }
187                   vm.sendtoserv = [todel, toadd, toupd];
188                   hubber.server.saveCalendar(node.Id, todel, toadd, toupd, refresh, last);
189               }
190               $scope.saveCurrentCalendar = function () {
191                   collectInfoToSave(vm.treeview.currentNode, true, false);
192                   //true for refresh, false for showing it's only one calendar saved.
193               }
194               $scope.saveAllCalendars = function () {
195                   $scope.allSave = [];
196                   for (var i = 0; i < $scope.tree.length; i++)
197                       createSaveRequests($scope.tree[i]);
198                   ngDialog.openConfirm({
199                       template:
200                        '<p>Are you sure you want to save all changes made to ' + $scope.allSave.length + ' calendars?</p>' +
201                        '<div>' +
202                        '<button type="button" class="btn btn-primary" ng-click="confirm(1)">Yes' +
203                        '<button type="button" class="btn btn-default" ng-click="closeThisDialog(0)">No </button> ' +
204                        '</button></div>',
205                       plain: true
206                   }).then(function (success) {
207                       for (var i = 0; i < $scope.allSave.length; i++) {
208                           if (i >= $scope.allSave.length - 1)
209                               collectInfoToSave($scope.allSave[i], false, true);
210                           else
211                               collectInfoToSave($scope.allSave[i], false, false);
212                       }
213                   });
214
215
216               }
217               function createSaveRequests(node) {
218                   if (node.changes === true)
219                       $scope.allSave.push(node);
220                   for (var i = 0; i < node.children.length; i++) {
221                       createSaveRequests(node.children[i]);
222                   }
223               }
224               $scope.clearCurrentCalendar = function () {
225
226                   $scope.selectedEventId = -1;
227                   $scope.treeview.currentNode.calendar = null;
228                   $scope.treeview.currentNode.todelete = [];
229                   $scope.treeview.currentNode.changes = false;
230                   $scope.currentcal = [];
231                   hubber.server.requestDownTime(vm.treeview.currentNode.Id);
232                   $(".selected.ng-binding").removeClass('changed');
233
234
235               }
236               $scope.clearAllCalendars = function () {
237                   ngDialog.openConfirm({
238                       template:
239                        '<p>Are you sure you want to delete all calendar changes?</p>' +
240                        '<div>' +
241                          '<button type="button" class="btn btn-default" ng-click="closeThisDialog(0)">No </button> ' +
242                          '<button type="button" class="btn btn-primary" ng-click="confirm(1)">Yes' +
243                        '</button></div>',
244                       plain: true
245                   }).then(function (success) {
246                       clearAllCalendarsFunc();
247                   });
248
249               }
250               function clearAllCalendarsFunc() {
251                   $(".ng-binding.changed").removeClass('changed');
252                   $(".ng-binding.loaded").removeClass('loaded');
253                   $scope.selectedEventId = -1;
254                   $scope.treeview.currentNode.calendar = null;
255                   $scope.currentcal = [];
256                   for (var i = 0; i < $scope.tree.length; i++)
257                       removeCalendarsRecurse($scope.tree[i]);
258                   hubber.server.requestDownTime(vm.treeview.currentNode.Id);
259                   $(".selected.ng-binding").addClass('loaded');
260               }
261               function removeCalendarsRecurse(node) {
262
263                   node.calendar = [];
264                   node.todelete = [];
265                   node.changes = false;
266                   for (var i = 0; i < node.children.length; i++) {
267                       removeCalendarsRecurse(node.children[i]);
268                   }
269               }
270
271               $scope.deleteAllPreviousEvents = function () {
272                   vm.selectedEventId = -1;
273                   var node = vm.treeview.currentNode.calendar.down[0];
274                   for (var i = 0; i < node.length;) {
275                       if (node[i].end < Date.now()) {
276                           if (node[i].id != '00000000-0000-0000-0000-000000000000')
277                               vm.treeview.currentNode.todelete.push(node[i].id);
278                           $scope.setChanged(vm.selectedEventId);
279                           node.splice(i, 1);
280                       }
281                       else
282                           i++;
283                   }
284                   ngDialog.open({
285                       template:
286                        '<p>All previous events have been deleted. Save the changes to confirm deletion</p>',
287                       plain: true
288                   });
289               }
290
291
292               $scope.setChanged = function (id) {
293                   if (id != -1) {
294                       if (vm.treeview.currentNode.calendar.down[0][id].title === "Unavailable")
295                           vm.treeview.currentNode.calendar.down[0][id].color = '#0099cc';
296                       else
297                           vm.treeview.currentNode.calendar.down[0][id].color = '#ff5500';
298
299                       vm.treeview.currentNode.calendar.down[0][id].changed = true;
300                   }
301                   vm.treeview.currentNode.changes = true;
302                   $(".selected.ng-binding").addClass('changed');
303               }
304               //*Add event by click
305               $scope.calendarClick = function (date, jsEvent, view) {
306
307                   var newid = 0;
308                   if (vm.treeview.currentNode.calendar.down[0].length != 0)
309                       newid = vm.treeview.currentNode.calendar.down[0][(vm.treeview.currentNode.calendar.down[0].length - 1)]._id + 1;
310                   var dat = date.toDate();
311                   var end = new Date(dat);
312                   end.setHours(dat.getHours() + 2);
313                   vm.treeview.currentNode.calendar.down[0].push({
314                       id: '00000000-0000-0000-0000-000000000000',
315                       title: 'Unavailable',
316                       start: dat,
317                       end: end,
318                       allDay: date._ambigTime,
319                       rec: {
320                           recurrence: false,
321                           recid: '0',
322                           days: [false, false, false, false, false, false, false],
323                           start: dat,
324                           end: end
325
326                       },
327                       _id: (newid)
328                   });
329                   vm.selectedEventId = vm.treeview.currentNode.calendar.down[0].length - 1;
330                   vm.setChanged(vm.selectedEventId);
331                   //  $("#resourcecalendar").fullCalendar('refetchEvents');
332
333               }
334               function checkId(id) {
335                   for (var i = 0; i < vm.treeview.currentNode.calendar.down[0].length ; i++) {
336                       if (vm.treeview.currentNode.calendar.down[0][i]._id === id)
337                           return i;
338                   }
339                   return -1;
340               }
341               /* alert on eventClick */
342               $scope.eventClick = function (date, jsEvent, view) {
343                   vm.selectedEventId = checkId(date._id);
344               };
345               /* alert on Drop */
346               $scope.dragandDrop = function (event, delta, revertFunc, jsEvent, ui, view) {
347                   vm.selectedEventId = checkId(event._id);
348                   vm.setChanged(vm.selectedEventId);
349                   if (event.end == null) {
350                       event.end = moment(event.start).add(2, 'hours');
351                   }
352                   if (vm.treeview.currentNode.calendar.down[0][vm.selectedEventId].allDay && event.start._ambigTime == false) {
353                       event.allDay = false;
354                       vm.treeview.currentNode.calendar.down[0][vm.selectedEventId].allDay = false;
355                   }
356                   else if (!vm.treeview.currentNode.calendar.down[0][vm.selectedEventId].allDay && event.start._ambigTime == true) {
357                       event.allDay = true;
358                       vm.treeview.currentNode.calendar.down[0][vm.selectedEventId].allDay = true;
359                       //vm.treeview.currentNode.calendar.down[0][vm.selectedEventId].end = null;
360                   }
361                   vm.treeview.currentNode.calendar.down[0][vm.selectedEventId].start = new Date(event.start);
362                   vm.treeview.currentNode.calendar.down[0][vm.selectedEventId].end = new Date(event.end);
363               };
364               /* alert on Resize */
365               $scope.resizeEvent = function (event, delta, revertFunc, jsEvent, ui, view) {
366                   vm.selectedEventId = checkId(event._id);
367                   vm.setChanged(vm.selectedEventId);
368                   vm.treeview.currentNode.calendar.down[0][vm.selectedEventId].start = new Date(event.start);
369                   vm.treeview.currentNode.calendar.down[0][vm.selectedEventId].end = new Date(event.end);
370               };
371
372               /* remove event */
373               $scope.remove = function (index) {
374                   vm.selectedEventId = -1;
375                   vm.setChanged(vm.selectedEventId);
376                   if (vm.treeview.currentNode.calendar.down[0][index].id != "00000000-0000-0000-0000-000000000000") {
377                       vm.treeview.currentNode.todelete.push(vm.treeview.currentNode.calendar.down[0][index].id);
378                   }
379                   vm.treeview.currentNode.calendar.down[0].splice(index, 1);
380
381
382               };
383
384               $scope.checkDateStartEnd = function () {
385                   if ($scope.currentcal.down[0][vm.selectedEventId].rec.start > $scope.currentcal.down[0][vm.selectedEventId].rec.end ||
386                       $scope.currentcal.down[0][vm.selectedEventId].rec.end === undefined) {
387                       
388                       $scope.currentcal.down[0][vm.selectedEventId].rec.end = new Date($scope.currentcal.down[0][vm.selectedEventId].rec.start);
389                       
390                   }
391                   if ($scope.currentcal.down[0][vm.selectedEventId].rec.start < Date.now())
392                       $scope.currentcal.down[0][vm.selectedEventId].rec.start = new Date();
393                  }
394               //pushes all changes to other recurs
395               $scope.pushRecurChanges = function (recid) {
396                   ngDialog.openConfirm({
397                       template:
398                        '<p>This will change all existing recurrences and create new recurrences where needed. Are you sure?</p>' +
399                        '<div>' +
400                          '<button type="button" class="btn btn-default" ng-click="closeThisDialog(0)">No </button> ' +
401                          '<button type="button" class="btn btn-primary" ng-click="confirm(1)">Yes' +
402                        '</button></div>',
403                       plain: true
404                   }).then(function (success) {
405                       var arr = vm.treeview.currentNode.calendar.down[0];
406                       var ob = $.extend(true, {}, arr[vm.selectedEventId]);
407                       for (var i = 0; i < arr.length;) {
408                           if (arr[i].rec.recid === recid) {
409                               if (new Date(arr[i].start) < new Date(ob.rec.start) ||
410                                        new Date(arr[i].end) > new Date(ob.rec.end) ||
411                                        !ob.rec.days[new Date(arr[i].start).getDay()]) {
412                                   vm.remove(i);
413                                   vm.selectedEventId = -1;
414
415                               }
416                               else {
417                                   
418                                   arr[i].start.setHours(ob.start.getHours(), ob.start.getMinutes());
419                                   arr[i].end.setHours(ob.end.getHours(), ob.end.getMinutes());
420                                   arr[i].title = ob.title;
421                                   arr[i].rec = ob.rec;
422                                   arr[i].allDay = ob.allDay;
423                                   vm.setChanged(i);
424                                   i++;
425                               }
426                           }
427                           else
428                               i++;
429                       }
430                       var start = new Date(ob.rec.start);
431                       start.setHours(2, 0, 0, 0);
432                       var end = new Date(ob.rec.end);
433                       end = new Date(end.setHours(24, 0, 0, 0) + 1000 * 3600 * 2);
434
435                       loop1:
436                           for (var d = (start.getTime()) ; d < (end.getTime()) ;) {
437                               var tog = ob.rec.days[new Date(d).getDay()];
438                               if (tog) {
439                                   loop2:
440                                       for (var i = 0; i < arr.length; i++) {
441                                           
442                                           if (arr[i].rec.recid === recid) {
443                                               var dend = (d+1000 * 3600 * 24);
444                                               if (arr[i].start.getTime() >= d &&
445                                                   arr[i].end.getTime() <= dend) {
446                                                   d += (1000 * 3600 * 24);
447                                                   continue loop1;
448                                               }
449                                           }
450                                       }
451 
452                                   var ts = new Date(d);
453                                   ts.setHours(new Date(ob.start).getHours(), new Date(ob.start).getMinutes());
454                                   var te = new Date(d);
455                                   te.setHours(new Date(ob.end).getHours(), new Date(ob.end).getMinutes());
456                                   arr.push({
457                                       id: '00000000-0000-0000-0000-000000000000',
458                                       title: ob.title,
459                                       start: ts,
460                                       end: te,
461                                       allDay: ob.allDay,
462                                       rec: ob.rec
463                                   });
464                                   vm.setChanged(arr.length - 1);
465
466                               }
467                               
468                               d += (1000 * 3600 * 24);// 1 day
469                             
470                           }
471                   });
472               }
473               $scope.deleteAllRecurrences = function (recid) {
474                   ngDialog.openConfirm({
475                       template:
476                        '<p>This will delete every found recurrence. Are you sure?</p>' +
477                        '<div>' +
478                          '<button type="button" class="btn btn-default" ng-click="closeThisDialog(0)">No </button> ' +
479                          '<button type="button" class="btn btn-primary" ng-click="confirm(1)">Yes' +
480                        '</button></div>',
481                       plain: true
482                   }).then(function (success) {
483                       var arr = vm.treeview.currentNode.calendar.down[0];
484                       for (var i = 0; i < arr.length;) {
485                           if (arr[i].rec.recid === recid)
486                               vm.remove(i);
487                           else
488                               i++;
489                       }
490                   });
491               }
492
493               /* Render Tooltip */
494               $scope.eventRender = function (event, element, view) {
495                   element.attr({
496                       'tooltip': event.title,
497                       'tooltip-append-to-body': true
498                   });
499                   //$compile(element)($scope);
500               };
501               /* config object */
502               $scope.uiConfig = {
503                   calendar: {
504                       height: 500,
505                       editable: true,
506                       defaultView: 'agendaWeek',
507                       firstDay: 1,
508                       header: {
509                           left: 'title',
510                           center: '',
511                           right: 'today prev,next'
512                       },
513                       timezone: 'UTC',
514                       timeFormat: 'HH:mm',
515                       eventClick: $scope.eventClick,
516                       eventDrop: $scope.dragandDrop,
517                       eventResize: $scope.resizeEvent,
518                       eventRender: $scope.eventRender,
519                       dayClick: $scope.calendarClick
520
521
522                   }
523               };
524
525
526
527           });
528
529
Note: See TracBrowser for help on using the repository browser.