diff options
-rw-r--r-- | lib/views.ml | 128 |
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 |