summaryrefslogtreecommitdiff
path: root/lib/views.ml
diff options
context:
space:
mode:
authorMarius Peter <marius.peter@tutanota.com>2025-05-18 17:02:32 +0200
committerMarius Peter <marius.peter@tutanota.com>2025-05-18 17:02:32 +0200
commit6658535cf610d6c1d99dae20e98ced14a920dbb2 (patch)
treef67c4076e4e2d8c9778995fa5880490552133f29 /lib/views.ml
parent3073ec0e7e2e7f0a89dbc4d4851da2451aff2f62 (diff)
Modularize everything.
Diffstat (limited to 'lib/views.ml')
-rw-r--r--lib/views.ml215
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
Copyright 2019--2025 Marius PETER