How to use synchronous call on service portal.

Bosco Sahayaraj
Mega Contributor

Hi Team,

I want to do date validation. Here getXMLWait() is not working on service portal. Any other alternative solution for this. Because i can not use asynchronous glide ajax, it will not wait for the service response. I am keeping my code below.   I am sure that my script include is working good.

function onSubmit() {

var startDate = g_form.getValue("start");

var endDate = g_form.getValue("end");

if(startDate != undefined && startDate != '' && endDate != undefined && endDate != ''){

var validation = new GlideAjax('OLA_DongleDateValidation');

validation.addParam('sysparm_name','ola_Startvalidation');

validation.addParam('sysparm_Start',startDate );

validation.addParam('sysparm_End',endDate );

//validation.getXMLWait(); not working in portal

//var answer = validation.getAnswer();

validation.getXML(HelloWorldParse);

var valid = new GlideAjax('OLA_DongleDateValidation');

valid.addParam('sysparm_name','ola_currentdatevalidation');

valid.addParam('sysparm_Start',startDate);

valid.addParam('sysparm_End',endDate );

valid.getXMLWait();

var answer1 = valid.getAnswer();

alert(answer1);

valid.getXML(HelloWorld);

    }

function HelloWorldParse(response) {  

    var answer = response.responseXML.documentElement.getAttribute("answer");

    if(answer = false){

    alert("End date should not be before start date");

    return answer;

    }

}

    function HelloWorld(response) {  

    var answer = response.responseXML.documentElement.getAttribute("answer");

    if(answer = false)

    {

    alert("Start date should not be a past date");

    return answer;

    }

    }

synchronous

6 REPLIES 6

Jack
Tera Guru

Hi Bosco,


If you want to validate input date of RP (using client script - portal), you can use the moment.js lib.


This is example code:



function onSubmit() {


  g_form.hideAllFieldMsgs("error");


  var isValid = true;



var formatDate = getFormatDate();


var today = moment();


      var starts = moment(g_form.getValue('start_date'), formatDate);


if (starts.isBefore(today)) {


            g_form.showErrorBox("start_date", "Start date must be today or a future date!");


            isValid = false;


      }else{


//add anything you want


}



      g_form.submitted = isValid;


      return isValid;


}



function getFormatDate() {


      var formatDate = "DD-MM-YYYY";


      try {


              if (g_user_date_time_format.indexOf("MM-dd-yyyy") !== -1) {


                      formatDate = "MM-DD-YYYY";


              } else if (g_user_date_time_format.indexOf("dd/MM/yyyy") !== -1) {


                      formatDate = "DD/MM/YYYY";


              } else if (g_user_date_time_format.indexOf("yyyy-MM-dd") !== -1) {


                      formatDate = "YYYY.MM.DD";


              }


      } catch (err) {


              formatDate = "DD-MM-YYYY";


      }


      return formatDate + " HH:mm:ss";


}



Hope this will helpful!


howardaustin
Tera Contributor

The answer is that you don't.  Synchronous calls are not available on portal, so you are stuck with async.  Your goal is to check a remote record's value when you submit the request.  Instead, set a hidden value on your request to true or false based on an onChange to the given field(s).  Here is an example that checks for a manager:

function onChange(control, oldValue, newValue, isLoading) {
	if(newValue != ''){
		var usr = g_form.getReference('requested_for', getManagerInfo);
	}
}

function getManagerInfo(usr){
	if(usr.manager == ''){
		g_scratchpad.hasManager = false;
	}else if( usr.manager.active == false){
		g_scratchpad.hasManager = true;
	}
}

Then use an onSubmit to check if that value is true or false.

function onSubmit() {

	var manager = g_scratchpad.hasManager;
	if (manager){
		alert('Please provide Requested for user with a valid Manager.');
		return false;
	}
}