Skip to content
This repository was archived by the owner on Sep 30, 2025. It is now read-only.

Commit 3480159

Browse files
authored
Do not filter out parameters with the same name in pagination links
1 parent 7e8c2ba commit 3480159

7 files changed

Lines changed: 66 additions & 12 deletions

File tree

.github/workflows/ci.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ jobs:
4747

4848
- if: ${{ matrix.stack-yaml == 'stack.yaml' }}
4949
uses: freckle/weeder-action@v1
50+
with:
51+
weeder-version: 2.3.0
5052

5153
hlint:
5254
runs-on: ubuntu-latest

CHANGELOG.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1-
## [*Unreleased*](https://github.com/pbrisbin/yesod-paginator/compare/v1.1.2.1...main)
1+
## [*Unreleased*](https://github.com/pbrisbin/yesod-paginator/compare/v1.1.2.2...main)
22

33
None
44

5+
## [v1.1.2.2](https://github.com/pbrisbin/yesod-paginator/compare/v1.1.2.1...v1.1.2.2)
6+
7+
- Fix issue with filtering out query parameters [@eahlberg](https://github.com/pbrisbin/yesod-paginator/issues/40)
8+
59
## [v1.1.2.1](https://github.com/pbrisbin/yesod-paginator/compare/v1.1.2.0...v1.1.2.1)
610

711
- Support GHCs 9.0 and 9.2

package.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: yesod-paginator
2-
version: 1.1.2.1
2+
version: 1.1.2.2
33
synopsis: A pagination approach for yesod
44
description: Paginate a list showing a per-item widget and links to other pages
55
category: Web, Yesod

src/Yesod/Paginator/Widgets.hs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ module Yesod.Paginator.Widgets
77
, simpleWith
88
, ellipsed
99
, ellipsedWith
10+
11+
-- * Exported for testing
12+
, setPageParameters
1013
) where
1114

1215
import Yesod.Paginator.Prelude
@@ -177,13 +180,15 @@ getUpdateGetParams
177180
:: PageParamName -> WidgetFor site (PageNumber -> [(Text, Text)])
178181
getUpdateGetParams pageParamName = do
179182
params <- handlerToWidget $ reqGetParams <$> getRequest
180-
pure
181-
$ \number ->
182-
nubOn fst
183-
$ [(unPageParamName pageParamName, tshow number)]
184-
<> params
183+
pure $ \number -> setPageParameters pageParamName number params
185184

186185
renderGetParams :: [(Text, Text)] -> Text
187186
renderGetParams [] = ""
188187
renderGetParams ps = "?" <> T.intercalate "&" (map renderGetParam ps)
189188
where renderGetParam (k, v) = encodeText k <> "=" <> encodeText v
189+
190+
setPageParameters
191+
:: Show a => PageParamName -> a -> [(Text, Text)] -> [(Text, Text)]
192+
setPageParameters pageParamName number params =
193+
let name = unPageParamName pageParamName
194+
in [(name, tshow number)] <> filter ((/=) name . fst) params

test/SpecHelper.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import Test.Hspec as X
1414
import Yesod.Core
1515
import Yesod.Paginator as X
1616
import Yesod.Paginator.Prelude as X
17+
import Yesod.Paginator.Widgets as X
1718
import Yesod.Test as X
1819

1920
data App = App

test/Yesod/Paginator/WidgetsSpec.hs

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
{-# LANGUAGE OverloadedStrings #-}
2+
23
module Yesod.Paginator.WidgetsSpec
34
( spec
4-
)
5-
where
5+
) where
66

7+
import Data.Functor ((<&>))
78
import SpecHelper
9+
import Test.QuickCheck
810

911
spec :: Spec
10-
spec = withApp $ do
12+
spec = do
13+
withApp $ do
1114
describe "simple" $ it "works" $ do
1215
get $ SimpleR 10 3 3
1316

@@ -189,3 +192,42 @@ spec = withApp $ do
189192
, "<li class=\"next disabled\"><a>»</a></li>"
190193
, "</ul>"
191194
]
195+
196+
it "inserts" $ do
197+
let paramName = PageParamName "p"
198+
pageNumber = 1 :: Int
199+
setPageParameters paramName pageNumber [] `shouldBe` [("p", "1")]
200+
201+
it "updates" $ do
202+
let paramName = PageParamName "p"
203+
pageNumber = 1 :: Int
204+
setPageParameters paramName pageNumber [("p", "foo")]
205+
`shouldBe` [("p", "1")]
206+
207+
it "doesn't remove not-ours elements" $ property $ \(Params paramName pageNumber params) -> do
208+
let outputKeys =
209+
fst <$> setPageParameters paramName pageNumber params
210+
inputKeys = fst <$> params
211+
in all (`elem` outputKeys) inputKeys
212+
213+
it "doesn't add not-ours elements" $ property $ \(Params paramName pageNumber params) -> do
214+
let outputKeys = fst <$> setPageParameters paramName pageNumber params
215+
inputKeys = fst <$> params
216+
in all (`elem` (unPageParamName paramName : inputKeys)) outputKeys
217+
218+
data Params = Params
219+
{ paramsPageParamName :: PageParamName
220+
, paramsPageNumber :: Int
221+
, paramsParams :: [(Text, Text)]
222+
}
223+
deriving Show
224+
225+
instance Arbitrary Params where
226+
arbitrary = do
227+
params <- listOf $ liftArbitrary2 genText genText
228+
pageNumber <- getPositive <$> arbitrary
229+
pageParamName <- PageParamName <$> genText
230+
pure $ Params pageParamName pageNumber params
231+
where
232+
genText :: Gen Text
233+
genText = listOf (choose ('a', 'z')) <&> pack

yesod-paginator.cabal

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
cabal-version: 1.12
22

3-
-- This file has been generated from package.yaml by hpack version 0.34.4.
3+
-- This file has been generated from package.yaml by hpack version 0.34.5.
44
--
55
-- see: https://github.com/sol/hpack
66

77
name: yesod-paginator
8-
version: 1.1.2.1
8+
version: 1.1.2.2
99
synopsis: A pagination approach for yesod
1010
description: Paginate a list showing a per-item widget and links to other pages
1111
category: Web, Yesod

0 commit comments

Comments
 (0)