blob: c033d2e83a2b252b6da84c6fb25f470e8245a626 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
open Meta
functor Make(M : sig
con keyName :: Name
con keyType :: Type
val showKey : show keyType
con visible :: {(Type * Type)}
constraint [keyName] ~ visible
val folder : folder visible
val visible : $(map Meta.meta visible)
con invisible :: {Type}
constraint [keyName] ~ invisible
constraint visible ~ invisible
val title : string
val isAllowed : transaction bool
table t : ([keyName = keyType] ++ map fst visible ++ invisible)
end) = struct
open M
fun main () =
items <- queryX (SELECT t.{keyName}, t.{{map fst visible}} FROM t)
(fn r => <xml><entry><tr>
<hidden{keyName} value={show r.T.keyName}/>
{useMore (foldR2 [meta] [fst] [fn cols :: {(Type * Type)} =>
xml [Body, Form, Tr] [] (map snd cols)]
(fn [nm :: Name] [p :: (Type * Type)] [rest :: {(Type * Type)}] [[nm] ~ rest]
(m : meta p) v (acc : xml [Body, Form, Tr] [] (map snd rest)) =>
<xml>
<td>{m.WidgetPopulated [nm] v}</td>
{useMore acc}
</xml>)
<xml/>
[_] folder visible (r.T -- keyName))}
</tr></entry></xml>);
return <xml><body>
<h1>{[title]}</h1>
<form><table>
<tr>{foldRX [meta] [_]
(fn [nm :: Name] [p :: (Type * Type)] [rest :: {(Type * Type)}] [[nm] ~ rest] m =>
<xml><th>{[m.Nam]}</th></xml>) [_] folder visible}</tr>
<subforms{#Users}>{items}</subforms>
</table></form>
</body></xml>
end
|