From 1eeaf137bd30aff1bef34d05eeec686f6da8959d Mon Sep 17 00:00:00 2001 From: Sébastien Dailly Date: Sun, 23 May 2021 22:09:50 +0200 Subject: Update editor --- editor/forms/ui.ml | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100755 editor/forms/ui.ml (limited to 'editor/forms/ui.ml') diff --git a/editor/forms/ui.ml b/editor/forms/ui.ml new file mode 100755 index 0000000..d8a259a --- /dev/null +++ b/editor/forms/ui.ml @@ -0,0 +1,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 -- cgit v1.2.3