summaryrefslogtreecommitdiffstats
path: root/ecomp-portal-widget-ms/common-widgets/portal-common-scheduler-widget
diff options
context:
space:
mode:
Diffstat (limited to 'ecomp-portal-widget-ms/common-widgets/portal-common-scheduler-widget')
-rw-r--r--ecomp-portal-widget-ms/common-widgets/portal-common-scheduler-widget/js/controller.js604
-rw-r--r--ecomp-portal-widget-ms/common-widgets/portal-common-scheduler-widget/markup/markup.html178
-rw-r--r--ecomp-portal-widget-ms/common-widgets/portal-common-scheduler-widget/styles/styles.css47
3 files changed, 829 insertions, 0 deletions
diff --git a/ecomp-portal-widget-ms/common-widgets/portal-common-scheduler-widget/js/controller.js b/ecomp-portal-widget-ms/common-widgets/portal-common-scheduler-widget/js/controller.js
new file mode 100644
index 00000000..934095c3
--- /dev/null
+++ b/ecomp-portal-widget-ms/common-widgets/portal-common-scheduler-widget/js/controller.js
@@ -0,0 +1,604 @@
+function SchedulerCtrl($rootScope , $scope,$state,widgetsCatalogService,$log,schedulerService,$filter,confirmBoxService,userProfileService,conf,$interval,$compile) {
+ /****define fields****/
+ var pollpromise;
+ /*Assign the data that's passed to scheduler UI*/
+ $scope.hasParentData = true;
+ $rootScope.schedulerID = '';
+ $scope.orgUserId="";
+ $scope.policys = [];
+ $scope.selectedPolicy={policyName:"",policyConfig:""};
+ $scope.scheduler = {};
+ $scope.schedulingInfo = {};
+ $scope.timeSlots = [];
+ $scope.changeManagement = {};
+ $rootScope.schedulerForm = {
+ checkboxSelection : 'false',
+ fromDate:'',
+ toDate:'',
+ duration:'',
+ fallbackDuration:'',
+ concurrencyLimit:''
+ };
+
+ $scope.vnfNames = [];
+ $scope.vnfTypes = [];
+ $scope.schedulerObj = {};
+
+ var tomorrow = new Date();
+ tomorrow.setDate(tomorrow.getDate() + 1);
+ $scope.minDate = tomorrow.toISOString().substring(0, 10);
+
+
+ /*form validation*/
+ $scope.durationEmpty=false;
+ $scope.concurrencyLimitEmpty = false;
+ $scope.fallBackDurationEmpty=false;
+ $scope.fromDateEmpty = false;
+ $scope.toDateEmpty=false;
+
+ /*interval values for getting time slots*/
+ var hasvaluereturnd = true;
+ var hasthresholdreached = false;
+ var thresholdvalue =10; // interval threshold value
+
+ $scope.timeUnit= [
+ {text: 'HOURS'},
+ {text: 'MINUTES'},
+ {text: 'SECONDS'}
+ ];
+
+
+ /***** Functions for modal popup ******/
+ $scope.radioSelections=function (){
+ if( $rootScope.schedulerForm.checkboxSelection=="true"){
+ $rootScope.schedulerForm.fromDate='';
+ $rootScope.schedulerForm.toDate=''
+ }
+ }
+
+ /*Dropdown update: everytime values in dropdown chagnes, update the selected value*/
+ $scope.$watch('selectedPolicy.policyName', (newVal, oldVal) => {
+ for (var i = 0; i < $scope.policys.length; i++)
+ if ($scope.policys[i].policyName == newVal)
+ $scope.selectedPolicy = angular.copy($scope.policys[i]);;
+ });
+
+ $scope.$watch('selectedTimeUint.text', (newVal, oldVal) => {
+ for (var i = 0; i < $scope.timeUnit.length; i++)
+ if ($scope.timeUnit[i].text == newVal)
+ $scope.selectedTimeUint = angular.copy($scope.timeUnit[i]);;
+ });
+
+ /**
+ * This function is to validate and check if the input is a valid date.
+ * There are two checkers in this function:
+ * Check 1: the input is a valid date object,return true, return false otherwise.
+ * Check 2: check if the input has the format of MM/DD/YYYY or M/D/YYYY and is a valid date value.
+ * @param dateInput
+ * @return true/false
+ */
+ $scope.isDateValid = function(dateInput) {
+ /*Check 1: see if the input is able to convert into date object*/
+ if ( Object.prototype.toString.call(dateInput) === "[object Date]" )
+ return true;
+ /*Check 2: see if the input is the date format MM/DD/YYYY */
+ var isDateStrFormat = false;
+ try{
+ /*check the format of MM/DD/YYYY or M/D/YYYY */
+ var startDateformat = dateInput.split('/');
+ if (startDateformat.length != 3)
+ return false;
+ var day = startDateformat[1];
+ var month = parseInt(startDateformat[0])-1;
+ var year = startDateformat[2];
+ if (year.length != 4)
+ return false;
+ /*check the input value and see if it's a valid date*/
+ var composedDate = new Date(year, month, day);
+ if(composedDate.getDate() == day && composedDate.getMonth() == month && composedDate.getFullYear() == year)
+ isDateStrFormat = true
+ else
+ isDateStrFormat =false;
+ }catch(err){
+ return false;
+ }
+ return isDateStrFormat;
+ };
+
+ /**
+ * This function is to check whether the input date is greater than current date or not.
+ * @param date
+ * @return true/false
+ */
+ $scope.isStartDateValidFromToday = function (date) {
+ if(!$scope.isDateValid(date))
+ return false;
+ var startDate = new Date(date);
+ var currentDate = new Date();
+ if(startDate<=currentDate)
+ return false;
+ return true;
+ };
+
+ /**
+ * This function is to check whether the input to date is greater than input from date.
+ * @param fromDate , toDate
+ * @return true/false
+ */
+ $scope.isToDateGreaterFromDate = function (fromDate,toDate) {
+ if(!$scope.isDateValid(fromDate) || !$scope.isDateValid(toDate))
+ return false;
+ var fromDateObj = new Date(fromDate);
+ var toDateObj = new Date(toDate);
+ if(toDateObj<=fromDateObj)
+ return false;
+ return true;
+ };
+
+ /**
+ * This function is to get error message from the input json response object.
+ * @param response , method
+ * @return errorMsg
+ */
+ $scope.parseErrorMsg = function(response, method){
+ var errorMsg = '';
+ if(response.entity){
+ try{
+ var entityJson = JSON.parse(response.entity);
+ if(entityJson){
+ errorMsg = entityJson.requestError.text;
+ }
+ }catch(err){
+ $log.error('SchedulerCtrl::' + method +' error: ' + err);
+ }
+ }
+ return errorMsg;
+ }
+ /***** Scheduler UI functions *****/
+
+ /* This function is to send scheduler task approval to scheduler microservice. */
+ $scope.submit = function () {
+ $rootScope.showSpinner =true;
+
+ var approvalDateTime = new Date($scope.timeSlots[0].startTime);
+ $scope.schedulingInfo={
+ scheduleId: $rootScope.schedulerID,
+ approvalDateTime:approvalDateTime.toISOString(),
+ approvalUserId:$scope.orgUserId,
+ approvalStatus:$scope.schedulerObjConst.approvalSubmitStatus,
+ approvalType: $scope.schedulerObjConst.approvalType
+ }
+ var approvalObj= JSON.stringify($scope.schedulingInfo)
+ schedulerService.postSubmitForApprovedTimeslots(approvalObj).then(response => {
+ if(response.status>=200 && response.status<=204){
+ confirmBoxService.showInformation("Successfully Sent for Approval").then(isConfirmed => {});
+ }else{
+ var errorMsg = $scope.parseErrorMsg(response, 'postSubmitForApprovedTimeslots');
+ confirmBoxService.showInformation("Failed to Send for Approval "+ errorMsg).then(isConfirmed => {
+ $scope.closeModal();
+ });
+ }
+ }).catch(err => {
+ $log.error('SchedulerCtrl::postSubmitForApprovedTimeslots error: ' + err);
+ var errorMsg = '';
+ if(err.data)
+ errorMsg = $scope.parseErrorMsg(err.data, 'postSubmitForApprovedTimeslots');
+ else
+ errorMsg = err;
+ confirmBoxService.showInformation("There was a problem sending Schedule request. " + errorMsg).then(isConfirmed => {
+ $scope.closeModal();
+ });
+ }).finally(() => {
+ $rootScope.showSpinner = false;
+ });
+ };
+
+ /* This function is to send scheduler task rejection to scheduler microservice. */
+ $scope.reject = function () {
+ $rootScope.showSpinner =true;
+ var approvalDateTime = new Date($scope.timeSlots[0].startTime);
+ $scope.schedulingInfo={
+ scheduleId: $rootScope.schedulerID,
+ approvalDateTime:approvalDateTime.toISOString(),
+ approvalUserId:$scope.orgUserId,
+ approvalStatus: $scope.schedulerObjConst.approvalRejectStatus,
+ approvalType: $scope.schedulerObjConst.approvalType
+ }
+ var approvalObj= JSON.stringify($scope.schedulingInfo)
+ schedulerService.postSubmitForApprovedTimeslots(approvalObj).then(response => {
+ if(response.status>=200 && response.status<=299){
+ confirmBoxService.showInformation("Successfully Sent for Reject").then(isConfirmed => {});
+ }else{
+ var errorMsg = $scope.parseErrorMsg(response, 'postSubmitForApprovedTimeslots');
+ confirmBoxService.showInformation("Failed to Send for Reject "+ errorMsg).then(isConfirmed => {});
+ }
+ }).catch(err => {
+ $log.error('SchedulerCtrl::postSubmitForApprovedTimeslots error: ' + err);
+ var errorMsg = '';
+ if(err.data)
+ errorMsg = $scope.parseErrorMsg(err.data, 'postSubmitForApprovedTimeslots');
+ else
+ errorMsg = err;
+ confirmBoxService.showInformation("There was a problem rejecting Schedule request. " + errorMsg).then(isConfirmed => {
+ $scope.closeModal();
+ });
+ }).finally(() => {
+ $rootScope.showSpinner = false;
+ });
+ };
+
+ /* This function is to send policy config and receive scheduler Id. */
+ function sendSchedulerReq(){
+ $scope.timeSlots=[];
+ $scope.timeSlots.length=0;
+ $scope.schedulerObj.userId=$scope.orgUserId;
+ $scope.schedulerObj.domainData[0].WorkflowName=$scope.vnfObject.workflow;
+ $scope.schedulerObj.schedulingInfo.normalDurationInSeconds=convertToSecs($rootScope.schedulerForm.duration)
+ $scope.schedulerObj.schedulingInfo.additionalDurationInSeconds=convertToSecs($rootScope.schedulerForm.fallbackDuration)
+ $scope.schedulerObj.schedulingInfo.concurrencyLimit=parseInt($rootScope.schedulerForm.concurrencyLimit)
+
+ $scope.schedulerObj.schedulingInfo['vnfDetails'][0].groupId=$scope.schedulerObjConst.groupId;
+ $scope.schedulerObj.schedulingInfo['vnfDetails'][0].node=getVnfData($scope.vnfObject.vnfNames);
+ for(var i=0;i<$scope.policys.length;i++){
+ if($scope.policys[i].policyName == $scope.selectedPolicy.policyName){
+ try{
+ var config = $scope.policys[i].config;
+ var configJson = JSON.parse(config);
+ $scope.selectedPolicy.policyConfig = configJson.policyName;
+ }catch(err){
+ confirmBoxService.showInformation("There was a problem setting Policy config. Please try again later. " + err).then(isConfirmed => {
+ $scope.closeModal();
+ });
+ return;
+ }
+ }
+ }
+ $scope.schedulerObj.schedulingInfo.policyId=$scope.selectedPolicy.policyConfig;
+ var changeWindow=[{
+ startTime:$filter('date')(new Date($rootScope.schedulerForm.fromDate), "yyyy-MM-ddTHH:mmZ", "UTC"),
+ endTime:$filter('date')(new Date($rootScope.schedulerForm.toDate), "yyyy-MM-ddTHH:mmZ", "UTC")
+ }];
+ $scope.schedulerObj.schedulingInfo['vnfDetails'][0].changeWindow=changeWindow;
+
+ if($rootScope.schedulerForm.checkboxSelection=="true"){ //When Scheduled now we remove the changeWindow
+ delete $scope.schedulerObj.schedulingInfo['vnfDetails'][0].changeWindow;
+ }
+ var requestScheduler= JSON.stringify($scope.schedulerObj)
+ $rootScope.showSpinner = true;
+ schedulerService.getStatusSchedulerId(requestScheduler).then(response => {
+
+ var errorMsg = '';
+ if(response && response.entity!=null){
+ var errorMsg = $scope.parseErrorMsg(response, 'getStatusSchedulerId');
+ confirmBoxService.showInformation("There was a problem retrieving scheduler ID. Please try again later. " + errorMsg).then(isConfirmed => {
+ $scope.closeModal();
+ });
+
+ }else{
+ if(response && response.uuid){
+ $rootScope.schedulerID = response.uuid;
+ var scheduledID= JSON.stringify({scheduleId:$rootScope.schedulerID});
+ $scope.seviceCallToGetTimeSlots();
+ }else{
+ confirmBoxService.showInformation("There was a problem retrieving scheduler ID. Please try again later. " + response).then(isConfirmed => {
+
+ });
+ }
+
+
+ }
+ }).catch(err => {
+ $rootScope.showSpinner = false;
+ $log.error('SchedulerCtrl::getStatusSchedulerId error: ' + err);
+ var errorMsg = '';
+ if(err.data)
+ errorMsg = $scope.parseErrorMsg(err.data, 'getStatusSchedulerId');
+ else
+ errorMsg = err;
+ confirmBoxService.showInformation("There was a problem retrieving scheduler ID. Please try again later." + errorMsg).then(isConfirmed => {
+ $scope.closeModal();
+ });
+ }).finally(() => {
+ $rootScope.showSpinner = false;
+ });
+ }
+
+ /* This function is to get time slots from SNIRO */
+ $scope.seviceCallToGetTimeSlots = function(){
+ $rootScope.showTimeslotSpinner = true;
+ schedulerService.getTimeslotsForScheduler($rootScope.schedulerID).then(response => {
+ if($rootScope.schedulerForm.checkboxSelection=="false"){
+ if(response.entity && JSON.parse(response.entity).schedule){ //received the timeslots
+ var entityJson = JSON.parse(response.entity);
+ var scheduleColl=JSON.parse(entityJson.schedule);
+ if(scheduleColl.length>0){
+ $scope.timeSlots =scheduleColl;
+ hasvaluereturnd = false;
+ $rootScope.showTimeslotSpinner = false;
+ $scope.stopPoll();
+ confirmBoxService.showInformation(entityJson.scheduleId +" Successfully Returned TimeSlots.").then(isConfirmed => {});
+ }else
+ confirmBoxService.showInformation("No time slot available").then(isConfirmed => {
+ $scope.closeModal();
+ });
+ }else{ // do polling
+ if($scope.timeSlots.length==0 && hasthresholdreached==false){
+ var polltime=$scope.schedulerObjConst.getTimeslotRate*1000;
+ pollpromise= poll(polltime, function () {
+ if($scope.timeSlots.length==0){
+ hasvaluereturnd = true;
+ $scope.seviceCallToGetTimeSlots()
+ }else
+ hasvaluereturnd = false;
+ });
+ } else {
+ if($rootScope.showTimeslotSpinner === true){
+ $rootScope.showTimeslotSpinner = false;
+ hasthresholdreached = false;
+ confirmBoxService.showInformation("Failed to get time slot - Timeout error. Please try again later").then(isConfirmed => {
+ $scope.closeModal();
+ });
+ }
+ }
+ }
+ }else{
+ if(response.entity){
+ $rootScope.showTimeslotSpinner = false;
+ if($rootScope.schedulerForm.checkboxSelection=="false")
+ confirmBoxService.showInformation("Schedule ID :" + response.entity.scheduleId +" is ready to schedule.").then(isConfirmed => {});
+ else{
+ var entityObj = JSON.parse(response.entity);
+ confirmBoxService.showInformation("ID :" + entityObj.scheduleId +" is successfully sent for Approval").then(isConfirmed => {
+ $scope.closeModal();
+ });
+ }
+ }
+ }
+ }).catch(err => {
+ $log.error('SchedulerCtrl::seviceCallToGetTimeSlots error: ' + err);
+ $rootScope.showTimeslotSpinner = false;
+ confirmBoxService.showInformation("There was a problem retrieving time slows. Please try again later.").then(isConfirmed => {
+ $scope.closeModal();
+ });
+ })
+ }
+
+
+ $scope.closeModal = function(){
+ setTimeout(function(){ $rootScope.closeModal(); }, 500);
+ }
+
+ /* This function is to get policy list from policy microservice */
+ $scope.getPolicy = function(){
+ schedulerService.getPolicyInfo().then(res =>{
+ if(res==null || res=='' || res.status==null || !(res.status>=200 && res.status<=299)){
+ $log.error('SchedulerWidgetCtrl::getPolicyInfo caught error', res);
+ var errorMsg = $scope.parseErrorMsg(res, 'getPolicy');
+ confirmBoxService.showInformation('There was a problem retrieving ploicy. Please try again later. ' + errorMsg).then(isConfirmed => {
+ $scope.closeModal();
+ });
+ }else
+ $scope.policys = res.entity;
+ });
+ }
+
+ $scope.removeXMLExtension = function(str){
+ return str.replace(".xml","");
+ };
+ /* Find Button */
+ $scope.schedule = function () {
+ if($scope.formValidation())
+ sendSchedulerReq();
+ };
+
+ /*************utility functions**************/
+
+ function convertToSecs(number){
+ var totalSecs;
+ if($scope.selectedTimeUint.text === 'HOURS'){
+ totalSecs=number * 3600;
+ } else if($scope.selectedOption === 'MINUTES') {
+ totalSecs=number * 60;
+ } else {
+ totalSecs=number;
+ }
+ return totalSecs;
+ }
+
+ function poll(interval, callback) {
+ return $interval(function () {
+ if (hasvaluereturnd) //check flag before start new call
+ callback(hasvaluereturnd);
+ thresholdvalue = thresholdvalue - 1; //Decrease threshold value
+ if (thresholdvalue == 0)
+ $scope.stopPoll(); // Stop $interval if it reaches to threshold
+ }, interval)
+ }
+
+ // stop interval.
+ $scope.stopPoll = function () {
+ $interval.cancel(pollpromise);
+ thresholdvalue = 0; //reset all flags.
+ hasvaluereturnd = false;
+ hasthresholdreached=true;
+ $rootScope.showSpinner = false;
+ }
+
+ function getVnfData(arrColl){
+ var vnfcolletion=[];
+ for(var i=0;i<arrColl.length;i++)
+ vnfcolletion.push(arrColl[i].name);
+ return vnfcolletion
+ }
+
+ function extractChangeManagementCallbackDataStr(changeManagement) {
+ var result = {};
+ result.requestType = changeManagement.workflow;
+ result.requestDetails = [];
+ _.forEach(changeManagement.vnfNames, function (vnfName) {
+ if (vnfName && vnfName.version) {
+ if (vnfName.selectedFile) {
+ vnfName.version.requestParameters.userParams = vnfName.selectedFile;
+ }
+ result.requestDetails.push(vnfName.version)
+ }
+ });
+ return JSON.stringify(result);
+ }
+
+
+ $scope.constructScheduleInfo = function(){
+ var callbackData = extractChangeManagementCallbackDataStr($scope.vnfObject);
+ $scope.schedulerObj = {
+ domain: $scope.schedulerObjConst.domain,
+ scheduleId: '',
+ scheduleName: $scope.schedulerObjConst.scheduleName,
+ userId: '',
+ domainData: [{
+ 'WorkflowName': $scope.schedulerObjConst.WorkflowName,
+ 'CallbackUrl': $scope.schedulerObjConst.CallbackUrl,
+ 'CallbackData': callbackData
+ }],
+ schedulingInfo: {
+ normalDurationInSeconds: '',
+ additionalDurationInSeconds: '',
+ concurrencyLimit: '',
+ policyId: '',
+ vnfDetails: [
+ {
+ groupId: "",
+ node: [],
+ changeWindow: [{
+ startTime: '',
+ endTime: ''
+ }]
+ }
+ ]
+ },
+ }
+ }
+
+ $scope.formValidation = function(){
+ $scope.durationEmpty=false;
+ $scope.concurrencyLimitEmpty = false;
+ $scope.fallBackDurationEmpty=false;
+ $scope.fromDateGreater=false;
+ $scope.fromDateEmpty=false;
+ $scope.toDateEmpty=false;
+ if($rootScope.schedulerForm.duration=='')
+ $scope.durationEmpty=true;
+ if($rootScope.schedulerForm.fallbackDuration=='')
+ $scope.fallBackDurationEmpty=true;
+ if($rootScope.schedulerForm.concurrencyLimit=='')
+ $scope.concurrencyLimitEmpty = true;
+ if(!($rootScope.schedulerForm.fromDate instanceof Date))
+ $scope.fromDateEmpty=true;
+ if(!($rootScope.schedulerForm.toDate instanceof Date ))
+ $scope.toDateEmpty=true;
+ var fromDateObj = new Date($rootScope.schedulerForm.fromDate);
+ var toDateObj = new Date($rootScope.schedulerForm.toDate);
+ if(fromDateObj>toDateObj)
+ $scope.fromDateGreater = true;
+ if($scope.durationEmpty||$scope.fallBackDurationEmpty ||$scope.concurrencyLimitEmpty || (($scope.fromDateEmpty || $scope.toDateEmpty) && $rootScope.schedulerForm.checkboxSelection=='false' ) ||$scope.fromDateGreater)
+ return false;
+ if($rootScope.schedulerForm.checkboxSelection == false && (!isDateValid($rootScope.schedulerForm.toDate) || !isDateValid($rootScope.schedulerForm.fromDate)))
+ return false;
+ if($scope.selectedPolicy.policyName=='' || $scope.selectedPolicy.policyName=='Select Policy'){
+ confirmBoxService.showInformation("Policy is required").then(isConfirmed => {});
+ return false;
+ }
+ return true;
+ }
+
+ $scope.getScheduleConstant =function(){
+ schedulerService.getSchedulerConstants().then(res =>{
+ if(res==null || res=='' || res.status==null || res.status!="OK"){
+ $log.error('SchedulerWidgetCtrl::getSchedulerConstants caught error', res);
+ confirmBoxService.showInformation('There is a problem about the Scheduler UI. Please try again later.').then(isConfirmed => {
+ $scope.closeModal();
+ });
+ }else{
+ var response = res.response;
+ $scope.schedulerObjConst= {
+ domain: response.domainName,
+ scheduleName : response.scheduleName,
+ WorkflowName : response.workflowName,
+ CallbackUrl : response.callbackUrl,
+ approvalType : response.approvalType,
+ approvalSubmitStatus : response.approvalSubmitStatus,
+ approvalRejectStatus : response.approvalRejectStatus,
+ getTimeslotRate : response.intervalRate,
+ policyName : response.policyName,
+ groupId : response.groupId
+ }
+ $scope.constructScheduleInfo();
+ $scope.getPolicy() // get policy items for the dropdown in the scheduler UI
+ }
+ });
+ }
+
+ /*This function is to get the current logged in user id*/
+ $scope.getUserId = function(){
+ $rootScope.showSpinner = true;
+ userProfileService.getUserProfile()
+ .then(profile=> {
+ $scope.orgUserId = profile.orgUserId;
+ }).finally(() => {
+ $rootScope.showSpinner = false;
+ });
+ }
+
+ $scope.activateThis = function(ele){
+ $compile(ele.contents())($scope);
+ $scope.$apply();
+ };
+
+ /** listening calls from parents **/
+ $scope.$on("submit", function(events,data){
+ $scope.submit();
+ });
+
+ $scope.$on("reject", function(events,data){
+ $scope.reject();
+ });
+
+ $scope.$on("schedule", function(events,data){
+ $scope.schedule();
+ });
+
+ /** init **/
+
+ var init = function () {
+ $rootScope.showSpinner = false;
+ $scope.selectedTimeUint=$scope.timeUnit[0];
+
+ if($scope.$parent.parentData){
+ $scope.hasParentData = true;
+ $scope.message = $scope.$parent.parentData;
+ $scope.vnfObject = $scope.message.data;
+ $scope.schedulerObj = $scope.message.data;
+ $scope.getUserId();
+ $scope.getScheduleConstant(); //get Scheduler constants from properties file
+ }else{
+ //second approach to get data
+ var isModal = $( "#scheduler-body" ).hasClass( "b2b-modal-body" );
+ if(isModal){
+ $scope.message = schedulerService.getWidgetData();
+ if($scope.message){
+ $scope.hasParentData = true;
+ $scope.vnfObject = $scope.message.data;
+ $scope.schedulerObj = $scope.message.data;
+ $scope.getUserId();
+ $scope.getScheduleConstant(); //get Scheduler constants from properties file
+ }
+ }else{
+ $scope.hasParentData = false;
+ }
+ }
+ };
+
+ init();
+
+
+}
+
diff --git a/ecomp-portal-widget-ms/common-widgets/portal-common-scheduler-widget/markup/markup.html b/ecomp-portal-widget-ms/common-widgets/portal-common-scheduler-widget/markup/markup.html
new file mode 100644
index 00000000..1a941907
--- /dev/null
+++ b/ecomp-portal-widget-ms/common-widgets/portal-common-scheduler-widget/markup/markup.html
@@ -0,0 +1,178 @@
+<div id="widget-scheduler" ng-controller="SchedulerCtrl" class="widget-scheduler-main" >
+ <div id="widget-scheduler" class="widget-scheduler-main">
+ <span class="ecomp-spinner" ng-show="showTimeslotSpinner"></span>
+ <span class="ecomp-spinner" ng-show="showSpinner"></span>
+ <div ng-if="!hasParentData">
+ <div class="activity-error-container" style="background: rgb(255, 255, 255); overflow: hidden !important; width: 100%;">
+ <div class="activity-error-block">
+ <i class="icon-information full-linear-icon-information" style="margin-left: 125px; font-size: 90px"></i> <br>
+ <div class="activity-error-msg1">No prerequisite data available</div>
+ </div>
+ </div>
+ </div>
+ <div ng-if="hasParentData" ng-hide="showSpinner || showTimeslotSpinner">
+ <div class="row-nowrap">
+ <br>
+ <div class="scheduler-radio" role="radio">
+ <label for="nowRadio" class="radio"> <input
+ type="radio" ng-model="schedulerForm.checkboxSelection" id="nowRadio"
+ name="nowRadio" value="true">
+ <i class="skin"></i> <span>Now</span>
+ </label>
+ </div>
+ </div>
+ <div class="scheduler-radio" role="radio">
+ <label for="rangeRadio" class="radio"> <input
+ type="radio" ng-model="schedulerForm.checkboxSelection" id="rangeRadio"
+ name="rangeRadio" value="false">
+ <i class="skin"></i> <span>Range</span>
+ </label>
+ </div>
+
+ <br>
+ <div class="row-nowrap">
+ <div class="span12">
+ <div class="form-row">
+ <label for="textinputID-2a">From Date</label>
+ <div class="datepicker-container">
+ <input id="startDate" min="minDate"
+ ng-disabled="(schedulerForm.checkboxSelection=='true')? true:false"
+ name="startDate" type="text" class="span12"
+ ng-model="schedulerForm.fromDate" b2b-datepicker>
+ <span class="error"
+ ng-show="fromDateEmpty && schedulerForm.fromDate=='' && schedulerForm.checkboxSelection=='false'">A required date is missing</span>
+ <span class="error" ng-show="!isDateValid(schedulerForm.fromDate) && schedulerForm.fromDate!=''">Please enter valid date in MM/DD/YYYY format!</span>
+ <span class="error" ng-show="isDateValid(schedulerForm.fromDate) && !isStartDateValidFromToday(schedulerForm.fromDate) && schedulerForm.fromDate!=''">Input date must be greater than today!</span>
+ </div>
+ </div>
+
+ </div>
+ </div>
+ <br>
+ <div class="row-nowrap">
+ <div class="span12">
+ <div class="form-row">
+ <label for="textinputID-2a">To Date</label>
+ <div class="datepicker-container">
+ <input id="startDate" min="minDate" ng-disabled="(schedulerForm.checkboxSelection=='true')? true:false" name="endDate" type="text" class="span12"
+ ng-model="schedulerForm.toDate" b2b-datepicker>
+ <span class="error" ng-show="(fromDateGreater || (!isToDateGreaterFromDate(schedulerForm.fromDate,schedulerForm.toDate) && schedulerForm.toDate!=''))">To date must be greater than From date.</span>
+ <span class="error" ng-show="toDateEmpty && schedulerForm.toDate=='' && schedulerForm.checkboxSelection=='false'">A required date is missing</span>
+ <span class="error" ng-show="!isDateValid(schedulerForm.toDate) && schedulerForm.toDate!=''">Please enter valid date in MM/DD/YYYY format!</span>
+ <span class="error" ng-show="isDateValid(schedulerForm.toDate) && !isStartDateValidFromToday(schedulerForm.toDate) && schedulerForm.toDate!=''">Input date must be greater than today!</span>
+ </div>
+ </div>
+ </div>
+ </div>
+ <br>
+ <div class="row-nowrap">
+ <div class="span12">
+ <div class="form-row">
+ <label for="dropdown1">Please Select Option For Duration
+ and FallBack</label> <select id="dropdown1" name="dropdown1" b2b-dropdown
+ placeholder-text="" ng-model="selectedTimeUint.text">
+ <option b2b-dropdown-list option-repeat="d in timeUnit"
+ value="{{d.text}}">{{d.text}}</option>
+ </select>
+ </div>
+ </div>
+ </div>
+ <br>
+ <div class="row-nowrap">
+ <div class="span12">
+ <div class="form-row">
+ <label for="textinputID-2a">Duration</label>
+ <div class="field-group">
+ <input id="textinputID-2a" class="span12" type="number"
+ data-ng-model="schedulerForm.duration"> <span
+ class="error"
+ ng-show="durationEmpty && schedulerForm.duration==''">Required!</span>
+ </div>
+ </div>
+ </div>
+ <div class="span12">
+ <div class="form-row">
+ <label for="fallBackDuration">FallBack Duration</label>
+ <div class="field-group">
+ <input id="fallBackDuration" class="span12" type="number"
+ data-ng-model="schedulerForm.fallbackDuration"> <span
+ class="error"
+ ng-show="fallBackDurationEmpty && schedulerForm.fallbackDuration==''">Required!</span>
+ </div>
+ </div>
+ </div>
+ </div>
+ <br>
+ <div class="row-nowrap">
+ <div class="span12">
+ <div class="form-row">
+ <label for="concurrency">Concurrency Limit</label>
+ <div class="field-group">
+ <input id="concurrency" class="span12" type="number"
+ data-ng-model="schedulerForm.concurrencyLimit" min="1" max="30">
+ <span class="error"
+ ng-show="concurrencyLimitEmpty && schedulerForm.concurrencyLimit==''">Required!</span>
+ </div>
+ </div>
+ </div>
+ </div>
+ <br>
+ <div class="row-nowrap">
+ <div class="span12">
+ <div class="form-row">
+ <label for="policy">Policy</label> <select name="policy"
+ b2b-dropdown placeholder-text="Select Policy"
+ ng-model="selectedPolicy.policyName" id="policy">
+ <option b2b-dropdown-list option-repeat="p in policys"
+ value="{{p.policyName}}">{{p.policyName}}</option>
+ </select>
+ </div>
+ </div>
+ </div>
+ <br>
+ <div>
+ <button type="button" id="find" name="Find" ng-show="(schedulerForm.checkboxSelection=='true')? false:true"
+ class="btn btn-alt btn-small" ng-click="schedule()">Find</button>
+ <div b2b-table table-data="timeSlots" ng-hide="timeSlots.length==0" class="b2b-table-div">
+ <table>
+ <thead b2b-table-row type="header">
+ <tr>
+ <th b2b-table-header key="firstName" sortable="true" id="start-time" default-sort="a">Start Time</th>
+ <th b2b-table-header key="lastName" sortable="true" id="end-time">Finish Time</th>
+ </tr>
+ </thead>
+ <tbody b2b-table-row type="body" row-repeat="rowData in timeSlots" class="table-users-div">
+ <tr ng-click="users.openAddNewUserModal(rowData)">
+ <td b2b-table-body id="rowheader_t1_{{$index}}-startTime" headers="start-time" ng-bind="rowData.startTime"></td>
+ <td b2b-table-body id="rowheader_t1_{{$index}}-endTime" headers="end-time" ng-bind="rowData.finishTime"></td>
+
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+
+ <div class="b2b-modal-footer">
+ <div class="cta-button-group in">
+ <div ng-show="(schedulerForm.checkboxSelection=='true')? false:true">
+ <button class="btn btn-alt btn-small" id="div-confirm-ok-button"
+ type="button" ng-click="reject()" ng-disabled="schedulerID=='' || showSpinner || showTimeslotSpinner">Reject</button>
+ <button class="btn btn-alt btn-small" id="div-confirm-ok-button"
+ type="button" name="submit" ng-click="submit()" ng-disabled="schedulerID=='' || showSpinner || showTimeslotSpinner">Schedule</button>
+
+ </div>
+ <div ng-show="(schedulerForm.checkboxSelection=='true')? true:false">
+ <button class="btn btn-alt btn-small" id="div-confirm-ok-button"
+ type="button" name="submit" ng-click="schedule()" ng-disabled="showSpinner || showTimeslotSpinner">Schedule</button>
+ </div>
+ <div>
+ <button class="btn btn-alt btn-small"
+ type="button" ng-click="closeModal()">Cancel</button>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+
+
+</div>
diff --git a/ecomp-portal-widget-ms/common-widgets/portal-common-scheduler-widget/styles/styles.css b/ecomp-portal-widget-ms/common-widgets/portal-common-scheduler-widget/styles/styles.css
new file mode 100644
index 00000000..67c8ab40
--- /dev/null
+++ b/ecomp-portal-widget-ms/common-widgets/portal-common-scheduler-widget/styles/styles.css
@@ -0,0 +1,47 @@
+
+.portal-widget-panel-container {
+ margin-left:150px;
+ width:1500px;
+}
+
+
+.portal-widget-panel-fixed-panel {
+ min-height: 300px;
+ max-height: 1300px;
+ overflow: auto;
+}
+
+.portal-widget-panel-double-middle {
+ min-height: 660px;
+ max-height: 660px;
+ overflow: auto;
+}
+
+.portal-widget-panel-row {
+ margin-right: 0px;
+ margin-left: 0px;
+ width: 2800px;
+}
+
+/*Increases the width of the card/panel */
+.portal-widget-panel-panel-default {
+ width:450px
+}
+
+/*Controls the spacing between the cards */
+.portal-widget-panel-col-sm-3 {
+ width:20.5%
+}
+
+.portal-widget-panel-top {
+ top: 15px;
+ left: 15px;
+}
+
+#-css-ready {
+color: #bada55 !important;
+}
+
+.scheduler-radio{
+ margin:5px;
+} \ No newline at end of file