yesod-paginator 0.3.3 → 0.4.0
raw patch · 3 files changed
+31/−22 lines, 3 filesdep +resourcetdep ~persistentdep ~yesod
Dependencies added: resourcet
Dependency ranges changed: persistent, yesod
Files
- Yesod/Paginator.hs +17/−11
- Yesod/Paginator/Widget.hs +10/−8
- yesod-paginator.cabal +4/−3
Yesod/Paginator.hs view
@@ -56,13 +56,14 @@ , module Yesod.Paginator.Widget ) where +import Control.Monad.Trans.Resource import Yesod import Yesod.Paginator.Widget -paginate :: Int -> [a] -> GHandler s m ([a], GWidget s m ())+paginate :: (MonadIO m, MonadUnsafeIO m, MonadThrow m, MonadBaseControl IO m) => Int -> [a] -> HandlerT s m ([a], WidgetT s m ()) paginate = paginateWith defaultWidget -paginateWith :: PageWidget s m -> Int -> [a] -> GHandler s m ([a], GWidget s m ())+paginateWith :: (MonadIO m, MonadBaseControl IO m, MonadUnsafeIO m,MonadThrow m) => (Int -> Int -> Int -> t) -> Int -> [a] -> HandlerT s m ([a], t) paginateWith widget per items = do p <- getCurrentPage @@ -72,28 +73,33 @@ return (xs, widget p per tot) selectPaginated :: ( PersistEntity val- , PersistQuery m1- , PersistEntityBackend val ~ PersistMonadBackend m1- , MonadLift (GHandler s m) m1+ , PersistQuery (HandlerT s m)+ , PersistEntityBackend val ~ PersistMonadBackend (HandlerT s m)+ , MonadThrow m+ , MonadBaseControl IO m+ , MonadHandler m ) => Int -> [Filter val] -> [SelectOpt val]- -> m1 ([Entity val], GWidget s m ())+ -> HandlerT s m ([Entity val], WidgetT s m ()) selectPaginated = selectPaginatedWith defaultWidget selectPaginatedWith :: ( PersistEntity val- , PersistQuery m1- , PersistEntityBackend val ~ PersistMonadBackend m1- , MonadLift (GHandler s m) m1+ , PersistQuery (HandlerT s m)+ , PersistEntityBackend val ~ PersistMonadBackend (HandlerT s m)+ , MonadThrow m+ , MonadUnsafeIO m+ , MonadBaseControl IO m+ , MonadHandler m ) => PageWidget s m -> Int -> [Filter val] -> [SelectOpt val]- -> m1 ([Entity val], GWidget s m ())+ -> HandlerT s m ([Entity val], WidgetT s m ()) selectPaginatedWith widget per filters selectOpts = do- p <- lift getCurrentPage+ p <- getCurrentPage tot <- count filters xs <- selectList filters (selectOpts ++ [OffsetBy ((p-1)*per), LimitTo per])
Yesod/Paginator/Widget.hs view
@@ -1,6 +1,7 @@ {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE FlexibleContexts #-} module Yesod.Paginator.Widget ( getCurrentPage , paginationWidget@@ -10,13 +11,14 @@ ) where import Yesod-import Control.Monad (when)+import Control.Monad (when, liftM)+import Control.Monad.Trans.Resource import Data.Maybe (fromMaybe) import Data.Text (Text) import qualified Data.Text as T -type PageWidget s m = Int -> Int -> Int -> GWidget s m ()+type PageWidget s m = Int -> Int -> Int -> WidgetT s m () data PageWidgetConfig = PageWidgetConfig { prevText :: Text -- ^ The text for the 'previous page' link.@@ -33,7 +35,7 @@ | Disabled Text Text -- ^ content, class -- | Correctly show one of the constructed links-showLink :: [(Text, Text)] -> PageLink -> GWidget s m ()+showLink :: (MonadIO m, MonadThrow m, MonadUnsafeIO m, MonadBaseControl IO m) => [(Text, Text)] -> PageLink -> WidgetT s m () showLink params (Enabled pg cnt cls) = do let param = ("p", showT pg) @@ -54,7 +56,7 @@ <a>#{cnt} |] -defaultWidget :: PageWidget s m+defaultWidget :: (MonadIO m, MonadUnsafeIO m, MonadThrow m, MonadBaseControl IO m) => PageWidget s m defaultWidget = paginationWidget $ PageWidgetConfig { prevText = "«" , nextText = "»" , pageCount = 9@@ -64,13 +66,13 @@ -- | A widget showing pagination links. Follows bootstrap principles. -- Utilizes a \"p\" GET param but leaves all other GET params intact.-paginationWidget :: PageWidgetConfig -> PageWidget s m+paginationWidget :: (MonadIO m, MonadUnsafeIO m, MonadThrow m, MonadBaseControl IO m) => PageWidgetConfig -> Int -> Int -> Int -> WidgetT site m () paginationWidget (PageWidgetConfig {..}) page per tot = do -- total / per + 1 for any remainder let pages = (\(n, r) -> n + (min r 1)) $ tot `divMod` per when (pages > 1) $ do- curParams <- lift $ fmap reqGetParams getRequest+ curParams <- handlerToWidget $ liftM reqGetParams getRequest [whamlet|$newline never <ul>@@ -121,8 +123,8 @@ -- | looks up the \"p\" GET param and converts it to an Int. returns a -- default of 1 when conversion fails.-getCurrentPage :: GHandler s m Int-getCurrentPage = fmap (fromMaybe 1 . go) $ lookupGetParam "p"+getCurrentPage :: (MonadThrow m, MonadIO m, MonadUnsafeIO m, MonadBaseControl IO m) => HandlerT s m Int+getCurrentPage = liftM (fromMaybe 1 . go) $ lookupGetParam "p" where go :: Maybe Text -> Maybe Int
yesod-paginator.cabal view
@@ -1,5 +1,5 @@ name: yesod-paginator-version: 0.3.3+version: 0.4.0 synopsis: A pagination approach for yesod description: Paginate a list showing a per-item widget and links to other pages homepage: http://github.com/pbrisbin/yesod-paginator@@ -17,8 +17,9 @@ build-depends: base >= 4 && < 5 , text >= 0.11 && < 0.12- , yesod >= 1.1 && < 1.2- , persistent >= 1.1 && < 1.2+ , yesod >= 1.2 && < 1.3+ , persistent >= 1.2 && < 1.3+ , resourcet >= 0.4.4 , transformers ghc-options: -Wall