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 ])