Wednesday, June 24, 2015

How to do email validation in a Nintex Form using JQuery

Custom validations can be achieved quite easily by writing client side code in JQuery in a Nintex Form. There can be a requirement to check all mandatory fields are filled in the form or an email provided is a valid email or a number entered by user is only numeric. SharePoint allows this OOTB by defining the type of field, required or not required attribute of field but those validations happen server side on a Nintex Form. Lot of times we need to have a client side validation to inform the user then and there regarding wrong input. For example if an email needs to be validated using JQuery here are the steps to achieve this in a Nintex Form.

In Nintex Form designer drag the email field to the form from the list columns. In the control settings of the email field go to Advanced section and select "Store Client ID in JavaScript variable" as "Yes" and assign name as "txtEmail" as shown in below screenshot.


After specifying the control client JavaScript variable include the Form.js script file in the form Settings -> Advanced -> Custom JavaScript Includes

/SiteAssets/jquery-1.8.3.min.js
/SiteAssets/Form.js

Add a label control at the top of the form and set the properties of the control as shown in screenshot below. This label control will display the error message to the end user.



Set the button properties of the submit button of the form to following as shown in the screenshot so that the Validate function is called on the click of the button.

Form.js

function CheckEmailAddressIsValid(emailId) {

    var pattern = new RegExp(/^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/);
    return pattern.test(emailId);
};

function Validate()
{
if($('#'+txtTitle).val() == ''){
  $('.lblErrorMessage').text("Please provide title.");
  $('.lblErrorMessage').css('color', 'red');
  $('.lblErrorMessage').css('font-size', 'small');
  $('.lblErrorMessage').css('font-weight', 'bold');
  $('#'+txtTitle).css('background-color', '#FF9999');
           $('#'+txtTitle).focus();
  return false;
}
else
{
$('#'+txtTitle).css('background-color', '#FFFFFF');
}

var emailAddress = $('#'+txtEmail).val();
      if (emailAddress.trim() == '') 
      {
       $('.lblErrorMessage').text("Please provide email address.");
       $('.lblErrorMessage').css('color', 'red');
       $('.lblErrorMessage').css('font-size', 'small');
       $('.lblErrorMessage').css('font-weight', 'bold');
  
       $('#'+txtEmail).css('background-color', '#FF9999');
       $('#'+txtEmail).focus();
       return false;
   }
   else
   {
if (!CheckEmailAddressIsValid(emailAddress.trim())) {
$('.lblErrorMessage').text("Please provide a valid email address.");
$('.lblErrorMessage').css('color', 'red');
$('.lblErrorMessage').css('font-size', 'small');
$('.lblErrorMessage').css('font-weight', 'bold');
$('#'+txtEmail).css('background-color', '#FF9999');
$('#'+txtEmail).focus();
return false;
   }
  $('#'+txtEmail).css('background-color', '#FFFFFF');
   }
}

Here is the output of validation applied for email address on the Nintex Form

We can do any custom validation using this approach like numeric only, date validations or any other kind of validation.

Happy coding!

Sunday, June 21, 2015

How to populate select options or dropdown in a Nintex Form 2010 using JQuery

Lot of times in Nintex SP projects there is requirement to populate select options from a non SharePoint data source. Nintex/SharePoint provide this functionality OOTB if the type of field in the list is a lookup field looking up data from another list. However, if the data source is external then it requires a bit of client side code to populate the select options. For example if a form requires Suburbs to be populated in a select option. Here is the sample code to make this working assuming that the suburb data is coming in JSON format from any data source. It can be a REST service.

There are couple of steps required to make this working.

1. In the Nintex Form designer for the given list add a choice form control on the form. In the control settings of the choice control select "Display Format" as "Drop down list". Set "Store Client ID in Javascript variable" to "Yes" and give name e.g. ddlSuburb as shown in below screenshot. This variable will hold the reference to the rendered control on the Nintex Form.

2. Include JQuery and custom script file in the Nintex Form by going to the Form settings -> Advanced -> Custom Javascript Includes section and include following files in the form, or set the actual location of the script files.

/SiteAssets/jquery-1.8.3.min.js
/SiteAssets/Form.js

Custom JQuery Code
Form.js

$(document).ready(function () {
try
{

var data = '[{"ID": "1","Name": "Test Suburb 1"},{"ID": "2","Name": "Test Suburb 2"},{"ID": "3","Name": "Test Suburb 3"},{"ID":"4","Name": "Test Suburb 4"},{"ID": "5","Name": "Test Suburb 5"}]';

var jsonData = JSON.parse(data);
var option = '<option value="">Select Suburb</option>';
$.each(jsonData, function (k, val){
option += '<option value="' + jsonData[k].ID + '">' + jsonData[k].Name + '</option>';
});

  $('#'+ddlSuburb).find('option').remove().end().append(option);
  $('#'+ddlSuburb).change(function() { 
  $('#' + txtSuburb).val($('#'+ddlSuburb + ' :selected').text());
  //alert("You selected: " + $('#' + txtSuburb).val());
 });
}
catch(err)
{
if (window.console) console.log(err);
}
finally
{
//do something
}
});

Output
Custom Jquery code result
In this scenario the suburb data is coming from external datasource in JSON format and is getting populated in a select option in a Nintex Form. When end user selects any option then it is populated in the hidden Textbox under the Dropdown control in the form. This selected value is then saved in the list upon submit.

To select the selected option when the Nintex Form is opened in the Edit mode a CalculateValue type control can be used to get the state of the form i.e. if it is edit mode, new mode or view mode and then option can be selected by writing couple of lines as follows
if($('#' + txtSuburb).val() !== "")
{
    $('#' + ddlSuburb + ' option').each(function() {
    this.selected = $(this).text() == $('#' + txtSuburb).val();
   });
}

In extension to this code we can set cascading select options using JQuery with Nintex to make forms more usable for end users.

Happy coding!

Monday, June 15, 2015

How to integrate Nintex Form with JSON REST service using Jquery

Problem/Requirement: In one of my SharePoint project there was requirement to integrate with ATO (ABN Service) web services to validate ABN number provided by the user to be correct and in active state. User should not be able to provide inactive or expired ABN. The validation required to be done client side, before the Nintex form is submitted and sent for approval. Once the form is submitted, a workflow kicks in and the item goes for approval.

Solution: As a solution to this requirement I developed a JSON REST service which acts as a wrapper between external ATO web service and internal SharePoint Nintex Form. This REST service queries the ATO service, get the response, parses the response into an object and then return the object in JSON format to the caller, which in this case is a Nintex Form. User gets instant validation result in an interactive manner that the whether the number provided is valid or not. The benefits of using this approach are light weight data calls, quick real-time validation and ease of parsing results in JQuery.

Steps:
1. Create a WCF JSON REST service for fetching or validating the data input more detail to create such service is here.
2. Create SharePoint custom list.
3. Access the list in SharePoint and open Nintex Form designer from the ribbon control
4. Add two label controls on the form. Set the "CSS class" value to 'lblMessage' and 'lblInstruction' respectively. These will display message to the user.
5. Include following scripts in the custom JavaScript includes in the form settings. Better to keep these files in Site Assets library to refer them easily on the forms.
      jquery-1.11.1.min.js
      FormScript.js
6. Add a button on the form and set the following properties of the control in Nintex Form.

JSON

{
    "ABN": "12345678910",
    "EffectiveFrom": "27/04/1900",
    "EffectiveTo": "1/01/0001",
    "IsValid": true,
    "Status": "Active",
}

FormScript.js

var ABNValidationServiceURL = "http://xxx-xxx-xxx/ABNValidate.svc";
var abn = $('#' + txtABNNumber).val();


function ValidateABN(){

//support cross domain ajax calls
jQuery.support.cors = true;

//URL of the JSON REST service
var url = ABNValidationServiceURL + "/IsValid/" + abn;


//query ATO service for ABN

$.getJSON(url, function (atoData, status) {
  if(status == "success"){
     if(atoData["Status"] != "null" &&  atoData["Status"] == "Active"){
$('.lblMessage').show().fadeOut(4000, "linear");;
$('.lblInstruction').css('color','green');
$('.lblInstruction').css('font-size', 'small');
$('.lblInstruction').text("Please continue filling the address and bank details.").fadeOut(4000, "linear");
}
else
{
   $('.lblMessage').show(); 
$('#' + txtABNNumber).css('border','1px solid red');
$('.lblMessage').css('color','red');
$('.lblMessage').text("Please provide a valid ABN number").fadeOut(4000, "linear");
}
}
});
}
OUTPUT:

This approach has couple of benefits:

1. Data is light weight so quite fast processing.
2. Adds more usability to the form since validation is quick and done client side.
3. Straight forward access of JSON data in JQuery and cleaner JS code.

This is just an example but there can be various other ways in which JQuery can be leveraged in conjunction with Nintex Forms to make the forms more interactive, user friendly and flexible. Hope this helps.

Cheers
Happy coding!