Skip to main content
Version: v11.9.4

WaveMaker 8.3.0 - Release date: 13 September 2016

  • Here is a summary of key features, known issues and bug fixes offered in 8.3 Release

Highlights


Canvas Enhancements

  1. Widgets come with a drag-handle making it easier to move them around the canvas. This drag-handle is displayed when the widget is selected as a blue bar at the top. Note: You have to use the drag-handle to move the widgets, you can no longer select the entire widget.
  2. While dragging the widget and before the drop, the real estate needed for the widget is displayed.
  3. For the Grid Layout, Button Group, Nav and NavBar widgets the following behavior has been enhanced:
    • Use Left-Arrow or Right-Arrow keys (or icons on the drag handle) to select the adjacent widget. When there is no adjacent widget, then the left or right arrow keys selects the parent widget.
    • CTRL + Left-Arrow or CTRL + Up-Arrow (cmd button in the case of Mac) swaps the selected widget with the widget to the left and CTRL + Right-Arrow or CTRL + Down-Arrow (cmd button in the case of mac) swaps the selected widget with the widget to the right.

Data Table

  • The new Quick Edit layout has been introduced in this release, to enable quick editing of rows in a Data Table using keyboard events. For example use tab key to edit/save rows and add new rows; arrow keys to navigate between rows; the esc key to cancel the changes.
  • Searching & filtering data based on multiple columns can now be enabled in Data Table using the Filter Mode property. In this release in addition to search, Multi-column option enables filtering data based on selected columns.
  • Table Actions can be made accessible using Shortcut Keys. Each of these Table Actions can be assigned a key from the Shortcut Key property. These keys, when used in conjunction with the key code (Alt in Windows & Linux; Alt+Shift in Firefox; Control+Alt in Mac; etc.), will focus the Action. In case the action is associated with a Button widget, the shortcut key will trigger the action.
  • Up and down arrows can be used to traverse the rows of a Data Table.

#docs

List/Card Widgets

For List and Card widgets the following functionality has been added:

  • In the previous releases, List & Card widgets were used to display a list of items from the underlying data source. In this release, form widgets can be added to a List or Card, enabling you to design an editable List or Card. For example, building a To Do List with the capability to modify and save the pending tasks.
  • When a form widget is placed within list template, at design time to allow binding to the current item of the list, currentItem and currentItemWidgets options are introduced.
  • During app runtime when the end user selects a list item, selecteditem from the binding tree for List widget gives the item selected by the user. In addition to this, the selectedItemWidgets option has been introduced within List’s widget tree, which returns the available widgets within the List item selected by the user.
  • When using the Multiselect option of List, the selectedItemWidgets would return an array of items, thus enabling processing of the multiple items as a group.
  • When Group by is set for a List/Card widget:
    • Each List Group can be collapsed by setting the Collapsible property. Thus if you are displaying a list of employees grouped by Department, then a group header will be displayed for each Department. This header when clicked will display the employee list for that Department. By default, each group is expanded.
    • Count of list items within the group can be displayed on the group header by setting the Show count property. This displays the item count for each group in the header, without the need for writing additional code or query.
  • Up and Down arrows can be used to traverse the list items. Pressing enter key on any focused item will select the item.

#docs

Security

Apps built using WaveMaker can be configured to prevent XSS (Cross-site scripting) and CSRF (Cross-Site Request Forgery) attacks which are listed in the OWASP top 10 security vulnerabilities.

XSS flaws occur whenever an application takes untrusted data and sends it to a web browser without proper validation or escaping. WaveMaker supports three strategies to prevent XSS attacks – none with no prevention, encode wherein no script will be executed; white list filtering based upon policy files

Cross-Site Request Forgery (CSRF) is a type of attack that occurs when a malicious website, email, blog, instant message, or program causes a user’s web browser to perform an unwanted action on a trusted site for which the user is currently authenticated. In WaveMaker apps, CSRF token is auto-generated and can be applied to all API calls.

#docs

Database

Unique Constraint can be assigned to one or more columns in a database table to enforce uniqueness of a field in a database table. For example, email id in a customer database.

The unique column can be used in establishing one-to-one foreign key relationships.

#docs

Server side properties for CRUD operations, such as Last Modified By, Created By for database columns, can now be set to Logged-in User Id or Logged-in User Name. This will enable you to capture the user details from the logged in user’s context from the server itself.

#docs

Variables

  • Variable refactoring has been enhanced to update every widget, binding, expression and JavaScript occurrences, whenever the variable’s name is changed.
  • The setting of Order by fields for a Live Variables has been made easy with the new interface. Now you can select the fields to which you want the data to be ordered from a drop-down list. By default, the order is set to descending which can be changed by a simple click operation.
  • The first and last record of the result dataset returned by the Live Variable can be accessed using firstRecord and lastRecord option for binding.
  • In an effort towards uniformity and standardization the following methods for variables have been renamed:
note

The older method names are deprecated and hence current projects using the same will continue working as expected.

Variables

1. Live Variable

  • To update the Variable’s dataSet with new data by making a call to the Live DataBase Service.
Method Name
Old$scope.Variables.liveVariable1.update()
New$scope.Variables.liveVariable1.listRecords()
  • To make a call to the Live Service to insert a new record into the source table.
Method Name
Old$scope.Variables.liveVariable1.insertRecord()
New$scope.Variables.liveVariable1.createRecord()

2. Service variable

To update the Variable’s dataSet with new data by making a call to the target service

Method Name
Old$scope.Variables.serviceVariable1.update()
New$scope.Variables.serviceVariable1.invoke()

3. Timer Variable

To invoke the timer variable.

Method Name
Old$scope.Variables.timerVariable1.fire()
New$scope.Variables.timerVariable1.invoke()

4. Navigation Variable

To invoke the navigation variable.

Method Name
Old$scope.Variables.navigationVariable1.navigate()
New$scope.Variables.navigationVariable1.invoke()

5. Notification Variable

To invoke the notification variable.

Method Name
Old$scope.Variables.notificationVariable1.notify()
New$scope.Variables.notificationVariable1.invoke()

6. Login Variable

To invokes the login variable.

Method Name
Old$scope.Variables.loginVariable1.login()
New$scope.Variables.loginVariable1.invoke()

7. ogout Variable

To invokes the login variable.

Method Name
Old$scope.Variables.logoutVariable1.logout()
New$scope.Variables.logoutVariable1.invoke()

Enhancements


  1. Mobile App Developers can now build hybrid mobile apps, which can integrate directly with 3rd party APIs developed in any platform i.e..NET, PHP, Java etc. A native mobile installer can be created without the need to deploy a backend service component on the web server.
  2. Binding Dialog has been enhanced to:
    • show data type information for each node
    • show the source and target data type information
    • allow binding always and show a warning message in case of incompatibilities
  3. From the on Change event for Form widgets, you can access the changed value using newVal and old value using oldVal.
    Sample:
$scope.select1Change = function($event, $isolateScope, newVal, oldVal) { if (newVal === 'test1') { doSomething(); } };
$scope.select1Change = function($event, $isolateScope, newVal, oldVal) {
if (newVal === 'test1') {
doSomething();
}
};
note

oldVal and newVal can be an object depending upon the nature of the data source underlying the widget.

  1. For a Chart widget Title, sub-heading and icon can be set. #docs
  2. Grid Layout functionality has been enhanced to allow auto-width adjustment when adding new columns in a row. The sum of all the column widths in any row is maintained 12. #docs
  3. Live Form Actions can be bound to events of widgets outside the LiveForm. For example, Live Form actions like reset, save etc. can be triggered by an on-click event of a button. #docs
  4. Fields in a Form widget can be mapped to widgets just like in a Live Form.
  5. Project Changes Dialog allows you to resolve conflicts or pull changes at the time of project load for projects under VCS. It also helps you to update your application’s generated code in case of changes due to platform upgrades or database corruption.
  6. Events Data property of a Calendar Widget can be used to set the Title, Description, Start Date, End Date, Style Class of a Calendar event. You can also specify if an event is an allDay event or not.
  7. Mobile Apps security enabled: if the user exits the app without logging out, and re-launches the app, the user will be redirected to the appropriate Landing Page if the session is valid, else the user is redirected to Login page.

Known Issues


  1. This release has introduced some changes to the REST APIs in the application’s generated code. Due to this, when you open your existing projects, you might see Project Changes dialog prompting you to UPDATE your app’s generated code. You might also see an error message to this effect. Please follow the recommendations to update the app code. This will also fix the error messages. This is a one-time process.

  2. The class naming strategy for Database Tables and Columns containing the Java Keywords have changed.
    For example:

    • a TABLE with Name “CASE” (any Java keyword) used to create a model class called “_Case” prior to 8.3, but now it creates class named “Case”,
    • a TABLE named “PROCESS” (any Java class in the default package i.e java.lang) used to create a model class called “ProcessTable”, now it creates “ProcessEntity”.

Once you update the application’s generated code as per the recommendations, some bindings associated with such tables might cause issues. Please re-look at the associated bindings and correct them if needed.

Technology Stack


UI Framework

DescriptionJS LibraryVersion
JS Bindingjquery2.2.3
jquery-ui*1.11.4
MVC Frameworkangular1.5.5
angular-ui-bootstrap 1.3.2 -> 2.0.1
Editorace-editor1.2.2
Stylesbootstrap3.3.6
Chartingd33.5.17
nvd31.8.3
CORS support, prefabsxdomain0.7.5
Built-in functionslodash4.12.0
Device support, gestureshammerjs2.0.8

*Optimised jQuery-UI library excluding unwanted components like accordion, datepicker, dialog, progressbar, spinner, tabs, and all jQuery-UI Effects.

Back-end Frameworks

DescriptionJava LibraryVersion
Spring Framework4.2.o
Security frameworkSpring Security3.2.3
Java JSON utilitiesGson2.2.4
DB Persistence libraryHibernate4.3.11
Sample databaseHSQL2.3.3
JSON libraryJackson2.6.3
Logging frameworkSLF4j1.7.12
Http client libraryHttpComponents client-4.3.3 -> 4.5.2, core-4.3.2, mime-4.2.5 -> 4.5.2
REST API annotationsSwagger1.3.10
Logging frameworkLog4j1.2.17

Run Time Environment

DescriptionVersion
JDK7.0
Tomcat6.0