changeset 781:c884a42599f3

crud3 demo
author Adam Chlipala <adamc@hcoop.net>
date Sun, 03 May 2009 16:00:43 -0400
parents 0084af7af35a
children a44daa674810
files demo/crud3.ur demo/crud3.urp demo/prose
diffstat 3 files changed, 38 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demo/crud3.ur	Sun May 03 16:00:43 2009 -0400
@@ -0,0 +1,27 @@
+table t : {Id : int, Text : string}
+  PRIMARY KEY Id
+
+open Crud.Make(struct
+                   val tab = t
+                             
+                   val title = "Crud3"
+
+                   val cols = {Text = {Nam = "Text",
+                                       Show = txt,
+                                       Widget = (fn (nm :: Name) => <xml>
+                                         <subform{nm}>
+                                           <textbox{#A}/>
+                                           <textbox{#B}/>
+                                         </subform>
+                                       </xml>),
+                                       WidgetPopulated = (fn (nm :: Name) s => <xml>
+                                         <subform{nm}>
+                                           <textbox{#A} value={s}/>
+                                           <textbox{#B}/>
+                                         </subform>
+                                       </xml>),
+                                       Parse = (fn p => p.A ^ p.B),
+                                       Inject = _
+                                      }
+                              }
+               end)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demo/crud3.urp	Sun May 03 16:00:43 2009 -0400
@@ -0,0 +1,5 @@
+database dbname=test
+sql crud3.sql
+
+crud
+crud3
--- a/demo/prose	Sun May 03 15:53:29 2009 -0400
+++ b/demo/prose	Sun May 03 16:00:43 2009 -0400
@@ -231,6 +231,12 @@
 
 <p>This example shows another application of <tt>Crud.Make</tt>.  We mix one standard column with one customized column.  We write an underscore for the <tt>Inject</tt> field of meta-data, since the type class facility can infer that witness.</p>
 
+crud3.urp
+
+<p>One thing that is unclear from the previous examples is how to provide more complex, multi-input widgets for taking input meant for particular fields.  The signature of <tt>Crud.Make</tt> forces every widget to define exactly one input.  The <tt>&lt;subform&gt;</tt> tag, the simpler cousin of the <tt>&lt;subforms&gt;</tt> tag that we saw earlier, provides a fix for this problem.  Via <tt>&lt;subform&gt;</tt>, an arbitrary form can be turned into a single record-valued input.</p>
+
+<p>We use that possibility here to define a silly widget for a <tt>string</tt> column, which concatenates the values entered into two different textboxes.</p>
+
 alert.urp
 
 <p>Ur/Web makes it easy to write code whose execution should be distributed between the web server and client web browsers.  Server-side code is compiled to efficient native code, and client-side code is compiled to JavaScript.  Ur/Web programmers don't need to worry about these details, because the language and standard library provide a uniform ML-like interface for the whole process.</p>