From 07fb2c92908a6358b73537188472233bed0a0091 Mon Sep 17 00:00:00 2001 From: Dan Burton Date: Tue, 17 Mar 2015 11:20:09 -0700 Subject: [PATCH] Snapshot list pagination now correctly uses row count to determine whether the last page has been reached. --- Handler/Snapshots.hs | 36 ++++++++++++++++++++++------------ templates/snapshots-nav.hamlet | 12 ++++++------ 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/Handler/Snapshots.hs b/Handler/Snapshots.hs index bb9139e..88b9802 100644 --- a/Handler/Snapshots.hs +++ b/Handler/Snapshots.hs @@ -24,19 +24,27 @@ getAllSnapshotsR = do currentPageMay <- lookupGetParam "page" let currentPage :: Int64 currentPage = fromMaybe 1 (currentPageMay >>= readMay) - groups <- fmap (groupBy (on (==) (\(_,_,uploaded,_,_) -> uploaded)) . map (uncrapify now')) $ - runDB $ E.select $ E.from $ \(stackage `E.InnerJoin` user) -> do - E.on (stackage E.^. StackageUser E.==. user E.^. UserId) - E.orderBy [E.desc $ stackage E.^. StackageUploaded] - E.limit snapshotsPerPage - E.offset ((currentPage - 1) * snapshotsPerPage) - return - ( stackage E.^. StackageSlug - , stackage E.^. StackageTitle - , stackage E.^. StackageUploaded - , user E.^. UserDisplay - , user E.^. UserHandle - ) + (totalCount :: Int64, groups) <- fmap (groupUp now') $ runDB $ do + c <- E.select $ E.from $ \(stackage `E.InnerJoin` user) -> do + E.on (stackage E.^. StackageUser E.==. user E.^. UserId) + return E.countRows + rs <- E.select $ E.from $ \(stackage `E.InnerJoin` user) -> do + E.on (stackage E.^. StackageUser E.==. user E.^. UserId) + E.orderBy [E.desc $ stackage E.^. StackageUploaded] + E.limit snapshotsPerPage + E.offset ((currentPage - 1) * snapshotsPerPage) + return + ( stackage E.^. StackageSlug + , 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 setTitle "Stackage Server" let snapshotsNav = $(widgetFile "snapshots-nav") @@ -44,3 +52,5 @@ getAllSnapshotsR = do where uncrapify now' 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') + groupUp now' ([E.Value c], rs) = (c, (groupBy (on (==) (\(_,_,uploaded,_,_) -> uploaded)) . map (uncrapify now')) rs) + groupUp _ _ = error "Expected countRows to have exactly 1 result." diff --git a/templates/snapshots-nav.hamlet b/templates/snapshots-nav.hamlet index 331080e..c887e16 100644 --- a/templates/snapshots-nav.hamlet +++ b/templates/snapshots-nav.hamlet @@ -1,12 +1,12 @@
- $if currentPage > 1 + $if isFirstPage + at newest -- + $else see newer -- - $else - at newest -- \ Page #{currentPage} # - $if length (concat groups) == snapshotsPerPage + $if isLastPage + ++ at oldest + $else ++ see older - $else - ++ at oldest