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 | 
