Blog

Labels
AJAX(112) App Studio(6) 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(178) 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) 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
Monday, April 9, 2018PrintSubscribe
Changing Field Values Via JavaScript Business Rules

Some form of validation is required in every application to help the user insert the correct data. Applications created with Code On Time app generator offer validation in the form of business rules.

Validating the Last Name field of the New Employees form.

Let’s add validation business rules the Employees controller of our sample Northwind app.

Open the Project Designer. In the Solution Explorer, switch to the Controllers tab, right-click on Employees / Business Rules node, and press New Business Rule.

Creating a new business rule on Employees controller.

Specify the following:

Property Value
Type JavaScript
Command Name Insert
Phase Before
Script
if ($row.LastName == 'Smith') {
    this.preventDefault();
    $row.LastName = null;
}

The above script will run when the user presses Save. It will check if the user has specified a Last Name of “Smith” – if so, it will cancel the save operation and clear the field.

Save the new business rule. On the toolbar, press Browse to run the app. Navigate to the Employees page and create a new record.

Creating a new employee with Last Name of "Smith".

Enter values for the employee and press Save. The save operation will not be executed, and the Last Name field will be cleared.

The Last Name field has been cleared.

Our business rule does ensure the user does not enter an incorrect value, but it does not make it clear to the user what is going on. We will want to add some feedback in the form of a message box to help the user understand.

Change the business rule as shown below:

if ($row.LastName == 'Smith') {
    this.preventDefault();
    // show message box
    $app.alert('Last Name "Smith" is not allowed.').done(function () {
        // update field value to null
        $app.input.execute({
            values: [
                { name: 'LastName', value: null }
            ]
        });
        // focus on the field
        $app.input.focus({ fieldName: 'LastName' });
    });
}

Our updated business rule has a few changes. Notice that the $app.alert function is used to display a message to the user. However, this alert will show a different form and change the current context. Attempting to update the field LastName after an alert is displayed will attempt to update a LastName field inside the alert form – which does not exist. Therefore, a done handler will need to be added to the $app.alert method call in order to execute code after the user closes the alert.

One more point to notice is that the $row variable is only in scope during the execution of the business rule. The asynchronous code in the done handler is executed when $row is out of scope. Therefore, it is necessary to use the $app.input.execute API to update the field values when the user returns to the Employees create form. The execute method accepts an object with the property values that contains a list of key value pairs. The $app.input.focus API is called in order to focus on a field called LastName as well.

Save the business rule and regenerate the project. Create a new employee with the last name of “Smith” and attempt to save. Notice that a message box now notifies the user that the last name is not allowed.

Alert message box is displayed to the user.

Press OK to close the message box. The Last Name field has been cleared and is currently focused.

The last name field is cleared and focused.

There are other ways of displaying a message to the user without interrupting the workflow. Let’s try the following:

if ($row.LastName == 'Smith') {
    this.preventDefault();
    $row.LastName = null;
    // focus and show message next to field
    this.result.focus('LastName', 'Last Name "Smith" is not allowed.');
}

The example above will clear the field, and use the result.focus() method to focus on the field, and display a message next to the input. The result can be seen below.

Focus message displayed next to the LastName field.

Another technique is to use the notification API to display a transient message to the user at the bottom of the screen.

if ($row.LastName == 'Smith') {
    this.preventDefault();
    $row.LastName = null;
    this.result.focus('LastName');
    $app.touch.notify('Last Name "Smith" is not allowed.');
}

The result can be seen below:

image

The notification will disappear after a default of 2 seconds.

Wednesday, March 7, 2018PrintSubscribe
App Factory vs App Factory (Advanced)

When users create a new project in the app generator using release 8.6.6.0 and later, the project type will now be App Factory.

App Factory projects will create an ASP.NET-hosted web site project, deployable to any server running Microsoft Internet Information Services (IIS).

These projects contain both a REST API web server and stream HTML, CSS, and JavaScript to web browsers, to support user interaction through a publicly accessible web site. App Factory projects also function as a REST API server for native Mobile Apps.

Developers can also enable App Factory integration with DotNetNuke and SharePoint.

App Factory project folder directory root contains metadata files required by the app generator, as well as the Visual Studio solution file. An “app” folder contains the generated code required to run the server.

Project structure of App Factory projects.

Note that projects created before release 8.7.0.0 will use the “WebSite” folder name instead.

The app folder contains a set of resources required for the application to function. The App_Code folder contains the application framework. Upon running the application, the code in that folder is automatically compiled and executed.

All styling is stored under ~/css folder. All client-side scripts are stored under ~/js folder. Standard styling and script files are read by the framework, joined together, and streamed to the client (native app or web browser). The “_ignore.txt” file located in the two directories enumerates which non-standard files and directories are included in the output.

App folder of App Factory projects.

App Factory (Advanced)

An additional checkbox is now present on the New Project screen – “Implement application framework as class library (for experienced users only).”

Implement application framework as class library.

When this option is enabled, the application framework code is placed in a separate class library project, named after the project’s namespace.

Folder structure of App Factory (Advanced) projects.

The developer must have an instance of Visual Studio 2010, 2012, 2013, 2015, or 2017 installed on the development computer in order for the application to run. At compile-time, the Microsoft Visual Studio compiler must compile and package the application source code stored in the namespace folder into a *.dll file under the app folder. Only then will hosting software (Microsoft IIS) will be able to run the application.

App Factory (Advanced) projects store standard CSS and JS files under the class library. Upon compilation, these files are saved as embedded resources and read from the class manifest.

Custom CSS files can be placed under a “css” folder under the “app” directory. Custom JS files can be placed under the “js” folder under the “app” directory. The framework will read any files in those directories and not excluded by the “_ignore.txt” file, and stream them with every page request.

Pros of App Factory (Advanced)

  • Application source code is stored in a re-usable class library.
  • Hosting provider or customer is unable to view or edit the application source code.
  • Developer can only modify code during debugging if solution platform is switched to x86.

Cons of App Factory (Advanced)

  • Microsoft Visual Studio is required.
  • Application takes longer to generate and compile.
  • Developer cannot modify code files while application is running.

Old Project Types

A number of project types have been deprecated or disabled:

  1. Web Site Factory – renamed to App Factory.
  2. Web App Factory – renamed to App Factory (Advanced).
  3. Mobile Factory – a variant of Web Site Factory with Classic disabled. Deprecated. Use App Factory with User Interface set to “Touch UI” instead.
  4. DotNetNuke Factory – a variant of Web App Factory designed to work as a DNN module in DNN 7 and below. Deprecated. Use App Factory with DotNetNuke Connector instead.
  5. SharePoint Factory – a variant of Web App Factory designed to work as a SharePoint extension in SP 2010. Deprecated. Use App Factory with SharePoint Add-in instead.
Friday, January 26, 2018PrintSubscribe
Offline Data Processor and Transactional Data Input

Code On Time developers and users of their apps will recognize the typical master-detail form in the screenshot below. The master record of a supplier is displayed along with a list of associated products.

The remarkable part is that the new supplier record is displayed together with the products.

User has entered several products already without providing a single bit of information about the supplier. In fact, product records were not saved to the database yet and exist only in the memory of the front-end application.

A master-detail form in a new mode allows trasactional data input with the help of Offline Data Processor from Code On Time.

The supplier has been assigned a temporary primary key referenced in the product records. Each product has its own temporary primary key as well.

Here is the sequence of user actions that may lead to this data configuration.

  1. Application user pressed the big “plus” button to start creating a new supplier record.

    An application implemented with Touch UI displayed in Light theme with Modern accent.
     
  2. Blank form createForm1 reveals Products “DataView” field with no records in it.
     
    Empty master-detail form displayed in NEW mode in the app created with Code On Time application generator.
     

The supplier information and associated products will be persisted to the database only when the master record is saved. The corresponding SQL statements are executed in the context of a transaction to ensure data integrity.
 

A modal master-detail form in NEW mode allows transactional data input with the help of Offline Data Processor from Code On Time.

Offline Data Processor

Offline Data Processor makes transactional data input a reality.

Prior to ODP application user has had to save the master supplier to the database and then enter the related product. Compare createForm1 in the screenshot of the app with ODP disabled (shown below) and the first screenshot that shows both supplier and product information together.

Master-detail form hides DataView fields in NEW mode when Offline Data Processor is disabled.

Starting with the release 8.7.0.0 application generator will create new projects with ODP enabled by default. If the “DataView” fields are defined in the data controller forms, then creating a new record or editing an existing one will engage Offline Data Processor and make the data input transactional. ODP is not engaged if the data controller does not have “DataView” fields in the form.

If you have a project created prior to the release 8.7.0.0, then you will be able to enable ODP by entering a configuration property in ~/DataAquarium.Project.xml file. It will also be possible to selectively disable ODP by tagging a form view in the new projects. The detailed instructions will be provided at the time of the release.

Offline Data Processor is a JavaScript implementation of the server-side application framework created by Code On Time app generator. The server-side code performs Insert, Update, Delete, and Selects data in response to user actions. The server-side code relies on the back-end database server to execute SQL commands. ODP does exactly the same operations but performs them in the memory of the application front-end.

ODP makes possible:

  • Transactional data input
  • Complex wizards collecting master-detail information.
  • Master-detail confirmation controllers.
  • Custom surveys collecting master-detail data.
  • Complex Data-Driven Surveys.

Offline Sync Add-On

ODP mimics SELECT commands performed by the server-side framework to read and filter data. This important skill of ODP has allowed us to introduce a new product called Offline Sync Add-On. If you add this product to your project, then your app gains ability to perform in a completely disconnected mode also known as “offline” mode.

You will need to run your cloud application in the generic or custom native app for “offline” experience.

The add-on pre-emptively downloads user data from the cloud when the native app installs the application front-end. Offline Data Processor will intercept any requests to read/write the cloud data and perform them on the device instead. This will happen whether the device is online or disconnected. User will have to synchronize data with the cloud when the device is online.

Offline Sync Add-On turns any app created with Code On Time in an offline native application without the need to write a single line of code.

Assistant UI Add-On

ODP will also become an integral part of the new kind of user interface for applications created with Code On Time. You will be able to text, email, and talk to your apps without writing a single line of code. ODP will maintain data integrity to make possible data input through these forms of communication.

Code On Time v9

We have mentioned above that ODP makes possible creating surveys to collect master-detail data. This feature is the core capability of the upcoming Project Designer in Code On Time v9.

The new Project Designer is integrated in the live apps, equipped with the Object Inspector and powerful configuration screens implemented as surveys.  It will provide the first class development tools to build apps that work Offline, Online, On-Premises with Personal Assistant.

Beyond C#/VB

ODP has been written in JavaScript. It is asynchronous in nature. ODP downloads defintions of data controllers in JSON format at runtime.

We will virtualize Select, Update, Insert, and Delete operations implemented in ODP and provide a pluggable JavaScript code that does generate SQL statements. Presently the application framework performing the same function is produced in C# or VB.NET.

Then we will take ODP, combine it with SQL-emitting overrides, and package them in a Node.js application. Hmmm… This will taste like freedom to deploy you app on the platforms other than Windows Server!