Author: husted
Date: Fri Jan 12 07:19:29 2007
New Revision: 495597

URL: http://svn.apache.org/viewvc?view=rev&rev=495597
Log:
Phonebook - Back port Jayrock/Dojo implementation. 

Added:
    struts/sandbox/trunk/overdrive/PhoneBook/Web/PhoneBook.ashx
    struts/sandbox/trunk/overdrive/PhoneBook/Web/PhoneBook.html

Added: struts/sandbox/trunk/overdrive/PhoneBook/Web/PhoneBook.ashx
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/overdrive/PhoneBook/Web/PhoneBook.ashx?view=auto&rev=495597
==============================================================================
--- struts/sandbox/trunk/overdrive/PhoneBook/Web/PhoneBook.ashx (added)
+++ struts/sandbox/trunk/overdrive/PhoneBook/Web/PhoneBook.ashx Fri Jan 12 
07:19:29 2007
@@ -0,0 +1,98 @@
+<%@ WebHandler Class="JayrockWeb.PhoneBook"  Language="C#" %>
+
+using System;
+using System.Collections;
+using Agility.Extras.Spring;
+using Jayrock.JsonRpc;
+using Jayrock.JsonRpc.Web;
+using Nexus.Core;
+using Nexus.Core.Helpers;
+using PhoneBook.Core;
+using Spring.Context;
+
+namespace JayrockWeb
+{
+    public class PhoneBook : JsonRpcHandler
+    {
+
+        private IRequestCatalog catalog = null;
+
+        private IRequestCatalog GetCatalog()
+        {
+            if (catalog == null)
+            {
+                IApplicationContext factory = Objects.Factory();
+                catalog = factory.GetObject(App.CATALOG_KEY) as 
IRequestCatalog;
+            }
+            return catalog;
+        }
+        
+        private RequestContext Execute(string command)
+        {
+            return (RequestContext) GetCatalog().ExecuteRequest(command);      
      
+        }
+        
+        [JsonRpcMethod(App.LAST_NAME_LIST, Idempotent = true)]
+        [JsonRpcHelp("Returns Last Name List as an array.")]
+        public string[] last_name_list()
+        {            
+            RequestContext context = Execute(App.LAST_NAME_LIST);
+            KeyValueList list = context.Outcome as KeyValueList;
+            ArrayList names = new ArrayList(list.Count);
+            foreach (KeyValue k in list)
+            {
+                names.Add(k.Value);
+            }
+            return (string[]) names.ToArray(typeof (String));
+        }
+
+        [JsonRpcMethod(App.ENTRY_LIST, Idempotent = true)]
+        [JsonRpcHelp("Returns the complete directory as an array of formatted 
IDictionary objects.")]
+        public AppEntryList entry_list()
+        {
+            IViewHelper helper = GetCatalog().GetHelperFor(App.ENTRY_LIST);
+            helper.Execute();
+            // if helper.IsNominal ... 
+            AppEntryList list = helper.Outcome as AppEntryList;
+            return list;
+        }
+
+        [JsonRpcMethod(App.ENTRY, Idempotent = true)]
+        [JsonRpcHelp("Returns an entry by key.")]
+        public AppEntry entry(string key)
+        {
+            IViewHelper helper = GetCatalog().GetHelperFor(App.ENTRY);
+            helper.Criteria[App.ENTRY_KEY] = key;
+            helper.Execute();
+            // if helper.IsNominal ... 
+            AppEntry entry = new AppEntry(helper.Criteria);
+            return entry;
+        }
+
+        [JsonRpcMethod(App.ENTRY_SAVE, Idempotent = true)]
+        [JsonRpcHelp("Saves the entry, insert or updating as appropriate.")]
+        public AppEntry entry_save(IDictionary input)
+        {
+            IViewHelper helper = GetCatalog().GetHelperFor(App.ENTRY_SAVE);
+            helper.Read(input,true);
+            helper.Execute();
+            // if helper.IsNominal ... 
+            AppEntry entry = new AppEntry(helper.Criteria);
+            return entry;
+        }
+
+        [JsonRpcMethod(App.ENTRY_DELETE, Idempotent = true)]
+        [JsonRpcHelp("Deletes an entry by key.")]
+        public AppEntry entry_delete(string key)
+        {
+            IViewHelper helper = GetCatalog().GetHelperFor(App.ENTRY_DELETE);
+            helper.Criteria[App.ENTRY_KEY] = key;
+            helper.Execute();
+            // if helper.IsNominal ... 
+            AppEntry entry = new AppEntry(helper.Criteria);
+            return entry;
+        }
+
+    
+    }
+}
\ No newline at end of file

Added: struts/sandbox/trunk/overdrive/PhoneBook/Web/PhoneBook.html
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/overdrive/PhoneBook/Web/PhoneBook.html?view=auto&rev=495597
==============================================================================
--- struts/sandbox/trunk/overdrive/PhoneBook/Web/PhoneBook.html (added)
+++ struts/sandbox/trunk/overdrive/PhoneBook/Web/PhoneBook.html Fri Jan 12 
07:19:29 2007
@@ -0,0 +1,293 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+        <head>
+                <title>PhoneBook</title>
+                <meta name="GENERATOR" content="Microsoft Visual Studio .NET 
7.1">
+                <meta name=ProgId content=VisualStudio.HTML>
+                <meta name=Originator content="Microsoft Visual Studio .NET 
7.1">
+                <script language="javascript" 
src="PhoneBook.ashx?proxy&v=2"></script>                
+                <script language="javascript" src="js/dojo/dojo.js"></script>
+                <script language="javascript">
+                    dojo.require("dojo.io.*");
+                    dojo.require("dojo.event.*");
+                    dojo.require("dojo.html.*");
+                    dojo.require("dojo.json");
+                       dojo.require("dojo.widget.FilteringTable");
+                       dojo.hostenv.writeIncludes();
+                       
+                       /* call server */
+                       
+                    function server(call)
+                    {
+                        var bindArgs = {
+                            url: call.url+'?rpc',
+                            error: function(type, data, evt){alert("Error 
Communicating with Server: " + data.result);},
+                            method: "POST",
+                            mimetype: "text/json",
+                            handle: call.callback,
+                            postContent: dojo.json.serialize(call.request)
+                        };
+                        var req = dojo.io.bind(bindArgs);
+                        dojo.event
+                        return req;
+                    }
+
+                    /* lister */
+                    
+                    function entry_list_result(type, data, evt)
+                    {
+                       var w = dojo.widget.byId("entry_list");
+                        w.store.setData(data.result);
+                    }                    
+                    function entry_list()
+                    {                    
+                        
PhoneBook.rpc.entry_list(entry_list_result).call(server);
+                    }
+                    dojo.addOnLoad(entry_list);
+                    
+                    function entry_list_select_edit(evt) {                   
+                        var table = dojo.widget.byId("entry_list");
+                        entry_edit(table.getSelectedData().entry_key);
+                    }                   
+                    function entry_list_select_delete(evt) {                   
+                        var table = dojo.widget.byId("entry_list");
+                        entry_delete(table.getSelectedData().entry_key);
+                    }                   
+
+                    function entry_list_select() {
+                        dojo.event.connect(dojo.byId("entry_list"), 
"onSelect",        entry_list_select_edit);
+                    }
+                    dojo.addOnLoad(entry_list_select);
+                    
+                    /* lister filters */
+                    
+                       function dateFilter(hired) {
+                                   return (hired == '5/29/1987' || hired == 
'11/18/1984');
+                           }
+                           function applyDate(id){
+                                   dojo.widget.byId(id).setFilter("hired", 
dateFilter);
+                           }
+                               
+                           function nameFilter(last_name){
+                                   return (last_name.charAt(0) >= 'M' && 
last_name.charAt(0) <= 'Z');
+                           }
+                           function applyName(id){
+                                   dojo.widget.byId(id).setFilter("last_name", 
nameFilter);
+                       }
+               
+                           function clearFilters(id){
+                                   dojo.widget.byId(id).clearFilters();
+                           }                       
+                           function reloadData(id){
+                                   dojo.widget.byId(id).store.clearData();
+                                   entry_list();
+                               }
+                                                               
+                    /* editor */
+
+                    function setHired(hired) {                    
+                        var dpHired = dojo.widget.byId("dpHired");
+                       dpHired.setDate(hired);
+                    }
+
+                    function entry_edit_result(type, data, evt) 
+                    {
+                       var w = dojo.widget.byId("entry_form");         
+                       w.setValues(data.result);   
+                       var part = new Array();
+                       part = data.result.hired.split('/',3); // mm/dd/yyyy
+                       var yyyy = part[2];
+                       var mm = part[0];
+                       var dd = part[1];
+                       if (mm.length==1) mm = new String().concat('0',mm);
+                       if (dd.length==1) dd = new String().concat('0',dd);
+                       var hired = new String().concat( yyyy,'-',mm,'-',dd );
+                       setHired(hired); 
+                    }
+                    function entry_edit(entry_key) 
+                    {
+                        
PhoneBook.rpc.entry(entry_key,entry_edit_result).call(server);
+                    }
+
+                    function entry_save_result() {
+                       reloadData('entry_list');
+                       entry_reset();
+                    }                    
+                    function entry_save_update_result(type, data, evt)
+                    {
+                       alert ( "Edited: " + data.result.user_name + " (" + 
data.result.entry_key + ")" );
+                       entry_save_result();
+                    }    
+                    function entry_save_insert_result(type, data, evt)
+                    {
+                       alert ( "Added: " + data.result.user_name + " (" + 
data.result.entry_key + ")" );
+                       entry_save_result();
+                    }    
+                    function entry_save()
+                    {                    
+                       var w = dojo.widget.byId("entry_form");         
+                       var values = w.getValues();        
+                       if (values.entry_key)           
+                            
PhoneBook.rpc.entry_save(values,entry_save_update_result).call(server);
+                        else                             
+                            
PhoneBook.rpc.entry_save(values,entry_save_insert_result).call(server);
+                    }                    
+                    
+                    function entry_reset() {
+                        var w = dojo.widget.byId("entry_form");
+                        var values = w.getValues(); 
+                        values.first_name = "";
+                        values.last_name = "";
+                        values.extension = "";
+                        values.user_name = "";
+                        values.hours = "37.5";
+                        values.entry_key = "";
+                        w.setValues(values);
+                        var today = new Date();
+                        setHired(today);
+                    }                    
+                    
+                    function entry_add() 
+                    {
+                        entry_reset();
+                    }
+
+                    function entry_delete_result(type, data, evt)
+                    {
+                       alert ( "Deleted: (" + data.result.entry_key + ")" );
+                       entry_save_result();
+                    }    
+                    function entry_delete(entry_key) 
+                    {
+                       if (entry_key) {   
+                            confirm ( "Delete entry?" );
+                            
PhoneBook.rpc.entry_delete(entry_key,entry_delete_result).call(server);
+                        }
+                    }
+
+                </script>
+                
+                   <style type="text/css">
+                       /***
+                               The following is just an example of how to use 
the table.
+                               You can override any class names to be used if 
you wish.
+                       ***/
+                       table {
+                               font-family:Lucida Grande, Verdana;
+                               font-size:0.8em;
+                               width:100%;
+                               border:1px solid #ccc;
+                               border-collapse:collapse;
+                               cursor:default;
+                       }
+                       table td,
+                       table th{
+                               padding:2px;
+                               font-weight:normal;
+                       }
+                       table thead td, table thead th {
+                               background-image:url(images/ft-head.gif);
+                               background-repeat:no-repeat;
+                               background-position:top right;
+                       }
+                       table thead td.selectedUp, table thead th.selectedUp {
+                               background-image:url(images/ft-headup.gif);
+                       }
+                       table thead td.selectedDown, table thead 
th.selectedDown {
+                               background-image:url(images/ft-headdown.gif);
+                       }
+                       
+                       table tbody tr td{
+                               border-bottom:1px solid #ddd;
+                       }
+                       table tbody tr.alt td{
+                               background: #e3edfa;
+                       }
+                       table tbody tr.selected td{
+                              background: yellow;
+                       }
+                       table tbody tr:hover td{
+                               background: #a6c2e7;
+                       }
+                       table tbody tr.selected:hover td{
+                               background:#ff9;
+                       }
+
+                       #inputArea{
+                               margin:1em 0;
+                               padding:1em;
+                               background-color:#eef;
+                       }
+                       #updateTestInput{
+                               border:1px solid #ccc;
+                               width:100%;
+                               height:80px;
+                               font-family:serif;
+                               font-size:0.9em;
+                               overflow:auto;
+                       }
+       </style>                            
+    </head>
+    <body>   
+    
+        <div id="finder" />
+        
+        <div id="lister">
+        
+        <table id="filter_menu"><tr><td>
+                   <input type="button" onclick="applyDate('entry_list');" 
value="Show only hires between 1/1/1984 and 1/1/1987" ID="Button1" 
NAME="Button1"/> 
+            <input type="button" onclick="applyName('entry_list');" 
value="Show only names between M and Z" ID="Button2" NAME="Button2"/> 
+            <input type="button" value="Show All Entries" 
onclick="clearFilters('entry_list');" ID="Button3" NAME="Button3"/>
+                   <input type="button" value="Reload Entries" 
onclick="reloadData('entry_list');" ID="Button4" NAME="Button4"/>        
+        </td></tr></table>
+        
+           <table id="entry_list" 
+            dojoType="filteringTable" alternateRows="true" 
valueField="user_name" >
+               <thead>
+                   <tr>
+                           <th field="last_name" sort="asc">Last Name</th>
+                           <th field="first_name">First Name</th>
+                           <th field="extension">Extension</th>
+                           <th field="user_name">User</th>
+                           <th field="hired" align="center">Hired</th>
+                           <th field="hours" align="center">Hours</th>
+                   </tr>
+               </thead>
+           </table>
+        
+        <table id="edit_menu"><tr><td>
+            <input type="button" value="Edit Entry" 
onclick="entry_list_select_edit('entry_list');" ID="Button5" NAME="Button5"/>
+            <input type="button" value="Add Entry" 
onclick="entry_add('entry_list');" ID="Button6" NAME="Button6"/>
+            <input type="button" value="Delete Entry" 
onclick="entry_list_select_delete('entry_list');" ID="Button7" NAME="Button7"/>
+        </td></tr></table>
+        
+               </div> 
+               
+               <div id="viewer" />
+               
+        <div id="editor">
+        
+        <form id="entry_form" dojoType="Form">
+            <table ID="Table1"><tr>
+                    <td>First Name</td><td><input name="first_name" 
ID="Text1"/></td>
+                </tr><tr>
+                    <td>Last Name</td><td><input name="last_name" 
ID="Text2"/></td>
+                </tr><tr>
+                    <td>Extension</td><td><input name="extension" 
ID="Text3"/></td>
+                </tr><tr>
+                    <td>User Name</td><td><input name="user_name" 
ID="Text4"/></td>
+                </tr><tr>
+                    <td>Hired</td><td><input name="hired" widgetid="dpHired" 
dojoType="dropdowndatepicker" displayFormat="MM/dd/yyyy" ID="Text5"/></td>
+                </tr><tr>
+                    <td>Hours</td><td><input name="hours" ID="Text6"/></td>
+                </tr><tr>
+                    <td rowspan="2"><input type="button" 
onClick="entry_save();" value="SAVE" ID="Button8" NAME="Button8"/>
+                    <input type="hidden" name="editor" value="1" ID="Hidden1"/>
+                    <input type="hidden" name="entry_key" ID="Hidden2"/>
+                </td>
+            </tr></table>
+        </form>
+        </div>
+        
+    </body>
+</html> 


Reply via email to