Web App Generator

Labels
AJAX(112) App Studio(9) 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(178) 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(184) 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(3) 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 App Generator
Thursday, December 26, 2013PrintSubscribe
Mobile Database Apps for iPhone/iPad/Android, Visual Studio 2013
Code On Time release 8.0.2.0 introduces an updated Universal Mobile/Desktop Client in the apps created with Premium and Unlimited editions. The new mobile client offers editing capabilities and Responsive Web Design. The same exact app will take a full advantage of the client mobile device and offer the most efficient method of presenting data. Continue reading for full release notes after the screen shots.
See the live mobile demo at http://demo.codeontime.com/northwind/pages/home.aspx?_mobile=true.
These are the screen shots of iPhone 5s with the product list and a single product in an edit form.
Mobile client rendering of a product list in the app created with Code On Time app generator.  Mobile client rendering of an edit form 'editForm1' in the app created with Code On Time app generator.
Modern tablets feature high resolution screens. iPad Air with portrait orientation in shown in the screen shot below with the display of the same product list. List items are wider and a fixed context sidebar is automatically visible on the right-hand side of the screen.
Mobile client rendering of a product list in iPad Air with visible context sidebar in the app created with Code On Time app generator.
This screen shot shows the product list in iPad Air with landscape orientation. The context sidebar has been undocked to offer three columns of list items.
Mobile client rendering of a product list in iPad Air with landscape orientation in the app created with Code OnTime app generator.
Don’t forget that apps created with Unlimited edition also support Desktop client devices. See the desktop version of the demo at http://demo.codeontime.com/northwind/pages/home.aspx?_mobile=false.
Mobile client rendering of a product list in iPad Air with landscape orientation in the app created with Code OnTime app generator.
Application framework automatically detects the type of client device and hooks either mobile or desktop client library to rendered application pages ensuring the most friendly presentation.
The following features and bug fixes are included in this release:
  • Updated mobile client library with full editing capabilities and Responsive Web Design.
     
  • Production release of jQuery Mobile 1.4 is the foundation of the mobile client library.
     
  • Visual Studio 2013 is now supported.
     
  • Windows Azure SDK 2.2. is now supported.
     
  • Client library supports "lookup-details-hidden" tag to hide "arrow" that allows view object details from lookup fields.
     
  • Thumbnails of images are now rendered on transparent background. Previous releases where rendering images with white background and thin gray frame.
     
  • Web.Config.Release and Web.Config.Debug transformations are now supported in Web App Factory and Azure Factory apps.
     
  • Application page builder will prevent creation of duplicate pages and configure the first foreign key field as Filter Source field if multiple FK fields are referencing the same controller.
     
  • Import processor passes the name of the temporary file to ImportProcessorFactory to allow overriding and correction of the submitted import file.
     
  • Import processor will automatically bind records imported into child data views to the primary key of a selected master on any level of hierarchy.
     
  • Thank you Ed Blum for contributing "nl-NL" enhanced localization.
     
  • Method DataViewExtender.AssignFilter will accept an array of values for Include and Exclude filters.
     
  • Removed extraneous ")" from the project build file that was preventing Web App Factory from generating the Login page.
     
  • Spansh style of "a.m./p.m" designator is using "space" in the middle on Window 8.1. The client library will correctly parse time.
     
  • Legacy apps without /project/features/framework/@scriptOnly set to "true" in DataAquiarum.Project.xml file will not try to render Mobile Client.
     
  • Desktop client correctly positions Calendar in all browsers.
     
  • Desktop client correctly processes selected lookup values in FireFox.
     
  • Desktop client does not apply the URL command parameters to object Details when a user clicks on an arrow.
     
  • Removed "x" button in IE10 and above in desktop apps.
Next release is planned for January of 2014. There will be numerous enhancements to the mobile client to further narrow the gap between Desktop and Mobile features. Here is a partial list of things we are working on:
  • Blob upload/download.
  • Confirmation data controllers
  • Multi-field copy and context fields in lookups.
  • Dedicated presentation for Auto Complete, Check Box, and Check Box List lookup styles.
  • Filtering capabilities.
  • Mobile version of Advanced Search Bar.
  • Display of aggregates in context sidebar.
  • “Tabular” display of data lists.
  • Multiple-selection of list items.
  • Conditional visibility of categories and fields.
  • Conditional read-only fields.
  • Calculated fields.
We are also preparing to showcase http://cloudontime.com. We have done tremendous amount of work to bring built-in dynamic page creation, workflows, blogging and support forum capabilities to the apps created with Unlimited edition of Code On Time. Stay tuned.
Sunday, January 20, 2013PrintSubscribe
Custom Filter Panel

Let’s create a page that will contain a custom user control and a data view. The user control will contain several buttons that will programmatically change the filter on the data view.

Adding the Page

Start the Project Designer. On the Project Explorer toolbar, click on the New Page icon.

Creating a new page.

Assign a name to the page:

Property Value
Name Custom Filter Panel

Press OK to save. Drop the Custom Filter Panel page node on the right side of Home page node to place it second in the menu.

Dropping 'Custom Filter Panel' page on the right side of 'Home' page.     Page 'Custom Filter Panel' has been placed second in the menu.

Right-click on Custom Filter Panel node, and press New Container.

Adding a new container to the 'Custom Filter Panel' page.

Keep the default configuration and press OK to save the container. Right-click on Custom Filter Panel / c101 container node, and press New Control.

Creating a new control in container 'c101'.

Next to the User Control lookup, click on the New User Control icon.

Creating a new user control.

Assign the user control a name:

Property Value
Name FilterPanel

Press OK to create the new user control. Press OK to add the control to the page.

Implementing the User Control

On the Project Designer toolbar, press Browse to generate the application and user control file.

When complete, right-click on Custom Filter Panel / c101 / control1 – FilterPanel node and press Edit in Visual Studio.

Editing the custom user control file in Visual Studio.

The user control file will be opened in Visual Studio. Replace the code base after the <%@ Control %> element with the following:

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <div style="margin-bottom:4px">
            <h2 style="margin-bottom:4px; margin-top:6px;">Select a filter:</h2>
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Shipped" />
            <asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="Not Shipped" />
            <asp:Button ID="Button3" runat="server" OnClick="Button3_Click" Text="High Freight" />
            <asp:Button ID="Button4" runat="server" OnClick="Button4_Click" Text="Reset" />
        </div>
    </ContentTemplate>
</asp:UpdatePanel>
<div id="OrderList" runat="server">
</div>
<aquarium:DataViewExtender ID="dve1" runat="server" TargetControlID="OrderList"
    Controller="Orders" />

The code above will add four buttons and an Orders data view. Right-click and press View Code.

'View Code' context menu option for the user control file in Visual Studio.

Replace the existing code base with the following:

C#:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using MyCompany.Web;
using MyCompany.Data;

public partial class Controls_FilterPanel : System.Web.UI.UserControl
{
    // assign filter when page loads
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            dve1.AssignStartupFilter(new FieldFilter[] { 
                new FieldFilter(
                    "ShippedDate", 
                    RowFilterOperation.DoesNotInclude,
                    null) });
    }
    // filter ShippedDate to not null
    protected void Button1_Click(object sender, EventArgs e)
    {
        dve1.AssignFilter(new FieldFilter[] { 
            new FieldFilter(
                    "ShippedDate", 
                    RowFilterOperation.DoesNotInclude,
                    null), 
            new FieldFilter(
                "Freight",
                RowFilterOperation.None) });
    }
    // filter ShippedDate to null
    protected void Button2_Click(object sender, EventArgs e)
    {
        dve1.AssignFilter(new FieldFilter[] { 
            new FieldFilter(
                "ShippedDate", 
                RowFilterOperation.Equal,
                null), 
            new FieldFilter(
                "Freight",
                RowFilterOperation.None) });
    }
    // filter Freight to >30
    protected void Button3_Click(object sender, EventArgs e)
    {
        dve1.AssignFilter(new FieldFilter[] { 
            new FieldFilter(
                "Freight", 
                RowFilterOperation.GreaterThan, 
                30), 
            new FieldFilter(
                "ShippedDate",
                RowFilterOperation.None)});
    }
    // reset filter when Reset button clicked
    protected void Button4_Click(object sender, EventArgs e)
    {
        dve1.AssignFilter(new FieldFilter[] { 
            new FieldFilter(
                "ShippedDate", 
                RowFilterOperation.None), 
            new FieldFilter(
                "Freight",
                RowFilterOperation.None) });
    }
}

Visual Basic:

Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text.RegularExpressions
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports MyCompany.Web
Imports MyCompany.Data


Partial Public Class Controls_FilterPanel
    Inherits Global.System.Web.UI.UserControl
    ' assign filter when page loads
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
        If Not IsPostBack Then
            dve1.AssignStartupFilter(New FieldFilter() {
                                     New FieldFilter(
                                         "ShippedDate",
                                         RowFilterOperation.Equal,
                                         Nothing)})
        End If
    End Sub
    ' filter ShippedDate to not null
    Protected Sub Button1_Click(sender As Object, e As EventArgs)
        dve1.AssignFilter(New FieldFilter() {
                                     New FieldFilter(
                                         "ShippedDate",
                                         RowFilterOperation.NotEqual,
                                         Nothing),
                                    New FieldFilter(
                                        "Freight",
                                        RowFilterOperation.None)})
    End Sub
    ' filter ShippedDate to null
    Protected Sub Button2_Click(sender As Object, e As EventArgs)
        dve1.AssignFilter(New FieldFilter() {
                                     New FieldFilter(
                                         "ShippedDate",
                                         RowFilterOperation.Equal,
                                         Nothing),
                                    New FieldFilter(
                                        "Freight",
                                        RowFilterOperation.None)})
    End Sub
    ' filter Freight to >30
    Protected Sub Button3_Click(sender As Object, e As EventArgs)
        dve1.AssignFilter(New FieldFilter() {
                                     New FieldFilter(
                                         "ShippedDate",
                                         RowFilterOperation.None),
                                    New FieldFilter(
                                        "Freight",
                                        RowFilterOperation.GreaterThan,
                                        30)})
    End Sub
    ' reset filter when Reset button clicked
    Protected Sub Button4_Click(sender As Object, e As EventArgs)
        dve1.AssignFilter(New FieldFilter() {
                                     New FieldFilter(
                                         "ShippedDate",
                                         RowFilterOperation.None),
                                    New FieldFilter(
                                        "Freight",
                                        RowFilterOperation.None)})
    End Sub
End Class

The code will assign filters when any of the buttons are pressed. Save the file.

Viewing the Results

Switch to the open web application and refresh the page. Navigate to Custom Filter Panel page. The page will contain four buttons and an Orders data view. The data view will be filtered to show only rows that have a value in Shipped Date field.

The data view on 'Custom Filter Panel' page will be filtered when the page loads.

Click on one of the first three buttons. The filter will change accordingly.

Clicking on one of the buttons will change the filter.

Clicking on the Reset button will clear all filters.

The 'Reset' button will clear all filters.

Thursday, November 8, 2012PrintSubscribe
Advanced Membership Provider for SQL Server

Requirements

An advanced membership and role provider requires three tables.

One table keeps track of user information. This information includes the UserName, Email, and a Comment. Additional columns allow for implementation of a password question and answer in order to recover a forgotten password. When users are created, they can not be approved by default. Additional information is captured about the most recent login, activity, and change of password. When a user inputs an incorrect password past the limit, the user will become locked out. The number of failed attempts and most recent failed attempt will be stored.

Two tables are required to keep track of roles and associations of users with roles.

These are the advanced membership and role provider tables with “identity” primary keys.

Advanced membership and role provider using identity primary keys.

SQL:

create table Users (
    UserID int identity not null primary key,
    UserName nvarchar(128) not null,
    Password nvarchar(128) not null,
    Email nvarchar(128),
    Comment ntext,
    PasswordQuestion nvarchar(256),
    PasswordAnswer nvarchar(128),
    IsApproved bit not null,
    LastActivityDate datetime not null,
    LastLoginDate datetime not null,
    LastPasswordChangedDate datetime not null,
    CreationDate datetime not null,
    IsLockedOut bit not null,
    LastLockedOutDate datetime not null,
    FailedPasswordAttemptCount int not null,
    FailedPasswordAttemptWindowStart datetime not null,
    FailedPasswordAnswerAttemptCount int not null,
    FailedPasswordAnswerAttemptWindowStart datetime not null
)
go

create table Roles (
   RoleID int identity not null primary key,
   RoleName nvarchar(50)
)
go

create table UserRoles (
    UserID int not null,
    RoleID int not null,
    primary key(UserID, RoleID)
)
go

alter table UserRoles with check add constraint FK_UserRoles_Roles 
foreign key (RoleID) references Roles (RoleID)

alter table UserRoles with check add constraint FK_UserRoles_Users 
foreign key (UserID) references Users (UserID)

These are the advanced membership and role provider tables with “unique identifier” primary keys.

Advanced membership and role provider using unique identifier primary keys.

SQL:

create table Users (
    UserID uniqueidentifier not null default newid() primary key,
    UserName nvarchar(128) not null,
    Password nvarchar(128) not null,
    Email nvarchar(128),
    Comment ntext,
    PasswordQuestion nvarchar(256),
    PasswordAnswer nvarchar(128),
    IsApproved bit not null,
    LastActivityDate datetime not null,
    LastLoginDate datetime not null,
    LastPasswordChangedDate datetime not null,
    CreationDate datetime not null,
    IsLockedOut bit not null,
    LastLockedOutDate datetime not null,
    FailedPasswordAttemptCount int not null,
    FailedPasswordAttemptWindowStart datetime not null,
    FailedPasswordAnswerAttemptCount int not null,
    FailedPasswordAnswerAttemptWindowStart datetime not null
)
go

create table Roles (
   RoleID uniqueidentifier not null default newid() primary key,
   RoleName nvarchar(50)
)
go

create table UserRoles (
    UserID uniqueidentifier not null,
    RoleID uniqueidentifier not null,
    primary key(UserID, RoleID)
)
go

alter table UserRoles with check add constraint FK_UserRoles_Roles 
foreign key (RoleID) references Roles (RoleID)

alter table UserRoles with check add constraint FK_UserRoles_Users 
foreign key (UserID) references Users (UserID)

Configuration

Use one of the scripts above to create the membership and role provider tables in your database.

Start Code On Time web application generator, select the project name on the start page, and choose Settings. Select Authentication and Membership.

Select “Enable custom membership and role providers” option and enter the following configuration settings.

table Users = Users
column [int|uiid] UserID = UserID
column [text] UserName = UserName
column [text] Password = Password
column [text] Email = Email
column [text] Comment = Comment
column [text] PasswordQuestion = PasswordQuestion
column [text] PasswordAnswer = PasswordAnswer
column [bool] IsApproved = IsApproved
column [date] LastActivityDate = LastActivityDate
column [date] LastLoginDate = LastLoginDate
column [date] LastPasswordChangedDate = LastPasswordChangedDate
column [date] CreationDate = CreationDate
column [bool] IsLockedOut = IsLockedOut
column [date] LastLockedOutDate = LastLockedOutDate
column [int]  FailedPasswordAttemptCount = FailedPasswordAttemptCount
column [date] FailedPasswordAttemptWindowStart = FailedPasswordAttemptWindowStart
column [int]  FailedPasswordAnswerAttemptCount = FailedPasswordAnswerAttemptCount
column [date] FailedPasswordAnswerAttemptWindowStart = FailedPasswordAnswerAttemptWindowStart

table Roles = Roles
column [int|uiid] RoleID = RoleID
column [text] RoleName = RoleName

table UserRoles = UserRoles
column [int|uiid] UserID = UserID
column [int|uiid] RoleID =  RoleID

The configuration will guide the code generator in mapping the logical tables Users, Roles, and UserRoles to the physical tables in the database.

Generate the project to create the custom membership and role provider.

Continue to Overview of Commands