Highlights
Developer
- Unit testing support
- JavaScript Function parameter and JSDoc support
- Configurable JavaScript formatting
- Integration with SQL Explorer Eclipse plugin
- JavaScript Profiler
- Eclipse update to 3.5/Galileo
- Tomcat update to version 6.0.20
- Sybase update to version 11 (this drops all servoy support for Mac PPC)
Solution development
- Data Drag and Drop
- Client Design mode
- Full support for linked relations in scripting and UI design
- Improved form inheritance support
- Web Client anchoring support
- Key events
- Foundset Multiselect support
- ValueList fallback support
- Extended i18n support
Deployment:
- Application clustering using Terracotta
- Maintenance mode with pre- and post import hooks
- Mark Database Servers as a clone of ...., to have Servoy automatically update mulitple clones of the same database model on import
Detailed overview:
Developer:
- JSUnit support (automated testing of JavaScript functions). See JSUnit node in the Solution Explorer
- Possible to specify the function parameters in function declaration:
function x(text) {application.output(text)} - Possible to place comments outside the function declaration in the comments above (see JSDoc toolkit for the standard way of documenting JS code)
- Possible to assign values to the parameters of a function when the function is assigned to an event/command in the Properties pane in Developer.
- Methods attached to events and commands now automatically get a JSEvent as one of the arguments, where applicable.
- Events and Methods show their default arguments in Properties pane in Developer.
- Configurable JavaScript formatting (can be shared between developers using a profile format, so all developers in a team use the same formatting conventions)
- Integration with Eclipse SQL Explorer (http://eclipsesql.sourceforge.net), have to be installed separately via Eclipse update mechanism like doing for SVN. Eclipse SQL Explorer sees the database connections defined in Servoy automatically (see: data tab in Table editor and the Context menu of Database Servers or Tables)
- Basic JavaScript profiler view supporting a call stack and aggregate view
- Upgrade to Eclipse 3.5 (Galileo release):
- Upgrade to be compatible with 3rd-party Eclipse plug-ins that do not support Eclipse 3.3
- Improved Compare editor
- Improved search result feedback
- Performance improvements
- Many other additions and improvements to the Eclipse platform
- Possible to upgrade Servoy Developer through Eclipse update mechanism
- Component templates:
- Allows for storing all form property settings in a template: See context menu of a form. If elements are selected on the form while saving the template, the elements are also part of the template.
- When creating a new form, it is possible to select one of the previously saved templates. All form properties and possible elements with their properties will be copied onto the newly created form.
- Templates that contain elements can also be used to copy the group of elements to an existing form (in this case, form properties contained in the template are not taken into account).
- A list of saved Templates can be found under Resources in the Solution Explorer.
- Templates are part of the Resources project; can be saved in a Team Provider; and shared among developers.
- Note: Templates are 'templates', meaning that altering a previously saved template doesn't alter all the locations where the template was previously used to create a form and move elements on an existing form.
- Import .servoy file in Servoy Developer, directly into workspace
- i18n key/message synchronization via team support: i18n is file based in Servoy Developer, to allow making i18n keys part of the solution data and bring it under versioning using Team Support
- Ability to externalize hard coded strings to i18n keys (currently only on form/element level) - accessible through context menu of i18n node in solution Explorer
- Improved debug scripting console (called Interactive console), including code completion
- regex node under JSLib
- Option when placing fields to place them as labels, so you can more easily create a Tableview of just labels (to create a Tableview form in which the record is double clickable)
- Option to turn on JavaScript Strict mode in Developer. With that option, you will get some more warnings reported. For example:
function x(a,a) {...}will raise a warning about the duplicate arguments
function x(a) {var a = 10}will raise a warning about hiding an argument
if (x = 10)will raise a warning about doing an assignment ("if ((x = 10))" will not!)
var a = 10; var a = 11
will raise warning about redeclaration of variable
function x() { if (true) { return 1} else {}}will raise warning about inconsistent returns
function x() {var x; x; x = 10}will raise warning about useless expression
- Warnings in Developer for elements outside form boundaries: Elements (partly) located outside the bounderies of a form (outside the defined height and width of a form) will generate warning markers, because elements placed this way will result in scrollbars in the Webclient, while the Smart Client won't
- more solution integrity checks, to produce warning if possible problems are detected
- make i18n editor a non-modal editor
Servoy general:
- Data Drag & Drop and Client Design mode:
- onDrag, onDragOver and onDrop event on forms
- Client Design mode (resize and relocate elements on a form in the client by user drag/drop/select actions, see controller.get/setDesignMode())
- Updated servoy_sample_solutionModel solution to display Client Design
- Full support for linked relations in scripting and UI design:
- Support in UI to place dataproviders multiple (linked) relations deep
- Support for placing a tab on a tabPanel over multiple (linked) relations
- Support to sort over multiple (linked) relations
- Improved inheritance support
- Forms can be created without having a table assigned
- Ability to create forms without form parts (so you can define all form parts in the child form)
- Key events: Added 'window' plugin to register methods to be fired based on the key combination pressed (SC and WC). See plugins.window.create/removeShortcut()
- JSEvent object: used by events, commands, the window plugin and drag & drop events to provide access to the information for an event. The JSEvent replaced application.getLastKeyModifiers, application.getMethodTriggerelementName and application.getMethodTriggerfromName
- data: allows you to add custom data to the event, useful for drag & drop events
- getElementName(): gets the name of the element that triggered the event
- getFormName(): gets the name of the form that triggered the event
- getModifiers(): gets the modifiers that were applied to the event trigger
- getSource(): gets the object reference to the element that triggered the event (same as: forms.xxxx.elements.yyyy)
- getTimeStamp(): gets the timestamp when the event trigger occured
- getType(): gets the type of event (see: constants under JSEvent)
- getX(): returns the x coordinate of the cursor at the moment of the event trigger
- getY(): returns the y coordinate of the cursor at the moment of the event trigger
- Foundset multiselect support (JSFoundSet.multiSelect, JSFoundSet.getSelectedIndexes(), JSFoundSet.getSelectedRecords(), JSFoundSet.setSelectedIndexes())
- Extended i18n support:
- Support added in i18n area for country and variant: en_US vs. en_EN etc.
- Support for any combination of Language and Country in the i18n area
- Added JScolumn.getTitle()
- .newRecord(index): creates a new record at a certain index
- get/removeFoundSetFilterParams
- valuelist fallback support, to lookup/display values which are no longer selectable for enduser
- Added group/ungroup support to group elements together: The group can be named, so it can be scripted.
- Resizing a group will resize the elements in the group
- group can ve saved as a template
- Advanced operators for relation definition:
- Case insensitive equal: #=
- Case insensitive not equal: #!=
- Case insensitive like: #like
- Case insensitive not like: #not like
- Null or equal: ^||=
- Null or greater than: ^||>
- Null or smaller than: ^||<
- Null or greater or equal to: ^||>=
- Null or smaller or equal to: ^||<=
- Null or not equal to: ^||!=
- Null or like: ^||like
- Null or not like: ^||not like
- Null or case insensitive equal: ^||#=
- Null or case insensitive not like: ^||#!=
- Added optional logging level parameter to application.output(). See Application - Constants - LOGGINGLEVEL
- Added onRightClick event on fields
- Added onFocusGained/Lost events on forms: to get notified of form elements getting or losing focus
- Added onDataBroadcast event on solution: to get notified of incoming dataBroadCasts
- Added controller.getFormContext(): function to get the parent form stack of a visible form
- Added application.isInDeveloper(): returns true if running Developer. application.getApplicationType() will return the same values per client in application server and developer
- Added option to name locks and consecutively release only the locks with the specified name, instead of releaseAllLocks (see optional parameters on databaseManager.acquireLock and databaseManager.releaseAllLocks)
- Servoy locks can also be turned into real database lock (select-for-update statement) (Admin page option)
- Added afterRecordInsert/afterRecordUpdate/afterRecordDelete events on table level, to complement the existing onRecordXxxx events that fire before the action
- Added support for onAction on label linked to field using labelFor to render the Column header: overrides onSort in TableView, allowing method triggering in findMode
- Added JScolumn.getForeignType()
- Added JScolumn.getScale(): returns the precision of a numeric column (Note: JScolumn.getLength() now returns the length of a numeric column properly)
- Added controller.recreateUI(): brings a loaded form in sync with it's solutionModel blueprint
- Added foundset.loadRecords(pk): to load a single record by its primary key value (only single column PKs are supported)
- Added application.showCalendar(Date): to show the calendar with the specified date already selected (since 4.1.3)
- Added JSRecord node under the Database Manager, with functions .getPKs() and .isEditing()
- Added number of bytes to read from a file using plugins.file.readFile('somefile', noOfBytes): to read the bom for a file with a bom (since 4.1.3)
- Added UUID node under application with functions .toBytes() and .toString()
- Change: Web Client JavaScript will run in interpreted mode, instead of compiled mode, allowing the use on continuations (since 4.1.3)
- Added a REST webservice plugin, which makes it possible to expose (form) methods as REST API handlers:
- The REST API is accessible through the url: http://domain:port/servoy-service/rest_ws/solutionName/formName
- The form needs to have the following methods:
- GET: ws_read()
- POST: ws_create()
- DELETE: ws_delete()
- PUT: ws_update()
- A sample solution is included in the Servoy distribution (servoy_sample_rest_ws.servoy), detailing how to retrieve data from the http request and to return a response.
- Improved of GlobalMethod column converter:the attached method will receive more information through arguments
- Added types for Servoy objects to the scripting environment for testing the type of objects using the operators instanceof and typeof
- Forms references stored in a globals variable or in an (associative) array in a globals variable will prevent the form form being removed from memory
- JSDataSet can be used now as a multi-dimensional array. Use ds[Tano:0][Tano:1] to get the second value from the first row. This works if you don't set/keep the rowIndex on -1 of the dataset
- Added solutionModel.cloneComponent()
- Added solutionModel.cloneForm()
- Improved tabSequence support in Tableview
- Added JSForm.getParts()
- Added JSPart.getPartYOffset()
- Added element.getFormLocationY()
- Added support for use of globals variables inside custom valuelists (like: i18n:i.contact|globals.CONTACT_TYPE_CONTACT)
- Added support for background-images in style sheets: background-image: url(media:///header-bg.png);
- Added support to create style sheets at runtime through the SolutionModel
- Added support in the Method Editor for multi-line variables
- Added Smart Client combobox dropdown width calculation based on dropdown content
- Support added for sorting on aggregates
- Added support for searching on aggregates
- Added support for valuelists based on globals methods
- Added solutionModel.newMedia support
- Exceptions thrown in TableEvents will cause the save to fail. The exception will be set on the failed record, retrievable through databaseManager.getFailedRecords()
- Added JSColumn.isUUID()
Deployment:
- Terracotta integration for clustering Servoy application servers
- Multiple database model updates during import by marking Database Server as a clone of .., to support switchServer better in a saas environment
- Have solution import report what it did to change on datamodel(s)
- Ability to disable batch processors (all or individual) on the Admin page, so they do not start automatically on server (re)start
- Application Server maintenance mode: Scripting support before and after import solution at the server. When the imported solution contains modules starting with 'before_import' and/or 'after_import, those are started before/after the actual import (during these runs the maintenance plugin is available to alter datamodel)
- Added option to limit the upload size of files through media fields in the Web client (Admin page option)
Servoy Web Client:
- Web Client anchoring support (Can be globally disabled through Servoy Admin page option)
- Support added for selectOnEnter property of field
Plugin API:
- Massive update on public API (vastly more things exposed http://www.servoy.com/docs/public-api/)
- 3rd-party Servoy aware beans can use Servoy property editors: If your bean info class calls pd.setValue("servoy_property_editor", "dataProvider") and the property type is String, Servoy Developer will use the dataprovider Property editor we use for our elements.
- Client plugin IScriptObjects without non-deprecated js_xxxx methods do not show under plugins in the Solution Explorer