Free cookie consent management tool by TermsFeed Policy Generator

source: branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/wwwroot/js/hubs/calendarhubber.js @ 13768

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

#2582 Saving calendars to server, update not working

File size: 18.8 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               vm.alertMessage = "No alerts";
14               vm.currentcal = [];
15               vm.selectedEventId = -1;
16
17               vm.init = function () {
18
19                   //  $.connection.hub.logging = true;
20
21
22                   var v = document.getElementById("userId").innerHTML;
23                   $.connection.hub.qs = { 'userid': v };
24                   $.connection.hub.start().done(function () {
25                       hubber.server.requestInfo();
26                   });
27                   hubber.client.processData = function (data) {
28                       vm.data = JSON.parse(data);
29                       $scope.buildTree();
30
31                       $scope.$apply();
32                   };
33                   hubber.client.savingCurrentDone = function () {
34                       $scope.clearCurrentCalendar();
35                       $scope.$apply();
36                   };
37                   hubber.client.savingAllDone = function () {
38                       clearAllCalendarsFunc();
39                       $scope.$apply();
40                   };
41                   hubber.client.processDowntime = function (id, down) {
42                       var json = JSON.parse(down);
43                       var arrdown = [];
44                       var str = "";
45                       var col = "";
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                               changed: false
63                           });
64                       }
65                       var dat = { 'id': id, 'down': [arrdown] };
66                       $scope.treeview.currentNode.calendar = dat;
67
68                       $scope.currentcal = $scope.treeview.currentNode.calendar;
69                       $scope.$apply();
70                   }
71
72                   $scope.$watch("treeview.currentNode", function (newValue, oldValue) {
73                       $scope.currentcal = [];
74                       $(".selected.ng-binding").addClass('loaded');
75                       $scope.selectedEventId = -1;
76                       if ($scope.treeview.currentNode != null) {
77                           if ($scope.treeview.currentNode.calendar.length === 0) {
78                               hubber.server.requestDownTime(vm.treeview.currentNode.Id);
79
80                           }
81                           else {
82                               $timeout(function () {
83                                   $scope.currentcal = $scope.treeview.currentNode.calendar;
84
85                               }, 0);
86
87                           }
88                       }
89
90                   });
91               }
92               $scope.buildTree = function () {
93                   vm.tree = [];
94                   vm.temptree = [];
95                   vm.top = false;
96                   for (; vm.data.length > 0;) {
97
98                       if (vm.data[0].ParentResourceId == null) {
99                           var curr = $scope.seekChildren(vm.data.splice(0, 1)[0]);
100                           vm.tree.push(curr);
101                       }
102                       else {
103                           var curr = $scope.seekChildren(vm.data.splice(0, 1)[0]);
104                           vm.temptree.push(curr);
105                       }
106                   }
107
108               };
109
110               $scope.seekChildren = function (current) {
111                   current.calendar = [];
112                   current.children = [];
113                   current.todelete = [];
114                   current.changes = false;
115                   current.collapsed = true;
116                   for (var t = 0; t < vm.temptree.length;) {
117                       if (current.Id == vm.temptree[t].ParentResourceId) {
118                           current.children.push(vm.temptree.splice(t, 1)[0]);
119                       }
120                       else {
121                           t++;
122                       }
123                   }
124                   var childc = current.children.length;//Remembers count of children received from temp tree;
125                   for (var t = 0; t < vm.data.length;) {
126                       if (current.Id == vm.data[t].ParentResourceId) {
127                           current.children.push(vm.data.splice(t, 1)[0]);
128                       }
129                       else {
130                           t++;
131                       }
132                   }
133                   for (var t = childc; t < current.children.length; t++) {
134                       current.children[t] = $scope.seekChildren(current.children[t]);
135                   }
136                   return current;
137               }
138               function collectInfoToSave(node, refresh, last) {
139                   var arr = node.calendar.down[0];
140                   var toadd = [];
141                   var todel = node.todelete;
142                   var toupd = [];
143                   for (var i = 0; i < arr.length; i++) {
144                       if (arr[i].id === '00000000-0000-0000-0000-000000000000') {
145                           var t = arr[i].allDay.toString();
146                           toadd.push([
147                               arr[i].title,
148                               "" + Date.parse(arr[i].start),
149                               "" + Date.parse(arr[i].end),
150                               t,
151                               node.Id
152                           ]);
153                       }
154                       else if (arr[i].changed === true) {
155                           var t = arr[i].allDay.toString();
156                           toupd.push([
157                               arr[i].id,
158                               arr[i].title,
159                               "" + Date.parse(arr[i].start),
160                               "" + Date.parse(arr[i].end),
161                               t
162                           ]);
163                       }
164                   }
165                   vm.sendtoserv = [toadd, toupd, todel];
166                   hubber.server.saveCalendar(node.Id, todel, toadd, toupd, refresh, last);
167               }
168               $scope.saveCurrentCalendar = function () {
169                   collectInfoToSave(vm.treeview.currentNode, true, false);
170                   //true for refresh, false for showing it's only one calendar saved.
171               }
172               $scope.saveAllCalendars = function () {
173                   $scope.allSave = [];
174                   for (var i = 0; i < $scope.tree.length; i++)
175                       createSaveRequests($scope.tree[i]);
176                   ngDialog.openConfirm({
177                       template:
178                        '<p>Are you sure you want to save all changes made to ' + $scope.allSave.length + ' calendars?</p>' +
179                        '<div>' +
180                        '<button type="button" class="btn btn-primary" ng-click="confirm(1)">Yes' +
181                        '<button type="button" class="btn btn-default" ng-click="closeThisDialog(0)">No </button> ' +
182                        '</button></div>',
183                       plain: true
184                   }).then(function (success) {
185                       for (var i = 0; i < $scope.allSave.length; i++) {
186                           if (i >= $scope.allSave.length - 1)
187                               collectInfoToSave($scope.allSave[i], false, true);
188                           else
189                               collectInfoToSave($scope.allSave[i], false, false);
190                       }
191                   });
192                   
193                   
194               }
195               function createSaveRequests(node) {
196                   if (node.changes === true)
197                       $scope.allSave.push(node);
198                   for (var i = 0; i < node.children.length; i++) {
199                       createSaveRequests(node.children[i]);
200                   }
201               }
202               $scope.clearCurrentCalendar = function () {
203                   
204                   $scope.selectedEventId = -1;
205                   $scope.treeview.currentNode.calendar = null;
206                   $scope.treeview.currentNode.todelete = [];
207                   $scope.treeview.currentNode.changes = false;
208                   $scope.currentcal = [];
209                   hubber.server.requestDownTime(vm.treeview.currentNode.Id);
210                   $(".selected.ng-binding").removeClass('changed');
211
212
213               }
214               $scope.clearAllCalendars = function () {
215                   ngDialog.openConfirm({
216                       template:
217                        '<p>Are you sure you want to delete all calendar changes?</p>' +
218                        '<div>' +
219                          '<button type="button" class="btn btn-default" ng-click="closeThisDialog(0)">No </button> ' +
220                          '<button type="button" class="btn btn-primary" ng-click="confirm(1)">Yes' +
221                        '</button></div>',
222                       plain: true
223                   }).then(function (success) {
224                       clearAllCalendarsFunc();
225                   });
226
227               }
228               function clearAllCalendarsFunc() {
229                   $(".ng-binding.changed").removeClass('changed');
230                   $(".ng-binding.loaded").removeClass('loaded');
231                   $scope.selectedEventId = -1;
232                   $scope.treeview.currentNode.calendar = null;
233                   $scope.currentcal = [];
234                   for (var i = 0; i < $scope.tree.length; i++)
235                       removeCalendarsRecurse($scope.tree[i]);
236                   hubber.server.requestDownTime(vm.treeview.currentNode.Id);
237                   $(".selected.ng-binding").addClass('loaded');
238               }
239               function removeCalendarsRecurse(node) {
240
241                   node.calendar = [];
242                   node.todelete = [];
243                   node.changes = false;
244                   for (var i = 0; i < node.children.length; i++) {
245                       removeCalendarsRecurse(node.children[i]);
246                   }
247               }
248
249               $scope.deleteAllPreviousEvents = function () {
250                   vm.selectedEventId = -1;
251                   var node = vm.treeview.currentNode.calendar.down[0];
252                   for (var i = 0; i < node.length;) {
253                       if (node[i].end < Date.now()) {
254                           if (node[i].id != '00000000-0000-0000-0000-000000000000')
255                            vm.treeview.currentNode.todelete.push(node[i].id);
256                           $scope.setChanged();
257                           node.splice(i, 1);
258                       }
259                       else
260                           i++;
261                   }
262                   ngDialog.open({
263                       template:
264                        '<p>All previous events have been deleted. Save the changes to confirm deletion</p>',
265                       plain: true
266                   });
267               }
268
269
270               $scope.setChanged = function () {
271                   if (vm.selectedEventId != -1) {
272                       if (vm.treeview.currentNode.calendar.down[0][vm.selectedEventId].title === "Unavailable")
273                           vm.treeview.currentNode.calendar.down[0][vm.selectedEventId].color = '#0099cc';
274                       else
275                           vm.treeview.currentNode.calendar.down[0][vm.selectedEventId].color = '#ff5500';
276
277                       vm.treeview.currentNode.calendar.down[0][vm.selectedEventId].changed = true;
278                   }
279                   vm.treeview.currentNode.changes = true;
280                   $(".selected.ng-binding").addClass('changed');
281               }
282               //*Add event by click
283               $scope.calendarClick = function (date, jsEvent, view) {
284
285                   var newid = 0;
286                   if (vm.treeview.currentNode.calendar.down[0].length != 0)
287                       newid = vm.treeview.currentNode.calendar.down[0][(vm.treeview.currentNode.calendar.down[0].length - 1)]._id + 1;
288                   var dat = date.toDate();
289                   var end = new Date(dat);
290                   end.setHours(dat.getHours() + 2);
291                   console.log(end);
292                   vm.treeview.currentNode.calendar.down[0].push({
293                       id: '00000000-0000-0000-0000-000000000000',
294                       title: 'Unavailable',
295                       start: dat,
296                       end: end,
297                       allDay: date._ambigTime,
298                       _id: (newid)
299                   });
300                   vm.selectedEventId = vm.treeview.currentNode.calendar.down[0].length - 1;
301                   vm.setChanged();
302                   //  $("#resourcecalendar").fullCalendar('refetchEvents');
303
304               }
305               function checkId(id) {
306                   for (var i = 0; i < vm.treeview.currentNode.calendar.down[0].length ; i++) {
307                       if (vm.treeview.currentNode.calendar.down[0][i]._id === id)
308                           return i;
309                   }
310                   return -1;
311               }
312               /* alert on eventClick */
313               $scope.eventClick = function (date, jsEvent, view) {
314                   vm.selectedEventId = checkId(date._id);
315               };
316               /* alert on Drop */
317               $scope.dragandDrop = function (event, delta, revertFunc, jsEvent, ui, view) {
318                   vm.selectedEventId = checkId(event._id);
319                   vm.setChanged();
320                   if (event.end == null) {
321                       event.end = moment(event.start).add(2, 'hours');
322                   }
323                   if (vm.treeview.currentNode.calendar.down[0][vm.selectedEventId].allDay && event.start._ambigTime == false) {
324                       event.allDay = false;
325                       vm.treeview.currentNode.calendar.down[0][vm.selectedEventId].allDay = false;
326                   }
327                   else if (!vm.treeview.currentNode.calendar.down[0][vm.selectedEventId].allDay && event.start._ambigTime == true) {
328                       event.allDay = true;
329                       vm.treeview.currentNode.calendar.down[0][vm.selectedEventId].allDay = true;
330                       //vm.treeview.currentNode.calendar.down[0][vm.selectedEventId].end = null;
331                   }
332                   vm.treeview.currentNode.calendar.down[0][vm.selectedEventId].start = new Date(event.start);
333                   vm.treeview.currentNode.calendar.down[0][vm.selectedEventId].end = new Date(event.end);
334               };
335               /* alert on Resize */
336               $scope.resizeEvent = function (event, delta, revertFunc, jsEvent, ui, view) {
337                   vm.selectedEventId = checkId(event._id);
338                   vm.setChanged();
339                   vm.treeview.currentNode.calendar.down[0][vm.selectedEventId].start = new Date(event.start);
340                   vm.treeview.currentNode.calendar.down[0][vm.selectedEventId].end = new Date(event.end);
341               };
342
343               /* remove event */
344               $scope.remove = function (index) {
345                   vm.selectedEventId = -1;
346                   vm.setChanged();
347                   if (vm.treeview.currentNode.calendar.down[0][index].id != "00000000-0000-0000-0000-000000000000") {
348                       vm.treeview.currentNode.todelete.push(vm.treeview.currentNode.calendar.down[0][index].id);
349                   }
350                   vm.treeview.currentNode.calendar.down[0].splice(index, 1);
351
352
353               };
354               /* Render Tooltip */
355               $scope.eventRender = function (event, element, view) {
356                   element.attr({
357                       'tooltip': event.title,
358                       'tooltip-append-to-body': true
359                   });
360                   //$compile(element)($scope);
361               };
362               /* config object */
363               $scope.uiConfig = {
364                   calendar: {
365                       height: 500,
366                       editable: true,
367                       defaultView: 'agendaWeek',
368                       firstDay: 1,
369                       header: {
370                           left: 'title',
371                           center: '',
372                           right: 'today prev,next'
373                       },
374                       timezone: 'UTC',
375                       timeFormat: 'HH:mm',
376                       eventClick: $scope.eventClick,
377                       eventDrop: $scope.dragandDrop,
378                       eventResize: $scope.resizeEvent,
379                       eventRender: $scope.eventRender,
380                       dayClick: $scope.calendarClick
381
382
383                   }
384               };
385               $rootScope.$on('$locationChangeStart', function (event, newUrl, oldUrl) {
386                   console.log($(".changed").length);
387                   if ($(".changed").length != 0) {
388                       ngDialog.openConfirm({
389                           template:
390                            '<p>You have unsaved changes. Are you sure you want to leave this page? All changes will be lost. </p>' +
391                            '<div>' +
392                            '<button type="button" class="btn btn-primary" ng-click="confirm(1)">Yes' +
393                            '<button type="button" class="btn btn-default" ng-click="closeThisDialog(0)">No </button> ' +
394                            '</button></div>',
395                           plain: true
396                       }).then(function (success) {
397                           $rootScope.allowNavigation();
398                       });
399                   }
400                   
401                   event.preventDefault(); // This prevents the navigation from happening
402               }
403    );
404
405           });
406
407
Note: See TracBrowser for help on using the repository browser.