Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Section
Column

Customizing can be done in several different ways. It is important to consider all the alternatives available when deciding on a method to accomplish form customization. Choosing an approach that is part of the product like Business Rules is a better choice since released versions undergo rigorous quality assurance testing. Custom behavior can be added to forms using JavaScriptscustom JavaScript, which will accomplish the task but are not subjected to formal testing. These customizations should only be used under special situations and if there is no other way to customize the form to the requirements.

Here  are some real world situations where a custom JavaScript can be used in a form. The Custom Java code custom JavaScript can be added to the form using the Message Control or , the custom.js file in a Theme or the include.js file in the frevvo.war. Refer to Customizing Behavior for more information.

Image Removed

Column
width240px

On This Page:

Table of Contents
maxLevel1

...

Code Block
   var CustomEventHandlers = {
       setup: function (el) {
           if (CustomView.hasClass(el, 'SSN')) {
               FEvent.observe(el, 'keydown', this.formatSSN.bindAsObserver(this, el));
               FEvent.observe(el, 'keyup', this.formatSSN.bindAsObserver(this, el));
           }
       },
       formatSSN: function (event, element) {
           if (event.keyCode != 46 && event.keyCode != 8) {
               fldVal = $(element).value;
               var nom = fldVal.charAt(fldVal.length - 1);
               if (isNaN(nom) && nom != "-") {
                   $(element).value = fldVal.substring(0, fldVal.length - 1);
               } else {
                   if ((fldVal.length == 3) || (fldVal.length == 6)) {
                       $(element).value = fldVal + "-";
                   }
                   if (fldVal.length >= 11) {
                       $(element).value = fldVal.substring(0, fldVal.length - 1);
                   }
               }
           }
       }
   }   

 

Correct the case of any text

...

Code Block
var CustomEventHandlers = {
   setup: function (el) {
       if (CustomView.hasClass(el, 'limit3')) {
           FEvent.observe(el, 'click', this.checkboxlimit.bindAsObserver(this, el));
       }
   },
   checkboxlimit: function (evt, el) {
       var checkgroup = el.childrenWithClassName('input');
       var limit = 3;
       for (var i = 0; i < checkgroup.length; i++) {
           checkgroup[i].onclick = function () {
               var checkedcount = 0
               for (var i = 0; i < checkgroup.length; i++)
               checkedcount += (checkgroup[i].checked) ? 1 : 0
               if (checkedcount > limit) {
                   this.checked = false
                   for (var i = 0; i < checkgroup.length; i++)
                   (checkgroup[i].checked) ? checkgroup[i].disabled = false : checkgroup[i].disabled = true;
               } else {
                   for (var i = 0; i < checkgroup.length; i++)
                   checkgroup[i].disabled = false;
               }
           }
       }
   }
}

...

Scroll to Top

A Tab control with many fields in each tab, may require a long scroll to switch from one tab to another. You can use a trigger control at the bottom of the first tab with a business rule to navigate the user to the second tab when the trigger is clicked. For example, when you click on the Next Tab trigger control on the Personal Information tab in the Application for Employment form shown a business rule will navigate the user to the Employment History tab. 

...

Code Block
var CustomEventHandlers = {
   uploadEl: null,
   setup: function (el) {
       if (CustomView.hasClass(el, 'onlyPDF')) {
           this.uploadEl = el;
       }
       window.setTimeout('CustomEventHandlers.checkFile()', 3000); // set the initial timer
   },
   checkFile: function () {
       for (var i = 0; i < this.uploadEl.parentNode.childrenWithClassName('f-file-upload-file-name').length; i++) {
           if (!(/^.*\.(pdf|PDF)$/.test(this.uploadEl.parentNode.childrenWithClassName('f-file-upload-file-name')[i].getAttribute('title')))) {
               alert("Invalid file '" + this.uploadEl.parentNode.childrenWithClassName('f-file-upload-file-name')[i].getAttribute('title') + "' will be removed.");
               this.uploadEl.parentNode.childrenWithClassName('f-upload-file-list-delete')[i].click();
           }
       }
       window.setTimeout('CustomEventHandlers.checkFile()', 3000);
   }
}

...

Automatically submit a form

...

Tip

 Users expect the submit and cancel buttons to be located at the bottom of a form. Moving the location of the Submit control is not recommended.

 

Continue/Finish button on top of the flow

It is useful to have the Continue/Finish buttons at the top and bottom of lengthy forms in a  workflow. The JavaScript below will display a Continue/Finish button on the top of your flow. Add a trigger control at the top of your form and set the CSS Class property to extra-submit.  Now this trigger control will act as a Continue/Finish button also. 

...

Submit on Enter Key Press

This JavaScript example will submit the form when the user presses the Enter key.

Code Block
if (document.layers) {
   setup: function (el) {
       if (CustomView.hasClass(el, 'extra-submit'))document.captureEvents(Event.KEYPRESS);
}

document.onkeypress = function (evt) {
   var keyCode = evt ?    FEvent.observe(el, 'click', this.autoSubmit.bindAsObserver(this, el))evt.which : event.keyCode;
   if (keyCode == 13) }{
   },    autoSubmit: function (evt, el)SubmitView.doSubmit("Submit");
   } else { 
      FlowView.getFlowButton().onclick()return true;
   }
}

 

Prevent Session Timeout

Sometimes you may need the session timeout for a particular form to be a lot longer than the default session timeout that makes sense for your entire tenant. Imagine your tenant session timeout in  is set to 30 minutes. One of your forms takes a long time to fill out. You want to allow idle periods greater than 30 minutes for that form only.

Image Removed

...

;

Continue/Finish button on top of the flow

It is useful to have the Continue/Finish buttons at the top and bottom of lengthy forms in a  workflow. The JavaScript below will display a Continue/Finish button on the top of your flow. Add a trigger control at the top of your form and set the CSS Class property to extra-submit.  Now this trigger control will act as a Continue/Finish button also. 

Code Block
var sessionIntervalCustomEventHandlers = 1000{
* 60 * 10; // milliseconds to minutes
var sessionRefreshURL = "/frevvo/web/login";

refreshFrevvoSession = function (setup: function (el) {
       if (CustomView.hasClass(el, 'extra-submit')) {
    // make the request    var xmlhttp;
   if (window.XMLHttpRequest) xmlhttp = new XMLHttpRequest(); // IE7+, Firefox, Chrome, Opera, Safari
   else xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); // code for IE6, IE5
   xmlhttp.open("GET", sessionRefreshURL + "?sessionRefresh=" + new Date().getTime(), true);
   xmlhttp.send();

   // set the timer to run again
   setTimeout(refreshFrevvoSession, sessionInterval);
}
setTimeout(refreshFrevvoSession, sessionInterval); // set the initial timer

Auto Control Validation

 has built-in validation that will instantaneously display an error message, a red asterisk and control background color when invalid values are entered. For Example, the Quantity control allows only whole numbers. An error message and a red asterisk will display and the background color of the control will change to red if a number with a decimal point is entered. The forms designer can restrict users from entering a value with a decimal point using JavaScript. The script below will automatically remove a decimal point from the field and the error message will not display. Similar logic can be used to implement instant validation on other control types as well.

Code Block
var CustomEventHandlers = {
        setup: function (elFEvent.observe(el, 'click', this.autoSubmit.bindAsObserver(this, el));
       }
   },
   autoSubmit: function (evt, el) {
       FlowView.getFlowButton().onclick();
   }
}

Prevent Session Timeout

Sometimes you may need the session timeout for a particular form to be a lot longer than the default session timeout that makes sense for your entire tenant. Imagine your tenant session timeout in  is set to 30 minutes. One of your forms takes a long time to fill out. You want to allow idle periods greater than 30 minutes for that form only.

Image Added

This JavaScript will change the session timeout for this form to 10 hours. Change the variable sessionInterval in the script to the desired time period, for example, a 4 hour session timeout would be:  var sessionInterval = 1000 * 60 * 4; 

Code Block
var sessionInterval = 1000 * 60 * 10; // milliseconds to minutes
var sessionRefreshURL = "/frevvo/web/login";

refreshFrevvoSession = function () {

   // make the request
   var xmlhttp;
   if (window.XMLHttpRequest) xmlhttp = new XMLHttpRequest(); // IE7+, Firefox, Chrome, Opera, Safari
   else xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); // code for IE6, IE5
   xmlhttp.open("GET", sessionRefreshURL + "?sessionRefresh=" + new Date().getTime(), true);
   xmlhttp.send();

   // set the timer to run again
   setTimeout(refreshFrevvoSession, sessionInterval);
}
setTimeout(refreshFrevvoSession, sessionInterval); // set the initial timer

Auto Control Validation

 has built-in validation that will instantaneously display an error message, a red asterisk and control background color when invalid values are entered. For Example, the Quantity control allows only whole numbers. An error message and a red asterisk will display and the background color of the control will change to red if a number with a decimal point is entered. The forms designer can restrict users from entering a value with a decimal point using JavaScript. The script below will automatically remove a decimal point from the field and the error message will not display. Similar logic can be used to implement instant validation on other control types as well.

Code Block
var CustomEventHandlers = {
        setup: function (el) {
            if (CustomView.hasClass(el, 'onlyDigits')) {
                FEvent.observe(el, 'keydown', this.allowOnlyDigits.bindAsObserver(this, el));
                FEvent.observe(el, 'keyup', this.allowOnlyDigits.bindAsObserver(this, el));
            }
        },
        allowOnlyDigits: function (event, element) {
            fldVal = $(element).value;
            for (var i = 0; i < fldVal.length; i++) {
                var nom = fldVal.charAt(i);
                if (isNaN(nom)) {
                    $(element).value = fldVal.substring(0, i) + fldVal.substring(i + 1, fldVal.length);
                }
            }
        }
    }
 

Add onlyDigits in the CSS Class property of the Quantity control. 

Detect Browser Information

You can use JavaScript to detect information about the browser you are using. For Example: Wet signatures are not supported in older versions of some browsers. You might want to hide a section in your form that has a wet signature if the browser does not support it. To get details about the browser where your form is loaded, add a text control to your form with its CSS Class property set to detectbrowser and use the following custom JavaScript:

Code Block
var CustomEventHandlers = {
  setup: function (el) {
	 if (CustomView.hasClass(el, 'detectbrowser')) {
	    el.value = navigator.userAgent
            UberController.valueChangeObserver({target:document.getElementsByName('Browser')[0]}, document.getElementsByName('Browser')[0].parentNode); 
	 }
  }
} 
Note

Replace the name Browser in the above JavaScript with the name of the text field you are using.

Use the browser information populated in your text control to decide if the section of your form that contains the wet signature should be displayed or not.

Image Added

Save Screen Flow to Task List

If two sequential workflow steps are assigned to the same person, this creates a screen flow. Screen flows immediately navigate a user to the next screen (activity/step) in the flow when they click the continue button. Sometimes you don't want a user to automatically navigate to the next screen, for example the next activity/step might be something you want the user to perform days after the first step rather then immediately. 

This custom JavaScript will save the flow to the user's task list instead of displaying that next step to the user immediately. The user can then go back to their task list at a future time to resume their task. This JavaScript is effectively clicking the Save button when flow moves to second step. This will create a task in that users task list and then navigate that user to his home page.

Code Block
saveTask = function () {
    if(document.getElementsByName('temp')[0].value == 0) {
       document.getElementsByName('temp')[0].value = "saved";
               
UberController.valueChangeObserver({target:document.getElementsByName('temp')[0]},
    document.getElementsByName('temp')[0].parentNode.parentNode); 
    FlowView.getSaveButton().click();
    alert ("Task added to task list");
    window.open("https://<your frevvo server host:port>/frevvo/web/tn/<your tenant>/user/"
    + document.getElementsByName('username')[0].value + "/app", "_top");
    }
}
setTimeout(saveTask, 500); // set the initial timer

In order to use this solution you will also need to:

  1. Add a text control named 'temp' to your form and uncheck the visible property to make it hidden.
  2. Add a text control named 'username' to your form and uncheck the visible property to make it hidden.
  3. Add the following business rule to your form.
Code Block
if(form.load) { username.value = _data.getParameter('subject.id');}

Phone Dash

This custom JavaScript automatically inserts dashes as the user enters a phone number into a Phone control. Characters other than the dash entered into the control are deleted. Add PhoneInsert to the CSS Class property of the Phone control to enable this JavaScript. 

Code Block
languagejavascript
var CustomEventHandlers = {
    setup: function(el) {
        if (CustomView.hasClass(el, 'PhoneInsert')) {
            FEvent.observe(el, 'keydown', this.formatPHONE.bindAsObserver(this, el));
            FEvent.observe(el, 'keyup', this.formatPHONE.bindAsObserver(this, el));
        }
    },
    formatPHONE: function(event, element) {
        if (event.keyCode != 46 && event.keyCode != 8) {
            iffldVal = $(CustomView.hasClass(el, 'onlyDigits')) {
  element).value;
            var nom = fldVal.charAt(fldVal.length - 1);
            if FEvent.observe(el, 'keydown', this.allowOnlyDigits.bindAsObserver(this, el));(isNaN(nom) && nom != "-") {
                FEvent.observe(el, 'keyup', this.allowOnlyDigits.bindAsObserver(this, el))$(element).value = fldVal.substring(0, fldVal.length - 1);
            } else {
      },         allowOnlyDigits: functionif (event, element) {
   (fldVal.length == 3) || (fldVal.length == 7)) {
        fldVal = $(element).value;             for (var i = 0; i < fldVal.length; i++) {$(element).value = fldVal + "-";
                var}
nom = fldVal.charAt(i);              if (fldVal.length  if (isNaN(nom))> 12) {
                    $(element).value = fldVal.substring(0, i) + fldVal.substring(ilength +- 1, fldVal.length);
                }
            }
        }
    }
 

Add onlyDigits in the CSS Class property of the Quantity control. 

...

}