hpaste-1.2.0: src/Hpaste/View/Browse.hs
{-# OPTIONS -Wall -fno-warn-name-shadowing #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
-- | Browse page view.
module Hpaste.View.Browse
(page)
where
import Hpaste.Types
import Hpaste.View.Html
import Hpaste.View.Layout
import Hpaste.View.Paste (pasteLink)
import Data.Pagination
import Control.Monad
import Data.Maybe
import Data.Monoid.Operator
import qualified Data.Text as T
import qualified Data.Text.Lazy as LT
import Data.Time.Show (showDateTime)
import Network.URI
import Network.URI.Params
import Prelude hiding ((++))
import Snap.App.Types
import Text.Blaze.Extra
import Text.Blaze.Pagination
import Text.Blaze.Html5 as H hiding (map)
-- | Render the browse page.
page :: PN -> [Channel] -> [Language] -> [Paste] -> Maybe String -> Html
page pn chans langs ps mauthor =
layoutPage $ Page {
pageTitle = "Browse pastes"
, pageBody = browse pn chans langs ps mauthor
, pageName = "browse"
}
-- | View the paginated pastes.
browse :: PN -> [Channel] -> [Language] -> [Paste] -> Maybe String -> Html
browse pn channels languages ps mauthor = do
darkSection title $ do
pagination pn
table ! aClass "latest-pastes" $ do
tr $ mapM_ (th . (toHtml :: String -> Html)) $
["Title"] ++ ["Author"|isNothing mauthor] ++ ["When","Language","Channel"]
pastes ps
pagination pn { pnPn = (pnPn pn) { pnShowDesc = False } }
where pastes = mapM_ $ \paste@Paste{..} -> tr $ do
td $ pasteLink paste pasteTitle
unless (isJust mauthor) $
td $ do
let author = T.unpack pasteAuthor
if True -- validNick author
then a ! hrefURI (authorUri author) $ toHtml pasteAuthor
else toHtml pasteAuthor
td $ toHtml $ showDateTime $ pasteDate
td $ showLanguage languages pasteLanguage
td $ showChannel Nothing channels pasteChannel
authorUri author = updateUrlParam "author" author
$ updateUrlParam "page" "0"
$ pnURI pn
title = LT.pack $ case mauthor of
Just author -> "Pastes by " ++ author
Nothing -> "Latest pastes"