packages feed

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"