Lianja App Builder Changelog

What's new in Lianja App Builder 9.6.3

Apr 29, 2024
  • The version 9.6.3 release includes:
  • New: Intellisense and code completion now works in the Console workspace and the command window.
  • Improved: Python Intellisense and Doc integration improved.
  • Improved: JavaScript Intellisense and Doc integration improved.
  • New: Additional built-in Python functions:
  • string = base64_decode(cExpr)
  • string = base64_encode(cExpr)
  • result = evaluate(cLianjaExpression)
  • execute(cLianjaCommand)
  • object = json_decode(cExpr)
  • jsonstring = json_encode(object)
  • string = tmpnam()
  • New: The Right Sidebar on a page can now autosize gadgets into the available space. Autosize gadgets is a new Page Attribute which is off by default.
  • New: The Left and Right sidebars on a Page can now use standard modern colors for the headers of the sections in the sidebars. Sidebar theme is a new App setting which is on by default.
  • New: Lianja Node.js Module released. Build Node.js applications and share data between Node and Lianja Apps running in the cloud. See this doc article for details.
  • New: Lianja Python module. Build free standing Python applications and share data between Python and Lianja Apps running in the cloud. See this doc article for details.
  • Coming soon: Lianja .NET assembly. Build free standing .NET applications and share data between .NET and Lianja Apps running in the cloud.
  • Improved: Updated the lianjademo example App to use the built-in Chart View rather than Google Charts.
  • Bug fixes and performance improvements.

New in Lianja App Builder 9.5.19 (Apr 16, 2024)

  • Standalone App Improvements:
  • New: Any Lianja App can be packaged as a standalone desktop App for Windows. Previously only Apps based on a custom-coded or autogenerated Form could be packaged as an exe in this way.
  • New: Building standalone executables now has the option to include library files so it runs without a Lianja runtime installed.
  • The auto-generated dependencies.txt file lists any required library files for the WebView based sections in the App.
  • The includes.txt file allows the developer to enumerate any other required library files. These can be specified as directories, wildcards, individual files or 'dependencies' files that themselves contain file lists.
  • When the App is built, the library files from 'dependencies.txt' and 'includes.txt' will be added.
  • New: Building standalone executables now has the option to create a zip file of the App and its dependencies. This can be unzipped on a target machine.
  • New: Building standalone executables now has the option to create a self-extracting exe file of the App and its dependencies. This can be unzipped/installed on a target machine.
  • New: Building standalone executables now has the option to specify a comma-separated list of databases that will be included when the App is built.
  • New: Building standalone executables now has the option to specify a comma-separated list of additional files that will be included when the App is built. Wildcards and the lib:/ special prefix may be used.
  • New: The following readonly properties have been added to the Lianja system object for use with standalone Apps:
  • Lianja.standalone
  • Lianja.standalonefilepath
  • New: The following methods have been added to the Lianja system object for use with standalone Apps:
  • Lianja.getParameter()
  • Lianja.debug()
  • Lianja.resume()
  • Lianja.suspend()
  • New: If the file setup.prg (or setup.py or setup.js) is contained within the App it is executed before the standalone App is run. You can check to see if the App is running standalone using Lianja.standalone and check the file path using Lianja.standalonefilepath.
  • Improved: The example_timeclock sample App has been enhanced to demonstrate the latest standalone App improvements for Form based Apps.
  • Improved: The form2 sample App has been enhanced to demonstrate the latest standalone App improvements for autogenerated Form based Apps.
  • Improved: The example_webapp1 sample App has been enhanced to demonstrate the latest standalone App improvements for non Form based Apps.
  • New: Standalone Apps can now be debugged at runtime using the Lianja Standalone App Debugger:
  • For custom coded Form Apps, start the debugger using the new form.debug() method.
  • Autogenerated and non Form based Apps automatically show the debugger when built in Debug mode. The Modebar Selector can be used to toggle between Release and Debug mode.
  • For custom coded Form Apps, suspend code using the new form.suspend() method. Click the 'Run' button in the debugger to resume execution.
  • For non Form based Apps, suspend execution by calling the new Lianja.suspend() method in your code; click the debugger 'Run' button or call the new Lianja.resume() method to resume. You can also use the new Lianja.debug() method in your code to open the debugger when testing in Release mode.
  • View the stack trace in the debugger 'Output' panel.
  • Type commands in the 'Input' panel, e.g. list status.
  • If the debugger is active and any errors occur, the App will suspend execution and the debugger will be shown.
  • Use the set debugout and debugout commands to display debugout text in the debugger 'Output' panel.
  • New: Standalone executables can now require login:
  • New form.requireslogin property.
  • Fully customizable login form using Form parameters for custom coded forms or an app.conf file for other Apps.
  • New: Standalone executables can now include a pre-load splashscreen.
  • New: Standalone executables can now include additional App specific key/value pairs. These are specified in the app.conf file and can then be referenced in the App using the new Lianja.getParameter() method.
  • New SignatureView Section:
  • New: The new SignatureView Section is used for signature capture in touch enabled web/mobile Apps.
  • New: The new sample App 'example_signatureview' demonstrates the SignatureView section.
  • Calendar Section Enhancements:
  • New: Calendar Sections now include the ability to list events as an agenda.
  • New: Events can now have notes attached.
  • New: Events can now be queried by 'resource' and event 'type' to refine the display in the calendar and/or list.
  • Improved: Calendar Section UI layout improvements.
  • New Chat With the Doc:
  • New: The documentation can now be queried using a conversational help system.
  • New: The 'Doc' help tab in the Console and Script Editor (Apps and Library workspaces) now has a search bar where you can ask questions:
  • Additional Improvements:
  • Improved: Faster syntax highlighting in the Script Editor and the Debugger.
  • Improved: Faster intellisense and code completion in the Script Editor with updated intellisense definitions.
  • Improved: 'Show in explorer' now works on Linux. (Right click context menu in a file selection tree in an App Inspector tab).
  • Improved: Image gadgets now layout correctly if 'Maintain aspect ratio' is specified in desktop/web/mobile Apps.
  • Improved: Form UI code generation improvements.
  • Improved: Lianja Web Framework UI layout improvements.
  • Improved: Canvas Section UI layout improvements.
  • Improved: Scrolling of grids and calendar on phones has been improved to prevent annoying bounce scrolling on iOS.
  • Improved: More responsive UI layout on phones. Page headers auto-adjust caption alignment on changes of phone orientation (portrait landscape).
  • Critical: Fixed a buffer overflow issue with Python .pysp pages. This was not crashing as smart memory allocation is used internally to detect buffer overflows.
  • Various UI improvements in the App Builder.
  • Bug fixes and performance improvements.

New in Lianja App Builder 9.4.25 (Jan 25, 2024)

  • Minor UI improvements.
  • Bug fixes and performance improvements.

New in Lianja App Builder 9.4.19 (Dec 21, 2023)

  • Improved: Visual FoxPro compatibility improvements.
  • Improved: Error reporting improvements.
  • Improved: Troubleshooter improvements.
  • Improved: Updated NSIS windows installer tool.
  • Bug fixes and performance improvements.

New in Lianja App Builder 9.4.14 (Dec 4, 2023)

  • Bug fixes and performance improvements.

New in Lianja App Builder 9.4.10 (Nov 28, 2023)

  • Bug fixes and performance improvements.

New in Lianja App Builder 9.4.9 (Nov 23, 2023)

  • New and Enhanced LianjaScript Commands:
  • Improved: compare database can now generate a script that recreates a database with its tables, indexes, business rules and metadata. e.g.
  • Compare database southwind with dummy to file create_newdb.prg create newdb
  • New: The following commands have been added:
  • rename table source to target
  • copy table source to target [if [not] exists]
  • Note that the source and target table specifications can include databasename! so tables can be renamed or copied to a different database. Associated files, i.e. memo (.dbt), index (.dbx) and rules (.dbd) are copied/renamed along with the table (.dbf) using a single command.
  • Additional Improvements:
  • Critical: Fixed an issue with the LianjaScript execPython() function which was not returning the correct value.
  • Improved: The Virtual Table property nulls=1 now automatically does a set null on for that virtual table.
  • Improved: An additional parameter has been added to the networkrequest framework class delete() method to allow the specification of the data to be deleted.
  • New: A patch() method has been added to the networkrequest framework class.
  • Minor UI improvements.
  • Bug fixes and performance improvements.

New in Lianja App Builder 9.4.6 (Nov 9, 2023)

  • Improved Report Printing:
  • Reports are designed in the Report Builder and can then be viewed, printed, emailed and exported.
  • Improved: The following methods are now supported:
  • Lianja.showReportViewer(cReportName [, cPrintArgs [, cTitle [, cFilter [, bCanFilter [, bCanEmail]]]])
  • cReportName may be:
  • The name of a report designed in the Report Builder.
  • The name of a .rsp, .pysp or .jssp file that will dynamically generate the HTML to be printed.
  • The name of an HTML article, e.g. "article:/myarticle.html". See ArticleView Options for information on ArticleView sections and document data merging.
  • cFilter is a where condition e.g. "orderid=10428".
  • if bCanFilter is true then a "Filter" button allows use of the Query Builder to filter the records selected.
  • if bCanEmail is true then an "Email" buttton allows the report to be emailed.
  • Lianja.previewReport(cReportName [, cPrintArgs [, cFilter]])
  • Lianja.printReport(cReportName [, cPrintArgs [, lPreview[, cFilter]]])
  • Lianja.printFile(cPrinter, cFilename)
  • Lianja.printHtml(cInput, cOutputfile, cPrintArgs)
  • cInput may be:
  • HTML text.
  • The name of a .rsp, .pysp or .jssp file that will dynamically generate the HTML to be printed.
  • Lianja.printHtmlFile(cHtmlFile, cOutputfile, cPrintArgs)
  • Lianja.emailReport(cReportName, cFilter, cEmailto, cEmailfrom, cSubject, cMessage)
  • Lianja.exportReport(cReportName, cType, cOutputfilename, cFilter)
  • Lianja.saveReportAsPdf(cReportName, cOutputfilename [, cFilter])
  • New: See the blog article on Working with reports in Lianja 9.4.
  • New SendGrid integration for sending email:
  • New: Sendgrid has been integrated with the new Lianja.sendmail() method:
  • Lianja.sendmail(cTo, cFrom, cSubject, cBody [, cAttachments])
  • cAttachments is a comma separated list of filenames.
  • Signup for SendGrid at https://sendgrid.com.
  • Set the SENDGRID_APIKEY environment variable to your SendGrid API KEY.
  • Optionally set the SENDGRID_SENDERIDENTITY environment variable to your 'from' full name and SendGrid verified email address.
  • Optionally set the SENDGRID_REPLYTO and SENDGRID_REPLYTONAME environment variables to your 'reply to' email address and full name respectively.
  • New ArticleView Section Enhancements:
  • New: ArticleView Section articles can now include embedded WebViewWidgets.
  • Improved: The example_datamerge sample App now includes embedded Data List View, Image View and Chart View WebViewWidgets.
  • Any of the built-in WebViewWidgets can be embedded in an article.
  • Custom WebViewWidgets coded in LianjaScript (.rsp file), Python (.pysp file) or JavaScript (.jssp file) can also be embedded.
  • New: HTML articles can now also be displayed, emailed and printed using the Report Viewer.
  • New: See the blog article on Working with HTML Articles in Lianja 9.4.
  • Additional Improvements:
  • New: The item() method on a Tree (TreeGrid in Canvas) now takes a third parameter which can be used to update the text in a specific row/column:
  • otree = Lianja.get("page1.section1.field1")
  • otree.clear()
  • otree.addItems("select * from southwind!orders")
  • otree.item(1, 1, "text")
  • New: Form, Grid, Attachments and Canvas sections have a new section attribute: Dictionary overrides. If this is set to true and Inherit dictionary rules is true, empty entries in the table's dictionary override the corresponding section and formitem/column attributes set in the App.
  • New: Virtual Tables now handle NULL values. Specify the Virtual Table properties nulls=1 and nullifempty=1 to handle NULL values in MSSQL, MySQL and other third party databases.
  • Improved: The getFile() method in the networkrequest class now handles the reading of binary files.
  • orequest = createObject("networkrequest")
  • orequest.getFile("https://somedomain.com/somefile.png", "somefile.png", cUid, cPwd, lBinary)
  • Critical: Fixed an issue with SQL SELECT GROUP BY on joined tables.
  • Improved: The 'New Form' menuitem in the Develop menu now provides the ability to select the scripting language for the form being created.
  • Minor UI improvements.
  • Bug fixes and performance improvements.

New in Lianja App Builder 9.3.3 (Sep 29, 2023)

  • Enhanced Python Support:
  • Improved: Two-way LianjaScript and Python integration.
  • Improved: The execPython() built-in LianjaScript function now handles referencing Python libraries that may be contained within an App or in the libraries. This provides the ability to wrap Python packages and call them directly from LianjaScript.
  • See this blog article for full details.
  • ArticleView New Features:
  • New: Added the ability to merge data in ArticleView sections. When editing the article, use {macros} that will be substituted when the article is displayed. This provides the ability to display dynamic documents and perform mail or print merging. Combine multiple documents using {insertfile:filename} macros. To enable an ArticleView section for data merging, enable the Merge data attribute in the Assistant or the App Inspector.
  • New: Added the ability to allow users to select the article from a selection tree in desktop and web Apps. Clicking an article name displays it in the ArticleView section. To enable an ArticleView section for user article selection, enable the Article viewer option in the Assistant or the Selectable attribute in the App Inspector.
  • New: Added a new example App to the Lianja App Builder distribution to demonstrate data merging using an ArticleView section. Find the example_datamerge App in the 'Examples|Demo Cloud Apps' category.
  • New: Added a new file attribute to ArticleView sections. This can be changed programmatically in desktop and web Apps.
  • New: Added 'New Article...' to the right-click context menu in the Library workspace.
  • New: Added 'Article files' to the Library workspace Library Files tree. Right-click on this and select 'New...' or 'New Article...' to create a new HTML article that can be loaded into an ArticleView section.
  • New: Added 'Articles' to the Deploy workspace to enable deployment of HTML formatted articles.
  • Additional Improvements:
  • New: Added the function ado_providerlist(). This returns a comma-separated list of OLEDB providers.
  • New: Added saveAsPdf(cFilename) to Webview section methods.
  • Minor UI improvements.
  • Bug fixes and performance improvements.

New in Lianja App Builder 9.2.6 (Sep 18, 2023)

  • New: Added set date to long | short for VFP compatibility.
  • Improved: MSSQL OLEDB Virtual Table support.
  • Improved: OLEDB error messages for CRUD operations with Virtual Tables.
  • Fixed an issue creating Virtual Tables from OLEDB/ODBC where table names contain spaces.
  • New: Added addFormitem(cType) and addFormitem(cDatabase, cTable, cColumn) to the section methods. Use this in conjunction with the page addSection(cType) method to programmatically create canvas sections and add fields in code. addFormitem() returns an object reference to the new canvas formitem. You can then set its attributes such as position, colors etc. When created for a specific column in a table the data type and dictionary is inherited for the column.
  • Minor UI tweaks.
  • Bug fixes and performance improvements.

New in Lianja App Builder 9.2.5 (Sep 14, 2023)

  • New: Added the function ado_tablelist(cConnstr | cDBC). This returns a comma-separated list of table names from the specified OLEDB connection or Visual Foxpro database filename (.dbc).
  • New: Added the function odbc_tablelist(cConnstr [, cUsername, cPassword]) This returns a comma-separated list of table names from the specified ODBC connection.
  • New: Added Create Virtual Tables from OLEDB to the right click context menu and Additional Commands in the data workspace when you click on a database name. It is now easier to share data between legacy VFP applications and new Lianja apps using the VFP OLEDB driver. The virtual tables can be created from an existing VFP database container (.dbc file) by clicking the '...' button to the right of the input field.
  • Improved: Using Create Virtual Tables from ODBC from the right click context menu or Additional Commands in the data workspace, you can now choose an existing ODBC DSN from a drop-down list or create a new one by clicking the '...' button to the right of the list field.
  • Minor UI tweaks.
  • Bug fixes and performance improvements.

New in Lianja App Builder 9.2.4 (Sep 11, 2023)

  • New: Added the VFP driveType(cDrive) function.
  • Improved: VFP OLEDB support in web/mobile Apps.
  • Fixed an issue when using the VFP OLEDB driver with date and datetime data types.
  • Fixed an issue adding records to VFP OLEDB Virtual Tables in the desktop UI which could cause the actionbar buttons to become unresponsive.
  • Fixed an issue refreshing the right sidebar in web/mobile apps before page data fetch had completed.
  • Fixed an issue using the wscript.shell and other ActiveX on Windows.
  • Fixed a critical issue in the use of VFP OLEDB Virtual Tables.
  • Minor UI tweaks.
  • Bug fixes and performance improvements.

New in Lianja App Builder 9.2.3 (Aug 30, 2023)

  • The version 9.2.3 release includes:
  • New: Apps with Enable guest access set to true are now excluded from the App Center.
  • New: When running Preview live in browser for Apps with Enable guest access set to true, the preview bypasses the login page.
  • Improved: Additional Page Builder Assistant functionality:
  • Edit Custom Right Sidebar gadget.
  • Improved: For Canvas Section Advanced Controls, changing the value property is now treated in the same way as changing it via the UI - it is flagged as changed and the controlsource is updated.
  • Minor UI tweaks.
  • Bug fixes and performance improvements.

New in Lianja App Builder 9.2.2 (Aug 23, 2023)

  • New: Field descriptions/captions are now handled in Virtual Tables using the 'descriptions' Virtual Table property in the format:
  • PROPERTIES "descriptions=actor_id:Actor ID,first_name:First Name"
  • These are used as captions in Form and Canvas sections as well as in the Query Builder.
  • Improved: Printing of page/section Instant Reports.
  • Improved: Rendering of canvas sections with Enable when editing specified. This should be used in conjunction with the App Setting Readonly fields backcolor.
  • Improved: With Inherit dictionary rules specified for a section, empty dictionary entries now overwrite section attributes. This allows alter table to be used to correctly remove dictionary attributes in the UI.
  • Critical: Fixed some layout issues in web/mobile Apps with the page actionbar buttons when the Custom options and Custom settings buttons are used.
  • Improved: Gadget headers can now contain {macros} in desktop/web/mobile.
  • Improved: Section Menus are now more responsive in web/mobile Apps.
  • Improved: Image Gadgets in Form Sections can now contain both static images and dynamic images using {macros} in desktop/web/mobile.
  • New: Instant Search now works natively with Virtual Tables (including OLEDB) in desktop/web/mobile.
  • Improved: Customize Chart Gadget attributes in the Page Builder Assistant.
  • Critical: Upgraded version of Google Maps being used as the earlier version was removed by Google.
  • Improved: Error handling of VFP OLEDB errors.
  • Minor UI tweaks.
  • Bug fixes and performance improvements.

New in Lianja App Builder 9.1.15 (Aug 11, 2023)

  • New builder for page 'Hide ActionBar Icons' in the Page Builder Assistant.
  • The dialogbuttonmenu now drops down in the same way as a combobox.
  • The cdow() and cmonth() functions now return locale specific long names in web/mobile as well as desktop.
  • Bug fixes and performance improvements.

New in Lianja App Builder 9.1.14 (Aug 10, 2023)

  • Bug fixes and performance improvements.

New in Lianja App Builder 9.1.12 (Aug 9, 2023)

  • New dialogbuttonmenu attribute and delegate in desktop, web and mobile.
  • Minor UI improvements.
  • Bug fixes and performance improvements.

New in Lianja App Builder 9.1.11 (Aug 4, 2023)

  • Improved VFP OLEDB support.
  • Various productivity improvements, including:
  • Drag a single data column onto an empty Page and a Form Section will be automatically created.
  • Additional Page Builder Assistant enhancements.
  • New Anchor Builder in the Page Builder Assistant for Canvas Section advanced controls.
  • Improved table double-click behavior in Data workspace.
  • Bug fixes and performance improvements.

New in Lianja App Builder 9.1.10 (Jul 27, 2023)

  • Minor UI improvements.
  • Bug fixes and performance improvements.

New in Lianja App Builder 9.1.9 (Jul 25, 2023)

  • Minor UI improvements.
  • Bug fixes and performance improvements.

New in Lianja App Builder 9.1.8 (Jul 20, 2023)

  • Improved OLEDB Virtual Table support.
  • Performance and stability improvements.
  • Various bug fixes.

New in Lianja App Builder 9.1.7 (Jul 17, 2023)

  • Minor UI improvements.
  • Performance and stability improvements.
  • Various bug fixes.

New in Lianja App Builder 9.1.5 (Jul 11, 2023)

  • New browser selection App Settings for Preview live in browser.
  • Minor UI improvements.
  • Performance and stability improvements.
  • Various bug fixes.

New in Lianja App Builder 9.0.27 (May 25, 2023)

  • When metadata changes are made in the Metadata Editor, the currently open App now has changes applied without requiring a manual reload.
  • Metadata changes to virtual tables are now reflected immediately without requiring the table to be reopened.
  • Performance and stability improvements.
  • Various bug fixes.

New in Lianja App Builder 9.0.18 (May 10, 2023)

  • Further Language Translation Enhancements:
  • App Builder messages, search panel operators and querybuilder are now automatically translated.
  • Translations are stored in lianjalanguageslang.translation files and persist after initial translation for the user's locale. Lang is an ISO 639-1 code.
  • Translations can be overridden using Lianja.setTranslationText(lang, oldtext, newtext) and translated using newtext = Lianja.translateText(lang, oldtext).
  • Added Lianja.locale() which returns the current locale code.
  • Additional Improvements:
  • Added "Share with others in your company, business or team" to the web/mobile login page. This emails a link to the address you specify.
  • Additional Page Builder Assistant enhancements.
  • UI appearance improvements.
  • Performance and stability improvements.
  • Various bug fixes.

New in Lianja App Builder 9.0.17 (May 3, 2023)

  • Lianja Cloud Ready:
  • Lianja 9 is ready to use with the Lianja Apps Cloud. Purchase a Lianja Apps Cloud subscription and use the key provided to activate up to 5 Lianja App Builder Cloud Developer Edition installations to develop, test and deploy your Web and Mobile Apps into the Lianja Apps Cloud.
  • Lianja Cloud Admin Console Enhancements:
  • The Lianja Cloud Admin Console has been further enhanced.
  • Improved performance.
  • Database tables can now be 'browsed' with full CRUD operations in a data grid.
  • Data can now be imported into database tables by uploading a .csv file.
  • New Resource Customization for Lianja Cloud:
  • Environment Variables
  • Tenant Configuration
  • Cron Jobs
  • Debug Files
  • ODBC Data Sources
  • Report Builder Enhancements:
  • The Report Builder Export menu is now fully functional. Export reports in the following formats:
  • PDF
  • Email (PDF)
  • HTML
  • CSV
  • XML
  • Excel (XML)
  • JSON
  • ADO (XML)
  • Drag and drop of columns to rearrange them.
  • Changing the Fields using the Field Chooser now automatically rearranges the attributes for the columns.
  • Right-clicking on a report name now opens a context menu with the following options:
  • Delete Report
  • Rename Report
  • Copy Report
  • Bug fixes and performance improvements.
  • Web/Mobile Client Improvements:
  • New web/mobile responsive layout engine.
  • Improved Touch Support.
  • Touch scrollable App Center.
  • "Loading" indicators when logging in, loading apps and when navigating data which exceeds a 1 second threshold.
  • Page headers and footers can now include {} macro substitutions.
  • Page footers can now include a background image under the text.
  • Page footers can now include HTML.
  • UI appearance improvements.
  • Improved caching in Progressive Web Apps.
  • Now supports PDF attachments on phones and tablets in Progressive Web Apps.
  • Customizable splashscreens for Progressive Web Apps.
  • Lianja Login and Lianja App Center now work on phones and tablets.
  • Now supports "public" registrations.
  • Language Translation Enhancements:
  • Dynamic language translation (web/mobile Apps) has been extended to include the following 'Preferred language' functionality:
  • Lianja Login and the Lianja App Center now auto translate based on the locale of the user
  • Redesigned, more user-friendly 'Preferred language' dropdown
  • Calendar Sections
  • CommentsView Sections
  • Split Grid Sections
  • Custom Query Builder
  • Desktop Text Translation now includes Section Search Panel operators.
  • Demo App Enhancements:
  • The 'form2' demo App (Demo Mobile Apps -> Tabbed Form) has been enhanced to demonstrate a toolbar-driven tabview UI for mobile devices.
  • Built as a JavaScript Tabview section form.
  • Runs as a web/mobile App with a toolbar at the bottom of the page to select the tabbed sections.
  • Can also be called on the desktop using Lianja.showForm() or built to run as a standalone executable.
  • App Builder MenuBar Enhancements:
  • The File menu in the App Builder MenuBar has been extended to include the following operations:
  • Clear Error files
  • Clear Debug files
  • Clear Deployed Apps
  • Clear Packages
  • New: Build Project Package:
  • New option from the Develop quick links to build a project package for web/mobile Apps:
  • Opens each App in the current project in turn
  • Runs Preview live in browser to generate the HTML files
  • Creates a package file for the whole project
  • The package created can then be uploaded to a Lianja Cloud Server for installation using the Lianja Cloud Admin Console App.
  • Additional Improvements:
  • A user can now have a default App specified in their roles. When the user logs in, the specified App will be opened instead of the App Center.
  • New Visual FoxPro compatible isexclusive() function to return the access status (exclusive / shared) for a table or database.
  • New Set Command set jsonboolean on/off to set the return value for booleans/logicals from desktop odata_read() queries.
  • The Google Map Gadget and Google Map View WebView Widget now support specifying a latitude,longitude coordinates pair as an alternative to a postal address. The info tip can now also be disabled.
  • Various additional Page Builder Assistant attributes to help speed up development.
  • JQL bug fixes and performance improvements. Use SQL with the natively supported JSON data type in SQL tables.
  • The HTML editor type (Desktop|Web|Mobile) can be set for individual WebView Sections and WebView Gadgets to override the App-wide setting for desktop Apps.
  • The page menu for desktop Apps can now have the theme specified as 'Dark' (default) or 'Light' in the App Settings: Page defaults. Specifying 'Light' will list the page titles on a light colored background.
  • TabView sections can now be traversed using count and item().
  • ArticleView sections can now have an associated CSS file editable in the assistant. Click the dialog button and the CSS file name will be generated and opened to edit. ArticleView sections make an attractive home page for Apps. Note that ArticleView sections include bootstrap by default. See the articleview.rsp Lianja Server Pages script file for included stylesheets.
  • Additional buttons for the Visual Component/Form Manager: 'New Form' and 'Close'.
  • Performance and stability improvements.
  • Various bug fixes.

New in Lianja App Builder 8.0.1 (Nov 22, 2022)

  • New "Develop" icon in the modebar:
  • Speeds up the low-code App building experience
  • Click the Develop icon (bottom icon in the Modebar on the left of the main window) to perform common development operations:
  • Open Project
  • Open App
  • Open Database
  • New Project
  • New App
  • New Database
  • New Table
  • New Form
  • New Report
  • New Script
  • New Library
  • New Form Page
  • New Grid Page
  • New WebView Page
  • New TabView Page
  • New Report Page
  • Generate App Doc
  • Generate Database Doc
  • Quick Project Package
  • Quick Package
  • List Package
  • Recent Projects >
  • Recent Apps >
  • Recent Files >
  • New Form Designer:
  • Speeds up low-code App building
  • Create forms faster than ever with a few clicks
  • Build tabbed forms that run in Desktop, Web and Mobile 
  • Forms can be run as standalone executables, desktop forms, web forms and mobile forms.
  • Customize the UI with a traditional Menubar, Toolbar, Actionbar and Statusbar
  • Quickly switch between UI controls and display their attributes and edit their delegates in the Assistant.
  • Write low-code for delegates to handle events (click on CommandButtons etc) in LianjaScript, Python or JavaScript 
  • See the new blog article Working with Forms in Lianja 7.2.
  • New Page Builder Assistant:
  • Speeds up low-code App building
  • The Page Builder Assistant is now embedded in the App Inspector to speed up development, giving quick access to key Page, Section, Formitem and GridColumn attributes and delegates and easy navigation between the UI elements.
  • Many Page Builder Assistant additions and improvements
  • Canvas Designer Improvements:
  • Drag'n drop tables onto a canvas now provides a default layout. You can then move UI controls about, change their size and other attributes.
  • All canvas controls are now supported in Desktop, Web and Mobile (with the exception of Windows specific ActiveX):
  • ActiveX (Windows desktop only)
  • Chart (new)
  • ListBox
  • TreeGrid
  • WebView
  • Rich Text Editor
  • CheckBox
  • ComboBox
  • CommandButton
  • Date TextBox
  • DateTime TextBox
  • Numeric TextBox
  • EditBox
  • HyperLink
  • LCDNumber
  • Slider
  • ProgressBar
  • OptionButton
  • OptionGroup (horizontal and vertical)
  • Spinner
  • TextBox
  • Image
  • Label
  • GroupBox (new)
  • Container (new)
  • Subtitle
  • Separator
  • UI controls now support shading and transparency
  • Much improved anchor support
  • Improved desktop-like pixel perfect layout in Web/Mobile Apps
  • Improved Python Support:
  • Extended Python scripting support.
  • Low-code Python brought to Web and Mobile Apps.
  • Python debugger improvements.
  • Python now provides dynamic binding to event handlers in custom Python code (same functionality as LianjaScript and JavaScript)
  • All python delegates now have self as the first argument. self references the object for the delegate. 
  •  Visual Component Improvements:
  • Visual Components built in the Canvas Designer can now use LianjaScript, JavaScript or Python as the scripting language. Previously only JavaScript was supported.
  • New Visual Component/Form Manager (enhanced Component Gallery):
  • Click the NEW button to create a new component.
  • Click the EDIT button to edit the selected component.
  • Click the RUN button to run the selected component in a form.
  • When a Canvas Section is saved as a Visual Component, the component is saved in the current App as well as the specified components directory. This provides the ability to visually design component forms in LianjaScript/VFP, JavaScript and Python.
  • New Lianja.showDialogForm() Lianja system object method to activate component forms.
  • New initForm event delegate for Canvas Sections. This delegate is called when a Visual Component form is activated. You can open a database and the database tables required by the component form in this delegate. Note that activating a form will automatically PUSH DATASESSION / POP DATASESSION so there is no need to do this.
  •  Additional New Functions:
  • New function tableSeqno(cDatabase, cTable). You can use this to apply a default seqno() in client/server Web Apps. If you use seqno() in a default value for a column then when the App is generated as a Web or Mobile App seqno() will automatically be translated to use tableSeqno().
  • New gmtime() function to return a datetime expressed in Coordinated Universal Time (UTC).
  • Added several new cryptographic hash functions. SHA-256 is a popular hashing algorithm used in Bitcoin encryption (and other blockchain applications):
  • sha256(cExp) - this returns the SHA256 cryptographic hash for the specified character string.
  • sha256file(cFilename) - this returns the SHA256 cryptographic hash for the specified file.
  • sha256record([alias]) - this returns the SHA256 cryptographic hash for the current active record.
  • crc32record([alias]) - this returns an 8 byte hexadecimal value (a cyclic redundancy check) for the current active record.
  • Additional New System Methods:
  • Added Lianja.pushDataSession() and Lianja.popDataSession() methods.
  • Added Lianja.showForm(cTitle, cForm) method to activate forms built with the Form Designer.
  • Added Lianja.getData(cControlSource) and Lianja.setData(cControlSource,eValue) system object methods. These new methods simplify data access in Web Apps and are well suited for use in the visibleWhen() and enabledWhen() delegates across all supported scripting languages.
  • Added Lianja.isDesktop()
  • Added Lianja.isTablet()
  • Added Lianja.isPhone()
  • New Form UI Framework Class Properties, Methods and Event Delegates:
  • New Form properties:
  • actionbar
  • menubar
  • menubarlayout
  • toolbar
  • toolbarlayout
  • toolbarposition
  • New Form methods:
  • get()
  • getElementByID()
  • printObjectTree() can be used to help in debugging custom forms
  • New Form event delegates:
  • actionbarclick()
  • afterclose()
  • beforeclose()
  • initform()
  • menubarclick()
  • toolbarclick()
  • New Container UI Framework Class Properties, Methods and Event Delegates:
  • New Container property:
  • recordsource (assign a SQL select statement or a database!tablename and the container will handle data binding and actionbar actions from its parent form)
  • New Container methods:
  • open()
  • close()
  • add()
  • delete()
  • first()
  • next()
  • previous()
  • last()
  • save()
  • cancel()
  • controls(nNumber | cName)
  • New Container event delegates:
  • actionbarclick()
  • initformdefaults()
  • menubarclick()
  • toolbarclick()
  • New Section methods:
  • select( cExp | nExp) selects a tab in a tabview section
  • Debugging Improvements:
  • Much improved debugger.
  • New writeoutput() function and command">? > command that can be used in server-side Lianja Server Pages in Web Apps to assist in debugging.
  • New Troubleshooter debugger tab actionbar actions to disable breakpoints or watchpoints without removing them:
  • Deactivate Breakpoints
  • Deactivate Watchpoints 
  • New set breakpoint command to enable/disable breakpoints in the Troubleshooter debugger tabs.
  • CarouselView Section Enhancements:
  • New 'Lianja Carousel Demo' (example_carousel) App included in the Lianja App Builder distribution to demonstrate CarouselView functionality in CarouselView Sections.
  • CarouselView attributes can now be specified in the Custom Web Component Parameters Editor.
  • Adding a new image positions on that image after uploading it.
  • UI facelift
  • Calendar Section enhancements:
  • Calendar can now better be used for event planning with new "Event Location" (e.g Room).
  • UI facelift
  • OrgChart Section Enhancements:
  • UI facelift
  • DataListView Section Enhancements:
  • UI facelift
  • ArticleView Section Enhancements:
  • New 'Edit Article' button in ArticleView Sections to open the HTML file in the WYSIWYG HTML editor in place.
  • UI facelift.
  • Virtual Table Enhancements:
  • The basetable property has been added to the Create/Modify a Virtual Table dialog.
  • Virtual table updates now operate with wheretype=3.
  • Virtual tables to MS SQL Server data sources with spaces in the column names are now supported.
  • Improved OLEDB performance.
  • Improved support for OLEDB Virtual Tables when using the searchbar in desktop and web Apps.
  • New wheretranslate property to handle incorrect positioning of a where clause in queries to MS SQL Server with an over (partition by ...) clause.
  • Enhanced Gesture Support for Simplified Data Navigation:
  • Checking the Gestures enabled attribute on Form and Canvas sections enables this functionality.
  • On phones and tablets:
  • Swipe left moves to next record
  • Swipe right moves to previous record
  • Swipe down moves to first record
  • Swipe up moves to last record
  • Tap-and-hold edits the current record
  • On desktop browsers:
  • Mouse wheel down moves to next record
  • Mouse wheel up moves to previous record
  • Mouse wheel left moves to first record
  • Mouse wheel right moves to last record
  • Double-click edits the current record
  • These default behaviors can be overridden by custom delegates if required.
  • Data Workspace Enhancements:
  • In the Tables tab in the Data workspace, the following table export and import options are now available in Additional Commands and the context menu:
  • Copy
  • Export to CSV
  • Export to EXCEL
  • Export to ADO
  • Export to JSON
  • Import from CSV
  • Import from TABLE
  • Lianja Cloud Admin Console Enhancements:
  • The Lianja Cloud Admin Console App now includes the following additional tabs:
  • User Row Filters. This provides full CRUD operations on Row Level Security filters. It also allows their import from a .csv file.
  • User Data Masks. This provides full CRUD operations on Dynamic Data Masks. It also allows their import from a .csv file.
  • Lianja Cloud Server Login Enhancements:
  • Self service portals: configure the Lianja Cloud Server to allow users to register in a tenancy.
  • One-time passcode two factor authentication for user logins.
  • Includes beta technology previews (coming in Lianja 9):
  • Lianja Cloud workspace
  • Build workspace - Build React Native mobile Apps in the cloud
  •  Miscellaneous Improvements:
  • New readme.html template opened in the Apps workspace when an App is created or opened. This allows the Author, Description and Revision history of the App to be recorded. It also immediately enables the Script Editor Find Panel Search Bar functionality for searching all files in the App.
  • Added a new Web/Mobile App Setting: Disable success notifications. This operates in Web/Mobile Apps to disable the 'noise' from successful operations such as updating records, uploading images etc. Notifications only occur when an error occurs.
  • Improved SQL compatibility with Visual Foxpro.
  • SQL optimizer improvements and fixes resulting in an overall speed boost.
  • Improved garbage collection.
  • UI datetime date display format now defaults to the system locale. It can be changed using the set dateformat command.
  • Improved deployment. Select only those files to be deployed and they will be compiled if required and then deployed. Use 'Preview' first to verify the files that will be deployed.
  • When saving data as xml/excel (SELECT or COPY) any invalid characters are now escaped.
  • Usability improvements in grid editing.
  • Section menus are now multi-level in Desktop and Web Apps. In Desktop Apps they have the look and feel of standard window Menubars.
  • In the Advanced options of the FormBar while editing canvas sections and forms you can "Select All" UI controls. This is handly when you want to move UI controls using the keyboard arrow keys to make fine adjustments.
  • Ctrl+Shift+Click a GroupBox in a canvas section will select the GroupBox and all UI controls inside it.
  • Specify "Permissions and Roles" graphically. 
  • Many UI improvements.
  • Performance and stability improvements.
  • Various bug fixes.

New in Lianja App Builder 8.0 (Nov 17, 2022)

  • New "Develop" icon in the modebar:
  • Speeds up the low-code App building experience
  • Click the Develop icon (bottom icon in the Modebar on the left of the main window) to perform common development operations;
  • Open Project
  • Open App
  • Open Database
  • New Project
  • New App
  • New Database
  • New Table
  • New Form
  • New Report
  • New Script
  • New Library
  • New Form Page
  • New Grid Page
  • New WebView Page
  • New TabView Page
  • New Report Page
  • Generate App Doc
  • Generate Database Doc
  • Quick Project Package
  • Quick Package
  • List Package
  • Recent Projects >
  • Recent Apps >
  • Recent Files >
  • New Form Designer:
  • Speeds up low-code App building
  • Create forms faster than ever with a few clicks
  • Build tabbed forms that run in Desktop, Web and Mobile
  • Forms can be run as standalone executables, desktop forms, web forms and mobile forms.
  • Customize the UI with a traditional Menubar, Toolbar, Actionbar and Statusbar
  • Quickly switch between UI controls and display their attributes and edit their delegates in the Assistant.
  • Write low-code for delegates to handle events (click on CommandButtons etc) in LianjaScript, Python or JavaScript
  • New Page Builder Assistant:
  • Speeds up low-code App building
  • The Page Builder Assistant is now embedded in the App Inspector to speed up development, giving quick access to key Page, Section, Formitem and GridColumn attributes and delegates and easy navigation between the UI elements.
  • Many Page Builder Assistant additions and improvements
  • Canvas Designer Improvements:
  • Drag'n drop tables onto a canvas now provides a default layout. You can then move UI controls about, change their size and other attributes.
  • All canvas controls are now supported in Desktop, Web and Mobile (with the exception of Windows specific ActiveX) ;
  • ActiveX (Windows desktop only)
  • Chart (new)
  • ListBox
  • TreeGrid
  • WebView
  • Rich Text Editor
  • CheckBox
  • ComboBox
  • CommandButton
  • Date TextBox
  • DateTime TextBox
  • Numeric TextBox
  • EditBox
  • HyperLink
  • LCDNumber
  • Slider
  • ProgressBar
  • OptionButton
  • OptionGroup (horizontal and vertical)
  • Spinner
  • TextBox
  • Image
  • Label
  • GroupBox (new)
  • Container (new)
  • Subtitle
  • Separator
  • UI controls now support shading and transparency
  • Much improved anchor support
  • Improved desktop-like pixel perfect layout in Web/Mobile Apps
  • Improved Python Support:
  • Extended Python scripting support.
  • Low-code Python brought to Web and Mobile Apps.
  • You can now write delegates in Python not just for desktop, but also in Web and Mobile.
  • If you want to experiment with Machine Learning you can now code in Python end-to-end: in the browser and on the server using exports.conf.
  • Python debugger improvements.
  • Python now provides dynamic binding to event handlers in custom Python code (same functionality as LianjaScript and JavaScript), e.g.
  • object.click = my_click_function
  • All python delegates now have self as the first argument. self references the object for the delegate.
  • Visual Component Improvements:
  • Visual Components built in the Canvas Designer can now use LianjaScript, JavaScript or Python as the scripting language. Previously only JavaScript was supported.
  • New Visual Component/Form Manager (enhanced Component Gallery):
  • Click the NEW button to create a new component.
  • Click the EDIT button to edit the selected component.
  • Click the RUN button to run the selected component in a form.
  • When a Canvas Section is saved as a Visual Component, the component is saved in the current App as well as the specified components directory. This provides the ability to visually design component forms in LianjaScript/VFP, JavaScript and Python.
  • New Lianja.showDialogForm() Lianja system object method to activate component forms.
  • New initForm event delegate for Canvas Sections. This delegate is called when a Visual Component form is activated. You can open a database and the database tables required by the component form in this delegate. Note that activating a form will automatically PUSH DATASESSION / POP DATASESSION so there is no need to do this.
  • Additional New Functions:
  • New function tableSeqno(cDatabase, cTable). You can use this to apply a default seqno() in client/server Web Apps. If you use seqno() in a default value for a column then when the App is generated as a Web or Mobile App seqno() will automatically be translated to use tableSeqno().
  • New gmtime() function to return a datetime expressed in Coordinated Universal Time (UTC).
  • Added several new cryptographic hash functions. SHA-256 is a popular hashing algorithm used in Bitcoin encryption (and other blockchain applications):
  • sha256(cExp) - this returns the SHA256 cryptographic hash for the specified character string.
  • sha256file(cFilename) - this returns the SHA256 cryptographic hash for the specified file.
  • sha256record([alias]) - this returns the SHA256 cryptographic hash for the current active record.
  • crc32record([alias]) - this returns an 8 byte hexadecimal value (a cyclic redundancy check) for the current active record.
  • Additional New System Methods:
  • Added Lianja.pushDataSession() and Lianja.popDataSession() methods.
  • Added Lianja.showForm(cTitle, cForm) method to activate forms built with the Form Designer.
  • Added Lianja.getData(cControlSource) and Lianja.setData(cControlSource,eValue) system object methods. These new methods simplify data access in Web Apps and are well suited for use in the visibleWhen() and enabledWhen() delegates across all supported scripting languages.
  • Added Lianja.isDesktop()
  • Added Lianja.isTablet()
  • Added Lianja.isPhone()
  • New Form UI Framework Class Properties, Methods and Event Delegates
  • New Form properties:
  • actionbar
  • menubar
  • menubarlayout
  • toolbar
  • toolbarlayout
  • toolbarposition
  • New Form methods:
  • get()
  • getElementByID()
  • printObjectTree() can be used to help in debugging custom forms
  • New Form event delegates:
  • actionbarclick()
  • afterclose()
  • beforeclose()
  • initform()
  • menubarclick()
  • toolbarclick()
  • New Container UI Framework Class Properties, Methods and Event Delegates:
  • New Container property:
  • recordsource (assign a SQL select statement or a database!tablename and the container will handle data binding and actionbar actions from its parent form)
  • New Container methods:
  • open()
  • close()
  • add()
  • delete()
  • first()
  • next()
  • previous()
  • last()
  • save()
  • cancel()
  • controls(nNumber | cName)
  • New Container event delegates:
  • actionbarclick()
  • initformdefaults()
  • menubarclick()
  • toolbarclick()
  • New Section methods:
  • select( cExp | nExp) selects a tab in a tabview section
  • Debugging Improvements:
  • Much improved debugger.
  • New writeoutput() function and command">? > command that can be used in server-side Lianja Server Pages in Web Apps to assist in debugging:
  • Add the set debugout on command to the .rsp script along with writeoutput() or ? > calls.
  • Open the App in the browser using Preview live in browser.
  • Monitor the writeoutput() and/or ? > display in the App Builder Console workspace.
  • Note the command">? > command supports arrays and objects just like the ? command.
  • New Troubleshooter debugger tab actionbar actions to disable breakpoints or watchpoints without removing them:
  • Deactivate Breakpoints
  • Deactivate Watchpoints
  • New set breakpoint command to enable/disable breakpoints in the Troubleshooter debugger tabs.
  • CarouselView Section Enhancements:
  • New 'Lianja Carousel Demo' (example_carousel) App included in the Lianja App Builder distribution to demonstrate CarouselView functionality in CarouselView Sections.
  • CarouselView attributes can now be specified in the Custom Web Component Parameters Editor.
  • Adding a new image positions on that image after uploading it.
  • UI facelift
  • Calendar Section enhancements:
  • Calendar can now better be used for event planning with new "Event Location" (e.g Room).
  • UI facelift
  • OrgChart Section Enhancements:
  • UI facelift
  • DataListView Section Enhancements:
  • UI facelift
  • ArticleView Section Enhancements:
  • New 'Edit Article' button in ArticleView Sections to open the HTML file in the WYSIWYG HTML editor in place.
  • UI facelift.
  • Virtual Table Enhancements:
  • The basetable property has been added to the Create/Modify a Virtual Table dialog.
  • Virtual table updates now operate with wheretype=3.
  • Virtual tables to MS SQL Server data sources with spaces in the column names are now supported.
  • Improved OLEDB performance.
  • Improved support for OLEDB Virtual Tables when using the searchbar in desktop and web Apps.
  • New wheretranslate property to handle incorrect positioning of a where clause in queries to MS SQL Server with an over (partition by ...) clause.
  • Enhanced Gesture Support for Simplified Data Navigation:
  • Checking the Gestures enabled attribute on Form and Canvas sections enables this functionality.
  • On phones and tablets:
  • Swipe left moves to next record
  • Swipe right moves to previous record
  • Swipe down moves to first record
  • Swipe up moves to last record
  • Tap-and-hold edits the current record
  • On desktop browsers:
  • Mouse wheel down moves to next record
  • Mouse wheel up moves to previous record
  • Mouse wheel left moves to first record
  • Mouse wheel right moves to last record
  • Double-click edits the current record
  • These default behaviors can be overridden by custom delegates if required.
  • Data Workspace Enhancements:
  • In the Tables tab in the Data workspace, the following table export and import options are now available in Additional Commands and the context menu:
  • Copy
  • Export to CSV
  • Export to EXCEL
  • Export to ADO
  • Export to JSON
  • Import from CSV
  • Import from TABLE
  • Lianja Cloud Admin Console Enhancements:
  • The Lianja Cloud Admin Console App now includes the following additional tabs:
  • User Row Filters. This provides full CRUD operations on Row Level Security filters. It also allows their import from a .csv file.
  • User Data Masks. This provides full CRUD operations on Dynamic Data Masks. It also allows their import from a .csv file.
  • Lianja Cloud Server Login Enhancements:
  • Self service portals: configure the Lianja Cloud Server to allow users to register in a tenancy.
  • One-time passcode two factor authentication for user logins.
  • Includes beta technology previews (coming in Lianja 9):
  • Lianja Cloud workspace
  • Build workspace - Build React Native mobile Apps in the cloud
  • Miscellaneous Improvements:
  • New readme.html template opened in the Apps workspace when an App is created or opened. This allows the Author, Description and Revision history of the App to be recorded. It also immediately enables the Script Editor Find Panel Search Bar functionality for searching all files in the App.
  • Added a new Web/Mobile App Setting: Disable success notifications. This operates in Web/Mobile Apps to disable the 'noise' from successful operations such as updating records, uploading images etc. Notifications only occur when an error occurs.
  • Improved SQL compatibility with Visual Foxpro.
  • SQL optimizer improvements and fixes resulting in an overall speed boost.
  • Improved garbage collection.
  • UI datetime date display format now defaults to the system locale. It can be changed using the set dateformat command.
  • Improved deployment. Select only those files to be deployed and they will be compiled if required and then deployed. Use 'Preview' first to verify the files that will be deployed.
  • When saving data as xml/excel (SELECT or COPY) any invalid characters are now escaped.
  • Usability improvements in grid editing.
  • Section menus are now multi-level in Desktop and Web Apps. In Desktop Apps they have the look and feel of standard window Menubars.
  • In the Advanced options of the FormBar while editing canvas sections and forms you can "Select All" UI controls. This is handly when you want to move UI controls using the keyboard arrow keys to make fine adjustments.
  • Ctrl+Shift+Click a GroupBox in a canvas section will select the GroupBox and all UI controls inside it.
  • Specify "Permissions and Roles" graphically.
  • Many UI improvements.
  • Performance and stability improvements.
  • Various bug fixes.

New in Lianja App Builder 7.1 (Mar 9, 2022)

  • Performance improvements
  • Bug fixes

New in Lianja App Builder 7.0 (Feb 3, 2022)

  • Added support for building standalone executables on Windows. See this blog article for details.
  • The Lianja KVS (Key-Value Store) is now fully integrated as built-in Python Functions.
  • The size of the values that are stored (which may be Python objects/dicts) can be of an unlimited size.
  • This new functionality provides an ideal solution for using Python in Lianja Apps to perform data analysis, machine learning and artificial intelligence using numpy, pandas, PyTorch, tensorflow and other industry standard libraries.
  • Store and retrieve Python data objects of any practical size in Lianja KVS, a full 64 bit key/value store with automatic garbage collection and reusable persistent storage.
  • KVS files can be shared across multiple docker instances and across clusters on network storage.
  • Highly performant key lookup with fully balanced B+ tree storage makes KVS the perfect solution for Python machine learning and artificial intelligence applications.
  • The Python pip command can now be used directly in the Lianja/VFP Console tab
  • New built-in Python functions:
  • str = filetostr(cFilename)
  • strtofile(cString, cFilename [, nFlag])
  • New Form custom UI Framework class methods:
  • HideMessage()
  • ShowErrorMessage(text)
  • ShowInfoMessage(text)
  • ShowMessage(text)
  • ShowSuccessMessage(text)
  • ShowWarningMessage(text)
  • New Form custom UI Framework class event:
  • moved(x, y, width, height)
  • Enhanced kvs_open() function allowing a KVS to be opened shared or exclusive:
  • kvsid = kvs_open(cFilename.kvs [, lShared])
  • New KVS functions:
  • numeric = kvs_generate(kvsid, nCount)
  • numeric = kvs_loadFromFile(kvsid, cFilename.txt)
  • numeric = kvs_removeRange(kvsid, nOffset, nCount)
  • numeric = kvs_saveToFile(kvsid, cFilename.txt)
  • Added support for the Visual Foxpro aselobj() function to load object references for the following current objects into an array:
  • Active Page
  • Active Section
  • Active Formitem
  • Active Grid Column
  • Object under cursor
  • Support for the Visual Foxpro amembers() function to load object properties into an array has been extended:
  • Amembers() can now be used on the UI Framework Classes.
  • Both objects and classes can be handled.
  • Specifying the third parameter option flag as 1 creates an array with 4 columns: member name, 'property' or 'method', data type, value.
  • New Camera Custom UI Framework Class to use the webcam on your machine to capture and store images.
  • Useful for 'time clock' like Apps to associate a photo when a user clocks in and out.
  • See the example_timeclock App included in the Lianja App Builder distribution.
  • New Lianja system object properties: Lianja.availablecameralist to return a comma separated list of available cameras and Lianja.availablecameras to return the number of available cameras.
  • New Chart Custom UI Framework Class.
  • Add charts to your Apps using custom code.
  • Supports Google Charts.
  • Productivity improvement: when an App is loaded the files that were being edited when it was saved are re-opened for editing.
  • Intellisense improvements.
  • CSS improvements.
  • New option type for the append from command: type binary offset nOffset This allows records to be retrieved from a binary dump file containing raw records specifying a starting offset position.
  • The Image Advanced Control for Canvas Sections can now be data-bound in the web/mobile client as well as on the desktop.
  • Various UI tweaks and improvements.
  • Performance and stability improvements.
  • Various bug fixes.

New in Lianja App Builder 6.3.2 (Dec 18, 2021)

  • Added Sparkline Charts in grid cells: specify the Spark line expression to return a comma separated list. Load the "Example Grid Badges" App (example_gridbadges) to see them in operation.
  • Added Ratings in grid cells: specify a greater than 0 value in the new Rating max value attribute. Load the "Example Grid Badges" App (example_gridbadges) to see them in operation.
  • Performance and stability improvements.
  • Various bug fixes.

New in Lianja App Builder 6.3.1 (Dec 13, 2021)

  • Added Sparklines in grid cells. Load the "Example Grid Badges" App (example_gridbadges) to see them in operation.
  • Added Dynamic badges to grid columns. Load the "Example Grid Badges" App (example_gridbadges) to see them in operation.
  • Non inline memos displayed in grid rows now have an active hyperlink which when clicked slides in the "Text Editor". You can set the Cell editor type in the grid column attributes to "html" if required. If no editor type is specified then it now defaults to "Text". Load the "Example Grid Badges" App (example_gridbadges) to see this in operation.
  • Fixed an OLEDB Virtual Table issue.
  • Fixed an issue with LianjaScript Editor Intellisense.
  • Fixed a small typo in the grid section attributes for the Before Row/Col change and After Row/Col change delegates.
  • Performance and stability improvements.
  • Various bug fixes.

New in Lianja App Builder 6.3 (Dec 10, 2021)

  • The version 6.3 release includes:
  • New blog in the Lianja Developer Community Forums with in-depth 'How To' articles, e.g.
  • HOWTO integrate Lianja and VFP with concurrent data access.
  • HOWTO setup SSL certificates using LetsEncrypt on Linux servers.
  • HOWTO build a package, upload it and install it in a Cloud Server.
  • Developing PWA Apps in Lianja.
  • Added better support for dynamically loadable LianjaScript modules as described here.
  • WebViewWidget enhancements. Added support for custom instant search. See this article for an example.
  • The Data Editor in the Data workspace now has a Search icon in the ActionBar for the grid. Click this to activate the Custom Query Builder to filter data being browsed.
  • The Data Editor in the Data workspace now has a Search bar to search across all columns.
  • Added a new Search icon to the browse command grid actionbar. Click this to activate the Custom Query Builder to filter data being browsed.
  • Added a new Search bar to the browse command grid to search across all columns.
  • Added a new Search bar to grid sections to simply data queries.
  • Added a new Search bar to the Lianja App Center in the desktop and web clients and the Home workspace in the Lianja App Builder. As you type in the Search bar, the App tiles are filtered based on their title.
  • Added support for custom app parameters on App Tiles (and Lianja.openApp() calls). Specify this in the 'Tile URL' to load an app with custom parameters: app:example_webapp1?database=southwind_companyxxx&page=page1.section1
  • New command line switch --config for desktop App configuration, e.g. --config Z:appconfig.txt. The configuration file should contain command line switches, with each switch on a line and any arguments on the next line
  • New menu option: Convert Page to TabView. This creates a new TabView section and automatically adds in all the existing sections on the current Page. It is particularly useful for tablet and phone App layouts.
  • New menu option: Convert Form to TabView. This creates a new TabView section and automatically adds in each column of FormItems from the selected Form section as a separate Form section.
  • Added the ability to set Tab ordering in desktop Form sections. This is a new attribute for formitems.
  • Added new grid section attribute 'Highlight selected rows'. This can be unchecked if you want to use grids for display purposes only.
  • Added the ability to theme Web, Tablet and Phone Apps.
  • Added support for the Custom options menu button in the ActionBar for Web/Mobile Apps.
  • Added 'Web pagination size' as a grid attribute. This is used to set the initial pagination size in Web grids.
  • Added new Key-Value Store (KVS) built in functions.
  • Added support for "oledb" with Virtual Tables. You can now use the "vfpoledb" driver to access VFP data concurrently while VFP is. This is windows specific but enables you to run Lianja Apps alongside VFP applications sharing the data. See this article for full details.
  • When browsing VFP Virtual Tables using OLEDB the queries are now performed case insensitive. This enables the use of the Query Builder and the Search Bar on native VFP data without any custom code needed.
  • Added {andwhere} special macro in Virtual Table definitions to handle WHERE clauses when requerying.
  • Improved Query Builder support for Virtual Tables with major performance improvement.
  • Further performance improvements with Virtual Tables. For best performance specify pagination=1 in the VT properties.
  • To assist performance monitoring, the new elapsedtime VT property causes the elapsed times for various operations to be written to the debug_client.txt file.
  • New App Setting Disable VT requery when parentdatachanged to handle legacy VT usage prior to Lianja 6.3.
  • The command line switch --disableparentvtrequery can be used to start the App Builder and set this to True. Once set, the command line switch is no longer required.
  • Added a new database trigger dbc_afteropendata.
  • Added improvements for continuous integration of development database and live database.
  • Added export to CSV functionality for users tables from the Users workspace in the App Builder. Resulting CSV files can then be imported to a Lianja Cloud Server for deployed web/mobile Apps using the Lianja Cloud Admin Console App.
  • New Database Switcher allowing an alternative database to be selected by the user or developer:
  • Define a comma separated list of databases in the Database switcher list App Setting. This can include '*' wildcards, e.g. southwind_*.
  • Display the database switcher by setting the Hide database switcher Page attribute to False.
  • Optionally code the App Database changed event delegate.
  • Added wss:/ SSL support to the websocket class. Added two new methods:
  • setLocalCertificate( cCertFile ) e.g. "localhost.crt"
  • setPrivateKey( cKeyFile ) e.g. "localhost.key"
  • Added new page methods showActionBarButtons() and hideActionBarButtons(). Use these new methods to customize the ActionBar at runtime inside appropriate delegates.
  • New Lianja.showPickList() method.
  • Further Lianja Web Framework UI refinements.
  • Added SET COLLATION ON. After using this you need to reindex database so that the indexes are recreated in collation order for utf8. This fixes an issue with some character sets being sorted in the wrong order.
  • The Lianja Apache module on Linux has been optimized resulting in a performance boost.
  • Local Virtual Table performance boost.
  • Lianja SQL performance boost.
  • New Visual Foxpro compatible ataginfo() function to create an array to return information about the indexes of the current table.
  • The strconv() function now supports conversion options 13 (encodes to base64) and 14 (decodes from base64).
  • Reports can now be added to projects which causes them to be deployed along with other project assets.
  • Improved report printing, including the webview.previewprint() method: reference the Report section internal Webview and display the print preview window.
  • New Table Designer to replace the Create/Modify Column dialogs.
  • Select any table in the current database from the combobox or choose <new> to create a new table.
  • Access the MetaData Editor for the current table.
  • View all columns from the current table in grid format and select any to modify its definition, business rules, index status and MetaData.
  • Add or delete columns.
  • Added better support for dynamically loadable LianjaScript modules.
  • Adjusted Lianja Web Framework to be more touch friendly.
  • Improved canvas designer with pixel perfect UI layout when generating code for Web Apps.
  • Improved Script Editor CodeAssist and Intellisense for LianjaScript.
  • Saving of attribute versions in appname_appdoc.txt for diff comparison in the Versions Workspace can now be enabled or disabled using the Keep attribute versions App Setting. Default is disabled and this is recommended for systems with limited diskspace, particularly where larger Apps are under active development/frequent saves.
  • Various UI tweaks and improvements.
  • Performance and stability improvements.
  • Various bug fixes.

New in Lianja App Builder 6.2.1 (Jul 27, 2021)

  • Performance improvements
  • Bug fixes

New in Lianja App Builder 6.2.0 (Jul 7, 2021)

  • Added a new "Before Refresh" delegate which is called before data is fetched into the UI.
  • Added the ability to provide feedback to a user when loading data. This is most useful in web and mobile apps and is typically used in the "Before Refresh" delegate.
  • Significant performance improvements for web Apps.
  • Bug fixes.
  • e.g.:
  • Lianja.showLoadingMessage("Your message..." [, cTheme]) // cTheme can be "a", "b", "c", or "d"
  • Lianja.hideLoadingMessage()
  • Added additional visual feedback Lianja system object methods:
  • Lianja.showErrorMessageWithIcon(cMessage [, lNoTimeout])
  • Lianja.showSuccessMessageWithIcon(cMessage [, lNoTimeout])
  • Lianja.showWarningMessageWithIcon(cMessage [, lNoTimeout])
  • Added the ability to toggle the visibility of the page header and section header from code. This is available in desktop and web apps.
  • e.g.:
  • Lianja.get("page1").headervisible = true | false
  • Lianja.get("page1.section1").headervisible = true | false

New in Lianja App Builder 6.1.0 (Jun 19, 2021)

  • Performance improvements
  • Bug fixes

New in Lianja App Builder 6.0.1 (Apr 6, 2021)

  • Performance improvements
  • Bug fixes

New in Lianja App Builder 6.0.0 (Apr 1, 2021)

  • The set rushmore command enables or disables Rushmore-style (Visual FoxPro) index scanning optimization for NoSQL and SQL commands.
  • Set rushmore is on by default.
  • With set rushmore on, the speed of the following NoSQL commands is increased by optimizing the for condition, active filter condition or active rowfilter condition. Indexes should be created on the fields specified in the condition to enable the optimization. For optimum performance, use filtered indexes. Use of the upper() and/or lower() functions is not required: with set strcompare on (default), indexes and comparison operators are case insensitive.
  • average
  • blank
  • calculate
  • copy
  • count
  • delete
  • list
  • locate...continue
  • recall
  • replace
  • scan...endscan
  • sum
  • total
  • With set rushmore on, there is also a major performance boost for very large tables when issuing SQL queries using the >, >=, < and <= operators. The = and == operators are always optimized.
  • Improved SQL optimizer with filtered indexes. (Hint: use the EXPLAIN command to see what's happening).
  • Added the BACKUP/RESTORE DATABASE and LIST BACKUPS commands.
  • The 'IN |' clause has been added to the following commands:
  • average
  • blank
  • calculate
  • continue
  • count
  • delete
  • exit
  • list
  • locate
  • loop
  • recall
  • scan
  • sum
  • Note that the IN clause must be the first clause as IN is also an operator in Lianja.
  • Added new App attribute "Enable PerfMeter" which shows the perfmeter in the "Console" workspace for long operations.
  • Added a StatusBar to the console workspace. SET PERFMETER ON if you want to see a progress bar displayed in the StatusBar when performing long operations.
  • Page, section and formitems names can now contain _ in desktop/web/mobile apps.
  • Virtual Tables bound to sections have much improved performance of section relationships. No need for custom code in the parentdatachanged event delegate any more. The relationship is now satisfied using requery() on the child data source.
  • Grid columns: new Only visible when editing attribute. Columns are hidden until the grid row is being edited. This provides a better UI grid for mobile devices.
  • Switching between Pages, Sections, Formitems and GridColumn attributes now maintains the search text. This speeds up the reviewing of attributes during development.
  • When using the debugger with LianjaScript, clicking the Stop icon now cancels execution when the debugger is active.
  • Lianja.showDialog() and Lianja.showDialogPanel() are now responsive in web / mobile. This can be seen when using the QueryBuilder on mobile devices.
  • New App UiLibs. Design pages visually then add them to the App UIlib enabling them to be used with Lianja.showDialog() and Lianja.showDialogPanel(). Check the page attribute "Register in UIlib". The pages are not included in the pages menu but can be used with dialogs by specifying "page:pagename" as the file name.
  • DialogPanels can be be shown on top of existing ones. So, for example, if a page in the UiLib contains a grid section, then editing a row in the grid will overlay the grid with the "EDIT FORM" and clicking "Done" or "Cancel" will switch back to the previous DialogPanel i.e the grid section. This provides smoother UI transitions and a better mobile experience when screen size is limited.
  • New delegates for Grid sections. Interactive Change is called after a cell is edited. Row/Col Change is called when a cell is selected, before being edited. Both are passed three arguments: nRow, nColumn, cValue.
  • New properties for Virtual Tables:
  • translatequeryfunction=function
  • The function is called to translate a native Lianja SQL WHERE condition for a target SQL database syntax.
  • It is called with two arguments: cWhereCondition, cDBtype. It should reside in the database container.
  • convertuint=1
  • Use this to correct the ODBC interpretation of BIT fields in MySQL.
  • datsourceoptions=options
  • Where options are database specific, e.g. for ODBC to increase packet size:
  • SQL_ATTR_PACKET_SIZE:102410
  • includeblobs=1
  • Use this to cause varbinary fields to be saved to remote database servers in desktop Apps. Currently supports MySQL, MSSQL and Postgres.
  • includememos=1
  • Use this to cause varchar fields to be saved to remote database servers in desktop Apps. Currently supports MySQL, MSSQL and Postgres.
  • Several improvements made to Image Strip Sections.
  • Image notes are now supported in the web/mobile client.
  • HTML image notes are now handled correctly.
  • In web/mobile Apps, the images are touch-friendly and can call the Double click event delegate.
  • Image notes are now editable: new attribute Image notes editable.
  • Touch or click the image notes text to display the slide-in dialog panel editor.
  • Improved error reporting.
  • Page, Section and Formitem names can now contain underscore characters (_) in desktop and web/mobile Apps.
  • Mailing label printing is now supported using the create label and label form commands.
  • The Console workspace now has a Statusbar. The display of the Statusbar can be toggled from the View menu.
  • New set perfmeter command. With set perfmeter on, a progress bar is displayed in the Console workspace Statusbar when performing long operations.
  • Added new App attribute 'Enable PerfMeter' which shows the perfmeter in the Console workspace for long operations.
  • The Deploy workspace has been enhanced to allow package files to be built for a specified deployment target. This also includes the ability to exclude files and use wildcard characters in filenames when defining the package file to facilitate team development.
  • Fixed a caching issue with very large SQL queries (millions of records) that would cause a crash.
  • Added additional information to dir command when no database open.
  • Added additional information to the list structure command with Virtual Tables.
  • Performance improvements when bulk loading tables using append from, append blank and generate. Set timeline off is automatically executed and turned back on afterwards.
  • Performance improvement when using the count command with no filter condition.
  • The Grid Section Summary can now optionally include Minimum, Maximum and Average column values along with the column Totals. The 'Lianja Tablet Web UI Demo' (example_webapp1) App demonstrates this.
  • The Responsive UI breakpoint attributes have been added to the Generate App Doc output file.
  • Added improved package management for Team Development and Release Management in the Deploy workspace. Packages can be created in the Deploy workspace then published to Team or Release GitHub repositories. Options to Unpublish published packages and List published packages are also now available.
  • The lianja command can be used to install Lianja package files with automatic version checking.
  • The new lianja-lpk command can be used to install a Lianja package file or list its contents.
  • Available for macOS (Big Sur, 11.1), as well as Windows and Linux.
  • The macOS Lianja distribution is now notarized by Apple:
  • "Notarization gives users more confidence that the Developer ID-signed software distributed has been checked by Apple for malicious components."
  • "When the user first installs or runs your software, the presence of a ticket (either online or attached to the executable) tells Gatekeeper that Apple notarized the software. Gatekeeper then places descriptive information in the initial launch dialog to help the user make an informed choice about whether to launch the app."
  • The Linux license management utility, lianja-lm, has been enhanced to return additional information when validating the license with the --validate option.
  • $ sudo lianja-lm --validate
  • Faster switching to home page on macOS and Linux.
  • The location of the Lianja 64 bit ISAPI extension for IIS has changed. See ISAPI Extension for IIS for full details.
  • Arguments passed to an App using the --args command line switch, specified in Lianja.openApp() or included in a web App URL can now be queried using Lianja.args.
  • The new lianja-comp command line tool can be used to compile .prg script files.
  • The compare database command now includes all database events and generates an optimized upgrade.prg file.
  • App Doc now includes Grid columns.
  • The section attributes Visible when and Readonly when can now reference "this" and "thisform" e.g. readonlywhen could be set to !this.editing which causes the section to be readonly unless in edit mode.
  • The Enable when editing attribute is now supported on Form, Grid and Attachments sections as well as Canvas sections. This is only effective in runtime mode. It causes sections to be readonly until editing is in effect.
  • Exposed the "state" attribute for Page, Section and Formitem objects. "State" is a comma separated list of UI States that the UI element handles.
  • Exposed the "uistate" attribute for Page, Section and Formitem objects and the Lianja system object. "Uistate" is the last UI State applied.
  • The SQL Select aggregate functions min() and max() now handle a list of arguments and additional data types: character, currency and datetime as well as date and numeric.
  • New list library command to list all currently loaded procedure and function libraries.
  • Split grid editing is now also supported in web/mobile Apps.
  • New split grid tabs for desktop and web/mobile Apps. These can be configured to contain memo/varchar data, images and components.
  • New custom Grid object methods:
  • hideRow(nIndex)
  • hideAllRows()
  • showRow(nIndex)
  • showAllRows()
  • The nIndex row number starts from 1.
  • New dynamically loadable modules provide Object Oriented encapsulation for existing Lianja/VFP code so that loading a library does not 'pollute' the namespace and create potential problems due to name clashes.
  • Simplified one-click deployment of packages to the Lianja Cloud Server (local and remote) in the Deploy workspace.
  • With Autoupdate enabled on the server, the packages will be auto installed/upgraded.
  • Locally deploy and test web/mobile Apps in Preview live in browser before uploading.
  • When deploying using http(s) and an API Key, the package to be deployed is rebuilt before deployment.
  • The new lianja-lpk command line tool can be used to handle Lianja package files.
  • list the contents of a package
  • build a new package
  • add files to a package
  • refresh a package to update its contents
  • install a package
  • update using a package
  • deploy a package to a Lianja Cloud Server, directly or via IIS (Windows) or Apache (Linux)
  • Help table contextual help is now supported in web Apps.
  • New LianjaScript functions to compress and uncompress long strings:
  • str_compress(cExpr)
  • str_uncompress(cExpr)
  • The Navigation Panel in web Apps can now have a SQL Select data source as in desktop Apps. See the example_navpanel2 App included in the Lianja App Builder distribution for a demonstration of this.
  • New free Community Edition for Student/Trial/Demo/Proof of Concept purposes.
  • New Lianja App Builder Subscription Editions:
  • Lianja App Builder Standard. No runtime distribution key is included.
  • Lianja App Builder Professional. Includes 25 client runtime distribution key.
  • Lower cost Cloud Server and SQL Server editions with lower connections.
  • See the pricing page for full details on new Editions.
  • Runtime distribution licenses information.
  • Various UI tweaks and improvements.
  • Performance and stability improvements.
  • Fix reported bugs.

New in Lianja App Builder 5.5.1 (Nov 16, 2020)

  • New argument to the Grid goto() method to move to a record number. The new scroll argument allows the position of the row in the viewport to be specified:
  • 0 = scroll to ensure that the item is visible
  • 1 = scroll to position the item at the top of the viewport
  • 2 = scroll to position the item at the bottom of the viewport
  • 3 = scroll to position the item at the center of the viewport
  • New Listbox property, selectionmode, which specifies how items can be selected:
  • 0 = No items can be selected. No item is highlighted, but the value property returns the last clicked item.
  • 1 = Single item can be selected. The value property returns the last clicked item.
  • 2 = Multiple items can be selected (click one after the other). The value property returns a comma-separated list.
  • 3 = Multiple items can be selected (use shift-click and ctrl-click to select). The value property returns a comma-separated list.
  • 4 = Multiple items can be selected using shift-click and ctrl-click, but the value property returns only the last selected item.
  • Many modern languages support the ability to pass functions as parameters to a proc/function. This is a common programming paradigm to implement polymorphism and/or handle completion callbacks. LianjaScript already allows you to assign procs/functions to variables or object members, so to further enhance this it now handles this parameter passing functionality.
  • TabView Sections can now have a TabBar Responsive UI width breakpoint set.
  • Added Lianja.showWarningMessage() system object method to JavaScript (desktop, web, mobile).
  • New dynamic language translation in web and mobile Apps, with the option to use Google translate or a custom script. App Settings: Enable google translate and Enable text translator.
  • Option to allow users to switch languages by clicking a flag in the page header and selecting from the languages pulldown. App Settings: Enable user translate.
  • New Lianja.switchLanguage(code) system object method available in the Lianja Web Framework (web, mobile). It switches the applicable UI text to the language code specified.
  • The example_webapp1 sample App (Lianja Tablet Web UI Demo) included in the distribution demonstrates the new dynamic language translation functionality.
  • Added section.refreshHeaderBadge(cLabel, nReccount) method to the Lianja Web Framework (desktop). This updates the section header badge as used by Instant Search and Instant Selections with the specified label text and record count.
  • PhoneGap Build, which was deprecated in Lianja v5.4, has been removed because Adobe have discontinued this service. In Lianja v5.5, you can build effective mobile Apps as Progressive Web Apps.
  • The 'Web App View', 'Tablet App View' and 'Phone App View' headerbar buttons have been removed from the App Builder as they are no longer required. Using 'Preview live in browser' generates the html code for all three clients and current browsers allow you to view the App on a variety of device sizes. See Deploying to Local Directory for more details.
  • Much improved Progressive Web App caching resulting in a massive performance boost. Note: Internet Explorer is no longer supported by the web client; Microsoft's current 'Edge' browser can be used as an alternative.
  • When editing files in the script editor, Open file in debugger no longer closes the file in the script editor. Any changes made are synced into the debugger.
  • New Custom builders intercept the creation of new Apps, Pages, Databases and Tables.
  • Custom builders can be coded in Lianja (.prg), Python (.py), JavaScript (.js), PHP (.php), TypeScript (.ts) or as Lianja Server Pages (.rsp).
  • Custom builders can be project specific or apply to all.
  • For example, a custom builder can be called after the App Wizard completes to specify App Settings for each of the Apps created in a Project.
  • The following methods have been added to the Lianja system object (desktop) to support custom builders
  • Lianja.getAttr(name)
  • Lianja.setAttr(name,value)
  • Lianja.saveApp()
  • Lianja.showAppWizard()
  • Improved ActiveX support on Windows for "ADODB" with specific use with the VFP OLEDB driver.
  • The "ADODB.Connection" object method "execute" when used with SQL UPDATE, DELETE and INSERT now returns the "NumberOfRecordsAffected". Remember to code your updates using optimistic locking for multiuser concurrent updating.
  • Improved ActiveX error reporting.
  • When editing script files in the script editor, you can now click the line number panel to set breakpoints. This will display the Troubleshooter if it is not yet visible. Toggling breakpoints is synced between the debugger (in the Troubleshooter) and the script editor and vice versa.
  • The Instant Search delegate, which is called when a printable character is typed in the Instant Search Box, is now also called when a Page Left Sidebar Favorites, Recently Viewed or Recently Modified item is clicked.
  • New Instant Selection delegate. This is called when an Instant Selection is clicked. The selection's filter condition string is passed to the delegate as a parameter.
  • Instant Selections now also support 'is like' and 'is not like' comparisons.
  • New time command to determine how long a given command takes to run.
  • UI improvements.
  • Performance and stability improvements.
  • Fix reported bugs.

New in Lianja App Builder 5.5.0 (Nov 13, 2020)

  • New argument to the Grid goto() method to move to a record number. The new scroll argument allows the position of the row in the viewport to be specified:
  • 0 = scroll to ensure that the item is visible
  • 1 = scroll to position the item at the top of the viewport
  • 2 = scroll to position the item at the bottom of the viewport
  • 3 = scroll to position the item at the center of the viewport
  • New Listbox property, selectionmode, which specifies how items can be selected:
  • 0 = No items can be selected. No item is highlighted, but the value property returns the last clicked item.
  • 1 = Single item can be selected. The value property returns the last clicked item.
  • 2 = Multiple items can be selected (click one after the other). The value property returns a comma-separated list.
  • 3 = Multiple items can be selected (use shift-click and ctrl-click to select). The value property returns a comma-separated list.
  • 4 = Multiple items can be selected using shift-click and ctrl-click, but the value property returns only the last selected item.
  • Many modern languages support the ability to pass functions as parameters to a proc/function. This is a common programming paradigm to implement polymorphism and/or handle completion callbacks. LianjaScript already allows you to assign procs/functions to variables or object members, so to further enhance this it now handles this parameter passing functionality.
  • TabView Sections can now have a TabBar Responsive UI width breakpoint set.
  • Added Lianja.showWarningMessage() system object method to JavaScript (desktop, web, mobile).
  • New dynamic language translation in web and mobile Apps, with the option to use Google translate or a custom script. App Settings: Enable google translate and Enable text translator.
  • Option to allow users to switch languages by clicking a flag in the page header and selecting from the languages pulldown. App Settings: Enable user translate.
  • New Lianja.switchLanguage(code) system object method available in the Lianja Web Framework (web, mobile). It switches the applicable UI text to the language code specified.
  • The example_webapp1 sample App (Lianja Tablet Web UI Demo) included in the distribution demonstrates the new dynamic language translation functionality.
  • Added section.refreshHeaderBadge(cLabel, nReccount) method to the Lianja Web Framework (desktop). This updates the section header badge as used by Instant Search and Instant Selections with the specified label text and record count.
  • PhoneGap Build, which was deprecated in Lianja v5.4, has been removed because Adobe have discontinued this service. In Lianja v5.5, you can build effective mobile Apps as Progressive Web Apps.
  • The 'Web App View', 'Tablet App View' and 'Phone App View' headerbar buttons have been removed from the App Builder as they are no longer required. Using 'Preview live in browser' generates the html code for all three clients and current browsers allow you to view the App on a variety of device sizes. See Deploying to Local Directory for more details.
  • Much improved Progressive Web App caching resulting in a massive performance boost.
  • When editing files in the script editor, Open file in debugger no longer closes the file in the script editor. Any changes made are synced into the debugger.
  • New Custom builders intercept the creation of new Apps, Pages, Databases and Tables.
  • Custom builders can be coded in Lianja (.prg), Python (.py), JavaScript (.js), PHP (.php), TypeScript (.ts) or as Lianja Server Pages (.rsp).
  • Custom builders can be project specific or apply to all.
  • For example, a custom builder can be called after the App Wizard completes to specify App Settings for each of the Apps created in a Project.
  • The following methods have been added to the Lianja system object (desktop) to support custom builders:
  • Lianja.getAttr(name)
  • Lianja.setAttr(name,value)
  • Lianja.saveApp()
  • Lianja.showAppWizard()
  • Improved ActiveX support on Windows for "ADODB" with specific use with the VFP OLEDB driver.
  • The "ADODB.Connection" object method "execute" when used with SQL UPDATE, DELETE and INSERT now returns the "NumberOfRecordsAffected". Remember to code your updates using optimistic locking for multiuser concurrent updating.
  • Improved ActiveX error reporting.
  • When editing script files in the script editor, you can now click the line number panel to set breakpoints. This will display the Troubleshooter if it is not yet visible. Toggling breakpoints is synced between the debugger (in the Troubleshooter) and the script editor and vice versa.
  • UI improvements.
  • Performance and stability improvements.
  • Fix reported bugs.

New in Lianja App Builder 5.4.0 (Oct 8, 2020)

  • The Mobile Web Editor now supports inserting inline images. Click the image icon in the editor toolbar to select and insert an image.
  • Added the Lianja/VFP atline() function.
  • Web/Mobile UI layout improvements.
  • Image gadgets and Image control now can “Maintain aspect ratio”.
  • Clicking the keyboard icon on the right of a section section menu edits the menu selection delegate code.
  • Script Editor improvements including better smart indenting.
  • Added two new delegates "beforeedit" and "afteredit".
  • Added several new methods to the "Lianja" system object.
  • These change the visibility of the "Navigation Panel". They can be used effectively in the "beforeedit" and the "afteredit" delegates to provide more space to edit data.
  • Added a new page attribute "Hide Navigation Panel when editing". This causes the navigation panel visibility to be hidden/shown before/after editing the page.
  • Added support for Progressive Web Apps (PWA) in the "Build" WorkSpace. You can configure the "manifest" file for an App. This manifest is included in the generated html files (index, tablet_index and phone_index).
  • *new* Responsive UI navigation panel. Specify the "Responsive UI width breakpoint" and the "Navigation Panel" will automatically collapse as icons and expand with captions if the breakpoint is reached on window resizing or mobile viewport size.
  • *new* Responsive UI section menus. Specify the "Responsive UI width breakpoint" and the "Section Menu" will automatically collapse and expand if the breakpoint is reached on window resizing or mobile (phone/tablet) viewport size.
  • *new* Responsive UI section search panels. Specify the "Responsive UI width breakpoint" and the "Search Panel" will automatically hide and show if the breakpoint is reached on window resizing or mobile (phone/tablet) viewport size.
  • *new* all formitems (fields and gadgets) can now be automatically shown/hidden depending on new attributes in the "UI Presentation rules". These new attributes are the "Responsive UI width breakpoint" and the "Responsive UI height breakpoint". As a window (or device such as a phone or tablet changes orientation) the UI is automatically adjusted.
  • *new* all sections can now be automatically shown/hidden depending on new attributes in the "UI Presentation rules". These new attributes are the "Responsive UI width breakpoint" and the "Responsive UI height breakpoint". As a window (or device such as a phone or tablet changes orientation) the UI is automatically adjusted.
  • *new* responsive UI form sections. There is an attribute in the "UI Presentation rules" called "Responsive UI minimum width" for each formitem (fields and gadgets). If the viewport is not wide enough to contain the columns in the form section it will automatically handle horizontal scrolling. On a mobile device this allows flicking left and right to scroll the form contents.
  • Added an additional argument to the set() function. set("installationdrive") returns the drive letter on windows where Lianja is installed.
  • Added several new functions that can be used to obtain the viewport size; screenWidth() and screenHeight(). You can use these to conditionally hide and show UI elements in the "Visible when" condition or other custom code.Added today() as a synonym for date().
  • Added a new "cursoradaptor" method to help building of database dependent conditions for use with the requery() method of the cursoradaptor.
  • Output for MSSQL is:
  • isnull(territoryid,0)>=10 and isnull(modifieddate,'')<='2020-10-31' and isnull(lower(msg),'')='hello world'
  • Added a new section attribute "Hide SearchBox". If this is checked and the section is in an accordion stack, when the section is selected the visibility of the "Instant Search" box in the page header is changed.
  • Added several new "pagebuilder" methods (desktop/web/mobile):
  • Lianja.get("page1").hideSearchBox()
  • Lianja.get("page1").showSearchBox()
  • Performance, security and stability improvements.
  • Fixed reported bugs.

New in Lianja App Builder 5.3.2 (Aug 20, 2020)

  • Performance, security and stability improvements.
  • Fixed reported bugs.

New in Lianja App Builder 4.2.0 (Jun 20, 2018)

  • Many improvements to Web/Mobile App UI layouts.
  • Various developer productivity improvements:
  • Double clicking on a custom gadget caption or custom gadget webview caption will switch into the script editor without having to navigate the attributes in the App Inspector.
  • Intellisense for Lianja/VFP has been re-engineered and it is now faster and less obtrusive than it was previously.
  • App "Settings" are now embedded as a Tab in the App Inspector.
  • You can now prefix section menus, footer menus and metatypes with + or - in 4.2. you can add an item by prefixing with a + or remove an item by prefixing with a - so now you can add or remove menuitems based on conditional metadata.
  • Section attributes for the grid row height can now be individually specified for Desktop, Web, Phone and Tablet.
  • New lianjarun command for running background/batch jobs. See doc for details.
  • Https://www.lianja.com/doc/index.php/Background_Tasks
  • New lpk() package manager. See forums for details.
  • Https://www.lianja.com/community/showthread.php?4139-Lianja-4-2-package-manager
  • New* Query Builder
  • Https://www.lianja.com/community/showthread.php?4159-Lianja-Custom-Query-Builder-final-touches
  • New* Query Picker
  • This is a combination of data bound "Miller Columns" and a searchable data grid. It is a powerful means of querying tree structured data that dynamically change the items in the columns to the right as you click on a column item. It is data bound and can result in child sections to be refreshed dynamically as the columns selections change.
  • Https://www.lianja.com/community/showthread.php?4182-Lianja-4-2-Query-Picker
  • New* Section right-click context menus across Desktop, Web and Mobile
  • Dialog Buttons on UI fields now operate across Desktop, Web and Mobile
  • Improved input mask handling
  • New * Now supports printing of sections and pages. Pages and sections have a new "Print" icon and a new "Print delegate".
  • Significant Web and Mobile App performance improvements. Release mode now caches static content better than previously.
  • Performance and stability improvements.
  • Fix reported bugs.

New in Lianja App Builder 4.1.0 (Apr 20, 2018)

  • Enhanced grids in Desktop/web/mobile supporting JSON and programmatic dynamic row and dynamic cell background and foreground colors.
  • The following new methods are available for grid sections to handle dynamic row/cell colors:
  • setRowColor(row as numeric, fgcolor as character, bgcolor as character)
  • setItemColor(row as numeric, column as numeric, fgcolor as character, bgcolor as character)
  • You can apply custom colors in the "afterrefresh" delegate of a section. After the grid is loaded the text in the cells of the grid can be referenced using the item(row as numeric, column as numeric) method. Based on the text in the cell you can dynamically adjust the colors.
  • You can also update individual cells using the item(row as numeric, column as numeric, text as character) method.
  • You can now load JSON encoded data directly into a grid section using:
  • setJSON( jsondata as character )
  • Implemented custom "grids" in Web/Mobile custom sections.
  • Various other grid enhancements such as attributes to hide the grid lines and column headers.
  • Grids can now have columns that contain embedded images, embedded memo/varchar, and subforms. For each column you can now specify an optional “Custom editor” delegate and a “Custom display” delegate. The “Custom editor” delegate should return a UI element which typically is a container for sub forms. The “Custom display” delegate can return a container of laid out content or an HTML string. For example, you can embed a chart in a cell when building management information dashboards. Double clicking (or touching in mobile Apps) on a grid cell whitch has a “Custom editor” will switch the cell into editing mode.
  • A subtle change to the way JavaScript methods are called on objects. "this" is now set to the object containing the function. e.g.
  • If the "jsondata" specified is a valid URL starting with http:// or https:// then the data will be fetched from the remote server and then loaded into the grid.
  • If you want to relate JSON grid data to a form section or another grid section you should use setJSON() in the "datachanged" delegate for the parent section.
  • Note also that the JSON should typically be an "array of objects". The member names of the objects are data bound to the grid using the "Data source" of the grid column. This enables data binding so that even if the JSON returned from a web service returns rows (JSON objects) with a lot of members, only those specified in the grid will be displayed. Others will be discarded.
  • Added a new method handleChildEvents(state as boolean) to the "container" class so that mouseenter, mouseleave, click and dblclick events for inner child components are propagated to the container.
  • Added a new core method to all of the UI framework components. The attr(name as character [,value as character]) core method can be used to add or update a CSS attribute for a component. If the CSS attribute is not already specified it will be added to the list of attribute/value pairs in the "css" for the framework component. Alternatively if it is already specified it will be updated. This new method is equivalent to the jQuery attr() method but is functional across desktop/web and mobile Apps.
  • Added evaluate(expr as character) as a method on sections and gadgets. If the section or gadget has an embedded webview you can evaluate() javascript inside the webview to better interact with web components.
  • added a new Lianja method called clipBoard().
  • mproved web/mobile method and properties support for custom classes.
  • Added a new App attribute "CSS libraries" to enable simplified and consistent UI theming.
  • The CSS file is parsed and CSS classes attributes/properties are resolved from this.
  • Multiple CSS libraries can be specified by separating each with ; Prefix with lib:/ to reference libraries in the libraries directory. e.g.
  • lib:/mycsslib.css
  • Note that the following common bootstrap classes are automatically recognized in desktop, web and mobile Apps so you do not need to specify the bootstrap CSS library to use these.
  • To use them just specify them in the "CSS style" attribute or use the addClass("classname") common object method.
  • We recommend using these CSS classes whenever possible to maintain consistency in your Apps.
  • Alerts
  • alert, alert alert-primary, alert alert-secondary, alert alert-success, alert alert-warning, alert alert-danger, alert alert-info, alert alert-light
  • alert alert-dark
  • Badges
  • badge, badge badge-primary, badge badge-secondary, badge badge-success, badge badge-warning, badge badge-danger, badge badge-info
  • badge badge-light, badge badge-dark, badge badge-pill badge-primary, badge badge-pill badge-secondary
  • badge badge-pill badge-success, badge badge-pill badge-warning, badge badge-pill badge-danger, badge badge-pill badge-info
  • badge badge-pill badge-light, badge badge-pill badge-dark
  • Borders
  • border, border border-primary, border border-secondary, border border-success, border border-warning, border border-danger
  • border border-info, border border-light, border border-dark, border-0, border-top-0, border-right-0, border-bottom-0, border-left-0
  • Buttons
  • btn, btn btn-primary, btn btn-secondary, btn btn-success, btn btn-warning, btn btn-danger, btn btn-info, btn btn-light
  • btn btn-dark, btn btn-link, btn btn-sm, btn btn-lg
  • Font Styles
  • font-weight-bold, font-weight-normal, font-weight-light, font-italic
  • Border Styles
  • rounded, rounded-top, rounded-left, rounded-bottom, rounded-right, rounded-circle, rounded-0
  • Text Colors
  • text-primary, text-secondary, text-success, text-danger, text-warning, text-info
  • text-light, text-dark
  • text-blue, text-indigo, text-puple, text-pink, text-red, text-orange, text-yellow, text-green, text-teal, text-cyan, text-white
  • text-gray, text-gray-dark
  • Text Alignment
  • text-left, text-center, text-right
  • Background Colors
  • bg-primary, bg-secondary, bg-success, bg-danger, bg-warning, bg-info
  • bg-light, bg-dark
  • bg-blue, bg-indigo, bg-puple, bg-pink, bg-red, bg-orange, text-yellow, bg-green, bg-teal, bg-cyan, bg-white
  • bg-gray, bg-gray-dark
  • Typography
  • h1, h2, h3, h4, h5, h6
  • Wells
  • well, well well-sm, well well-lg
  • Labels
  • label, label label-default, label label-primary, label label-success, label label-info, label label-warning, label label-danger
  • Add a new core method addClass(classname as character) so the UI can be easier themed. This can be set to any CSS class defined in any of your "CSS libraries" libraries. This is equivalent to the jQuery addClass() method but operates across Desktop, Web and Mobile.
  • Add a new core method removeClass(classname as character) so the UI can be easier themed. This is equivalent to the jQuery removeClass() method but operates across Desktop, Web and Mobile.
  • The "CSS style" attribute can now handle CSS classes defined in your App cssLibs. If you specify a classname e.g. btn-success the "btn-success" CSS class will be looked up in the internal CSS map and the attributes defined in it applied to the UI element. You can specify multiple classes by separating them with a space e.g. btn btn-sm. These are applied from left to right. In other words any attributes to the right overwrite those on the left.
  • Added a new core property "dropshadow" which when set to true draws a drop shadow under and to the right of the component. You can use this to provide a nice visual effect.
  • Added two new events and one new property to the "Form" class.
  • beforeclose()
  • afterclose()
  • accepted
  • When a form is being closed the beforeclose() event is dispatched to the object (any supported scripting language). You can validate the data in the form and reject the "close" operation by setting accepted to false.
  • The afterclose() event is dispatched when the form is closed. In web/mobile apps this is particularly useful as you cannot block execution with a modal form so you can use this event to extract data from the form and then update the UI and possibly change the state of your UI e.g. switch pages or update data on the server.
  • Custom "form" class now also available in Web/Mobile.
  • Custom "webview" class now also available in Web/Mobile.
  • Custom "pageframe" and "page" (Tabs) class now also available in Web/Mobile.
  • Added a new property to the "form" custom class called "mobilefullscreen". To provide a better mobile experience you can set the mobilefullscreen form property to true. This is ignored unless the App is running on a phone. On a phone this maximizes the form into the viewport of the phone and removes the border. Note that you can show the form fullscreen on all devices by setting the "fullscreen" property to true.
  • Audit trails and data security go hand in hand and it is highly desirable that this functionality is built-in. Lianja database timelines provide row versioning for database tables for all CRUD operations performed on data. Whenever a change is made to a table that is timeline enabled then delta changes are automatically recorded for each transaction. Changes made to any tables that are timeline enabled can be undone much like you would undo changes to program code that you edit in a text editor. Database timelines record who did what from where, when did they do it and what did they change. An invaluable feature for SaaS applications.
  • In Lianja 4.1 you can enable timelines globally for a database.
  • alter database yourdatabase metadata "timeline=on"
  • This will enable timelines for all non temporary tables contained within the database. You can disable timelines for individual tables like this:
  • alter table yourtable metadata "timeline=off"
  • Added Babel as a supported scripting language. Babel is a tool for transpiling (compiling) ES6/ES7 code to ECMAScript 5 code, which can be used today in any modern browser. Even more - Babel has extensions for transpiling JSX for React and Flow syntax for static type checking.
  • Babel and its surrounding ecosystem is playing an essential role for today’s modern web applications. Now with Babel fully integrated into Lianja you are ready to start using the latest JavaScript specs and accompanied technologies (JSX, Flow, etc.) from now on.
  • Babel files have a ".esx" extension. You can set the scripting language in your App to "Babel" in the App settings.
  • Any editing changes to the ".esx" file cause it to be automatically transpiled into a ".js" file in the same way a ".ts" TypeScript file is transpiled into a ".js" file.
  • Custom "chart" class now available which wraps the chart gadgets. This can be used in desktop, web and mobile. It can be used very effectively in FormGrid and custom grid cells.
  • Added a new core property "raisedshadow" which when set to true draws a shadow effect around the component. You can use this to provide a nice visual effect.
  • Improved TypeScript integration with the ability to specify TypeScript as a scripting language. TypeScript custom sections and gadgets are now correctly auto-compiled.
  • Added the following new properties to a container which turns it into a GroupBox
  • Added a new property for "container" objects. "borderradius" can be specified in conjunction with "border" to draw a rounded rectangle.
  • Support "jsx" TypeScript/React file compilation.
  • Added a new setStretchFactor() container method to inform the container the relative sizes of each of the UIcontrols inside the container.
  • To better handle a responsive UI you can assign a stretchfactor to each UIcontrol in the layout. So for example if you set the stretchfactor of the first UIcontrol (index 0) to 2 and the others to 1, then the first UIcontrol will be twice the width of the others.
  • setStretchFactor(index as numeric, stretchfactor as numeric)
  • The height and/or width of a custom UIcontrol can now be specified as a percentage. This is equivalent to using setStretchFactor() on the parent container.
  • Upgraded node.js installer to 8.9.1 LTS. This is used internally for PhoneGap, Electron, TypeScript and Babel support.
  • Added a new class to the Lianja Framework "scrollpanel". Use this class to embed a large scrollable UIcontrol e.g. a "container" or an "image". This can be used in desktop, web and mobile.
  • Added support for page/section/formitem alias names. Lianja handles building Apps for multiple form factors using UI Personalities. Using alias names resolves the problem where you want to have a page for phone to be different to the page for web. The "Name" of the page is needed at development time but you may want to have the same name for a "web page" and a "phone page". By defining an "Alias name" for the page/section or formitem, when generating the code for web, tablet, or phone you can exclude certain UI elements and generate the code with known names through alias names.
  • Added some new "Page attributes" to enable some fine styling of the page headers.
  • Header bottom border (headerbottomborder)
  • Header bottom border height (headerbottomborderheight)
  • Header bottom border color (headerbottombordercolor)
  • Added some new "Section attributes" to enable some fine styling of the section headers.
  • Use custom header style (headercustomstyle)
  • Header background color (headerbackcolor)
  • Header foreground color (headerforecolor)
  • Header bottom border (headerbottomborder)
  • Header bottom border height (headerbottomborderheight)
  • Header bottom border color (headerbottombordercolor)
  • Added support for scrollable form and canvas sections. There is a new "Section Attribute" called "Scrollable". Check this and Form/Canvas sections can scroll inside the section viewport. Specify the "Scrollable height" and "Scrollable width" attributes for the Form/Canvas inside the ScrollPanel. If the Form/Canvas is larger than the ScrollPanel scrollBars will automatically be displayed. On Mobile this scrollBar is only visible as you flick up and down inside the Form/Canvas. This new scrollable section functionality can be used to great effect with the new FormGrid layout of a Form section and is particularly useful in mobile Apps due to the limited screen size.
  • Added a new "Page attribute" to enable styling of the "Navigation bar Background color" (Data Navigation Bar at the bottom of a page).
  • Improved the layout of the CommentsView section in mobile Apps.
  • Simplified the theming of Form/Canvas section UI Controls (fields and gadgets) by adding "CSS style" for the "Caption", the "Data" and the "Control". This is very effective when used in the new FormGrid layouts and/or Canvas section UI controls.
  • Added a new "Page attribute" UI Presentation Rule called "Use mobile navigation bar". When generating a phone App if this is checked then a "Material UI" compliant navigation bar is used as the Navigation Bar at the bottom of a page. This mobile navigation bar only has five touchable icons; Add, Delete, Previous, Next, Edit. When Edit is touched and you are editing a form/canvas section then there are only two icons displayed; Save, Cancel. This reduces clutter in the UI and makes it easier to work with on small screens.
  • A small change but useful. While developing an App if any error messages are written to the "Console" Tab in the "App Inspector" the tab text will blink red/black until you select the tab to look at the messages then clear them by pressing the "Clear" icon. THis is a small change to help spot errors during development.
  • Added a new Lianja/VFP command.
  • SET LOCAL ON
  • This causes any variables being created dynamically (when SET STRICT is OFF) to be created as LOCAL variables rather than PRIVATE variables. This protects you from variable scoping issues. When LOCAL is ON the PARAMETER statement is also treated as a LPARAMETER statement.
  • Enhanced "Form" section layout to provide a more compelling UI for Desktop/Web/Mobile Apps using NoCode. The "Form" section can now be defined as having a "FormGrid layout" in the section attributes. When FormItems (Fields, Gadgets and/or Components) are added to a "FormGrid" section, you can specify the cell row/col position within the FormGrid, the number of rows and columns that the cell should occupy and (optionally) a fixed width and height for the cell. The layout engine will then lay the form out adhering to these specifications. With this in place, you can adjust the font and appearance (colors etc) of each individual cell. Additionally, as with grid cells, for each FormItem cell you can now specify an optional “Custom editor” delegate and a “Custom display” delegate. The “Custom editor” delegate should return a UI element which typically is a container for sub forms. The “Custom display” delegate can return a container of laid out content or an HTML string. When navigating data in a form section the formitem is displayed using the “Custom display” delegate. When editing the form section and formitems which have a “Custom editor” delegate render the editor in the formitem cell of the FormGrid.
  • Added two new methods to the "timer" class to simplify its use; start() and stop().
  • Custom "timer" class now available in Web/Mobile.
  • Made a few small Code Editor improvements.
  • Move the mouse over a word while holding the shift key down will highlight that word in the file.
  • Improved CodeAssist popups and variable highlighting by waiting until the "Activation timeout" (App Editor Settings) expires.
  • Improved Web/Mobile HTML5 code generation resulting in improved performance.
  • Improved the "Canvas" visual designer.
  • Drag and drop operation drops at the position you raise the mouse button.
  • The current Tab in the App Inspector stays current after a drop operation.
  • Added "Snap objects to grid" and "Snap objects to grid size" section attributes.
  • Horizontal and Vertical rulers.
  • Crosshairs track x,y position as a UI control is dragged around the canvas.
  • Intellisense improvements.
  • The following section delegates which previously only worked in Desktop Apps now work in Web/Mobile Apps too.
  • initformdefaults
  • beforecreate
  • aftercreate
  • beforeupdate
  • afterupdate
  • beforedelete
  • afterdelete
  • refresh
  • afterrefresh
  • datachanged
  • parentdatachanged
  • Improved the Lianja/VFP debugging experience. Place either of these commands in your Lianja/VFP code (e.g. in a custom delegate) and when executed the Lianja/VFP debugger will be activated. If the debugger command is used the debug tab will be automatically undocked from the App Inspector into its own floating window.
  • debug
  • debugger
  • Improved the JavaScript debugging experience. Place the following command in your JavaScript code (e.g. in a custom delegate) and when it is executed the JavaScript debugger will be activated.
  • debugger
  • Added a new page attribute "Hide navigation history Icons" (hidenavigationhistorybuttons) to hide the navigation history buttons in the page header. THis overrides the setting in app settings if it is checked.
  • The section methods setJSON() and getJSON() now work across desktop/web/mobile.
  • Many improvements to the documentation with a lot of new articles and visual guides. See the documentation wiki for details.
  • Canvas sections can now be traversed in the LOM using .count and .item(n) on the canvas section as documented here.
  • Added Google reCAPTCHA v2 to App Center Login for Web Apps.
  • Lianja/VFP procedure/function/classnames can now be up to 64 characters.
  • Custom page headers. Page headers can now be optionally created by custom code. Use these to display dynamic custom page banners.
  • There are several new page attributes to support this; "Custom header", "Custom header display delegate".
  • Custom page footers. Page footers can now be optionally created by custom code. Use these to display dynamic custom page footers.
  • There is a new attribute attribute to support this; "Custom footer display delegate".
  • Added a new App delegate "Text translator" to handle localization and message translation.
  • Added the ability to login and run a Web App rather than navigate to the App Center. See this forum article for details.
  • Added a new section method called setAllSelected(name, value). You can use this with extensions to apply attributes to all selected UI controls in a Canvas section.
  • In preparation for data mapping in Web/Mobile clients the keyLookup() and sqlLookup() functions have been added to the Lianja Web Framework and also as built-in JavaScript functions in desktop clients.
  • Script Editor improvements.
  • Added a new method called setNamedParameter(name, value) to the Section, CursorAdaptor and Cursor classes. "Named parameters" can be used in desktop/web/mobile Apps to query Virtual Tables which contain ?parameters and {macros}. Default values for named parameters can be specified in the Virtual Table "properties" e.g. "mycvar=hello;mynvar=n:123" etc.
  • Added a new section attribute called "OrderBy". This affects the order in which records are displayed in desktop/web and mobile. It is a dynamic attribute so it can be changed inside delegates. It has no effect on child sections which require a specific record order based the parent->child relationship. Specifying an "OrderBy" will create an index on the specified column if it does not yet exist.
  • Added a new section method reopenTable(). This can be used with VTs to reopen parameterized views. It is available in desktop/web/mobile.
  • Upgraded PhoneGap build to use CLI 8.0.0 (latest).
  • Grids in Web/Mobile now honor the column input mask when displaying data.
  • Grids in Web/Mobile now honor the column alignment when displaying data.
  • Grids in Web/Mobile now handle row dynamic background/foreground colors.
  • Grids in Web/Mobile now handle column dynamic background/foreground colors.
  • Grids in Web/Mobile now handle calculated columns.
  • When positioned on a grid row in Web/Mobile, the current column names of the bound cursor are created as global JavaScript variables. This simplifies validation, calculated fields and other attributes such as dynamic row/column expression evaluation.
  • To simplify watching for directory and/or file changes I have added a new Lianja system method called Lianja.watchFile(filename). There is a corresponding App delegate called "filesystemwatcher" which is called with one argument which is the directory/file that has changed. The method Lianja.unWatchFile(filename) stops watching the file.
  • Custom "listbox" class now also available in Web/Mobile.
  • Added support for ThirdParty Libraries. The "library" workspace now has a category in the files tree "ThirdParty Libs". You can create "New folder..." there and create/edit files in these sub-folders. This provides the ability to package up and distribute third party libraries as lpk files.
  • Support for using external editors. You can now integrate Visual Studio Code to handle editing of specified file types. App Settinngs has some new attributes to enable this functionality.
  • SQL query optimizer improvements.
  • Added a new function reverse( cExp ) which returns the given character expression in reverse character order. This function is useful for creating indexes so that the SQL query optimizer can optimize WHERE column LIKE “%xxx” clauses.
  • Added the Transact-SQL charindex() function.
  • https://docs.microsoft.com/en-us/sql/t-sql/functions/charindex-transact-sql
  • Added the Transact-SQL choose() function.
  • https://docs.microsoft.com/en-us/sql/t-sql/functions/logical-functions-choose-transact-sql
  • Added a new function dataSessionLevel() which returns the stack depth of PUSH/POP DATASESSION.
  • Fixed an issue with the caching of rso files. This is now working correctly resulting in improved performance.
  • Data mapping can now be declared in the data dictionary for a table. If the section attribute "Inherit dictionary rules" is checked then the data dictionary attributes for columns are inherired by Form, Canvas, Grid and Attachment sections. The new "Get data mapping" and "Set data mapping" attributes in the dictionary are now handled by the Lianja Cloud Server also so these are now effective in Web/Mobile Apps. These new column attributes can be declared in the SQL ALTER TABLE statement or in the "Data" workspace column attributes dialog. e.g.
  • ALTER TABLE "order_details" ;
  • MODIFY CONSTRAINT PRODUCTID ;
  • SET GETDATAMAPPING [keylookup("products", "productid",{}, productname)] ;
  • SET SETDATAMAPPING [keylookup("products", "productname", "{}", productid )]
  • Autosuggestions can now be declared in the data dictionary for a table. These new column attributes can be declared in the SQL ALTER TABLE statement or in the "Data" workspace column attributes dialog and they now work across Desktop/Web and are ignored in Mobile Apps e.g.
  • ALTER TABLE "customers" ;
  • MODIFY CONSTRAINT contacttitle ;
  • SET AUTOSUGGESTIONS [select distinct contacttitle,contactname from customers] ;
  • SET AUTOSUGGESTIONHEADERS [Title,Name]
  • The Script Editor can now be themed in the Settings.
  • Added kinetic scrolling support for any scrolling UI element such as grids, scrollarea, tree and listbox. With kinetic scrolling, the user can flick in a given direction and it will continue to scroll in this direction until it is stopped either by the user or by friction.
  • You set the new kineticscrolling property to true to enable Kinetic Scrolling. This provides touch scrolling on touch aware deviced and left mouse button pressed and moved scrolling on non-touch aware devices.
  • The console workspace and the command window now handle VFP-style & macro substitution.
  • Improved LDAP/ Active Directory support.
  • Performance and stability improvements.
  • Fixed various bugs from reported tickets.

New in Lianja App Builder 4.0.0 (Aug 30, 2017)

  • Available for all operating sytems; Windows, Linux and MacOS
  • Provide the Apache plugin mod_lianja for Linux. The IIS extension is already shipping since v1.2.4 for Windows.
  • The section getJSON() and setJSON(data) methods are now available in the Web/Mobile clients for "form", "canvas" and "grid" sections.
  • Fixed a few issues with input masks.
  • When setting up users and their roles and permissions, you can now specify an expiry date for the user. When a user logs in or when an http request is made a check is made for expired users and the login or request is rejected. This provides improved support for subscription based users in a SaaS environment.
  • Performance and stability improvements.
  • Fixed various bugs from reported tickets.

New in Lianja App Builder 3.4.0 (Apr 26, 2017)

  • The version 3.4 release will include
  • Row level security based on authenticated user roles
  • Added a few new commands and functions to assist with row level security
  • Dynamic data masking based on authenticated user roles
  • Added some new helper functions to assist with dynamic data masking
  • Added a graphical MetaData Editor for Database, Tables and Columns. Click the "Edit" icon in the ActionBar to show the MetaData Editor.
  • Extended the MetaData system to handle conditional MetaData that is dynamically applied to sections and formitems when refreshed.
  • Note that setting the "visible" or "enabled" attribute is only applied at runtime. This provides the ability to dynamically change the appearance of sections and formitems depending on the data currently being viewed. All without any special coding being required (NoCode) as attributes can be conditional.
  • Added SYS(2017) for VFP compatibility. Returns a checksum value based on the current record in the current work area. You can use a checksum to test the validity of data. cExpression is a comma separated list of field names to exclude from the checksum. If nFlags is 2 then memos are included in the calculation.
  • The following functions now honor the the STRCOMPARE setting (right trimmed, case insensitive comparisons): inlist(), startsWith(), endsWith(), contains(), indexOf(), substringOf().
  • Added applyMetaData() to the Lianja system object, the pagebuilder object, the section object and the formitem object. You can call these to reapply metadata to sections and formitems across a complete App. It can be used effectively if you want to change the UI appearance while data is being entered interactively by a user. "applymetadata" has also been added to Lianja.showDocument() so that it can be used in inline delegates.
  • Added a new function to assist with testing conditional metadata.
  • New CodeAssistant in the Lianja/VFP script editor. The Lianja CodeAssistant consists of:
  • Intellisense
  • IntelliTips
  • Statement completion
  • Context sensitive statement assistance while typing
  • Code suggestions
  • Function and method parameter hints
  • If you press Ctrl and hover over a command word "Quick Info" for the command will appear as a tooltip
  • If you press Ctrl and hover over a variable the "Quick Info" value of the variable will appear as a tooltip
  • Variable/word hilighting while typing
  • Code snippets
  • Code folding with Code QuickView when mouse hovered over a collapsed code block icon.
  • Auto indenting
  • Code beautifier
  • much more
  • "local" stored procedures are now supported for Virtual Tables. See this forum post for details.
  • Updated versions of node.js, PhoneGap and Electron.
  • Added a new delegate for pages and sections called "afterRefresh". This is called after a "Refresh". It can be used to provide special display formating specific to the context of the data being displayed.
  • Performance and stability improvements.
  • Fix reported bugs.
  • PHP scripting support is deprecated in this release and will be removed in Lianja 4.0.

New in Lianja App Builder 3.3.0 (Feb 16, 2017)

  • The version 3.3 release includes:
  • Enhanced COPY command to support COPY TO ARRAYOFOBJECTS name
  • Implemented VFP SET KEY TO command. Use SET KEY to limit the range of records you can access in a table. The table must be indexed, and the index key value or values you include must be the same data type as the index expression of the master index file or master tag. Issue SET KEY TO without any additional arguments to restore access to all records in the table.
  • Now supports DropDown forms from textBoxes. You typically show these in a "DialogButton delegate" or when an application specific hotkey is pressed:
  • The “Form” class now has a new method called showDropDown(cControlID [, nWidth, nHeight] )
  • cCcontrolID is in the page1.section1.field1 notation and it identifies the UI control that you want to attach the DropDown Form to.
  • The nWidth is the width you want the form to display when it is dropped down. If this is omitted or is zero then the for will adjust to the width of the textBox it is attached to.
  • If nHeight is omitted the default is 250.
  • You can create the form inside a “DialogButton” delegate or in a hotkey delegate if you want to use function keys to drop down pick lists.
  • Hint: add a container to the form and set its layout to “grid” is the easiest way to create a responsive UI form.
  • Added the ability to embed a BROWSE command inside a container.
  • myCont = createObject("Container")
  • select * from customers into cursor mycust
  • myGrid = myCont.browse("BROWSE keywords/columns/etc", "mycust" [, "clickHandler()" [, "dblclickhandler()"]] )
  • You can re-execute the myCont.browse(...) command repeatedly. This causes the BROWSE grid to be replaced by the new BROWSE grid and data in the "alias" cursor. For best results assign a horizontal or vertical layout to the container.
  • You can nest containers inside a "grid" layout applied to a "Form" and then use the myForm.showDropDown(...) method to drop down complex pick lists which have data rendered inside the embedded browse grid.
  • Performance and stability improvements.
  • Fixed various bugs from reported tickets.

New in Lianja App Builder 3.2.0 (Feb 9, 2017)

  • In Lianja 3.2 we have fixed a significant number of bugs that had been reported on tickets. So, although we have added many requested enhancements, the focus of this release is primarily on performance and stability improvements. The Lianja SQL engine is getting faster in each release. In 3.2 we have made significant performance improvements once again with particular emphasis on multi table joins and aggregate processing. Lianja SQL now supports aggregate functions in GROUP BY ... HAVING and also ORDER BY. Query performance is an order of magnitude faster than previous versions and we will continue to fine tune this as we release new versions.
  • Added a new "Hotkey" delegate to "App", "Page" and "Section". This is only called in runtime mode so you need to switch into that mode to test your delegates. The delegate is called with one argument which is the keycode string e.g. "F5", "Ctrl+F5", "Ctrl+Shift+F5". If the current section has a hotkey delegate that is called otherwise if the page has a hotkey delegate that is called otherwise if the app has a hotkey delegate that is called. If the delegate does not handle the key presses then you should return false.
  • Improved and more productive grid editing experience in desktop Apps. When navigating between the records displayed in a grid that is set to "Double Click To Edit", the Return/Enter key now behaves like a double mouse click. If the grid is setup as a split editing grid (Grid and Form), then while editing in the form, pressing Ctrl+W or Esc will exit the form and focus back onto the grid. You can then navigate the grid using the standard keyboard Up/Down keys.
  • Improved embedded HTTP server with improved performance. Providing an API for your desktop Apps is simple using the Lianja embedded HTTP server and this works with all supported scripting languages.
  • Added a new page attribute "Hide hamburger menu icon" providing the ability to hide the hamburger menu icon from the page header at runtime. You can then handle page switching in your App programatically in delegates. For Apps that consist of a single page the hamburger menu icon is not needed and makes for a cleaner UI.
  • Implemented the VFP NODATA keyword on the USE command. When used with Virtual Tables specifies that only the structure of a SQL view is downloaded. The SQL view's data isn't downloaded. NODATA provides the fastest method for determining a SQL view's structure.
  • The App Builder and the App Center now always use UTF-8 character encoding unless you explicitly specify a --CODEPAGE or specify --NOUTF8 as a command line switch.
  • Lianja UI States provide you with a powerful mechanism for handling complex business processes using a UI State machine which is built into Lianja. Each UI element (App, Page, Section and FormItem) can contain (an optional) comma separated list of "States" that the UI element responds to. In Lianja 3.2 we have added a new delegate called stateChanged(cState) which is called whenever a UI State is changed
  • Many SQL engine enhancements with improvements to the query optimizer as well as improvements to aggregate function processing with GROUP BY and ORDER BY on joined tables.
  • Added a new function sqlParams( string ) : string. This function substitutes SQL parameter markers and returns a character string. When executed with a cursor selected that is a Virtual Table, the format of date types (e.g. datetime) for the target database type (e.g. MSSQL) is honored.
  • In runtime mode, when a user clicks the "Hamburger Menu icon", only those pages that the user has permission to read are included in the menu.
  • The "ODBC" tab in the "Console" workspace when selected now causes all typed commands to be sent to the remote database server.
  • Various Virtual Table performance optimizations.
  • Performance and stability improvements.
  • Fixed various bugs from reported tickets.

New in Lianja App Builder 3.0 (Aug 12, 2016)

  • This release provides major functionality, productivity (MetaTypes with multiple inheritance) and performance improvements (Deferred page loading, Virtual Table fetch as needed, Native LianjaSQL engine) to Lianja overall and is a recommended upgrade for all users. The App Builder IDE has been redesigned with an emphasis on developer productivity.
  • The version 3.0 release includes:
  • Fixed an issue which prevented unicode table names and column names being used.
  • convertutf8 now automatically converts column names and descriptions from codepage data to utf8.
  • Added two new functions des3_encrypt(cExp1, cExp2 [, cExp3, cExp4] ) and des3_decrypt(cExp1, cExp2 [, cExp3, cExp4] ) which can be used to des3 encrypt and decrypt any character data. When the data is encypted it is base64 encoded and base64 decoded when decrypted.
  • Many script editor improvements (Right click for context menu).
  • New layout for the pages menu in the HeaderBar. It now uses a "hamburger menu" so that it can handle a lot more pages. See this forum post for details.
  • Added the ability to control the visibility of the left and right sidebars.
  • Lianja.showDocument("page:page1?action=showleftsidebar")
  • Lianja.showDocument("page:page1?action=hideleftsidebar")
  • Lianja.showDocument("page:page1?action=toggleleftsidebar")
  • Lianja.showDocument("page:page1?action=showrightsidebar")
  • Lianja.showDocument("page:page1?action=hiderightsidebar")
  • Lianja.showDocument("page:page1?action=togglerightsidebar")
  • Fixed an issue with DECLARE DLL C functions being called with parameters passed by reference using @variable syntax.
  • Added in height and width as exposed properties on the section object in desktop, web and mobile. Access these using:
  • Lianja.get('page1.section1').width
  • Lianja.get('page1.section1').height
  • Fixed up the top, left, bottom and right (absolute positioning) properties to work in the same way as their CSS counterparts on custom/canvas UI elements to provide a more responsive UI for custom/canvas sections.
  • Added a 'resized' delegate on canvas and custom sections (section attributes dialog) so you can detect when the section is resized and adjust the geometry of the UI components contained within it accordingly.
  • Fixed a compiler parser bug when referencing nested objects within subobjects.
  • Added --codepage as a synonym to the --locale command line switch.
  • Added SET CODEPAGE TO "value" so that the codepage can be changed inside the config file or the init of an application. The codepages supported are:
  • Big5
  • Big5-HKSCS
  • CP949
  • EUC-JP
  • EUC-KR
  • GB18030
  • HP-ROMAN8
  • IBM 850
  • IBM 866
  • IBM 874
  • ISO 2022-JP
  • ISO 8859-1 to 10
  • ISO 8859-13 to 16
  • Iscii-Bng, Dev, Gjr, Knd, Mlm, Ori, Pnj, Tlg, and Tml
  • KOI8-R
  • KOI8-U
  • Macintosh
  • Shift-JIS
  • TIS-620
  • TSCII
  • UTF-8
  • UTF-16
  • UTF-16BE
  • UTF-16LE
  • UTF-32
  • UTF-32BE
  • UTF-32LE
  • Windows-1250 to 1258
  • We strongly recommend that you use utf-8 at all times.
  • Added SET CODEPAGEDATA TO "value" so that the codepage for data can be changed inside the config file or the init of an application. The codepages supported are:
  • Big5
  • Big5-HKSCS
  • CP949
  • EUC-JP
  • EUC-KR
  • GB18030
  • HP-ROMAN8
  • IBM 850
  • IBM 866
  • IBM 874
  • ISO 2022-JP
  • ISO 8859-1 to 10
  • ISO 8859-13 to 16
  • Iscii-Bng, Dev, Gjr, Knd, Mlm, Ori, Pnj, Tlg, and Tml
  • KOI8-R
  • KOI8-U
  • Macintosh
  • Shift-JIS
  • TIS-620
  • TSCII
  • UTF-8
  • UTF-16
  • UTF-16BE
  • UTF-16LE
  • UTF-32
  • UTF-32BE
  • UTF-32LE
  • Windows-1250 to 1258
  • We strongly recommend that you use utf-8 at all times.
  • When generating the code for a Mobile Phone the left sidebar, right sidebar and searchpanel are ignored to provide for a more responsive UI from a single codebase.
  • Added a new attribute called "Meta Types" in the page, section, and formitem attributes. This should be a comma separated list of MetaType names. You create "Meta Types" using the new "Meta Type Editor". Meta types are applied to Apps when they are loaded. For example, based on the meta types specified for a section you could set its header and footer menus and the delegate that handles actions performed on these menus. You can reference this attribute using the name metatypes and set it dynamically if required.
  • New MetaDataBuilder API. See this blog article for details. This functionality is only available in the Lianja APaaS Developer edition.
  • Added a new "VideoPlayer" section and class (which you can use in custom sections) in v2.1.
  • It currently has the following methods.
  • play()
  • stop()
  • pause()
  • hideOpen()
  • hideControls()
  • + core methods.
  • and the following properties.
  • url as character
  • volume as numeric
  • position as numeric
  • + core properties
  • It is currently for desktop apps only.
  • You can assign a url or bind its data source (control source) to a character column containing a url or filename.
  • You can get a reference to the "videoplayer" in a section like this:
  • ovp = Lianja.get("page1.section1").videoplayer
  • Note that to use the "VideoPlayer" you will need to install the K-lite codecs from here.
  • Added LCASE(), UCASE() and MID() as function name synonyms for LOWER(), UPPER() and SUBSTR() respectively.
  • Fixed some issues with require() and require_once() JavaScript module loading in the Web/Mobile client and changed the implementation in the desktop client to be compatible with node.js module loading.
  • var mylib = require_once("this_file_is_in_the_app_directory.js");
  • var mylib2 = require_once("lib:/this_file_is_in_the_library_directory.js");
  • // example file in "this_file_is_in_the_app_directory.js"
  • function func1()
  • function func2()
  • module.exports = {}:
  • module.exports.func1 = func1;
  • module.exports.func2 = func2;
  • now you can call these functions like this:
  • mylib.func1();
  • mylib.func2();
  • Fixed an issue with Lianja.evaluateJavaScript() for calling server-side JavaScript functions.
  • Added several new functions to simplify working with MetaData and MetaType key/value pairs. This representation can be used as an alternative to JSON format and is much smaller.
  • // create an object from a metadata string
  • obj = metadata_decode("name=barry;company=Lianja;amount=10")
  • // encode a string from an object representing metadata
  • str = metadata_encode( obj )
  • // Create an object from a metadata string
  • obj = metadata_decode("[type1]name=barry;backcolor=red;[type2]name=bill;backcolor=pink")
  • // Extract the attributes for a given metatype in a metadata string
  • str = metadata_findtype("type1", "[type1]name=barry;backcolor=red;[type2]name=bill;backcolor=pink")
  • Enhanced the XML parsing xquery() functions and added some new ones; xquery_open(), xquery_node(), xquery_select(), xquery_attributes(), xquery_decode() and xquery_close(). See this blog article for details. These functions can now be used to read XML documents of any reasonable size and XML element attributes are also now handled.
  • Improved the built-in desktop http server which exposes an HTTP API in desktop apps.
  • - Added support for a Runtime Http port into the App Settings.
  • - Added support for specifying an apikey=value in the URI. This must match the apikey that is specified in the App Settings.
  • Added a new MetaType Editor. You create "MetaTypes" (which are essentially class definitions) for Pages, Sections or FormItems using the "Meta Type Editor". You can edit these "Meta Types" in the "Projects" or "App" workspace. The "Meta Type Editor" is a dialog similar in operation to the App Inspector as it stays on top of the UI as you are designing your App pages. You can add/edit "Meta Types" and "Apply" the changes against your App as you design/develop it. Each UI element: Pages, Sections or FormItems can have a list of "Meta Types" specified. Unlike a "Class Editor" (or similar that you may be familiar with) this provides the ability to handle multiple inheritance of attributes and delegates in a scripting language independent manner. These "Meta Types" are applied when an App is loaded. If you are building Web and/or mobile Apps you then need to deploy your apps. If you are building desktop apps the "Meta Types" are applied dynamically when the app is loaded. "Meta Types" are stored in a new sub-directory called c:lianjametatypes and each file is named like this: projectname.metatypes. You can override this name in the app settings on an app by app basis if required. The default file name however will be projectname.metatypes if you have a project open or appname.metatypes if you have no project open but have an App open. Note that you can select a "Type" in the MetaType Editor then drag it onto a page, section or formitem to add it to the "Meta Types" for that UI element. This functionality is only enabled in the Lianja APaaS Developer edition.
  • Added a new page attribute called "Deferred load". If this is checked then data is not loaded into the associated page until the page is activated and becomes the current page. So in other words, the loading of the page with data and the refresh of this data does not occur for hidden pages until they are first activated. By default "Deferred load" is off. Bear in mind that if you check this on the data in the page will not be accessible until the page has been activated at least once. In many cases this is acceptable. This speeds up App load time quite significantly when an App consists of a large number of pages. Also note that there is a "Deferred Load" attribute in the App Settings that forces all pages in an App to handle deferred loading. Additionally, you can specify --deferredload or --nodeferredload as a command line switch on your desktop shortcut without the requirement to modify an App. By default in Lianja v2.1 "Deferred page loading" is on. To disable it specify --nodeferredload as a command line switch on the Lianja App Builder or the Lianja App Center.
  • Added two new methods on Pages, Sections and FormItems (fields and gadgets). These are setAttribute(name, value) and getAttribute(name). These methods handle all attributes as documented and described in the MetaType Editor. Note that there are shortened forms of these also, setAttr(name,value) and getAttr(name) respectively. These are available to all supported scripting languages.
  • App Inspector improvements including display of elapsed time between messages logged in the Events tab.
  • Major App loading performance improvement with load times being displayed in the App Inspector Events tab.
  • Major performance improvement when opening Virtual Tables. Rows are now "fetched as needed" rather than preloading all rows when the VT is opened. The "fetchsize" property determines how many rows are fetched. By default this is 100. Setting it to 0 or setting the "fetchasneeded" property to 0 disables this functionality.
  • To speed up Virtual Table queries you can now specify "dbtype=xxx" in the VT PROPERTIES where xxx is MSSQL2016, MSSQL2014, MSSQL2012, MSSQL2010, MSSQL2008, MSSQL, MYSQL, POSTGRES, LIANJA, VFP, SQLLITE, MSACCESS or ORACLE. This tells Lianja that you know the type of database so it will not use heuristics to determine the database type.
  • If you are using MSSQL2012 Virtual Tables and you do not want Lianja to use the new OFFSET ... FETCH NEXT clauses (in favor of the older OVER clause) then specify "nosupportsoffset=1" in the VT PROPERTIES.
  • If you want to disable the SQL command mangling that is required to handle pagination of the resultset returned from a SQL SELECT then specify "pagination=0" in the VT PROPERTIES.
  • To assist in debugging individual Virtual Table CRUD operations you can specify "debug=1" in the VT PROPERTIES.
  • Made a small change when editing "Field" captions using inline editing of a form section. In previous versions of Lianja unless you had disabled "Inherit dictionary rules" the caption would resort to the "Description" in the data dictionary for the table when the App was loaded. This confused some developers so in v2.1 you can edit these captions inline now as there is a new attribute "Inherit dictionary caption" which is disabled if you edit the caption inline.
  • Added several new section attributes for grid and attachment sections to handle dynamic grid row colors dependent on an expression. This is similar to dynamic cell colors for grid columns but affects the whole grid row. It is particularly useful when a grid is being refreshed at intervals and you want to hilite certain rows.
  • Honor the "Pagination" attribute setting for grids in the web/mobile client so all rows fetched are loaded into the grid if pagination and auto pagination is off.
  • New command SET EXPLAIN ON. When this is ON all SQL SELECT commands executed output their EXPLAIN execution plan to the console.
  • Much improved execution plan output from SQL EXPLAIN to assist in tuning SQL SELECTs.
  • Major performance improvements of SQL SELECTs on shared network drives.
  • SQL SELECT statements now honor the transaction isolation levels correctly. The following isolation level is recommended when querying data from a shared network drive. SET TRANSACTION ISOLATION LEVEL REPEATABLE READ. This places shared(read) locks on the tables in the query which enables client side caching that results in a major performance improvement. The default transaction isolation level is UNCOMMITTED. These isolation levels are compatible with MSSQL transaction isolation levels.
  • Added the smartquery and nosmartquery optional keywords to SQL SELECT to enable/disable SMARTQUERY caching on a statement by statement basis.
  • Added a new command line switch for the App Builder --appinspector which causes the App Inspector to be shown whenever the "Pages" workspace is selected.
  • You can now deploy Apps in the "Deploy" workspace while an App is open.
  • Added two new commands PUSH DATASESSION and POP DATASESSION. These operate in the same way as SAVE and RESTORE DATASESSION but enable pushing and popping data session state (database, tables, and cursor state) up to 256 levels deep.
  • In Virtual Table definitions you can now specify "nodata=1" in the VT PROPERTIES. This causes the VT queries to return no data unless a "filter" is specified. It is particularly useful for Web and Mobile Apps. Desktop Apps can specify a WHERE condition on the USE command to perform queries against the Virtual Table e.g.
  • use vt_customers where accountBalance > 5000
  • New Quick Deploy icon in the Pages, Apps and Library workspaces. Quick Deploy speeds up the iterative Develop, Deploy and Share process by deploying directly from the Page Builder without the need to switch workspaces. To perform a Quick Deploy you first need to select the "Deploy" workspace and choose the files that you want to deploy. After that you can perform a Quick Deploy by clicking on its icon in the HeaderBar.
  • Fixed a few issues with PhoneGap LiveView.
  • The iOS StatusBar area is now taken into consideration in PhoneGap LiveView.
  • Improved Web/Mobile responsive UI layouts when Web/Mobile Apps are generated.
  • Added a new field attribute (in the Field Attributes Dialog):
  • "Ignore update after change" (MetaTypeEditor attribute ignoreUpdateAfterChange)
  • After data is edited the 'Change' delegate only is called which is assumed to update the field. No internal update or validation is performed. This provides the ability to handle custom search/autosuggestion logic in the App for this field.
  • PhoneGap Build templates (used when generating files to upload to the PhoneGap Build service) have been updated to use PhoneGap Build cli-6.3.0 which is the latest version at the time of writing this. You can also now specify an alternate PhoneGap version to build with in the PhoneGap settings.
  • Lianja Mobile Apps now allow you to navigate the records in your apps using the familiar left, right, up and down "swipe" gestures. Swipe Left navigates to the next record, Swipe Right navigates to the previous record, Swipe Up goes to the last record and Swipe Down goes to the first record. These gestures are only effective in Form, Canvas and Custom sections. You can override this behavior by enabling gestures in the section attributes and write your own gesture delegate (which may me specified using the inline delegate syntax). Note also that navigation swipe gestures are not available if you have enabled "Swipe Navigation" is the page attributes. If you have enabled "Swipe Navigation" in the page attributes, then Swipe Left and Swipe Right navigates between the next and previous pages in the App. Swipe navigation is also available in TabPanel sections.Swiping Left and Right navigates between the different Tabs.
  • PhoneGap Apps built in Lianja can now optionally use CrossWalk to improve performance up to 10x from the standard Android and iOS WebViews. Other than a performance improvement, CrossWalk also provides a consistent UI on all supported versions of Android and your apps are unaffected by Android updates that could break something. Crosswalk optimization is optional but recommended on both Android and iOS.
  • A small change. If the debug files are empty after running an application they are deleted, so if you wonder why they are not being generated its because there was nothing in them.
  • Made some small changes in the PhoneGap workspace:
  • - Username and password for PhoneGap Build can be "Remembered" between sessions now.
  • - "Configuration" ComboBox has been moved below "Username/Password/Remember me". This ComboBox is populated after you open a project or create a new configuration. After selecting a configuration the "PhoneGap Build Service" tab is automatically selected. Every click saved is important in developer productivity!
  • Changed the layout of the "Users" workspace and the "PhoneGap" workspace so that they are more responsive and layout correctly on low resolution displays.
  • Added a new method on the Lianja system object.
  • Lianja.showPagesMenu()
  • This is the same as clicking or touching the pages "Hamburger" menu icon. It is most useful in conjunction with gestures in mobile Apps.
  • The equivalent Lianja.showDocument("showpagesmenu") can also be used.
  • When generating code for Android devices, the mobile App now handles touching of the "menubutton" (if your device has one) which will now slide in the pages menu.
  • The App Builder now has a flatter and more simplistic UI appearance overall.
  • Various editor UI improvements.
  • When you run the App Builder it will now restore the previous development session. It will open the previously opened App and all of the editor files are re-opened then positioned on the last line selected. This can be disabled in the App "Settings". If you have any problems opening an App just start the App Builder with --reset on the command line.
  • The App Builder now has a standard MenuBar at the top of the window. In earlier versions a context menu was used but this was found to be less intuitive for many to find.
  • Impoved editing productivity by opening the editor advanced panel and refreshing the tasks, procs and events which are shared across all editor tabs. This makes it much easier to navigate to all the procs and classes in different files within an App by just double clicking on rows in the grids.
  • The App Builder now uses standard/native host operating system dialogs whenever appropriate.
  • Added a new attribute to sections called metadataversion. You can get/set this in the setupUI hook when applying your own MetaData. See this article for details.
  • Added a new method setupUI() to pages and sections. You should call this in the setupUI hook when applying new MetaData. See this article for an example.
  • New Attributes Tab (for the current page, section, and selected formitem) in the App Inspector. The App Inspector stays on top of the pagebuilder in development mode so you can change attributes without having to slide in the Attribute Dialogs. This provides a more productive visual development experience.
  • Attributes in the slide-in Attribute Dialogs and in the App Inspector are displayed in grouped categories with a ComboBox at the top providing quicker access to attributes in a specific category e.g. All (the default), Appearance, Menu, Footer, Data, Delegates etc.
  • Switching between workspaces now automatically hides the App Inspector and the Web, Tablet and Phone App views.
  • Added several new methods to the Lianja system object in desktop to allow managing of the internal http server connections. Note that the default port is 8002 for the App Builder and 8003 for the App Center.
  • Lianja.startHttpServer( [optional port number ] )
  • Lianja.pauseHttpServer()
  • Lianja.resumeHttpServer()
  • Lianja.stopHttpServer()
  • The App Inspector is now dockable into the Main Window. From the MenuBar choose "Window|Dock Windows" to dock it and "Window|Side by Side Windows" to undock it and arrange the App Inspector window on the left and the Main Window on the right. See this forum post for a screenshot.
  • Upgraded node.js (included in the distribution) to LTS v4.4.7 (includes npm 2.15.8).
  • Double-clicking an editor tab will detach the editor into its own floating window which can be dragged out of the main window for those of you who prefer editing with multiple displays. Double-clicking the titlebar of the editor window will attach it back into the tabs. Once a window is floating the "Window" menu has a list of editing windows at the bottom of it enabling quick access to raise the editing window into the foreground. As with all script editors in Lianja the "Advanced" tabs which contain search results, procs, functions, todo lists and classes are all kept in sync across all the tabs and floating windows.
  • Now includes Git integration. See this announcement of the Lianja developer community forums.
  • Now includes LiveCode editing in the editor and the debugger for Lianja/VFP. Move the mouse cursor over a variable/field name to see its datatype and value. You can toggle this functionality on and off by pressing Ctrl+/. Note that if the cursor is over an object.property the value of that property will be displayed. The tooltip displayed for each variable/field/object.property includes the datatype, width, decimal places and current value.
  • Attributes in the App Inspector are now searchable. Click the top row of the Attributes grid and repeatedly press the first letter of the attribute you want to search and the attributes starting with that letter will be selected one by one.
  • Hot Backup and Restore of Apps and Databases while developing in the App Builder. Use "Apps | Backup App", "Apps | Restore App", "Database | Backup Database", "Database | Restore Database" in the MenuBar. There is no need to close the App or Database to perform these operations.
  • Pressing F1 help while editing now auto detects the command / function() being typed and displays the associated documentation page from the Lianja Documentation Wiki. You can provide your own custom help by specifying the "Help Provider Homepage URL" and the "Help Provider Search URL" in the App Settings. Use {keyword} in the search URL which will be substituted for you. Note that function names always have () postfixed to them, while commands do not.
  • For all you VFP die-hards we have added a "Command Window" that sits on top of all of the workspaces while in development mode. The visibility and geometry of this is saved and restored when you restart.
  • Many Lianja/VFP debugger improvements including "Edit Code" (A button in the ActionBar) and, to assist in tracking down hard to find bugs, the debugger will be triggerred when an error occurs.
  • Now includes a JavaScript debugger. This will be triggered when an error occurs in any of your JavaScript delegates, when you choose "Debug..." from the "Program" menu (or ModeBar button) and choose a JavaScript file, or when a debug() function call is encountered in any JavaScript code. Note that debug() is a noop in the Web/Mobile clients.
  • Added a new attribute to Fields and Columns "Hidden at runtime". This is effective in desktop/web/mobile and can be used to hide certain fields in a form or grid that you may need but do not want the users to see e.g. a primary key field which is needed to be defined for Virtual Tables so that Update and Delete operations can be performed.
  • The choicelist attribute for fields and grid columns can now be specified as a macro expression "{myproc('arg',...}" that will be expanded in desktop, web and mobile.
  • The following new commands can be used from the "Command Window CLI" to speed up development for those of you who prefer to use a CLI.
  • open/create/modify/close/delete project/app/application [filename]
  • create page [pagename]
  • list databases
  • list tables
  • list apps
  • list projects
  • modify command [filename]
  • modify file [filename.ext]
  • modify library [filename]
  • help
  • help commandName
  • help functionName()
  • "Help" is now integrated into the "Command Window CLI" for Lianja/VFP, Python, PHP and JavaScript.
  • Added database event hooks dbc_insert, dbc_delete, dbc_update, dbc_library. These can be used to provide audit trails and also perform data mapping. See this forum post for details. You can enable|disable database events with SET DBCEVENTS ON|OFF.
  • Performance and stability improvements.
  • Fixed various reported bugs.

New in Lianja App Builder 2.0 (Nov 17, 2015)

  • This is a major upgrade. The App Builder has been upgraded to the very latest version of Qt (5.5) providing a much faster and snappier user experience particularly in WebViews which can now be debugged using the Web Inspector by right clicking on them and setting breakpoints and watchpoints. This latest version of WebKit is a lot faster and provides much better HTML5/CSS3 compliance than the older versions.
  • New "CommentsView" section (similar to facebook commenting) that can be related to a parent section. (useful for CRM-like collaboration on records displayed in a DataView).
  • New "DocumentView" section. Display PDF files without any plugins required.
  • New animated "GalleryView" section.
  • Fixed an issue with sqlexec() calls that execute stored procedures. This did not affect Virtual Tables just the sqlexec() function.
  • Fixed touch issues in the App Center and Page Center.
  • The App Builder and the Lianja runtime (App Center) now have a built-in web server running internally. This provides you with the ability to write web services (or a management console) that can provide information from a running application. See this forum article for details. These web services can be written in Lianja/VFP, JavaScript, PHP or Python. This provides the ability for all desktop apps to provide an API .
  • New "sharedmemory" class.
  • New "systemsemaphore" class.
  • New "httpserver" class. Embed a custom web server into your App that listens for requests on a port of your choice to expose information by web services. Desktop App only
  • New strConv(cExpr[,codepage]) function that converts a codepage encoded character expression to its UTF-8 equivalent.
  • Lianja.sessionStorage is now shared in real-time across all running Lianja processes. You can now share data across multiple desktop windows and background worker processes that have no UI. There is a new delegate "Session data changed" in the App Settings that is called when sessionStorage data changes.
  • New Mobile-ready CarouselView section
  • New Mobile-ready CatalogView section
  • New Mobile-ready GalleryView section
  • Fixed an issue with SMARTQUERY (SET SMARTQUERY ON) in SQL on Windows which was not using the SQL resultset cache correctly. This is now working as expected with much improved performance.
  • New CONVERTUTF8 DATABASE name [CODEPAGE id] command
  • New CONVERTUTF8 TABLE name [CODEPAGE id] command
  • New CONVERTUTF8 APP name [CODEPAGE id] command
  • New CONVERTUTF8 FILE name [CODEPAGE id] command
  • ODBC Driver improvements to work properly with Crystal Reports
  • New SELECT * FROM table INTO ARRAYOFOBJECTS aobj to generate a one dimensional array of objects that represent rows in a table. This array can be given to json_encode() to generate a JSON encoded array of objects.
  • New LianjaWebFramework function called Lianja.evaluateJavaScript() for calling server-side JavaScript code. Note that the Google V8 JavaScript engine is embedded into the Lianja Cloud Server so this is the same JavaScript engine that is used in node.js. This provides you with the ability to write end-to-end JavaScript code on the client and server and generate dynamic pages with .jssp pages also.
  • Added several additional "Page defaults" attributes in the App settings to help speedup visual design by removing the repetitive tasks of hiding the left and right sidebars and various icons from the page headerbar.
  • Node.js is now included in the distribution. This is used by the phonegap live app view which is currently under development.
  • Fixed an ODBC driver issue
  • Added SELECT * FROM table INTO ARRAYOFOBJECTS CONSOLE which outputs a JSON array of objects directly in one command. You can use this effectively in custom Data Web Services written in Lianja/VFP .rsp pages.
  • Added a new SQL command TRUNCATE TABLE tablename [IF EXISTS]. This is the equivalent of USE tablename followed by ZAP.
  • SET STRCOMPARE ON is now on by default in the App Builder and the runtime App Center. This is now consistent across Lianja desktop Apps, Lianja Cloud Server, and Lianja SQL Server.
  • SQL JSON data type (using CREATE TABLE tablename (data json)) with native SQL support (INSERT, SELECT, UPDATE, DELETE) for JSON data stored in single columns of tables.
  • The Lianja.evaluate() method in the Web/Mobile client now handles the ability to call business procedures that are contained within custom libraries on the server. To call a procedure in a library prefix the procedure name with the library name followed by ::
  • In Web and Mobile Apps you can now call server-side functions written in Lianja/VFP or JavaScript directly from the Web client JavaScript code. See this article on the forums for details.
  • Fixed an issue where the CSS on a canvas field was not being included in the Web/Mobile App if the CSS was being read from a file rather than just an inline CSS declaration.
  • Integration with the Adobe PhoneGap build service (in the "PhoneGap" workspace) to package up mobile apps, upload them to the build service and build installable Android and iOS Apps that can be submitted to the Apple App Store and Google Play.
  • New responsive UI Mobile CalendarView section.
  • New responsive UI Mobile GridView section.
  • New responsive UI Mobile CommentsView section.
  • Added some new methods to the Lianja system object in the LianjaWebFrameWork. Some of these provide an abstraction above PhoneGap and will only function when run on a mobile device.
  • Added some new functions to Lianja/VFP which can be used in .rsp pages and/or server-side procedures called from a mobile device.
  • The following new Lianja system object methods render as platform specific native UI when called on mobile devices.
  • The following new methods on the Lianja system object can be called to determine if your App is running on a mobile device.
  • Touching an editable image gadget now displays the photo gallery (or camera) on mobile devices where the user can choose an existing photo or take a new photo with the camera. This new photo is automatically uploaded and replaces the one in the database column on the server. This is all handled by data binding with no coding being required
  • The following sections are now working on mobile devices in the same way as they work in Web Apps and can now be used in PhoneGap Apps
  • When building a PhoneGap mobile App in Lianja you build a database-oriented business App that you submit to the Apple App Store or Google Play. If you check the "Login required" attribute in the App Settings, Lianja looks for a page in the App which is a "Login Page" (new attribute in the Page Settings). This becomes the first page to be made visible when you run the App on a mobile device. If no "Login Page" is found then Lianja will create a default one for you that you use to sign in. Once authenticated, the "Initial Page" (as defined in the App Settings) is made visible. To logout and return to the "Login Page" touch the "Home" icon in the page headerbar.
  • Many improvements and optimizations to page/section layouts to provide a better appearance on mobile devices.
  • Integrated support for building and testing Lianja PhoneGap mobile Apps for phones and tablets. You develop your Apps locally then see the changes instantly on your mobile device (iOS, Android and WinPhone). There is no need to re-sign, re-compile, or reinstall your app to test your code as Lianja App Builder integrates in with the Adobe PhoneGap Developer App which is a free download for iOS (Apple App Store), Android (Google Play) and Windows Phone (Windows Phone App Store). Running the Adobe Developer App on your mobile device and entering the IP address of the machine that Lianja App Builder is running on, you will see your app on the mobile device changing dynamically as you develop it visually in Lianja. There is no need to install any SDK or other software (everything is included in Lianja APaaS Developer) and you can develop and test iOS, Android and WinPhone Apps on any of the operating systems that Lianja APaaS Developer runs on. Additionally, as you change the visual appearance and/or code of your App in the Lianja App Builder, the mobile app will instantly show your latest changes. With access to device APIs not available in web browsers, you don't have to sacrifice the confidence that your app will work as you intended on the devices you are targeting.
  • Added a new page attribute "Auto layout sections" and a new section attribute "Auto layout percent". This provides for a more responsive UI on mobile devices as the sections on a page will be automatically adjusted to a height which is a percentage of the viewport size rather than a fixed value. If the section attribute "Auto layout percent" is left at the default value of 0 then the sections on a page are all made equal height. This may not provide the desired effect when the device orientation is changed to landscape mode, in which case you should use presentation rules to hide various sections in landscape and only show them in portrait mode.
  • Fixed an issue with two-phase commit in SQL transactions which was broken due to some internal caching issues.
  • Fixed an issue with SQLEXEC() when it was being used to perform multiple SQL queries on the same connection where the database connection was being disconnected incorrectly if the same cursor name was being used for each SQLEXEC() command execution.
  • Improved ODBC connection pooling for Virtual Tables.
  • Fixed an issue closing ODBC connections that are pooled and have no active connections. The "keepalive" and "ttl" (time to live) are now honored properly and the connection closed once the 'ttl' grace period expires.
  • Performance and stability improvements.
  • Fixed various reported tickets.

New in Lianja App Builder 1.5 (Nov 17, 2015)

  • Enhanced CatalogView section with "Custom library", "Tile producer" and pagination
  • Added a new CarouselView section
  • Added a new PanelView section
  • Added --tenancy x:\ (or LIANJA_TENANCY environment variable) to simplify App Center sharing Apps, Library and Data on a LAN
  • The navigation panel can now be dynamically generated by a custom .rsp or .jssp page. Set the "Data source" for the "Navigation panel" in the page attributes to the name of the .rsp or .jssp file
  • Now supports a custom section menu panel that can be dynamically generated by a custom .rsp or .jssp page. Set the "Custom menu panel" to the name of a .rsp or .jssp page in section attributes "Menu" panel. This provides the ability to use modern bootstrap or jQuery mobile dropdown menus in all types of Apps; Desktop, Web and Mobile
  • "Stretch last section" on a page now expands the previous section to fill available space if the last section has a fixed height specified
  • Performance and stability improvements
  • Fixed various bugs from reported tickets

New in Lianja App Builder 1.4.1 (Nov 17, 2015)

  • Performance and stability improvements
  • Fixed various bugs from reported tickets

New in Lianja App Builder 1.4 (Nov 17, 2015)

  • Search panels can now be used in Canvas sections
  • New "Query Page" pages attribute. When this is checked no data is displayed in the page until a search panel query is applied, a filter is applied or instant search is used
  • Added a new command line switch to the desktop runtime client --runtimedatadir to be able to specify the shared LAN directory where databases reside. You can alternatively set the environment variable LIANJA_RUNTIMEDATADIR. Note that when a "runtimedatadir" is specified then --networkshare is also implied and turned on
  • Added "Create Local Virtual Tables" to the database context menu. This causes a virtual table (name prefixed with vt_) to be created in the database for each native table and its connection string is set to "local"
  • Added a new "PhoneGap" workspace in preparation for the v2.0 release
  • Added Lianja.showDocument("back:") and Lianja.showDocument("forward:") in desktop/web/mobile to navigate between pages in the history
  • Added $format=csv $format=ado and $format=excel as output data format types for odata queries
  • Added a new "TreeView" section type
  • Enhanced the page "Navigation Panel" so that the "Data source" may be a .rsp or a .jssp page e.g. lib:/treeview.rsp. See the example_jqueryui sample App to see how to specify this
  • Added several new example Apps
  • Minor UI improvements
  • Further SQL optimizer performance improvements
  • Performance and stability improvements
  • Fixed various bugs from reported tickets

New in Lianja App Builder 1.3 (Nov 17, 2015)

  • Improved COM/ActiveX support for subobjects that were not being returned correctly with certain ActiveX components.
  • new STR_ESCAPE() function
  • new command; SET STRCOMPARE ON|OFF
  • 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 hierarchy". 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; "minimum", "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 workspaces. Additionally the "Home" workspace 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 simplify traversal 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.

New in Lianja App Builder 1.2.4 (Nov 17, 2015)

  • Fixed an issue with the "Readonly when" UI presentation rules which were not disabling the pages, sections and fields correctly.
  • Added support for dynamic roles and permissions. These override the static roles specified in an app,page.section,field and are assigned when a user authenticates. They are only effective in runtime mode. These permissions are maintained in the system!sysperms table and are setup in the "Users" workspace.
  • Fixed an issue whereby the "Click delegate" in the calendar section was not being called correctly when the delegate was written in JavaScript. This issue was in desktop and web apps.
  • Fixed an issue which caused the "EditBox" UI element to incorrectly return rich text rather than plain text.
  • Fixed an issue whereby a right click on a "CommandButton" was also calling the "Click" delegate afterwards.
  • Added the "Lianja Page Center". See this forum post for details.
  • Added a new section attribute "Apply rules on parent data change". This causes the UI presentation rules to be evaluated dynamically as you navigate data in the parent section. You can therefore hide/show other related sections based on the data that is being displayed in the parent section. Note that when the UI presentation rules are applied the "Visible When" and "Readonly When" conditions are evaluated. This is only effective in runtime mode.
  • Added the ability to dynamically sort the data displayed in a grid by clicking on the grid column headers. This is implemented in both desktop and web clients. There is a new grid section attribute "Sortable" which you can check to enable this on a grid.
  • Added "RightToLeft" as a caption position in Form and Canvas sections for both desktop and web to better support RTL languages such as Arabic.
  • Fixed an issue which was causing COM/ActiveX controls not to be destroyed when the object variable was destroyed.
  • Fixed an issue where "UI Presentation Rules" were not being applied correctly inside "TabView" sections.
  • Enhanced the "Choicelist" SQL SELECT processing. if you prefix the SELECT statement with a + then a blank entry will be added at the top of the list of items if the column count is one. This allows the user to reset the bound data contents and also enables selection of a choice list item when there is only one record returned from the SQL SELECT.
  • The icon specified for an App tile is now deployed automatically and displayed in an App Center tile in both desktop and Web. Note that the optimum size for an App tile icon is 96x96.
  • SQL Optimizer improvements.
  • Enhanced sqlLookup() so that the first parameter "table" can be qualified by the "database" e.g. "southwind!customers". This provides the ability to use it in client-side validation in the Web/Mobile clients. Be sure to create an index on the specified column that is being queried so that the optimizer can do its job properly.
  • Included over 1500 "Modern" icons in the library\icons directory. These can be used as the icons for App Center tiles and Page Center tiles. You reference them like this in the attributes lib:/icons/name.png.
  • The system!sysroles table now includes a column for the "Name" of a user which can be used when emailing then. This new column will automatically be added to the sysroles table when you run the App Builder. You will then need to "Deploy" the "System" database to be able to use it.
  • Now includes an additional example App for registering users through a Web App. This App demonstrates how to build a client form using a Canvas section that calls server-side procedures that serialize and pass data between the Web/Mobile client and the Cloud Server.
  • Improved the layout of "Inline gadgets" in Form sections.
  • Improved the handling of non-editable choicelists and ComboBoxes.
  • Fixed various tickets.

New in Lianja App Builder 1.2.3 (Nov 17, 2015)

  • Fixed an issue editing scripts that contain Unicode/UTF-8 characters for Chinese, Japanese, Korean, Russian character sets. You don't need this update if you aren't editing scripts containing these characters in your scripts.

New in Lianja App Builder 1.2.2 (Nov 17, 2015)

  • Fixed a crash when SQLLOOKUP() has a syntax error in the SQL SELECT.
  • Fixed a random crash when an .rsp page fails to compile under certain conditions.
  • Fixed an issue where data was not being saved correctly as utf-8 in databases when --locale utf-8 was specified. Now, if the locale is utf-8 the data stored is in utf-8 format in both web and desktop to maintain the correct collating sequence for indexes.
  • Fixed an issue generating HTML5 web apps with foreign character sets which were used as TabView captions.
  • Added a dynamic "Where condition" attribute to sections. This can be used with Virtual Tables that have been created as SELECT * FROM table WHERE 1=0. The where condition can contain {...} macros to reference values from other sections or variables. This provides for a much faster user experience when working with very large external database tables. You can reference the "where" attribute using Lianja.get("page1.section1").where = "condition" or Lianja.showDocument("page: page1.section1?action=where&text=condition").
  • requery() is now supported in JavaScript cursors for Virtual Tables.
  • Fixed an issue using the Microsoft VFP ODBC driver with Virtual Tables that have logical fields.
  • Fixed various tickets.

New in Lianja App Builder 1.2.1 (Nov 17, 2015)

  • Enhanced Calendar sections to provide the ability to dynamically set the background color for the days and the type of events within each day that are displayed in the calendar.
  • Automatically detect locale for Chinese, Japanese, Korean, Russian, Indian, Arabic and other languages and use UTF-8 if --locale is not specified on the command line switches. This is the best character encoding to use for apps that contain multiple languages as it is used by web browsers as well so data can be shared across desktop and web/mobile apps. Note that you need to install language fonts for these characters to be displayed if you are on a computer that is not in the language locale. In Windows you do this through the control panel.
  • Added the following VFP functions to handle Unicode/UTF-8 character processing. You can now use the following functions with Chinese, Japanese, Korean etc character strings. LENC(), LEFTC(), RIGHTC(), AT_C(), RAT_C(), SUBSTRC(), CHRTRANC(), STUFFC().
  • Improved UI fonts and graphics rendering on the Mac.
  • Added a new command line switch --networkshare which simplifies the sharing of databases hosted on a linux server that are shared between windows clients and linux clients. SET NETWORKSHARE ON is the equivalent if you need to do this in code.
  • Added a new function DIFFOBJ(obj1, obj2) that compares two objects which have the same property names and returns an object containing only the members that are different.
  • Enhanced the Lianja/VFP SCATTER command with a new keyword OLDVALUES that places the old buffer values into an object that can be compared with DIFFOBJ() to return an object containing only the changed field values. e.g. SCATTER OLDVALUES NAME m_oldvalues.
  • Fixed a memory buffer overflow when importing large ODBC data sources containing Unicode characters.
  • Added a new gadget "EditBox" in form sections for editing plain text with no HTML formatting.
  • Various performance improvements when using Virtual Tables.
  • Added a new "Quick Start Guide" dialog when the App Builder is first run. You can disable this in the dialog and view it again from the "View" menu. This is primarily to assist new developers to better understand how to build Apps in a Lianja.
  • Added the username() function into JavaScript for desktop and Web Clients.
  • Fixed various bugs from reported tickets.

New in Lianja App Builder 1.2 (Nov 17, 2015)

  • Added several new command line switches that can be used with the Lianja App Center: --rdp, --kiosk, --customer name, --loginapp appname, --splashscreen none.
  • Fixed a layout issue with the "Visible when" presentation rule for fields in form sections that have gadgets in them.
  • Added new "presentation rules" for Grid columns; Desktop, Web, Tablet, Phone. Unchecking any of these will hide the columns when displayed on the respective device.
  • Added new "presentation rule" for Grid columns "Display orientation" which can set set to "Always", "Portrait" or "Landscape". On a tablet or phone as the device orientation changes then UI elements can be hidden or shown to provide a more responsive UI.
  • Added a new "Page/Section/Field" attribute called "Apply rules". If this is checked then when navigating between records or when editing interactively all the "Visible when" and "Readonly when" UI Presentation Rules for the page (and it's sections and fields) containing the field are applied. This functionality is only active in runtime mode.
  • Double clicking the "Page header" now slides in the "Page attributes" dialog just as double clicking the "Section header" slides in the "Section attributes".
  • Now supports macro substitution up to three levels deep using {expression}, {{expression}} and {{{expression}}} which can nested. Macros are evaluated inside out from left to right starting with {{{...}}} followed by {{...}} then finally {...}.
  • Fixed an issue where section custom search panels were not being displayed correctly when the delegate to generate them was edited in a custom library.
  • The captions for the fields/gadgets in form sections can now contain {...} macro expressions. They are re-evaluated and refreshed whenever the section is refreshed or when a field is changed interactively that has the "Recalc" atttribute checked.
  • The captions for the fields/gadgets in form sections can now be formatted with html. This includes html tables which can be used very effectively to display summary information for the active record displayed in the section Inside subtitles.
  • Added getJSON() as a method on pages and sections to return a JSON formatted string. This has the same functionality as the getJSON() method that is available in the LianjaWebFramework.
  • Added a new attribute to the App Settings "Runtime database". This provides the ability to develop an App against "local" Virtual Tables (you can import these into a development database) and then when the App is generated as an HTML5 JavaScript Web/Mobile App the runtime database is used in production.
  • Added a new attribute in the App Settings "Build mode". When generating the HTML5 JavaScript Web/Mobile App if "Release" is selected then the LianjaWebFramework is included into the client compressed and minified for production deployment. You should select "Debug" when developing and testing your Apps so that you can open the Web Inspector and use the JavaScript console and debugger.
  • Added the json_encode(object) and json_decode(jsonstring) functions into Desktop JavaScript.
  • Added the following new methods to the page and section object that is returned from Lianja.get():
  • add()
  • delete()
  • refresh()
  • first()
  • previous()
  • next()
  • last()
  • edit() / editmode()
  • save()
  • cancel()
  • applyRules()
  • These correspond to the actions that can be given to showDocument() but do not change the active page, they merely perform the action on the hidden page.
  • Added additional information in the "Events" Tab of the App Inspector. Specifically, you can now see when "refresh" of pages, sections and gadgets is occurring to assist in performance tuning of your Apps.
  • Performance improvements with related parent/child grids.
  • Added a new attribute to the "Calendar" section "Readonly" which hides the form at the top of the calendar and displays the calendar in readonly mode. This provides the ability to place a custom/canvas section above the calendar to provide better customization. You would typically enter events in your canvas section and have some buttons that perform CRUD operations in a table then you would refresh() the calendar section to display the new events.
  • Page header captions can now contain {...} macros which are refreshed as you navigate between records.
  • Added Lianja.lockscreen to the Lianja system object to disable then re-enable screen updating.
  • Lianja.lockscreen = 1 // disables screen updates
  • Lianja.lockscreen = 0 // enables screen updates
  • Added a new SQLLOOKUP() function. This operates in a similar way to the KEYLOOKUP() function but uses SQL SELECT so the table specified does not have to be open. The function will autodetect if the specified table is a native Lianja table or a Virtual Table and act accordingly. It can be used to perform cross-table lookups in validation or data mapping. The arguments are as follows:
  • result = sqlLookup(cTable, cKeyField, cKeyValue, cResultExpr, cNotfoundExpr)
  • cTable as a character expression to specify the table to be queried (native or Virtual Table).
  • cKeyField is a character expression to specify the column in the table to be queried.
  • cKeyValue is a character expression containing the value to be compared against cKeyField. If this is a character field then enclose it in "'somevalue'". If it is a numeric then enclose it like this "1".
  • cResultExpr is a character expression to specify what to be returned from the query. This can include LianjaVFP functions as it is evaluated against the record returned from the query.
  • cNotFoundExpr is a character expression that will be evaluated and returned if no record was found that matches the query.
  • The current state of all active cursors is saved and restored automatically so that you can query tables that are already open.
  • cKeyField has some special ways in how it can be specified above and beyond what is described above.
  • If cKeyField is a valid where clause (starts with "where ") then that will be used as the where condition for the SQL SELECT statement that is executed.
  • If cKeyField is a SQL SELECT statement (starts with "select ") then that will be used as the complete SQL SELECT statement that is executed.
  • Fixed an issue editing the time portion of a datetime field.
  • The Lianja App Builder APaaS Developer license now supports up to 50 concurrent cloud connections (previously was only 10). This enables local and remote users to connect in to the Lianja Cloud Server (which you install alongside the Lianja App Builder on the same machine) and use up to 50 connections which equates to 8-10 users.
  • Added special keys in development mode for fast switching between the various workspaces:
  • Ctrl+F1 Home
  • Ctrl+F2 Apps
  • Ctrl+F3 Data
  • Ctrl+F4 Pages
  • Ctrl+F5 Library
  • Ctrl+F6 Tools
  • Ctrl+F7 Versions
  • Ctrl+F8 Console
  • Ctrl+F9 Users
  • Ctrl+F10 Deploy
  • Fixed an issue where LianjaVFP triggers that were created for Virtual Tables were not being called correctly.
  • Fixed an issue whereby the data dictionary for a Virtual Table was being removed when the Virtual Table was closed.
  • New App Wizard when creating a new App.
  • Fix various bugs from reported tickets.

New in Lianja App Builder 1.1.6 (Nov 17, 2015)

  • Fixed an issue whereby empty dates were displayed correctly as "None" but the popup calendar was not defaulting to the current date.
  • Exposed some new methods on the "Grid" to make it easier to customize its operation; save(), cancel(), add(), delete(), first(), previous(), next(), last() and refresh(). Additionally, the "filter" property can now be get/set in custom code.
  • Added support for App "Themes". These are in c:\lianja\themes on Windows. You can create custom themes and apply the theme to all pages/sections at any time. The Lianja.theme property also provides the ability to change the theme at runtime so users can adjust the theme to their personal preference.
  • The App Inspector now includes a trace in the "Events" tab when Lianja.showDocument() is called by custom code or inline delegates. This has been added to assist in debugging so you can better see what is going on "behind the scenes".
  • Fixed various bugs from reported tickets.

New in Lianja App Builder 1.1.5 (Nov 17, 2015)

  • Fixed an issue with layout of the Script Editor on low resolution displays with small font settings
  • Fixed various bugs from reported tickets

New in Lianja App Builder 1.1.4 (Nov 17, 2015)

  • Added some new "Input masks". "Alphabetic", "Upper Case", "Upper Case Alphabetic".
  • Fixed an issue activating a "Standard Edition License".
  • Fixed an issue changing the "Caption width" in a Canvas section control.
  • Enhanced "Section footer menus" to support Buttons. e.g. #Save,Cancel will center the two buttons in the section footer.
  • Fixed various bugs from reported tickets.

New in Lianja App Builder 1.1.3 (Nov 17, 2015)

  • Added a new "Initial UI state" attribute for App, Page, Section and Field. When an App is switched into runtime view the initial UI state is applied. This provides the ability to design the App visually and hide various UI elements until they need to be shown.
  • New "Custom Actions" for pages. These can be optionally specified in the page attributes. This enables you to call app specific business procedures that handle the page actions (Add, Delete, Refresh, First, Previous, Next, Last, Save, Cancel) when you navigate data (by clicking buttons in the Action Bar or when you call Lianja.showDocument() ) and you want to handle these programmatically.
  • Script editor performance improvements on large files.
  • Improved color syntax highlighting in the script editor.
  • Added popup "IntelliTips" (intellisense-like functionality) as you type in the script editor.
  • Added a new attribute to App settings, "Initial Page". If specified the specified page is selected when the App is switched into runtime mode.
  • Fixed a few issues that were reported when importing VFP tables into Lianja.
  • Made a few minor UI changes e.g. The "Data" panel tabs for Database,Tables,Procs, and Events are grouped together to avoid confusion. The "Advanced" section in the App,Page,Section and Field attributes is now labeled as "Custom Delegates".
  • Added a progressbar when importing large ODBC databases to provide feedback as to the progress of the import.
  • Added a "Change" delegate for pages. When any data is edited in a field the "Change" delegate for the field is called (if present) then this calls the "Change" delegate for the section (if present) then this calls the "Change" delegate for the page (if present).
  • Added the VFP sys(2007, expC) function.
  • Added CRC32( expC ) to calculate the CRC32 of the given expression. Use CRC32(RTOS()) to calculate a CRC32 checksum of the current record.
  • Fixed an issue importing large MSSQL tables with large varchar columns.
  • Added the ability to display form fields and grid columns as hyperlinks. There is a new LinkClick delegate that is called with the controlsource and the text value of the field as arguments when the hyperlink is clicked (or touched).
  • Added the ability to display grid cells as Buttons. When the button is clicked the LinkClick delegate is called with controlsource,text just as a hyperlink delegate is called.
  • Added the ability to display grid cells as "Custom controls".
  • Added "Insert Before" and "Insert After" to the right-click context menu in the grid column headers.
  • Performance improvements.
  • Added the ability to "Total" grid columns as a summary row at the bottom of grid sections. The "Summary" attribute in the grid section attributes can be checked on and then you can specify what columns should be totaled in the grid column attributes (double click on a grid column header). You can optionally specify an expression (a function call) that will be called to calculate the value to be displayed.
  • Made a small change to the requery() method in the CursorAdaptor (for use with Virtual Tables). If you requery("limit 20,50") then you can paginate the data from the remote data source (if the remote database engine supports the LIMIT clause; MySQL, Lianja and PostgreSQL do, MSSQL does not). This allows you to specify an empty Virtual Table using WHERE 1=0 and provides you with the ability to handle data retrieval manually in the "Ready" delegate or from your own UI buttons in your Apps.
  • Fixed various bugs from reported tickets.

New in Lianja App Builder 1.1.1 (Nov 17, 2015)

  • Fixed various bugs from reported tickets.

New in Lianja App Builder 1.1 (Nov 17, 2015)

  • BROWSE/Grid big data performance improvements with automatic grid pagination.
  • Added the ability to programmatically switch in and out of fullscreen mode using Lianja.fullscreen = 1 or Lianja.fullscreen = 0 respectively.
  • Added a new icon to the header bar in the "Apps" and "Library" workspace to "Deploy this file to the cloud directory". This provides a way to do a quick change on a file and deploy it.
  • Added "Tablet App View" and "Phone App View" icon to the header bar. These together with the "Web App View" allow you to view how the App looks in a desktop web browser, Tablet and phone. Each "View" is live against your development data just as the Desktop App runtime View operates. There is also a "Mobile Tools Bar" down the left hand side of each view with a variety of icons that can be clicked to perform view specific operations such as "Refresh", "Save", "Orientation", "Preview" and at the bottom a "Settings" icon for configuring the App specific to that view. More to come.
  • Added "Debug" support for "Web", "Tablet", and "Phone" Apps. Just click the "Debug" icon in the "Tool Bar" on the left of the view to popup a Web Inspector which includes a DOM inspector and a JavaScript debugger.
  • Added the ability to hide the icon in the page header bar for web/tablet/phone Apps. This can be set to "Default", "None" or "Custom" in the App settings.
  • Added new page attribute "Stretch last section min height". On low resolution devices (e.g. phones) if the "Stretch last section" is checked and the section height is less that the "Stretch last section min height" then the section height is set to the specified value and the page automatically becomes scrollable.
  • Added new documentation tiles "jQuery Mobile" and "PhoneGap".
  • Added a new attribute for Grid sections "Show logicals as CheckBoxes". The default is to display a CheckBox for logical/boolean values in the grid.
  • Automatic HTML5 and JavaScript code generation of the Lianja Mobile Client for an App specifically tailored for phones with a small real estate.
  • Added some new UI Presentation Rules to the Page, Section and Field attributes dialog. You can now specify the UI element (page, section, field or gadget) to be included in the HTML5 JavaScript client depending on "Desktop", "Web", "Tablet" or "Phone". This simplifies the building of one app that will run on all devices.
  • New "Search Panel" that can render a custom search form specific to a section. This is shown when the search icon is clicked for a section. There are also some new actions on showDocument() to hide and show the search panel underneath the section header. These are action=showsearchpanel, action=hidesearchpanel and action=togglesearchpanel. Just specify these on Lianja.showDocument("page.section?action=togglesearchpanel"). If you specify "Auto create" in the search panel section attributes then the search form will be created automatically based on the "Search panel fields" in a form and also in a grid. This provides the ability to query subsets of data to view without having to write any code. This will be made available in desktop, web, tablet and phone apps.
  • Added some new properties to the "Container" class. border, borderWidth, borderColor, borderTop, borderTopHeight, borderTopColor, borderBottom, borderBottomHeight, borderBottomColor, borderLeft, borderLeftWidth, borderLeftColor, borderRight, borderRightWidth, borderRightColor, borderInset.
  • Added "Build a Desktop installer" for packaging up desktop runtime apps for deployment. This is now integrated into the "Deploy" workspace.
  • Added some new attributes to "Grid Gadgets" allowing the OK/Cancel and/or the ActionBar to be hidden.
  • Added an optional third parameter to "NetworkRequest" class postData() method which is a filename that the result from the HTPP request will be written into.
  • Made various enhancements to the "Deploy" workspace to simplify deployment of Desktop, Web and Mobile Apps.
  • Fixed an issue when trying to run the debugger with no App open and/or no custom libraries specified.
  • Fixed a random issue with MySQL int columns when the MySQL ODBC driver was not behaving as expected.
  • Added an additional (optional) parameter to postUrl() which will allow you to specify a filename where the result sent back from the remote HTTP server is stored.
  • The following functions have been enhanced to now handle JavaScript (.js files), PHP (.php files) and Python (.py files) in addition to their original functionality. This makes it easier to integrate existing JavaScript, PHP or Python libraries in with Lianja/VFP code and call functions in them using the execJavaScript(), execPHP() and execPython() functions respectively.
  • loadLibrary( filename )
  • require( filename )
  • require_once( filename )
  • Added two new functions to simplify querying XML data (strings or files containing XML). These are based on XQuery syntax. XQuery is designed to query XML data and XML files.
  • result = xquery( string, path, occurrence)
  • result = xquery_file( filename, path, occurrence)
  • These currently only handle paths such as /tag/subtag/subsubtag... but they will be extended later to include proper querying as per the XQuery standard. You can iterate through an XML file in a loop which increments "occurrence". An empty string is returned when there are no more occurrences. If you do not specify a path in the /tag/subtag/... notation then the contents of the specified XML tag will be returned. These functions are particularly useful when reading XML data from web services using geturl() or the "NetworkRequest" class.
  • The GETFILE(), PUTFILE() and GETDIR() functions now use the native functions on Windows providing a more consistent user experience on Windows 7 and Windows 8. Linux and Mac already used the native functions in v1.0.
  • The Lianja APaaS Developer edition license now allows remote Lianja Cloud Server connections (up to 10 connections) so that Web, Tablet and Phone Apps can be tested properly. In v1.0 the APaaS Developer license restricted Lianja Cloud Server connections to local connections only.
  • Added a new "Subtitle" to sections. This can be made visible in the section attributes. There are also attributes for specifying its height, background color, foreground color, font and caption. It is displayed just above the section contents beneath the menu and search panel. If you specify "Hide header" to hide the section header at runtime you can arrange the sections out with nice subtitles which provides a better user experience.
  • Improved page scrolling for pages that have many sections and do not "Stretch Last Section". The mouse wheel (or swiping up and down on a tablet) correctly scrolls now.
  • Added a new attribute in the page attributes "Full page edit". This causes all sections on a page to be edited when the "Edit" tool button is clicked in the navigation bar (at the bottom) or the page is switched into edit mode using Lianja.showDocument("page":page1?action=edit"). This provides for a better user experience when a page is laid out in multiple sections and you want to edit the complete "DataView" as opposed to just the main form section that has the "Search Key" field defined.
  • Fixed an issue with GETDIR() not selecting the given directory correctly.
  • Fixed an issue with Lianja.spawnApp( filename ) not running Lianja/VFP (.prg) files correctly.
  • Fixed an issue whereby runtime deployment required the .prg source files in a few places. Now you just need to package up the .dbo object files that are generated by the compiler.
  • Added support for SET XMLTYPE TO EXCEL and COPY TO TYPE XML on the Mac. This is already available on Windows and Linux.
  • Added a new grid attribute "Alternating row colors" to allow turning these off if required. This is in the grid section attributes dialog.
  • Added a new function execRSP( page.rsp, outputfile.html) that will execute a Lianja/VFP server page (.rsp file) and send its output to the specified html file. This can be used effectively for generating HTML reports that can be emailed using the built-in email functions.
  • Added a new function execJSSP( page.jssp, outputfile.html) that will execute a JavaScript server page (.rsp file) and send its output to the specified html file. This can be used effectively for generating HTML reports that can be emailed using the built-in email functions.
  • When deploying files through the "Deploy" workspace, if the object file does not exist it is now automatically compiled.
  • Added printPreview() as a new method on the WebView class. This operates similar to print() (and takes the same arguments) but displays a print preview dialog first allowing you to change settings before printing.
  • Simplified layout for the "Data", "Apps", and "Pages" workspaces for improved usability on low resolution devices.
  • Added two new grid column attributes "Dynamic backcolor" and "Dynamic forecolor". These can be simple expressions or can call functions in custom libraries. For example, if you want to display all negative values with a "red" background and a "yellow" foreground you could just specify the following simple expressions for the dynamic cell backcolor and dynamic cell forecolor respectively. Note the use of the {} macro that always substitutes the "current item value". Hint: you can also use the icase() built-in function if you want to have varying colors depending upon the current cell value.
  • iif( val("{}") < 0, "red", "")
  • iif( val("{}") < 0, "yellow", "")
  • Added the ability to exclude specific grid columns from being "striped" when the grid has "Stripe alternate rows" enabled.
  • Added a new grid column attribute "Recalculate". When data is entered into a grid cell interactively any readonly or calculated grid columns on that row are automatically recalculated and re-displayed. This is typically used to calculate totals e.g. if you have three columns; Quantity,Price,Cost and "Cost" is calculated by quantity*price, then as you change either quantity or price the "Cost" column in the grid row will be recalculated.
  • Added a new field (form and canvas sections) attribute "Recalculate". When data is entered into a field interactively any readonly or calculated fields are automatically recalculated and re-displayed. This is typically used to calculate totals e.g. if you have three columns; Quantity,Price,Cost and "Cost" is calculated by quantity*price, then as you change either quantity or price the "Cost" field will be recalculated and refreshed.
  • Fixed an issue displaying and editing numeric grid columns which have input masks.
  • Added a new grid column attribute "Text alignment" which allows for control over how data is displayed in grid columns. Set this to "Left" if you want to align CheckBoxes in a small column width.
  • Added the ability to set a grid column to be a fixed width in the grid column attributes.
  • Added a new "Timer" delegate to sections (in the attributes). If the "Refresh Interval" is specified and a timer delegate exists it will be called rather than just refreshing the section. This is only active in runtime mode. It is particularly useful for refreshing dynamic content in Canvas and WebView sections at given intervals. This is implemented in Desktop, Web and Mobile.
  • Improved "Input masks" in Forms and Grids. Numeric pictures e.g. 999,999,999,999.99 or @C2 correctly display with the thousands separators and provide better field editing.
  • Added "Input mask type" to formitem and grid column attributes; Custom (the default), "Currency", "Date", "Email address", "Number", "Text", "Time".
  • The "fontsize" property on all objects can now take either a numeric size (as previously) or you can use the CSS font-size string values; "small", "medium", "large", "x-large", "xx-large". These are particularly useful when designing responsive web and mobile apps.
  • Added the "right" and "bottom" properties in all UI components. These are particularly useful when building responsive UI canvas and custom sections in JavaScript for tablets and phones. So rather than set the geometry of the UI control using left,top,width and height if you use left,top,right and bottom the control will adjust its size on different devices or orientation changes on a tablet or phone.
  • Added a new method the Lianja System Object; Lianja.getCursor( aliasname ) that returns a "Cursor" object that can be used from any of the supported scripting languages.
  • Fixed various bugs from reported tickets.

New in Lianja App Builder 1.0.0 RC 1 (Dec 11, 2012)

  • New global "Storage Locations" attributes in the "Settings" dialog providing the ability to store Apps, Data, Libraries and Templates in Dropbox, SkyDrive or Google Drive directories for all Apps developed. See this article on the forums for details.
  • New global "Runtime directory" in the "Settings" dialog for deploying shared Apps, Data and Libraries for access from the Lianja App Center without interfering with App development.
  • New "Deploy" workspace for deploying Apps, Data and Libraries to the "team/cloud" directories which end users access via the "Lianja App Center".
  • New separate Lianja App Center installers for all platforms that work against the "team/cloud" Apps, Data and Library runtime directories. (Hybrid Desktop/Cloud runtime clients). You develop Apps using the Lianja App Builder then "Deploy" on a LAN or into the Cloud against the Lianja Cloud Server (when available). You will find two installers for each platform in the downloads area on our website; LianjaAppBuilder and LianjaAppCenter.
  • Added support for exporting data directly into Microsoft Excel XML format on all platforms. There are two ways to do this. The NoSQL way and the SQL way.
  • Added "Autosuggestions" as an attribute on form/canvas fields. See this article in the forums for details. AutoSuggestions can be simple comma separated lists or they can be a complex SQL SELECT. When more than one column is selected from a SQL SELECT then the AutoSuggestions are presented as a dropdown grid beneath the textbox that they are associated with. You can customize the headings for the grid and also what column to filter the suggestions on as well as what column to select and place in the textbox when a row in the grid is selected.
  • Extended the Lianja database engine adding support for "onAfterInsert", "onAfterUpdate" and "onAfterDelete" table level triggers. Additionally, the existing "onInsert", "onUpdate" and "onDelete" triggers have been synonymed as "onBeforeInsert", "onBeforeUpdate" and "onBeforeDelete" which better describes their purpose.
  • Fixed an issue accessing database tables with data dictionaries between 32-bit and 64-bit platforms.
  • Added some new menu actions in the "Apps" workspace files panel to "Import a VFP project (.pjx)...", "Import a VFP Form (.scx)...", "Import a VFP library (.vcx)...". You can drag and drop VFP projects, forms and class libraries already but this makes it more obvious to developers new to Lianja.
  • Fixed some issues importing VFP project, form and class libraries.
  • Fixed an issue where the data navigation buttons in the data navigation bar were being disabled incorrectly when a link was clicked in the left sidebar.
  • Fixed an issue where the "DataChanged" delegate was being called after a form section was refreshed instead of before. This prevented expressions and variables that were bound to fields from being displayed correctly.
  • Added some new attributes to the "page" attributes that allow you to display a custom footer at the bottom of a page. The custom footer content producer can be written in any of the supported scripting languages. You can also generate the content using .rsp pages which can incorporate JavaScript libraries such as jQuery, Knockout.js, Bootstrap or others of your choice. You can also specify a "Refresh Interval" for the content which causes it to be regenerated and its contents refreshed.
  • Fixed an issue where the custom right sidebar gadget was not refreshing its contents correctly when a "Refresh Interval" was specified.
  • Added customizable UI theming for pages, sections and all UI controls.
  • Dragging an object column onto a blank area of a page now automatically creates an ImageStrip section.
  • Dragging a varchar/memo column onto a blank area of a page now automatically creates an HTML5 editor.
  • Added the Visual FoxPro TEXTMERGE() function for improved compatability.
  • Added a new function KEYLOOKUP(table|alias, tagname, keyExpr, valueExpr) that can be used to lookup keys in a table/index and return the "valueExpr" as a transformation of the specified "keyExpr". This can be used as a Controlsource to map numeric key values to their descriptive text values. The current record position in the specified "alias" cursor is not moved so this function can safely be used in SQL queries also. This function can also be used quite effectively in a NoSQL key/value pair scenario to retrieve JSON or XML "objects" that can be deserialized using the built-in JSON_DECODE() and XML_DECODE() functions in Lianja. If the specified "alias" is not already open then Lianja will open the table automaticaly.
  • Added a new attribute to fields in form sections "Refresh calculated when changed". This causes all calculated fields (Data Source using { } or expressions) to be re-evaluated and refreshed when data is interactively edited in the field. You can use this in conjunction with KEYLOOKUP( ) to display textual descriptions for numeric values in your form sections. e.g. display the description for a customer underneath the numeric customerid.
  • Improvements to the SQL optimizer.
  • Overall NoSQL perfomance improvements.
  • Added a new function TIMELINE( [alias|workarea] ) that returns the status of database timelines for the specified cursor.
  • Added a new section attribute "Timelines enabled" to allow enabling database timelines for a specific section.
  • Added a new icon in the "Pages" workspace headerbar that allows a quick "Reload" of an App without having to close it then re-select it from the App Center.
  • Improved integration of database "timeline" sections. You should find it much easier to work with timeline sections now. we've allowed you to have a timeline section on a page and you can specify the table to "watch" in the section attributes. If you put a "Refresh interval" on the section (be sensible 10-60 seconds is ample) you can watch the changes as they occur on the data as a realtime feed.
  • Fixed various reported bugs.