0 | module Web.Async.Confirm
2 | import Derive.Prelude
3 | import Text.HTML.DomID
5 | import Web.Async.Form
8 | %language ElabReflection
11 | data ConfirmEv = Cancel | OK
13 | %runElab derive "ConfirmEv" [Show,Eq,Ord]
15 | confirm : ConfirmEv -> EditRes e -> Maybe (Maybe e)
16 | confirm OK (Valid v) = Just (Just v)
17 | confirm Cancel _ = Just Nothing
18 | confirm _ _ = Nothing
22 | -> JSStream ConfirmEv
23 | -> JSStream (EditRes e)
24 | -> JSStream (Maybe e)
25 | confirmStream ref cs es =
26 | resource (hold1 $
es |> observe sink) $
\esh =>
27 | zipWith confirm cs esh.stream |> P.catMaybes
42 | (wrap : HTMLNode -> Act (Sink (EditRes e), Widget ConfirmEv))
45 | -> Act (Widget $
Maybe e)
46 | confirmed wrap ed m = Prelude.do
47 | W inner es <- ed.widget m
48 | (btn, W outer cs) <- wrap inner
49 | pure (W outer $
confirmStream btn cs es)
55 | (wrap : HTMLNode -> Act (Sink (EditRes e), Widget ConfirmEv))
58 | -> Act (Widget $
Maybe e)
59 | confirmed1 wrap ed = map {events $= take 1} . confirmed wrap ed
62 | keyConfirmed : Editor e -> Maybe e -> Act (Widget $
Maybe e)
64 | confirmed $
\n => Prelude.do
65 | E es <- event {fs = [JSErr]} ConfirmEv
66 | let n2 := withAttributes [onEscDown Confirm.Cancel, onEnterDown OK] n
67 | pure (neutral, W n2 es)
70 | cleanupDialog : DomID -> Act ()
72 | let ref := elemRef d
73 | in children ref [] >> dialogClose ref
77 | (wrap : HTMLNode -> Act (Sink (EditRes e), Widget ConfirmEv))
81 | -> Act (JSStream $
Maybe e)
82 | confirmedModal wrap d ed m = Prelude.do
83 | let ref := elemRef d
84 | W n evs <- confirmed wrap ed m
87 | pure $
flip observe evs $
\case
88 | Nothing => cleanupDialog d