Saving a record without populating all mandatory variables

Jim Coyne
Kilo Patron

We have a few mandatory workflow variables setup. The variables are mandatory to ensure the techs populate them before closing a task as the information is required in subsequent tasks. Unfortunately, we have been running into problems with the Catalog Task form.

The problem with mandatory variables is you cannot enter information in some of the fields and/or variables and save the record - the blank mandatory variables prevent the update of the record. This is a valid use case as you do not always get all the required information at the same time and it would be nice to update the task as you receive that information. Same thing if a tech wanted to enter some info in the work notes or comments field - cannot save unless the mandatory fields are filled in.

This has been bugging me for a while but I think I've come up with a pretty good solution. I've created 2 new UI Actions on the Catalog Task form to override the global OOB Save and Update actions.   Here is how the Save version is configured:

Name:                       Save

Table:                     Catalog Task [sc_task]

Action name:         sysverb_update_and_stay   (to override the OOB "Save" UI Action)

Client:                   checked

Form button:         checked

Onclick:                 u_saveRecordClient()

Condition:             current.canWrite()

Script:

//Client-side 'onclick' function
function u_saveRecordClient(){
    //ignore mandatory fields
    var state = g_form.getValue('state');

    //we can save without filling in all mandatory fields and variables if the task is not closed or closing
    if (g_form.getValue('state') != 3){
          g_form.checkMandatory = false;       //ignore mandatory fields
          try {
                //now ignore any mandatory variables
                var allVariables = document.getElementById('variable_map').getElementsByTagName('item');
                for(var i = 0; i < allVariables.length; i++){
                      var item = allVariables[i];
                      g_form.setMandatory('variables.' + item.getAttribute('qname').toString(),false);
                }
          } catch(err) {}
    }
 
    //Call the UI Action and skip the 'onclick' function
    //this will execute the code below
    gsftSubmit(null, g_form.getFormElement(), 'sysverb_update_and_stay'); //MUST call the 'Action name' set in this UI Action
}

//Code that runs on the server, without 'onclick'
//Ensure call to server-side function with no browser errors
if(typeof window == 'undefined')
    u_saveRecordServer();

function u_saveRecordServer() {
    action.setRedirectURL(current);     //come back to the same record
    current.update();
}

The Update version would be slightly different:

Name:                       Update

Table:                     Catalog Task [sc_task]

Action name:         sysverb_update   (to override the OOB "Update" UI Action)

Client:                   checked

Form button:         checked

Onclick:                 u_updateRecordClient()

Condition:             current.canWrite()

Script:

//Client-side 'onclick' function

function u_updateRecordClient(){

    //ignore mandatory fields

    var state = g_form.getValue('state');

    //we can update without filling in all mandatory fields and variables if the task is not closed or closing

    if (g_form.getValue('state') != 3){

          g_form.checkMandatory = false;       //ignore mandatory fields

          try {

                //now ignore any mandatory variables

                var allVariables = document.getElementById('variable_map').getElementsByTagName('item');

                for(var i = 0; i < allVariables.length; i++){

                      var item = allVariables<i>;

                      g_form.setMandatory('variables.' + item.getAttribute('qname').toString(),false);

                }

          } catch(err) {}

    }

 

    //Call the UI Action and skip the 'onclick' function

    //this will execute the code below

    gsftSubmit(null, g_form.getFormElement(), 'sysverb_update'); //MUST call the 'Action name' set in this UI Action

}

//Code that runs on the server, without 'onclick'

//Ensure call to server-side function with no browser errors

if(typeof window == 'undefined')

    u_updateRecordServer();

function u_updateRecordServer() {

    current.update();

}

The script sets "g_form.checkMandatory = false" in order to bypass the mandatory fields, but, unfortunately, it does not work with variables. So, I figured why not run through all the variables and remove their mandatory properties?

I'd like to get a few comments to see what people think.   It seems to work fine so far.   Now the real solution of course would be to have the "g_form.checkMandatory" property take variables into account as well.     🙂

To use them elsewhere, just change the Table field.

UPDATES:

- modified the code above to add a "try {} catch(err) {}" block to avoid problems when there are no variables on the form (thanks shill)

- added a missing "{" at the end of line 7 (thanks chucksimonds)

- added the separate settings for the Update UI Action

1 ACCEPTED SOLUTION

Jim Coyne
Kilo Patron

Just setting this answer as correct as the actual thread was not meant as a question and it cannot be changed because it came from the original Community site.


View solution in original post

30 REPLIES 30

jkc
Giga Expert

Does anyone know how to do this from a Service Portal widget?
I would like to save a record as draft, meaning no checking for mandatory fields. 

Can you call the onClick function of a UI action from the widget?

Shane J
Tera Guru

So in order to get this to work in Madrid, I had to uncheck the 'Isolate script' checkbox for the UI Action.

 

I tried doing something similar in an OnLoad Catalog Script just using this part but it doesn't seem to do anything:

 

if (g_form.getValue('state') != 3){
           g_form.checkMandatory = false;       //ignore mandatory fields
           try {
                 //now ignore any mandatory variables
                 var allVariables = document.getElementById('variable_map').getElementsByTagName('item');
                 for(var i = 0; i < allVariables.length; i++){
                       var item = allVariables[i];
                       g_form.setMandatory('variables.' + item.getAttribute('qname').toString(),false);
                 }
           } catch(err) {}
     }

ABouland
Kilo Guru

Wow, sure wish I would have found this article a long time ago, this is magnificent.  Thanks so much Jim for posting.

 

Shane, thanks for the tip re: Isolate Script setting.

Nazhath Mariam
Mega Expert

Hi

I am trying to ignore the mandatory variables. but that part of code is not working for me

 

try {
                //now ignore any mandatory variables
                var allVariables = document.getElementById('variable_map').getElementsByTagName('item');
                for(var i = 0; i < allVariables.length; i++){
                      var item = allVariables[i];
                      g_form.setMandatory('variables.' + item.getAttribute('qname').toString(),false);
                }
          } catch(err) {}

It still shows the alert

g_form.checkMandatory = false; - this is working fine.


its all wrapped inside a client unction

Any help would be appreciated!

santoshkomerave
Tera Contributor

Thanks @Jim Coyne: This is working great. Only issue i have is state is changing from:

  • Open to Work in Progress
  • Pending to Work in Progress
  • Work In Progress to Pending

Is there any possibility that we restrict to change the states and preserve the state value as before?. OOTB Save and Update is not doing this. Could you please help on this?

Thanks,

Santosh