Release Notes

Blog
Release Notes
Wednesday, March 13, 2019PrintSubscribe
Faster Than Ever, Unlimited Trial With Fewer Limits
Release 8.7.10.0 is yet another steps towards the wonderful v9. This release features exceptional speed of code generation when you are making project design iterations. If you have an existing project created awhile ago, then make sure that you can generate it with the new release to get ready for Live Project Designer in Code On Time v9.

Unlimited Edition Trial is also included. The new release removes the limit on the number of data models in the project. You can create apps with any number of entities.

We are accepting requests for private live demonstrations of Offline Sync. A number of framework enhancements are introduced in the release in the preparation for the launch of this new exciting product. Just a few clicks will magically convert your online database app into disconnected (always offline) application.

If you would like to see the demo of Offline Sync then please open a support ticket and let us know your availability. Numerous changes to the Offline Data Processor (ODP) are included in the release. The completion date of ODP is rapidly approaching. We will switch the version numbering to 8.8.0.0 when ODP is released to production.

The following features and bug fixes are included in release 8.7.10.0:

  • (Touch UI) Calendar view correctly evaluates values of primary key fields when the presented in summary mode (dashboard).
  • (Client Library) Visible When and Read Only When expressions correctly evaluate $master.FieldName expressions.
  • (Offline Sync) Data download is initiated when "starting.app" event is triggered to prevent blinking.
  • (Framework) If an app without authentication is asked to confirm the user identity by Cloud On Time on branded app then a suggestion to add membership to the app is displayed. The app without a security system will not be installed.
  • (Model Builder) Command "Add all entities" will create data models for each remaining entity in alphabetic order.
  • (Touch UI) Tab bar algorithm shows "More" button with invisible tabs in fewer situations. Most of the time all tabs will be visible if there is a real estate on screen. Previously "..." option was rendered even when there was some space to fit the tabs at the bottom of the screen.
  • (Framework) Cached ~/touch-settings.json will be reloaded if it has changed or if web.config has changed.
  • (Project Wizard) New Project form does not show the name of the previously selected project in the window title anymore.
  • (Framework) Commit result is marked with date+time in "Date" property when returned to Offline Data Processor.
  • (Touch UI) Method $app.touch.toSmartDate(d) will return a smart date produced from the supplied date value.
  • (Framework) Exception is not raised when calling headerField() method on a data view that was not fully initialized.
  • (Touch UI) The text of static lookup items is presented correctly in grid/list/cards. Radio Button List, Check Box List, and List Box correctly show the selected value in edit mode for such items.
  • (Touch UI) The background of the field name in context menu displayed for field values is matched with the background color of the popup.
  • (ODP) If the entire set of rows is provided and the partially-loaded  set of rows does not exist then the row-by-row processing with key comparison is not performed.
  • (ODP) If pageSize is not defined in ODP configuration then the default value is 100.
  • (Touch UI) If event menuitem.app has stopped selection of menu item then the visual "selected" style is applied to the previously selected item.
  • (AppGen) Data access objects and Blob.generated.cs(vb) files are re-generated when controllers are changed.
  • (AppGen) Adaptive code generation minimizes transformation of unchanged files.
  • (AppGen) Publishing of the app will cause refresh of the ApplicationServices.Generated.cs(vb) file during the next code generation session.
  • (Framework) Arguments in the URL specified in the root of the app will not cause an exception when CMS is enabled.


Tuesday, March 5, 2019PrintSubscribe
Build Apps Faster With Maps and Postal Address Verification
Code On Time release 8.7.9.0 brings the upcoming live designer another step closer to reality and introduces various cool features in the application framework including Postal Address Verification, external JavaScript business rules, enhanced batch editing of many-to-many fields, maps in forms, and much more. We also hope that you will notice the significant increase in the code generation speed.

For the past few years we were developing a new innovative development environment to revolutionize Rapid Application Development of custom business applications that work offline, online, and on-premises. This particular release makes your apps ready for Code On Time v9. Today you are starting the Design environment by selecting the corresponding option in the project wizard. In the very near future your own app will be launched with the new design environment  overplayed on top! The upcoming live designer is implemented as addon.appbuilder.dll automatically included in the ~/app/bin folder of apps created with v9. The add-on integrates its own scripts in the application. The design environment is composed of Project Explorer and Object Inspector. Developer can click on user interface elements of their live app to inspect properties of the corresponding elements and have them changed when needed.  Changes to some properties (such as labels), will provide instant feedback in the user interface of the live app. Any significant changes will cause the app to be re-generated and restarted when the developer is ready to see the end result.

The mechanism of code generation has been changed significantly in release 8.7.9.0 to speed-up the code generation and improve the start time of the app. In many cases the app generator will replace only a few files in the source code and eliminate the need for hard restart of the app.

Published app will not include the add-on DLL in the output. App Builder add-on is not required for your apps to work. It is activated only if Code On Time generator is installed on the machine and if your app is accessed via localhost address. Both Touch UI and Classic UI apps will work with the new app builder, when released. You will be able maintain the source code of your apps in Visual Studio and work with the source control systems such as Git. Nothing will change from the development prospective.

Autofill and Postal Address Verification

Postal Address Verification is the new feature built on top of Autofill, the mechanism embedded in the universal input elements of apps created with Unlimited Edition.



An autofill group is created by tagging multiple fields with tags that start with "autofill-" prefix. For example, autofill-address-city. Component "address" in the tag defines the name of the group. Component "city" is the group-specific purpose of the field and does not need to match the physical field name. The trigger field in the group will cause "AutoFill" command to execute. More than one trigger can be declared by tagging multiple fields with autofill-[groupname]-trigger attribute. All trigger fields must have values for "AutoFill" command to execute.

The framework implements processing of autofill-address-, autofill-geocode-, and autofill-map- groups. Group address will verify postal addresses with Google Geocoding API. Addresses in the United States can be also optionally verified with USPS.  Group geocode will perform address lookup from latitude and longitude fields in the group. On-Demand field tagged as autofill-(address|geocode)-map will resolve the address into a static map presented to the user.

Event menuitem.app

New event menuitem.app is triggered on the document to allow a custom script to form. For example, the following script will display a login form if Test item is selected in the menu.

(function () {
    $(document).on('menuitem.app', function (e) {
        if (e.item.url === '/pages/test') {
            $app.touch.show({
                controller: 'MyProfile', 
                view: 'loginForm',
                startCommand: 'New',
                startArgument: 'loginForm'
            });
            return false;
        }
    });
})();

This is how the app will behave in response to the user actions:


External JavaScript Business Rules

It is now possible to create JavaScript business rules without explicit definition in the data controller. Save the file in ~/js folder of the app, put a breakpoint, and hit Ctrl+F5 when the app is loaded in the browser. Your custom business rules will execute in Before phase giving you complete control over various behaviors of the app. This type of business rules is also support in native mode.

This particular sample when force the user to enter USA in the Country field of Suppliers controller for the record to save. This is a perfect example of client-side validation.

Also the user will not be able to execute New command and therefore will not be able to bring up the form to create new records.

(function () {
    $app.rules = {
        'Suppliers': {
            'Update':
                function (dataView, args) {
                    var data = dataView.data();
                    if (data.Country !== 'USA') {
                        $app.input.focus({
                            fieldName: 'Country',
                            message: 'Only USA is allowed in this field.'
                        });
                        return false;
                    }
                },
            'New': function (dataView, args) {
                $app.touch.notify('You are not allowed to create new records.');
                return false;
            }

        }
    };
})();

This how it make look at runtime:


Also Included


The following features and bug fixes are included in this release:

  • (Batch Edit) Many-to-Many fields display "keep original selection" and "delete original selection" options to allow either expanding the set of selected options or to have it replaced with a new set.
  • (EASE) Tracking of created/modify by/on fields does not overwrite the values of Created By/On fields when blobs are uploaded.
  • (EASE) Modified/Created By/On fields are displayed on form views in edit/read mode.
  • (EASE)  Modifed/Created By/On fields are not displayed in form views in "new" mode.
  • (Classic UI) Projects with advanced options and "Classic UI" are correctly generating the theme folder.
  • (Framework) Data access objects based on models without a primary key will not result in compilation error when the app is generated.
  • (Touch UI) Floating category without wrapping will display 2 or 3 columns of fields with the minimal width of the form equal or greater than MD and LG accordingly.
  • (Touch UI) Floating category with wrapping will display 2, 3 or 4 columns of fields with the minimal width of the form equal or greater than SM, MD,  and LG accordingly.
  • (Touch UI) Import treats dates serialized in Excel files as UTC dates and performs de-serialization equivalent to the one performed when getting data from the server.
  • (Touch UI) Smart dates are instantly refreshed if a date value is changed by user via direct input without using the calendar popup.
  • (Touch UI) Map locations on iOS and Mac open via OS-specific URLs.
  • (Touch UI) URLs prefixed with "_blank:" will open in the default OS web browser when running in native mode (Cloud On Time or branded host app).
  • (Classic) Modal forms with conditionally visible content are resized after dragging.
  • (Classic) Initial state of "form" buttons with When Client Script expressions is calculated correctly.
  • (Touch UI) JavaScript expressions specified in When Client Script property of actions are evaluating the current row using the same mechanism as the Visible When and Read Only When expressions of fields and categories. This improves performance and addresses issue of incorrect values tested when form views are opened.
  • (Touch UI) RTF editor toolbar is fully visible whatever the position of the "Rich Text" field in the form view.
  • (Touch UI) RTF fully supports "Dark" theme.
  • (Touch UI) Calendar view does not display "New/grid1" option when user clicks the calendar to create an event.
  • (AppGen) Display name of the projects is used as application name when the app name is not defined in the project features.
  • (Touch UI) ListBox/RadioButtonList/CheckBoxList do not cut the bottom of item in FireFox browser.
  • (Classic)  Dedicated Login page correctly links bootstrap CSS file.
  • (AppGen) It is now again possible to create new projects based on ASPX page model with the framework in the class library.
  • (Framework) Message "unable to load..." with either the name of the resource script of path to the script is reported if there was an exception while enumerating client library scripts.
  • (App Gen) All translated files are created with UTF-8 encoding Byte Order Marker. If the translated resources are the same, then the files are not overwritten.
  • (AppGen)  All files are saved in UTF-8 format with explicit Byte Order Marker during the build process of the project.
  • (AppGen) VB projects with the core framework in the class library are generated correctly.
  • (Touch UI) Confirmation controller will display the value of "data field" of the context record in the header of the form.
  • (Touch UI) Action with confirmation controller will cause explicit validation of field value before execution. If action causes validation error, then the confirmation controller will not execute until all validation errors are fixed.
  • (Action State Machine) Calling BusinessRules.PreventDefault() method will cause action state machine to stop processing of actions unless Result.Continue() was explicitly requested or the command name was Insert|Update|Delete. 
  • (Action State Machine) If a value is assigned to Result.NavigateUrl in business rules, then the framework will stop processing of the actions unless Result.Continue() is called explicitly in business rules.
  • (Touch UI) Event createlayout.dataview.app is triggered on the document whenever a form layout is required. Event generatelayout.dataview.app is triggered once and the output is cached as needed.
  • (Project Wizard)  App generator version is embedded in DataAquairum.Project.xml to ensure regeneration of core framework files when f the project has been cloned/copied after a product update installation.
  • (Project Wizard) Data Model List or Business Entity List is automatically focused when Data Model & Business Logic page is activated.
  • (Project Wizard) Data Model List is fully redrawn after a new model is added.   Business Entity List is fully extended when there are no models.
  • (Client Framework) Method $app.execute accepts filter in the form of an object. For example, filter: {CategoryID:5}.
  • (Client Library) Method DataView.data() returns an object with properties representing current values of fields. New object property "_modified" will have its own properties representing old values of modified fields.
  • (Framework) XmlConverter automatically locates the first element in XML document and takes its name for the root JSON property if the root is not specified.
  • (AppGen) Removed redundant parenthesis for simple "Not" unary expressions in the code of c# projects.
  • (Framework) XmlConverter performs a robust enhanced conversion of XML to JSON to support v9 Project Designer and Inspector.
  • (Framework) User settings embedded in the page do not include "server" section from ~/touch-settings.json. This section is removed before inclusion in the page.
  • (Framework) Developers can implement method ApplicationServices.ValidateBlobAccess to alter the verification of user access to the row with the blob and the blob field itself. The overridden method can return false to disable blob access validation.
  • (Framework) Removed "download done" cookie creation when Blob.DirectAccessMode is true.
  • (Touch UI) Partially visible summary view is not scrolled into view when an option on its toolbar is selected.
  • (Touch UI) Fixed the bug in the implementation of auto focus on the last input when the window is activated.
  • (Framework) Added auto-registration of Code On Time App Builder v9.
  • (Touch UI) Reduced redundant functionality of jQuery Mobile for a more compact code.
  • (Touch UI) JavaScript business rules automatically skip updating values of fields with unchanged values.
  • (Touch UI) JavaScript event menuitem.app is triggered on document object before the menu option is selected. Event property "item" provides access to "url", "description", "title", and cssClass associated with the selected menu item. If an event handler returns false or prevents default then the menu option is not processed by the framework. Use this method to execute custom actions always available in the user interface.
  • (Client Framework) Added support for declarative JavaScript business rules that do not require explicit definition of the rule.
  • (Touch UI) Method $app.touch.show accepts object as "filter" property in the options for simplified syntax of filter definition.
  • (Framework) TLS12 is always enabled in the apps.
  • (Framework) Apps with ASPX page implementation do not serve files with *.json extension over HTTP.
  • (Framework) Denies HTTP access to acl.json, touch-settings.json, ~/permissions, and ~/reports folders in apps with SPA implementation of pages.
  • (Framework) Default settings from ~/touch-settings.json are stored in application cache for improved performance.
  • (Touch UI) Email icon is displayed in context menu as an independent action for "email" fields.
  • (Touch UI) Script error is displayed as notification when an exception is raised in the rendering phase of the view on the client
  • Monday, January 14, 2019PrintSubscribe
    Faster Code Generation, Clear Filter Button, Bug Fixes

    Release 8.7.8.0 introduces the following features, enhancements, and bug fixes:

    • (Touch UI) Ion “Clear” is displayed next to the "filter description" to allow one-click clearing of the filter.
      Clear button is displayed next to the filter in Touch UI apps created with Code On Time app builder.
    • (Touch UI) Lookup field tagged lookup-fetch-all will pull all values that match the user criteria. The default limit is 1000 items.
    • (Model Builder) List of models displays "last changed/sorted" button at the top of the list if five or more models are available. Clicking on the link will toggle the sort order of project models.
    • (Framework) Apps deployed to virtual folder correctly reference CSS resources from the root of the app.
    • (App Gen) XSLT transformations are performed in memory when output files already exist to eliminate writing to the file system. This speeds up production and compilation of projects.
    • (App Gen) Classic themes are not copied in projects based on Touch UI to speed up code generation.
    • (Framework) Default max upload size is set to 2,097,151 KB in apps created with Free Trial and Unlimited Edition.
    • (App Gen) Custom "code" business rules are automatically included in the class library of the projects when enabled.
    • (Project Designer) Duplicate fields are suppressed in "grid" views as well as in "form" views of controllers when developer drops duplicates on the corresponding configuration elements.
    • (Framework) Fixed VB compilation issues of Access Control List code.
    • (Framework) Renamed ApplicationServices.AuthorizationIsNotSupported to AuthorizationIsSupported and changed the codebase accordingly.
    • (Framework) Removed implicit dependency on membership support in the apps.
    • (Library Downloader) Uses GET requests to download the licensed content instead of POST.
    • (Framework) Auto-complete values in lookups are shown correctly when virtualization is enabled.
    • (Touch UI) Tag clear-all enables "clear" icon in the form. Clicking on the icon will "empty" all fields in the form. This feature is great in dashboards and custom search screens. The video tutorial is coming soon.
    • (Touch UI) Click on the "arrow right" next to the empty lookup fields will not open popup in webkit browsers and instead proceed directly to the lookup.
    • (ODP) Uses optimized method of data view location and avoids infinite cycling under certain conditions.
    • (Touch UI) Method $app.input.execute accepts values passed in options as array, single object with name/value properties, and also custom objects.
    Labels: Release Notes