-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtoggle.ur
82 lines (70 loc) · 2.48 KB
/
toggle.ur
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
open Bootstrap3
type xbody' = xml [Body] [] []
functor Make(M : sig
con user :: Name
con flag :: Name
con others :: {Type}
constraint [user] ~ [flag]
constraint [user, flag] ~ others
table t : ([user = string, flag = bool] ++ others)
val whoami : transaction (option string)
val trueHeadingText : xbody
val trueButtonText : xbody'
val falseHeadingText : xbody
val falseButtonText : xbody'
val onRsvp : string -> transaction unit
val onUnrsvp : string -> transaction unit
end) = struct
open M
type input = string
type a = source bool
fun create u =
b <- oneOrNoRowsE1 (SELECT (t.{flag})
FROM t
WHERE t.{user} = {[u]});
case b of
None => error <xml>Toggle: user not found.</xml>
| Some b => source b
fun onload _ = return ()
val rsvp =
me <- whoami;
case me of
None => error <xml>Toggle: not logged in</xml>
| Some me =>
dml (UPDATE t
SET {flag} = TRUE
WHERE t.{user} = {[me]});
onRsvp me
val unrsvp =
me <- whoami;
case me of
None => error <xml>Toggle: not logged in</xml>
| Some me =>
dml (UPDATE t
SET {flag} = FALSE
WHERE t.{user} = {[me]});
onUnrsvp me
fun render _ a = <xml>
<dyn signal={av <- signal a;
return (if av then <xml>
{trueHeadingText}
<button class="btn btn-primary"
onclick={fn _ =>
rpc unrsvp;
set a False}>
{trueButtonText}
</button>
</xml> else <xml>
{falseHeadingText}
<button class="btn btn-primary"
onclick={fn _ =>
rpc rsvp;
set a True}>
{falseButtonText}
</button>
</xml>)}/>
</xml>
fun ui u = {Create = create u,
Onload = onload,
Render = render}
end