Pre-Release Notes for Alpha Anywhere (Alpha Five Version 12)

IMPORTANT: The pre-release builds are only available to customers with a valid Alpha Anywhere subscription. If your subscription has expired you will not be able to use the pre-release build.

If your subscription is valid and you download and use the pre-release build please keep in mind that if you do not renew your subscription after it expires your eligibility to use pre-release builds will end.

 

 

 

 

 


 

Build 5862 5309 22-MAY-2019 - 7:45 AM

 

The Features and Bugs Listed Below are for the current pre-release build. These features/fixes will be included in the next official Version 12 Update. These notes are for users who are testing the pre-release update.
 

This is not an official patch, so you should not deploy this update to a production environment.

 

This pre-release build is our internal, nightly build and it is made available to you for the sole purpose of testing the new features that have been added and the bug fixes that have been made since the last official release. We are making this pre-release available to you so that you can provide us with feedback on whether the changes we are making are working correctly and have not introduced new issues.

 

If you encounter any type of bug while using this pre-release build, please send information about the bug (including full instructions on how to duplicate the issue, and a test case that we can run on our own machines) to a5v12bugs@alphasoftware.com.

 

Please do NOT post bug reports concerning the pre-release build on the message board. Alpha Software engineers do NOT routinely monitor the message board and there is a good chance that your posting will be overlooked. Also, since your posting will be referencing unreleased code, it will only serve to confuse other users.

 

This pre-release build is not intended to be used in a production environment.

 

You can download the pre-release update using these links:

https://aapatches.s3.amazonaws.com/build5862/a5v12_build5862_full_patch.exe

https://aapatches.s3.amazonaws.com/build5862/a5v12_build5862_full_DL.exe

https://aapatches.s3.amazonaws.com/build5862/a5v12_build5862_AppServer.exe

https://aapatches.s3.amazonaws.com/build5862/a5v12_build5862_AppServer_patch.exe

https://aapatches.s3.amazonaws.com/build5862/a5v12_build5862_RTPLUS_patch.exe

 

https://aapatches.s3.amazonaws.com/build5862/a5v12_build5862_ApplicationServerIIS.exe

https://aapatches.s3.amazonaws.com/build5862/a5v12_build5862_ApplicationServerIIS_Patch.exe

 

 

https://msgboard.alphasoftware.com/alphaforum/showthread.php?112148-New-OpenSSL-and-SSLv3-Vulnerabilities

 

 

 

Videos

UX Component - List Control Alternating Row Colors In this video we show how you can configure a List control to show alternating colors for even and odd rows.

Watch Video

Date added: 2019-03-24
UX Component - List Control Map Layout A List control can have multiple Layouts. The most common Layouts are columnar and freeform. But a List can also have a Kanban layout and a Map layout.

The Map layout displays a Map control in the List and shows markers on the map for each row of data in the List.

In this video we show how the Map layout is configured.

Watch Video

Download files

Date added: 2019-03-24
Security Framework - Two-factor Authentication  Demonstration  Two-factor authentication is a more secure than single-factor authentication because even if a user's password is stolen, the user account is still protected because the person who stole the password will likely not be able to get the authentication code to complete the login to the application.

In this video we demonstrate a login component that utilizes two-factor authentication.

Watch Video
 
 Date added: 2019-04-10
Security Framework - Two-factor Authentication Configuring the Extended User Information Table Before you configure a web project to use two-factor authentication, you first have to create an Extended User Information table for your web project.

This video shows how to create an Extended User Information table.

Watch Video
 
 Date added: 2019-04-10
Security Framework - Two-factor Authentication Configuring a Web Project to use Two-factor Authentication In order to use two-factor authentication in a web project you  must configure settings in the application Project Settings.

In this video we show how two-factor authentication settings are defined.

Watch Video
 
 Date added: 2019-04-10
Security Framework - Two-factor Authentication Setting User-preferences for Two-Factor Authentication Two-factor authentication is a preference setting for each user in your application. Some users may elect to turn two-factor authentication on, while others may prefer single factor authentication. If a user turns two-factor authentication on, they must specify which option they wish to use - SMS, Email or Goggle Authenticator.

A sample UX component is provided to allow users to set their two-factor authentication preferences. In this video we show how to use this sample UX component.

Watch Video
 
 Date added: 2019-04-10
UX Component - Ajax Callbacks Chunked Responses - Sending Intermediate Responses to the Client Normally, when you make an Ajax callback from an UX component, the Xbasic function that handles the callback completes its processing and then returns Javascript to the client. In some uses cases where your Xbasic function takes a "long" time to execute, you might want to send some type of intermediate message to the client telling them that the function is still processing and perhaps letting the user know what stage the function is at.

In order to send back intermediate responses to the client while the Xbasic function is still processing, you can set the Ajax callback to allow chunked responses.

In this video we show how you can configure an Xbasic function to do chunked responses.

Watch Video

Download files

Date added: 2019-05-02
Git Repositories Working with Git Repositories The Web Control Panel is tightly integrated with Git and GitHub. You can make any Web project into a Git repository and you can connect this repository to a remote GitHub repo. You can perform many of the basic Git commands (such a committing files, pushing to a GitHub repository and pulling from a GitHub repository directly from menus on the Web Control Panel.

In this video we show how to make a Web Project into a Git repository, how to connect this repository with a remote GitHub repository, how to push files to the remote Git repository and how to create a new Web project that is cloned from a remote GitHub repository.


Watch Video - part 1
Watch Video - part 2
Watch Video - part 3

Date added: 2019-05-15

 

 

 

Changes

Grid Components - Time Fields - Default Display Format - When you add a Time field (this is actually a Date/time field), the default server side Display Format is now set to time("{grid.clientSideDateFormat} 0h:0m 0s am",<value>). Previously it was set to time("{grid.clientSideDateFormat}",<value>), which meant that the time portion of the date/time value was stripped off.

Features

Grid Component - Client-side Events - onAjaxCallbackFailed - a new client-side event has been added. The onAjaxCallbackFailed will fire if the server does not send a response back to the client within the the default timeout period that the client waits for a response.

UX Component - List Control - Synchronization - Write Conflicts - Improvements in the way in which write conflicts are determined have been made.

Consider the following scenario:

 

Previously, the user would have received a write conflict error because the original value for the City field (i.e. 'Boston') no longer matches the current value in the City field (i.e. 'London').

However, now, this scenario will no longer trigger a write conflict error because the user is trying to change the value in the City field to a value that is currently in the City field (i.e. 'London').

Had the user tried to change the City field to (say) Madrid, then they would get a write conflict error.

 

 

Build 5858

 

Xbasic Functions - excel_to_sqlite() - Creates a SQLite database file from data in an Excel file.

Syntax:

excel_to_sqlite(c excelfilename, c sqlitefilename)

Where:

excelfilename - filename of the Excel file

sqlitefilename - filename of the SQLite database to create

Each sheet in the Excel file becomes a table in the SQLite database. The sheetname is the table name. If the first column in each sheet is numeric data and there are no duplicate values in the column data, that column is the primary key of the table in the SQlite database.

 

Build 5850

Alpha Cloud - Publishing - Only Publish Changed Files - The Alpha Cloud publish dialog now has a new option to only publish files that were changed since the last time a full publish was done.

 

 

Web Projects Control Panel- Git Integration - Git and GitHub support is now integrated into the Web Control Panel. When the Web Control Panel is displayed you will notice a Git icon at the extreme right of the toolbar in the Control Panel.

IMPORTANT: You must install Git on your machine to use this feature. Git is a free install. You can find the installer at: https://git-scm.com/downloads. When you install Git be sure to select the option that adds Git to your path:

 

Watch Video - part 1
Watch Video - part 2
Watch Video - part 3

 

You can make an existing project into a Git repository by clicking the Git icon.

This will display the Git Menu dialog as shown in the image below.

You can make the current project into a Git Repository by clicking on the Yes - Make a Git Repository button, or you can clone an existing GitHub repository.

 

 

 

Warning: If you convert a large Web project into a Git repository, (and you check the Add all files checkbox prompt shown in the image above) Git may take a significant amount of time to add all of the files to the Repository.

 

Once you have made your Web project into a Git repository the Web Control Panel will show a Git toolbar under the main toolbar shown in the Window.

The Git toolbar shows you the number of Untracked and Modified files in your project.

 

 

 

 

 

To commit any modified files, or to add untracked files to your repository, click the Git button on the toolbar, or click directly on the Untracked files or Modified files message on the Git toolbar.

 

 

When you click the Git button you will see the Git Commit window where you can select which files you want to commit and which currently untracked files you wish to start tracking. You must enter a commit message before you can click the Commit button.

Once you have committed files, the modified files and untracked files count in the Git toolbar will update.

 

 

 

 

Connecting your Git repository to a remote GitHub repository

You can connect your local Git repository to a remote GitHub repository. Once you have done this you will be able to push and pull to and from the GitHub repository using the Push to GitHub and Pull from GitHub hyperlinks on the Git toolbar.

 

In order to connect your repository to a remote Git repository, click the Git Settings hyperlink in the Git toolbar.

First, select the Save User ID and password for GitHub to enter your credentials for your GitHub account.

Next, select the Register/change remote GitHub repository command. This will open a dialog (shown below) where you can enter the URL for your remote GitHub repository.

 

 

 

 

 

Editing the .gitignore file

Your web project may have certain files that you do not wish to be part of your Git repository. The list of files and file types that you want to ignore is defined in the .gitignore file. You can edit the .gitignore file by selecting the Edit the .gitignore file from the Git Settings menu.

 

Creating New Projects

When you create a new Web Project (by clicking the New Project button in the Web Control Panel), you can specify if the new project should be a Git repository. You can also create a new project from a remote GitHub repository.

 

 

 

 

 

Web Projects Control Panel - Command Window - You can now open a command window for the folder where the current Web Project is located. This is particularly useful if you want to execute a Git command from the command line.

To open a command window, click the icon shown with a yellow highlight in the image below.

 

 

Build 5848

UX Component - PhoneGap - Cordova-Sqlite-Evcore-Extbuild-Free Plugin - Added support for the latest version, 0.9.10 of the Cordova-Sqlite-Evcore-Extbuild-Free plugin which is required when building Android PhoneGap apps with cli-8.0.0. This plugin uses a special Android NDK sqlite database access library (C-language implementation), 
with some premium improvements to the internal JSON interface between the Javascript and native Android implementation, to provide significant performance and memory usage improvements on the Android platform.
 

Build 5844

UX Component - List Control - Column Layout - Persist and Restore Layout Definition - At run-time, a user can adjust the Layout of a columnar layout by hiding columns, adjusting the column order and by adjusting the width of each column. You can persist this state using the {dialog.object}.persistListColumnLayout() method.

You can restore a previously persisted List column layout using the {dialog.object}.restoreListColumnLayout() method.

The persisted column layout is store in the browser's localStorage using the List GUID and the Layout name as the key.

Each List has a unique GUID property.

When you use the {dialog.object}.restoreListColumnLayout() method, the method checks localStorage to see if there is a persisted Layout that matches the List's GUID property and the name of the Layout that is currently active. (List's can have multiple Layouts.). You can only restore the Column Layout of a columnar List Layout.

Example:

 

{dialog.object}.persistListColumnLayout('list1')  //persist layout of List1

 

{dialog.object}.restoreListColumnLayout('list1')  //restore layout of List1


 

SQLite Databases - Auto-increment Primary Key - When Alpha Anywhere creates a SQLite database with a table based on a SQL table where the primary key is an auto-increment field, the primary key in the SQLite database is now also an auto-increment field.

Build 5832

Xbasic - REST Service Definition - OPTIONS Pre-flight Request - The Xbasic REST API Builder now allows you to define an handler for the OPTIONS pre-flight request.

 

 

UX Component - List Control - Server-side Sorting - Column Title Sort Icons - When performing server-side sorting on a List control, the sort icons in the column headings are now set. Previously, these icons were only set for client-side sorting.

Build 5830

Xbasic - AlphaDAO - SAP HANA - A new syntax handler for SAP Hana is available. To use this syntax handler you must have v2.0 or greater of the SAP HANA ODBC driver installed. Create an ODBC connection string and select the SAPHANA syntax.

Build 5826

UX Component - PhoneGap Applications - WkWebView Plugin - A new PhoneGap plugin, developed by Alpha Software, is available for iOS applications. The UIWebView plugin, which PhoneGap applications currently use, has been deprecated by Apple, and will be removed from a future version of iOS. It will be critical that you switch your PhoneGap applications to use the WkWebView plugin before the next version of iOS is released.

Full details about this plugin are available here.

 

 

NOTE: As a result of the recent Apple update of iOS to version 12.2 the following actions no longer work in PhoneGap applications (that use the UIWebView plugin):

Camera access using the HTML5 option (PhoneGap camera access continues to work)

File Upload - Amazon S3 - This action no longer will bring up the image selector.

With the new WkWebView plugin, HTML5 camera access is working.

 

 

Build 5824

UX Component - Ajax Callbacks - Chunked Responses - You can now send back intermediate responses (i.e. "chunked" responses) from an Xbasic function that handles an Ajax callback. Previously the Xbasic function would need to run to completion before sending a response to the client (i.e. the browser).

To enable chunked responses, check the Allow chunked responses property in the Action Javascript builder.

Watch Video

 

IMPORTANT: In order to use chunked responses on IIS (or Alpha Cloud), you must turn on the JIT Sessions option. On Alpha Cloud this option is available on the Deployment dialog.

 

When you turn this property on, you can also set these properties:

 

 

The use case for this feature is when you have a callback function that is long running and you want to send periodic messages to the browser telling them that their request is still being processed.

In order to send an intermediate message to the client, your Xbasic function must use the

a5AjaxChunkedResponseWrite() method. For example:

 

dim js as c

js = "$('div').innerHTML = 'Still working...'

a5AjaxChunkedResponseWrite(js)

 

 

 

UX Component - List Control - Data Source - Excel File - CSV File - You can now set the data source of a List control to either an Excel file, or a CSV (comma separated values) file.

At run-time, the file is downloaded and the data are extracted from the file and then used to populate the list. When the List is refreshed, the remote file will be fetched again and the List will be repopulated.

In the image below, the List Data Source Type has been set to Excel file.

The builder exposes the following properties

 

 

 

Application Server - Classic Server - Security Settings Cache - The security settings are now automatically cleared on every publish of your application and are reloaded at the time of the first request. Previously, in the cases where the publishing method was non-optimized FTP, or LAN, the security settings were cached and only reloaded on a server restart.

 

Xbasic - AlphaDAO - SQL::Connection.ResultSetFromJSON() Method - A new method has been added to the SQL::Connection object. You can now convert a JSON array of objects into a SQL::Resultset object.

 

Example:


dim json as c = <<%json%
[
    {"ID":"1","Company":"Company A","Last_Name":"Bedecs","First_Name":"Anna"},
    {"ID":"2","Company":"Company B","Last_Name":"Solsona","First_Name":"Antonio"},
    {"ID":"3", "Company":"Company C", "Last_Name":"Axen","First_Name":"Thomas"}
    ]
 
%json%
 
dim rs as sql::ResultSet
dim cn as sql::connection
rs = cn.ResultSetFromJSON(json)
sql_resultset_preview(rs)
 

Build 5816

Xbasic - Number of sheets in an Excel file - a5_analyzeExcelFile() - The a5_analyzeExcelFile() function can be used to return the number of sheets in an Excel file

 

Example

dim fn as c = "filename of excel file";

?a5_analayzeExcelFile(fn).sheetnames
= people
companies
products
 

Build 5810

UX Component - List Control - Excel Import - Then action to import an Excel spreadsheet into a List that is based on a SQL database has been changed to use the libXL library (which is bundled with AA) rather than Microsoft ODBC drivers for reading the Excel file. As a result of this change Excel files that have columns with mixed data types (character and numbers) can now be imported.

 

Xbasic - excel_to_resultset() Function - Takes an Excel file and returns a SQL::Resultset object. You can optionally specify the name of a sheet in the file. If you do not specify a sheetname, the first sheet in the file is assumed.

 

Xbasic - excel_to_json() Function - Takes an Excel file and returns a string of JSON data.

Syntax

c result = excel_to_json(c filename [, c filter [, c order [,sheetname]]]])

where:

Build 5806

UX Component - Data Series - Date Values - By default, if you have a Data Series that is based on a SQL database, any date or time (date/time) values in the Data Series are rendered using the server's regional settings (i.e. MM/dd/yyyy for US or dd/MM/yyyy - international). However, in the case of the Chart control, it is necessary to provide data values in yyyy-MM-dd format. Therefore, the Data Series builder now allows you to define a date format.

Build 5796

UX Component - Array arguments - Session Variables - Arguments can be bound to session variables. Array arguments can also be bound to session variables and the session variable must be set to a comma delimited list of values in order for the array argument to be argument to be correctly populated. Now, the session variable whose value is a JSON array can also be used to populate an array argument.

UX Component - List Builder - SQL Statement - Portable SQL - Previously if you had turned off the Portable SQL property in the List Builder and you clicked on the smart field to edit an existing SQL statement, Alpha Anywhere would open the SQL Query Builder if it was able to parse the existing SQL statement. Now, if the Portable SQL property is off, when you click the smart field a simplified editor is opened (regardless of whether the SQL statement can be parsed).

 

 

Build5786

Security Framework - Two Factor Authentication - Token Expiration - If a user elects to receive their two-factor authentication via SMS or Email you can now set an expiration on the token. The default expiration is 2 hours (7200 seconds). If a user does not use the token they received to complete stage 2 of their login within the allowed time, the token will expire and the user will have to start their login flow from scratch. You can set the token lifetime in the Web Project Properties.

Build 5784

 UX and Grid Component - HTML Editor - Insert Image - When you insert an image into the HTML editor you can now specify the image height, width and padding. If you enter a number without units (e.g. 200) then pixels are assumed. You can use any CSS units (e.g. 20%, 2in, etc).

 

Build 5776

Security Framework - Two-factor Authentication - You can now use two-factor authentication for logging into to your applications. Two-factor authentication can be implemented as a user-preference (i.e. some users of your application may choose to enable it while others might want to continue using single-factor authentication). Users who elect to turn two-factor authentication on can then select the way in which they will get the authentication code. If you want to force all users of your application to use two-factor authentication you can write Xbasic code (discussed below) to automatically set the user preference.

Two-factor authentication provides a more secure way for users to log into an application. The log-in process is divided into two stages. In the first stage the user is prompted for their userid and password. If the userid and password are successfully validated, the log-in process advances to the second stage where the user is prompted to enter an authentication code.

If the user enters the correct authentication code they will then be logged into the application.

There are various ways in which the user can get an authentication code after their userid and password have been validated in the first stage. The options are:

How to Set up Two-Factor Authentication
Before you can turn on Two-Factor Authentication you must first define an Extended User Information table for your Web Project.

This table is used to store each user's preferences for Two-Factor Authentication. For example, if a user specifies that they want to use SMS to receive their authentication code, the user's mobile phone number will be stored in this table. If the user specifies that they want to use Email to receive their authentication code, the user's email address will be stored in this table.

Once you have defined the Extended User Information table for your Web Project you can set up your Two-factor Authentication properties.

 

 

Allowing Users to Set their Two-factor Authentication Preferences
Your Web Application will typically have a page where user's can go to define their two-factor authentication preferences. A sample UX component is provided for you to include in your Web Application. You can customize this sample component. To use this sample component, create a new UX Component and select the SecurityFramework-Two-FactorAuthenticationPreferences template. See Two-factor Authentication Preferences Component below for more information.

 

IMPORTANT You cannot use Two-factor Authentication with a Login Component. Two-factor Authentication can only be used with the integrated Login feature in the TabbedUI and UX Components.

 

 

Two-factor Authentication Preferences Component

A sample UX component is provided to allow you to let users of your application specify if they want to turn on two-factor authentication, and if so, what their preferred method is for getting the authentication code.

If you want to allow users of your application to choose whether or not to use two-factor authentication then you will want to include this sample component in your application.

 

When you create a new UX component, select the SecurityFramework-Two-FactorAuthenticationPreferences template.

 

Here is how the component will look for a user who has turned two-factor authentication on and who has selected the Google Authenticator app as their method for obtaining the authentication code.

 

 

If a user selects Google Authenticator as their method, the user can then click on the hyperlink shown in the above image to obtain a QR code that can be used to configure the Google Authenticator app on their mobile devices.

If the user selects SMS, the dialog will allow the user to enter their mobile device's phone number.

If the user select Email, the dialog will allow the user to enter the e-mail address where the authentication code should be sent.

 

How to Programmatically Set A User's Two-factor Authentication Preferences

Two Xbasic functions make it easy to get and set a user's two-factor authentication settings. These are:

a5_setTwoFactorAuthenticationSettings() and a5_getTwoFactorAuthenticationSettings()

 

Setting Two-factor Authentication Options

Syntax:

p result = a5_setTwoFactorAuthenticationSettings(c userid,c  json)

 

Where

result - an object with error and errorText (if error is .t.) as properties.

userid - the user's user id

json - JSON string defining the two-factor options. For example:
 

{
    "requireTwoFactorAuthentication": true,
    "method": "Google Authenticator",
    "mobilePhone": "",
    "email": ""
}

 

 

Getting Two-factor Authentication Options

Syntax:

c result = a5_getTwoFactorAuthenticationSettings(c userid)

 

Where

result - a JSON string showing user's settings. (Use json_parse() to convert the string to an Xbasic dot variable)

userid - the user's user id

 

An example of what the returned result might be:

{
    "requireTwoFactorAuthentication": true,
    "method": "Google Authenticator",
    "mobilePhone": "",
    "email": ""
}

 

How to Require All Users to Use Two-step Authentication

By default, the security framework uses single-step authentication. Once a user has entered a valid user id and password they are logged into the application.

If you want to force all users to use two-step authentication you must programmatically set their two-step authentication preferences. This must be done on a user by user basis since each user's settings are unique (unless the method is Google Authenticator). Settings are unique for each user because in the case of SMS, it is necessary to store the user's mobile phone number and in the case of Email, it is necessary to store the user's email.

Each user's initial log in to your application will be a single-step login. However, in the server-side onLogin event you can redirect the user to a page where you can prompt for their mobile phone number or email address and then you can store their preferences.

On subsequent logins the user will go through the two-factor login process.

 

Sample Login Components

When you create a new UX component there are three sample template components that you can use for user login. These are:

Each of these sample components has been updated to support two-factor authentication (if two-factor authentication is turned on for that user). If the user does not have two-factor authentication turned on, then these components will use a single step login process.

IMPORTANT When creating a Login component as a UX you should be sure to set the permission for the component and for the page that hosts the component as Always Allowed.

 

TabbedUI Component

The TabbedUI component allows you to integrate a login window as part of the component. The TabbedUI builder now has a section for customizing the UI that is shown when the prompt for the authorization code is shown.

 

 

Tabbed UI - Integrated Login - Horizontally Center Prompts - When you add an integrated login window to a Tabbed UI component you can now specify that the prompts for user name/password should be centered (horizontally).

 

 

Build 5771

Xbasic - a5wcb_googleAuthenticatorQRCode() Function - Displays a QR code to register a new application in the Google Authenticator mobile app.

The Google Authenticator App is used to display a time based token. In order to register a new application in the Google Authenticator app, a QR code is scanned. The a5wcb_googleAuthenticatorQRCode() function can be used to generate this QR Code.

Syntax:

C a5wcb_googleAuthenticatorQRCode(C issuer ,C userid ,C secret [,N width[,N height[,L returnB64image]])

 

Where

Xbasic - Email_send_web() Function - A new Xbasic function for sending email in a Web application is available.

The email_send_web() function will send an email using settings defined in the Web Project Properties. The email will be sent using an internal SMTP server, or using the Sparkpost REST service, depending on the preference defined in the Web Project properties.

Syntax:

 

P email_send_web(C from ,C from_alias ,C to ,C cc ,C bcc ,C subject ,C message [,C attachments])

 

 

 

UX Component - Switch Control - Switch Width - The previous Switch Width property has been renamed Control container Width and a new Switch Width property has been added. This gives you more control over the appearance of the Switch control.

 

 

IMPORTANT: This change is a breaking change. Your UX component switches will continue to render as they have in the past until the Switch control is edited. Once the switch control is edited, the overall size of the switch control will be based on the Control container width and Switch width property values.

 

PhoneGap Applications - Default Configuration - iOS Media Playback Requires User Action Property - The recent iOS 12.2 update changed the way media files are handled in the PhoneGap web view. In order for the UX Audio Player and Audio Player/Recorder controls to work with iOS 12.2, the iOS Media Playback Requires User Action property must be disabled in the PhoneGap configuration. This is now the default value for new PhoneGap projects.
 

To change this setting in existing projects, check the Show Advanced Options property in the PhoneGap App Builder Genie and uncheck the Media Playback Requires User Action option.

 

Application Server - Classic Server - TLS/SSL Settings - The TLS/SSL settings for the Classic Application Server and the Development Server now allow TLS 1.3 to be specified as the minimum protocol version. As this is currently the highest version of the protocol, it also means that this setting will force the server and all client to use TLS 1.3 exclusively.

It should be noted that not all clients support TLS 1.3 so this may prevent some users from accessing a server. Specifically, Microsoft Internet Explorer and Edge browsers do not have any support for TLS 1.3. More details on compatibility of browsers can be found at https://caniuse.com/#feat=tls1-3

 


 

 

UX Component - Container - Subtype 'None' - Content Alignment - Container controls (with a sub-type of 'None') allow the developer to set the content alignment to left, center, or right. If you select center or right, the way in which the content is aligned is now done using CSS Flexbox. If you find that this option causes an unexpected change in your component's layout you can revert to the old method by unchecking the Use CSS Flexbox property.

UX Component - Container - Subtype 'None' - Container Content Vertical Alignment - A new property is available to control the vertical alignment of a row of controls in a Container whose alignment property is Center or Left.

The Container content vertical alignment property can be set to Top, Center, or Bottom.

 

 

The images below show content in a Container for each of the three possible settings.

NOTE If the content alignment is Center or Right, all controls in the Container will display on a single line if possible. Break settings are ignored.

 

 

 

 

 

 

 

UX Component - List Controls - Window Resize - When the browser window is resized and is made smaller, the data in a List column row may wrap. Now, the List columns automatically resize (assuming their width is set to a flex value) and row data will not wrap.

UX Component - Client-side Events - onWindowResize - A new event is now available in client-side events. The onWindowResize event will fire when the browser window is resized.

Xbasic - Time Based Tokens - Time based tokens are typically used in features like two factor authentication. A time based token is a token that automatically expires after a short period of time. You can now generate and validate time based tokens in Xbasic using the nodeservices::timebasedtoken class.

 

Examples

'generate a time based token

'NOTE: in many cases the user will use an App like Google Authenticator

'to generate the token

dim tbt as nodeservices::timebasedtoken

dim secret as c = "abcdefghijklmnop" 'secret should be 16 characters if you plan to use Google Authenticator

dim token as c

token = tbt.Token(secret)

 

'validate a time based token

'NOTE: in many cases the user will use an App like Google Authenticator

'to generate the token

dim token as c

token = "123456"

dim flagValid as l

flagValid = tbt.CheckToken(secret,token)


 

 

 

Build 5761

Xbasic - Optimized Multiple File Download - A new Xbasic method is available to download multiple remote files very efficiently.

The extension::curl::DownloadMultiple() method takes a CRLF delimited string in the format:

local filename|remote file URL

 

Example:

 

dim filelist as c = <<%str%

localfilename1|remote url1

localfilename2|remote url2

%str%

result = extension::curl::DownloadMultiple(filelist)
 

Important: The remote URLs must be URL encoded. For example: https://www.myserver.com/my+image.jpg.

Build 5744

UX Component - List Control - Map Layout - List controls can have multiple layouts (e.g. columnar, free-form, kanban). Now, a List control can also have a Map layout.

The Map layout displays a Google Maps control in the body of the list and it displays markers on the map for each row of data in the List. Each row of data must have either latitude/longitude values, or an address.

Watch Video

 

UX Component - List Control - Alternating Row Colors - You can now configure a List to display alternating row colors for even and odd rows. Previously, this could only be done using code.

 

Watch Video
 

 

 

Build 5738

UX, Grid and TabbedUI Components - Language and Text Dictionary Tags - <Culture> - The component builders allow you to wrap strings in either <a5:r>...</a5:r> or <a5:t>..</a5:t> tags so that you can define strings in different languages. At runtime you can specify which language definition to use by setting the value in a special session variable (session.__protected__activeLanguage).

Now you can automatically select a language definition by setting the component's Active Language property to <culture>.

You must define language definitions to match the culture code. For example, a user whose machine is configured for UK English will have a culture code of en-GB. Therefore, you must define text dictionary and language dictionary settings for a Language called en-GB.

Build 5734

UX Component - Control Bar - Titles - It is common when designing a ControlBar to use the html item to place a title in the ControlBar. However, if the device width is insufficient to display all of the text, rather than wrapping the text you might prefer to truncate the text and display ellipsis to indicate that the text was truncated.

In the images below the Control Bar title is shown on a wide device and then a narrow device. On the narrow device the title text is clipped.

 

 

 

In order to implement title text as described above, the Control Bar now supports a new item type, htmlTitle.

 

 

Unlike a html item, the htmlTitle item can be the only item in a Control Bar Layout Line section. For example, in the image below, the Control Bar Layout line is shown for a Control Bar. Notice that the htmlTitle item in the Middle section is the only item in this section.

 

 

 

Build 5723

Reports - PDF - Remote Images - A common practice is to store images on a remote server (such as Amazon S3) and then include a reference to the image in a database table. When creating PDF reports from a table that has remote images, the report would take a long time to complete because the images were fetched from the remote location sequentially.

Now, a new optimization is used for creating these types of reports. All remote images referenced in the report are now pre-fetched (using a highly optimized parallel operation) and are stored in a temporary local folder. As a result, the report creation is now substantially faster.

IMPORTANT: In order for the optimization to work, the field must be marked as an Image Reference Field. This is done when defining the report data source. This is done by clicking the Advanced Options button in the Data Source builder.

 

 

Build5717

Grid and UX component - Date Format - Culture - You can now specify that the date format, day names and month names for a component should be automatically selected based on the 'Accept-language' property in the request header when the browser makes a request. This makes it easier to build applications that seamlessly adapt based on the user's locale setting.

To use culture settings, set the date format to

<cultureDateFormal>

or

<cultureDateFormat> <cultureTimeFormat> (if you want the default format to include a time portion)

 

Set the day names to <cultureDayNames> and set the month names to <cultureMonthNames>.

 

 

 

 

UX Component - List - Check-box Select Control - Customization - You can customize the appearance of the checkbox-select control by clicking the smart field for the Check-box select control customization property.

 

 

When you click the smart field, a builder is opened.

 

 

You can control whether the icons used are SVG or bitmaps (bitmaps would be preferable if you are using a legacy style such as GrBlue). You can choose custom icon.

If you use the default SVG icon you can set the size, fill and stroke color of the SVG icons

 

 

Check-box select control using bitmap icons

 

Check-box select control using SVG icons with customized stroke and fill colors.

 

You can also control whether an icon appears in the column header to allow the user to check or un-check all rows in the list at once.

Build 5709

Xbasic - AlphaDAO - If a SQL commands fails because the database is in a deadlocked state, Alpha Anywhere will automatically retry the command.

Build 5704

OpenSSL - New version of OpenSSL. Version 1.0.2r.

 

UX Component - List Control - Checkbox Selector - You can now add a checkbox select control to List to allow the user to select rows. This is particularly useful if your List has a Detail View because you cannot turn on the multi-select option which allows the user to select multiple rows.

 

 

The following Javascript method can be used with Lists that have a checkbox-select control

  • <listObject>.getCheckedRows() - returns an array of row number (zero based) of rows that were checked.
  • <listObject>.getCheckedValues() - returns an array of values for the rows that were checked.
  • <listObject>.setCheckedRows(array) - takes an array or zero based row numbers and checks the specified rows.
  • <listObject>.setCheckedValues(array) - takes an array of values and checks the rows with the specified values.  For example, if a List based on the Northwind Customers table is set to return the CustomerID, then you could use this method to check the rows for 'ALFKI' and 'BOLID'.
  • <listObject>.checkAllRows() - checks all of the rows in the List.
  • <listObject>.unCheckAllRows() - un-checks all rows in the List.

To turn on the checkbox select feature, check the Has check-box select control property.

 

 

Then, add the <CheckBoxSelect> control to your List.

 

 

 

ps

 

 

 

 

Build 5675

Xbasic Editors - Functions - A common error when editing Xbasic functions is to forget to return a value from the function. All functions (other than those of type v) should return a value.

There are two ways to return a value from a function

  1. Use the return statement
  2. Set the function name to the return variable.

Now, if you define a function (that is not of type v) and the function does not return a value, the Xbasic syntax checker will report an error.

 

 

TabbedUI - Login Feature - Chrome 72 and Above - In Chrome 72 and above Google made changes to the way password fields are handled. As a result of this change the first input control in a component shown in the TabbedUI was getting pre-filled with data. This issue is resolved in the build by wrapping the login controls in a dummy <form> element.

Build 5673

Xbasic Function Libraries - Compiled AEX files - You can now add a special directive into an Xbasic Function Library file that will cause the file to be compiled into an .aex file at publish time.

Add the

'compileaex

 

comment anywhere in the Xbasic Function Library file.

At publish time, any Xbasic Function Library file in the Web Project that contains this directive will be compiled into an .aex file. The .aex filename will be

__AAFunctionLibrary_<Xbasic function library name>.aex

 

NOTE: It is not necessary to add the name of the .aex file to the list of AEX files in Web Project Properties

 

At run-time, if a component specifies that a Xbasic Function Library should be loaded, the function library will only be loaded if an associated .aex file is not found.

The benefit of this is minimal for small function library files. However, very large Xbasic function library files can take a noticeable amount of time to load and compile. By eliminating this step and loading an .aex file instead you will get a small performance boost.

 

UX Component - Client-side Date Format - PhoneGap Applications - When you render a UX component in a Web Application, the client-side date format is set at runtime based on the setting stored in the component. This value can be overwritten, however, by setting a special session variable (__protected__clientSideDateFormat) so that a user in the UK (for example) can set a preference for their client side date format as dd/MM/yyyy while a user in the USA can set their preference to MM/dd/yyyy.

PhoneGap applications are different in that when the app is launched it is loaded directly from the device (i.e. the component is not served up by the AA server). As a result, it is not possible to change the client-side date format at run-time when the component is loaded (since the component is not loaded by making a call to the server). Therefore, in a PhoneGap application that is designed for use in both the US (when the date format is MM/dd/yyyy) and the rest of the world (where the date format is likely dd/MM/yyyy) it is necessary for the user to be able to set their date format preference at run-time after the app has been loaded. This preference can then be persisted to local storage so that there is no need to set it again.

The {dialog.object}.setClientSideDateFormat() method can be used to set the client-side date format for the component (used, for example when formatting date fields in a list control). This method, however, will not set the date format used by date pickers.

In order to set the date format for a date picker, you must get a pointer to the control and then call the .setFormat() method. For example, assume you have a control called 'DOB'. To set the date format for this control's date picker:

var obj = {dialog.object}.fieldHelpers('DOB');

obj.setFormat('dd/MM/yyyy');

 

Bugs

UX Component - File and Image Download Actions - The option to set the client-side filename for the downloaded file by calling a Javascript function was not implemented.

Component Builders - Property Grid - Fixed a number of issues with the Property Grid in the various component builders.

Xbasic - JSON_Generate() Function - The json_generate() function now encodes CRLFs as \r\n. Previously, these were encoded as \n.

Action Javascript - Email a Report - Fixed an issue when the method to send the report was 'Internal' (as opposed to Sparkpost or Mandrill).

Components - <ProjectStyle> - Fixed an issue where components were not getting the correct style sheet when the component style was set to <ProjectStyle>.

Desktop Applications - Network Optimize - Refreshing a shadow database would fail if the master database was on a mapped driive that pointed to a network share.

SQL Server Reporting Services - Fixed an issue when printing a SSRS report with many parameters.

Grid, UX, TabbedUI, PageLayout Components - Live Preview - <ProjectStyle> - When doing a Live Preview from a component builder, the style was not being published if it had been set to <ProjectStyle>.

UX Component - .UpdateTableRow() Method - Fixes an issue when using this method on a child List. The parent List was not getting marked as dirty.

Reports - International Characters - Improvements have been made in the way international characters in reports are rendered.

Web Applications - APIs - Fixed bug when publishing API - The host name in the <serviceName>.json file was getting hard coded to the Live Preview URL if you had done a live test of the API while developing the API subsequently to the last time you edited the API.

Grid Component - Advanced Search Control - Failed if the Grid was opened on an Ajax callback.

Grid Component - Arguments - Page Variables - The option to bind an argument to a Page Variable was missing.

Tips