module Text.Blaze.Pagination where
import Control.Monad
import Data.Maybe
import Data.Pagination
import Network.URI
import Network.URI.Params
import qualified Prelude as P
import Prelude hiding (div,span)
import Safe
import Text.Blaze.Extra
import Text.Blaze.Html5 as H hiding (map)
import Text.Blaze.Html5.Attributes as A hiding (form,span,min,max)
pagination :: URI -> Pagination -> Html
pagination uri pn@Pagination{..} =
div !. "pagination" $ do
when pnShowDesc description
chooser
where description = do
span !. "description" $ do
"Showing "
toHtml ((pnCurrentPage1)*pnPerPage + 1)
"–"
toHtml (min pnTotal (pnCurrentPage * pnPerPage))
" of "
toHtml (pnTotal)
" results"
chooser = do
div !. "pages" $ do
ul !. "pages-list" $ do
when (pnCurrentPage > 1) $
li !. "page" $ a ! hrefSet uri paramName (show (pnCurrentPage1)) $
"Previous"
let w = 10 :: Integer
start = max 1 (pnCurrentPage (w // 2))
end = min (pageCount) (start + w)
forM_ [start..end] $ \i ->
li !. "page" $ do
let theclass = if i == pnCurrentPage then "current" else ""
a ! hrefSet uri paramName (show i) !. theclass $
toHtml (show i)
when (end < pageCount) $
li !. "page" $ "…"
when (pnCurrentPage < pageCount) $
li !. "page" $ a ! hrefSet uri paramName (show (pnCurrentPage+1)) $
"Next"
paramName = pnName ++ "_page"
(//) = P.div
pageCount = pnPageCount pn