Forms, Reports, Apps

Build and deploy rapidly. Use offline, online, on-premises.

  Blog

Blog
Monday, November 18, 2019PrintSubscribe
Offline Sync and Offline Data Processor
Code On Time release 8.9.0.0 delivers unprecedented power in the hands of application developers. It makes possible creating apps that work online and offline without writing a single line of code.



The framework in the foundation of apps created with Code On Time relies on a unified API to get data and to execute actions. The models, user interface elements, and relationships are stored in the data entity configuration files on the server. The server-side code of the app relies on entity configuration to handle the requests received from the GUI of the app.


Offline Data Processor (ODP) is the new core feature of the framework. It injects itself in the unified API on the app pages marked as "offline". ODP monitors communications between the GUI and the server. If a request to change data is detected, then ODP intercepts the request, downloads data from the server to the client device, and executes the request on the JSON representation of the data replica. Subsequent requests are also executed on the replica and logged.  The log is committed to the server when the master form is saved. This enables transaction data input in apps created with Code On Time. ODP is available in all product editions.

Cloud On Time is a general moniker for the collection of native apps created by Code On Time LLC. The purpose of the collection is to allow executing online apps created with our products on the mobile devices. The app is available on iOS, Mac OS, and Windows platforms. Android version of the app is coming soon!

The app allows installing multiple custom applications on a mobile device. The user interface components of a custom application are downloaded and stored locally. Cloud On Time app loads application pages from the device storage and channels the requests to read/write data from the application GUI to its server-side components.

End users can access online applications created with Code On Time either in the web browser or with Cloud On Time app. White-label versions of Cloud On Time tailored for a particular online application will be available soon.

Offline Sync is the new product that makes possible executing custom applications in a disconnected/offline mode in Cloud On Time app. Our innovative solution relies on the Offline Data Processor of the application framework to pre-load the server-side data to the device when the custom application is installed on the device. ODP interacts with Offline Sync to read and write data. End user must explicitly request Synchronization of changes with the server.

Custom application running in Cloud On Time app or its white-label version is not affected by connection drops or unreliable online connectivity if it has Offline Sync enabled. Such application is always working in offline mode until the next time the end user chooses to synchronize data with the server.

The best part is that there is no code to write! Just enable the Offline Sync Add-on in the application features and re-deploy your app to the server.

ATTENTION: The refreshed versions of Cloud On Time app compatible with release 8.9.0.0 and Offline Sync have been submitted to the corresponding app stores for approval. Offline Sync Add-on will ship on November 19 and will be initially compatible with Cloud On Time for Windows 1.8.9.0. Cloud On Time 1.8.9.0 for iOS, Mac OS, and Windows 10 will become available later this week upon approval by corresponding app store providers. Android version is expected to ship before the end of the year.

The following features and bug fixes are included in release 8.9.0.0:
  • (Touch UI) Components of Classic UI were moved to the dedicated classic.js file. The file is included in the app with the legacy user interface only.
  • (Touch UI) Material icons are not visible until the font is completely loaded.
  • (Touch UI) Fantom "empty" tool-tips are not displayed in Microsoft Edge browser.
  • (Touch UI) View selector display Select All option next to "Multi Selection" to allow selecting all items in Gird/List/Cards mode.
  • (Touch UI) SQL business rule calling set @Result_RefrehsChildren = 1 and "code" business rule calling Resutl.RefreshChildren() will correctly synchronize the child data view fields.
  • (Universal Input)  New client library method $app.input.reset("FieldName") will cause the lookup input to reset its items. Anny cached items are cleared. Static items are re-fetched from the server.
  • (Framework) Optimized server-side population of static lookup items.
  • (Framework) Check for aspnet_SchemaVersions is now wrapped in try/catch to prevent exceptions.
  • (AppGen) Restored ability to build projects with the framework in the class library when only VS2019 is installed.
  • (Touch UI) Pages with infinite data scrolling instantly update the menu on the toolbar instead of waiting for data to become available.
  • (Touch  UI) New option ui.multiSelectMaxRowCount controls the maximum number of rows that can be selected at once when specified in ~/touch-settings.json . The default value is 1000.
  • (Publish) Publishing will delete _server folder before the app is compiled to avoid  conflicts with Microsoft One Drive on Windows 10 trying to backup the folder.
  • (Touch UI) Basket input will cause the DataView fields to to move down with the content when items are wrapped to the next line.
  • (Touch UI)  Keyboard entry in the basket input will stay i the inbox box after hitting Enter key. Previously the first item in the basket was selected
  • (Batch Edit) Borrowed fields specified in the Copy property of lookups are visually presented in the Batch Edit form.
  • (Calendar) Popup calendar displays a count of events for individual dates when the option dates.calendar.countEvents is set to true in ~/touch-settiings.json  or if the data field is tagged as calendar-count-events. By default, the counting of events will be performed only in the calendar displayed on the sidebar. Previously counting has been performed always.  This feature improves performance.
  • (Touch UI)  Button "Show Less" is visible both on the Advanced Search form and in its context.
  • (Client Library) Gird/List/Cards collects the current row exactly as the form does when actions are executed.
  • (Touch) Fixed the issue with the page stub adjustment when the stub is not available.
  • (Touch UI) User interface behaviours conditioned on a return to the previous "virtual" page (previous form) are executed exactly at the end of the processing cycle. Previously this was not the case, which caused various GUI imperfections under some conditions.
  • (Client) Collection of action argument values does not include "null" field values that are not changed or read-only. This significantly reduces the payload of actions stored in the log by ODP.
  • (Framework) Added token-based resource translation to surveys.
  • (Framework) Visual Basic compatible FieldValue constructor.
  • (Touch UI) Event menuinit.app is raised just after the initialization of the navigation menu nodes.
  • Method BlobValidateAccess returns true if a request is received from ReportViewer. Such requests provide the validation key of the app and can be trusted.
  • (Framework) FieldValue instance constructed with new and old values is marked as modified only if the values are not the same.
  • (Touch UI) Blob upload prompt has a uniform height both on mobile and desktop devices.
  • (Touch UI) The default view style to present items on small screen is Grid. Previously the width of the screen was taken into account to present data as 'List' instead. List view style is selected automatically if long text or blobs are detected in the fields.
  • (Touch UI) Image preview will be displayed as semitransparent if it is going to be cleared after update.
  • (Offline Sync) Navigation menu is trimmed when online/offline status of the device is changed.
  • (ODP) Offline Data Processor is enabled automatically on pages marked as "offline".
  • (ODP) A dedicated data processor is assigned to any child form to allow multi-level transactional input.
  • (ODP) Numerous enhancements of many-to-many and BLOB field processing. ODP creates client-side actions to delete/insert junction table entries and marks the m2m field with Scope="client".
  • (ODP) Synchronized commit of logged actions with multiple instances of Data Processor.  Now commit and cancellation of in-memory data works correctly.
  • (ODP) If option odp.compressLog is set to false in ~/touch-settings.json, then no compression of log is performed. Log compression is enabled by default to combine multiple insert/update requests into a single request with an extended set of values.
  • (ODP) Server-side Calculate and New commands are executed by data processor if the app is not working in offline mode and if the device is online.
  • (ODP) Pending files of pending deleted records will not be uploaded when the master record is committed to the server.
  • (Client) JSON data is parsed with the standard JSON.parse if native data conversion is not required. This improves performance of ODP and Offline Sync.
  • (Project Designer) New property "text" is now supported in the data controllers. The value of the property is displayed as a user-friendly name of the data controller by ODP and Offline Sync.
  • (ODP) "Report..." and "Export..." commands will not execute and display a warning when:
    1) There are pending changes it the form.
    2) The app is offline and and the sync has not been performed.
    3) The device is not online.
  • (Framework) All views in MyProfile data controller are tagged as odp-enabled-none to facilitate server-side calls both in online and offline mode.
  • (OfflineSync) If offline sync is not enabled then $app.odp.offline() always returns false. Previously a value of 0 could have been returned when there are no offline data controllers.
  • (ODP) Multi-odp pass-through submission of files/blobs works correctly.
  • (ODP) If a new file/blob is submitted and later cleared by the user then there will be no attempt to submit a new blob when the record is committed.
  • (ODP) The cache of "load data" server responses in maintained in the master ODP instance. Previously a global ODP cache was used.
  • (ODP) No attempt to load data from the server is made if negative values are detected in external filter in the $app.odp.getData method. This will be the case when working with "new" data rows.
  • (Client Framework) Avatars are not added to the local storage when the token is refreshed in "hosted" mode in Cloud On Time or its derivative.
  • (OfflineSync) Logged transactions are stored in separate files for improved performance.
  • (Client Framework) Method $app.AccountManager.avatar is compatible with online and native modes.
  • (Touch UI) Added fail safe code to ensure that $app.input.focus will not fail if called before the app is initialized to ensure Mac OS compatibility.
Monday, October 14, 2019PrintSubscribe
Announcing Offline Sync Add-On
Code On Time is pleased to announce Offline Sync Add-On!  This new product converts your online application into an offline app capable of running in disconnected mode on tablets, phones, and laptops. Simply enable the add-on in the project and mark a few pages as “offline”. This is it!


The application shown in the next screen shot has been rapidly constructed with Code On Time app generator.


End users can access this app in any modern web browser on a device with Wi-Fi and Cellular connectivity.

What if your end users do not have a robust network connection? Offline Sync is the answer!

Enable the add-on in the Settings | Features of the projects.


Click Finish and activate Project Designer

Select a data page that will be available in disconnected / offline mode. Enable “Offline” checkbox and save the page. Repeat as needed.

Exit designer and proceed to generate the app. 

Copy the URL of the app in the web browser.

Install Cloud On Time app from the App Store of your mobile device. This app is available for  iOS, Mac OS, Windows, and Android (November 2017).

Start the app on the device. Cloud On Time app looks virtually the same on all platforms.


Tap the Connect button, paste the application URL in the input and press Save. 


Tap OK and Cloud On Time will load your online application in the hosted web view. 

Cloud On Time will proceed to install the front end of your application as soon as you sign in. The front end is composed on HTML pages, JavaScript, CSS, and Fonts. The front end files are transferred from the online application to the device.



This will be followed by downloading of data linked to “offline” pages. Offline Sync will follow the discovered data relationships and transfer the relevant records. User identity and application access control rules will limit the number of records. Downloaded information is persisted in JSON format on the device next to the front end files.


Your application is now running on the mobile device in hosted web view.


The cloud icon with a checkmark is displayed next to the user avatar indicating that the user is working in offline mode. The availability of network connection is irrelevant since Offline Sync is executing all data requests directly on the device.


If data is changed then Offline Sync executes the requests to update, insert, and delete records directly on the JSON copy of data while storing the requests in the log file. The cloud icon will change to indicate that the synchronization with the cloud is required.


End user can work with the app for extended period of time, close the app and restart the device as needed. The changes are safely persisted on the device. If the application on the server is down then this fact will have no impact on the “offline” users.

A tap on the cloud icon will activate synchronization. This process does require a network connection and the application on the server to be running.


If the user taps on Synchronize button, then the log of changes is submitted to the application on the server for execution. Errors are returned to the device for user review and reconciliation. 

If the synchronization was successful and “Refresh Data” checkbox is not selected, then the log of changes on the device is cleared and the data on the device is considered to be “in-sync”. It means that the local data does not reflect the true state of the database on the server. 

If the user elects to refresh data, then the successful sync is followed by synchronization of the front end files and downloading of the complete dataset from the server. Once again the data will be limited to those records that the user can access as defined by application access control rules.

The pricing for Offline Sync starts at $9 USD per device per month. See the license agreement and pricing examples at https://codeontime.com/documents/offlinesync-eula.pdf


Code On Time will begin shipping purchased licenses on October 18, 2019. Links to download the software will be delivered via email. The automated distribution system for Offline Sync Add-On will be launched later this year.

Offline Sync Add-On relies on the Offline Data Processor (ODP) included in the framework of applications created with Code On Time app generator. ODP does not require licensing and enables the exciting new feature Transaction Data Input in both offline and online applications. 

If at least one Data View field is included in the form used to create new records, then the end user will be able to enter child data rows along with the master on the pages marked as “offline”. ODP accumulates new child records on the client and submits them alone with the master in a single transaction when the master record is saved.



Watch this cool feature in action at https://www.youtube.com/watch?v=szwlCLSS2JI&list=PLy2g3SjvDe2b2cl9i0msBaMVLntQucZtb&index=37&t=0s.

Offline Sync Add-On and Offline Data Processor are compatible with Code On Time v8.9.0.0 and up.

Sunday, July 28, 2019PrintSubscribe
Save and Continue
Action command Update now support SaveAndContinue argument in Touch UI with the release 8.7.14.0. This special argument value changes the behavior of the form after successful completion of Update command on the server. The form will not return to the previous view and remain in edit mode. It will retrieve the server values and display them to the user. Any visible DataView fields will be refreshed.



User can continue editing the record. Any server-side changes to the master and detail rows are visible to the user.

We will incorporate Update/SaveAndContinue action in the "Form" scope in the new projects by default . The new button will be displayed between Save and Cancel buttons in edit mode. Define this action explicitly to have it in your apps today.

The forms will also start displaying Next and Previous navigation buttons that will perform Update/SaveAndContinue as needed. You can try the hidden "Next" form navigation feature in "read" mode today by pressing Right Arrow key.

Release 8.7.14.0 introduces the following features and bug fixes:
  • (Touch UI) Action with command Update and argument SaveAndContinue will not close the form after successful execution. The form will stay in the current state and refresh the current row with the server data. The form will also sync the child data views.
  • (App Gen) New command line option -DataModel changes behavior of -generate and -refresh commands. App generator will not produce the source code when the option is specified. It also resets the data controllers. If the data models are changed manually or via automated scripts then the next execute of -generate command will incorporate the model changes into the app.
  • (Framework) New method ActionArgs.AddValues allows adding values to the Values array.
  • (Framework) Method SqlStatement.Configure accepts DbCommand parameter. It allows configuration of command properties such as CommandTimeout to be applied to the entire application framework. Create a partial class SqlStatement in Data namespace to override the method.
  • (Framework)  Server-side API _invoke allows specifying additional path/query information. 
  • (Framework) OAuth access_token and refresh_token must be non-blank to be written to OAuth configuration. Refreshing of tokens will not cause loss of token. 
  • (Framework) Site Content now supports ModifiedDate and CreatedDate to allow date-driven manipulation of content in the upcoming Content Add-On.
  • (App Gen) Prevented  interruption of Project Designer operation when exception "Unable to initialize native support external to the web worker process..."  raised while trying to access HTTP cache. The error seems  to be have its source in ASP.NET 4.8  HTTP Activation feature.
  • (Touch UI) Apps based on Touch UI do not specify data-show-modal-pages attribute on "div" elements representing data views. This setting applies only if Classic UI is also supported.
  • (App Gen) File web.config is correctly processed with "regex" expressions when created for the first time.