Mercurial > urweb
annotate demo/more/bulkEdit.ur @ 1228:7dfa67560916
Using multiple policies to check a written value
author | Adam Chlipala <adamc@hcoop.net> |
---|---|
date | Sun, 11 Apr 2010 16:46:38 -0400 |
parents | 1911e84df461 |
children |
rev | line source |
---|---|
adamc@1004 | 1 open Meta |
adamc@1004 | 2 |
adamc@1004 | 3 functor Make(M : sig |
adamc@1004 | 4 con keyName :: Name |
adamc@1004 | 5 con keyType :: Type |
adamc@1004 | 6 val showKey : show keyType |
adamc@1005 | 7 val readKey : read keyType |
adamc@1005 | 8 val injKey : sql_injectable keyType |
adamc@1004 | 9 |
adamc@1004 | 10 con visible :: {(Type * Type)} |
adamc@1004 | 11 constraint [keyName] ~ visible |
adamc@1004 | 12 val folder : folder visible |
adamc@1004 | 13 val visible : $(map Meta.meta visible) |
adamc@1004 | 14 |
adamc@1004 | 15 con invisible :: {Type} |
adamc@1004 | 16 constraint [keyName] ~ invisible |
adamc@1004 | 17 constraint visible ~ invisible |
adamc@1004 | 18 |
adamc@1004 | 19 val title : string |
adamc@1004 | 20 val isAllowed : transaction bool |
adamc@1004 | 21 table t : ([keyName = keyType] ++ map fst visible ++ invisible) |
adamc@1004 | 22 end) = struct |
adamc@1004 | 23 |
adamc@1004 | 24 open M |
adamc@1004 | 25 |
adamc@1004 | 26 fun main () = |
adamc@1004 | 27 items <- queryX (SELECT t.{keyName}, t.{{map fst visible}} FROM t) |
adamc@1004 | 28 (fn r => <xml><entry><tr> |
adamc@1004 | 29 <hidden{keyName} value={show r.T.keyName}/> |
adamc@1008 | 30 {useMore (allPopulatedTr visible (r.T -- keyName) folder)} |
adamc@1004 | 31 </tr></entry></xml>); |
adamc@1004 | 32 |
adamc@1004 | 33 return <xml><body> |
adamc@1004 | 34 <h1>{[title]}</h1> |
adamc@1004 | 35 |
adamc@1004 | 36 <form><table> |
adamc@1004 | 37 <tr>{foldRX [meta] [_] |
adamc@1004 | 38 (fn [nm :: Name] [p :: (Type * Type)] [rest :: {(Type * Type)}] [[nm] ~ rest] m => |
adamc@1004 | 39 <xml><th>{[m.Nam]}</th></xml>) [_] folder visible}</tr> |
adamc@1004 | 40 <subforms{#Users}>{items}</subforms> |
adamc@1005 | 41 <tr> <td><submit value="Save" action={save}/></td> </tr> |
adamc@1004 | 42 </table></form> |
adamc@1004 | 43 </body></xml> |
adamc@1004 | 44 |
adamc@1005 | 45 and save r = |
adamc@1005 | 46 List.app (fn user => dml (update [map fst visible] ! |
adamc@1008 | 47 (ensql visible (user -- keyName) folder) |
adamc@1005 | 48 t |
adamc@1005 | 49 (WHERE t.{keyName} = {[readError user.keyName]}))) r.Users; |
adamc@1005 | 50 main () |
adamc@1005 | 51 |
adamc@1004 | 52 end |