diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 95effd4..58b08c8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -47,6 +47,8 @@ jobs: - if: ${{ matrix.stack-yaml == 'stack.yaml' }} uses: freckle/weeder-action@v1 + with: + weeder-version: 2.3.0 hlint: runs-on: ubuntu-latest diff --git a/CHANGELOG.md b/CHANGELOG.md index 22ebb96..b4de89a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,11 @@ -## [*Unreleased*](https://github.com/pbrisbin/yesod-paginator/compare/v1.1.2.1...main) +## [*Unreleased*](https://github.com/pbrisbin/yesod-paginator/compare/v1.1.2.2...main) None +## [v1.1.2.2](https://github.com/pbrisbin/yesod-paginator/compare/v1.1.2.1...v1.1.2.2) + +- Fix issue with filtering out query parameters [@eahlberg](https://github.com/pbrisbin/yesod-paginator/issues/40) + ## [v1.1.2.1](https://github.com/pbrisbin/yesod-paginator/compare/v1.1.2.0...v1.1.2.1) - Support GHCs 9.0 and 9.2 diff --git a/package.yaml b/package.yaml index ba3e788..e39fa4e 100644 --- a/package.yaml +++ b/package.yaml @@ -1,5 +1,5 @@ name: yesod-paginator -version: 1.1.2.1 +version: 1.1.2.2 synopsis: A pagination approach for yesod description: Paginate a list showing a per-item widget and links to other pages category: Web, Yesod diff --git a/src/Yesod/Paginator/Widgets.hs b/src/Yesod/Paginator/Widgets.hs index 7c97088..2bc58d9 100644 --- a/src/Yesod/Paginator/Widgets.hs +++ b/src/Yesod/Paginator/Widgets.hs @@ -7,6 +7,9 @@ module Yesod.Paginator.Widgets , simpleWith , ellipsed , ellipsedWith + + -- * Exported for testing + , setPageParameters ) where import Yesod.Paginator.Prelude @@ -177,13 +180,15 @@ getUpdateGetParams :: PageParamName -> WidgetFor site (PageNumber -> [(Text, Text)]) getUpdateGetParams pageParamName = do params <- handlerToWidget $ reqGetParams <$> getRequest - pure - $ \number -> - nubOn fst - $ [(unPageParamName pageParamName, tshow number)] - <> params + pure $ \number -> setPageParameters pageParamName number params renderGetParams :: [(Text, Text)] -> Text renderGetParams [] = "" renderGetParams ps = "?" <> T.intercalate "&" (map renderGetParam ps) where renderGetParam (k, v) = encodeText k <> "=" <> encodeText v + +setPageParameters + :: Show a => PageParamName -> a -> [(Text, Text)] -> [(Text, Text)] +setPageParameters pageParamName number params = + let name = unPageParamName pageParamName + in [(name, tshow number)] <> filter ((/=) name . fst) params diff --git a/test/SpecHelper.hs b/test/SpecHelper.hs index c4117da..4360621 100644 --- a/test/SpecHelper.hs +++ b/test/SpecHelper.hs @@ -14,6 +14,7 @@ import Test.Hspec as X import Yesod.Core import Yesod.Paginator as X import Yesod.Paginator.Prelude as X +import Yesod.Paginator.Widgets as X import Yesod.Test as X data App = App diff --git a/test/Yesod/Paginator/WidgetsSpec.hs b/test/Yesod/Paginator/WidgetsSpec.hs index e8afb6f..40f4f58 100644 --- a/test/Yesod/Paginator/WidgetsSpec.hs +++ b/test/Yesod/Paginator/WidgetsSpec.hs @@ -1,13 +1,16 @@ {-# LANGUAGE OverloadedStrings #-} + module Yesod.Paginator.WidgetsSpec ( spec - ) -where + ) where +import Data.Functor ((<&>)) import SpecHelper +import Test.QuickCheck spec :: Spec -spec = withApp $ do +spec = do + withApp $ do describe "simple" $ it "works" $ do get $ SimpleR 10 3 3 @@ -189,3 +192,42 @@ spec = withApp $ do , "
  • ยป
  • " , "" ] + + it "inserts" $ do + let paramName = PageParamName "p" + pageNumber = 1 :: Int + setPageParameters paramName pageNumber [] `shouldBe` [("p", "1")] + + it "updates" $ do + let paramName = PageParamName "p" + pageNumber = 1 :: Int + setPageParameters paramName pageNumber [("p", "foo")] + `shouldBe` [("p", "1")] + + it "doesn't remove not-ours elements" $ property $ \(Params paramName pageNumber params) -> do + let outputKeys = + fst <$> setPageParameters paramName pageNumber params + inputKeys = fst <$> params + in all (`elem` outputKeys) inputKeys + + it "doesn't add not-ours elements" $ property $ \(Params paramName pageNumber params) -> do + let outputKeys = fst <$> setPageParameters paramName pageNumber params + inputKeys = fst <$> params + in all (`elem` (unPageParamName paramName : inputKeys)) outputKeys + +data Params = Params + { paramsPageParamName :: PageParamName + , paramsPageNumber :: Int + , paramsParams :: [(Text, Text)] + } + deriving Show + +instance Arbitrary Params where + arbitrary = do + params <- listOf $ liftArbitrary2 genText genText + pageNumber <- getPositive <$> arbitrary + pageParamName <- PageParamName <$> genText + pure $ Params pageParamName pageNumber params + where + genText :: Gen Text + genText = listOf (choose ('a', 'z')) <&> pack diff --git a/yesod-paginator.cabal b/yesod-paginator.cabal index 28b5637..eb92ff0 100644 --- a/yesod-paginator.cabal +++ b/yesod-paginator.cabal @@ -1,11 +1,11 @@ cabal-version: 1.12 --- This file has been generated from package.yaml by hpack version 0.34.4. +-- This file has been generated from package.yaml by hpack version 0.34.5. -- -- see: https://github.com/sol/hpack name: yesod-paginator -version: 1.1.2.1 +version: 1.1.2.2 synopsis: A pagination approach for yesod description: Paginate a list showing a per-item widget and links to other pages category: Web, Yesod