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/actions/actions.ml | 128 ++++++++++++++++++++++++++++++++++++++++++ editor/actions/add_page.ml | 11 ++++ editor/actions/delete_page.ml | 16 ++++++ editor/actions/dune | 13 +++++ editor/actions/event.ml | 8 +++ 5 files changed, 176 insertions(+) create mode 100755 editor/actions/actions.ml create mode 100755 editor/actions/add_page.ml create mode 100755 editor/actions/delete_page.ml create mode 100755 editor/actions/dune create mode 100755 editor/actions/event.ml (limited to 'editor/actions') diff --git a/editor/actions/actions.ml b/editor/actions/actions.ml new file mode 100755 index 0000000..e8b4d71 --- /dev/null +++ b/editor/actions/actions.ml @@ -0,0 +1,128 @@ +open StdLabels +open Js_of_ocaml +open Brr +open Brr_note + +module Event = Event + +type button_actions = + { delete : Event.t Note.event + ; redirect : Jstr.t option Note.event + ; add: Event.t Note.event + } + +let populate_menu + : Forms.Events.event option Note.E.send -> button_actions option + = fun sender -> + match Blog.Sidebar.get () with + | None -> None + | Some element -> + let () = Blog.Sidebar.clean element in + + let delete_button = El.button + ~at:At.[ class' (Jstr.v "action-button") ] + [ El.i [] + ~at:At.[ class' (Jstr.v "fa") + ; class' (Jstr.v "fa-2x") + ; class' (Jstr.v "fa-trash") ] ] + + and home_button = El.button + ~at:At.[ class' (Jstr.v "action-button") ] + [ El.i [] + ~at:At.[ class' (Jstr.v "fa") + ; class' (Jstr.v "fa-2x") + ; class' (Jstr.v "fa-home") ] ] + + and add_button = El.button + ~at:At.[ class' (Jstr.v "action-button") ] + [ El.i [] + ~at:At.[ class' (Jstr.v "fa") + ; class' (Jstr.v "fa-2x") + ; class' (Jstr.v "fa-plus") ] ] + + in + + let delete_event = + Evr.on_el + Ev.click + (fun _ -> Event.E + ( sender + , (module Delete_page: Event.Handler with type t = Delete_page.t)) ) + delete_button + + and add_event = + Evr.on_el + Ev.click + (fun _ -> Event.E + ( sender + , (module Add_page: Event.Handler with type t = Add_page.t)) ) + add_button in + + let stored_pages = State.Storage.get_ids () in + let pages = + List.map + stored_pages + ~f:(fun id -> + + let name_opt = (State.Storage.load (Some id))##.title in + let name = Js.Opt.get + name_opt + (fun () -> id) in + + let target = Jstr.v "#" in + El.li + [ El.a + ~at:[At.href target] + [ El.txt name ] ] + ) in + + (* Wait for a click on an existing page in order to sent the associated + event. + + We compose the resulting event with both : + - the home button + - the list for all the pages presents in the sidebar *) + let redirect_event = Note.E.select + (( Evr.on_el + Ev.click + (fun _ -> None) + home_button + ) :: ( + List.map2 stored_pages pages + ~f:(fun name el -> + Evr.on_el + Ev.click + (fun _ -> Some name) + el ))) in + + let childs = + [ home_button + ; add_button + ; El.button + ~at:At.[class' (Jstr.v "action-button")] + [ El.i + [] + ~at:At.[ class' (Jstr.v "fa") + ; class' (Jstr.v "fa-2x") + ; class' (Jstr.v "fa-download") ] + ] + ; delete_button + ; El.button + ~at:At.[class' (Jstr.v "action-button")] + [ El.i + [] + ~at:At.[ class' (Jstr.v "fa") + ; class' (Jstr.v "fa-2x") + ; class' (Jstr.v "fa-cog") ] + ] + ; El.hr () + ; El.ul + pages + ] in + + let () = El.append_children element childs in + Some + { delete = delete_event + ; redirect = redirect_event + ; add = add_event + } diff --git a/editor/actions/add_page.ml b/editor/actions/add_page.ml new file mode 100755 index 0000000..b817573 --- /dev/null +++ b/editor/actions/add_page.ml @@ -0,0 +1,11 @@ +type t = Forms.Events.event option Note.E.send + +let apply + : t -> State.t -> State.t + = fun close_sender state -> + let title = Jstr.v "Nouvelle page" in + let popup = Forms.Ui.popup + ~title + ~form:(Some (Forms.Add_page.create ())) + close_sender in + { state with window = popup::state.window} diff --git a/editor/actions/delete_page.ml b/editor/actions/delete_page.ml new file mode 100755 index 0000000..cc15693 --- /dev/null +++ b/editor/actions/delete_page.ml @@ -0,0 +1,16 @@ +type t = Forms.Events.event option Note.E.send + +let apply + : t -> State.t -> State.t + = fun close_sender state -> + begin match state.page_id with + | None -> state + | Some page_id -> + let title = Jstr.v "Confirmation" in + let popup = Forms.Ui.popup + ~title + ~form:(Some (Forms.Delete_page.create page_id)) + close_sender in + { state with window = popup::state.window} + end + diff --git a/editor/actions/dune b/editor/actions/dune new file mode 100755 index 0000000..5d269c4 --- /dev/null +++ b/editor/actions/dune @@ -0,0 +1,13 @@ +(library + (name actions) + (libraries + brr + brr.note + elements + blog + js_lib + forms + state + ) + (preprocess (pps js_of_ocaml-ppx)) + ) diff --git a/editor/actions/event.ml b/editor/actions/event.ml new file mode 100755 index 0000000..5e30587 --- /dev/null +++ b/editor/actions/event.ml @@ -0,0 +1,8 @@ +module type Handler = sig + type t + + val apply: t -> State.t -> State.t + +end + +type t = E : 'a * (module Handler with type t = 'a) -> t -- cgit v1.2.3