summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarius Peter <marius.peter@tutanota.com>2025-06-29 20:54:36 +0200
committerMarius Peter <marius.peter@tutanota.com>2025-06-29 20:54:36 +0200
commit85872d1f2c6c28b492edc2861a22b49faf266dcd (patch)
tree4e18a7b25ce7ee765a8a9962aaa8a247d293ea7c
parent156c3e3246acc287d795d74262123f70dc4e409d (diff)
Refactor views.HEADmaster
-rw-r--r--lib/views.ml128
1 files changed, 69 insertions, 59 deletions
diff --git a/lib/views.ml b/lib/views.ml
index 392075f..d2f4501 100644
--- a/lib/views.ml
+++ b/lib/views.ml
@@ -3,34 +3,36 @@
open Dream_html
open Config
+type page = Summary | Commits | Files | Branches | Tags | Readme
+
type body_data = {
title : string;
+ repo : string option;
subtitle : string;
- topnav : Dream_html.node;
+ active : page;
content : Dream_html.node list;
}
-module Components = struct
- module Topnav = struct
- type t = None | Summary | Log | Files | Refs
+let page_to_nav_item repo = function
+ | Summary -> (Routes.Repo repo, "Summary", Summary)
+ | Commits -> (Routes.Commits repo, "Commits", Commits)
+ | Files -> (Routes.Files repo, "Files", Files)
+ | Branches -> (Routes.Branches repo, "Branches", Branches)
+ | Tags -> (Routes.Tags repo, "Tags", Tags)
+ | Readme -> (Routes.Readme repo, "README", Readme)
- let v ?(active_path = None) repo =
- let open HTML in
- let nav_items =
- [
- (Routes.Repo repo, "Summary", Summary);
- (Routes.Log repo, "Log", Log);
- (Routes.Files repo, "Files", Files);
- (Routes.Refs repo, "Refs", Refs);
- ]
- in
- let li_of_item (route, text, path) =
- let is_active = path = active_path in
- let attrs = if is_active then [ id "active" ] else [] in
- HTML.li attrs [ Routes.link_to route (txt "%s" text) ]
- in
- nav [ id "top" ] [ ul [] @@ List.map li_of_item nav_items ]
- end
+module Components = struct
+ let topnav ?(active = Summary) repo =
+ let nav_items =
+ List.map (page_to_nav_item repo)
+ [ Summary; Commits; Files; Branches; Tags; Readme ]
+ in
+ let li_of_item (route, text, path) =
+ let is_active = path = active in
+ let attrs = if is_active then [ HTML.id "active" ] else [] in
+ HTML.li attrs [ Routes.link_to route (txt "%s" text) ]
+ in
+ HTML.(nav [ id "top" ] [ ul [] @@ List.map li_of_item nav_items ])
end
module Page = struct
@@ -42,13 +44,14 @@ module Page = struct
HTML.(null [ h1 [] [ txt "%s" header1 ]; h2 [] [ txt "%s" header2 ] ])
let page_footer () =
- let today = Unix.localtime (Unix.time ()) in
- let year = string_of_int (today.Unix.tm_year + 1900) in
+ let now = Unix.(time () |> localtime) in
+ let year = string_of_int (now.tm_year + 1900) in
let footer_text = Printf.sprintf "Copyright %s %s" year config.user in
HTML.footer [] [ txt "%s" footer_text ]
let render ?(page_title = "Ogit") body_data =
let open HTML in
+ let bd = body_data in
html []
[
head []
@@ -60,9 +63,11 @@ module Page = struct
];
body []
[
- page_header body_data.title body_data.subtitle;
- body_data.topnav;
- div [ id "main" ] body_data.content;
+ page_header bd.title bd.subtitle;
+ (match bd.repo with
+ | None -> HTML.null []
+ | Some repo -> Components.topnav ~active:bd.active repo);
+ div [ id "main" ] bd.content;
page_footer ();
];
]
@@ -83,8 +88,9 @@ let root () =
@@ Page.render
{
title = "Ogit";
+ repo = None;
subtitle = "Repositories for " ^ config.user;
- topnav = HTML.null [];
+ active = Summary;
content = [ all_repositories ];
}
@@ -95,8 +101,11 @@ module Repo = struct
let li_of_author (author : Resolvers.Commit.user) =
HTML.(li [] [ txt "%s" author.name ])
- let li_of_branch repo (branch : Resolvers.Branch.t) =
- HTML.(li [] [ Routes.link_to (Refs repo) (txt "%s" branch.name) ])
+ let li_of_branch repo (branch : Resolvers.Reference.t) =
+ HTML.(li [] [ Routes.link_to (Branches repo) (txt "%s" branch.name) ])
+
+ let li_of_tag repo (tag : Resolvers.Reference.t) =
+ HTML.(li [] [ Routes.link_to (Tags repo) (txt "%s" tag.name) ])
let li_of_commit repo (commit : Resolvers.Commit.t) =
let timestamp (date, _) =
@@ -129,9 +138,10 @@ module Repo = struct
respond
@@ Page.render ~page_title:(page_title repo)
{
+ repo = Some repo;
title = repo;
subtitle = Resolvers.repo_description repo;
- topnav = Components.Topnav.(v ~active_path:Summary repo);
+ active = Summary;
content =
HTML.
[
@@ -144,49 +154,48 @@ module Repo = struct
];
}
- let refs repo branches =
+ let branches repo branches =
respond
@@ Page.render ~page_title:(page_title repo)
{
+ repo = Some repo;
title = repo;
subtitle = Resolvers.repo_description repo;
- topnav = Components.Topnav.(v ~active_path:Refs repo);
- content =
- HTML.
- [
- h3 [] [ txt "Branches" ];
- ul [] (List.map (li_of_branch repo) branches);
- ];
+ active = Branches;
+ content = HTML.[ ul [] @@ List.map (li_of_branch repo) branches ];
}
- let log repo commits =
+ let tags repo tags =
respond
@@ Page.render ~page_title:(page_title repo)
{
+ repo = Some repo;
title = repo;
subtitle = Resolvers.repo_description repo;
- topnav = Components.Topnav.(v ~active_path:Log repo);
- content =
- HTML.
- [
- h3 [] [ txt "All commits" ];
- ul [] (List.map (li_of_commit repo) commits);
- ];
+ active = Tags;
+ content = HTML.[ ul [] @@ List.map (li_of_tag repo) tags ];
+ }
+
+ let commits repo commits =
+ respond
+ @@ Page.render ~page_title:(page_title repo)
+ {
+ repo = Some repo;
+ title = repo;
+ subtitle = Resolvers.repo_description repo;
+ active = Commits;
+ content = HTML.[ ul [] @@ List.map (li_of_commit repo) commits ];
}
let files repo (tree : Resolvers.Tree.t) =
respond
@@ Page.render ~page_title:(page_title repo)
{
- title = Printf.sprintf "%s" repo;
+ repo = Some repo;
+ title = repo;
subtitle = Resolvers.repo_description repo;
- topnav = Components.Topnav.v ~active_path:Files repo;
- content =
- HTML.
- [
- h3 [] [ txt "Files at %s" tree.path ];
- ul [] (List.map (li_of_entry repo) tree.entries);
- ];
+ active = Files;
+ content = HTML.[ ul [] @@ List.map (li_of_entry repo) tree.entries ];
}
let file repo (blob : Resolvers.Blob.t) =
@@ -205,11 +214,11 @@ module Repo = struct
respond
@@ Page.render ~page_title:(page_title repo)
{
- title = Printf.sprintf "%s" repo;
+ repo = Some repo;
+ title = repo;
subtitle = Resolvers.repo_description repo;
- topnav = Components.Topnav.v ~active_path:Files repo;
- content =
- HTML.[ h3 [] [ txt "File" ]; div [ id "blob" ] formatted_blob ];
+ active = Files;
+ content = HTML.[ div [ id "blob" ] formatted_blob ];
}
let commit repo (commit : Resolvers.Commit.t) =
@@ -217,10 +226,11 @@ module Repo = struct
respond
@@ Page.render ~page_title:(page_title repo)
{
+ repo = Some repo;
title =
Printf.sprintf "%s : %s" repo @@ Resolvers.short_hash commit.hash;
subtitle = Resolvers.repo_description repo;
- topnav = Components.Topnav.v repo;
+ active = Summary;
content = HTML.[ h3 [] [ txt "%s" message ] ];
}
end
Copyright 2019--2025 Marius PETER