diff options
author | Marius Peter <marius.peter@tutanota.com> | 2025-05-18 17:02:32 +0200 |
---|---|---|
committer | Marius Peter <marius.peter@tutanota.com> | 2025-05-18 17:02:32 +0200 |
commit | 6658535cf610d6c1d99dae20e98ced14a920dbb2 (patch) | |
tree | f67c4076e4e2d8c9778995fa5880490552133f29 /lib/views.ml | |
parent | 3073ec0e7e2e7f0a89dbc4d4851da2451aff2f62 (diff) |
Modularize everything.
Diffstat (limited to 'lib/views.ml')
-rw-r--r-- | lib/views.ml | 215 |
1 files changed, 123 insertions, 92 deletions
diff --git a/lib/views.ml b/lib/views.ml index 3c1330e..e023236 100644 --- a/lib/views.ml +++ b/lib/views.ml @@ -3,11 +3,39 @@ type head_data = { page_title : string } type body_data = { title : string; subtitle : string; - topnav : Dream_html.node; content : Dream_html.node list; } -module Layout = struct +module Components = struct + open Dream_html + + let topnav current_path = + let open HTML in + let li_of_a (path, text) = + let is_active = path = current_path in + let attrs = if is_active then [ id "active" ] else [] in + let url = + if String.equal path "/" then Printf.sprintf "/%s/" current_path + else Printf.sprintf "/%s/%s" current_path path + in + li attrs [ a [ href "%s" url ] [ txt text ] ] + in + nav + [ id "top" ] + [ + ul [] + @@ List.map li_of_a + [ + ("/", "summary"); + ("refs/", "refs"); + ("log/", "log"); + ("tree/", "tree"); + ("commit/", "commit"); + ]; + ] +end + +module Page = struct open Dream_html open HTML @@ -22,7 +50,7 @@ module Layout = struct let default_head_data = { page_title = "Ogit" } - let application ?(head_data = default_head_data) body_data = + let render ?(head_data = default_head_data) body_data = html [] [ head [] @@ -35,44 +63,14 @@ module Layout = struct body [] [ header body_data.title body_data.subtitle; - body_data.topnav; + Components.topnav body_data.title; div [ id "main" ] body_data.content; footer (); ]; ] end -module Components = struct - open Dream_html - - let topnav repo_path current_path = - let open HTML in - let li_of_a (path, text) = - let is_active = path = current_path in - let attrs = if is_active then [ id "active" ] else [] in - let url = - if String.equal path "/" then Printf.sprintf "/%s/" repo_path - else Printf.sprintf "/%s/%s" repo_path path - in - li attrs [ a [ href "%s" url ] [ txt text ] ] - in - nav - [ id "top" ] - [ - ul [] - @@ List.map li_of_a - [ - ("/", "summary"); - ("refs", "refs"); - ("log", "log"); - ("tree", "tree"); - ("commit", "commit"); - ("diff", "diff"); - ]; - ] -end - -let ogit_root () = +let root () = let open Dream_html in let repositories_in directory = let repos = @@ -87,60 +85,88 @@ let ogit_root () = { title = "Ogit"; subtitle = "Repositories for " ^ Config.author; - topnav = HTML.(null []); content = [ repositories_in Config.git_directory ]; } in - Layout.application body_data + Page.render body_data -let repo_summary repo_path branches commits = - let open Git_helpers in - let open Dream_html in - let li_of_branch branch = - HTML.(li [] [ a [ href "%s" branch ] [ txt "%s" branch ] ]) - in - let li_of_commit commit = - match commit.message with - | Some msg -> - HTML.( - li [] - [ - a - [ href "commit/?id=%s" commit.hash ] - [ txt "%s %s" (short_hash commit.hash) msg ]; - ]) - | None -> HTML.(li [] [ a [ href "" ] [ txt "caca!!" ] ]) - in - let content = - HTML. - [ - h3 [] [ txt "Branches" ]; - ul [] (List.map li_of_branch branches); - h3 [] [ txt "Recent commits" ]; - ul [] (List.map li_of_commit commits); - ] - in - Layout.application - { - title = repo_path; - subtitle = repo_description repo_path; - topnav = Components.topnav repo_path ""; - content; - } +module Repo = struct + let summary repo_path branches commits authors = + let open Dream_html in + let li_of_branch branch = + HTML.(li [] [ a [ href "%s" branch ] [ txt "%s" branch ] ]) + in + let li_of_commit (commit : Git_helpers.Commit.t) = + match commit.message with + | Some msg -> + HTML.( + li [] + [ + a + [ href "commit/?id=%s" commit.hash ] + [ txt "%s %s" (Git_helpers.short_hash commit.hash) msg ]; + ]) + | None -> HTML.(li [] [ a [ href "" ] [ txt "caca!!" ] ]) + in + let li_of_author author = + HTML.(li [] [ a [ href "" ] [ txt "%s" author ] ]) + in + let content = + HTML. + [ + h3 [] [ txt "Branches" ]; + ul [] (List.map li_of_branch branches); + h3 [] [ txt "Recent commits" ]; + ul [] (List.map li_of_commit commits); + h3 [] [ txt "Authors" ]; + ul [] (List.map li_of_author authors); + ] + in + Page.render + { + title = repo_path; + subtitle = Git_helpers.repo_description repo_path; + content; + } -let repo_commit repo_path commit = - let open Git_helpers in - let open Dream_html in - let message = match commit.message with Some msg -> msg | None -> "" in - let content = HTML.[ h3 [] [ txt "%s" message ] ] in - let title = Printf.sprintf "%s : %s" repo_path (short_hash commit.hash) in - Layout.application - { - title; - subtitle = ""; - topnav = Components.topnav repo_path ""; - content; - } + let refs repo_path = + let open Dream_html in + Page.render + HTML. + { + title = repo_path; + subtitle = Git_helpers.repo_description repo_path; + content = [ null [] ]; + } + + let log repo_path = + let open Dream_html in + Page.render + HTML. + { + title = repo_path; + subtitle = Git_helpers.repo_description repo_path; + content = [ null [] ]; + } + + let tree repo_path = + let open Dream_html in + Page.render + HTML. + { + title = repo_path; + subtitle = Git_helpers.repo_description repo_path; + content = [ null [] ]; + } + + let commit repo_path (commit : Git_helpers.Commit.t) = + let open Dream_html in + let open Git_helpers in + let message = match commit.message with Some msg -> msg | None -> "" in + let content = HTML.[ h3 [] [ txt "%s" message ] ] in + let title = Printf.sprintf "%s : %s" repo_path (short_hash commit.hash) in + Page.render { title; subtitle = ""; content } +end let error_page message = let open Dream_html in @@ -149,19 +175,24 @@ let error_page message = [ head [] [ - title [] "Big error"; + title [] "Fatal Error"; link [ rel "stylesheet"; href "/static/styles.css" ]; link [ rel "icon"; type_ "image/x-icon"; href "/static/git_icon.svg" ]; ]; body [] [ - h1 [] [ txt "Major error alert" ]; - h2 [] [ txt "Major alert subtitle" ]; - (* Components.topnav; *) - div [ id "main" ] [ txt "%s" message ]; + h1 [] [ txt "Fatal Error" ]; + div + [ id "main" ] + [ + p [] [ b [] [ txt "%s" message ] ]; + p [] + [ + txt + "Your best course of action is to press the 'back' \ + button in your browser."; + ]; + ]; ]; ]) - -let repo_tree repo_path = repo_summary repo_path -let repo_blob repo_path = repo_summary repo_path |