Features

Labels
AJAX(112) App Studio(7) Apple(1) Application Builder(245) Application Factory(207) ASP.NET(95) ASP.NET 3.5(45) ASP.NET Code Generator(72) ASP.NET Membership(28) Azure(18) Barcode(2) Barcodes(3) BLOB(18) Business Rules(1) Business Rules/Logic(140) BYOD(13) Caching(2) Calendar(5) Charts(29) Cloud(14) Cloud On Time(2) Cloud On Time for Windows 7(2) Code Generator(54) Collaboration(11) command line(1) Conflict Detection(1) Content Management System(12) COT Tools for Excel(26) CRUD(1) Custom Actions(1) Data Aquarium Framework(122) Data Sheet(9) Data Sources(22) Database Lookups(50) Deployment(22) Designer(177) Device(1) DotNetNuke(12) EASE(20) Email(6) Features(101) Firebird(1) Form Builder(14) Globalization and Localization(6) How To(1) Hypermedia(2) Inline Editing(1) Installation(5) JavaScript(20) Kiosk(1) Low Code(3) Mac(1) Many-To-Many(4) Maps(6) Master/Detail(36) Microservices(4) Mobile(63) Mode Builder(3) Model Builder(3) MySQL(10) Native Apps(5) News(18) OAuth(8) OAuth Scopes(1) OAuth2(11) Offline(20) Offline Apps(4) Offline Sync(5) Oracle(10) PKCE(2) PostgreSQL(2) PWA(2) QR codes(2) Rapid Application Development(5) Reading Pane(2) Release Notes(179) Reports(48) REST(29) RESTful(29) RESTful Workshop(15) RFID tags(1) SaaS(7) Security(80) SharePoint(12) SPA(6) SQL Anywhere(3) SQL Server(26) SSO(1) Stored Procedure(4) Teamwork(15) Tips and Tricks(87) Tools for Excel(2) Touch UI(93) Transactions(5) Tutorials(183) Universal Windows Platform(3) User Interface(338) Video Tutorial(37) Web 2.0(100) Web App Generator(101) Web Application Generator(607) Web Form Builder(40) Web.Config(9) Workflow(28)
Archive
Blog
Features
Wednesday, November 8, 2017PrintSubscribe
Announcing Custom Native Apps and Offline Sync Add-on

Code On Time release 8.8.0.0 is expected to be available December 22, 2017. See our current roadmap at https://codeontime.com/roadmap.

With this release, will make it possible to download custom Windows 7 native client for your app based on embedded Chromium browser. The second option is a custom Universal Windows App for distribution via Microsoft Store. Both options will be available directly in the Publish screen of the app generator. We are also introducing a new product to enable “always offline” mode in those apps!

In a world where apps are everywhere, it makes sense to package your application in a native shell on all platforms, be it Windows, iOS, or Android. Such shell must not merely provide a custom online browser. The shell must host a local set of client-side application files while using the server components of the app to read and write data. This will not only increase speed of page loading (all required files are already on the device), but will also enable access to the device equipment and make it possible to work in a disconnected mode.

Custom Native Apps

Presently, the app generator offers a number of Publish options for deployment to a web server. After an application is published for the first time, an “App Store” option is displayed. The option is not implemented in the current release.

Generator will display “App Store” option on the Publish screen as soon as you publish your application to any of the supported targets (Azure, File System, FTP, etc). Deployed application is available on internet and native apps can access services provided by the server components of the app.

image

The Publish / App Store option will be expanded to allow getting access to the native implementation of the app for each supported mobile platform. The initial implementation will offer two options:

  • Mobile App for Windows - this is a customized version of the Universal Mobile App based on embedded Chromium browser (CMA-W7). Developers will be able to download the installation package for the app directly. Unlimited Edition users will have an option to download the source code as well

  • Universal Windows App - this is a customized version of the Universal Mobile App for Windows 10 and 10S (CMA-10). Developers will be able to download the installation package for Windows App Store. Unlimited Edition users will be able to download the source code as well.

Follow up releases will make available similar options for Apple iOS, Google Android, and Apple MacOS. We are hoping to complete support of the other mobile platforms by the end of March 2018. See the roadmap for details.

    Offline Sync Add-on

    Offline Sync Add-on makes its appearance in this release. The add-on will be available for purchase at https://codeontime.com/buy. The purchase will be delivered to you as a zip file with the name “addon.OfflineSync.YOURCOMPANY.zip”. Copy the zip file to ~/Documents/Code OnTime/Addons folder. The application generator will automatically expand the contents of the file when the app is generated.

    Installed addon will enable “always offline” mode in your application. Any pages marked for offline will magically become fully autonomous. The relevant data will be downloaded when application is installed on the native device. Any data modifications will be executed locally while requests to change data are logged and saved. User interface will expose Sync option in the menu. If synchronization is requested, then the log of changes will be submitted to the application server and requests will be executed as a single transaction. If there were no errors, then the transaction is committed. Otherwise, the user will have the option to reconcile issues for each individual error and attempt to resubmit the entire change log.

    Here is a screenshot on app with Offline Sync Add-On installed. The tablet-sized screen will display synchronization status icon as a cloud in different states. In this case, all data is downloaded and there are no pending changes.

    image

    User can access “Sync” option in the context menu of their app shown next. This option is always present in the app enhanced with Offline Sync Add-On. It provides additional settings such as automatic synchronization.

    image

    See the roadmap for more details about offline features.

    Tuesday, November 7, 2017PrintSubscribe
    Alpha Anywhere (Alpha Five)

    Code On Time is the rapid application development tool designed to help you build forms, reports and apps. It provides integrated deployment to your choice of application server via FTP, File System, Microsoft Azure, and more. End users work with the forms, reports, and apps offline, online, and on premises.

    Our product is a great alternative to many “low code” development tools available on the market. We would like to offer a comparison of our product with a few of those tools.

    A frequently asked question we are getting is to highlight the differences of Alpha Anywhere (formerly Alpha Five) and Code On Time app generator. Please take a few minutes to read our Comparison of Alpha Anywhere and Code On Time and let us know what you think!

    The article discusses the following subjects:

    • Modern Application Architecture
    • Application Development Process
    • Rapid Application Development (RAD) tools
    • Server-Side Technology
    • Application Programming Interfaces (APIs)
    • Data Access
    • Business Rules
    • Server Deployment
    • Client-Side Technology
    • User Interface Design
    • Data Binding
    • Client Deployment

    We also delve into “bells & whistles” available in Alpha Anywhere (formerly Alpha Five) such as:

    • Pre-Built Apps
    • Integrated Deployment
    • PhoneGap Build Integration
    • Easy Integration with NoSQL
    • Image Annotations
    • Offline Data
    • Scanner Support
    • CSS Editor
    • Video and Image Gallery
    • Custom Control Support
    • Device-Specific Preview

    Comparisons of Code On Time with other low-code and RAD tools will be published on our blog in the future.

    Monday, September 18, 2017PrintSubscribe
    Executing Requests with the Client API

    All apps created with Code On Time app generator contain a single client-side API used for all server-side operations, including Select, Insert, Update, Delete, Report, Batch Edit, etc. One significant advantage of using a centralized API is that any style of user interface is able to access the same API – this has allowed the co-development of Classic and Touch UI.

    Another major advantage in the client-side API is that developers are able to extend their apps with custom behavior utilizing the same data access routines – any access control rules, data controller customizations, and security restrictions will also equally apply to these custom requests.

    To access the client API from custom JavaScript, simply call the method $app.execute(options) with the required parameters set on the options object. See a list of available options parameters below.

    Property Description Default Value
    controller The controller to direct the request to. (required)
    view The view of the controller to use. grid1
    done
    success
    Callback function when the request was send and received successfully. First argument contains the results. List of records can be found under the result property equal to the name of the controller.
    fail
    error
    Callback function when the request failed.
    command The name of the command to execute. “Select”
    argument The argument of the command to execute.
    lastCommand The last command name.
    lastCommandArgument The last command argument.
    pageSize The number of records to return in a single page. 100
    pageIndex The page number to return. 0
    filter An array of field filter objects. Each object must have 3 properties:
    - “field” specifies the field name
    - “operation” specifies the filter operation to perform
    - “value” specifies the value of the filter. For operations with two operands (such as “between”), specify an array of two values.
    values An array of field value objects. Each object can have the following properties:
    - “name” specifies the name of the field matching the one defined in the controller.
    - “value” specifies the current value of the field.
    - “newValue” specifies the new value.
    - “modified” specifies that the new value will be used in any Insert or Update expressions. Setting “newValue” will set “modified” to true by default.
    selectedValues An array of strings that contain the primary keys of the selected records. Used for batch update.
    tags Specify a list of tags that can be processed on the server.
    requiresData Specifies if data should be returned to the client. true
    requiresAggregates Specifies if aggregates defined on the view should be returned with the request. false
    fieldFilter Specifies a list of fields to include in the response for each record. Not setting this value will return all fields.
    format Specifies if field values should be formatted when the results are returned. true
    includeRawResponse Specifies if the result should include the raw response in the rawResponse property. false

    The simplest way to test your queries is to use the Developer Tools Console, available in most modern browsers.

    First, browse to your running site in your favorite browser. Press “F12” to bring up Developer Tools. Switch to the Console tab.

    Using the Console tab of Developer Tools to test the $app.execute() API.

    You may now begin typing in $app.execute() requests in the console. Note the use of console.log(result), which will print the JavaScript object to the console when the request returns.

    The following examples will use the online Northwind sample.

    Select

    The simplest use case for using the API is to request a page of data. See the following example below on how to fetch the first 10 records from the Orders table where the field “ShipCountry” is equal to “USA”.

    $app.execute({
        controller: 'Orders',
        pageSize: 10,
        filter: [
            { field: 'ShipCountry', operator: '=', value: 'USA' }
        ],
        done: function (result) {
            console.log(result);
        }
    })

    The result shown in the Developer Tools Console.

    Selecting 10 orders with a filter.

    Insert

    In order to insert records to a particular table, the request must specify the “Insert” command and a list of field values. This list is represented by the values property. Each field value object contains a field name. Values that will be assigned to the new record are stored in the field value’s newValue property. The primary key of the table is added as a field value object with the property value equal to null in order for the response to return the new primary key of the inserted record.

    $app.execute({
        controller: 'Orders',
        command: 'Insert',
        values: [
            { name: 'OrderID', value: null },
            { name: 'ShipCity', newValue: 'San Diego' },
            { name: 'ShipCountry', newValue: 'USA' }
        ],
        done: function (result) {
            console.log(result);
        }
    })

    See the results below.

    Inserting a record using the $app.execute() API.

    Refreshing the view in the browser window will reveal the new record.

    The new record is displayed in the grid.

    Update

    When performing operations on an existing record, either the primary key or an array of selected values must be specified. New field values must be specified in the newValue property.

    $app.execute({
        controller: 'Orders',
        command: 'Update',
        values: [
            { name: 'OrderID', value: 11083 },
            { name: 'OrderDate', newValue: new Date() }
        ],
        done: function (result) {
            console.log(result);
        }
    })

    The result is shown below.

    Updating an order via the $app.execute() API.

    The result can be seen by refreshing the list of orders.

    The updated field value is visible by refreshing the page.

    Delete

    Delete operations must specify the primary key in the values array.

    $app.execute({
        controller: 'Orders',
        command: 'Delete',
        values: [
            { name: 'OrderID', value: 11079 }
        ],
        done: function (result) {
            console.log(result);
        }
    })

    See result below.

    Deleting a record.

    The rowsAffected property will be equal to “1” if the record was successfully deleted.