Extending the language / User-defined front calls |
Custom front call modules for the GWC-JS front-end are implemented by using JavaScriptâ„¢.
In order to extend the GWC-JS with your own front calls, you must be familiar with JavaScript programming concepts.
With GWC-JS, front-end calls are JavaScript functions executed locally on the workstation where the browser is running.
In order to integrate your custom front calls in the GWC-JS front end, you need to setup the GWC-JS customization environment.
For more details, see GWS-JS customization chapter in the GAS documentation.
One JavaScript module will define a front call module implementing several front call fonctions.
The .js file must be copied into the project-dir/customization directory.
A custom front call JavaScript module must have the following structure:
"use strict"; modulum('FrontCallService.modules.module-name', ['FrontCallService'], /** * @param {gbc} context * @param {classes} cls */ function(context, cls) { context.FrontCallService.modules.module-name = { function-name: function (param1, ...) { ... user code ... { return [ values ... ] | this.setReturnValues([ values ... ]); } }, [...] /* More functions can be defined for this module */ }; } );
Where:
The following JavaScript functions are provided to implement your custom front-calls:
Method | Description |
---|---|
this.parametersError( [ message ] ) |
This function can be invoked when an invalid number of parameters is passed to the front call, in order to raise on exception in the BDL program. The message parameter holds the error message to be returned to the Genero program in the second part of the error -6333 message (see front call error handling in ui.Interface.frontCall). |
this.runtimeError( [ message ] ) |
This function can be used to raise an exception in the BDL program, when the front call needs to warn the program that an error occured. The message parameter holds the error message to be returned to the Genero program in the second part of the error -6333 message (see front call error handling in ui.Interface.frontCall). |
this.setReturnValues( values ) |
This function sets the values to be returned to the BDL program in the case of an asynchroneous front call. See Asynchroneous custom front calls for more details |
Synchroneous front calls can directly return the front call values with a classic JavaScript return instruction, by specifying a JavaScript array.
return ["Hello " + name + " !"];
return ["first", "second", "third"];
JavaScript custom front calls sometimes require asynchroneous programming. In such case, the custom front call API provides the setReturnValues() function to register values that must be returned to the BDL program.
For example, to return value after a delay of 5 seconds:
window.setTimeout(function () { this.setReturnValues(["After 5s, Hello " + name + " !"]); }.bind(this), 5000);
The next JavaScript code example implements a synchroneous and an asynchroneous custom front call function:
"use strict"; modulum('FrontCallService.modules.mymodule', ['FrontCallService'], /** * @param {gbc} context * @param {classes} cls */ function(context, cls) { context.FrontCallService.modules.mymodule = { add_hello_sync: function (name) { if (name === undefined) { this.parametersError(); return; } if (name.length === 0) { this.runtimeError("name shouldn't be empty"); return; } return ["Hello, " + name + " !"]; }, add_hello_async: function (name) { if (name === undefined) { this.parametersError(); return; } if (name.length === 0) { this.runtimeError("name shouldn't be empty"); return; } window.setTimeout(function () { this.setReturnValues(["After 5s, Hello, " + name + " !"]); }.bind(this), 5000); } }; } );
DEFINE res INTEGER CALL ui.Interface.frontcall("mymodule","add_hello_sync", ["world"] , [res]) CALL ui.Interface.frontcall("mymodule","add_hello_async", ["world"] , [res])