Blog: Posts from February, 2012

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(180) 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
Posts from February, 2012
Wednesday, February 29, 2012PrintSubscribe
Web App Themes A-B

Aquarium (Internet Explorer 9)

Aquarium Theme (Internet Explorer 9)

Azure (Chrome)

Azure Theme (Chrome)

Belltown (Firefox)

Belltown Theme (Firefox)

Berry (Opera)

Berry Theme (Opera)

Bittersweet (Internet Explorer 9)

Bittersweet Theme (Internet Explorer 9)

Labels: User Interface
Wednesday, February 29, 2012PrintSubscribe
Automated Translation

Code On Time supports automated translation of web application resources from English to other languages with the help of Google Translate API.

You can create a multi-lingual web application by specifying a collection of additional culture sets required for your application.

Start the application generator, select the project name, and choose Settings project action.

Click on Globalization and Localization option.

Select the default culture set for your application using the drop downs and list any additional cultures in Supported Culture Sets text box.

Enter the Google Translate API Key in the input field. Note that the key in the picture is not real.

Globalization and Localization Project Settings

The support culture sets can optionally start with the default culture selected in the drop downs. The culture set specifies the culture used for internal calculations and the culture of the user interface. Both cultures in a culture set are separated by a comma.

Multiple culture sets can be listed one per line or separated with the semicolon.

This culture set will enable English (US) and Spanish (Mexico).

en-US,en-US; es-MX,es-MX;

The generated web application will offer a language selector on the membership bar.

The screen shot below shows the page presented in Spanish with translated system resources.

image

Various column labels and page titles are not translated.

Supposes you want to translate the title of the page Customers.

Start the application generator and select the project name, click Design.

Select Customers page in Project Explorer and change Title, Path, Description, and About This Page properties as follows.

Title:
^Customers^Customers^Customers^
Path:
^Customers^Customers^Customers^
Description:
^ViewCust^View Customers^ViewCust^
About This Page:
^CustDesc^This page allows management of customers.^CustDesc^

Localization tokens are “wrapping” the actual text written in English.

Localization tokens in page properties

Save the changes, exit the Designer and re-generate the application.

Select Spanish as the application language.

Language selector in Code On Time web application.

The translations of resources wrapped in localization tokens will show up in the user interface.

Translated page properties in action.

Wednesday, February 29, 2012PrintSubscribe
Dynamic On-Demand Filtering with Access Control Rules

Business requirements can change hourly in the world of broadband connections and instant messages . Your application will have to be changed no matter how good you are at putting together a detailed requirements specification for the project. Some obscure security rules will be missed, new clients will require special handling – you know the story.

It is virtually impossible to create an application that will adapt to changing security and data segregation requirements unless you are building your web applications with Code On Time.

The unique architecture of generated web applications allows dynamic engagement of access control rules without changing a single line in the source code of your project.

Consider the following screen shot of the Northwind sample with a seemingly random list of ten customer accounts.

Dynamic access control rules in action.

The actual web application source code defines a business rules class with an override of EnumerateDynamicAccessControlRules method. This method registers a few access control rules whenever the customer accounts are retrieved from the application database.

Here is the code.

C#:

using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using MyCompany.Data;

namespace MyCompany.Rules
{
    public partial class CustomersBusinessRules : MyCompany.Data.BusinessRules
    {

        protected override void EnumerateDynamicAccessControlRules(string controllerName)
        {
            RegisterAccessControlRule(
                "CustomerID", AccessPermission.Allow, "ANTON", "ANATR");

            RegisterAccessControlRule(
                "CustomerID",
                "[Country]=@Country and [ContactTitle] = @ContactTitle",
                AccessPermission.Allow,
                new SqlParam("@Country", "USA"),
                new SqlParam("@ContactTitle", "Owner"));

            RegisterAccessControlRule(
                "CustomerID",
                "select CustomerID from Customers " +
                "where Country=@Country2 and City=@City",
                AccessPermission.Allow,
                new SqlParam("@Country2", "UK"),
                new SqlParam("@City", "London"));
        }

    }
}

Visual Basic:

Imports MyCompany.Data
Imports System
Imports System.Collections.Generic
Imports System.Data
Imports System.Linq
Imports System.Xml
Imports System.Xml.XPath

Namespace MyCompany.Rules

    Partial Public Class CustomersBusinessRules
        Inherits MyCompany.Data.BusinessRules

        Protected Overrides Sub EnumerateDynamicAccessControlRules(controllerName As String)
            RegisterAccessControlRule(
                "CustomerID", AccessPermission.Allow, "ANTON", "ANATR")

            RegisterAccessControlRule(
                "CustomerID",
                "[Country]=@Country and [ContactTitle] = @ContactTitle",
                AccessPermission.Allow,
                New SqlParam("@Country", "USA"),
                New SqlParam("@ContactTitle", "Owner"))

            RegisterAccessControlRule(
                "CustomerID",
                "select CustomerID from Customers " +
                "where Country=@Country2 and City=@City",
                AccessPermission.Allow,
                New SqlParam("@Country2", "UK"),
                New SqlParam("@City", "London"))
        End Sub

    End Class
End Namespace

Let’s review the effect of each individual rule on our data set.

The first call of RegisterAccessControlRule method limits a list of customers to those with the specific customer IDs of ANTON and ANATR.

Customers with IDs of ANTON and ANATR.

The second call limits a list of customers to those from the USA and having the title of Owner.

Customers from the USA with the title of Owner.

The third call limits a list of customers to those from the United Kingdom and located in the city of London.

Customers from the United Kingdom located in the city of London.

The three calls are showcasing various methods of creating a dynamic restriction.

The final result is a cumulative set of 10 records since the rules do not contradict each other.

The access control rules used in the example are registered unconditionally  and hard-coded in the application business logic.

What if you take this rules and store them in the database? The rules can be loaded on-demand based on the user identity and injected in the application without changing anything at all. Better yet, you can enable shared business rules in your project and have only one implementation of EnumerateDynamicAccessControlRules method.

We leave the actual implementation up to you.

If a custom implementation of dynamic access control rules is too much for you or is simply not required then continue using the static access control rules.