Web 2.0

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(9) OAuth Scopes(1) OAuth2(13) Offline(20) Offline Apps(4) Offline Sync(5) Oracle(11) PKCE(2) Postgre SQL(1) PostgreSQL(2) PWA(2) QR codes(2) Rapid Application Development(5) Reading Pane(2) Release Notes(183) Reports(48) REST(29) RESTful(29) RESTful Workshop(15) RFID tags(1) SaaS(7) Security(81) 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
Web 2.0
Saturday, June 25, 2011PrintSubscribe
Localization, Globalization, In-Page History

This a significant update to Code On Time web application generator and core library of generated applications. The summary of changes and enhancements is listed below.

Few users have reported a problem with automatic update installation. If the you experiencing errors while trying to upgrade then simply uninstall Code On Time and download a fresh copy at http://codeontime.com/download.aspx.

The update includes a brand new localization framework. All resources were externalized. There is a single file that can be changed to modify ALL of the client library text strings.

File ClientLibrary.*.txt (for example, ClientLibrary.en-US.txt or ClientLibrary.pt-BR.txt) will be created in the root of the project when you generate your application with the updated version of the code generator. Unlimited edition users can have multiple ClientLibrary.*.txt files matched to their selected cultures if more than one culture is supported.

If you change resource tokens in the file and re-generate the project one more time then the client library will use the content supplied by you. The ClientLibrary.*.txt file is not required at runtime.

There will also be additional resource files that are matched to resources such Web.Sitemap (for example, Web.Sitemap.fr-CA.txt) or data controllers descriptors (for example, ~/Controllers/aspnet_Memberhship.it-IT.txt). Changes to the files will be reflected at runtime. These files are a part of your application.

The web application generator will automatically produce localization files and perform actual translation using Google Translate if you apply a certain syntax to the text labels.

The localization and globalization tutorial will be available.

Fixes and improvements in this release:

  • Localization of both Web App Factory and Web Site Factory has been completed.
  • The entire client library now supports a mechanism to translate resources in a language of your choice.
  • In-Page History is now implemented in the Client Library. Previous implementation has stored user filters in the Session object on the server. The session state was restored whenever the data had to be presented. This was creating a somewhat undesirable user experience effect and significantly increased the size of the user session data. The new implementation will save history in the page and will restore the history only if you return to the page via Back button of your browser.
  • Container menus will now remember the selected tab. The new implementation of the in-page history will restore the selected tabs and selected row in Grid and Data Sheet views.
  • Field-level errors are now displayed in pop out boxes one at a time. This is probably the most visible change from the end user perspective. You can see the new style of field-level error message if you leave a mandatory field empty in a form and try saving it.
  • The bug preventing setting focus on a field in a Data Sheet view has been fixed.
  • Automatic localization of localized resources via Google Translate is now supported in all editions of the code generator.
  • Two new classes Localizer and CultureManager are now a part of the core framework of generated applications.
  • Membership bar will now display a language selector if multiple UI cultures are supported in your application. Multiple cultures are supported in Unlimited edition only.
  • Dynamic reports are using the current UI culture and display currency, numbers, and dates as is required by locale.
  • Adaptive filters have been changed to supported “typed” filter values. Previous implementation has been relying on simple string conversions between the client and the server. “Typed” values eliminate all sorts of filtering problems that were encountered with some locales.
  • Designer will open all objects in “edit” mode when an object is selected from a grid view. This should speed up and simplify project modifications.
  • Page containers show tabs with linked data views and controls when selected in Designer.
  • Numeric values will not wrap when displayed in Grid and Data Sheet views.
  • Modal forms will maintain the same width if user navigates between records using navigation arrows.
  • Interface System.Web.SessionState.IRequiresSessionState is implemented in all generic handlers to support ASP.NET session. This will ensure that you can access session data in business rules during import, export, and blob processing.
  • Membership bar replaces the browser URL to prevent the home page with login prompt from being displayed when user clicks the Back button in a browser. This only affects applications that do not rely on a dedicated login page.
  • The 'About'  box header text on pages has been placed in resources to support globalization.
  • BusinessRules class implements Localize(token,text) method to simplify localization of messages sent to the client from business rules classes.
  • MembershipBusinessRules class is using the new Localize method to display system messages.
  • Grid views will remember the last view type (Data Sheet or Grid) selected by end user and restore the view type when user returns back to the page via browse Back button.
  • Help system has been upgraded to include configuration instructions. It has been enhanced to match the web application theme and display a relevant customization instruction when a user selects Help link on the membership bar.
  • System messages by blob handler, controller, and annotation plug-in are now localized via global Resources.*.txt file.
  • Component DataViewExtender now supports method AssignStartupFilter. This method allows setting up an initial filter values using custom code. We recommend placing a custom user control on a page in designer and writing the logic assigning the initial filter in the code-behind file of the user control.
  • Import processor is not using the thread pool anymore. This will eliminate the bug related to unavailability of HttpContext during the export process. Context is now available since the execution of the import process is not asynchronous anymore. We will revisit this later to see if asynchronous processing can be accomplished via other means.
  • Added support for missing handlers to allow blob, reports, etc. with IIS / IIS Express and .NET 3.5 web apps. This was typically resulting in BLOB images not displayed when application is executed.
  • Sandbox app in Web App Factory solutions will now have the same base page YourNamespace.Web.PageBase to support globalization and localization.

Coming next:

  • Azure Factory project is ready to go. We wanted to implement a complete localization framework prior to rolling this out. The plan is to roll Azure Factory out over the next weekend. The feature will be available to Premium edition users.
  • Partial implementation of the Tree view has been released in this update. You can give it a try if you change the type of grid view to “Tree” in Designer and add a self-referring data field to this view. We are hoping to complete this data presentation style in the release. The feature will be available to Premium edition users.
  • Custom Membership and Role providers. We are planning to include this feature in Unlimited edition.
Thursday, May 19, 2011PrintSubscribe
Cascading Lookups

ASP.NET web applications created with Code On Time application generator offer impressive lookup capabilities. Numerous lookup styles allow configuring sophisticated data lookup scenarios including cascading lookups. Cascading lookups is a data lookup scenario involving more than one lookup field.

Example of Cascading Lookups

Consider the fragment of Adventure Works LT database presented below.

Table SalesOrderHeader has three lookup fields. Field CustomerID references table Customer, fields ShipToAddressID and BillToAddressID are referencing the same table Address. Shipping and billing addresses may be represented by the same or different rows in the table Address. The many-to-many table CustomerAddress links a Customer and an Address.

If a new Sales Order Header is created and a customer is identified and associated with the header then it will be logical to assist end users of your application in selecting a customer address by limiting the list of all addresses to those that are matching the selected customer. Selection of one lookup value (CustomerID) in a row must cascade as a filter to other dependent lookups (ShipToAddressID and BillToAddressID).

Configuring Cascading Lookups

If you generate a new Web Site Factory application from the database and start creating a new Sales Order Header then you will see a page similar to the one presented below. The screen shot shows that a customer has been selected already and shipping and billing addresses are blank.

image

Click on (select) link in Ship To Address Line1 or Bill To Address Line1 and you will be presented with lookup window that allows selecting an address. The entire collection of addresses stored in the database is available for selection. The screen shot shows that the application user has activated the search bar to find the right address and is trying to find an address using predictive input.

image

Let’s make the task of selecting an address easier and limit the list of addresses to those that are associated with the user account.

First we will examine lookup configuration of ShipToAddressID and BillToAddressID fields.

Run the web application generator, select the project name and click Design to activate the project Designer.

Select “All Controllers” tab and locate SalesOrderHeader data controller.

Click on the controller name and select Fields tab.

Select ShipToAddressID field and click Edit button.

Scroll to Lookup section of the field properties. The configuration of lookup properties is presented below.

Property Items Data Controller is set to Address, which instructs the generated web application to show the first grid view of Address data controller when a user click on (select) link of the lookup field.

image

If you inspect configuration of BillToAddressID field then you will find that it is exactly the same. This type of configuration is automatically performed by Code On Time web application generator when a baseline application is constructed straight from your database.

Table Address does not offer any information that will help us to identify the addresses that belong to a specific customer.

Table CustomerAddress has a pointer to a Customer and provides a perfect replacement for Address data controller.

By default only the first mandatory field from master table Address is included by the application generator in the data controller CustomerAddress. We suggest defining the following de-normalization map for your project to expand available fields borrowed from master tables in tables CustomerAddress and SalesOrderHeader.

SalesLT.SalesOrderHeader => SalesLT.Customer
LastName
FirstName
CompanyName

SalesLT.CustomerAddress => SalesLT.Customer
CompanyName
LastName
FirstName

SalesLT.CustomerAddress => SalesLT.Address
AddressLine1
AddressLine2
City
StateProvince
CountryRegion
PostalCode

The application in the screen shots was generated with this de-normalization map.

Let’s change the configuration of field ShipToAddressID as follows:

  1. Set Data Controller property to “CustomerAddress”.
  2. Set Data Value Field property to “AddressID”.
  3. Set Data Text Field property to “AddressAddressLine1”.
  4. Set Content Fields under Dynamic Properties section to “CustomerID=CustomerID”.

image

Step (4) will instruct the data controller CustomerAddress to filter data by field CustomerID (field on the left hand side of the equal sign) with the value stored in field CustomerID (field on right hand side of the equal sign) in the current row of Sales Order Header data controller.

This change does not effect the command text of the data controller SalesOrderHeader in any practical way. The lookup configuration will be taken into account only when a user selects a value for ShipToAddressID or BillToAddressID field.

Save the changes and modify the field BillToAddressID by following exactly the same steps.

Generate your project, start creating a new Sales Order Header record, select “Family’s Favorite Bike Shop” customer in Customer Company Name field. Try select a shipping or billing address. Only two records will be available for selection. Both records match the selected customer.

image

Try changing a customer and observe that a different selection of addresses is presented each time.

Lookup Styles

You can change the style of lookups using the Items Style property. If you change the style of CustomerID, ShipToAddressID, and BillToAddressID then the cascading lookup behavior will still take place.

Lookup field CustomerID is presented  in Lookup and  two address reference fields are presented in Auto-Complete styles below.

image

A combination of Auto-CompleteList Box and Radio Button List lookup styles is shown next.

image

Clearing Dependent Lookup Fields

Most scenarios of cascading lookups will require  a particular combination of master and detail selections in the lookup fields. If a master values has changed then a cascading clearing of dependent lookup fields may be called for. In fact inconsistent selection of master and detail lookup fields may cause data integrity issues.

An extra step is involved in clearing dependent cascading lookup field values.

Select CustomerID master field in Designer and set its “Copy” property as follows:

ShipToAddressID=null
ShipToAddressAddressLine1=null
BillToAddressID=null
BillToAddressAddressLine1=null

The screen shot shows the “Copy” property of CustomerID when opened in Designer.

image

The primary purpose of “Copy” property is to allow specifying multi-field copy instructions executed upon lookup selection. Read about multi-field lookup at /blog/2010/02/multi-field-lookup.html.

If you enter “null” on the right-hand side of the equal sign then the field value will be cleared when the value of the lookup field has changed. In this particular case any changes to CustomerID field must cause clearing of fields ShipToAddressID and BillToAddressID. Both fields are aliased with ShipToAddressAddressLine1 and BillToAddressAddressLine1 fields accordingly. If you configure only the foreign key fields to be reset upon changes of the master field CustomerID then fields will get cleared but their visual representations will remain intact. Therefore we require clearing of alias fields as well.

Property “Copy” provides surgical level of control over resetting of dependent fields in a cascading lookup field groups. If you have more than one level of dependency then make sure to configure clearing of fields on all levels.

Tuesday, May 17, 2011PrintSubscribe
File Upload / Download

Code On Time applications support direct uploading of external files into the database.

Basics

Consider the following database schema based on the Northwind sample available with Microsoft SQL Server. Table Categories features Picture field of type image. This data type allows capturing binary content. The purpose of this particular field is to capture a picture representing a category as suggested by the field name.

image

Generate a Web Site Factory web application with this three tables and navigate to Categories page. The screen shot below shows an automatically created page of categories stored in the database. Field Picture is provided with an automatic preview thumbnail.

image

Users can create new categories and upload category pictures as shown next.

Create a new category record in createForm1 view by selecting New Categories button on action bar.

image

Save and edit the new category and indicate that you want to upload a file.

image

Click Browse button and select the image file. File uploading will start immediately.

image

The file is being uploaded in editForm1.

image

The file has been uploaded as indicated by the message at the top of the page.

image

Note that file uploading works only with existing records. The Picture field is available only in editForm1 and grid1 view.

Uploading of binary content is executed asynchronously. If a record does not exist yet then it is not possible to save a file to the database.  Create a new record first, save it, and only at that time upload any files that must be associated with a record.

Code On Time applications will be offering a delayed uploading option that will work with new records by postponing operation until a new record is successfully stored in the database. Creation of  a new record and file uploading will become one smooth operation.

Capturing Extended File Properties

Generated applications do not limit the type of content submitted by end users. If an Adobe PDF file or Microsoft Word document is uploaded instead of an image then the file content will be saved in the database. The thumbnail will not display a preview in that case. If you were to download the file from the application to your hard drive by right-clicking on the thumbnail and selecting Save Target As option then you will notice the following message.

image

The name of the file is represented as generic CategoriesPicture_27, the file type is unknown, the content type is octet-stream.

The binary file stores the file contents only. The file name and content type are not known.

You can easily remedy the situation by introducing utility fields to capture the file name, content type, and length of the uploaded file. The latter is not strictly needed since the application can determine the size of the file by inspecting the database. File length can be useful if you users need to known the file size prior to downloading the file on their computer.

Change Categories table as shown below. Three new columns complement field Picture in table Categories. We have added columns PictureFileName, PictureContentType, and PictureLength. Make sure to allocate enough space for Content Type field to accommodate very long content types introduced in the latest versions of Microsoft Office.

image

Refresh the meta data of your project and regenerate the application.

Create a new category, select the category in the grid view and start editing category properties. New utility fields are displayed right under the Picture field.

image

Upload any document or image.

Notice that the thumbnail of the uploaded file shows the file extension. The utility fields have captured their corresponding properties.

image

Right-click  the thumbnail, select Save Target As and observe the prompt that may look as follows.

image

The name of the file is correctly suggested in “Save As” dialog. The type of the file is also correct.

If you click on the thumbnail directly then the file will open in the application associated with the file type on your computer.

We suggest that your further customize the data controller in the project Designer as shown in the next screen shot. 

image

All utility fields are marked as hidden in createForm1.

Field PictureContentType is “hidden” in editForm1 and grid1.

Field PictureFileName has its Text Mode property set to Static in editForm1 and grid1.

Field PictureLength is “hidden” in editForm1 and Static in view grid1.

These changes will ensure that utility information is captured and only the file name and file size are displayed as read-only values.

Implementing Virtual Fields to Store BLOB/ FILE Content

The new architecture of the framework in Code On Time applications allows full control of the upload / download processing of binary fields with the data controller business rules.

Let’s create a virtual “Picture” field in Products data controller and store the uploaded files in the external file system folder. Such approach may help to reduce the size of the database and provides developers with total control of the process.

To be continued.