diff options
-rwxr-xr-x | editor/actions/actions.ml | 14 | ||||
-rwxr-xr-x | editor/actions/add_page.ml | 10 | ||||
-rwxr-xr-x | editor/actions/delete_page.ml | 10 | ||||
-rwxr-xr-x | editor/actions/event.ml | 9 | ||||
-rwxr-xr-x | editor/actions/load_page.ml | 2 | ||||
-rwxr-xr-x | editor/app.ml | 7 | ||||
-rwxr-xr-x | editor/editor.ml | 9 | ||||
-rwxr-xr-x | editor/forms/ui.ml | 79 | ||||
-rwxr-xr-x | editor/state/dune | 1 | ||||
-rwxr-xr-x | editor/state/state.ml | 3 | ||||
-rwxr-xr-x | editor/state/state.mli | 16 |
11 files changed, 41 insertions, 119 deletions
diff --git a/editor/actions/actions.ml b/editor/actions/actions.ml index b150279..f35beef 100755 --- a/editor/actions/actions.ml +++ b/editor/actions/actions.ml @@ -3,12 +3,10 @@ open Js_of_ocaml open Brr open Brr_note -module Event = Event - type button_actions = - { delete : Event.t Note.event - ; redirect : Event.t Note.event - ; add: Event.t Note.event + { delete : State.event Note.event + ; redirect : State.event Note.event + ; add: State.event Note.event } let populate_menu @@ -87,19 +85,19 @@ let populate_menu - the list for all the pages presents in the sidebar *) let redirect_handler = - (module Load_page.M : Event.Handler with type t = Load_page.M.t ) in + (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 _ -> Event.E (None, redirect_handler)) + (fun _ -> State.E (None, redirect_handler)) home_button ) :: ( List.map2 stored_pages pages ~f:(fun name el -> Evr.on_el Ev.click - (fun _ -> Event.E ((Some name), redirect_handler)) + (fun _ -> State.E ((Some name), redirect_handler)) el ))) in let childs = diff --git a/editor/actions/add_page.ml b/editor/actions/add_page.ml index 3ada726..4a3fcf3 100755 --- a/editor/actions/add_page.ml +++ b/editor/actions/add_page.ml @@ -9,7 +9,7 @@ module M = struct = fun title -> title - let apply + let update : t -> State.t -> State.t = fun {title} state -> let page_id = key_of_title title in @@ -24,17 +24,17 @@ end (** Create a new element *) let create - : unit -> Event.t Note.event + : unit -> State.event Note.event = fun () -> let title = Jstr.v "Nouvelle page" in - let ev = Forms.Ui.popup + let ev = Elements.Popup.create ~title ~form:(Some (Forms.Add_page.create ())) in Note.E.map - (fun v -> Event.E + (fun v -> State.E (v - , (module M : Event.Handler with type t = M.t ))) + , (module M : State.Event with type t = M.t ))) (* Option.on_some trigger the event only when the pop up is validated. Closing the popup doesn't do anything. *) diff --git a/editor/actions/delete_page.ml b/editor/actions/delete_page.ml index 5c625bd..9086fc3 100755 --- a/editor/actions/delete_page.ml +++ b/editor/actions/delete_page.ml @@ -2,7 +2,7 @@ module M = struct type t = unit - let apply + let update : t -> State.t -> State.t = fun () state -> match state.page_id with @@ -15,15 +15,15 @@ module M = struct end let create - : unit -> Event.t Note.event + : unit -> State.event Note.event = fun () -> let title = Jstr.v "Confirmation" in - let ev = Forms.Ui.popup + let ev = Elements.Popup.create ~title ~form:(Some (Forms.Delete_page.create () )) in Note.E.map - (fun v -> Event.E + (fun v -> State.E ( v - , (module M : Event.Handler with type t = M.t ))) + , (module M : State.Event with type t = M.t ))) (Note.E.Option.on_some ev) diff --git a/editor/actions/event.ml b/editor/actions/event.ml deleted file mode 100755 index 21e3d3a..0000000 --- a/editor/actions/event.ml +++ /dev/null @@ -1,9 +0,0 @@ -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 diff --git a/editor/actions/load_page.ml b/editor/actions/load_page.ml index eb4afac..ceee038 100755 --- a/editor/actions/load_page.ml +++ b/editor/actions/load_page.ml @@ -2,7 +2,7 @@ module M = struct type t = Jstr.t option - let apply + let update : t -> State.t -> State.t = fun page_id state -> let json = State.Storage.load page_id in diff --git a/editor/app.ml b/editor/app.ml deleted file mode 100755 index 9edc947..0000000 --- a/editor/app.ml +++ /dev/null @@ -1,7 +0,0 @@ -(** [update] is the event loop. - - The function take a new event, and apply it to the current state. *) -let update - : (Actions.Event.t, State.t) Application.t - = fun (E (t, (module EventHandler))) state -> - EventHandler.apply t state diff --git a/editor/editor.ml b/editor/editor.ml index a991b25..79ad54a 100755 --- a/editor/editor.ml +++ b/editor/editor.ml @@ -58,7 +58,7 @@ let build_view module Store = struct type t = unit - let apply + let update : t -> State.t -> State.t = fun () state -> let title_element = Document.find_el_by_id G.document (Jstr.v "title") in @@ -123,15 +123,14 @@ let app id content = let init_state = State.init pm view last_backup page_id in - let app_state = Application.run + let app_state = State.run ~eq:State.eq - (App.update ) init_state (Note.E.select [ Brr_note.Evr.on_el Ev.focusout (fun _ -> - (Actions.Event.E + (State.E ( () - , (module Store:Actions.Event.Handler with type t = Store.t)))) editor + , (module Store:State.Event with type t = Store.t)))) editor ; Note.E.map (fun ev -> ev) btn_events.Actions.delete ; Note.E.map (fun ev -> ev) btn_events.Actions.add ; Note.E.map (fun v -> v) btn_events.Actions.redirect diff --git a/editor/forms/ui.ml b/editor/forms/ui.ml deleted file mode 100755 index 53039c4..0000000 --- a/editor/forms/ui.ml +++ /dev/null @@ -1,79 +0,0 @@ -open Brr -open Brr_note -module Js = Js_of_ocaml.Js - -let popup - : ?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 ] diff --git a/editor/state/dune b/editor/state/dune index dd405a1..b61174d 100755 --- a/editor/state/dune +++ b/editor/state/dune @@ -2,6 +2,7 @@ (name state) (libraries brr + application prosemirror plugins ) diff --git a/editor/state/state.ml b/editor/state/state.ml index 569f26c..649473c 100755 --- a/editor/state/state.ml +++ b/editor/state/state.ml @@ -14,6 +14,7 @@ type t = ; window : Brr.El.t list ; pm : PM.t } +type state = t (** Compare two states together. @@ -86,3 +87,5 @@ let init ; pm } + +include Application.Make(struct type t = state end) diff --git a/editor/state/state.mli b/editor/state/state.mli index 6984067..20d5288 100755 --- a/editor/state/state.mli +++ b/editor/state/state.mli @@ -11,6 +11,7 @@ type t = ; pm : Prosemirror.t } + val eq: t -> t -> bool (** Update the title element according to the page. *) @@ -26,3 +27,18 @@ val load_page (** Initialise a new state *) val init : Prosemirror.t -> Prosemirror.View.editor_view Js.t -> float -> Jstr.t option -> t + +type state = t +module type Event = sig + + type t + + val update: t -> state -> state + +end + +type event = E : 'a * (module Event with type t = 'a) -> event + +(** Simple helper for the main event loop *) +val run + : ?eq:(t -> t -> bool) -> t -> event Note.E.t -> state Note.S.t |