Lianja v1.3 Release Notes

Lianja is a community driven development project so if there is anything specifically that you would like to see supported in the product that you do not see on this list then please submit an enhancement request.

We value your feedback so if you find anything that does not behave as expected please submit a ticket so that we can get it fixed. If we don't know about them they won't get fixed!

If there is something on the roadmap that you would like to see pulled forward in time, these can be developed as sponsored features.

   download_win    download_mac    download_linux  

Development Milestones

Lianja App Builder 1.3 Release
Lianja SQL Server 1.3 Release
Lianja Cloud Server 1.3 Release

Development Roadmap Revision History

The development roadmap revision history can be found here.


Lianja App Builder 1.3 Release

  • Improved COM/ActiveX support for subobjects that were not being returned correctly with certain ActiveX components.
  • New STR_ESCAPE() function
    - escapes single quotes as '' to enable embedding within strings
    - disallows embedded SQL statements in strings to prevent SQL insertion attacks
  • New command; SET STRCOMPARE ON|OFF
    - auto trim of strings
    - case insensitive string comparisons
    - case insensitive index lookups
    - improves SQL query optimizations
  • ALTER VIRTUALTABLE enhancements
    - ALTER VIRTUALTABLE clauses now just update the clause in the Virtual Table definition. e.g.
    - ALTER VIRTUALTABLE vt_tablename CONNSTR "newconnectionstring"
    - ALTER VIRTUALTABLE vt_tablename ADDPROPERTY "name=value"
    - ALTER VIRTUALTABLE vt_tablename REMOVEPROPERTY "name"
    - ALTER VIRTUALTABLE vt_tablename MODIFYPROPERTY "name=value"
    - ALTER VIRTUALTABLE vt_tablename PROPERTIES "debug=1"
    - ALTER VIRTUALTABLE vt_tablename PROPERTIES "keepalive=1;ttl=30"
  • USE vt_name WHERE ... now uses SQL passthru
  • USE vt_name AS ... now uses SQL passthru
  • OData_Create(), OData_Read(), OData_Update(), OData_Delete() functions now handle Virtual Tables
  • Enhanced the "Navigation Panel" configuration files to handle collapsible sub panels and subtitle color specs
  • SAVE/RESTORE DATASESSION now handle saving and restoring the state of Virtual Tables as well as native tables
  • Added a new parameter to the TTOC() function; TTOC(datetime(), 4) to return the datetime in ISO 8601 format i.e. YYYY-MM-DDTHH:II:SS.000Z
  • Added "Click" and "DblClick" delegates to the "ImageStrip" section.
  • Enhanced Lianja.showDialog() and Lianja.showDialogPanel() to allow dynamic generation of the content by specifying a .rsp page, a .jssp page, a custom function or a .html/.php/.aspx page.
  • Added several new functions; appdir(), libdir() and datadir().
  • Added a new console command 'pwd' to print the current default directory.
  • Added new function userFullName( ) to return the full name of the logged in user. The other functions that can be used to obtain current user information are; userName(), userEmail(), useRoles(), userDomain(), userTenancy(). Each of these can optionally be given one parameter which is a username. This information is all setup in the "Users" workspace.
  • Fixed an issue where after logging out and then logging in as a different user, the App Builder was not showing the ModeBar on the left of the main window until an App was opened.
  • Added the ability for a grid section to have "Multi Select Rows". This displays a checkbox column for each row. As the user clicks a checkbox, the "selectionChanged" delegate is called with a comma separated list of values. These values are determined by the "Multi Select Row Expression" e.g. You can multi select rows in a grid and then call your own business procedure to handle app specific business logic.
  • Enabled the "Runtime Database" App setting in a runtime application. If this is specified in the App Settings then it will be used as the "Runtime database". This provides the ability to develop against a development database and deploy against a runtime database. See details below concerning database tenancies.
  • Enabled database tenancies based on the authenticated user. The "Database" used by an App for a user in a specified tenancy is postfixed with an "_" followed by the tenancy (domain) for the user specified in the "Users" workspace. For example, if the database for an App is southwind and the user has a tenacy (domain) specified of xyzco then the database used for that user will be southwind_xyzco. When the user authenticates in Desktop, Web or Mobile apps the specified database will be used rather than the default database for the App. Remember to "Deploy" the system!sysroles table and the database for that tenancy from the "Deploy" workspace. Note that if the tenancy name contains '.' or '@' characters these are replaced with '_' characters e.g. lianja.com using the southwind database would expect the database southwind_lianja_com to exist. You can "copy" a complete database to another using the COPY DATABASE command in the console or the "Copy" menu selection in the "Data" workspace.
  • New data bound "Org Chart" section type that displays an organization chart graphically. This "Org Chart" can be used to grahically represent a workflow as well as an "Organization hierachy". It is fully configurable with dynamic tile contents and colors. The content can contain hyperlinks to perform any operation on the LOM (Lianja Object Model) such as opening other apps, selecting different pages or searching and editing related information stored in other tables.
  • Fixed a random crash when an error occurred during .rsp dynamic page rendering.
  • Fixed a crash when creating and loading a table from an ADO format XML file.
  • Fixed an issue that was causing Unicode/utf-8 (chinese) characters not to update correctly in the Web/Tablet/Phone App Views. This was not an issue in desktop apps or deployed web/tablet/phone apps, just in the development "views".
  • Fixed an issue when using Python scripting when an incompatible version of Python was already installed prior to installing the App Builder. Lianja will now correctly use the embedded Python version and existing Python installations will not have any adverse effect on it.
  • Added two new "Advanced" canvas section controls; "LCD Number" and "Progress Bar". The "Progress Bar" has several attributes that can be set in delegates; "mimimum", "maximum" and "value". It can used to provide user feedback during long operations. The "LCD Number" displays an LCD style label with a segmented numeric value like an LED display.
  • Fixed a crash when loading a new App using Lianja.openApp() from inside a modal dialog button click event.
  • Added a new section type "Page Center" with a new attribute "Custom title". This provides the ability to have a custom Page Center page with other sections above or below it e.g. a custom section with a clock or user login information above it and a news ticker underneath it.
  • Added a new function inputEvents(). You can determine in a timer if there has been no keyboard or mouse/touch activity and logout or return to the App Center or Page Center (or whatever page you want). This can be used to handle App inactivity timeouts at runtime.
  • Added a new App delegate "Inactive" which is called in runtime mode if the "Inactive interval" has expired and no input events have occurred (key presses, mouse events or touch events). This provides the ability to auto-logout an inactive user.
  • Added a new "Advanced" canvas section control; "Slider". The "Slider" has several attributes; "Orientation", "Tick position", "Tick Interval", "Mimimum value", "Maximum value" and "value" which can be set/get in a delegate and optionally be data bound. The "Change" delegate is called as the user changes the slider interactively.
  • Added Lianja.beep() to sound a short "beep". This works in Desktop, Web and Mobile Apps.
  • Section footer menu buttons now autoresize their height into the footer height. They can also be styled with CSS. See this forum post for details.
  • Now works with the Microsoft VFP OleDB driver. See this forum post for details.
  • Added addStretch() as a method on containers. If the container has a layout i.e. "Horizontal" or "Vertical" then a spacer will be added to the container to fill up the remaining space.
  • Added "autocenter" as a core property. If this is set to 1 or .t. then the UI component is centered inside its parent container. This adjusts automatically as the window is resized.
  • Added a new attribute to the calendar section "Autosize" which will auto resize the calendar into the section viewport removing any requirement to scroll.
  • If a "where condition" on a grid or form section is specified and it contains {...} macros (for Virtual Tables) and the page containing the the grid/form section has "Refresh on activate" checked, then the SQL query will automatically be re-evaluated and the grid refreshed with the new query when the page is activated (selected).
  • The global CSS style for an App can now be specified in the App Settings.
  • Added a new attribute "Footer button width" to provide the ability to set the width of the section footer buttons.
  • If the section footer menu starts with a + then the buttons autosize horizontally into the footer menu (Tablet style buttons).
  • Added a new "Projects" workspace. You can now organize your Apps, Database and Library files into projects. After you open a project only the files contained within the project are displayed in the files tree of the Apps and Library workpaces. Additionally the "Home" workpace will only display Apps that are contained within the current project. When you want to deploy a project from the "Deploy" workspace then select it from the "Projects" branch in the deploy files tree and all files contained in the projects will be deployed.
  • The "Full page Edit" attribute on a page now causes all sections to be switched into "Add" mode when adding new records. 
  • When rows are retrieved for Virtual Tables the "maxrecords" VT property is now enforced. So, if you only want to fetch 1000 records set the property in the VT definition as maxrecords=1000 or modify it dynamically in the underyling CursorAdaptor in your delegates. 
  • Added some new attributes to formitems "sectionid" and "pageid" to simply traveral of the Lianja Object Model in custom delegate code.
  • Added a new attribute to sections "pageid" to simplify traversal of the Lianja Object Model in custom delegate code.
  • The mailOpen() function has been extended and now supports ESMTP as well as POP and SMTP.
  • The "Deploy" workspace now has built-in SFTP support for deploying Web Apps to a remote server in the cloud.
  • Various other improvements
  • Fixed various reported bugs.

Lianja SQL Server 1.3 Release

  • Further SQL Optimizer improvements
  • The Lianja SQL Server now runs with SET STRCOMPARE ON by default. This provides better compataibility with MySQL and MSSQL with regards to character column comparisons. These comparisons are case insentive and are automatically trimmed. This provides for better query optimizations and simplified CRUD operations.
  • Fix reported bugs.

Lianja Cloud Server 1.3 Release

  • Data source independent data access to Lianja SQL Server, MSSQL, PostgreSQL, Oracle and MySQL using Lianja Virtual Tables.
  • Support ODBC data access in the Cloud Server.
  • Support "CursorAdaptor" in the Cloud Server.
  • COM/ActiveX support in the Cloud Server on Windows.
  • Support "NetworkRequest" in the Cloud Server.
  • All ODBC sqlXXX() functions now supported in the Cloud Server
  • Virtual Table ODBC connection pooling
  • Web / Mobile Clients now handle popup DateTime picker
  • Web / Mobile Clients now work with Virtual Tables with full CRUD and Instant Search
  • LIST HTML. The HTML keyword causes the data to be output as an html table with bootstrap classes. These will be ignored if you have not included bootstrap in your .rsp file. This saves a lot of coding when you want to display a nice looking styled table in a WebView. The optional clause ONCLICK "columnname", "javascriptfunction('{}')" can also be specified to generate a hyperlink for "columnname" that calls the specified javascriptfunction when it is clicked. The {} is substituted with the value if the "columnname". This can be used to link across to other pages and search for data. The example_tablelist App included in the distro shows how to use this.
  • Added Lianja.showDialog() with the ability to embed a .rsp/.jssp/.html/.php/.aspx page or a JavaScript component created using the Lianja UI Framework into the Dialog that pops up on top of the page being displayed. These are custom Dialogs that you create in JavaScript. They can be used to display a custom query dialog or information relevant to your app e.g. popup a google map. The JavaScript function should create a container then return it. This will then be embedded into the Dialog. Hint: use createObject("classname") and addObject("varname", "classname") just as you would in a desktop App.
    function page1_myDialog()
        var cont = createObject("myContainer", "container");
    cont.backcolor = "white";
    cont.addObject("myTextBox", "textbox");
    return cont;

    Lianja.showDialog("Select a customer", "page1_myDialog()", 500, 240);

    // alternatively displaying some custom dynamically generated content

    Lianja.showDialog("Customer Details", "getCustomerDetails.rsp?customer={customer.customerid}", 500, 400);
  • Lianja.showDialogPanel() with the ability to embed a .rsp/.jssp/.html/.php/.aspx page or a JavaScript component created using the Lianja UI Framework into the Panel that slides in from the right hand side of the page being displayed. These are custom Dialog Panels that you create in JavaScript. They can be used to display custom query panels or information relevant to your App. The JavaScript function should create a container then return it.
    function page1_myDialogPanel()
        var cont = createObject("myContainer", "container");
    cont.backcolor = "lightgray";
    cont.addObject("myLabel", "label");
    myLabel.text = "Customer name";
    return cont;

    Lianja.showDialogPanel("Select a customer", "page1_myDialogPanel()", 400);

    // alternatively displaying some custom dynamically generated content

    Lianja.showDialogPanel("Customer Details", "getCustomerDetails.rsp?customer={customer.customerid}", 400);
  • Optimized some HTML5 rendering to make it more snappy navigating through data in pages with unrelated sections.
  • Enhanced the Cloud Server to handle Content-Type of "application/json" and "application/xml" POST requests. The _server["body"] variable contains the posted body of the request. This is primarily used when writing web services as .rsp or .jssp pages.
  • The "Click" and "Dblclick" events are now working in "ImageStrip" sections. You can double click on an image to slide in a DialogPanel with information pertaining to the image e.g. Employee imformation.
  • Enabled the "Runtime Database" App setting in a Web/Mobile application. If this is specified in the App Settings then it will be used as the "Runtime database". This provides the ability to develop against a development database and deploy against a runtime database. See details below concerning database tenancies.
  • Enabled database tenancies based on the authenticated user. The "Database" used by an App for a user in a specified tenancy is postfixed with an "_" followed by the tenancy (domain) for the user specified in the "Users" workspace. For example, if the database for an App is southwind and the user has a tenacy (domain) specified of xyzco then the database used for that user will be southwind_xyzco. When the user authenticates in Desktop, Web or Mobile apps the specified database will be used rather than the default database for the App. Remember to "Deploy" the system!sysroles table and the database for that tenancy from the "Deploy" workspace. Note that if the tenancy name contains '.' or '@' characters these are replaced with '_' characters e.g. lianja.com using the southwind database would expect the database southwind_lianja_com to exist. You can "copy" a complete database to another using the COPY DATABASE command in the console or the "Copy" menu selection in the "Data" workspace.
  • Added "lib:/showdialog_map.rsp?adddress=" to the library as a standard script for looking up an address and displaying in a google map.
  • Roles and permissions for displaying App tiles in the App Center in Web / Mobile Apps has now been implemented. An authenticated user who does not have the "read" role for an App causes the tile not to be displayed in the App Center". This is a pre-cursor to enabling all CRUD roles and permissions which is scheduled for v1.4.
  • New "Org Chart" section type that displays an organization chart graphically.
  • Custom JavaScript sections and containers used to programatically layout Lianja.showDialog() and Lianja.showDialogPanel() now handle "Horizontal" and "Vertical" container layouts.
  • Clicking or touching on section headers now animates the section being selected into view. This can be disabled in the App Settings if desired.
  • Fixed various reported tickets
  • ** Not yet implemented in the Web Client (currently under development will be released as a point release later) **
    - Editable WebViews bound to SQL columns in Virtual Tables
    - EditBoxes bound to SQL columns in Virtual Tables
    - Instant Selections using contains() which is SQL dialect dependent