Notes

This app started as an HTML registration form using postgresql and C#.

Over time, I added administrative views to manage registrations, update, filter, batch update, csv export, and views of duplicate email, phone or street address. And I added bulk mail functionality.

Flex Conversion

On the server I reduced the app to a C# controller with functions to return XML results on request, eliminating all involvement with the presentation layer from the C# code. I'm using the postgresql dataprovider for .net Npgsql, which has a handy XMLWrite method, to which I prepend an XML header, put it in the response, and that's it.

Using Flex Builder 2, I focused on replacing the existing functionality. Along the way I added charting so the user could see the data in a pie chart grouped on state, city, zip or organization, and click on wedges to drill-down.

Flex 3 Re-factoring
With Flex Builder 3, I added a ModelLocator. Then I added a ServiceManager to invoke HTTPService requests, handle responses and populate the model. I created an extended HTTPService to set the URL property and busyCursor behavior internally to eliminate repetitive setup in the ServiceManager.

Then I broke down the view into smaller parts, eventually paring the application file to 8 or 9 lines of MXML and a handful of functions to handle authentication.

I created an extended DataGrid component paired with an extended ComboBox HeaderRender to create a self-contained editable grid. It has functions that invoke methods on ServiceManager to update and delete, and add its rows to the blast list.

User Interface
I am using an MDI style interface made of Panels extended to be resizable and minimizable.

Authentication
Authentication uses existing server method. Logging off required ExternalInterface and a javascript function to kill a cookie in the browser.

Drag & Drop Selected grid rows can be dragged and dropped either on the Blast Message button or the Blast Message Dialog if it is open to move the selected rows to the Blast List.

Effects and Transitions
The app uses Flex effects for various tranistions. Without effects, transitions like tabs changing and data loading in a grid happens too fast to tell something changed.

History Manager Back Button Support The app uses History Manager to save and load data and re-create state when the user clicks the back button, and forward.

Animation There is no practical use of animation in this application, but I recently finished reading Actionscript 3 Animation by Keith Peters and I thought his NodeGarden example would fill the initially empty grid space nicely. It's interesting and attractive, and evokes the essential use case of a CRM. I named the component EyeCandy.

Animation update I spent a couple hours toying around with this, and I added an interesting twist. I tried to mix in a ball that could be dragged and thrown and would somehow interact with the nodes, and the way I finally did it was to make one of the nodes a ball. So the 0 node is a ball that can be dragged and thrown, but still a node. And I did some things to exaggerate the 0 node's spring effect on other nodes, and the result is the nodes throwing the ball around.

Embedded Font I embedded my machine's Arial for the benefit of higher resolution.