Snapshot list pagination now correctly uses row count to determine whether the last page has been reached.

This commit is contained in:
Dan Burton 2015-03-17 11:20:09 -07:00
parent 4e4362f19b
commit 07fb2c9290
2 changed files with 29 additions and 19 deletions

View File

@ -24,19 +24,27 @@ getAllSnapshotsR = do
currentPageMay <- lookupGetParam "page" currentPageMay <- lookupGetParam "page"
let currentPage :: Int64 let currentPage :: Int64
currentPage = fromMaybe 1 (currentPageMay >>= readMay) currentPage = fromMaybe 1 (currentPageMay >>= readMay)
groups <- fmap (groupBy (on (==) (\(_,_,uploaded,_,_) -> uploaded)) . map (uncrapify now')) $ (totalCount :: Int64, groups) <- fmap (groupUp now') $ runDB $ do
runDB $ E.select $ E.from $ \(stackage `E.InnerJoin` user) -> do c <- E.select $ E.from $ \(stackage `E.InnerJoin` user) -> do
E.on (stackage E.^. StackageUser E.==. user E.^. UserId) E.on (stackage E.^. StackageUser E.==. user E.^. UserId)
E.orderBy [E.desc $ stackage E.^. StackageUploaded] return E.countRows
E.limit snapshotsPerPage rs <- E.select $ E.from $ \(stackage `E.InnerJoin` user) -> do
E.offset ((currentPage - 1) * snapshotsPerPage) E.on (stackage E.^. StackageUser E.==. user E.^. UserId)
return E.orderBy [E.desc $ stackage E.^. StackageUploaded]
( stackage E.^. StackageSlug E.limit snapshotsPerPage
, stackage E.^. StackageTitle E.offset ((currentPage - 1) * snapshotsPerPage)
, stackage E.^. StackageUploaded return
, user E.^. UserDisplay ( stackage E.^. StackageSlug
, user E.^. UserHandle , stackage E.^. StackageTitle
) , stackage E.^. StackageUploaded
, user E.^. UserDisplay
, user E.^. UserHandle
)
return (c, rs)
let isFirstPage = currentPage == 1
isLastPage = currentPage * snapshotsPerPage >= totalCount
defaultLayout $ do defaultLayout $ do
setTitle "Stackage Server" setTitle "Stackage Server"
let snapshotsNav = $(widgetFile "snapshots-nav") let snapshotsNav = $(widgetFile "snapshots-nav")
@ -44,3 +52,5 @@ getAllSnapshotsR = do
where uncrapify now' c = where uncrapify now' c =
let (E.Value ident, E.Value title, E.Value uploaded, E.Value display, E.Value handle') = c let (E.Value ident, E.Value title, E.Value uploaded, E.Value display, E.Value handle') = c
in (ident,title,format (diff True) (diffUTCTime uploaded now'),display,handle') in (ident,title,format (diff True) (diffUTCTime uploaded now'),display,handle')
groupUp now' ([E.Value c], rs) = (c, (groupBy (on (==) (\(_,_,uploaded,_,_) -> uploaded)) . map (uncrapify now')) rs)
groupUp _ _ = error "Expected countRows to have exactly 1 result."

View File

@ -1,12 +1,12 @@
<div .snapshot-nav> <div .snapshot-nav>
$if currentPage > 1 $if isFirstPage
at newest --
$else
<a href=@{AllSnapshotsR}?page=#{currentPage - 1}> <a href=@{AllSnapshotsR}?page=#{currentPage - 1}>
see newer -- see newer --
$else
at newest --
\ Page #{currentPage} # \ Page #{currentPage} #
$if length (concat groups) == snapshotsPerPage $if isLastPage
++ at oldest
$else
<a href=@{AllSnapshotsR}?page=#{currentPage + 1}> <a href=@{AllSnapshotsR}?page=#{currentPage + 1}>
++ see older ++ see older
$else
++ at oldest