blob: d8a259a6c60ca586b6411fe143aefc03e1779dad (
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
open Brr
open Brr_note
module Js = Js_of_ocaml.Js
let popup
: title:Jstr.t -> ?form:Events.t option -> Events.event option Note.E.send -> El.t
= fun ~title ?(form = None) send ->
(* Ensure we keep a track for the signal event.
This looks a bit like the old memory magment in C, as it require to
destroy the logger each time the popup is removed. *)
let log_opt = Option.map
(fun (values, _) -> Note.S.log values (fun _ -> ()))
form in
let close_btn =
El.span
~at:At.[class' (Jstr.v "modal-close")]
[ El.txt' "×"] in
Evr.endless_listen
(El.as_target close_btn)
Ev.click
(fun _ ->
Option.iter Note.Logr.destroy log_opt;
send None
);
let container = match form with
| None -> El.div
| Some _ -> El.form
and body = match form with
| None -> El.div []
| Some (_, content) -> content
and footer = match form with
| None -> El.txt Jstr.empty
| Some (values, _) ->
let btn = El.input ()
~at:At.[type' (Jstr.v "submit")] in
Evr.endless_listen
(El.as_target btn)
Ev.click
(fun _ ->
Option.iter Note.Logr.force log_opt;
let form_content = (Note.S.value values) in
Option.iter Note.Logr.destroy log_opt;
send (Some form_content));
El.div [ btn ]
~at:At.[class' (Jstr.v "row")] in
let el = El.div
~at:At.[class' (Jstr.v "modal")]
[ container
~at:At.[class' (Jstr.v "modal-content")]
[ El.div
~at:At.[class' (Jstr.v "modal-header")]
[ close_btn
; El.h3
[ El.txt title ]]
; El.div
~at:At.[class' (Jstr.v "modal-body")]
[ body ]
; El.div
~at:At.[class' (Jstr.v "modal-footer")]
[ footer ]]] in
El.append_children (Document.body G.document)
[ el ]
; el
|