yesod-paginate (empty) → 0.0
raw patch · 4 files changed
+157/−0 lines, 4 filesdep +basedep +template-haskelldep +yesodsetup-changed
Dependencies added: base, template-haskell, yesod
Files
- LICENSE +30/−0
- Setup.hs +2/−0
- Yesod/Paginate.hs +89/−0
- yesod-paginate.cabal +36/−0
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright (c) 2010, Alexander Dunlap.++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.++ * Redistributions in binary form must reproduce the above+ copyright notice, this list of conditions and the following+ disclaimer in the documentation and/or other materials provided+ with the distribution.++ * Neither the name of Alexander Dunlap nor the names of other+ contributors may be used to endorse or promote products derived+ from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ Yesod/Paginate.hs view
@@ -0,0 +1,89 @@+{-# LANGUAGE QuasiQuotes, TemplateHaskell, CPP, TypeFamilies, FlexibleInstances, MultiParamTypeClasses, FlexibleContexts #-}+-- | Provides a pagination subsite for Yesod.+--+-- Route layout:+--+-- > / PaginateHomeR GET+-- > /#Int PaginateStartR GET+-- > /#Int/#Int PaginateR GET+--+-- If no numbers are given, display the items starting from the beginning with the default count. If one number is given,+-- display the items starting from that index with the default count. If two numbers are given, the first one is the count+-- and the second is the starting index. (This is so the user can modify the end of the URL to move forward in the pagination.)+module Yesod.Paginate+ ( Paginate (..)+ , PaginateRoute (..)+ , defaultPaginate+ , prevLink+ , nextLink+ )+ where++import Yesod+import Control.Applicative+import Language.Haskell.TH.Syntax++data Paginate master a = Paginate+ { pgnDefaultCount :: Int -- ^ How many items to show per page by default+ , pgnGetItems :: Int -> Int -> GHandler (Paginate master a) master [a] -- ^ Get a certain count of items at a certain offset+ , pgnItemCount :: GHandler (Paginate master a) master Int -- ^ How many items there are in all+ , pgnDisplayItems :: Int -> Int -> [a] -> GHandler (Paginate master a) master RepHtml -- ^ Render the items on a page given the count and offset+ }++mkYesodSub+ "Paginate master a"+ [ ClassP ''Yesod [VarT $ mkName "master"]+ ]+#if GHC7+ [parseRoutes|+#else+ [$parseRoutes|+#endif+/ PaginateHomeR GET+/#Int PaginateStartR GET+/#Int/#Int PaginateR GET+|]++getPaginateHomeR :: GHandler (Paginate master a) master RepHtml+getPaginateHomeR = do+ pgn <- getYesodSub+ toMaster <- getRouteToMaster+ redirect RedirectSeeOther (toMaster (PaginateR (pgnDefaultCount pgn) 0))++getPaginateStartR :: Int -> GHandler (Paginate master a) master RepHtml+getPaginateStartR start = do+ pgn <- getYesodSub+ toMaster <- getRouteToMaster+ redirect RedirectSeeOther (toMaster (PaginateR (pgnDefaultCount pgn) start))++getPaginateR :: Int -> Int -> GHandler (Paginate master a) master RepHtml+getPaginateR howmany start = do+ pgn <- getYesodSub+ xs <- pgnGetItems pgn howmany start+ pgnDisplayItems pgn howmany start xs++defaultPaginate+ :: (YesodPersist master, PersistBackend (YesodDB master (GHandler (Paginate master a) master)), PersistEntity a)+ => Int -- ^ Default number of items to show+ -> [Filter a] -- ^ Filters to apply+ -> [Order a] -- ^ Ordering to apply+ -> (Int -> Int -> [a] -> GHandler (Paginate master a) master RepHtml) -- ^ Display function+ -> Paginate master a+defaultPaginate x fs os d = Paginate+ { pgnDefaultCount = x+ , pgnGetItems = \y z -> map snd <$> runDB (selectList fs os y z)+ , pgnItemCount = runDB (count fs)+ , pgnDisplayItems = d+ }++-- | Link to the previous page.+prevLink :: Paginate master a -> Int -> Int -> Maybe (Route (Paginate master a))+prevLink p howmany start+ | start > 0 = Just (PaginateR howmany (max 0 (start-howmany)))+ | otherwise = Nothing++-- | Link to the next page.+nextLink :: Paginate master a -> Int -> Int -> GHandler (Paginate master a) master (Maybe (Route (Paginate master a)))+nextLink p howmany start = go <$> pgnItemCount p where+ go l | start < l-howmany-1 = Just (PaginateR howmany (start+howmany))+ | otherwise = Nothing
+ yesod-paginate.cabal view
@@ -0,0 +1,36 @@+-- yesod-markdown.cabal auto-generated by cabal init. For additional+-- options, see+-- http://www.haskell.org/cabal/release/cabal-latest/doc/users-guide/authors.html#pkg-descr.+Name: yesod-paginate+Version: 0.0+Synopsis: Pagination for Yesod sites.+Description: +License: BSD3+License-file: LICENSE+Author: Alexander Dunlap+Maintainer: alexander.dunlap@gmail.com+Copyright: (c) 2010 Alexander Dunlap+Category: Web, Yesod+Build-type: Simple+Stability: Alpha+-- Extra files to be distributed with the package, such as examples or+-- a README.+-- Extra-source-files: ++-- Constraint on the version of Cabal needed to build this package.+Cabal-version: >=1.6++flag ghc7++Library+ if flag(ghc7)+ build-depends: base >= 4.3 && < 5+ cpp-options: -DGHC7+ else+ build-depends: base >= 4 && < 4.3+ Exposed-modules: Yesod.Paginate+ Build-depends: yesod, template-haskell++source-repository head+ type: git+ location: git://github.com/ajdunlap/yesod-paginate.git