Lianja Development Roadmap Revision History

PDF Print E-mail

The following represents an overview of the main features that have already been completed by the Lianja Development Team. 

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

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

Revision History

Beta1

Release date 10-Jan-2011

  • Initial beta

Beta2

Release date 6-Jun-2011


Beta3

Release date 4-Oct-2011

  • Visual Custom Section Builder with "Event Delegate" scripting in all supported scripting languages.
  • Custom scripting libraries.
  • Expose the Lianja Application Object Model (LOM) to scripting similar to HTML5 DOM.
  • Provide the ability for custom scripting code to call JavaScript functions that are embedded in HTML5 web pages inside WebView sections.
  • Application publisher.
  • Drag 'n' drop VFP database tables from file explorer into a Lianja database container (converts table, memo, cdx automatically)
  • New "Report" section.
  • New "Library" workspace for sharing code between Apps.
  • New "Users" workspace for administering users and roles.
  • Improved full-screen kiosk mode. Run your apps in full screen kiosk mode on all Windows, Linux and Mac.
  • Permissions for Apps, Pages, Sections and Fields dependent on user roles.
  • New "InfoPanel" with "Video Tutorials" to guide new users on how to use the App Builder.
  • Many UI improvements.
  • Improved accordion style page layouts.
  • Improved collapsible page sidebars.
  • Additional page and section attributes.
  • Various VFP language compatibility improvements as requested by beta testers e.g. ADD OBJECT handled better.
  • User selectable "Search fields" in form sections. Now instant search works across multiple keyed fields.
  • Optional "Login Panel" in the left sidebar of all pages.
  • Force user authentication when App is run in App Settings by checking the "Authentication required" attribute. Works across desktop, web and mobile apps. Single sign-on across all Apps.
  • Fix reported bugs.

Beta3 R1

Release date 5-Oct-2011

  • Fixed an issue where the default directory was not being set on startup correctly to the user's home directory which required elevated permissions.

Beta4

Release date 18-Nov-2011

  • Completed "Account Login" with Lianja App Center presented after login.
  • New "App Center" presented to authenticated users. Apps available depend on "User Roles" of the authenticated user. Works across Desktop and Web.
  • Added Author, Version and Description attributes to app attributes so that these can be displayed in the tiles of the Lianja App Center.
  • Added "Publish App" attribute to allow App to be published/unpublished during development.
  • Completed "Users" workspace for managing users, roles and permissions.
  • PHP embedded in the App Builder as an additional scripting language for Lianja Apps. The App Builder now supports Visual FoxPro, Python, JavaScript and PHP.
  • Form/Grid section cascade delete attribute.
  • Various code editor improvements e.g. edit webview sections by clicking on the "keyboard" icon in the section header.
  • PHP tab now available in the "Console" workspace alongside Visual FoxPro, Python and JavaScript. Full interactive command console support.
  • Various script editor improvements with better automatic code indenting for all scripting languages.
  • Various UI improvements.
  • Various database engine improvements.
  • Now includes both 32 and 64 bit Linux distros with better support for Ubuntu Unity.
  • Completed support for advanced controls and delegates in the Canvas sections which can be written in Visual FoxPro, Python, PHP and JavaScript.
  • "IntelliTips" documentation for PHP.
  • Fixed reported bugs.

Beta5

Release date 8-Dec-2011

  • New "Chart" Section. Provides powerful graph/charts for data visualization; Bar, Line, Gantt, Donut, Pie, Bipolar, Fuel, Funnel, Gauge, Meter, Odometer, Radar, Rose, Radial Scatter, Scatter, Thermometer, Vertical Progress Bar, Horizontal Progress Bar, Waterfall. These charts can emit events which cause related section (or custom delegates) to refresh their data based upon the segment clicked on e.g. click on a segment of a bar chart that shows sales by month to requery and refresh a related grid to show the individual sales orders.
  • Improved code editing of canvas sections (click the small keyboard icon in the section header to edit code)
  • Improved error handling of delegate procedures
  • Various UI improvements.
  • Fix reported bugs.

Beta5 R1

Release date 9-Dec-2011

  • Fixed an issue with ALTER TABLE error handling.

Beta5 R2

Release date 15-Dec-2011

  • Fixed an issue with the Visual FoxPro ADD OBJECT statement when multiple inheritance was used.
  • Fixed an issue where THISFORM was not being setup until after the INIT of a FORM object.
  • Fixed an issue where there was a delay when closing the App Builder.
  • Fixed an issue with custom delegate callbacks on chart elements.
  • Fixed a user authentication issue in the App Center.
  • Added "Click" and "DblClick" custom delegates to "Grid" sections.
  • Added functionality to load "grid" sections from two-dimensional arrays in custom delegates.
  • Added functionality for exposing the "grid" within a grid section from a custom delegate in a "canvas" section.

Beta6

Release date 21-Feb-2012

  • VFP-style CursorAdapter.
  • Support for external data sources using ODBC data adaptors. MSSQL, MySQL, PostgreSQL etc.
  • Transparently use ODBC data sources with "use tablename connstr 'odbc_data_source'" commands. Data is then made available as a local cursor. SQL update/delete commands are handled transparently and the cursor appears as a local one to the scripting code. You can also perform a SQL query and/or order the data e.g.
    use customers connstr 'northwind' where customer_name!='' and order_amount>1000 order by customer_name
    Once the table is in "use" you can get a refererence to the internal "CursorAdaptor" using the "cursorAdaptor()" function e.g.
    use customers connstr 'northwind' where customer_name!='' and order_amount>1000 order by customer_name
    ca = cursoradaptor("customers")
    ca.cursorRefresh()
  • ODBC command tab in the console workspace. Connect to an ODBC data source and then you can issue normal Visual FoxPro commands against it e.g. dir, use tablename, list structure, list status, replace, delete, skip etc.
  • Import any external ODBC data source  into Lianja from the "Data" workspace. You can then build Apps against the imported database without interfering with the live data. This provides the ability to import MySQL, MSSQL, PostgreSQL or any other database that has an ODBC driver.
  • Various UI improvements.
  • Fixed reported bugs.

Beta6 R1

Release date 24-Feb-2012

  • Fixed USE ... CONNSTR ... WHERE.
  • Fixed MSSQL table list to show what schema the table belongs to. Data import of MSSQL databases with schemas now working.
  • Implemented SQLTABLES() function.
  • Implemented SQLCOLUMNS() function.
  • Fixed MSSQL issue when displaying long records in the console workspace.
  • Fixed an issue when adding new users in the Users workspace.
  • Fixed several issues relating to the anchoring of a "grid" inside a "Form" when the form is resized.
  • Improved "Grid" compatibility with Visual FoxPro.
  • Extended maximum character string length to 64k on all platforms.
  • Fixed an issue with initializing properties at instantiation time in Visual FoxPro classes.
  • Various other bug fixes that were reported.

Beta7

Release date 12-Mar-2012

  • Fixed MySQL ODBC connections on Linux and Mac.
  • Fixed issue importing VFP DBC database tables with logical fields.
  • Fixed issue importing ODBC data sources where tables have no rows.
  • Fixed issue where importing ODBC data source truncated the number of rows imported.
  • ODBC connections are now automatically pooled. This provides one server connection for all CursorAdapters (or USE CONNSTRING). Makes them faster and provides multi table transactions with full commit and rollback (see below).
  • Added EXECPYTHON( ) function to evaluate Python code from Visual FoxPro. (Note this is similar to the Visual FoxPro EXECSCRIPT() function).
  • Added EXECPHP( ) function to evaluate PHP code from Visual FoxPro.
  • Added EXECJAVASCRIPT( ) function to evaluate JavaScript code from Visual FoxPro.
  • Added Visual FoxPro SYS(2023) support to get temp directory.
  • Added FIELDS clause to USE ... CONNSTR with ODBC data adaptors. e.g.
    USE tablename CONNSTR "odbc_dsn" FIELDS "name,address,amount" WHERE amount>5000 ORDER BY name
  • Added support for pooled ODBC connections with SQLCONNECT() and USE tablename CONNHANDLE expN. This will share multiple local cursors using one ODBC connection. The connection is reference counted and will only be disconnected when all local cursors are closed or you issue a SQLDISCONNECT(0).
    m_handle = SQLCONNECT("odbc_dsn")
    USE customers CONNHANDLE m_handle
    SELECT 0
    USE orders CONNHANDLE m_handle
    SQLDISCONNECT(0)
  • SQL SELECT in the ODBC tab now provides BROWSE of selected data in the data workspace.
  • Added VFP-style BROWSE command for browsing data in a window/grid. Note that when the CAPTION clause is specified then data is browsed in a dialog with "Cancel" and "Done" buttons in the grid header (similar to iPad UI). This allows you to use popup BROWSE data selection dialogs within your Apps. The FIELDS clause handles VFP validation/titles/validation/picture options etc.
    USE tablename CONNSTR "odbc_dsn" FIELDS "name,address,amount" WHERE amount>5000 ORDER BY name
    BROWSE [NOWAIT] [TITLE "text" ] [NODELETE] [NOEDIT] [NOAPPEND] [CAPTION 'text'] ; [SIZE width,height] [FIELDS fieldlist] [FOR expL] [KEY exp]
  • Added the ability to specify a custom BROWSE command with all VFP functionality into a custom section (specify in the section attributes dialog).
  • Added VFP-style EDIT command for editing data in a window/form. Note that when the CAPTION clause is specified then data is browsed in a dialog with "Cancel" and "Done" buttons in the form header (similar to iPad UI). This allows you to use popup EDIT data selection dialogs within your Apps. The FIELDS clause handles VFP validation/titles/validation/picture options etc.
    USE tablename CONNSTR "odbc_dsn" FIELDS "name,address,amount" WHERE amount>5000 ORDER BY name
    EDIT [NOWAIT] [TITLE "text" ] [NODELETE] [NOEDIT] [NOAPPEND] [CAPTION 'text'] ; [SIZE width,height] [FIELDS fieldlist] [FOR expL] [KEY exp]
  • Added the ability to specify a custom EDIT command with all VFP functionality into a custom section (specify in the section attributes dialog).
  • The "include" and "codebehind" directives in .rsp pages can now use app:/filename.ext and library:/filename.ext to reference files in the current app directory or the library directory respectively.
  • Added "dialogbutton" attribute and "Dialogbuttonclick" delegate to "Field" attributes in form and canvas sections. These can be used to popup custom builders/selection dialogs in your Apps.
  • Added support for a custom "config" file that is executed when the App Builder starts up. This is located in the "{LIANJA_HOME}\conf\config.db" file.
  • Extended "CursorAdapter" to handle transactions. The following new methods are available on a CursorAdapter. Each of these returns True in success and False if the driver does not support transactions or the operation failed.
    transaction( )
    commit( )
    rollback( )
    Also note now that ODBC connections are pooled; the transactions work across multiple table updates.
  • New SQLTRANSACTION() function that works in conjunction with SQLCONNECT(), SQLCOMMIT(), SQLROLLBACK(), SQLCANCEL(), SQLDISCONNECT(). Transactions work across all tables opened from the same pooled ODBC connection.
  • Added support for editing scripting files directly from the console workspace where extcan be '.prg', '.py', 'php', '.js', '.rsp', '.spr' or '.css'
    MODIFY COMMAND filename.ext 
    MODIFY FILE filename.ext
  • Added support for VFP .spr files. These can now be edited in the editor and executed with:
    DO FORM filename

    Note that when a FORM is executing there is an implicit READ EVENTS to ensure that the objects/classes in the form remain in scope so be sure to CLEAR EVENTS or close the Form window to exit.

  • When executing scripts from the console workspace the file to be executed is searched for in the App folder, then the library folder automatically. If there is no App currently open then the current directory is used.
  • Extended the INPUTBOX( ) function so that when "*" is given as the default value the text entered is not echoed. This provides the ability to enter passwords without any special dialogs needing to be developed. e.g.
    result = inputbox("Enter a password", "Password", "*")

    Note that the built-in MD5( expC ) function can be used to one-way encrypt passwords.

  • Performance improvements loading CursorAdapters.
  • Extended Text Editor Gadget with HTML formatting and printing.
  • Now runs on Windows 8 natively.
  • Several UI improvements. (new progress bar indications in particular).
  • Added command history to the console workspace for VFP developers. History is saved and restored across sessions.
  • Various other bug fixes that were reported.

Beta8

Release date 25-Apr-2012

    • Fixed an issue where the INIT() delegate for an App was being called after the pages were rendered. It is now called prior to pages being rendered so that libraries/database etc that are used in pages/sections are opened beforehand. Note that INIT() is called when the App is loaded but before pages are rendered. LOAD() is called after the pages are rendered.
    • Removed some debugging code from the DIR command in the console which output text twice. (oops!).
    • Fixed a VFP compatibility issue with STORE expr TO (var).
    • Fixed a VFP compatibility issue using parameter markers in local cursor SQL SELECT statements.
    • Fixed an issue adding records with UNIQUE indexes that have a filtered index condition.
    • Fixed an issue with SQLEXEC() on windows when used from the console workspace.
    • Exposed the 'url' property in a webview section so that the url can be changed at runtime.
    • Added new 'webview' property to a section that returns the internal webview in a webview section. Use Lianja.findElementByID("section_name").webview to get an object reference to it. (similar to the "grid" property of a section which returns the internal grid object reference.
    • Fixed a parsing issue with ALTER TABLE with an AUTOINC column.
    • Extended SQL INSERT to be able to insert multiple records in one command (allows batching on insert commands for better network performance).
      INSERT INTO customers (name, ordercount, ordervalue) VALUES ;    
      ("Barry", 10, 1000), ;   
      ("Yvonne", 10, 5000), ;   
      ("Chris", 20, 1000)
    • Added a 'filter' attribute in form and grid sections. This can also be set dynamically at runtime using Lianja.findElementByID("section").filter.
      Lianja.findElementByID("mygridsection").filter = "ord_value > 5000"
      Lianja.findElementByID("mygridsection").refresh()
    • BROWSE and EDIT now correctly handle FOR condition specified and active FILTER.
    • Right-aligned numeric columns in grid sections.
    • Added several additional functions for improved VFP compatibility. DEFAULTEXT(), FORECEXT(), FORCEPATH(), JUSTEXT(), JUSTFNAME(), JUSTPATH(), JUSTSTEM(), JUSTDRIVE(), GETCURSORADAPTER(), DBC()
    • Optimize the "Grids" (and BROWSE) to fetch data as needed to improve performance with big data sets.
    • Improved the grid builder by providing the ability to drag a column from the "Columns" panel and drop onto a grid or attachments section. Also fixed up various bugs relating to dragging and removing columns.
    • Handle user defined "column" in "grid".
    • New interactive GUI debugger for VFP scripting code. See this blog article for details.
    • Several minor cosmetic UI improvements.
    • Added new framework class "SystemTrayIcon". This provides an icon for an application in the system tray where long-running applications can display icons and short messages. On Mac this uses growl. On Windows and Linux the system tray at the bottom of the screen.
tray = createObject("SystemTrayIcon")
tray.icon = "app:/myapp.png"
tray.showMessage("Message", "Generating report...") // perform some long running operation to generate the report
tray.showMessage("Message", "Printing report...")
  • New popup script editor for "Validation" and "Default" in the "Attributes Dialog". Developers can now write complete scripts that perform data entry validation. Prior to the validation script being evaluated the {} macros are substituted in the scripting code. This code is executed using the EXECSCRIPT( ) function so it should return true if data is valid or false if data is invalid.
  • Fixed an issue with calling stored procedures that return resultsets using ODBC connections.
  • Added the Visual FoxPro DEBUGOUT command. The result of the expressions specified on the command line are written into the debug.txt file in the debug directory. If SET DEBUGOUT OFF (the default) is in effect the command is ignored.
    set debugout on
    debugout "Hello world", date(), amount
  • Added the Visual FoxPro SET EVENTTRACKING ON|OFF command (default OFF). This causes all component events to be logged into the debug_client.txt file in the debug directory.
  • COM/ActiveX support on Windows. See this blog article for details.
  • Added support for adding/editing database events in the "Data Workspace". Currently only dbc_opendata and dbc_closedata database events are supported but others will be added prior to final release. By convention the names of database events are prefixed with "dbc_".
  • Added support for adding/editing table triggers in the "Data Workspace". Triggers supported are onInsert, onUpdate and onDelete. By convention the names of the triggers are prefixed with the table name followed by an "_" e.g. customers_onupdate, orders_oninsert, categories_ondelete etc.
  • Added support for adding/editing stored procedures in the "Data Workspace". By convention stored procedures must begin with "sp_". These are stored in the database container and can be called using ODBC when using the Lianja SQL Server. Call them using the syntax "call sp_xxx()" in a call to SQLEXEC(). They can return result sets e.g.
    nstat=sqlconnect("odbc_dsn")  
    sqlexec(nstat,'call sp_getaccounts()', 'accounts')  
    sqldisconnect(nstat)
    // sp_getaccounts.prg
    select account_no from example into cursor curExample
    return setresultset("curExample")
    
  • Added several new useful functions to handle setting up Apps (Note that setup.prg is always called when an App is run). databaseExists(cDatabaseName) and tableExists(cDatabaseName, cTablename).
    // example in setup.prg
    if not databaseExists("mydatabase")
        create database mydatabase
    endif
    if not tableExists("mydatabase", "mytable")
        create table mytable (name char(10))
    endif
  • Added "Presentation Rules" in the App, Page and Section Attributes. This provides control over whether an App appears in the App Center or whether a Page or Section is displayed depending upon what UI the App is running in. You can therefore have one App that adjusts its functionality/personality for Desktop, Web and Mobile clients. These rules are enforced at runtime. In development mode all are available.
  • Grid sections now handle split mode grid/form editing by setting the "Split Grid" attribute in the section attributes dialog.
  • Various other bug fixes that were reported.

Beta8 R1

  • Fixed an issue with BROWSE on large tables.
  • Fixed an issue with SQL SELECT TOP (n) not honoring the ORDER BY clause. Note the LIMIT clause does not have this issue.
  • Fixed an issue using COM/ActiveX with sub objects not being handled correctly (Excel Automation problem).
  • Fixed an issue with Instant Selections that was broken in beta8.
  • Fixed an issue with SQLSTRINGCONNECT() function.
  • Extended and documented the Lianja Object Model. See this blog article.
  • Fixed various reported bugs.

Beta8 R2

  • Fixed an issue using COM/ActiveX with sub objects not being handled correctly (Another Excel Automation problem).
  • Fixed an issue with the progress bar not being updated correctly on certain operations.
  • Fixed various reported bugs.

Beta8 R3

Release date 2-May-2012

  • Fixed an issue where the data navigation bar was not being updated correctly with "Instant Search" (incorrect matching record count).
  • Fixed an issue where "Instant Selections" were not operating as expected (broken in beta8).
  • Fixed an issue where "Instant Selections" could not be edited after creating them (expressions were not displayed in dialog correctly).
  • Further COM/ActiveX bug fixes.
  • Fixed various reported bugs.

Beta8 R4

Release date 11-May-2012

  • Added a confirmation dialog when "Remove" is clicked in the page/section attributes dialog.
  • Added a "Custom Search" icon into the section header. This invokes the "Custom Search Delegate" which can be edited from the Section Attributes dialog. This provides the ability to popup a BROWSE grid, select an item and refresh the section on the specified record. The delegate could show a complete query builder or whatever else you need in your UI. See this blog article for details.
  • Fixed an issue dragging VFP tables into the "Tables" panel of the Data workspace. Tables with Date indexes and/or Memo fields were not being converted properly.
  • Extended command line options to provide better customization of ISV Apps. See this blog article for details.
  • Documented Tools and Extensibility. See this blog article for details.
  • Grid sections now have some additional buttons in the section header when the "splitbar" attribute is enabled from the section attributes dialog. These buttons provide the ability to toggle between "Grid View", "Form View" and "Split View" in grid sections.
  • Fixed an issue with the VFP WAIT command not working as expected.
    WAIT [ expC ]  [NOWAIT]  [CLEAR] [TIMEOUT expN]
  • Added SPLITBAR keyword to BROWSE command to enable split grid editing.
    BROWSE SPLITBAR
  • Enhanced ALTER TABLE to provide the ability to "move" columns around in the table e.g..
    ALTER TABLE mytable MOVE("NAME", 4)
  • Added "Move Up" and "Move Down" actionbar icons in the Columns panel of the Data workspace.
  • Fixed various reported bugs.

Beta8 R5

Release date 15-May-2012

  • Added plugins extensibility to the Page Builder for ISVs. Add your own "Builders" to the page builder to generate template pages, import existing Visual FoxPro Forms  or whatever else you can think of (e.g. class browser). These can be written in Visual FoxPro, Python, JavaScript or PHP using the base UI classes and the Tools and Extensibility API.  They can be added to the "Extensions" menu in the formbar at the bottom of the pagebuilder. See this blog article for details on how to build a Custom Tool or Extension.
  • Added "Install Tool or Extension" icon in the "Tools" workspace HeaderBar to make it easy to install a third-party tool or extension into the App Builder.
  • Added "Short" and "Real" data types into the Database Tables "Columns" attributes.
  • Added "Custom Search" icon and delegate attribute for pages. So now you can have a custom builder for specific pages or individual sections.
  • Added "Fullscreen toggle" icon to pages. Enable this in the page attributes. Provides the ability to toggle an App into fullscreen on low resolution devices such as tablets.
  • Added "Use Accordions" and "Use accordions height" to the "Page Attributes". If these are specified and the user is running your App on a display with a resolution less than the "Use accordions height" value then Lianja will automatically render the sections of the page in "Accordion" mode and make better use of the available display real estate. This allows Apps to auto-detect the screen resolution and act accordingly and is particularly relevant when running on tablets or other low-resolution devices.
  • Added a "Timer" delegate and "Timer Interval" to pages. These can be specified in the Page Attributes dialog. You can perform any task such as checking for timeline/notifications for the user and inform them. Note that timer events are ignored when running in development mode. Switch to runtime mode to test them.
  • Added a new method to the Lianja System Object. Lianja.showNotification(expC, expL). The first argument can be an HTML formatted string. If the second argument is true then the notification remains shown until the user clicks the "Dismiss" button. See this blog article for details on how to use notifications.
  • Custom search icon and delegates work in all section types now including "Webview", "Report", "Chart" and "Custom". This provides the ability to popup a form or browse with a list of reports or charts and refresh the section accordingly.
  • Added complete animation support to all of the base UI classes using new methods. Use these in the same way that you would use hide() and show(). The new methods available are: 
    SlideDown( DURATION_IN_MSECS )
    SlideUp( DURATION_IN_MSECS )
    SlideLeft( DURATION_IN_MSECS )
    SlideRight( DURATION_IN_MSECS )
    ZoomIn( DURATION_IN_MSECS )
    ZoomOut( DURATION_IN_MSECS ) FadeIn( DURATION_IN_MSECS ) FadeOut( DURATION_IN_MSECS )
    Animate( X, Y, WIDTH, HEIGHT, X2, Y2, WIDTh3, HEIGHT2, DURATION_IN_MSECS )
    e.g.
    myform = createObject("Form") myform.top = 500 myform.left = 500 myform.width = 200 myform.height = 200 myform.zoomIn( 300 )
  • Added new function USERNAME() that returns the login name of the current user in the App Center.
  • Added new function USERROLES( username ) that returns a comma separated list of roles that the specified user has.
  • Added new function USERDOMAIN( username ) that returns the domain (tenancy) that the specified user belongs to.
  • Various bug fixes and improvements to the Custom Canvas Section Builder including some new components, "Numeric TextBox" and "Rich Text Editor".
  • Enhanced input masks in fields. Normal VFP style input mask e.g. 999,999 or AAA-XXX etc. There are now some "special input masks" also:

    @Ilen,max,min for integer e.g. @I or @I4 @I4,500,1000
    @Flen,dec,max,min for double (len is maxlength, dec is the # of decimal places) e.g. @F10,2,1.50,2500.00
    @D for ISO date
    @E for email address

    Anything with a ? as the first character is a regular expression so complex validation can be performed. e.g. This will validate an email address:

    "?\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b"

  • Fixed an issue adding and updating users in the Users workspace.
  • Fixed an issue where the action bar for "TabView" was not being displayed in the section header.
  • Fixed an issue where clicking the "Edit" icon in the page navigation bar was not toggling in and out of form edit mode correctly.
  • Fixed an issue toggling in and out of fullscreen mode where the titlebar of the window became obscured on Windows.
  • Several Mac specific UI fixes related to the attributes dialogs.
  • Fixed an issue where the table name was not being setup correctly when dragging a column onto a canvas section. This resulted in the data not being saved correctly as the section has no base table associated with it.
  • Fixed an issue dropping an image field onto a canvas section. The ControlSource was not being bound properly as the image can be a static or bound image.
  • Fixed various reported bugs.

Beta9

Release date 12-Jun-2012

  • All Lianja classes can now be skinned using CSS. This includes FormItems in Form section, Fields in Custom Canvas sections, and all of the base UI framework classes. There is a special property called "stylesheet". You can assign a static CSS style e.g.
    background-color: qlineargradient(x1:0, y1:0, x2:1, y2:0, 
        stop:0 #616161, stop: 0.5 #505050, stop: 0.6 #434343, stop:1 #656565);
        color: white;
    border: 2px solid #e37b16;
    Or you can also apply styles read from custom .css files that you write in the script editor by specifying:
    app:/filename.css or lib:/filename.css
    

    Clicking on the "CSS style" dialog button allows you to edit the CSS and it will automatically create a unique .css file and switch into the script editor to allow you to write the CSS.

    We will write a blog article providing in depth details on how you can "skin" your Apps using CSS later as you can specify "special selectors" to apply different CSS styles depending on the value of a property in the object. e.g. border textfields with a red border when they are "required" or change the background color if the field is readonly. More about this later.

  • Performance improvements working with ODBC and CursorAdaptors.
  • Performance improvements when altering tables with large amounts of data.
  • Performance improvements when dragging and dropping Visual FoxPro tables into a database.
  • Auto-recreation of search key indexes and instant selection filtered indexes when they are mistakenly deleted.
  • We have now tied in the Data dictionary business rules declared in "Column Attributes" for a table these are now automatically used by controls in Form/Canvas sections when the App is loaded.
    AttributeValueExample
    picture Input mask for the field. Normal Visual FoxPro style input mask e.g. 999,999 or AAA-XXX etc
    choices Static or dynamic choicelist for the field. Static list of choices e.g. Apples,Oranges,Pears

    Dynamic list coming from records in a table e.g.
    @customers,trim(lastname)+","+trim(firstname)

    Dynamic list from a SQL select e.g.
    SELECT lastname FROM customers WHERE not empty(lastname)
    validation Validation expression for the field. Notice how {} can be used to substitute the current value of the field. e.g.
    not empty("{}")
    validationerror Error message to display if validation fails. Data must be entered in this field
    help Displayed as the tooltip for the field. Enter the customer name
  • Exposed many more of the properties and methods of fields within Form and Canvas Sections using getElementByID("page.section.field")
  • The tiles in the App Center now handle "live" content updates when the App Center (Home) is selected or Lianja App Center is run. Each tile can have App specific live HTML formatted content e.g. a count of the number of pending orders, a total of messages left for a user etc. The "Timer" delegate for each App tile displayed and its refresh interval are specified in the App Settings dialog. If no delegate is specified then Lianja will look for a file called "update_tile.rsp", "update_tile.prg", "update_tile.py", "update_tile.php" or "update_tile.js" in the folder for the App. If any of these exist they are executed at the specified timer interval. They should just output an HTML string which will be rendered as the tile contents. Works across Desktop, Web and Mobile. This provides a notification/status view for users without them having to open Apps to see if there is any new content for them. The timer delegate specified can also be a URI beginning with "http://" or "https://" so web services and/or social medial feeds can be rendered live in the App Center tiles. If the value output from the live tile delegate is a numeric value (not HTML) e.g. "16" then it is used to update the "Notification" icon in the toolbar of the tile. You can also include the special tag ‹lianja:notifications="number"› in the HTML. This will be stripped out of what is displayed in the tile but the notification value will be displayed in the "infobar" at the top of the tile. See this blog article for an example.
  • Added a "Notifications" icon in each tile. This is only visible when there are notifications for the user based on the live tile delegate result. If there are notifications, then the notifications icon contains a count of the number of notifications (similar to Facebook and/or Google+).
  • Added a "Share" button to the App page header in preparation for the "Lianja Team Edition". Clicking the "Share" button provides the ability for users with "admin" permission to send out invites to users by email. The email contains a URL link that allows the user to connect directly to the desktop/server running the App Center and after authenticating to share the Apps and Data on the machine based on their user permissions and roles established in the "Users" workspace.
  • Added "email" field in the "Users" workspace for sending out invites when using the Lianja Team Edition.
  • Enhanced notifications to show a notification icon in the Page Header rather than have the Notifications panel slide down automatically which can get annoying. The notification icon changes when notifications are pending. You can hide this icon in the "Page Attributes" dialog, by default it is visible. Click the icon to slide down the notifications panel. Reset the notifications with:
    Lianja.showNotification("", .f., 0)
  • Added "TreeGrid" as an "Advanced" component in the custom canvas builder.
  • Added "WebView" as an "Advanced" component in the custom canvas builder.
  • Added "ActiveX" as an "Advanced" component in the custom canvas builder on Windows.
  • Added "Shift-select" multiple controls in the Custom Canvas Builder with the ability to align horizontally, vertically, make same width, make same height, make equal spacing between components, use keyboard cursor keys to move and/or resize multiply selected controls.
  • Added themes to the Custom Canvas Builder. (A range of customizable themes will be added in final release)
  • When a control is selected in the Custom Canvas Builder, pressing F5 will slide out the attributes dialog for the control and F4 will edit the "default" delegate for the selected control e.g. click for a "commandbutton", changed for a "textbox", etc. These are just shortcuts, the full range of delegates is still available from the attributes dialog by double clicking on the control design-time border.
  • Many other fixes and enhancements to the Custom Canvas Builder. An example is now included in the App Center called "Lianja Custom Canvas Demo". See this blog article for an example of what you can achieve.
  • Enhanced script error reporting by adding a full runtime stack trace of called procedures and line numbers.
  • Added new "Quick Switch" icon into the Apps and Pages workspace headers. When in the Pages workspace click it to switch to the Apps workspace to edit delegate code. When in the Apps workspace click it to switch back to the Pages workspace. Code is saved automatically as you switch back and forward.
  • Exposed additional properties and methods in the Lianja Object Model (LOM). See this blog article for details.
  • Added a new function TABLEMODIFIED( alias ) which returns true if the specified cursor is "dirty" i.e. has been modified but not yet committed.
  • Added several new section delegates. These correspond to CRUD operations that are performed against data in a section. These are "BeforeCreate", "AfterCreate", "DataChanged", "BeforeUpdate", "AfterUpdate", "BeforeDelete" and "AfterDelete". You edit these in the normal way through the section attributes dialog. DataCreated is called after a new record is added but before the bound data is refreshed in the section so you can add default values etc in it. DataChanged occurs after data has been read (navigating through records), BeforeUpdate and AfterUpdate are called for Update operations. BeforeDelete and AfterDelete for delete operations.
  • Added a shortcut (press the Esc key) for Cancel to close the attributes dialogs.
  • Added some new attributes to FormItems and Fields; Caption Icon ( appears to the left of the caption ), Gradient type (Vertical spread, left to right, right to left, Top to bottom, iPad style), BorderWidth, BorderColor.
  • Added some new attributes to pages and sections to allow them have background gradient color schemes.
  • Added the following delegates into standard fields in Form sections (under "Advanced" in the attributes dialog); "Got Focus", "Lost Focus" and "Change". "Got Focus" and "Lost Focus" allow you for example to change the border around the "activecontrol" so that as you tab around the form you could for instance highlight the field or change its CSS style dynamically. "Change" is called as you type each keystroke so you can lookup customer records or whatever you need to do then refresh the data in the section. (similar to the way "Instant Search" works).
  • Added getURL( expC, [, expN [, expO ] ] to be able to provide a simple cross platform mechanism for talking with HTTP web servers and consume data provided by web services. You can use this to fetch JSON and/or XML results or whatever else you require.

    Tip: You can use getURL() in conjunction with JSON_DECODE() and then iterate over the data returned using the FOREACH statement. Notice also that Lianja's Visual FoxPro language implementation includes most of the core PHP functions e.g. base64_decode( ) and base64_encode( ) as an example.

    ArgumentDescriptionExample
    expC Fully qualified URI. http://search.twitter.com/search.json?q=twitterapi&rpp=1
    expN (Optional) The timeout in seconds for the request (default 30). Set this to 0 for no timeout. 30
    expO (Optional) An object or dynamic array containing the HTTP header elements
    headers = array()
    headers[] = "Host: search.twitter.com"
    headers[] = "Authentication: Basic " + base64_encode("username:password")

    Tip: You can get a list of HTTP header fields from here.

  • Added JSON_DECODE( expC ) function to create a dynamic array (object) from a JSON formatted string.
    myobj = json_decode('{"Name":"Barry", "Company":"Lianja", "Items":["One", "two"]}')
    ? myobj
    ? myobj.name
    ? myobj.company
    ? myobj.items[1]
    ? myobj.items[2]
    
    Then looking at the output created from the above:
    Object (refcnt=1)
    (
        [name] => Barry
        [company] => Lianja
        [items] => Array 
            (
                [1] => One
                [2] => two
            )
    )
    Barry
    Lianja
    One
    two
    
  • Added JSON_ENCODE( oVar | aVar ) function to create a JSON formatted string from a static or dynamic array (object). For strings larger than 64K use the PRINT_JSON( oVar | aVar ) function.
    myobj = json_decode('{"Name":"Barry", "Company":"Lianja", "Items":["One", "two"]}')
    ? json_encode( myobj )
    
    Then looking at the output created from the above we get:
    {"name":"Barry","company":"Lianja","items":["One","two"]}
    
  • Added column information tooltips when you hover the mouse over a column in the columns panel (similar to the way information is displayed for tables in the tables panel).
  • Added socket functions to enable communicating with node.js or any other TCPIP socket server. See the blog article for details. SOCKET_CLOSE(), SOCKET_LASTERROR(), SOCKET_OPEN(), SOCKET_PEEK(), SOCKET_READ(), SOCKET_SERVER(), SOCKET_WRITE().
  • Added a new function to handle setting up database table changes in Apps (Note that setup.prg is always called when an App is run). This can be used to auto-upgrade a database when a new version of your App is published.

    COLUMNEXISTS(cDatabaseName, cTablename, cColumnname [,cWidth [,cDecimals] ]).
    // example in setup.prg
    if columnExists("mydatabase", "mytable", "mycolumn")
        if not columnExists("mydatabase", "mytable", "mycolumn", 80)
            alter table mydatabase!mytable modify column mycolumn char(80)
        endif
    else
        alter table mydatabase!mytable add column mycolumn char(80)
    endif
    
  • Overall performance improvements loading Apps.
  • Fixed an issue where the page "Activate" and "Deactivate" delegates were not being called. Now they are called as you select a page.
  • Fixed an issue where the "Load" delegates were being called before the Lianja Object Model (LOM) was properly setup. Now these are called after the App, Pages, Sections and Fields are already registered. "Init" is still called as before so use that to setup any namespaces, variables or whatever you need to do prior to app, pages, sections and fields being created.
  • Fixed an issue where "timer" events could be fired when an App was still loading.
  • Fixed an issue where custom canvas sections were not correctly saving values that had changed in numeric spinners.
  • Fixed an issue importing VFP "float" and "Int" data types.
  • Fixed an issue with AUTOINC fields being regenerated when a table was altered with ALTER TABLE.
  • Fixed an issue updating and deleting users in the Users workspace.
  • Fixed an issue with "Int" data types on Mac OS X and Linux x64.
  • Fixed various reported bugs.

Beta9 R1

Release date 14-Jun-2012

  • Added a new "DataChanged" delegate to a "Field" that is called when editing is completed e.g. Return key pressed, Tab key pressed, Mouse focus out.
  • Enhanced Field Tooltips (Field Attributes dialog) so they can display "live" content by specifying { expression } macros.
  • Fixed a SQL query optimizer bug when using > conditions on numeric columns with duplicate keys.
  • Fixed the calling of "GotFocus" and "LostFocus" delegates which was broken in Beta9.
  • Fixed various reported bugs.

Beta9 R2

Release date 15-Jun-2012

  • Added a new "Hotkey" delegate to a "Field". This is called with one parameter which is the character representation of the key pressed e.g. "F1", "Ctrl+F4", "Shift+F6", "Ctrl+Shift+F7" etc. It is only called when certain keys are pressed and handles "Alt", "Shift". "Ctrl" and their various combinations. The following keys are recognized as hotkeys. F1-F12, Ins, Home, Delete, End, PgUp, PgDn, Up, Down, Left, Right, Enter, Backspace, Tab, Esc.
  • Fixed the "DataChanged" delegate which was not made available in the attributes dialog.
  • Fixed various reported bugs.

Beta9 R3

Release date 21-Jun-2012

  • Added a "Home" button into the PageHeader so that users can switch between the App Center and the current App if they need to view the App Notifications or select another App to run. This provides a "quick switch" as it will not close the current App. It also provides a common way of App switching at runtime (when running the App Center) without having to write any custom code.
  • Added a new page attribute (in the page attributes dialog) to display the vertical scrollbar in the page if the screen height is less than a specified value. This is to assist with low resolution display devices.
  • Enhanced the Custom Canvas Builder with a new "Format" menu in the FormBar and removed the "Effects" menu which has now been merged in with it. This now includes the original "Effects" menu (shadowing effects) and the following additional menu items; Same background color, Same foreground color, Same font, Same font size, and Same gradient. These work against the currently selected group of controls (by using Shift+Click to select a group of controls) in a Custom Canvas Section.
  • Enhanced the Custom Canvas Builder with a new "Text" menu in the FormBar. These work against the currently selected group of controls (by using Shift+Click to select a group of controls) in a Custom Canvas Section.
  • Added "Table" as a new property of the Lianja system object. This works in a similar way to the "Database" property but returns the currently selected "table" in the database/tables panel.
  • Added a new "ValidWhen" delegate that is called just prior to the "BeforeUpdate" delegate. Return false if data is invalid and should not be updated.
  • Added some new functions for improved VFP compatibility.
    GETWORDCOUNT(cString[, cDelimiters])
    GETWORDNUM(cString, nIndex[, cDelimiters]).
    
  • Added additional parameters to ASCAN( ) as handled by VFP.
  • Changed some properties in the Lianja Object Model to simplify it. Specifically; activePage, activeSection and activeControl. These now return objects and have to be set as objects also. e.g.
    Lianja.activePage.activeSection.caption = "Hello world"
    Lianja.activePage = Lianja.getElementByID("customers")
    
  • A few minor UI tweaks when modifying the attributes for Reports and Charts.
  • New commands for customizing WebView error messages (in preparation for Lianja Cloud Server).
    SET SHOWERROR ON|OFF
    SET SHOWERROR TO "an HTML formatted string"
    
  • Fixed an issue with SQLEXEC("SELECT ...") not handling pooled ODBC connections correctly.
  • Fixed some relative anchoring issues in the Custom Canvas Builder.
  • Fixed various reported bugs.

Beta9 R4

Release date 26-Jul-2012

  • Added "Align right edges" to the "Align" menu in the FormBar for Custom Canvas Sections.
  • Added "Same CSS style" to the "Format" menu in the FormBar for Custom Canvas Sections.
  • Fixed an issue with changing the currently visible page using Lianja.activepage.
  • Fixed an issue with updating ODBC data sources when using USE ... CONNSTR
  • Fixed a SQL SELECT UNION issue.
  • Fixed several issues relating to SQL SELECT from system tables e.g.systables, syscolumns, syscolumnconstraints, systableconstraints.
  • Added ISNULL( ), IFNULL( ) and NVL( ) SQL functions to improve SQL compatibility with MSSQL, Oracle and MySQL.
  • Improved and simplified editing of Custom Webviews and Custom Gadgets.
  • Fixed an issue with Lianja.evaluate( ) and Lianja.execute( ) when called from JavaScript to evaluate/execute Visual FoxPro code.
  • Fixed an issue getting Date, DateTime and Currency values from UI object properties in python, PHP and JavaScript.
  • Data dictionary rules are now applied to form and canvas controls when they are added to a form or when an App is loaded. They are also re-applied when a table structure is altered which changes any of the business rules; Description, Picture, Validation, Error, Help, Choices etc. To disable this behavior uncheck the "Inherit Data Dictionary" attribute in the Section or Field attributes dialog.
  • Separated user specific settings and Instant Selections into two separate files so that Instant Selections can be saved as part of the App (in the App folder as the name of the app with a .labels extension e.g. lianjademo.labels). This simplifies App deployment and makes Instant Selections app-specific rather than user-specific.
  • Added addProperty() and removeProperty() methods to the Lianja System Object. This provides the ability to share variables/state between different Apps. Use SAVE DATASESSION TO var, and RESTORE DATASESSION FROM var to save and restore active records in cursors as you run Apps. Restore the datasession in the "load" event of the App if the property exists.
    save datasession to myvar
    Lianja.addProperty("cursorstate", myvar)
    myvar = Lianja.cursorstate
  • Fixed an issue with accented characters that were being used as page captions not being parsed correctly in the App XML file.
  • Documented UI classes with all their methods/properties/events and delegates. New Developers Guide, Users Guide, and other Documentation.
  • Fixed various reported bugs.

Beta9 R5

Release date 09-Aug-2012

  • Fixed an issue accessing system tables e.g. syscolumnconstraints on windows.
  • Fixed an issue with vertical layouts in containers that are added to forms.
  • Fixed an issue changing the visibility of a field in a form section dynamically by changing the "visible" attribute.
  • Fixed an issue with WAIT WINDOW not hiding the previous message when a new one was being displayed.
  • Fixed various other issues with WAIT WINDOW to operate more like Visual FoxPro e.g. It now displays in the upper right hand corner and it waits for a key to be pressed or the mouse to be clicked before continuing.
  • Fixed an issue with the addObject() method on containers not passing arguments correctly to the init() method of a subclassed object.
  • Added the IN workarea/alias clause to the REPLACE command for improved VFP compatibility.
    REPLACE IN customers city with proper(city)
  • FormBar menus can now be torn off and appear as an independent window on top of the page. When switching between workspaces or switching into runtime mode they are hidden. Click the area at the very top of the menu to tear it off.
  • Added  a new "WhatsThis" property to all Lianja UI framework classes. This can contain formatted HTML. When a control has focus, pressing Shift+F1 pops up a tooltip-like windows which displays the "WhatsThis" HTML. Typically this contains a much more detailed description than that in a tooltip.
  • The "Backups" workspace has now been renamed to the "Versions" workspace and has been enhanced to provide access to the versioned files for all Apps without having to open an App beforehand. In a future version we will also be integrating the git version control system into the App Builder in this workspace.
  • The "Publish" workspace has now been renamed to the "Deploy" workspace.
  • Visual FoxPro procedures and/or functions can now be assigned to the "event handlers" for UI controls dynamically like this:
    proc myClickHandler()
        Lianja.showMessage("You clicked me!")
    endproc
    myform = createObject("Form")
    myform.resize(640,480)
    myform.addObject("mybutton", "CommandButton")
    mybutton.caption = "Click me"
    mybutton.adjustSize()
    mform.click = myClickHandler
    myform.show(1)
    
  • Added support for Visual FoxPro DECLARE DLL command to enable calling C functions in external libraries. (Windows only). Warning, use this at your own risk as there is no way to know what type of arguments should be passed to the WINAPI functions.
  • Added some additional Visual FoxPro commands; MD/MKDIR, CD/CHDIR, RD/RMDIR and ED/MC synonyms for MODIFY COMMAND.
  • Added the Visual FoxPro APRINTERS(arrayname) function to return an array containing the names of the available printers on the system.
  • Added the Visual FoxPro GETPRINTER() function to select a printer and return the name of the selected printer. (Note that any of these functions can be used in Python, PHP and JavaScript also using the Lianja system object e.g. Lianja.evaluate("GETPRINTER()") )
  • Enhanced the WebView class to handle printing of reports without user input. There is a new method LOAD(filename as character) which loads an HTML formatted file into the WebView. You can generate the HTML formatted report manually using SET ALTERNATEin Visual FoxPro or you can render the report using an .rsp server page (just by setting the url property to the name of the rsp page). The PRINT( ) method on the WebView class can now take arguments. These are as follows:
    print(printername as character, 
          orientation as character, 
          format as character, 
          filename as character, 
          papersize as character, 
          numcopies as numeric)
    printername -- get this using APRINTERS() or GETPRINTER()
    orientation -- "Landscape" or "Portrait"
    format      -- "Native", "PDF" or "PostScript"
    filename    -- output filename if "PDF" format
    papersize   -- any of the following as a string; A4, Legal, Letter, etc
    numcopies   -- number of copies to print
    
    Here is a simple example of generating a report:
    myreport = createObject("Webview")
    set alternate to myreport.html
    ? "Generated report using html for formating"
    close alternate
    myreport.load("myreport.html")
    myreport.print("", "", "pdf", "c:\myreport.pdf")
    
  • Added a new attribute to the "App Settings" to "Show pages menu in page header". This hides the pages menu in the left sidebar of each page and provides a "Navigation" button in each page header. Clicking this displays a menu where pages can be selected. This provides more real estate in the left sidebar on low resolution devices/screens.
  • Added the ability to specify an INIT(), LOAD(), ACTIVATE() and DEACTIVATE() delegate to fields within standard Form sections. 
  • Added the ability to add "Custom menus" to the page actionbar. This is a "cog" icon that when clicked shows a menu (similar to a context menu). There is a "CustomMenu" delegate that is called with one argument, the caption of the menuitem clicked.
  • Fixed an issue where calling the RELEASE() method on a FORM object did not release the variable correctly.
  • Fixed an issue where chart delegates were not being called properly when chart segments (e.g. pie, bar) were clicked.
  • Several minor UI improvements.
  • Fixed various reported bugs.

Beta9 R6

Release date 20-Aug-2012

  • Added a new function ASTACKTRACE('arrayname') that fills a 2D array with the current execution stack information. First element is the procedure, second is the line number. 
  • Modified socket_open() to make connections using numeric IP addresses without requiring a reverse DNS lookup.
  • Drag 'n' drop Visual FoxPro database containers (.dbc files) onto the "Database explorer" to create a Lianja database of the same name and import all tables and their associated indexes into it. The "Import" script is in the library workspace in "vfp_import_dbc.prg".
  • Drag 'n' drop Visual FoxPro projects (.pjx files) onto the "Files explorer" of the Apps workspace to import the forms, classes and program files into the App. This "Import" script is in the library workspace in "vfp_import_pjx.prg".
  • Drag 'n' drop Visual FoxPro forms (.scx files) onto the "Files explorer" of the Apps workspace to import the .scx file. This "Import" script is in the library workspace in "vfp_import_scx.prg".
  • Drag 'n' drop Visual FoxPro class libraries (.vcx files) onto the "Files explorer" of the Apps workspace to import the .vcx file. The "Import" script is in the library workspace in "vfp_import_vcx.prg".
  • Added "Beautify" (shortcut Ctrl+B) to the "Format" menu to format and beautify Visual FoxPro source code. The script for this is in the library workspace in "vfp_beautify.prg".
  • Much improved smart indenting in the script editor.
  • Much improved Intellisense-like functionality in the script editor (IntelliTips).
  • Improved the script editor by displaying a visual indicator (vertical red line) at the start of lines that have been edited.
  • Added an optional "Back/Forward" button into the page headers (attribute in the App settings). Navigating between pages keeps a stack of the last 10 pages visited and allows the user to return to previous/next pages rather than having to re-select the pages from the page "Navigation" menu. This provides a more consistent "browser-like" user experience.
  • Enhanced the AddItems() method on "Tree" and "TreeItem" class so that if 2 parameters are specified, the first can be the name of an icon image and the second is either a "|" separated list of columns values or a SQL SELECT statement.
  • Data import via ODBC is approximately 5x faster than previous versions.
  • Added some new properties to the Lianja System Object; Lianja.appdir, Lianja.datadir, and Lianja.libdir.
  • Minor UI improvements e.g. graying out data navigation buttons that are not applicable such as next, last when at EOF and prev, first when at BOF. Additionally add, delete and edit buttons are grayed out if the user does not have permissions to add, delete or update data.
  • New ODBC import dialog which allows specifying ODBC DSN, Username and Password of the ODBC database to import.
  • Added a new method to the CursorAdaptor class called sqlValues(sqlselectcmd) that returns a comma separated list of values from the result of a singleton select SQL query. This is useful for populating data in Charts etc from ODBC data sources. e.g.
    cResult = ca.sqlValues("select count(*) from customers")
    
  • Added the ability to include .txt and .xml files in with the App files (Files explorer) so that they can be deployed with the App. Typical usage is to setup a database tables and add sample data when an App is deployed. If you don't know, when an App is run, Lianja looks for setup.prg, setup.py, setup.php or setup.js. If any of these scripts exist they are executed. You use the setup script to check that the required database exists (if not create it), check if the required tables exist in the database (if not create them and possibly populate them with sample data) etc. This setup mechanism provides the ability for Apps to be self-installing on the desktop, cloud or mobile.
  • Fixed DECLARE DLL which was not working as expected.
  • Fixed an issue transferring databases between Windows and Mac.
  • Fixed up an issue importing MySQL databases using ODBC.
  • Fixed various reported bugs.

Beta9 R7

Release date 21-Aug-2012

  • Fixed the code beautifier which was broken just prior to release.
  • Fixed an issue dragging .scx, .vcx and .pjx files onto existing tree nodes.
  • Fixed an issue importing .scx and .vcx files that have missing property values or unquoted property values.
  • Fixed a crash creating a new (second) page that occurs in the beta9r6 release.
  • Fixed an issue where the wrong Data Dictionary values were being selected when "Inherit Data Dictionary" was checked on a section.
  • Fixed various other reported bugs.

Beta9 R8

Release date 30-Aug-2012

  • Added the AUSED() Visual FoxPro function for improved scripting language compatibility.
  • Added the RAISEEVENT(object, cEvent) Visual FoxPro function for improved scripting language compatibility.
  • Added the EVL(exp1, exp2) Visual FoxPro function for improved scripting language compatibility. Returns exp2 if exp1 is empty otherwise return exp1.
  • Added the DIRECTORY(cDirname[, nFlags]) Visual FoxPro function for improved scripting language compatibility.
  • Added the DOEVENTS Visual FoxPro command for improved language compatibility.
  • Fixed the GETWORDCOUNT() function that was not operating as expected.
  • Fixed the VARTYPE() function to operate the same as VFP and not to throw an error if variable undefined but return "U" instead.
  • Fixed an issue referencing grid columns by their implicit object names; column1, column2 etc.
  • Fixed an issue applying the 'filter' property on a form section.
  • Changed the way empty dates are displayed. Dates that have no value (Null) are displayed as "None" in the date picker rather than the default display text of 01-01-2000.
  • Added the ability to add "Custom menus" to sections. This is a "cog" icon in the section footer that when clicked shows a menu (similar to a context menu). There is a "CustomMenu" delegate that is called with one argument, the caption of the menuitem clicked. One of the simple uses of this would be to dynamically change the "filter" property on the section. 
  • Automatically synchronize unrelated form and grid sections that contain data from the same table as records are navigated on a page. This provides the ability to develop vertical split-view forms/canvases and grids with all the power of related parent->child sections.
  • Added a new "Change" delegate to Form and Canvas sections. This is called whenever any fields in the section are updated interactively. It is called after the Change delegate of the field if one is specified. Typically you can perform such things as updating field values based on the values of other fields in a form e.g. autoflll field values depending on what the user entered in a particular field.
  • Fixed an issue with "Mandatory" fields not being checked properly when adding new records or editing existing ones.
  • Added a "Mandatory" attribute to Fields in Form sections. This enforces data to be entered in a field when new records are added.
  • Added a new function MTOA(memofield) that reads a memo field of any size and splits it up into lines where each line is an element of the array which is returned.
  • Added a new function ATOM(arrayname, memofield) that updates a memo with the contents of an array. Each element in the array becomes a line of text in the memo.
  • Fixed various issues relating to field validation not being handled correctly when navigating off an active record in a form section.
  • Various fixes and improvements to the VFP .pjx, .scx, .vcx importers.
  • Fixed various reported bugs.

 Beta10

Release date 06-Nov-2012

  • Changed the default directory to the app directory when an App is opened making it easier for PHP, Python and JavaScript to reference code, libraries and other resources (images, css etc) in the App. This works properly with the sandboxing of Cloud and Mobile Apps also.
  • Added new properties to the "section" class to enable manipulating report properties programmatically.
  • Fixed an issue where the page "Activate" and "Deactivate" delegates were not being called correctly.
  • New "Custom UI Library" and "Custom UI Class" section attributes to embed UI classes from imported .scx and .vcx files into a custom section (which can occupy a full page by setting the "Stretch Last Section" page attribute).
  • Further fixes and improvements to the VFP .pjx, .scx, .vcx importers.
  • Added the RELEASE CLASSLIB Visual FoxPro command for improved language compatibility. (Note that CLOSE CLASSLIB was already handled)
  • Create, Modify and Delete virtual tables in a database container. Virtual tables exist in the database and are handled by a CursorAdaptor. Clicking on the virtual table in the "Tables explorer" displays the virtual columns of the CursorAdaptor SELECT command, you can then drag 'n'drop these onto sections in the pagebuilder and treat remote/external data as regular Lianja tables. Any code that references these tables e.g. USEvtablename connects via the CursorAdaptor and retrieves the data. Updates and deletes are handled transparently via the CursorAdaptor. All CursorAdaptors automatically use ODBC connection pooling against the same ODBC DSN to maximize performance. The following new commands have been added to handle Virtual tables:
    CREATE | ALTER VIRTUALTABLE virtual_table_name 
        [IF NOT EXISTS] 
        [ALIAS name] 
        CONNSTR "odbcdsn" 
        AS select_statement
    
    Note that Virtual Tables just look like regular native tables and they can be accessed with either SQL or the Visual FoxPro style USEcommand. They are fully updateable. You can restrict and order data from the Virtual Table using:
    USE virtual_table_name 
    [FIELDS select_list] [WHERE condition] [ORDER BY order_by_expr] [ALIAS name]
    [AS select_statement]
    Due to their "virtual" nature you can join data from disparate data sources e.g. join a MySQL table to a MSSQL table or to a native Lianja table in your Apps.
  • Automatically attach a Data Dictionary (business rules, column descriptions, client-side validation, etc) to the local cursor for the virtual table selected by a CursorAdaptor. This provides full Data Dictionary (DD) support for MSSQL, MySQL, Oracle or other ODBC supported third party databases).
  • Jquery 1.8.3 (latest version) is now included in the library and can be used in WebView sections. Just add the following between the HEAD tags of your HTML page:

    alt
  • We have included the Twitter developed Bootstrap JavaScript library in the distro so no separate download and configuration is required. Full documentation and examples can be found here. Bootstrap is a sleek, intuitive, and powerful front-end UI framework making it simple to build Lianja data-bound WebViewWidgets. Use this library in conjunction with the Lianja System Object in your WebViewWidgets to seamlessly integrate data into your HTML5 WebViewWidgets. 
  • We have included the Knockout JavaScript library in the distro so no separate download and configuration is required. Full documentation can be found here. Knockout simplifies dynamic JavaScript UIs by applying the Model-View-View Model (MVVM) and can be used in building Lianja data-bound WebViewWidgets. Use this library in conjunction with the Lianja System Object in your WebViewWidgets to seamlessly integrate data into your HTML5 WebViewWidget.
  • Added HTML5 editing functionality to WebViews. Setting the Editable attribute on a WebView section and clicking the edit icon will switch the WebView section into an HTML5 editing component. The WebView section can now be bound to a VarChar/Memo field also so that content is extracted from that field and updated when editing is complete. The WebView section print icon (if enabled) provides the ability to print the formatted HTML document on a printer or export it to a PDF file. Sample screenshots can be found here. There are two HTML5 editors included in the distro now; one very lightweight for Mobile use and one other with significantly more functionality (similar to the editor in Google Docs).
  • Extended WebView sections so that you can build a WebViewWidget in HTML5+JavaScript that can interact with business logic written in any of the supported scripting languages i.e. Visual FoxPro, Python or PHP. The WebView actionbar in the section header now calls known interface functions (much like custom sections do) written in JavaScript that are internal to the HTML5 page rendered in the WebView. These JavaScript functions can make calls back into the App (using the Lianja System Object) so you can have a two-way interaction between the HTML5+JavaScript UI and App business logic. For a good example of how to write a WebViewWidget read the calendar_view.rsp and calendar_controller.prg files in the library workspace. This functionality makes it easier than ever to build hybrid desktop/cloud/mobile apps.
  • Added a complete data bound HTML5+JavaScript calendar section which handles editable events. This functions in the same way as normal sections allowing calendar content to be related from parent sections e.g. relate appointments from employee records. Adding, Deleting and Updating Events is simple. You can also drag'n drop events to different days. This uses the new WebViewWidget interface functions. Sample screenshots can be found here. If you specify a Click delegate then this is called when an event is clicked on in the calendar. This is passed the event as a JSON string (use json_decode( ) to create a VFP object from this), you can have an Editable WebView beneath the Calendar which displays complete HTML5 rendered details of the event which can then be edited with the new HTML5 editor available in this version.
  • Added the ISREADONLY( ) function for improved Visual FoxPro scripting language compatibility.
  • Added the ISRLOCKED( ) function for improved Visual FoxPro language compatibility.
  • Enhanced the Lianja system object for JavaScript to handle optional asynchronous completion callbacks for the execute( ) and evaluate( ) methods. Also added a new fetch( ) method. This provides the ability to handle both onsuccess and onerror callback functions as the second and third arguments respectively. When running from the desktop the onsucess is called synchronously. When running in the Lianja Web Client it is called asynchronously on completion.
    Lianja.evaluate("myproc('arg1', 'arg2')", function (result) {
        // now do whatever you want with the result
    });   
    If you want to fetch large amounts of data (that you format as json or xml) use the fetch( ) method. The simplest way to generate JSON is using the print_json( object ) function or the SQL SELECT ... INTO JSON CONSOLE which will perform the SQL query and output the result in JSON format in one statement. Similarly, SQL SELECT... INTO XML CONSOLE will output the result in XML format.
    Lianja.fetch("getsomedata.rsp?arg1=lastname&arg2=100", function (result) {
        // now do whatever you want with the result returned from the getsomedata.rsp server
        // side page which you wrote in Visual FoxPro. 
    // Note that you can call python or php scripts as well as .rsp server side pages // or specify a http:// or https:// url which will be proxied by the Lianja Cloud Server so // no SOP problems occur. });
  • Native SQL Views are now included in the "Database" explorer "Tables" panel. They can be now be treated just as regular tables e.g. they can be used in a SQL SELECT statement or they can just be opened with the USEcommand. If a data dictionary with the same name as the view exists in the database it will automatically be attached to the cursor when the view is opened. e.g.
    open database southwind
    create view barry_test as select * from customers where StartsWith(companyname, 'B')
    select * from barry_test into cursor customers_view
    use barry_test alias another_view
    
  • Added a complete "Web page inspector" built into WebViews. Right click on the WebView and select "Inspect" from the context menu. This is the same web page inspector that is available in Google Chrome and Apple Safari. It includes a complete JavaScript debugger to assist in building Lianja WebViewWidgets. See this blog article for details.
  • Added the ability to hide/show the Add/Delete buttons in the section attributes for WebView sections.
  • Added a new function STOT( ) that converts a string to a datetime data type e.g. STOT('20120927103015'). Note that when you use SQL INSERT or SQL UPDATE this conversion is handled automatically.
  • Added a new function USEREMAIL( ) function that returns the email of the currently logged in user through the App Center or any other user that can be specified as an optional parameter. You now have USERNAME(), USERDOMAIN(), USERROLES(), and USEREMAIL() to get information about a user.
  • New Windows 8 metro-style UI theme.
  • New Windows 8 metro-style tiled App Center on all platforms (can be disabled by a command line switch --nowin8appcenter). 
  • Added additional section attributes to allow full customization of the section header. These provide the ability to remove gradients and/or provide your own color scheme allowing the UI to be customized even further. e.g. Make the section headers metro-style flat colors if you so desire.
  • Fixed an auto-indenting issue in the code editor.
  • Fixed the VFP CHRTRAN() function which was not operating as expected.
  • Fixed a VFP compatibility issue with conditional compilation using #if #endif directives.
  • Fixed a VFP compatibility issue parsing DIMENSION statements in class declarations.
  • Fixed a VFP compatibility issue with object.arrayname( ) references where the parser was looking for a method even when an array existed of that name in the class properties.
  • Fixed an issue with the Visual FoxPro WAIT WINDOW command.
  • Fixed an issue running with --fullscreen specified on the command line (lianja --fullscreen) on low resolution devices which was causing the initial window to be maximized rather than run in full screen mode.
  • Fixed an issue determining available screen size (incorrectly ignored the taskbar area on Windows). If the available screen size is less than that required then the window is automatically maximized (if --fullscreen not specified).
  • Fixed an issue with the SPAWN command on Windows that runs commands concurrently. This is similar to the RUN command but does not wait for command completion.
  • Overall performance improvements in the GUI and also the HTML5+JavaScript (upgraded to the latest version of WebKit which is embedded inside Lianja).
  • Fixed a parser issue with SQLPREPARE( ) parameter substitution.
  • Added "Check for updates..." to the "Help" menu.
  • Added a new function OBJECTSIZE( field ) which returns the size of the BLOB stored in a specified field of the active cursor. Functions that work on BLOBS are now OBJECTREAD( ), OBJECTWRITE( ), OBJECTTYPE( ) and OBJECTSIZE( ). You can store any Binary Large Object in an "Object" field of a table including images, documents etc. When building UI sections in the page builder, you can just bind a BLOB to an image gadget or image strip section to have images rendered. Tip: you can drag and drop image files from your desktop (or double-click the image) onto an existing image to update it. You can also update the contents of an "object" field using the REPLACE command or SQL UPDATE and specify a filename whose contents will be stored in a specified column of a table.
  • Added "Attachment size column" to attachment section attributes. 
  • Lianja server pages (which have an .rsp file extension) are dynamically generated only when the source file of the page is newer than the object file (which has a .rso file extension). These .rso files are loaded into shared memory segments and shared by all users that request them. This provides a high degree of scalability as 10's of thousands of users share and execute the same code in memory. This is also the case with scripts written in Lianja (Visual FoxPro .prg files) which are compiled into files with a .dbo file extension. The memory footprint is kept small and there is no re-compilation required as the scripts are only compiled when the source file is newer than the object file. This is one of the great benefits of dynamic scripting languages.
  • Added a "Default" attribute for columns in Grid and Attachment sections. This can be any expression and is evaluated when you add new records to the section to provide a default value for columns of the grid. e.g. date(), datetime(). Tip: double-click on a column header to change the column attributes.
  • Fixed an issue with GETURL( ) not working as expected.
  • Added an additional (optional) parameter to the GETURL( ) function to read a file from a remote web server and store into a local file.
    filename = geturl("http://www.myserver.com/getsomepage.rsp?name=smith&month=10", 30, array(), "myfilename.json")
    if len(filename) = 0
        // no data was returned
    endif
    
  • Added a new function POSTURL( ) that operates in the same way as GETURL( ) but sends an HTTP POST request to the specified URI. By default the data is just sent as "text/plain" in the HTTP body but you can add custom headers to the "headers" associative array and POST SOAP requests and read the response from the remote server which is returned as a string of text. The last parameter can either be a filename of a character expression that will be sent as the POST body.
  • Fixed an issue with SOCKET_PEEK( ) not working as expected.
  • Added support for composite keys for parent sections.
  • Added a new TAGEXPR( nExp ) function.
  • Added a new TAGUNIQUE( nExp ) function.
  • Extended the Lianja system object with three new methods;
    Lianja.spawnApp("appname", "username", "password")
    Lianja.run("command" [,"commaseparatedarglist"])
    Lianja.spawn("command" [,"commaseparatedarglist"])
    
    All of these methods return true on success and false on failure. The new processes are children of the parent process and will be terminated when the parent process completes. "username" and "password" should be specified so that roles and permissions work correctly within your Apps.
  • Added a new system class "NetworkRequest". See here for details.
  • Fixed an issue with #include "filename"
  • Fixed an issue initializing with LOCAL var = expression
  • Fixed an issue with "smooth-scrolling" editor contents on the Mac.
  • Added an extended content menu to the editor.
  • Fixed an issue using SQL int columns on 64-bit systems (Mac and Linux x64).
  • Added a new function JSON_DECODE_FILE( filename AS character ) to decode the JSON contents of a file of any size into an object. This can be used very effectively  with GETURL( ) to parse JSON content of any size coming from a web service. This allows XML to be parsed and manipulated as standard objects in the Lianja scripting language.
    filename = geturl("http://www.myserver.com/getsomepage.rsp?name=smith&month=10", 30, array(), "myfilename.json")
    myobject = json_decode_file(filename)
    
  • Added a new function XML_DECODE_FILE( filename AS Character, tagroot AS Character, tagrow AS Character ) to decode the XML contents of a file of any size into an object. This can be used very effectively with GETURL( ) to parse XML content of any size coming from a web service. This allows XML to be parsed and manipulated as standard objects in the Lianja scripting language.
    filename = geturl("http://www.myserver.com/getsomepage.rsp?name=smith&month=10", 30, array(), "myfilename.xml")
    myobject = xml_decode_file(filename, "customers", "customer")
    
  • Added "filter" property to grids that can be set/get dynamically causing the grid to refresh showing records that satisfy the filter. e.g. you can set the filter dynamically in a delegate.
    Lianja.getElementByID("mypage.mysection").grid.filter = "amount > 1000"
    
  • Library files are now "versioned" when they are edited in the same way files in the App folder are versioned. You can roll backwards or forwards to any version of a file (both App and Library) from the "Versions" workspace.
  • Files added to the files tree in the Apps and Library workspace are now organized into "Controllers" and "Views" (for building WebViewWidgets). By convention, when building an MVC WebViewWidget, we recommend that you use xxx_controller and xxx_view as the filenames for the sake of consistency (where xxx is the name of your WebViewWidget).
  • Added support for "Add", "Delete", "Edit" and drag and drop of images in  the "Image Strip" sections.
  • Fixed an issue with SQL SELECT ... INTO CURSOR not working as expected.
  • Added the ability to embed a "Form" or a "Container" object directly into a Custom Section. This simplifies the migration of existing Visual FoxPro form based applications into Lianja as it allows .scx forms and .vcx components to be embedded into custom sections. Just return a "Form" or "Container" from the custom section procedure and it will be automatically embedded.  
  • Added some new WebView section attributes that allow for editing WebView HTML5 content (if its editable attribute is true and user permissions allow it) when clicking or double-clicking on the content. This switches the WebView into HTML5 editing mode.
  • Added a new Grid section attribute that allows editing grid rows by double-clicking on them.
  • Added support for gestures. See this post in the forums for details.
  • Fixed various other reported bugs.

 Release Candidate RC1

Release date 10-Dec-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.

    DO NOT INSTALL BOTH DISTRIBUTIONS ON THE SAME MACHINE!
    as the LianjaAppBuilder download already includes both the Lianja App Builder and the Lianja App Center.

  • 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.
    // The NoSQL way
    set xmlformat to excel
    open database southwind
    use customers
    copy to mycustomers.xml type xml
    Lianja.showDocument("mycustomers.xml")
    // The Extended Lianja SQL way
    open database southwind
    select * from customers save as xml mycustomers.xml format excel
    Lianja.showDocument("mycustomers.xml")
    
  • 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.

 Lianja App Builder Release Candidate RC2

Release date 21-Dec-2012

  • Fix various reported bugs.

 Lianja App Builder Release Candidate RC3

Release date 31-Jan-2013

  • The Windows distribution is now code signed with a Class 3 certificate. This removes any warnings when installing and also provides a valid Norton and Microsoft "reputation".
  • Fix various reported bugs.

Lianja SQL Server Release Candidate RC1

Release date 31-Jan-2013

  • Lianja SQL Server for Windows.
  • ODBC driver for the Lianja SQL Server.
  • Ability to write stored procedures in the Lianja/Visual FoxPro scripting language.

 Lianja SQL Server Release Candidate RC2

Release date 07-Feb-2013

  • Fixed an issue when calling stored procedures not looking in the database container directory.
  • Fixed an issue accessing varchar fields using the Lianja ODBC Driver from third party products.
  • Fix various reported bugs.

 Lianja App Builder Release Candidate RC4

Release date 13-Mar-2013

  • Enhanced the "ImageStrip" section to have a "Notes" panel bound to the selected image. When an image is selected in the image strip the notes (or details) associated with that image are displayed in a dedicated area on the right hand side of the image strip section. The notes are editable and are bound to a varchar/memo field which is specified in the imagestrip attributes dialog.
  • Added new UI presentation rules into the attributes dialogs for forms and grids. These attributes are handled by the Lianja ART engine. As data is entered/edited through the UI, the rules are evaluated and the UI rendered/adjusted based on the rules. These rules are only evaluated when the App is in runtime mode, so you need to switch to runtime mode to test them.
  • Enhanced the "Grid" section with a "Visible when" column attribute rule. If an expression is specified then the column is hidden if the expression does not evaluate to true.
  • Enhanced the "Grid" section with a "Readonly when" column attribute rule. If an expression is specified then the column is readonly if the expression does not evaluate to true.
  • Fields in "Form" sections and columns in "Grid" sections now have "Custom mapping" rules that are available in the attributes dialog. This provides the ability to format the cells in a grid column and the fields in a form when they are displayed and remap them back into the database when they have been changed. The mapping consists of a "Set data" and a "Get data" piair which can be an expression or a user defined function call. The current value to be mapped should be substituted using {} notation. The "Get data" expression should return the transformed text that you want to display in the cell, and the "Set data" expression should return the value you want to store in the database. In both cases the current value should be substituted in your expression using the {} macro substitution notation.
  • Enhanced the "Grid" section with a "Show split edit" column attribute. If this is true and the grid is a "split grid", it is opened in a split grid/form view by default.
  • Enhanced "Form" and "Custom" fields with a "Visible when" attribute rule. If an expression is specified then the field is hidden if the expression does not evaluate to true.
  • Enhanced "Form" and "Custom" fields with a "Readonly when" attribute rule. If an expression is specified then the field is readonly if the expression does not evaluate to true.
  • Sections now have UI presentation "Rules" that can be specified in the attributes dialog. These rules; "Readonly when" and "Visible when" are evaluated as data changes in forms. This provides the ability to conditionally hide/show sections based on the data being displayed or entered by a user. These "rules" are all part of the Lianja ART architecture and can be used effectively to provide UI workflow functionality. These rules are now available for sections, fields in forms and columns in grids. More rules will be added in future releases. All of the rules specified for sections and fields on all of the pages in an App are evaluated whenever data is changed interactively or when navigating between records in a page using the built-in data navigation bar.
  • The "Custom menu" in a section footer can now be rendered as a horizontal strip of "inline menu" hyperlinks by simply prefixing the comma separated menuitems with a ! character e.g. !First,Prev,Next,Last. The hyperlinks are centered in the footer when a ! is used as the prefix, left aligned if a less than character is specified and right aligned if a greater than sign is specified. There is a new attribute in the footer panel of the section attributes called "Custom action". If this is specified then that Action is performed when a menuitem is selected. The format of the action is the same as the "Lianja.showDocument()" method. For example to "Transition" to a page you would specify "page: pagename", to select a particular page and perform an Action on a specified section you would specify "page: pagename.sectionname?action=first". To apply a filter to a section, you would specify "section:sectionname?action=filter&text=expr" e.g section:section2:action=filter&text=accountdate eq date()" (note the use of OData-like notation " eq " instead of "=" ( use gt, ge lt, le, ne also). The "Custom action" can contain {expr} macros that will be substituted prior to the action being performed. This provides the ability to build queries in "Form" sections and apply the queries to another section on the page.
  • Improved layout of "Report" sections with cleaner look and better CSS styling.
  • Performance improvements loading and rendering Apps.
  • Added a new built-in function GUID() that generates a 36 character GUID which can be used for unique primary keys across locations and operating systems.
  • Exposed significantly more of the Lianja ART architecture with a new UI state machine. See this posting on the developer community forums for details.
  • All delegates can now be specified as "inline commands" by prefixing them with a ! e.g. !Lianja.getElementByID("section1").hide(). The command should be in the scripting language that you have specified for the UI component. This can be used with good effect in manipulating the Lianja Object Model (LOM) with minimum coding. If you prefix the delegate with a (jquery-style) $ rather than a ! character then this provides a shorthand way of calling Lianja.showDocument() e.g. $("section:section1?action=hide") whould be the same as Lianja.showDocument("section:section1?action=hide").
  • Small but useful enhancement. The VAL() function now strips non numeric characters from the string (handles digits and point separator) so it can be used with the new "Set data" and "Get data" functionality. Useful when your "Get data" expression is a TRAN() and then the "Set data" can be a VAL().
  • Tuned the default caching in the SQL engine resulting in an ~300% perfomance improvement. This can be turned on or off using SET SQLCACHE ON|OFF and SET DCACHE ON|OFF.
  • Added two new page attributes. "Collapse left sidebar" and "Collapse right sidebar" that cause the sidebars to be collapsed when the App is first loaded.
  • Added a new page attribute "Hide page from menu" which does not include the page in the "Navigation" menu. This provides further customization so that pages can be designed and navigated to using Lianja.showDocument("page:pagename"). The page is only hidden from the Navigation menu at runtime so switch to runtime view to test it.
  • New integrated app specific context-sensitive Help. See this post on the forums for details. The showHelp() method has also been added to the Lianja system object so that it will work in web apps as well. The arguments are the same as those for the showHelp() built-in function.
  • Added the ability to "Hide Tab Bar at runtime" for a "TabView" section.
  • Added some new actions to the Lianja.showDocument() method. "show", "hide", "select=sectionid&text=tabtext" (to select a tabpage), "print". e.g. Lianja.showDocument("section:section1?action=hide") or Lianja.showDocument("section:section1?action=select&text=customers").
  • Added support for custom right-click context menus on fields in forms.
  • Added support for a section specific menubar at the top of the section underneath the section header. You just specify the menus as comma separated lists (e.g. Reports(Full|Short),Navigation(First|Previous|Next|Last),Help) which can also have a pulldown associated with them. There is a delegate to handle menu selections which can be written in code or specified as "inline".
  • Fixed an issue where the page headerbar containing the page menus was always made visible when the left sidebar was turned off on a page. When building apps that do not use the page menus (navigate the LOM programatically) you can now hide the headerbar at runtime from the app settings.
  • Added support for UI Page Libraries. See this blog article for details.
  • When calling Lianja.showDocument() or using "inline delegates" e.g. $("page:customers.section1?action=search&text=value") you can now "chain" actions together using || to separate them. e.g. $("page:customers.section1?action=search&text=value||hidedialogpanel"). This is very effective when used in "inlne delegates" to perform more than one action that changes the state of the UI through a transition.
  • Added a new progress bar which is used when loading apps. This is located at the very top of the main window. Less obstrusive and more tablet friendly. You can use this to provide visual feedback with long running operations with the Lianja.showProgressBar(value, max) method and hide it when the operation has completed using the Lianja.hideProgressBar() method.
  • Added a new attribute for form fields; "Placeholder text". The specified text is displayed as grayed-out placeholder text as long as the field is empty and doesn't have focus. A small but useful enhancement to provide a visual cue for users filling in forms without having to hover over the field with the mouse to show a tooltip.
  • Added a new icon into the header of the pagebuilder; "UI States Editor" which slides out a dialogpanel which provides adding/editing/deleting of UI States for the current App. These are stored in a table in the current database which the App is using. The table is called appname_uistates where appname is the name of the current App but this can be changed in the app settings dialog. The UI states table is read when the App is loaded in runtime (App Center) mode and defines the UI states and their properties for the App. It is used in conjunction with the new UI State Manager which is now built into the Lianja client.
  • Implemented a general currency input mask. @C @C2 and @C4 the digit being the number of decimal places required. Data input is validated and displayed in currency format but stored in the database (or variable) without the formatting characters.
  • Improved implementation of "inputmask" on fields.
  • Fixed an issue when dynamically setting and getting properties on formitems in the LOM (e.g. autosuggest) which was not working as expected.
  • Fixed an issue where autosuggestions where not working in canvas sections.
  • Fixed an issue where dialogbuttons were not being made visible on fields in canvas sections.
  • Added a new "ListView" gadget that can be used to provide a navigational sidebar of icon/text pairs in a form section. See this forum post for details.
  • New right-click context menus in the Apps, Data and Library workspaces.
  • Added a new icon into the header of the pagebuilder; "Help Editor" which slides out a dialogpanel which provides adding/editing/deleting of "Help topics" for the current App. Help topics and their corresponding HTML formatted text are stored in a table in the current database which the App is using. The table is called appname_help where appname is the name of the current App but this can be changed in the app settings dialog. Every section can display a help icon which when clicked pops up context sensitive help for the section displaying the "Help topic" for the section. Additionally each field (control) on a form can also have a "Help topic" specified as an attribute which will popup context sensitive help when F1 is pressed when the control has focus.
  • Added a "Text alignment" attribute to the field attributes dialog. This provides the ability to left, center or right align the contents of the text displayed in the field.
  • Added a new function to handle setting up database table changes in Apps (Note that setup.prg is always called when an App is run). This can be used to auto-upgrade a database when a new version of your App is published.

INDEXEXISTS(cDatabaseName, cTablename, cIndexname [,cExp ]).

// example in setup.prg
if not indexExists("mydatabase", "mytable", "myindex")
    use mydatabase!mytable
    index on myfield tag myindex
    use

  • endif
  • Added a new CatalogView section type. See this article (with screenshots) on the forums for details.
  • Added a new (optional) "Navigation Panel" to pages. See this article (with screenshots) on the forums for details.
  • Added support for gestures in pages. You can specify delegates for "Swipe left", "Swipe right", "Swipe up", "Swipe down", "Pan", "Pinch", "Tap", "Tap and Hold". 
  • Overall performance improvements.
  • Fixed various reported bugs.

 Lianja SQL Server Release Candidate RC3

Release date 13-Mar-2013

  • Tuned the default caching in the SQL engine resulting in an ~300% perfomance improvement. This can be turned on or off using SET SQLCACHE ON|OFF and SET DCACHE ON|OFF. When using ODBC you can tune the Lianja SQL Server using SQLEXEC("lianja SET DCACHE ON"). Notice how the keyword "lianja" can be used to prefix scripting commands that you want to execute in the context of the ODBC connection.
  • Fix various reported bugs.

 Lianja App Builder Release Candidate RC5

Release date 27-Mar-2013

  • Added _screen as a built in "Form" to help in VFP migration.
  • Enabled the Web Inspector in WebView gadgets and sections when in development and runtime mode (not App Center).
  • Many more attributes now accessible from formitems using getElementByID().
  • Some minor UI improvements.
  • Various overall performance improvements.
  • Fixed an issue with field specific F1 contextual help not being displayed.
  • Many UI state machine improvements.
  • Extended functionality of the splitter class.
  • Added the ability to treat the Enter key as a Tab which is particularly useful when typing numeric values using the numeric keypad ("Return tabs" attribute on form/canvas sections).
  • Added some new example_xxx sample apps to show you how to use UI states.
  • Added "shownavigationpanel" and "hidenavigationpanel" as an action on pages.
  • UI states are all enabled in runtime mode now and they reset when you switch back to devmode.
  • Added animation properties to form items; fadein, fadeout, slidein, slideout, slideup, slide down. Just assign an animation duration to these to animate their visibility.
  • Improved and smoother grid performance.
  • Fixed an issue where the data navigation bar was not working correctly with Canvas sections.
  • Fixed an issue with Tab ordering of controls in Canvas sections.
  • Fixed an issue with MSSQL bit fields not being updated from VirtualTables.
  • Proper handling of MSSQL NULL values when updating using VirtualTables.
  • Added "Navigation menu caption" attribute to the App settings so this can be changed to a locale specific language.
  • Added SQL coalesce() function.
  • Fixed an issue with bit field mapping between MSSQL and Oracle VirtualTables.
  • Fields/gadgets/dividers etc in "Form" sections can now use "Absolute positioning". This is specified in the Field attributes dialog. So now you can further customize the layout of form sections.
  • New App Inspector: more information.
  • Navigation Panel can now have custom UI pages from the UI page library as its contents: more information.
  • Fixed various reported bugs.

 Lianja SQL Server Release Candidate RC4

Release date 27-Mar-2013

  • Fixed various reported bugs.

 Lianja App Builder Release Candidate RC5.1

Release date 02-Apr-2013

  • Added "Log" and "Errors" tab to the App Inspector to assist in debugging.
  • VirtualTable improvements with autodetection of database type when first connected; MSSQL, ORACLE, MySQL, PostgresSQL, SQLlite, MSACCESS and LianjaSQL.
  • Added InfoTip functionality to all controls. Click the "InfoTip" (i) icon in the page/section header and when editing data in fields a balloon tip (the tooltip text) is shown below the field when it gains focus to guide users through the app. Stays visible until the field loses focus.
  • Fixed a bug in mandatory field checking.
  • Exposed more events in the App Inspector "events" tracing tab.
  • Fixed various reported bugs.

 Lianja App Builder Release Candidate RC5.2

Release date 04-Apr-2013

  • Enhanced Virtual Tables with new extensions and native error messages.
  • Fixed an issue with auto detecting ODBC data sources.
  • Fixed an issue navigating data in canvas sections.
  • In the console workspace when a database is open, the 'dir' command now displays the type; Table, View, VirtualTable. For Views and VirtualTables all information is now displayed under the table name.
  • Fixed various reported bugs.

 Lianja App Builder Release Candidate RC5.3

Release date 10-Apr-2013

  • sqlConnect("local") and VirtualTable connstr "local" can now be specified to work on local Lianja SQL cursors. The connstr can also contain {macro} so that the connection can be switched without making any code changes.
  • Added "dual" as a synonym for the sysresultset system table for improved Oracle, MySQL and PostgreSQL SQL compatibility.
  • Added support for specifying fixed caption widths for fields in canvas sections.
  • Added Create/Modify VirtualTable dialog in Data Workspace.
  • Added Page margins attribute.
  • Lianja/SDK C API included in RC5.3 with an example Visual Studio solution and a Linux makefile.
  • Various VirtualTable bugs fixes.
  • Performance improvements loading VirtualTables.
  • VirtualTable enhancements: AutoSync property and sync() method.
  • The PRIMARYKEY clause on CREATE VIRTUALTABLE now takes a comma separated list of columns e.g. "id,name" which are used to generate the WHERE clause for UPDATE and DELETE commands. It has been renamed to KEYFIELDLIST (corresponding to the cursoradaptor property) but PRIMARYKEY is still a synonym for this so as not to break existing VirtualTables.
  • Fixed an issue with Oracle NULL dates in VirtualTables.
  • Various performance improvements.
  • Fixed various reported bugs.

 Lianja SQL Server Release Candidate RC5

Release date 10-Apr-2013

  • Fixed various reported bugs.

 Lianja App Builder Release Candidate RC5.4

Release date 19-Apr-2013

  • Removed the sample apps which will be made available on the Lianja App Store.
  • App store added to the Home workspace menubar for downloading/installing certified Lianja packages.
  • Fixed an issue focussing on the first non-readonly field in form edit mode.
  • Fixed an issue displaying form fields which had expressions specified as the "Data source".
  • Added user "guest" as a known username&password. Provides readonly access to Apps in the "public" tenancy. Disable with the command line switch --noguests
  • Added --runtimecaption "text" command line switch for runtime app center customization
  • Added --kiosk command line switch for runtime app center customization
  • App Packager (deploy an App as a .lpk file). These can be built through the "Deploy" workspace in the Lianja App Builder. The .lpk file contains the Apps, Libraries, Page Libraries, Extensions and Databases that are selected in the "Deploy" workspace. You can also email a .lpk file to members of your team and "Install package" from the App Builder "Apps" workspace to share apps between each other. This is the preferred way to share open source Apps from LianjaX. Just download the .lpk file from LianjaX and click the "Install package" icon in the Apps workspace, select the .lpk file and the App will be installed. The Lianja App Store uses .lpk files for deployment also.
  • Virtual Tables now honor the UpdatableFieldList and the KeyFieldList in the CursorAdaptor that they are attached to.
  • Fixed an issue where hiding the Add/Delete buttons in a Form section header still made them visible.
  • Fixed an issue with field validation incorrectly focussing on the next field when Tab is pressed and validation fails.
  • The VisibleWhen and EnabledWhen delegates were only being called when an App was running from the App Center (A runtime app). I have changed this behavior so that they are called when you switch into runtime mode and then made visible and enabled again when you switch back into development mode. This makes it easier to see how the App looks at runtime without having to deploy it.
  • Added a ValidWhen page delegate. This is evaluated before all section ValidWhen delegates and can be used to validate data across more than one section using Lianja.getElementByID(). If validation fails you can change the UI state which can highlight the fields in error by changing their background color.
  • Added ShowInfoTip(expC) as a core method on all UI controls.
  • Added backbone.js and JQueryMobile into the distribution (in the libraries) for building custom WebViews.
  • Fixed up an issue with grid events not been dispatched in custom code which sub-classed the grid framework class. (not delegates these were ok).
  • Fixed various reported bugs.

 Lianja App Builder Release Candidate RC5.5

Release date 01-May-2013

  • Added "Show memo/object panel" attribute which will display related memos or images in the split grid mode in "Grid" sections.
  • Fixed an issue with mandatory fields being checked when canceling a section edit.
  • NewObject('classname', 'classlib') now functions in the same way as VFP. The classlib is loaded if it is not already loaded. Class libraries are also reference counted.
  • Perform a VirtualTable requery when the parentdatachanged event fires if the "Automatically relate" attribute is unchecked in the section attributes dialog. The VirtualTable is re-queried selecting only those records that match the parent->child relationship.
  • Fixed an issue in the "Data" workspace which did not display "Memos" or "Object/images" correctly.
  • Added "Collapse" as a section property so it can be used when changing UI states.
  • Added requery(expC) as a method in the CursorAdaptor class. If this CursorAdaptor is bound to a VirtualTable then expC is the *new* SQL WHERE clause which is used to requery the remote ODBC data. The local cursor data is then replaced with the result of the query. This can be used very effectively in the section parentdatachanged event. It is worth remembering that changes to the underlying local cursor are automatically reflected on the remote data source; there is no special coding required.
  • Object names are now applied App wide based on ID as pageid_sectionid_formitemid. These can then be used as CSS selectors using #pageid_sectionid_formitemid.
  • All UI controls can be themed App wide now using lianja_ui_xxx CSS selectors. e.g. lianja_ui_textbox, lianja_ui_tree, lianja_ui_grid etc.
  • Improved CSS file editing by applying the CSS stylesheet when editing is complete so that it adjusts the App UI without having to reload the App (there was a CSS caching issue).
  • Added support for PEMSTATUS(object,property,5) for improved VFP compatibility.
  • Added support for TTOC(datetime, 3) for improved VFP compatibility. When 3 is specified the date time string returned is suitable for MSSQL VirtualTable queries.
  • Added the "lianja_uistate_mandatory" and "lianja_uistate_valid" CSS selectors to handle highlighting invalid data without having to write code to do it. e.g. *[lianja_uistate_valid="0"] { background:pink;}*[lianja_uistate_valid="1"}] { background:white; }.
  • Editor performance improvements when editing very large files.
  • Added "VFP forms" and "VFP classes"to the "Pages" in the FormToolsBar. This allows you to select an imported VFP .scx or .vcx file and a page will be created that embeds it.
  • Added an (optional) last parameter to KEYLOOKUP() which is the expression result to return if the lookup fails.
  • Added support for custom/user-defined attributes which can be used as CSS selectors for theming. User defined attributes are prefixed with user_ e.g. Lianja.getElementByID("field17").user_mandatory = "1".
  • Fixed an issue embedding imported VFP SCX and VCX files in a custom section.
  • Improved importers to properly handle continuation lines and procedures with no corresponding endproc.
  • Added a second parameter to Lianja.showMessage() so that the message stays visible until Lianja.hideMessage() is called. This second parameter should be a numeric which is the minimum width of the displayed message panel if > 1 and the message position if
  • Added HideMessage() to the Lianja system object.
  • The MTOA() function now takes an optional second parameter causing it to join lines that have ; on the end of the previous line.
  • Fixed an issue with the NavBar buttons being enabled incorrectly on Canvas sections.
  • Added HWND as a core property for Desktop App developers.
  • Changed installers to allow choice of drive where the App Builder and App Center are installed.
  • Added Lianja.get() and Lianja.getObject() as synonyms for Lianja.getElementByID().
  • Corrected event names on grid to BeforeRowColChange and AfterRowColChange. Use the Click event if you just want to determine a row change.
  • Fixed an issue clicking on the first grid row with related child sections.
  • Fixed a crash when accessing field objects in PHP.
  • Fixed an issue where clicking in the margin of a "ListBox" was clearing it incorrectly.
  • Fixed various reported bugs.

 Lianja App Builder Release Candidate RC5.6

Release date 02-May-2013

  • SQL fixes.
  • Removed some debugging code that was left in RC5.5.
  • Fixed various reported bugs.

 Lianja SQL Server Release Candidate RC5.1

Release date 02-May-2013

  • Fixed various reported bugs.

 Lianja App Builder Release Candidate RC5.7

Release date 29-May-2013

  • VirtualTable properties can now specify updateFieldList=*,-name,-name2 to exclude specific columns e.g computed columns are not included in the update or insert operations.
  • Fixed an issue where SET CLASSLIB libraries were being opened after DEFINE CLASS which was causing issues with imported VFP forms.
  • Fixed an issue with the last return statement in a script file that did not have a newline character at the end of the line.
  • Fixed an issue clicking "Save" when adding a new record which had mandatory and validation set on some of the fields. The navigation buttons were also not being enabled properly.
  • Fixed an issue referencing sub-objects from the INIT method in custom code.
  • DataMappingGet and DataMappingSet attributes can now be referenced in custom code.
  • The "Activate()" and "Deactivate()" delegates are now called for sections as they are selected/deselected when in runtime mode.
  • Fixed an issue where TabView sections were not being shown in the App Inspector.
  • Fixed some event dispatching issues in the "Grid" class in custom code.
  • Fixed an issue where the Load and Activate delegates were not called for fields within Canvas Sections contained in a Tabview.
  • Fixed an issue which caused the LostFocus() event not to be called on subclassed Controls in custom code.
  • Fixed an issue using the MSSQL ODBC driver for Linux on Linux x64.
  • Fixed an issue where a ListBox with a static (comma separated) list of items was causing them to be duplicated.
  • Added Redraw() as a core method. This forces a UI control that is CSS themed to be redrawn. It should be called after you change the value of a property that is used as a CSS property selector to change the UI appearance of a control or other UI element. 
  • Fixed an issue which caused the init() on a sub-classed custom class not to be called correctly.
  • Enhanced the GETFILE() function for improved VFP compatibility.
  • Fixed various reported bugs.

 Lianja SQL Server Release Candidate RC5.2

Release date 29-May-2013

  • Security fixes.
  • Fixed various reported bugs.

 Lianja App Builder Release Candidate RC5.8

Release date 21-Jun-2013

  • Fixed an issue with InteractiveChange and Change event dispatching.
  • Fixed an issue with getURL() and postURL() when multi-part responses were received from IIS.
  • Fixed an issue with VFP classes not adding sub-objects when INIT was missing. This was broken in RC5.7.
  • Fixed some issues with delegate dispatching when sections were inside a TabView.
  • Added a "Debug" tab to the App Inspector. Use DEBUGOUT in conjunction with this.
  • Fixed an issue where logical fields were not being saved correctly when the checkbox was clicked in "Edit" mode.
  • Fixed an issue where the systimelines table was not being created properly if it did not exist.
  • Fixed an issue where the temporary file created by the execscript() function was not being deleted.
  • Fixed an issue where editing CSS files was not applying the changed CSS correctly due to caching.
  • Added a "Fixed height" attribute for gadgets. This is particularly useful for displaying image gadgets so they stay a fixed size irrespective of the autosizing of the form section.
  • Added more customizability (caption#icon#sectionid,...) to the Navigation Panel items including the ability to raise stacked accordion sections at runtime to provide a more Tablet-oriented UI for Web/Mobile Apps. These can all be set as attributes in the page attributes dialog. There is a sample app called example_tabletui that demonstrates how to use this.
  • Gadgets in "Form" sections can now be optionally reendered "Inline" to assist in building more tablet-friendly Apps from the standard sections. They can also auto-stretch into the remaining width of the section as it is resized.
  • App Settings now provide the ability to theme the Data Navigation Bar for Desktop, Web, Mobile or Custom (with CSS). All themes other than Desktop now have "flat" buttons similar to those you see on iOS, Android and Win8.
  • WebView section gadgets can now be editable when a "Data source" is specified.
  • Added a "Grid" gadget to form sections. Specify the table name or SQL select statement as the "Data source". To be able to edit the contents, check the "Editable" attribute. To dynamically change the records displayed in the grid as you navigate data using the Data Navigation Bar use { } macro substitution n the SQL where condition.
  • The Navigation Panel for a page can now be shared across all pages in an App. Just specify a file with a .txt extension e.g. navpanel_menu.txt where each line in the file is a # separated list of caption#icon#pageid.sectionid. The pageid is optional. This provides the ability to design a custom navigation panel for an App.
  • Added a new "Component" gadget type. This can be used to embed UI Pages from the UI Pages library into a gadget of a Form section.
  • Added Lianja.hideDialog() which closes the current modal dialog created with Lianja.showDialog().
  • Added some new example apps to the App Center Home workspace.
  • Added a "Manage Data" tile to the Home workspace for switching to the "Data" workspace.
  • Fixed an issue where CSS files where not being added to the "Deploy" workspace tree.
  • Fixed an issue where "include" directives in .rsp pages were not correctly looking in the library directory when lib:/filename was specified.
  • Added a new "Row height" attribute for Grid/attachment sections.
  • Added "Sub caption", "Read more" and "Sort by" attributes to the CatalogView section.
  • Added some new section attributes for setting the caption and data font sizes as well as the caption position for all form items contained within the form or canvas section.
  • Fixed up several bugs in "local" Virtual Tables.
  • Improved highlighting of text when using "Find" in the editor making it easier to see. Find also now wraps around the file.
  • Various code editing improvments including "Find All" across all files in an App.
  • Various reported bug fixes

 Lianja SQL Server Release Candidate RC5.3

Release date 21-Jun-2013

  • Fixed various reported bugs.

 Lianja App Builder Release Candidate RC6

Release date 28-Jun-2013

  • Improved the VFP project/scx/vcx importer. When importing .scx and .vcx files any classes that reference external classes cause the importer to generate SET CLASSLIB statements at the top of the generated file. These SET CLASSLIB statements are executed prior to the classes in the file being parsed and declared. There may be occasions where the importer gets the order of these SET CLASSLIB statements incorrect so you will need to edit the file and order them manually that being the case.
  • Various UI improvements with more tablet-oriented touch friendly functionality. Several App settings to allow you to choose between a "Flat" UI look or a "Gradient" UI look. There is more to come in this area soon. Open the "lianjademo" App from the App Center which has been updated to the new UI style.
  • New page navigation menu that slides in and out from the left hand side of the UI when the the "Page menu" icon is clicked or touched. This new navigation is the default when building Apps now. To resort to the older style with the "Navigation" button change it in the App settings.
  • Fixed some issues related to Grid/Column/Header classes in imported VFP forms.
  • Fixed an issue on Linux where modal forms could become obscured by the main window.
  • Fixed an issue with Virtual Tables where the updatefieldlist was not being handled correctly.
  • Fixed an issue with Virtual Tables when the ODBC connection string has { } inside it when connecting to MSSQL. This was being treated as a {} macro expansion. If you want to substitute macros into a dynamic connection string you should now prefix the connection string with either a & or a @ character otherwise {} macros will not be expanded.
  • Fixed various reported bugs.

 Lianja SQL Server Release Candidate RC6

Release date 28-Jun-2013

  • Fixed various reported bugs.

 Lianja App Builder Release Candidate RC7

Release date 19-Jul-2013

  • Made all properties and methods available for gadgets when referencing them in the LOM with Lianja.getElementByID().
  • Added support for keyboard shortcuts in section header and footer menus e.g. &Add,&Delete,&Refresh. Press Alt+A, Alt+D, Alt+R respectively. &F4 Edit, &F2 Search, etc allows binding menuitems to function keys.
  • Various improvements to VFP scripting compatibility.
  • Added section default attributes in App Settings.
  • Added choice of icon sets for section headers in App Settings.
  • Added CheckListView gadget and OptionGroup advanced control.
  • Enabled themes.
  • More example Apps.
  • Section menus now operate as dropdown menus automatically without having to click on the menuitem. Just hover the nouse over the menuitem and the menu will drop down.
  • Added the following new methods to the grid class. RefreshRow(row), RefreshRecord(recno), RefreshCell(row,col). The row/cell are refreshed but the grid stays on the active cell being edited. You would typically use these in the "InteractiveChange" delegate.
  • Various improvements to the VFP pjx/scx/vcx importers; handle multiple property declarations and creation of objects in subclasses that have incomplete parent class definitions in the VFP scx/vcx file.
  • Fixed a SQL issue which caused SQL SELECT not to query from an existing local cursor which has an alias name with the same name as the table being queried in the FROM clause. This provides additional functionality and performance by allowing mutiple SQL queries to be performed against a local cursor which was loaded from a remote VirtualTable data source without having to make any round trips to the server.
  • Added a new Field attribute that allows hiding the "Search Field Indicator" from the field which can be useful when CSS styling the UI.
  • Added a new delegate in pages -- "Instant search". This allows you to handle the standard instant search in custom code or an inline delegate. The delegate is called with the text input as a parameter. So if you want to perform a new query of data for a section and refresh() the section this is the delegate to use.
  • Added a new delegate for App,Page,Section and Formitems (Fields and Gadgets). The "Ready" delegate is called after the "Load" delegate when the LOM (Lianja Object Model) is ready.
  • Fixed an issue with SQL SELECT INNER JOIN.
  • Fixed various reported bugs.

 Lianja SQL Server Release Candidate RC7

Release date 19-Jul-2013

  • Now available for Windows, Linux x86_32 and x86_64.
  • Fixed an issue with SQL SELECT INNER JOIN.
  • Fixed various reported bugs.

 Lianja App Builder Release Candidate RC8

Release date 20-Aug-2013

  • Added a "Sort" delegate to grids.
  • Added a new method "deselect()" to grids to unhighlight the selected row.
  • Further improvements to the VFP importers.
  • Added various new attributes to sections.
  • Fixed an issue with SEQNO().
  • Fixed an issue with SQL SELECT COUNT(0) with no matching rows.
  • Fixed an issue with editing Page/Section Custom Libraries stored in the main Library (lib:/).
  • Fixed an issue with DODEFAULT().
  • Fixed an issue with UI Framework OptionGroup.
  • Fixed a VFP compatibility issue with CLASS, PARENTCLASS and BASECLASS properties.
  • Fixed an issue with the access of the PARENT property of THIS.
  • Fixed an issue with SET MESSAGE and MESSAGEBOX() used in sequence.
  • Fixed an issue in the Users Workspace where users could not be modified after an update.
  • Updated the in App Builder Tutorial Video links.
  • Removed all the sample Apps from the Lianja App Center distribution. This is now a desktop runtime distribution so you will need to set the LIANJA_RUNTIMEDIR environment variable for each desktop PC to point at where your shared Apps, Libraries and Data are located on a shared drive e.g. on windows F:\lianja\ (don't forget the trailing \). On linux the default location is /opt/lianja/cloudserver/tenants/public/ so you just need to "Deploy" your Apps, Libraries and Data into that directory root using the "Deploy" workspace.
  • Fixed an issue with Lianja.showDialogPanel() which was not working modal.
  • Fixed an issue where gadget "Components" loaded from the UI Page Library were not being added into the Lianja Object Model (LOM) hierachy correctly so their sub-components could not be properly referenced using Lianja.getElemenyByID().
  • When Lianja.showDialog() or Lianja.showDialogPanel() are called the following delegates are called for the UI page which is being loaded from the UI Page Library; "Load", "Ready", "Activate" -- in that order. This provides the ability to set attributes in the dialog panel before it is refreshed into the UI. Prior to these delegates being called, the UI page is added into the LOM so UI elements can be referenced correctly using Lianja.getElementByID().
  • Added the PHP-compatible move_uploaded_file(filename, target_filename) function for use in .rsp pages. If you have selected any files to upload in an HTML form the _FILES[] associative array contains the name of the uploaded files and their information. You can just use move_uploaded_file(_FILE[1].tmp_name, _FILE[1].name) to copy the file to the target destination. The move_uploaded_file() function will only allow files which do not have any of the following file extensions; "exe", "rsp", "prg", "js", "css", "htm", "html". Target filenames containing ".." are also rejected. This function will also prefix the target filename with the WWWROOT directory for security reasons.
  • Added new SHA-1 (Secure Hashing Algorithm) functions; SHA1( cExp ) and SHA1FILE( filename ). These functions return a 160-bit message digest for the given argument. The SHA1FILE() function can take a filename or a wilcard e.g *.dbf and it will generate the SHA-1 message digest for the contents of all files that match the given pattern. The result of the function is a 40 character string representing the 20 byte binary result of the SHA-1 message digest.
  • Fixed various reported bugs.

 Lianja SQL Server Release Candidate RC8

Release date 20-Aug-2013

  • Now includes an integrated HTTP server with support for server-side pages written Visual FoxPro compatible scripting (.rsp pages) on all supported platforms. This is a fast and scaleable HTTP web server which is integrated in with Lianja SQL Server. Both the SQL Server and the HTTP Server are extremely fast with a very small footprint of < 50KB and a shared library of < 8MB which they both make use of.
  • Now includes an integrated OData server providing OData-compatible RESTful database access with full CRUD capabilities. This provides you with the ability to use industry standard JavaScript frameworks such as jQuery and Backbone.js to talk directly with Lianja SQL Server through an easy-to-use RESTful API.
  • Fixed various reported bugs.

 Lianja App Builder Release Candidate RC9

Release date 26-Sep-2013

  • Added "Expanded" and "Collapsed" section delegates. These are called when a section header click causes the section contents visibility to change state. If you layout your UI with multiple related sections and set the "Hide header at runtime" attribute on the sections then you can hide or show other sections on the page in these delegates. As with all delegates in Lianja, they can be inline so they do not require code to be written. e.g. $("section:section2?hide") or $("section:section2?show"). There is a new example App in the distro called example_groupedsections that shows you how to use these new delegates.
  • Added "DialogButtonClick" section and page delegates. If a field on a form has a "Dialog Button" and the button is clicked, if there is no "DialogButtonClick" delegate then it will call the delegate of the parent section. If the section has no delegate specified it will call the page delegate. Two arguments are passed to the page and section delegate; The first is the fully qualified ID of the field e.g. "page1.section1.field1" and the second argument is the data source e.g. "customers.customername". You can use Lianja.showDialog() or Lianja.showDialogPanel() to then popup pages from the UI Page Library that search for data and optionally edit it.
  • Added SET CSVHEADING ON | OFF to enable better customization of COPY ... TYPE CSV DELIMITED WITH ".." file output.
  • Added SET DEBUGTRACE ON | OFF to assist in tracking down hard to find bugs. This provides an execution trace to the debug.txt file.
  • Added support for JavaScript Server Pages (.jssp pages) in WebViews.
  • Added "Autosave in UI Page Library" attribute to pages. This causes the page always to be saved into the UI Page Library when the App is saved.
  • Added "Copy this file to the Cloud website" to the headerbar and to the file context menus. You need to have Lianja Cloud Server installed to take advantage of this feature.
  • Enhanced Lianja.showDialog() and Lianja.showDialogPanel() to allow chaining of "actions" using ||. 
  • Fixed various VFP compatability issues related to initializing properties that reference sub-objects of the object being created.
  • Fixed various issues with #define using other #define constants.
  • Added "Collapsable" attribute on the "Navigation Panel" of a page. This provides the ability to hide or show the Navigation Panel by clicking on the right border toggle panel (left border toggle panel if the Navigation Panel is positioned on the right).
  • Fixed an issue where CLOSE DATABASE was also closing free tables not contained within the database.
  • Added the "Cloud" workspace for managing Lianja Cloud Server and its related services. See this article for details of the Lianja Cloud Server.
  • Added SET DEBUGCOMPILE ON|OFF which causes the compiler to include debugging information in the compiled code file. When trying to track down "hard to find" bugs, issue SET DEBUG ON in the console, run your app and the c:\lianja\debug\debug.txt file will contain a complete execution trace history with the source code of the lines executed. This file can get quite large but nevertheless is helpful. before running your app delete all object files. After debugging remember to SET DEBUGCOMPILE OFF and remove the object files so that they get regenerated.
  • Various performance improvements from additional internal tuning.
  • Fixed an issue with WAIT WINDOW grabbing keyboard and mouse events incorrectly.
  • Fixed an issue with nested Lianja.showDialogPanel() calls.
  • Fixed an issue with nested Lianja.showDialog() calls.
  • Fixed an issue where the grids were not displaying "No records" when a filter condition resulted in no records being selected.
  • Fixed an issue laying out canvas sections that had "Hide header at runtime" checked. They now adjust their size correctly when the header is hidden in runtime mode.
  • Fixed an issue erroneously importing some MSSQL system tables which could cause a crash to occur.
  • Fixed an issue where the "Automatically relate" checkbox in the section attributes was disabled.
  • Removed the "Debug" workspace and integrated the debugger into the "App Inspector". The App Inspector tool button is now in the Console, Apps, Library and Pages workspace HeaderBar. You can load and run apps using the debugger to set breakpoints and watchpoints in your delegates. 
  • Fixed an issue referencing custom attributes on fields in form/canvas sections.
  • Fixed an issue with requery() of a CursorAdaptor on a Virtual Table which was not correctly removing the existing WHERE clause on the SQL SELECT.
  • When a requery() is issued on a CursorAdaptor of a Virtual Table the section that it is bound to automatically positions to the first record and the data navigation bar is updated to reflect the number of records selected. Example:

    ca = cursorAdaptor("vcust")     // Get a reference to the CursorAdaptor object for the specified local cursor
    ca.requery("customerid='B'")    // This will requery the ODBC data source, replace the local cursor and
                                    // automatically update the section that it is bound to

  • Fixed an issue updating MySQL Virtual Tables that have NULL values in columns.
  • Added support for SQL statements in section attributes for use with Virtual Tables. 
  • Various VFP scripting language compatibility improvements based on feedback from the Lianja Developer Community. 
  • Fixed various reported bugs

 Lianja SQL Server Release Candidate RC9

Release date 26-Sep-2013

  • Fixed various reported bugs.

 Lianja App Builder Release Candidate RC10

Release date 28-Oct-2013

  • Fixed various reported bugs.

 Lianja SQL Server Release Candidate RC10

Release date 28-Oct-2013

  • Fixed various reported bugs.

 Lianja App Builder Release Candidate RC11

Release date 7-Jan-2014

  • Fixed various reported bugs.

 Lianja SQL Server Release Candidate RC11

Release date 7-Jan-2014

  • Improvements to the SQL query optimizer to handle filtered indexes
  • Fixed various reported bugs.