diff --git a/routers/web/user/notification.go b/routers/web/user/notification.go index aaf9d435c0..cf61b0a2f2 100644 --- a/routers/web/user/notification.go +++ b/routers/web/user/notification.go @@ -15,6 +15,7 @@ import ( repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/models/unit" "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/container" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/optional" "code.gitea.io/gitea/modules/setting" @@ -128,7 +129,9 @@ func prepareUserNotificationsData(ctx *context.Context) { ctx.Data["Notifications"] = notifications ctx.Data["Link"] = setting.AppSubURL + "/notifications" ctx.Data["SequenceNumber"] = ctx.FormString("sequence-number") + pager.AddParamFromRequest(ctx.Req) + pager.RemoveParam(container.SetOf("div-only", "sequence-number")) ctx.Data["Page"] = pager } diff --git a/services/context/pagination.go b/services/context/pagination.go index 2a9805db05..21efab8b12 100644 --- a/services/context/pagination.go +++ b/services/context/pagination.go @@ -8,8 +8,10 @@ import ( "html/template" "net/http" "net/url" + "slices" "strings" + "code.gitea.io/gitea/modules/container" "code.gitea.io/gitea/modules/paginator" ) @@ -49,6 +51,14 @@ func (p *Pagination) AddParamFromRequest(req *http.Request) { p.AddParamFromQuery(req.URL.Query()) } +func (p *Pagination) RemoveParam(keys container.Set[string]) { + p.urlParams = slices.DeleteFunc(p.urlParams, func(s string) bool { + k, _, _ := strings.Cut(s, "=") + k, _ = url.QueryUnescape(k) + return keys.Contains(k) + }) +} + // GetParams returns the configured URL params func (p *Pagination) GetParams() template.URL { return template.URL(strings.Join(p.urlParams, "&")) diff --git a/services/context/pagination_test.go b/services/context/pagination_test.go new file mode 100644 index 0000000000..78359caa09 --- /dev/null +++ b/services/context/pagination_test.go @@ -0,0 +1,35 @@ +// Copyright 2026 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package context + +import ( + "net/url" + "testing" + + "code.gitea.io/gitea/modules/container" + + "github.com/stretchr/testify/assert" +) + +func TestPagination(t *testing.T) { + p := NewPagination(1, 1, 1, 1) + params := url.Values{} + params.Add("k1", "11") + params.Add("k1", "12") + params.Add("k", "a") + params.Add("k", "b") + params.Add("k2", "21") + params.Add("k2", "22") + params.Add("foo", "bar") + + p.AddParamFromQuery(params) + v, _ := url.ParseQuery(string(p.GetParams())) + assert.Equal(t, params, v) + + p.RemoveParam(container.SetOf("k", "foo")) + params.Del("k") + params.Del("foo") + v, _ = url.ParseQuery(string(p.GetParams())) + assert.Equal(t, params, v) +}