summaryrefslogtreecommitdiff
path: root/editor/actions/editor_actions.ml
diff options
context:
space:
mode:
Diffstat (limited to 'editor/actions/editor_actions.ml')
-rwxr-xr-xeditor/actions/editor_actions.ml150
1 files changed, 150 insertions, 0 deletions
diff --git a/editor/actions/editor_actions.ml b/editor/actions/editor_actions.ml
new file mode 100755
index 0000000..8c47363
--- /dev/null
+++ b/editor/actions/editor_actions.ml
@@ -0,0 +1,150 @@
+open StdLabels
+open Js_of_ocaml
+open Brr
+open Brr_note
+
+let populate_menu
+ : unit -> State.event Note.event option
+ = fun () ->
+ 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") ] ]
+
+ and export_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") ]
+ ]
+
+ and load_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-upload") ]
+ ]
+ in
+
+ (* We are waiting for event inside another event ( form validation inside
+ popup creation.
+
+ Note.E.join is used here in order to get only te popup validation. *)
+ let delete_event =
+ Note.E.join (
+ Evr.on_el
+ Ev.click
+ (fun _ -> Delete_page.create ())
+ delete_button)
+
+ (* Event on popup creation *)
+ and add_event =
+ Note.E.join (
+ Evr.on_el
+ Ev.click
+ (fun _ -> Add_page.create ())
+ add_button)
+
+ and export_event =
+ Note.E.join (
+ Evr.on_el
+ Ev.click
+ (fun _ -> Export.create ())
+ export_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_handler =
+ (module Load_page.M : State.Event with type t = Load_page.M.t ) in
+
+ let redirect_event = Note.E.select
+ (( Evr.on_el
+ Ev.click
+ (fun _ -> State.E (None, redirect_handler))
+ home_button
+ ) :: (
+ List.map2 stored_pages pages
+ ~f:(fun name el ->
+ Evr.on_el
+ Ev.click
+ (fun _ -> State.E ((Some name), redirect_handler))
+ el ))) in
+
+ let childs =
+ [ home_button
+ ; add_button
+ ; export_button
+ ; load_button
+ ; 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 (
+ Note.E.select
+ [ delete_event
+ ; redirect_event
+ ; add_event
+ ; export_event
+ ])