diff options
Diffstat (limited to 'ecomp-portal-widget-ms/common-widgets/portal-common-scheduler-widget')
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 |