https://support.servoy.com/browse/SVY-5984
https://support.servoy.com/browse/SVY-5876
https://support.servoy.com/browse/SVY-5772
https://support.servoy.com/browse/SVY-5964
https://support.servoy.com/browse/SVY-5876
https://support.servoy.com/browse/SVY-5967
https://support.servoy.com/browse/SVY-5984
https://support.servoy.com/browse/SVY-5166
https://support.servoy.com/browse/SVY-5683
https://support.servoy.com/browse/SVY-5250
https://support.servoy.com/browse/SVY-2834
forms
node of the Solution Explorer provides an entry to "Add working set". Through this option a 'folder' can be created, into which Forms can be dragged and dropped.SVY-5613 Support for debugging self-executing functions (IIFE) assigned to variables
Self-executing functions (or IIFE's) are functions that immediately execute themselves. This can be used to do initialization when a scope loads for example. Previously breakpoints inside such functions would never get hit.
var init = (function(){ //your code here }()) |
Note that the outer parenthesis are not needed, but are considered a proper code convention for IIFE's
SVY-5532, SVY-5523, SVY-5531, SVY-5527 Improved support for JavaScript prototype inside code
Servoy's Script Editor and Build system now have good support for JavaScript prototyping. This allows creating JavaScript objects using prototyping and having proper code completion and builder markers.
Assignment directly to the prototype
Assigning an object as prototype
Deprecated members
Protected members
@extends for public/protected members that are added through by the constructor
IIFE's for setting up the prototype
/** * @param {String} name * * @properties={typeid:24,uuid:"AACFB629-BDC1-4250-BCFA-E564C686153E"} */ function BaseEntity(name) { /** * Storing name as a protected instance variable * @protected */ this.name = name } /** * Self executing function (IIFE) to setup the prototype of BaseEntity when the scope in which the functions reside gets instantiated * * @private * @SuppressWarnings(unused) * @properties={typeid:35,uuid:"13635962-8720-4666-9955-6D8BEF94CE38",variableType:-4} */ var initBaseEntity = (function() { //Setting the prototype of BaseEntity to an object with a set of methods BaseEntity.prototype = { publicMethod: function() {}, /** * This is bananas * @protected */ protectedMethod: function() {}, /** * and this too * @deprecated */ deprecatedMethod: function() {} } //Extending the previously set prototype object with another method BaseEntity.prototype.getName = function() { return this.name } }()) /** * The extends tag signals the build system that public & protected members added through super constructor are known to code completion and the build system<br> * <br> * The constructor tag takes care of removing the inconsistent return value warning<br> * <br> * * @constructor * @extends {BaseEntity} * @param {String} name * @param {String} type * * @properties={typeid:24,uuid:"1D55BCFC-CEE2-4445-95E7-792152E36876"} */ function ExtendedEntity(name, type) { //Fail-save for when the ExtendedEntity gets called without the 'new' keyword if (! (this instanceof ExtendedEntity)) { return new ExtendedEntity(name, type) } //Calling the BaseEntity constructor, so that the logic defined in the constructor is invoked BaseEntity.call(this, name) /**@protected*/ this.type = type } /** * Self executing function (IIFE) to setup the prototype of ExtendedEntity when the scope in which the functions reside gets instantiated * * @private * @SuppressWarnings(unused) * @properties={typeid:35,uuid:"8F148031-763B-47B8-A69C-35458EDB6857",variableType:-4} */ var initExtendedEntity = (function() { /* Setting the prototype of ExtendedEntity to an object that has BaseEntity.prototype as prototype * BaseEntity.prototype is not used directly as prototype for ExtendedEntity, as this would mean that any additions made to * the prototype of ExtendedEntity would actually be made on the prototype of BaseEntity */ ExtendedEntity.prototype = Object.create(BaseEntity.prototype, {}) //Properly set the constructor ExtendedEntity.prototype.constructor = ExtendedEntity ExtendedEntity.prototype.getType = function() { return this.type } }()) /** * @properties={typeid:24,uuid:"586D324D-F1D9-474B-B4EE-E9238E73F80E"} */ function test() { var x = new ExtendedEntity('Servoy', 'company') application.output(x.getName()) //Yields 'Servoy' application.output(x.getType()) //Yields 'company' //These bits of code will result in warnings x.protectedMethod() x.deprecatedMethod() x.name x.type } |
SVY-5615 Improved build system to handle special JavaScript methods like function.call, function.apply, function.bind and Object.create
For .apply/call/bind, the build system will recognize that the .apply/call/bind method will return the same type as the function on which it is called, for example:
var x = Object.prototype.toString.call(object) //Build system will know that .call will return a String, as it is called on the .toString() method of Object, which returns a String value function test() { var y = Array.prototype.slice.call(arguments) //Build system will know that y is an Array, as .slice() of Array returns an Array } |
For Object.create(object, properties) the build system will know that what Object.create returns has the same type as the value of the object parameter, enhanced with the (optional) properties (See Object.create for more info)
SVY-5827 support function types with rest parameters in typedefs
/** * @typedef {{ * name: String, * handler: function(String, Number|*...) * }} */ var MyType |
SVY-5371 Support returning an instance of itself inside Constructor functions without warnings being generated
This allows building in a fail-save for Constructor function not being called with the new
keyword
/** * @public * @constructor */ function MyConstructor(name) { if (!(this instanceof MyConstructor)) { //constructor is not called with the 'new' keyword return new MyConstructor(name) } //rest of the constructor logic }; |
SVY-5618 In Servoy 7.4 the behavior of passing custom exceptions thrown from JavaScript into the Solutions onError handler has been changed due to a bugfix.
SVY-5538 Behavior Change in the Web Client due to aligning the behavior of controller.enabled with the Smart Client behavior
SVY-5213 Prior to Servoy 7.4 the method application.getValueListDisplayValue would not return a result for real values that are not in the first 500 entries in large ValueLists. As of Servoy 7.4 the display value is always returned, regardless on the size of the ValueList |
JSFoundSet.forEach(function)
foundset.loadRecords(sql)
databaseManager.getDataSetByQuery(sql)
databaseManager.addTableFilterParam(datasource, column, 'in', sql)
SVY-4685 Support for getting typed foundsets without having to resort to JSDoc typing
See datasources.db.udm.contacts.getFoundSet()
for example
SVY-5538 The behavior of controller.enabled in the Web Client has been brought inline with the behavior of the Smart Client. It now allows elements to be individually enabled even if the controller is disabled. |
servoy.webclient.hideloadingindicator
setting on the Servoy Admin page. Prior to Servoy 7.4 when enabling the servoy.webclient.blockinputonrequest
setting, the Loading indicator would be disabled automatically.- servoy.branding.loadingbackground
: Sets the background-color of the main Smart Client window when no form is showing. This is without other settings before and after a custom login form is shown or while the default login dialog is shown.- servoy.branding.hideframewhileloading
: hides the main Smart Client window while no form is showing. This is before and after a custom login form is shown or while the default login dialog is shown.SVY-5695: Since Servoy 6.1 the name of the Solution was automatically appended to the name of the shortcut created by Java Webstart when branding was enabled, to get the same behavior as when branding was not enabled and to be able to have multiple shortcuts be created for multiple solutions hosted on the same Servoy Application Server. However, this change did not take into account the fact that if only one solution was hosted, it might be preferred to not have the name of the Solution included, but only the value of the |
servoy.webclient.hideloadingindicator
setting to control the display of the Loading Indicator independant from the servoy.webclient.blockinputonrequest