Initial OpenECOMP policy/engine commit
[policy/engine.git] / ecomp-sdk-app / src / main / webapp / app / fusion / scripts / controllers / workflows / workflowController.js
1 /*-
2  * ================================================================================
3  * eCOMP Portal SDK
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ================================================================================
19  */
20 app.controller('workflowsController', function($scope, $http, $uibModal, $log, modalService, $modal) {
21                 
22         $scope.viewPerPage = 5;
23     $scope.scrollViewsPerPage = 20;
24     $scope.currentPage = 2;
25     $scope.totalPage;
26     $scope.searchCategory = "";
27     $scope.searchString = "";
28     $scope.radio = {
29         value: ""
30     };
31         
32         
33     $scope.showModal = false;
34     $scope.toggleModal = function(){
35         $scope.showModal = !$scope.showModal;
36     };
37
38     $scope.workflow = {};
39     $scope.workflow.active = "true";
40
41     $scope.updateAllWorkflowStatus = function() {
42                 angular.forEach($scope.workflows,function(value){
43                         $scope.checkWorkflowStatus(value);
44             })
45         }
46
47     $scope.fetchWorkflowsList = function() {
48         $http.get('workflows/list').then(function(workflowList){
49                 console.log('Got new list from server = ' + workflowList.data);
50             $scope.workflows = workflowList.data;
51             $scope.updateAllWorkflowStatus();
52         });     
53     };
54
55     $scope.addNewWorkflow = function(newWorkflow) {
56         $http.post('workflows/addWorkflow/', JSON.stringify(newWorkflow)).success(function() {
57             $scope.fetchWorkflowsList();
58         });
59         
60         $scope.workflow.name = '';
61
62     };
63
64     $scope.updateWorkflow = function (workflowToEdit) {
65         //workflowToEdit.active='true';
66                  var modalInstance = $uibModal.open({
67                          animation: $scope.animationsEnabled,
68                          templateUrl: 'app/fusion/scripts/view-models/workflows/workflow-new.html',
69                          //size : modalSize,
70                          controller: ['$scope', '$uibModalInstance', '$http', function ($scope, $uibModalInstance, $http) {
71                                 $scope.workflow = workflowToEdit;                               
72                                         $scope.ok = function() {                          
73                               console.log('Updating existing workflow ... ' + JSON.stringify($scope.workflow));               
74                               $http.post('workflows/editWorkflow/', JSON.stringify($scope.workflow)).then(function(returnedWorkflow){
75                                   console.log('Returned Workflow = ' + JSON.stringify(returnedWorkflow));
76                                   $uibModalInstance.close($scope.workflow);
77                               });
78                           };
79                 
80                           $scope.cancel = function() {
81                                   $uibModalInstance.dismiss();
82                           };
83                     }],
84                     //End of inner controller
85                     resolve: {
86                         workflow: function() {
87                                 console.log('Passing ' + JSON.stringify($scope.workflow)); 
88                                 return $scope.workflow; 
89                         }
90                     }
91                   });
92
93               modalInstance.result.then(function (editedWorkFlow) {
94                   //Need to convert to proper date - later
95                   delete editedWorkFlow.created;
96                   delete editedWorkFlow.updated;
97                   
98                   delete editedWorkFlow.createdBy;
99                   delete editedWorkFlow.modifiedBy;
100                   
101                   console.log('selected Item ' + JSON.stringify(editedWorkFlow));                 
102                   $scope.$emit('workflowAdded', editedWorkFlow);
103                   
104               }, function () {
105                 $log.info('Modal dismissed at: ' + new Date());
106               });
107     };
108     
109     $scope.reset = function(){
110         console.log("Resetting ....");
111     };
112       
113         $scope.update = function(){
114                 console.log("updating ....");
115         };
116
117     $scope.createWorkflow = function (modalSize) {
118         
119                  var modalInstance = $uibModal.open({
120                  animation: $scope.animationsEnabled,
121                  templateUrl: 'app/fusion/scripts/view-models/workflows/workflow-new.html',
122                  size : modalSize,               
123                  controller: ['$scope', '$uibModalInstance', '$http', function ($scope, $uibModalInstance, $http) {
124                         $scope.workflow = {};
125                         $scope.workflow.active = 'true'; 
126                                 $scope.ok = function() {                          
127                       console.log('Saving new workflow ... ' + JSON.stringify($scope.workflow));                      
128                       $http.post('workflows/addWorkflow/', JSON.stringify($scope.workflow)).then(function(returnedWorkflow){
129                           console.log('Returned Workflow = ' + JSON.stringify(returnedWorkflow));
130                           $uibModalInstance.close($scope.workflow);
131                       });
132                   };
133 /*                console.log(size);*/
134                   $scope.cancel = function() {
135                           $uibModalInstance.dismiss();
136                   };
137             }],
138             //End of inner controller
139             resolve: {
140                 workflow: function() {
141                         console.log('Passing ' + JSON.stringify($scope.workflow)); 
142                         return $scope.workflow; 
143                 }
144             }
145           });
146
147       modalInstance.result.then(function (newWorkflow) {
148           console.log('selected Item ' + JSON.stringify(newWorkflow));
149           $scope.$emit('workflowAdded', newWorkflow);
150           
151       }, function () {
152         $log.info('Modal dismissed at: ' + new Date());
153       });
154    };//End of createWorkflow function
155    
156  
157    $scope.removeWorkflow = function(workflowToRemove){     
158            var modalInstance = $uibModal.open({
159                          animation: $scope.animationsEnabled,
160                          templateUrl: 'app/fusion/scripts/view-models/workflows/workflow-remove.html',
161                          controller: ['$scope', '$uibModalInstance', '$http', function ($scope, $uibModalInstance, $http) {
162                                 $scope.workflowToRemove = workflowToRemove;
163                                         $scope.ok = function() {                          
164                               console.log('Removing workflow ... ' + JSON.stringify($scope.workflowToRemove) + ' on client request.');                
165                               $http.post('workflows/removeWorkflow/', JSON.stringify($scope.workflowToRemove.id)).then(function(){
166                                   console.log('Workflow successfully removed !!!');
167                                   $uibModalInstance.close();
168                               });
169                           };
170                 
171                           $scope.cancel = function() {
172                                   $uibModalInstance.dismiss();
173                           };
174                     }]
175                   });
176
177               modalInstance.result.then(function () {
178                   $scope.$emit('workflowRemoved');                
179               }, function () {
180                 $log.info('Modal dismissed at: ' + new Date());
181               });
182            
183         };
184         
185         
186         
187            $scope.scheduleWorkflow = function(workflowToSchedule){         
188                    var modalInstance = $uibModal.open({
189                                  animation: $scope.animationsEnabled,
190                                  templateUrl: 'app/fusion/scripts/view-models/workflows/workflow-schedule.html',
191                                  size:'lg',
192
193                                  controller: ['$scope', '$uibModalInstance', '$http','dateFilter', function ($scope, $uibModalInstance, $http,dateFilter) {
194                                          
195                                          $scope.workflowToSchedule = workflowToSchedule;
196                                          $scope.dt = new Date();
197                                          $scope.dt2 = new Date();
198                                          $scope.dateformat = 'MM/dd/yyyy',
199                                          $scope.datetimeformat = "hh:mm a";
200                                          
201                                          $scope.recurrenceOptions =[{                                              
202                                                   index:0, value:'One-Time', title:'One-Time'
203                                          },{
204                                                  index:1, value: 'Hourly',title:'Hourly'
205                                          },{
206                                                  index:2, value: 'Daily',title:'Daily'
207                                          },{
208                                                  index:3, value: 'Weekly',title:'Weekly'                                                                                                 
209                          }]                                      
210                          $scope.selectRecurrenceOpt = $scope.recurrenceOptions[0];                                       
211                                          
212                                          $scope.hours = [];
213                                          for (var i=0; i<24; i++){
214                                                  var newObj={}
215                                                  newObj.index = i;
216                                                  newObj.value = ""+i;
217                                                  newObj.title = ""+i;
218                                                  $scope.hours.push(newObj);
219                                          }
220                                          
221                                          $scope.minutes = [];
222                                          for (var i=0; i<60; i++){
223                                                  var newObj={}
224                                                  newObj.index = i;
225                                                  newObj.value = ""+i;
226                                                  newObj.title = ""+i;
227                                                  $scope.minutes.push(newObj);
228                                          }                                       
229                                          
230                                          $scope.AMPMOptions =[
231                                            {
232                                                   index:0, value:'AM', title:'AM'
233                                          },{
234                                                  index:1, value: 'PM',title:'PM'
235                                          }]
236                                          
237                                          $scope.selectFirstHour =$scope.hours[0];                                        
238                                          $scope.selectFirstMinute =$scope.minutes[0];
239                                          
240                                          $scope.selectLastHour =$scope.hours[0];                                         
241                                          $scope.selectLastMinute =$scope.minutes[0];                                                                                    
242                                          
243                                          $scope.selectStartAMPMOption=$scope.AMPMOptions[0];
244                                          $scope.selectLastAMPMOption=$scope.AMPMOptions[0];
245
246                                          var GenerateCronExpression = function(trigger_dt, RecurrenceOpt) {
247                                                 var CRON_sec = trigger_dt.getSeconds();
248                                                 var CRON_min = trigger_dt.getMinutes();
249                                                 var CRON_hr = trigger_dt.getHours();
250                                                 var CRON_date= trigger_dt.getDate();
251                                                 var CRON_month = trigger_dt.toLocaleString('en-US', {month: 'short'}).toUpperCase();
252                                                 var CRON_day = trigger_dt.toLocaleString('en-US', {weekday: 'short'}).toUpperCase();
253                                                 var CRON_year = trigger_dt.getFullYear();
254                                                 if (RecurrenceOpt ==="One-Time") {
255                                                         CRON_day = '?'
256                                                 } else {
257                                                         if (RecurrenceOpt ==="Hourly") {
258                                                                 CRON_hr = '*';
259                                                                 CRON_date = '*'
260                                                                 CRON_month = '*'
261                                                                 CRON_day = '?'
262                                                                 CRON_year = '*'
263                                                         } else if (RecurrenceOpt ==="Daily") {
264                                                                 CRON_date = '*'
265                                                                 CRON_month = '*'
266                                                                 CRON_day = '?'
267                                                                 CRON_year = '*'
268                                                         } else if (RecurrenceOpt ==="Weekly") {
269                                                                 CRON_date = '*'
270                                                                 CRON_month = '*'
271                                                                 CRON_year = '*'                 
272                                                         }
273                                                 }
274
275                                                 var CRON_Expression = [CRON_sec, CRON_min, CRON_hr, CRON_date, CRON_month, CRON_day, CRON_year];
276                                                 return CRON_Expression.join(" ");
277                                         }
278
279                                         $scope.ok = function() {
280                                                         
281                                                         // DateTime for the start time: it should be noted that the start time
282                                                         // for a CRON job should be prior to the trigger time.
283                                                         $scope.trigger_dt = new Date( $scope.dt.getFullYear() +
284                                                                                                 "-" + ("0"+($scope.dt.getMonth()+1)).slice(-2) +
285                                                                                                 "-" +("0"+ $scope.dt.getDate()).slice(-2) +
286                                                                                                 " " + ("0" + $scope.selectFirstHour.value).slice(-2) +
287                                                                                                 ":" +("0" + $scope.selectFirstMinute.value).slice(-2) +
288                                                                                                 ":00.0");
289
290                                                         $scope.startDateTime_CRON = GenerateCronExpression($scope.trigger_dt, $scope.selectRecurrenceOpt.value)
291
292                                                         //roll back the the start date time by 30 seconds (start time should be 30 seconds prior to trigger time)
293                                                         dt_st = new Date($scope.trigger_dt - 30*1000)
294                                                         
295                                                         startDateTime = dt_st.getFullYear() +
296                                                                                                 "-" + ("0"+(dt_st.getMonth()+1)).slice(-2) +
297                                                                                                 "-" +("0"+ dt_st.getDate()).slice(-2) +
298                                                                                                 " " + ("0" + dt_st.getHours()).slice(-2) +
299                                                                                                 ":" +("0" + dt_st.getMinutes()).slice(-2) +
300                                                                                                 ":" + ("0" + dt_st.getSeconds()).slice(-2) +".0";
301                                                         $scope.startDateTime = startDateTime;
302                                                         
303                                                         $scope.endDateTime = $scope.dt2.getFullYear() + 
304                                                                                                 "-" + ("0"+($scope.dt2.getMonth()+1)).slice(-2) +
305                                                                                                 "-" +("0"+ $scope.dt2.getDate()).slice(-2) +
306                                                                                                 " " + ("0"+ $scope.selectLastHour.value).slice(-2) +
307                                                                                                 ":" +("0" + $scope.selectLastMinute.value).slice(-2) +
308                                                                                                 ":00.0"
309                                                                                                 
310                                                         $scope.WorkflowScheduleObject = {};
311                                                         $scope.WorkflowScheduleObject['startDateTime_CRON'] = $scope.startDateTime_CRON;
312                                                         $scope.WorkflowScheduleObject['startDateTime'] = $scope.startDateTime;
313                                                         $scope.WorkflowScheduleObject['endDateTime'] = $scope.endDateTime;
314                                                         $scope.WorkflowScheduleObject['workflowKey'] = $scope.workflowToSchedule.workflowKey;
315                                                         $scope.WorkflowScheduleObject['recurrence'] = $scope.selectRecurrenceOpt.value;
316                                                         $scope.WorkflowScheduleObject['workflow_arguments'] = "test";
317                                                         $scope.WorkflowScheduleObject['workflow_server_url'] = $scope.workflowToSchedule.runLink;
318                                                         
319                                                         
320                                                         TimeFromNowToStart = new Date($scope.startDateTime)-new Date()
321                                                         TimeStartToEnd = new Date($scope.endDateTime)-new Date($scope.startDateTime)
322                                                         
323                                                         if (TimeFromNowToStart<=0) {
324                                                                 console.log("invalid start time input")
325                                                                 alert("Please ensure the scheduled start date time is later than current time.")
326                                                                 return;
327                                                         }
328                                                         if (TimeStartToEnd<=0) {
329                                                                 console.log("invalid end time input")
330                                                                 alert("Please ensure the schduled end date time is later than the start time.")
331                                                                 return;                                                         
332                                                         }
333                                                         // if successful then save and close
334                                                         $scope.saveCronJob($scope.WorkflowScheduleObject);
335                                                         $uibModalInstance.close();
336                                                         
337                                                 };
338                                                 
339                                                 $scope.saveCronJob = function(cronJobData){
340                                                         
341                                                         console.log('saving cron job data: ' + cronJobData);
342                                                         var uuu = "workflows/saveCronJob.htm";
343                                                         var postData={cronJobDataObj: cronJobData};
344                                                         $.ajax({
345                                                                          type : 'POST',
346                                                                          url : uuu,
347                                                                          //dataType: 'json',                            // data type expected from server
348                                                                          contentType: 'application/json',  
349                                                                          data: JSON.stringify(postData),   // data type sent to server  
350                                                                          success : function(data){
351                                                                                                                                 $scope.$apply(function(){
352                                                                                                                                         //$scope.availableRoleFunctions=[];$scope.$apply();
353                                                                                                                                         // new // $scope.availableFnMenuItems=data.availableFnMenuItems;
354                                                                                                                                         }
355                                                                                                                                         );  
356                                                                                                                                 //alert("Update Successful.") ;
357                                                                                                                                 //$scope.editRoleFunction = null;
358                                                                                                                                 // new /// $modalInstance.close({availableFnMenuItems:$scope.availableRoleFunctions});
359                                                                                                                         },
360                                                                          error : function(data){
361                                                                                  alert("Error while saving."); 
362                                                                          }
363                                                                   });                                                   
364                                                         
365                                                 };
366                         
367                                   $scope.cancel = function() {
368                                           console.log("cancel triggered")
369                                           $uibModalInstance.dismiss();
370                                   };
371                             }]
372                           });
373
374                       modalInstance.result.then(function () {
375                           $scope.$emit('workflowRemoved');                
376                       }, function () {
377                         $log.info('Modal dismissed at: ' + new Date());
378                       });
379                    
380                 };      
381         
382         
383         
384         
385         
386         
387         
388         
389            $scope.previewWorkflow = function(workflowToPreview,modalSize){         
390                    var modalInstance = $uibModal.open({
391                                  animation: $scope.animationsEnabled,
392                                  templateUrl: 'app/fusion/scripts/view-models/workflows/workflow-preview.html',
393                                  size:modalSize,
394                                  controller: ['$scope', '$uibModalInstance', '$http', function ($scope, $uibModalInstance, $http) {
395                                         $scope.workflowToPreview = workflowToPreview;
396                                         console.log('previewWorkFlow invoked');
397                                         console.log($scope.workflowToPreview);
398                         
399                                   $scope.cancel = function() {
400                                           $uibModalInstance.dismiss();
401                                   };
402                             }]
403                           });
404
405                       modalInstance.result.then(function () {
406                           $scope.$emit('workflowRemoved');  
407                       }, function () {
408                         $log.info('Modal dismissed at: ' + new Date());
409                       });
410                    
411                 };   
412         
413         
414         /* change work flow status based on the boolean variable "suspendBool" which corresponds whether 
415          * we would like to suspend or activate a workflow specified by key. */ 
416         $scope.changeWorkflowStatus = function(workflowToChangeStatus,suspendBool){
417                 if (workflowToChangeStatus!==null) {
418                 var statusUrl= workflowToChangeStatus.runLink+"/engine-rest/process-definition/key/"+workflowToChangeStatus.workflowKey
419                 var suspendedUrl= statusUrl+"/suspended"
420                 var xmlHttp = new XMLHttpRequest();
421                 xmlHttp.open('PUT', suspendedUrl, false); 
422                 xmlHttp.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
423                 xmlHttp.onload = function() {
424                         if (suspendBool) {
425                                 console.log("process definition is now suspended"); 
426                                 workflowToChangeStatus.active="false"
427                         } else {
428                                 console.log("process definition is now activated");                             
429                                 workflowToChangeStatus.active="true"
430                         }
431                 };
432                 xmlHttp.send(JSON.stringify({
433                         "suspended" : suspendBool,
434                         "includeProcessInstances" : true,
435                         "executionDate" : "2013-11-21T10:49:45"
436                 }));
437                 }
438                 
439         };
440
441         $scope.activateWorkflow = function(workflowToActivate){
442                 $scope.changeWorkflowStatus(workflowToActivate,false)
443
444         };
445
446         $scope.suspendWorkflow = function(workflowToActivate){
447                 $scope.changeWorkflowStatus(workflowToActivate,true)
448         };              
449         
450         $scope.checkWorkflowStatus = function(workflow) {
451                 if (workflow!==null) {
452                 var statusUrl= workflow.runLink+"/engine-rest/process-definition/key/"+workflow.workflowKey
453                 var xmlHttp3 = new XMLHttpRequest();
454                 xmlHttp3.open('GET', statusUrl, true);
455                 xmlHttp3.withCredentials = true;
456                 xmlHttp3.send();                
457                 xmlHttp3.onreadystatechange = function() {
458                         if (xmlHttp3.readyState == 4 && xmlHttp3.status == 200) {
459                                 // do something with the response in the variable data
460                                 var temp = JSON.parse(xmlHttp3.responseText)
461                                 if (temp.suspended == false){
462                                         console.log("Activated")
463                                         workflow.active="true"
464                                 } else {
465                                         console.log("Suspended")
466                                         workflow.active="false"
467                                 }
468                         }
469                 }
470                 }
471         };
472         
473         $scope.StartWorkflowInstance = function(workflowToStart){
474                 if (workflowToStart!==null) {
475                 var statusUrl= workflowToStart.runLink+"/engine-rest/process-definition/key/"+workflowToStart.workflowKey
476                 var suspendedUrl= statusUrl+"/submit-form"
477                 var xmlHttp = new XMLHttpRequest();
478                 xmlHttp.open('POST', suspendedUrl, false); 
479                 xmlHttp.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
480                 xmlHttp.onload = function() {
481                 };
482                 xmlHttp.send(JSON.stringify({
483                           "variables": {
484                                     "customerId": {"value":"asdasda","type":"String"},
485                                     "amount":{"value":"100","type":"String"}
486                                   }
487                                 }));
488                 }
489                 
490         };      
491         
492         
493         $scope.$on('workflowAdded', function(event, newWorkflow) { 
494                 console.log("New Workflow to be added in list scope " + JSON.stringify(newWorkflow)); 
495                 //$scope.workflows.push(newWorkflow);
496                 $scope.fetchWorkflowsList();
497                 console.log('newly added workflow = ' + JSON.stringify(newWorkflow));
498         });
499         
500         $scope.$on('workflowRemoved', function(event) {
501                 $scope.fetchWorkflowsList();
502         });
503
504         $scope.fetchWorkflowsList();
505
506         
507         
508 });
509