aboutsummaryrefslogtreecommitdiff
path: root/lib/elements/popup.ml
blob: e2e2a76e7c35c0f1b9a387325f66f926c54229e7 (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
76
77
78
79
open Brr
open Brr_note
module Js = Js_of_ocaml.Js

let create
  : ?form:('a Note.signal * El.t) option -> title:Jstr.t -> 'a option Note.event
  = fun ?(form = None) ~title ->

    (* 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' "×"]

    and submit_btn = El.input ()
        ~at:At.[type' (Jstr.v "submit")] in

    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 _ ->

        El.div [ submit_btn ]
          ~at:At.[class' (Jstr.v "row")] in

    (* HTML Element creation *)
    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

    let () = El.append_children (Document.body G.document)
        [ el ] in

    (* Event handler *)
    let close_event = Evr.on_el
        Ev.click
        (fun _ ->
           El.remove el;
           Option.iter Note.Logr.destroy log_opt;
           None)
        close_btn

    and submit_event = Evr.on_el
        Ev.click
        (fun _ ->
           El.remove el;
           Option.iter Note.Logr.destroy log_opt;
           Option.map (fun v -> Note.S.value (fst v)) form)
        submit_btn in

    Note.E.select
      [ close_event
      ; submit_event ]