Displaying server side validation errors

272 views Asked by At

For one of my models, I have a simple ondelete event handler:

  function validateStateDeletion(record){
    if (record.Name===STATE_SUBMITTED || record.Name===STATE_CLOSED){
      throw 'Cannot delete internal states '+STATE_SUBMITTED+' and '+STATE_CLOSED;
  }

This does indeed work and prevents records meeting the condition from being deleted. I see the error is propagated back to the client (it is displayed in the dev console as an exception). However, capturing the exception to display something to the user, using window.onerror as part of the app initialization script, does not seem to have any effect (This may not be the correct Window object as window.onerror is undefined in the dev console, it may be some sandbox iframe where client side scripts are executed) .

  window.onerror=function(message, url, line, column, error){
    window.toastr.error("Error:" +(message||error));
    return false;
  };

Question: Any insight on global exception handling in AppMaker, or an alternative way to display server side validation errors?

1

There are 1 answers

0
Pavel Shkleinik On BEST ANSWER

>> global exception handling in AppMaker

afaik there is no such mechanism right now

>> or an alternative way to display server side validation errors?

Here we have at least 3 cases

1 Calling the server-side function

 google.script.run
       .withSuccessHandler(function(result) {   
         // TODO
       })
       .withFailureHandler(function(e) {
          // TODO
        })
       .MyServerSideFunction();

2 Triggering any data-related action(createItem, saveChanges, deleteItem, load, reload... etc)

widget.datasource.createItem({
  success: function (somethingThatDependsOnActionType) {
    // TODO
  },
  failure: function (e) {
    // TODO
  }
});

3 Making a change to an item for a datasource in auto save mode

app.datasources.Employees.item.Name = 'Bob';

Afaik there is no good way to handle error in this case. Hope it will be fixed soon. For the time being as workaround you can switch datasource to manual save mode and pass success+failure handler to the saveChanges callback