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>